ITSMChangeManagement
8.0.8
OFORK
https://o-fork.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
New release.
New release.
Added new functions.
Added new functions.
Added new functions.
Added new functions.
Added new functions.
Init release.
The OFORK::ITSM Change Management package.
Das OFORK::ITSM Change Management Paket.
8.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OFORK package ITSMChangeManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OFORK PACKAGES</strong>
<ul>
<li>ITSMCore 8.0.8</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OFORK-Paket ITSMChangeManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OFORK-PAKETE</strong>
<ul>
<li>ITSMCore 8.0.8</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>NOTICE</strong>
<br/>
<br/>
In order to grant users access to the change menu, you need to add them as member to the group 'itsm-change'.
<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/>
<strong>HINWEIS</strong>
<br/>
<br/>
Um Benutzern Zugriff auf das Change-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-change' 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/>
<strong>ATTENTION</strong>
<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 groups 'itsm-change', 'itsm-change-builder' and 'itsm-change-manager' that were created during package installation will be deactivated.
You can activate these groups again in the admin area.
<br/>
<br/>
All links to change objects and workorder 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/>
<strong>ACHTUNG</strong>
<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 angelegten Gruppen 'itsm-change', 'itsm-change-builder' und 'itsm-change-manager' werden deaktiviert.
Sie können jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Alle Verknüpfungen zu Change-Objekten und zu Workorder-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/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OFORK package ITSMChangeManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OFORK PACKAGES</strong>
<ul>
<li>ITSMCore 8.0.8</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OFORK-Paket ITSMChangeManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OFORK-PAKETE</strong>
<ul>
<li>ITSMCore 8.0.8</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
ITSMCore
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
{
# cleanup stats list (only stats related to the given stat objects)
$Kernel::OM->Get('Kernel::System::Stats')->StatsCleanUp(
ObjectNames => [
'ITSMChangeManagement',
'ITSMChangeManagementChangesIncidents',
'ITSMChangeManagementChangesPerCIClasses',
'ITSMChangeManagementHistory',
'ITSMChangeManagementRfcRequester',
],
UserID => 1,
);
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2019-09-02 08:44:13
localhost
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DQ0Gg+F3v/sdnWgyHua/rNkpYmNjKysrnZ2d33jjjXPnzsXExDTjfDnqp82YMeP27dv0blBQ0KhRo4wzy+Xyhw8fjh49msfjBQYGJicnU+lff/315MmTeTyek5PT+++/n5KSQvfD3b5929vb28KLBh0ceyglAAehUDhw4EDmKFcAAICmioqKkkql/fr1mzp1am1t7aNHj3JycnJzc7/88stGyw4aNOjgwYMrV66sq6tLSUk5duyY5e1u3br1ww8/PHXqVP/+/fPy8n744QfmUZlMNmnSJIPBsHDhQjc3t6qqqry8vH379rHWOm42GxsbuVwulUqfPHly+vTpxMTEGzdutEO7AI2iJ5ahVkBsUlmtVtsqMTQ0NHTr1shbgMz72FYckabVavl8fmvVBgAAAADQEbAGnTP/fmZuS6VSqVRq8hArhdro3r17WFhYWFiYyUapm1zLse7KOeIx9/e/QCDYv3///v37zYVNLDvfRu8vPvzww717986dO5faNTcbjaOj45EjR4zTpVKpuVunS5cubdiwgbt16Cwwsg2ahsfjGU93CwAAYDlPT0+5XB4dHS0SiVxdXRctWlRbW0tPCGnyHTp69+jRo+np6c7OziNGjCgoKDh9+jRHZtbu+PHjIyIifH19e/fuHRcXFx0dzYzK3d3973//+927d8eOHSsUCidOnJidnZ2YmGjhSTHfgDP5Nhw1i123bt3GjRt39+7d1NTURts19zohVpkC61qwYMGuXbt0Ol1JSQnr94g0ceqY+Pj44uLiioqKyMjIgIAA7syBgYF79uxpaGiorq5OSEhoTui/ojq/dTpdenr6tGnTWlIVAAAAAAB0eYMHD+7du3db1CwWizGNZJeBXhMAAABob56enpmZmSYPsV4oY+0OGTIkOzvbXAbusoSQefPmzZs3j9pWqVT29vbMo25ubpb3rnGHbYzjRTZz7Zo8NSwxBW2HNdUMMeripf77xcTE/PnPfxaJRAMHDjx69OjevXuZQ+L0en2jY9ToCoOCgvz8/IqKivz9/ffu3cvd7o4dO9auXevo6NivX7+jR49u2rSJOz/dXW0wGJjb5NfObz6f7+3tfejQoaZdJgAAAAAAePlERka2RbWffvppW1QLVoHONgAAAHjplJSUbNu2LTg42NqBAHQgrKlmiJnOXYFAcOTIEXp2FFYeC6eOoUtdu3aN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URw0aJDaUQBAD2OXaRMEITk52WQyycvKDw85OTmCILScNc3X1/eFF1544YUX7La78VOHwyohISHbt2/fvn27wzLffPNNB9u33WhXIDk5md7SAAB4vRdffHH16tUajWbKlClHjx5VOxwA6AomkykgIMDjzZaUlHRe3U6KudvqWecrSVJ1dfX58+fVDgTwvFOnTrUcacnLSQAAwKnVq1cvWrRI7SiALnXLLbfk5OSoHQUAwIFXX311yZIlakeBHu/JJ5/cuHGj2lEAkiRJoaGhpaWlyuq5c+emT5/et2/fwMDAMWPGHD58OD4+XtkrCMLPP/989913+/r6+vv779mzx7aptWvXjhgxIjQ0tH///s8+++yVK1dsKwqCUFNT8+CDD/r7+7esu3v37htuuCEkJOQ///M/lfH/lb0ffvhhTEyMIAghISETJ048deqUi2e3Z88ef39/QRDCwsKSk5OPHj16yy23KHuvv/56519rnZxRm3Xdi1lu5+2339ZqtV9++eWqVauCg4Ndv85Sx+6gJElK5slhYE7uoJPzraioCAwMdOX0PS4gIMBoNLa2t7q62tfXtyvjAbrM8ePHhw0bpnYUXYo52wAAAAAAQGeJiooSW3BxvDgAvc3Zs2cnT548efLkM2fOVFdXf/DBB/n5+Uaj0bbMH//4x9dff91isciTJtruGjp06MmTJ6urq//9739rtVp5DH+ZJEmCIKSmpi5ZssRkMtnV/frrr1966aWPPvqooqJiwYIFL7/8smAzhsexY8d27Nixb9+++vr60tLS5cuXz58//9SpU66cUUpKSlZWliRJlZWVmzdvLioqKisrU/ZeuHBBPort51oXz8h5XbdjlhvJz89/9913H3zwwStXruzYscP169zBOygIgpyZay2w1u5gR+4RAHiEFw5zDACAZzmcs60rRUVF2f48JouMjGw5lCXgKczZBgDdVreasw09F3O2ofuwnbPtwQcfnDFjxpw5c1orLIrid999J09KLTidAMxqtfr7+zc3N9vW3blz5yOPPNKy7uTJk5977rlJkybJq3v27JkxY4ayd9y4cdu3b7/22muVpn744YfFixcfOnTIlbPbuXPn6NGjw8LCnJyUK19oW56Rk7odiVkUxatXr4aFhYmiWF1dHRoa6vp19tQddLjdyR10fr7dds62mpoanU7X1NTUxVEBXeDEiROLFi1q1zwmPR1ztgEA0N2RVAMAAADQGxw7diwzM9N5GSVPY8dkMm3cuHHHjh2XLl0KDg6+/fbbW2ZrlDyNnVOnTo0aNUpZHTdunO3enJycQYMG2VUJDg52Hqfs66+/fuaZZ06cOHHNNdfceuutQUFBGRkZ0dHRrtR15Yxa05GYBUFQUoOhoaHtiqojd9AVrd3BDp4vejQX09Uer9sRah0XnYpkGwAAAAAAAAD1Wa1WURTdq/vss89GREScOHGib9++FouloKDgpptu8khUQUFBZ8+ete015bqbb775yJEjtlumTp366aefulK3I2fUkZg7ElVH7mBHdN75dh/yhSVD0y4GgyElJUWSpKioqFtvvfWzzz5TOyJ4M+ZsAwAAAAAAAKC+u+6665NPPnGv7ocffrh48eLw8HA/P7+goKB+/fq5XnfEiBEnT55UVg8fPmy7d+rUqe+//757UbW0f/9+5wVMJpO84MYZKXU9G7Mt51F15A52ROedb/fRO9NsMTExbZZxcmXkSRMtFkthYaHDTFtnXNUOxoyei2QbAAAAAAAAAPWtXr36pZdeOnz4sCRJDQ0NeXl5mZmZ8+bNc6VufHz8O++8U1dXZzQat2/fPnv2bNeP+/LLLy9duvT8+fMWiyU7O/uf//yn7d709PQtW7b8+c9//vnnny0Wi9Fo/Pzzz6dOnepKyxERER9//HFlZaW8mp2d7e/vb1fG39/fYDAIglBSUpKRkTF69GjXz6i1uh2J2TnnUXXkDnZE550vFEoqtyuVlJR0pLrFYklOTvZUMC7qYMzouUi24TdIqgMAuhUnI5CIoqjK+CSu6IzYVqxYoSx/8MEHvr6+oihqNBr5R2u7Q4ui2Ldv39zcXHnjF198MXv27OTk5JZVbJsFAHi9bvX07Mpgus9ZA3Bu5MiRBoNh7dq1Op0uJibm0UcfbWxs/Mtf/iLvlf8tK/+i7Vbfe++9AwcOREZGDhky5MyZM7t27XJS2G71zjvvXLly5ZQpU/r27ZuRkbF27VrbqPr37//ll19euHAhMTFRq9WOHj362LFj7777ritnNGjQoJiYmKeffjomJmb48OGzZs3KysqyK5OVlZWSkuLj4zNq1KgLFy7s27fPlTNyXtftmB1eKMHl69yROyjY/Dhjt9xm3Y7co24lLy9vxowZOp0uKCho7NixR44cSUhIsC1QUFAwbtw4Pz+/lj8Mrlu3LjExMSwsbMCAAc8991xFRYWyS76StbW1Dz30kEajaVl3z5498fHxWq129uzZ9fX1ds/orKys2NjYwMBArVY7adKkb775xsXTafO4Z8+efeihh2JjY2NjY6dPn56Xl6fsuuGGG+z+JrR8mufn57f2OhEXF2dX/d5773WxrvO74OQ6dzBmJ1ejzSvpnPP7q6wePHhw6NChCQkJylC3ynFnzJgREhJy0003yf/kZQaDQaPRiKLYp0+f6dOnHzt27NZbb3U9Ki8kAZIkSVJVVdWFCxdKS0vVDgQAup3Vq1cvWrTIbuM111zTSYfTarWeaqqurs5TTXXP43bnNxnPxnb+/Pmnn35aWdXpdPv375ckac+ePf7+/m0e98YbbzQajfLyl19+GRISoux6+umnL1682LLKLbfckpOT45HgAQCe9eqrry5ZssRuo+tvJl3w9HT9TaAbPso9+CbWzT355JMbN25UOwpAkiQpNDS0u32PKisrCw0NVTsKeExFRUVgYKAqhw4ICFB+Fmupurra19dXWc3Nzb322mvfeeedoqIis9n8yy+//Pd//3e/fv2UAoIgTJo06dSpU83NzS1/GPzss8/khYqKihUrVowdO9Z2ryAITz755BdffNGy7ldffXXzzTf/7//+b2Nj41dffZWammr7gD569OiUKVO+/fbb+vr6mpqaf/zjH6NGjTp58qSLV8DJcXNzcxMTE3/88Ud59aeffrrzzjvPnTtnV92VQ7ixq7UCbd4F59fZ7ZjbvBpOrqRzzu+v0vibb7752muvFRUVNTc3P/zww7a7/vSnPx04cKChoaGgoODuu++Wu65KkuTv779nzx5JkqxWa1lZ2XvvvRcREaFUPH78+LBhw1wM0jt0u/daqKWmpub8+fOXLl1SOxAA6HYcJtvsXk0aGhoWLlwYGRl5zTXXbNu2LT4+XimmlLRdll+MBEEIDQ39f//v/ynldTqdw9+JMZvNaWlpCQkJ8fHxqampJpNJafD111/XarVffvllZmamVquVX3TKyspGjBghCEJkZOT8+fOVb15ylcrKynnz5mm12qVLlzo/9/bG76njSpKk/CKV7cba2trf/e53ISEht99++w8//GC3NzExMTExsc2W7S6v3eqCBQsSEhKCg4MnTJhw9OhR5/G3dt/lKkeOHImNjVXePt1o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jilRAAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPENWUz4kSWQ6IElUU01DaGFuZ2VNYW5hZ2VtZW50LnhtbCx2IDEuMyAyMDE4LzExLzExIDEyOjU0OjM3IHVkIEV4cCAkPC9DVlM+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZG1pbiBvZiB0aGUgQ0lQIG1hdHJpeC48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5DYXRlZ29yeSDihpQgSW1wYWN0IOKGlCBQcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPkFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZG1pbklUU01DaGFuZ2VDSVBBbGxvY2F0ZSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uVGFibGUuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZG1pbklUU01DaGFuZ2VDSVBBbGxvY2F0ZSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlIyMjQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRtaW4gYXJlYSBuYXZpZ2F0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkFkbWluT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q2F0ZWdvcnkg4oaUIEltcGFjdCDihpQgUHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5DaGFuZ2VTZXR0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TWFuYWdlIHRoZSBjYXRlZ29yeSDihpQgaW1wYWN0IOKGlCBwcmlvcml0eSBtYXRyaXguPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uQmlnIj5mYS10YWJsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvblNtYWxsIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhbmQgbWFuYWdlIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQgbm90aWZpY2F0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZSBub3RpZmljYXRpb24gcnVsZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5BZG1pbi5Ob3RpZmljYXRpb25FdmVudC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFkbWluLkNoYW5nZU1hbmFnZW1lbnQuQ2hhbmdlTm90aWZpY2F0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRXZlbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlIyMjQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkbWluIGFyZWEgbmF2aWdhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpBZG1pbk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXI6Ok1vZHVsZUFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlIE5vdGlmaWNhdGlvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5Db21tdW5pY2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYW5kIG1hbmFnZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWJlbGwtbzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvblNtYWxsIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSVRTTVN0YXRlTWFjaGluZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkFkbWluIG9mIHRoZSBzdGF0ZSBtYWNoaW5lLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlN0YXRlIE1hY2hpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluSVRTTVN0YXRlTWFjaGluZSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlIyMjQWRtaW5JVFNNU3RhdGVNYWNoaW5lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkbWluIGFyZWEgbmF2aWdhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpBZG1pbk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXI6Ok1vZHVsZUFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlN0YXRlIE1hY2hpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5DaGFuZ2VTZXR0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TWFuYWdlIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQgc3RhdGUgbWFjaGluZS48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWNvZ3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25TbWFsbCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DQUJNZW1iZXJTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Mb29rdXAgb2YgQ0FCIG1lbWJlcnMgZm9yIGF1dG9jb21wbGV0aW9uLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNBQiBNZW1iZXIgU2VhcmNoPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5PdmVydmlldyBvdmVyIGFsbCBDaGFuZ2VzLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2VzPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01DaGFuZ2UjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk92ZXJ2aWV3LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudElUU01DaGFuZ2UjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBhcmVhLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk1lbnU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPkl0ZW1BcmVhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjM0MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBPdmVydmlldy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5PdmVydmlldzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1tYW5hZ2VyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkFkZCBhIGNoYW5nZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5BZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlQWRkIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5BZGRFZGl0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudElUU01DaGFuZ2VBZGQjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLW1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TmV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TmV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MjAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLWJ1aWxkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1tYW5hZ2VyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkFkZCBhIGNoYW5nZSBmcm9tIHRlbXBsYXRlLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkFkZCBmcm9tIHRlbXBsYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLWJ1aWxkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgKGZyb20gdGVtcGxhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TmV3IChmcm9tIHRlbXBsYXRlKTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjI1MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VDQUJUZW1wbGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlIENBQiBUZW1wbGF0ZXMuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIENBQiBUZW1wbGF0ZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2UgQ29uZGl0aW9uIE92ZXJ2aWV3LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNvbmRpdGlvbiBPdmVydmlldzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01DaGFuZ2VDb25kaXRpb24jIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmRpdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2UgQ29uZGl0aW9uIEVkaXQuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q29uZGl0aW9uIEVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uVGFibGUuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmRpdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VFZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RWRpdCBhIGNoYW5nZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTUNoYW5nZUVkaXQjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkFkZEVkaXQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5EZWxldGUgYSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+RGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZUhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgSGlzdG9yeS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RGV0YWlscyBvZiBhIGNoYW5nZSBoaXN0b3J5IGVudHJ5LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkhpc3RvcnkgWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgSW52b2x2ZWQgUGVyc29ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JbnZvbHZlZCBQZXJzb25zPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuSW52b2x2ZWRQZXJzb25zLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZU1hbmFnZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1tYW5hZ2VyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlIE1hbmFnZXIgT3ZlcnZpZXcuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlTWFuYWdlciMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50SVRTTUNoYW5nZU1hbmFnZXIjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlTXlDQUIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIE15Q0FCIE92ZXJ2aWV3LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTUNoYW5nZU15Q0FCIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtYnVpbGRlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLW1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBNeUNoYW5nZXMgT3ZlcnZpZXcuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPklUU00gTXlXb3Jrb3JkZXJzIE92ZXJ2aWV3LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VQSVIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZSBQSVIgT3ZlcnZpZXcuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlUElSIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRJVFNNQ2hhbmdlUElSIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5QSVIgKFBvc3QgSW1wbGVtZW50YXRpb24gUmV2aWV3KTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlBJUjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlUElSPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VQcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBQcmludC48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VQU0EiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Qcm9qZWN0ZWQgU2VydmljZSBBdmFpbGFiaWxpdHkgKFBTQSkgb2YgY2hhbmdlcy4gT3ZlcnZpZXcgb2YgYXBwcm92ZWQgY2hhbmdlcyBhbmQgdGhlaXIgc2VydmljZXMuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5QU0E8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTUNoYW5nZVBTQSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50SVRTTUNoYW5nZVBTQSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+UHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5IChQU0EpPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VQU0E8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MzUwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVJlc2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtYnVpbGRlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5SZXNldCBhIGNoYW5nZSBhbmQgaXRzIHdvcmtvcmRlcnMuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+UmVzZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Gb3J3YXJkIHNjaGVkdWxlIG9mIGNoYW5nZXMuIE92ZXJ2aWV3IG92ZXIgYXBwcm92ZWQgY2hhbmdlcy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTY2hlZHVsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50SVRTTUNoYW5nZVNjaGVkdWxlIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgU2NoZWR1bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5TY2hlZHVsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MzAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlNlYXJjaCBDaGFuZ2VzLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlNlYXJjaDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk92ZXJ2aWV3LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlNlYXJjaCBDaGFuZ2VzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+U2VhcmNoPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VTZWFyY2g8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+b25jbGljaz0iSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaC5PcGVuU2VhcmNoRGlhbG9nKCdBZ2VudElUU01DaGFuZ2VTZWFyY2gnKTsgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgeyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfSBlbHNlIHsgd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7IH0gcmV0dXJuIGZhbHNlOyI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj42MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VUaW1lU2xvdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1vdmUgVGltZSBTbG90LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlRpbWUgU2xvdDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01DaGFuZ2VUaW1lU2xvdCMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuVGltZVNsb3QuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlWm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBab29tLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlpvb208L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjIzAwMy1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWxsb2NhdGlvbkxpc3QuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkNoYW5nZU1hbmFnZW1lbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQ2hhbmdlTWFuYWdlbWVudC5SZXNwb25zaXZlLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5DaGFuZ2VNYW5hZ2VtZW50LldvcmtvcmRlckdyYXBoLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5DaGFuZ2VNYW5hZ2VtZW50LlJURUNvbnRlbnQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+dGhpcmRwYXJ0eS9qcXVlcnktdGFibGVzb3J0ZXItMi4wLjUvanF1ZXJ5LnRhYmxlc29ydGVyLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLlVJLlRhYmxlLlNvcnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkxpbmtPYmplY3QuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ29uZmlybURpYWxvZy5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LldvcmtvcmRlckdyYXBoLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuWm9vbS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmZpcm1EaWFsb2cuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1idWlsZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIFRlbXBsYXRlIERlbGV0ZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNVGVtcGxhdGVFZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtYnVpbGRlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLW1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBUZW1wbGF0ZSBFZGl0LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1idWlsZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIFRlbXBsYXRlIEVkaXQgQ0FCLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUIjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNBQlRlbXBsYXRlRWRpdC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01UZW1wbGF0ZUVkaXRDb250ZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtYnVpbGRlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLW1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBUZW1wbGF0ZSBFZGl0IENvbnRlbnQuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1idWlsZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNIFRlbXBsYXRlIE92ZXJ2aWV3LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkNoYW5nZU1hbmFnZW1lbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5UZW1wbGF0ZU92ZXJ2aWV3LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb24jIyNBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1idWlsZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLW1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+VGVtcGxhdGUgT3ZlcnZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+SVRTTSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+NTAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVVzZXJTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Mb29rdXAgb2YgYWdlbnRzLCB1c2VkIGZvciBhdXRvY29tcGxldGlvbi48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5Vc2VyIFNlYXJjaDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgQWRkLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkFkZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgQWRkIChmcm9tIHRlbXBsYXRlKS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5BZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgQWdlbnQuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+QWdlbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+V29ya29yZGVyIERlbGV0ZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5EZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPldvcmtvcmRlciBFZGl0LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPldvcmtvcmRlciBIaXN0b3J5LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgSGlzdG9yeSBab29tLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkhpc3RvcnkgWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgUmVwb3J0LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJUYWtlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+VGFrZSBXb3Jrb3JkZXIuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+VGFrZSBXb3Jrb3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+V29ya29yZGVyIFpvb20uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Wm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPklUU00gQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01Xb3JrT3JkZXJab29tIyMjMDAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5EZWZhdWx0LmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5DaGFuZ2VNYW5hZ2VtZW50LkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkNoYW5nZU1hbmFnZW1lbnQuUlRFQ29udGVudC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWxsb2NhdGlvbkxpc3QuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5VSS5UYWJsZS5Tb3J0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlRhYmxlRmlsdGVycy5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5ab29tLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZmlybURpYWxvZy5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI0N1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTY2hlZHVsZS48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5JVFNNIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTY2hlZHVsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6Q3VzdG9tZXI6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkNoYW5nZU1hbmFnZW1lbnQuRGVmYXVsdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQ2hhbmdlTWFuYWdlbWVudC5UYWJsZS5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lckZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQ3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyMwMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTY2hlZHVsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTY2hlZHVsZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY2Vzc0tleSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQ1MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpUb29sQmFyTW9kdWxlIyMjMTAxLUlUU01DaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2VNYW5hZ2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFnZW50IGludGVyZmFjZSBub3RpZmljYXRpb24gbW9kdWxlIHRvIHNlZSB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFuYWdlZCBieSB0aGUgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6VG9vbEJhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUb29sQmFyOjpDaGFuZ2VNYW5hZ2VyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDc3NDbGFzcyI+Q2hhbmdlTWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbiI+ZmEgZmEtbWFsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjEwMDA2MTA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUjIyMxMDItSVRTTUNoYW5nZU1hbmFnZW1lbnQ6Ok15Q2hhbmdlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZ2VudCBpbnRlcmZhY2Ugbm90aWZpY2F0aW9uIG1vZHVsZSB0byBzZWUgdGhlIG51bWJlciBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpUb29sQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRvb2xCYXI6Ok15Q2hhbmdlczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3NzQ2xhc3MiPk15Q2hhbmdlczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbiI+ZmEgZmEtcmV0d2VldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjEwMDA2MzA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUjIyMxMDMtSVRTTUNoYW5nZU1hbmFnZW1lbnQ6Ok15V29ya09yZGVycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZ2VudCBpbnRlcmZhY2Ugbm90aWZpY2F0aW9uIG1vZHVsZSB0byBzZWUgdGhlIG51bWJlciBvZiB3b3Jrb3JkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpUb29sQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRvb2xCYXI6Ok15V29ya09yZGVyczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3NzQ2xhc3MiPk15V29ya09yZGVyczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbiI+ZmEgZmEtdGFza3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4xMDAwNjQwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpUb29sQmFyTW9kdWxlIyMjMTA0LUlUU01DaGFuZ2VNYW5hZ2VtZW50OjpNeUNBQiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZ2VudCBpbnRlcmZhY2Ugbm90aWZpY2F0aW9uIG1vZHVsZSB0byBzZWUgdGhlIG51bWJlciBvZiBjaGFuZ2UgYWR2aXNvcnkgYm9hcmRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpUb29sQmFyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRvb2xCYXI6Ok15Q0FCPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDc3NDbGFzcyI+TXlDQUJzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS1ncm91cDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjEwMDA2MjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3IyMjU21hbGwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIGNoYW5nZSBsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6T3ZlcnZpZXdTbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5TbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZVNob3J0Ij5TPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYWdlU2hvd24iPjI1PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpUZW1wbGF0ZU92ZXJ2aWV3IyMjU21hbGwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIHRlbXBsYXRlIGxpc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01UZW1wbGF0ZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01UZW1wbGF0ZTo6T3ZlcnZpZXdTbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5TbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZVNob3J0Ij5TPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYWdlU2hvd24iPjI1PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMTctSVRTTUNoYW5nZUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gc2hvdyBhIGxpbmsgdG8gY3JlYXRlIGEgY2hhbmdlIGZyb20gdGhpcyB0aWNrZXQuIFRoZSB0aWNrZXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGxpbmtlZCB3aXRoIHRoZSBuZXcgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRab29tOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OklUU01DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIENoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIGEgY2hhbmdlIGZyb20gdGhpcyB0aWNrZXQuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZUFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZUFkZDtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzE4LUlUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIHNob3cgYSBsaW5rIHRvIGNyZWF0ZSBhIGNoYW5nZSBmcm9tIHRoaXMgdGlja2V0LiBUaGUgdGlja2V0IHdpbGwgYmUgYXV0b21hdGljYWxseSBsaW5rZWQgd2l0aCB0aGUgbmV3IGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Wm9vbTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51OjpJVFNNQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBDaGFuZ2UgKGZyb20gVGVtcGxhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYSBjaGFuZ2UgKGZyb20gdGVtcGxhdGUpIGZyb20gdGhpcyB0aWNrZXQuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjaGFuZ2Ugem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPlslIEVudigiTGFzdFNjcmVlbkNoYW5nZXMiKSAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5CYWNrPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDEwLUhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNoYW5nZSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2U6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZUhpc3Rvcnk7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMjAtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHByaW50IGEgY2hhbmdlIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlByaW50IHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZVByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlUHJpbnQ7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+dGFyZ2V0PSJwcmludF9jaGFuZ2UiPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDMwLUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjaGFuZ2UgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0IHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZUVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VFZGl0O0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDQwLUludm9sdmVkUGVyc29ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gc2hvdyB0aGUgaW52b2x2ZWQgcGVyc29ucyBpbiBhIGNoYW5nZSwgaW4gdGhlIHpvb20gdmlldyBvZiB0aGUgY2hhbmdlIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+SW52b2x2ZWQgUGVyc29uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIGludm9sdmVkIHBlcnNvbnMgb2YgdGhlIGNoYW5nZS48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDUwLVdvcmtPcmRlckFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgd29ya29yZGVyIGluIHRoZSBjaGFuZ2Ugem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWRkIFdvcmtvcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+QWRkIGEgd29ya29yZGVyIHRvIHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVdvcmtPcmRlckFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckFkZDtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Qb3BVcDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA1NS1Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFkZCBhIHdvcmtvcmRlciBpbiB0aGUgY2hhbmdlIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2U6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkFkZCBXb3Jrb3JkZXIgKGZyb20gVGVtcGxhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZGQgYSB3b3Jrb3JkZXIgKGZyb20gdGVtcGxhdGUpIHRvIHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVdvcmtPcmRlckFkZEZyb21UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckFkZEZyb21UZW1wbGF0ZTtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Qb3BVcDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA2MC1Db25kaXRpb25zIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGNvbmRpdGlvbnMgb2YgYSBjaGFuZ2UgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Db25kaXRpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5FZGl0IHRoZSBjb25kaXRpb25zIG9mIHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbjtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Qb3BVcDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA3MC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBsaW5raW5nIGEgY2hhbmdlIHdpdGggYW5vdGhlciBvYmplY3QgaW4gdGhlIGNoYW5nZSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rIGFub3RoZXIgb2JqZWN0IHRvIHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50TGlua09iamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdDtTb3VyY2VPYmplY3Q9SVRTTUNoYW5nZTtTb3VyY2VLZXk9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwODAtTW92ZVRpbWVTbG90IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBtb3ZpbmcgdGhlIHRpbWUgc2xvdCBvZiBhIGNoYW5nZSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudVRpbWVTbG90PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPk1vdmUgVGltZSBTbG90PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Nb3ZlIGFsbCB3b3Jrb3JkZXJzIGluIHRpbWUuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZVRpbWVTbG90PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlVGltZVNsb3Q7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwOTAtVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGRlZmluaW5nIGEgY2hhbmdlIGFzIGEgdGVtcGxhdGUgaW4gdGhlIHpvb20gdmlldyBvZiB0aGUgY2hhbmdlLCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2U6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5TYXZlIGNoYW5nZSBhcyBhIHRlbXBsYXRlLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VUZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVRlbXBsYXRlO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTAwLUNoYW5nZURlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY2hhbmdlIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51Q2hhbmdlRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkRlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+RGVsZXRlIHRoZSBjaGFuZ2UuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZURlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZURlbGV0ZTtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Db25maXJtRGlhbG9nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbGVtZW50U2VsZWN0b3IiPiNNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dDb250ZW50UXVlcnlTdHJpbmciPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VEZWxldGU7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlRGVsZXRlO1N1YmFjdGlvbj1DaGFuZ2VEZWxldGU7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRpYWxvZ1RpdGxlIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSBbJSBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSAlXSBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxMTAtQ2hhbmdlUmVzZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHJlc2V0IGEgY2hhbmdlIGFuZCBpdHMgd29ya29yZGVycyBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVzZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlJlc2V0IGNoYW5nZSBhbmQgaXRzIHdvcmtvcmRlcnMuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNoYW5nZVJlc2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlUmVzZXQ7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+Q29uZmlybURpYWxvZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRWxlbWVudFNlbGVjdG9yIj4jTWVudVslIERhdGEuTWVudUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlUmVzZXQ7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlUmVzZXQ7U3ViYWN0aW9uPVJlc2V0O0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dUaXRsZSI+WyUgVHJhbnNsYXRlKCJSZXNldCIpIHwgaHRtbCAlXSBbJSBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSAlXSBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgd29ya29yZGVyIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXI6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5bJSBFbnYoIkxhc3RTY3JlZW5Xb3JrT3JkZXJzIikgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+QmFjazwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAxMC1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhY2Nlc3MgdGhlIGhpc3Rvcnkgb2YgYSB3b3Jrb3JkZXIgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5O1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDIwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIHdvcmtvcmRlciBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXI6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5QcmludCB0aGUgd29ya29yZGVyLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VQcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVByaW50O1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDMwLUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSB3b3Jrb3JkZXIgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyOjpNZW51V2l0aFBlcm1pc3Npb25Gcm9tQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkVkaXQgdGhlIHdvcmtvcmRlci48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNV29ya09yZGVyRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckVkaXQ7V29ya09yZGVySUQ9WyUgRGF0YS5Xb3JrT3JkZXJJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMzUtVGFrZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgdGFraW5nIGEgd29ya29yZGVyIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlcjo6TWVudVdpdGhUYWtlUGVybWlzc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UYWtlIFdvcmtvcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+VGFrZSB0aGUgd29ya29yZGVyLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJUYWtlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyVGFrZTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Db25maXJtRGlhbG9nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbGVtZW50U2VsZWN0b3IiPiNNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dDb250ZW50UXVlcnlTdHJpbmciPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJUYWtlO1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maXJtZWRBY3Rpb25RdWVyeVN0cmluZyI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclRha2U7U3ViYWN0aW9uPVdvcmtPcmRlclRha2U7V29ya09yZGVySUQ9WyUgRGF0YS5Xb3JrT3JkZXJJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRpYWxvZ1RpdGxlIj5bJSBUcmFuc2xhdGUoIlRha2UgV29ya29yZGVyIikgfCBodG1sICVdOiBbJSBDb25maWcoIklUU01Xb3JrT3JkZXI6Okhvb2siKSAlXSBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0gLSBbJSBEYXRhLldvcmtPcmRlck51bWJlciB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwNDAtV29ya09yZGVyQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGNoYW5naW5nIHRoZSB3b3Jrb3JkZXIgYWdlbnQsIGluIHRoZSB6b29tIHZpZXcgb2YgdGhlIHdvcmtvcmRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXI6Ok1lbnVXaXRoUGVybWlzc2lvbkZyb21DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+V29ya29yZGVyIEFnZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5TZXQgdGhlIGFnZW50IGZvciB0aGUgd29ya29yZGVyLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJBZ2VudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckFnZW50O1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDUwLVJlcG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgZWRpdGluZyB0aGUgcmVwb3J0IG9mIGEgd29ya29yZGVyLCBpbiB0aGUgem9vbSB2aWV3IG9mIHRoZSB3b3Jrb3JkZXIgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyOjpNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5SZXBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7V29ya09yZGVySUQ9WyUgRGF0YS5Xb3JrT3JkZXJJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+UG9wVXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwNjAtTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIHdvcmtvcmRlciB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSB6b29tIHZpZXcgb2YgdGhlIHdvcmtvcmRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXI6Ok1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkxpbmsgYW5vdGhlciBvYmplY3QgdG8gdGhlIHdvcmtvcmRlci48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNV29ya09yZGVyO1NvdXJjZUtleT1bJSBEYXRhLldvcmtPcmRlcklEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Qb3BVcDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA4MC1UZW1wbGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgZGVmaW5pbmcgYSB3b3Jrb3JkZXIgYXMgYSB0ZW1wbGF0ZSBpbiB0aGUgem9vbSB2aWV3IG9mIHRoZSB3b3Jrb3JkZXIsIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlcjo6TWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U2F2ZSB3b3Jrb3JkZXIgYXMgYSB0ZW1wbGF0ZS48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5Qb3BVcDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA5MC1Xb3JrT3JkZXJEZWxldGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIHdvcmtvcmRlciBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlcjo6TWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5EZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkRlbGV0ZSB0aGUgd29ya29yZGVyLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJEZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJEZWxldGU7V29ya09yZGVySUQ9WyUgRGF0YS5Xb3JrT3JkZXJJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+Q29uZmlybURpYWxvZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRWxlbWVudFNlbGVjdG9yIj4jTWVudVslIERhdGEuTWVudUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nIj5BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyRGVsZXRlO1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maXJtZWRBY3Rpb25RdWVyeVN0cmluZyI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZTtTdWJhY3Rpb249V29ya09yZGVyRGVsZXRlO1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaWFsb2dUaXRsZSI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0gWyUgQ29uZmlnKCJJVFNNV29ya09yZGVyOjpIb29rIikgJV0gWyUgRGF0YS5DaGFuZ2VOdW1iZXIgfCBodG1sICVdLVslIERhdGEuV29ya09yZGVyTnVtYmVyIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpDb21wbGV4VGFibGU6OlNldHRpbmdzVmlzaWJpbGl0eSMjI0lUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSBBY3Rpb25zIHdoZXJlIGEgc2V0dGluZ3MgYnV0dG9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgbGlua2VkIG9iamVjdHMgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgQWN0aW9ucyBtdXN0IGhhdmUgcmVnaXN0ZXJlZCB0aGUgZm9sbG93aW5nIEpTIGFuZCBDU1MgZmlsZXM6IENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIGFuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BZ2VudElUU01DaGFuZ2Vab29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRJVFNNV29ya09yZGVyWm9vbTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6Q29tcGxleFRhYmxlIyMjSVRTTUNoYW5nZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBDaGFuZ2VzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBOb3RlOiBPbmx5IENoYW5nZSBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGZvciBEZWZhdWx0Q29sdW1ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpJVFNNQ2hhbmdlLnBtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0Q29sdW1ucyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0Ij4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2NvdW50ZWRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj4xMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiPjExMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeSI+MTIwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MTMwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4xNDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MTUwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xNjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4xNzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MTgwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFZmZvcnQiPjE5MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2NvdW50ZWRUaW1lIj4yMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MjEwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPjIyMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIj4yMzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSMjI0lUU01Xb3JrT3JkZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgV29ya29yZGVyIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBOb3RlOiBPbmx5IFdvcmtvcmRlciBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGZvciBEZWZhdWx0Q29sdW1ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0OjpJVFNNV29ya09yZGVyLnBtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0Q29sdW1ucyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFZmZvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJTdGF0ZSI+MTEwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclR5cGUiPjEyMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xMzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE0MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPjE1MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4xNjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MTcwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY291bnRlZFRpbWUiPjE4MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4xOTA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGltZSI+MjAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEeW5hbWljRmllbGQ6OkV2ZW50TW9kdWxlUG9zdCMjIzEwMC1VcGRhdGVJVFNNQ2hhbmdlQ29uZGl0aW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljRmllbGQgZXZlbnQgbW9kdWxlIHRvIGhhbmRsZSB0aGUgdXBkYXRlIG9mIGNvbmRpdGlvbnMgaWYgZHluYW1pYyBmaWVsZHMgYXJlIGFkZGVkLCB1cGRhdGVkIG9yIGRlbGV0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6RHluYW1pY0ZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6RXZlbnQ6OlVwZGF0ZUlUU01DaGFuZ2VDb25kaXRpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KER5bmFtaWNGaWVsZEFkZHxEeW5hbWljRmllbGRVcGRhdGV8RHluYW1pY0ZpZWxkRGVsZXRlKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyMwMS1IaXN0b3J5QWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgaGlzdG9yeSBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlQWRkUG9zdHxDaGFuZ2VVcGRhdGVQb3N0fENoYW5nZUNBQlVwZGF0ZVBvc3R8Q2hhbmdlQ0FCRGVsZXRlUG9zdHxDaGFuZ2VMaW5rQWRkUG9zdHxDaGFuZ2VMaW5rRGVsZXRlUG9zdHxDaGFuZ2VBdHRhY2htZW50QWRkUG9zdHxDaGFuZ2VBdHRhY2htZW50RGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkV2ZW50TW9kdWxlIyMjMDItTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgc2VuZHMgbm90aWZpY2F0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpOb3RpZmljYXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlQWRkUG9zdHxDaGFuZ2VVcGRhdGVQb3N0fENoYW5nZUNBQlVwZGF0ZVBvc3R8Q2hhbmdlQ0FCRGVsZXRlUG9zdHxDaGFuZ2VEZWxldGVQb3N0fENoYW5nZUxpbmtBZGRQb3N0fENoYW5nZUxpbmtEZWxldGVQb3N0fENoYW5nZUF0dGFjaG1lbnRBZGRQb3N0fENoYW5nZUF0dGFjaG1lbnREZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyMwMy1Db25kaXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBldmVudCBtb2R1bGUgdGhhdCBtYXRjaGVzIGNvbmRpdGlvbnMgYW5kIGV4ZWN1dGVzIGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENoYW5nZUFkZFBvc3R8Q2hhbmdlVXBkYXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkV2ZW50TW9kdWxlIyMjODAtVG9vbEJhckNoYW5nZU1hbmFnZXJDYWNoZURlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IGRlbGV0ZXMgdGhlIGNhY2hlIGZvciBhIHRvb2xiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6VG9vbEJhckNoYW5nZU1hbmFnZXJDYWNoZURlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VBZGRQb3N0fENoYW5nZVVwZGF0ZVBvc3R8Q2hhbmdlRGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkV2ZW50TW9kdWxlIyMjODEtVG9vbEJhck15Q2hhbmdlc0NhY2hlRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgZGVsZXRlcyB0aGUgY2FjaGUgZm9yIGEgdG9vbGJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpUb29sQmFyTXlDaGFuZ2VzQ2FjaGVEZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlQWRkUG9zdHxDaGFuZ2VVcGRhdGVQb3N0fENoYW5nZURlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpFdmVudE1vZHVsZSMjIzgyLVRvb2xCYXJNeUNBQkNhY2hlRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgZGVsZXRlcyB0aGUgY2FjaGUgZm9yIGEgdG9vbGJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpUb29sQmFyTXlDQUJDYWNoZURlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VDQUJVcGRhdGVQb3N0fENoYW5nZUNBQkRlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpFdmVudE1vZHVsZSMjIzkwLUNvbmRpdGlvbkRlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IGNsZWFucyB1cCBjb25kaXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OkNvbmRpdGlvbkRlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VEZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyM5MS1IaXN0b3J5RGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgZGVsZXRlcyB0aGUgaGlzdG9yeSBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlEZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlRGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlIyMjMDEtV29ya09yZGVyTnVtYmVyQ2FsYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0byByZWNhbGN1bGF0ZSB0aGUgd29ya29yZGVyIG51bWJlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyTnVtYmVyQ2FsYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihXb3JrT3JkZXJVcGRhdGVQb3N0fFdvcmtPcmRlckRlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpFdmVudE1vZHVsZSMjIzAyLVdvcmtPcmRlckFjdHVhbFRpbWVzU2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRvIHNldCB0aGUgYWN0dWFsIHN0YXJ0IGFuZCBlbmQgdGltZXMgb2Ygd29ya29yZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpXb3JrT3JkZXJBY3R1YWxUaW1lc1NldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPldvcmtPcmRlclVwZGF0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlIyMjMDMtSGlzdG9yeUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2Ygd29ya29yZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFdvcmtPcmRlckFkZFBvc3R8V29ya09yZGVyVXBkYXRlUG9zdHxXb3JrT3JkZXJEZWxldGVQb3N0fFdvcmtPcmRlckxpbmtBZGRQb3N0fFdvcmtPcmRlckxpbmtEZWxldGVQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnRBZGRQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGVQb3N0fFdvcmtPcmRlclJlcG9ydEF0dGFjaG1lbnRBZGRQb3N0fFdvcmtPcmRlclJlcG9ydEF0dGFjaG1lbnREZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RXZlbnRNb2R1bGUjIyMwNC1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBldmVudCBtb2R1bGUgdGhhdCBzZW5kcyBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihXb3JrT3JkZXJBZGRQb3N0fFdvcmtPcmRlclVwZGF0ZVBvc3R8V29ya09yZGVyRGVsZXRlUG9zdHxXb3JrT3JkZXJMaW5rQWRkUG9zdHxXb3JrT3JkZXJMaW5rRGVsZXRlUG9zdHxXb3JrT3JkZXJBdHRhY2htZW50QWRkUG9zdHxXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlUG9zdHxXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50QWRkUG9zdHxXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50RGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlIyMjMDUtQ29uZGl0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgbWF0Y2hlcyBjb25kaXRpb25zIGFuZCBleGVjdXRlcyBhY3Rpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OkNvbmRpdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihXb3JrT3JkZXJBZGRQb3N0fFdvcmtPcmRlclVwZGF0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpFdmVudE1vZHVsZSMjIzgwLVRvb2xCYXJNeVdvcmtPcmRlcnNDYWNoZURlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IGRlbGV0ZXMgdGhlIGNhY2hlIGZvciBhIHRvb2xiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6VG9vbEJhck15V29ya09yZGVyc0NhY2hlRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFdvcmtPcmRlckFkZFBvc3R8V29ya09yZGVyVXBkYXRlUG9zdHxXb3JrT3JkZXJEZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2sjIyNJVFNNQ2hhbmdlc0NoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJ1biB0YXNrIHRvIGNoZWNrIGlmIHNwZWNpZmljIHRpbWVzIGhhdmUgYmVlbiByZWFjaGVkIGluIGNoYW5nZXMgYW5kIHdvcmtvcmRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+SVRTTUNoYW5nZXNDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPiovMTAgKiAqICogKjwvSXRlbT4gPCEtLSBEZWZhdWx0IGV2ZXJ5IDEwIG1pbnMgLS0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpDaGFuZ2U6OkNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGdW5jdGlvbiI+RXhlY3V0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFyYW1zIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDwhLS0gVE9ETzogQ2hlY2sgaWYgdGhpcyBuZWVkcyB0byBiZSB1cGRhdGVkIGFuZCAvIG9yIHJlbmFtZWQgKG5vIGNyb25qb2JzIGFueW1vcmUpIC0tPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZUNyb25qb2I6OkV2ZW50TW9kdWxlIyMjMDEtSGlzdG9yeUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2YgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlQ3JvbmpvYjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6SGlzdG9yeUFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2VDcm9uam9iOjpFdmVudE1vZHVsZSMjIzAyLU5vdGlmaWNhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHNlbmRzIG5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTUNoYW5nZUNyb25qb2I8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2VDcm9uam9iOjpFdmVudE1vZHVsZSMjIzAzLUNvbmRpdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IG1hdGNoZXMgY29uZGl0aW9ucyBhbmQgZXhlY3V0ZXMgYWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlQ3JvbmpvYjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VQbGFubmVkRW5kVGltZVJlYWNoZWRQb3N0fENoYW5nZUFjdHVhbFN0YXJ0VGltZVJlYWNoZWRQb3N0fENoYW5nZUFjdHVhbEVuZFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VSZXF1ZXN0ZWRUaW1lUmVhY2hlZFBvc3R8V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlclBsYW5uZWRFbmRUaW1lUmVhY2hlZFBvc3R8V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZFBvc3R8V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWRQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZU1hbmFnZW1lbnROb3RpZmljYXRpb246OkV2ZW50TW9kdWxlIyMjMDEtSGlzdG9yeUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2YgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENoYW5nZU5vdGlmaWNhdGlvblNlbnRQb3N0fFdvcmtPcmRlck5vdGlmaWNhdGlvblNlbnRQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNvbmRpdGlvbjo6RXZlbnRNb2R1bGUjIyMwMS1IaXN0b3J5QWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgaGlzdG9yeSBvZiBjb25kaXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01Db25kaXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ29uZGl0aW9uQWRkUG9zdHxDb25kaXRpb25VcGRhdGVQb3N0fENvbmRpdGlvbkRlbGV0ZVBvc3R8Q29uZGl0aW9uRGVsZXRlQWxsUG9zdHxFeHByZXNzaW9uQWRkUG9zdHxFeHByZXNzaW9uVXBkYXRlUG9zdHxFeHByZXNzaW9uRGVsZXRlUG9zdHxFeHByZXNzaW9uRGVsZXRlQWxsUG9zdHxBY3Rpb25BZGRQb3N0fEFjdGlvblVwZGF0ZVBvc3R8QWN0aW9uRGVsZXRlUG9zdHxBY3Rpb25EZWxldGVBbGxQb3N0fEFjdGlvbkV4ZWN1dGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNvbmRpdGlvbjo6RXZlbnRNb2R1bGUjIyMwMi1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SVRTTSBldmVudCBtb2R1bGUgdGhhdCBzZW5kcyBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RXZlbnQ6OklUU01Db25kaXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihBY3Rpb25FeGVjdXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkNoYW5nZVNlYXJjaDo6TWlycm9yREIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgY2hhbmdlIHNlYXJjaCBhbmQgdGhlIHdvcmtvcmRlciBzZWFyY2ggZnVuY3Rpb25zIGNvdWxkIHVzZSB0aGUgbWlycm9yIERCLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6REI6Ok1pcnJvcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkR5bmFtaWNGaWVsZHM6Ok9iamVjdFR5cGUjIyNJVFNNQ2hhbmdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWNGaWVsZCBvYmplY3QgcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RHluYW1pY0ZpZWxkczo6T2JqZWN0VHlwZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXNwbGF5TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JVFNNQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6Ok9iamVjdFR5cGU6OklUU01DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQ1MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEeW5hbWljRmllbGRzOjpPYmplY3RUeXBlIyMjSVRTTVdvcmtPcmRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljRmllbGQgb2JqZWN0IHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkR5bmFtaWNGaWVsZHM6Ok9iamVjdFR5cGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGlzcGxheU5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpPYmplY3RUeXBlOjpJVFNNV29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj40NjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6Q2FjaGVUVEwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q2FjaGUgdGltZSBpbiBtaW51dGVzIGZvciB0aGUgY2hhbmdlIG1hbmFnZW1lbnQuIERlZmF1bHQ6IDUgZGF5cyAoNzIwMCBtaW51dGVzKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNhY2hlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5cZCskIj43MjAwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpUb29sQmFyOjpDYWNoZVRUTCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DYWNoZSB0aW1lIGluIG1pbnV0ZXMgZm9yIHRoZSBjaGFuZ2UgbWFuYWdlbWVudCB0b29sYmFycy4gRGVmYXVsdDogMyBob3VycyAoMTgwIG1pbnV0ZXMpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q2FjaGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjE4MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlR5cGVzIG9mIHRpY2tldHMsIHdoZXJlIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IGEgbGluayB0byBhZGQgYSBjaGFuZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+UmZDPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpSZXN0cmljdFRpY2tldFR5cGVzOjpHcm91cHMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T25seSB1c2VycyBvZiB0aGVzZSBncm91cHMgaGF2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRpY2tldCB0eXBlcyBhcyBkZWZpbmVkIGluICJJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMiIGlmIHRoZSBmZWF0dXJlICJUaWNrZXQ6OkFjbDo6TW9kdWxlIyMjMjAwLVRpY2tldDo6QWNsOjpNb2R1bGUiIGlzIGVuYWJsZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1idWlsZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6SG9vayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgaWRlbnRpZmllciBmb3IgYSBjaGFuZ2UsIGUuZy4gQ2hhbmdlIywgTXlDaGFuZ2UjLiBUaGUgZGVmYXVsdCBpcyBDaGFuZ2UjLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkNoYW5nZSM8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlN0YXRlTG9jazo6QWxsb3dFbmRTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiByZWFjaGFibGUgKGFzIGRlZmluZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUpIGNoYW5nZSBlbmQgc3RhdGVzIHNob3VsZCBiZSBhbGxvd2VkIGlmIGEgY2hhbmdlIGlzIGluIGEgbG9ja2VkIHN0YXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlN0YXRlOjpTaWduYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2lnbmFscyBmb3IgZWFjaCBJVFNNIGNoYW5nZSBzdGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icmVxdWVzdGVkIj5ncmF5bGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJwZW5kaW5nIGFwcHJvdmFsIj55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InJlamVjdGVkIj5yZWRsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImFwcHJvdmVkIj5ncmVlbmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaW4gcHJvZ3Jlc3MiPnllbGxvd2xlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icGVuZGluZyBwaXIiPnllbGxvd2xlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic3VjY2Vzc2Z1bCI+Z3JlZW5sZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImZhaWxlZCI+cmVkbGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjYW5jZWxlZCI+cmVkbGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJyZXRyYWN0ZWQiPmdyYXlsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6Q2F0ZWdvcnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNhdGVnb3J5IG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPjMgbm9ybWFsPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpJbXBhY3Q6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGltcGFjdCBvZiBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj4zIG5vcm1hbDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6QXR0cmlidXRlOjpDb21wYXJlVmFsdWU6OkZpZWxkVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBmaWVsZCB0eXBlIG9mIENvbXBhcmVWYWx1ZSBmaWVsZHMgZm9yIGNoYW5nZSBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gVmFsaWQgdmFsdWVzIGFyZSBTZWxlY3Rpb24sIFRleHQgYW5kIERhdGUuIElmIGEgdHlwZSBpcyBub3QgZGVmaW5lZCwgdGhlIGZpZWxkIHdpbGwgbm90IGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZUlEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj5UZXh0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeUlEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5SUQiPlNlbGVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlcklEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXJJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj5EYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj5EYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj5EYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj5EYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRWZmb3J0Ij5UZXh0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2NvdW50ZWRUaW1lIj5UZXh0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGQiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6T2JqZWN0OjpBdHRyaWJ1dGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgY2hhbmdlIG9iamVjdHMgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VySUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXJJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDaGFuZ2VTdGF0ZUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZVN0YXRlSUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZVRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZVRpdGxlIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDYXRlZ29yeUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENhdGVnb3J5SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0ltcGFjdElEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEltcGFjdElEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQcmlvcml0eUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFByaW9yaXR5SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZU1hbmFnZXJJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VNYW5hZ2VySUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZUJ1aWxkZXJJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VCdWlsZGVySUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUmVxdWVzdGVkVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUGxhbm5lZFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkU3RhcnRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWN0dWFsU3RhcnRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbFN0YXJ0VGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWN0dWFsRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxFbmRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRFZmZvcnQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWNjb3VudGVkVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIER5bmFtaWNGaWVsZCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246Ok9iamVjdDo6QXR0cmlidXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIGNoYW5nZSBvYmplY3RzIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VySUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXJJRCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZVN0YXRlSUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlU3RhdGVJRCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibG9jayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDaGFuZ2VUaXRsZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VUaXRsZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDYXRlZ29yeUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENhdGVnb3J5SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjSW1wYWN0SUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgSW1wYWN0SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUHJpb3JpdHlJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQcmlvcml0eUlEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZU1hbmFnZXJJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VNYW5hZ2VySUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQ2hhbmdlQnVpbGRlcklEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZUJ1aWxkZXJJRCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNSZXF1ZXN0ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFJlcXVlc3RlZFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUGxhbm5lZFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkU3RhcnRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFbmRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRFbmRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxTdGFydFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWN0dWFsRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxFbmRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVmZm9ydCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNBY2NvdW50ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjY291bnRlZFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIER5bmFtaWNGaWVsZCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpBdHRyaWJ1dGU6OkNvbXBhcmVWYWx1ZTo6RmllbGRUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGZpZWxkIHR5cGUgb2YgQ29tcGFyZVZhbHVlIGZpZWxkcyBmb3Igd29ya29yZGVyIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBWYWxpZCB2YWx1ZXMgYXJlIFNlbGVjdGlvbiwgVGV4dCBhbmQgRGF0ZS4gSWYgYSB0eXBlIGlzIG5vdCBkZWZpbmVkLCB0aGUgZmllbGQgd2lsbCBub3QgYmUgc2hvd24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlck51bWJlciI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGVJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUeXBlSUQiPlNlbGVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckFnZW50SUQiPlNlbGVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj5UZXh0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkV4cHJlc3Npb246Ok9iamVjdDo6QXR0cmlidXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHdvcmtvcmRlciBvYmplY3RzIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlck51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUaXRsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQWdlbnRJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNXb3JrT3JkZXJOdW1iZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyTnVtYmVyIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNXb3JrT3JkZXJTdGF0ZUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlclN0YXRlSUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclR5cGVJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJUeXBlSUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlclRpdGxlIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNXb3JrT3JkZXJBZ2VudElEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlckFnZW50SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRTdGFydFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZFN0YXJ0VGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUGxhbm5lZEVuZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVuZFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxTdGFydFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbEVuZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbm90IGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBncmVhdGVyIHRoYW4iPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGxlc3MgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYmVmb3JlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBhZnRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdCBjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmVnaW5zIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImVuZHMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUGxhbm5lZEVmZm9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRWZmb3J0IGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNBY2NvdW50ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjY291bnRlZFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBEeW5hbWljRmllbGQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkV4cHJlc3Npb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIG5vdCBlbXB0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgZ3JlYXRlciB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBsZXNzIHRoYW4iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGJlZm9yZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgYWZ0ZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3QgY29udGFpbnMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImJlZ2lucyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJlbmRzIHdpdGgiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpPYmplY3Q6OkF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvYmplY3QgYXR0cmlidXRlcyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB3b3Jrb3JkZXIgb2JqZWN0cyBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlck51bWJlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZUlEIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUaXRsZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQWdlbnRJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlck51bWJlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJOdW1iZXIgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjV29ya09yZGVyU3RhdGVJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJTdGF0ZUlEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJsb2NrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclR5cGVJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJUeXBlSUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjV29ya09yZGVyVGl0bGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyVGl0bGUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjV29ya09yZGVyQWdlbnRJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJBZ2VudElEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRTdGFydFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZFN0YXJ0VGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNBY3R1YWxTdGFydFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsU3RhcnRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbEVuZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRFZmZvcnQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWNjb3VudGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY2NvdW50ZWRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBEeW5hbWljRmllbGQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6SG9vayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgaWRlbnRpZmllciBmb3IgYSB3b3Jrb3JkZXIsIGUuZy4gV29ya29yZGVyIywgTXlXb3Jrb3JkZXIjLiBUaGUgZGVmYXVsdCBpcyBXb3Jrb3JkZXIjLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPldvcmtvcmRlciM8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlN0YXRlTG9jazo6QWxsb3dFbmRTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiByZWFjaGFibGUgKGFzIGRlZmluZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUpIHdvcmtvcmRlciBlbmQgc3RhdGVzIHNob3VsZCBiZSBhbGxvd2VkIGlmIGEgd29ya29yZGVyIGlzIGluIGEgbG9ja2VkIHN0YXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlN0YXRlOjpTaWduYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIHRoZSBzaWduYWxzIGZvciBlYWNoIHdvcmtvcmRlciBzdGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY3JlYXRlZCI+Z3JheWxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYWNjZXB0ZWQiPmdyYXlsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InJlYWR5Ij55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImluIHByb2dyZXNzIj55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNsb3NlZCI+Z3JlZW5sZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNhbmNlbGVkIj5yZWRsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6VHlwZTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZhdWx0IHR5cGUgZm9yIGEgd29ya29yZGVyLiBUaGlzIGVudHJ5IG11c3QgZXhpc3QgaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPndvcmtvcmRlcjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6QWN0dWFsU3RhcnRUaW1lU2V0OjpTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QSBsaXN0IG9mIHdvcmtvcmRlciBzdGF0ZXMsIGF0IHdoaWNoIHRoZSBBY3R1YWxTdGFydFRpbWUgb2YgYSB3b3Jrb3JkZXIgd2lsbCBiZSBzZXQgaWYgaXQgd2FzIGVtcHR5IGF0IHRoaXMgcG9pbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+aW4gcHJvZ3Jlc3M8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uOjpMaXN0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkEgbGlzdCBvZiB0aGUgYWdlbnRzIHdobyBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB3b3Jrb3JkZXJzLiBLZXkgaXMgYSBsb2dpbiBuYW1lLiBDb250ZW50IGlzIDAgb3IgMS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRpbWVQZXJpb2QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgcGVyaW9kIChpbiB5ZWFycyksIGluIHdoaWNoIHN0YXJ0IGFuZCBlbmQgdGltZXMgY2FuIGJlIHNlbGVjdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kUGFzdCI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZEZ1dHVyZSI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSBjaGFuZ2UgaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlSGlzdG9yeTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJub3JtYWwiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJyZXZlcnNlIiBUcmFuc2xhdGFibGU9IjEiPnJldmVyc2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Im5vcm1hbCIgVHJhbnNsYXRhYmxlPSIxIj5ub3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZSMjI0ZpbHRlcjo6Q2hhbmdlU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgY2hhbmdlIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5yZXF1ZXN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGFwcHJvdmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cmVqZWN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBwaXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5zdWNjZXNzZnVsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+ZmFpbGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2FuY2VsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5yZXRyYWN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2UjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGNoYW5nZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iRG93biIgVHJhbnNsYXRhYmxlPSIxIj5Eb3duPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVcCIgVHJhbnNsYXRhYmxlPSIxIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGFjY2VzcyB0aGUgb3ZlcnZpZXcgb2YgYWxsIGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY2hhbmdlIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUxIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZSMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgY3JpdGVyaWEgaW4gdGhlIGNoYW5nZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IkNoYW5nZU51bWJlciI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZU51bWJlciIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgbnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgdGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZVN0YXRlSUQiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDYXRlZ29yeUlEIiBUcmFuc2xhdGFibGU9IjEiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJJbXBhY3RJRCIgVHJhbnNsYXRhYmxlPSIxIj5JbXBhY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlByaW9yaXR5SUQiIFRyYW5zbGF0YWJsZT0iMSI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlJlcXVlc3RlZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWVzdGVkIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlBsYW5uZWRTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkRW5kVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5QbGFubmVkIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIHN0YXJ0IHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdHVhbEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDcmVhdGVUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSB0aW1lPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VBZGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gY3JlYXRlIGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VBZGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUFkZCMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgcmVxdWVzdGVkIGRhdGUgc2hvdWxkIGJlIHNldCBieSBjdXN0b21lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUFkZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VBZGQjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGNoYW5nZSBhZGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VBZGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byBjcmVhdGUgY2hhbmdlcyBmcm9tIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZnJvbSBhIGNoYW5nZXMnIENBQi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUNBQlRlbXBsYXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VDb25kaXRpb24jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgY29uZGl0aW9ucyBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlQ29uZGl0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGVkaXQgdGhlIGNvbmRpdGlvbnMgb2YgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUVkaXQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZWRpdCBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlRWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRGVsZXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlRGVsZXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VEZWxldGUjIyNDaGFuZ2VTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgYWxsb3dlZCB0byBkZWxldGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VEZWxldGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5yZXF1ZXN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGFwcHJvdmFsPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRWRpdCMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgcmVxdWVzdGVkIGRhdGUgc2hvdWxkIGJlIHNldCBieSBjdXN0b21lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRWRpdCMjI0NoYW5nZVN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUgc2V0IGluIHRoZSBjaGFuZ2UgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZUVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRWRpdCMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgY2hhbmdlIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQU0EjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIENoYW5nZSBQU0Egb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VQU0FPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPmFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUFNBIyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBjaGFuZ2UgUFNBIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlUFNBT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iVXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJEb3duIiBUcmFuc2xhdGFibGU9IjEiPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlVwIiBUcmFuc2xhdGFibGU9IjEiPlVwPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQU0EjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgbGlzdCBvZiBjaGFuZ2UgUFNBLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlUFNBT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVBTQSMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIENoYW5nZSBQU0Egb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VQU0FPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTEiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUFNBIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBpbiB0aGUgY2hhbmdlIFBTQSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVBTQU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlBsYW5uZWRTdGFydFRpbWUiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VOdW1iZXIiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIG51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VTdGF0ZUlEIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBzdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2F0ZWdvcnlJRCIgVHJhbnNsYXRhYmxlPSIxIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iSW1wYWN0SUQiIFRyYW5zbGF0YWJsZT0iMSI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQcmlvcml0eUlEIiBUcmFuc2xhdGFibGU9IjEiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJSZXF1ZXN0ZWRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlJlcXVlc3RlZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ3JlYXRlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUmVzZXQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gcmVzZXQgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVJlc2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTY2hlZHVsZSMjI0ZpbHRlcjo6Q2hhbmdlU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgQ2hhbmdlIFNjaGVkdWxlIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlU2NoZWR1bGVPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPmFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iVXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJEb3duIiBUcmFuc2xhdGFibGU9IjEiPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlVwIiBUcmFuc2xhdGFibGU9IjEiPlVwPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTY2hlZHVsZSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBsaXN0IG9mIENoYW5nZSBTY2hlZHVsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVNjaGVkdWxlIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgQ2hhbmdlIFNjaGVkdWxlIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlU2NoZWR1bGVPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTEiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIGluIHRoZSBjaGFuZ2Ugc2NoZWR1bGUgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlBsYW5uZWRTdGFydFRpbWUiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VOdW1iZXIiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIG51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VTdGF0ZUlEIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBzdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2F0ZWdvcnlJRCIgVHJhbnNsYXRhYmxlPSIxIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iSW1wYWN0SUQiIFRyYW5zbGF0YWJsZT0iMSI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQcmlvcml0eUlEIiBUcmFuc2xhdGFibGU9IjEiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJSZXF1ZXN0ZWRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlJlcXVlc3RlZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ3JlYXRlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBoaXN0b3J5IG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlSGlzdG9yeTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgaGlzdG9yeSB6b29tIG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlSGlzdG9yeVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byBlZGl0IHRoZSBpbnZvbHZlZCBwZXJzb25zIG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjRmlsdGVyOjpDaGFuZ2VTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU1hbmFnZXJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnJlcXVlc3RlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXBwcm92YWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBwaXI8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU1hbmFnZXJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkRvd24iIFRyYW5zbGF0YWJsZT0iMSI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iVXAiIFRyYW5zbGF0YWJsZT0iMSI+VXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU1hbmFnZXIjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBsaXN0IG9mIGNoYW5nZXMgd2hlcmUgdGhlIHVzZXIgaXMgdGhlIGNoYW5nZSBtYW5hZ2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTWFuYWdlck92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cm88L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY2hhbmdlIG1hbmFnZXIgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNYW5hZ2VyT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUxIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU1hbmFnZXIjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU1hbmFnZXJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJDaGFuZ2VOdW1iZXIiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VOdW1iZXIiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIG51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VTdGF0ZUlEIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBzdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2F0ZWdvcnlJRCIgVHJhbnNsYXRhYmxlPSIxIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iSW1wYWN0SUQiIFRyYW5zbGF0YWJsZT0iMSI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQcmlvcml0eUlEIiBUcmFuc2xhdGFibGU9IjEiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJSZXF1ZXN0ZWRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlJlcXVlc3RlZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ3JlYXRlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIE15Q0FCIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlDQUJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnJlcXVlc3RlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXBwcm92YWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBwaXI8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNBQiMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNeUNBQk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iRG93biIgVHJhbnNsYXRhYmxlPSIxIj5Eb3duPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVcCIgVHJhbnNsYXRhYmxlPSIxIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBsaXN0IG9mIGNoYW5nZXMgd2hlcmUgdGhlIHVzZXIgaXMgYSBDQUIgbWVtYmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlDQUJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyNTaG93Q29sdW1ucyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBNeUNBQiBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU15Q0FCT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUxIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q0FCIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNeUNBQk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IkNoYW5nZU51bWJlciI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZU51bWJlciIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgbnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgdGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZVN0YXRlSUQiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDYXRlZ29yeUlEIiBUcmFuc2xhdGFibGU9IjEiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJJbXBhY3RJRCIgVHJhbnNsYXRhYmxlPSIxIj5JbXBhY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlByaW9yaXR5SUQiIFRyYW5zbGF0YWJsZT0iMSI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlJlcXVlc3RlZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWVzdGVkIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlBsYW5uZWRTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkRW5kVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5QbGFubmVkIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIHN0YXJ0IHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdHVhbEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDcmVhdGVUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSB0aW1lPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIE15Q2hhbmdlcyBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU15Q2hhbmdlc092ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+cmVxdWVzdGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBhcHByb3ZhbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+aW4gcHJvZ3Jlc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHBpcjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjI0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHdvcmtvcmRlciBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5jcmVhdGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+YWNjZXB0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5yZWFkeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBNeUNoYW5nZXMgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNeUNoYW5nZXNPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkRvd24iIFRyYW5zbGF0YWJsZT0iMSI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iVXAiIFRyYW5zbGF0YWJsZT0iMSI+VXA8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBsaXN0IG9mIG93biBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlDaGFuZ2VzT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIE15Q2hhbmdlcyBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU15Q2hhbmdlc092ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlciIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJDb3VudCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3QiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGRfQ2hhbmdlRmllbGROYW1lMSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGRfQ2hhbmdlRmllbGROYW1lMiIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBNeUNoYW5nZXMgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNeUNoYW5nZXNPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJQbGFubmVkU3RhcnRUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlTnVtYmVyIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBudW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZVRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSB0aXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlU3RhdGVJRCIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2Ugc3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNhdGVnb3J5SUQiIFRyYW5zbGF0YWJsZT0iMSI+Q2F0ZWdvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkltcGFjdElEIiBUcmFuc2xhdGFibGU9IjEiPkltcGFjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUHJpb3JpdHlJRCIgVHJhbnNsYXRhYmxlPSIxIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUmVxdWVzdGVkVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5SZXF1ZXN0ZWQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZFN0YXJ0VGltZSIgVHJhbnNsYXRhYmxlPSIxIj5QbGFubmVkIHN0YXJ0IHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlBsYW5uZWRFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgZW5kIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdHVhbFN0YXJ0VGltZSIgVHJhbnNsYXRhYmxlPSIxIj5BY3R1YWwgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsRW5kVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5BY3R1YWwgZW5kIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNyZWF0ZVRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iVXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJEb3duIiBUcmFuc2xhdGFibGU9IjEiPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlVwIiBUcmFuc2xhdGFibGU9IjEiPlVwPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgbGlzdCBvZiBvd24gd29ya29yZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZU15V29ya09yZGVyc092ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cm88L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMjIyNTaG93Q29sdW1ucyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBNeVdvcmtvcmRlcnMgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VNeVdvcmtPcmRlcnNPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGVTaWduYWwiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyTnVtYmVyIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclRpdGxlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckFnZW50IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclN0YXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclR5cGUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX1dvcmtPcmRlckZpZWxkTmFtZTEiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX1dvcmtPcmRlckZpZWxkTmFtZTIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iUGxhbm5lZFN0YXJ0VGltZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZU51bWJlciIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgbnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgdGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZVN0YXRlSUQiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDYXRlZ29yeUlEIiBUcmFuc2xhdGFibGU9IjEiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJJbXBhY3RJRCIgVHJhbnNsYXRhYmxlPSIxIj5JbXBhY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlByaW9yaXR5SUQiIFRyYW5zbGF0YWJsZT0iMSI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlJlcXVlc3RlZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWVzdGVkIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlBsYW5uZWRTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkRW5kVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5QbGFubmVkIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxTdGFydFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIHN0YXJ0IHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdHVhbEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWN0dWFsIGVuZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDcmVhdGVUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSB0aW1lPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQSVIjIyNGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB3b3Jrb3JkZXIgc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIFBJUiBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVBJUk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+YWNjZXB0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5yZWFkeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2FuY2VsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQSVIjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIFBJUiBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVBJUk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iRG93biIgVHJhbnNsYXRhYmxlPSIxIj5Eb3duPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVcCIgVHJhbnNsYXRhYmxlPSIxIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUElSIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgdGhlIGxpc3Qgb2YgY2hhbmdlcyB3aXRoIGFuIHVwY29taW5nIFBJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlUElST3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVBJUiMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIFBJUiBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVBJUk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlciIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJDb3VudCIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3QiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJTdGF0ZVNpZ25hbCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJOdW1iZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQWdlbnQiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGRfV29ya09yZGVyRmllbGROYW1lMSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGRfV29ya09yZGVyRmllbGROYW1lMiIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQSVIjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBQSVIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VQSVJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJQbGFubmVkU3RhcnRUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlTnVtYmVyIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBudW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNoYW5nZVRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSB0aXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlU3RhdGVJRCIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2Ugc3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNhdGVnb3J5SUQiIFRyYW5zbGF0YWJsZT0iMSI+Q2F0ZWdvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkltcGFjdElEIiBUcmFuc2xhdGFibGU9IjEiPkltcGFjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUHJpb3JpdHlJRCIgVHJhbnNsYXRhYmxlPSIxIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUmVxdWVzdGVkVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5SZXF1ZXN0ZWQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZFN0YXJ0VGltZSIgVHJhbnNsYXRhYmxlPSIxIj5QbGFubmVkIHN0YXJ0IHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlBsYW5uZWRFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgZW5kIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdHVhbFN0YXJ0VGltZSIgVHJhbnNsYXRhYmxlPSIxIj5BY3R1YWwgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsRW5kVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5BY3R1YWwgZW5kIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkNyZWF0ZVRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVBJUiMjI1dvcmtPcmRlclR5cGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHdvcmtvcmRlciB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzaG93IHRoZSBQSVIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VQSVJPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnBpcjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiMjI1JpY2hUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlVzZXMgcmljaHRleHQgZm9yIHZpZXdpbmcgYW5kIGVkaXRpbmcgdGlja2V0IG5vdGlmaWNhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6Vmlldzo6SVRTTUNoYW5nZU5vdGlmaWNhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb24jIyNSaWNoVGV4dFdpZHRoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHdpZHRoIGZvciB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb21wb25lbnQgZm9yIHRoaXMgc2NyZWVuLiBFbnRlciBudW1iZXIgKHBpeGVscykgb3IgcGVyY2VudCB2YWx1ZSAocmVsYXRpdmUpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpWaWV3OjpJVFNNQ2hhbmdlTm90aWZpY2F0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5cZCslPyQiPjYyMDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiMjI1JpY2hUZXh0SGVpZ2h0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhlaWdodCBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29tcG9uZW50IGZvciB0aGlzIHNjcmVlbi4gRW50ZXIgbnVtYmVyIChwaXhlbHMpIG9yIHBlcmNlbnQgdmFsdWUgKHJlbGF0aXZlKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6Vmlldzo6SVRTTUNoYW5nZU5vdGlmaWNhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQrJT8kIj4zMjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQcmludCMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHByaW50IHRoZSBhY2NvdW50ZWQgdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVByaW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVByaW50IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHByaW50IGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlUHJpbnQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVByaW50IyMjUGxhbm5lZEVmZm9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gcHJpbnQgdGhlIHBsYW5uZWQgZWZmb3J0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlUHJpbnQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUHJpbnQjIyNSZXF1ZXN0ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHJlcXVlc3RlZCBkYXRlIHNob3VsZCBiZSBwcmludCBieSBjdXN0b21lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVByaW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVByaW50IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIChmb3IgY2hhbmdlcyBhbmQgd29ya29yZGVycykgc2hvd24gaW4gdGhlIGNoYW5nZSBwcmludCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVByaW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2VhcmNoIyMjUmVxdWVzdGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSByZXF1ZXN0ZWQgZGF0ZSBzaG91bGQgYmUgc2VhcmNoZWQgYnkgY3VzdG9tZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VTZWFyY2g8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2VhcmNoIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBjaGFuZ2Ugc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlU2VhcmNoPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2VhcmNoIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY2hhbmdlIHNlYXJjaC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVNlYXJjaDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTEiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX0NoYW5nZUZpZWxkTmFtZTIiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZnJvbSBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVRlbXBsYXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VUaW1lU2xvdCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byBtb3ZlIGNoYW5nZXMgaW4gdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVRpbWVTbG90PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjQWNjb3VudGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBhY2NvdW50ZWQgdGltZSBzaG91bGQgYmUgc2hvd24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2Vab29tPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlWm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgcGxhbm5lZCBlZmZvcnQgc2hvdWxkIGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlWm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjUmVxdWVzdGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSByZXF1ZXN0ZWQgZGF0ZSBzaG91bGQgYmUgc2hvd24gYnkgY3VzdG9tZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2Vab29tPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNXb3JrT3JkZXJTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSB3b3Jrb3JkZXIgc3RhdGUgc2hvdWxkIGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlWm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjV29ya09yZGVyVGl0bGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgd29ya29yZGVyIHRpdGxlIHNob3VsZCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjI1dvcmtPcmRlckdyYXBoIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgc2hvd24gZ3JhcGggYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGltZUxpbmVDb2xvciI+I0RDMTQzQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGltZUxpbmVXaWR0aCI+MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0idW5kZWZpbmVkX3BsYW5uZWRfY29sb3IiPiNCMjIyMjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InVuZGVmaW5lZF9hY3R1YWxfY29sb3IiPiNGMDgwODA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImFwcHJvdmFsX3BsYW5uZWRfY29sb3IiPiNGRjQ1MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImFwcHJvdmFsX2FjdHVhbF9jb2xvciI+I0ZGN0Y1MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmFja291dF9wbGFubmVkX2NvbG9yIj4jNjk2OTY5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiYWNrb3V0X2FjdHVhbF9jb2xvciI+I0MwQzBDMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icGlyX3BsYW5uZWRfY29sb3IiPiM0NjgyQjQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBpcl9hY3R1YWxfY29sb3IiPiM4N0NFRUI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IndvcmtvcmRlcl9wbGFubmVkX2NvbG9yIj4jMDA2NDAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ3b3Jrb3JkZXJfYWN0dWFsX2NvbG9yIj4jM0NCMzcxPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjVG9vbHRpcDo6V29ya09yZGVyQXR0cmlidXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBhdHRyaWJ1dGVzIG9mIGEgd29ya29yZGVyIGluIHRoZSB0b29sdGlwIG9mIHRoZSB3b3Jrb3JkZXIgZ3JhcGggaW4gdGhlIGNoYW5nZSB6b29tLiBUbyBzaG93IHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyBpbiB0aGUgdG9vbHRpcCwgdGhleSBtdXN0IGJlIHNwZWNpZmllZCBsaWtlIER5bmFtaWNGaWVsZF9Xb3JrT3JkZXJGaWVsZE5hbWUxLCBEeW5hbWljRmllbGRfV29ya09yZGVyRmllbGROYW1lMiwgZXRjLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlWm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUaXRsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclR5cGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckFnZW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbnN0cnVjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVwb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2NvdW50ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRWZmb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGRfV29ya09yZGVyRmllbGROYW1lMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRHluYW1pY0ZpZWxkX1dvcmtPcmRlckZpZWxkTmFtZTIiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGNoYW5nZSB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlWm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlRGVsZXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGRlbGV0ZSBhIHRlbXBsYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlVGVtcGxhdGVEZWxldGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlRWRpdCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byBlZGl0IGEgdGVtcGxhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VUZW1wbGF0ZUVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlRWRpdENvbnRlbnQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZWRpdCB0aGUgY29udGVudCBvZiBhIHRlbXBsYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlVGVtcGxhdGVFZGl0Q29udGVudDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNVGVtcGxhdGVFZGl0Q29udGVudCMjI0RlZmF1bHRDaGFuZ2VUaXRsZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IGNoYW5nZSB0aXRsZSBmb3IgYSBkdW1teSBjaGFuZ2Ugd2hpY2ggaXMgbmVlZGVkIHRvIGVkaXQgYSB3b3Jrb3JkZXIgdGVtcGxhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VUZW1wbGF0ZUVkaXRDb250ZW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+SGVscGVyIGR1bW15IGNoYW5nZSBuZWVkZWQgZm9yIGVkaXRpbmcgYSB3b3Jrb3JkZXIgdGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUIjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZWRpdCB0aGUgY29udGVudCBvZiBhIHRlbXBsYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlVGVtcGxhdGVFZGl0Q0FCPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IyMjRmlsdGVyOjpUZW1wbGF0ZVR5cGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRlbXBsYXRlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIHRlbXBsYXRlIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNQ2hhbmdlVGVtcGxhdGVPdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPklUU01DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNV29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q0FCPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldyMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgdGVtcGxhdGUgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01DaGFuZ2VUZW1wbGF0ZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iRG93biIgVHJhbnNsYXRhYmxlPSIxIj5Eb3duPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJVcCIgVHJhbnNsYXRhYmxlPSIxIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IG92ZXJ2aWV3IG92ZXIgYWxsIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVRlbXBsYXRlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyNTaG93Q29sdW1ucyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVRlbXBsYXRlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbW1lbnQiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWYWxpZCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFZGl0Q29udGVudCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWxldGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlQnkiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCeSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVRlbXBsYXRlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iVGVtcGxhdGVJRCI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlRlbXBsYXRlSUQiIFRyYW5zbGF0YWJsZT0iMSI+VGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iVGVtcGxhdGVUeXBlSUQiIFRyYW5zbGF0YWJsZT0iMSI+VGVtcGxhdGUgdHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iVmFsaWRJRCIgVHJhbnNsYXRhYmxlPSIxIj5WYWxpZGl0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ3JlYXRlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgdGltZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyQWRkIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB3b3Jrb3JkZXIgYWRkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyQWRkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gYWRkIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyQWRkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHBsYW5uZWQgZWZmb3J0IHNob3VsZCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckFkZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gYWRkIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyQWRkRnJvbVRlbXBsYXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZ2VudCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byBjaGFuZ2UgdGhlIHdvcmtvcmRlciBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckFnZW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyRGVsZXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJFZGl0IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB3b3Jrb3JkZXIgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlckVkaXQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gZWRpdCBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlckVkaXQjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHBsYW5uZWQgZWZmb3J0IHNob3VsZCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyRWRpdCMjI01vdmVGb2xsb3dpbmdXb3JrT3JkZXJzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgY2hlY2tib3ggaW4gdGhlIHdvcmtvcmRlciBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBpZiB0aGUgdGhlIGZvbGxvd2luZyB3b3Jrb3JkZXJzIHNob3VsZCBhbHNvIGJlIG1vdmVkIGlmIGEgd29ya29yZGVyIGlzIG1vZGlmaWVkIGFuZCB0aGUgcGxhbm5lZCBlbmQgdGltZSBoYXMgY2hhbmdlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlckVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBoaXN0b3J5IG9mIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVySGlzdG9yeTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgaGlzdG9yeSB6b29tIG9mIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVySGlzdG9yeVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgYWNjb3VudGVkIHRpbWUgc2hvdWxkIGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyUmVwb3J0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCMjI0FjdHVhbFRpbWVTcGFuIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIGFjdHVhbCBzdGFydCBhbmQgZW5kIHRpbWVzIHNob3VsZCBiZSBzZXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01Xb3JrT3JkZXJSZXBvcnQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB3b3Jrb3JkZXIgcmVwb3J0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpJVFNNV29ya09yZGVyUmVwb3J0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gd3JpdGUgYSByZXBvcnQgZm9yIHRoZSB3b3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01Xb3JrT3JkZXJSZXBvcnQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclRha2UjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgaW4gb3JkZXIgZm9yIGFuIGFnZW50IHRvIHRha2UgYSB3b3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01Xb3JrT3JkZXJBZ2VudDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZnJvbSBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlclRlbXBsYXRlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il4ocnd8cm8pJCI+cnc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJab29tIyMjQWNjb3VudGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBhY2NvdW50ZWQgdGltZSBzaG91bGQgYmUgc2hvd24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01Xb3JrT3JkZXJab29tPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclpvb20jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlclpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXihyd3xybykkIj5ybzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclpvb20jIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHBsYW5uZWQgZWZmb3J0IHNob3VsZCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTVdvcmtPcmRlclpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyWm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgd29ya29yZGVyIHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OklUU01Xb3JrT3JkZXJab29tPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIGN1c3RvbWVyIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGN1c3RvbWVyIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iVXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJEb3duIiBUcmFuc2xhdGFibGU9IjEiPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlVwIiBUcmFuc2xhdGFibGU9IjEiPlVwPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpDdXN0b21lcklUU01DaGFuZ2VTY2hlZHVsZSMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGN1c3RvbWVyIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5IiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjEiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIiBTZWxlY3RlZElEPSIxIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiIFNlbGVjdGVkSUQ9IjAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSIgU2VsZWN0ZWRJRD0iMCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUxIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkR5bmFtaWNGaWVsZF9DaGFuZ2VGaWVsZE5hbWUyIiBTZWxlY3RlZElEPSIwIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIyMjU2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoYXQgb25seSBjaGFuZ2VzIGNvbnRhaW5pbmcgV29ya29yZGVycyBsaW5rZWQgd2l0aCBzZXJ2aWNlcywgd2hpY2ggdGhlIGN1c3RvbWVyIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gdXNlIHdpbGwgYmUgc2hvd24uIEFueSBvdGhlciBjaGFuZ2VzIHdpbGwgbm90IGJlIGRpc3BsYXllZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlldzo6SVRTTUNoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBjdXN0b21lciBjaGFuZ2Ugc2NoZWR1bGUgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6Q3VzdG9tZXI6OlZpZXc6OklUU01DaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlBsYW5uZWRTdGFydFRpbWUiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VOdW1iZXIiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIG51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2hhbmdlVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJDaGFuZ2VTdGF0ZUlEIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBzdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ2F0ZWdvcnlJRCIgVHJhbnNsYXRhYmxlPSIxIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iSW1wYWN0SUQiIFRyYW5zbGF0YWJsZT0iMSI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQcmlvcml0eUlEIiBUcmFuc2xhdGFibGU9IjEiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJSZXF1ZXN0ZWRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlJlcXVlc3RlZCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJQbGFubmVkU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPlBsYW5uZWQgc3RhcnQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUGxhbm5lZEVuZFRpbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGxhbm5lZCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0dWFsU3RhcnRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBzdGFydCB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3R1YWxFbmRUaW1lIiBUcmFuc2xhdGFibGU9IjEiPkFjdHVhbCBlbmQgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ3JlYXRlVGltZSIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uIyMjMDYtQWRkV29ya09yZGVyQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGNoZWNrIGlmIFdvcmtPcmRlckFkZCBvciBXb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUgc2hvdWxkIGJlIHBlcm1pdHRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6QWRkV29ya09yZGVyQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlBlcm1pc3Npb24jIyMxMC1DaGFuZ2VNYW5hZ2VyQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGNoZWNrIHRoZSBjaGFuZ2UgbWFuYWdlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uIyMjMjAtQ2hhbmdlQnVpbGRlckNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBjaGVjayB0aGUgY2hhbmdlIGJ1aWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWlyZWQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkdyYW50ZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6UGVybWlzc2lvbiMjIzMwLUNoYW5nZUFnZW50Q2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGNoZWNrIHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQWdlbnRDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWlyZWQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkdyYW50ZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6UGVybWlzc2lvbiMjIzQwLUNBQkNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBjaGVjayB0aGUgQ0FCIG1lbWJlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNBQkNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uIyMjMTAtQ2hhbmdlTWFuYWdlckNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBjaGVjayB0aGUgY2hhbmdlIG1hbmFnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNV29ya09yZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWlyZWQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkdyYW50ZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbiMjIzIwLUNoYW5nZUJ1aWxkZXJDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGNoYW5nZSBidWlsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb24jIyMzMC1Xb3JrT3JkZXJBZ2VudENoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBjaGVjayB0aGUgd29ya29yZGVyIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpXb3JrT3JkZXJBZ2VudENoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uIyMjNDAtQ0FCQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIGNoZWNrIHRoZSBDQUIgbWVtYmVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q0FCQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uIyMjMTAtRW1wdHlBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgd2hldGhlciBubyB3b3Jrb3JkZXIgYWdlbnQgaXMgc2V0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpFbXB0eUFnZW50Q2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uIyMjMjAtTGlzdEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBjaGVjayB3aGV0aGVyIHRoZSBhZ2VudCBpcyBjb250YWluZWQgaW4gdGhlIGNvbmZpZ3VyZWQgbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Xb3JrT3JkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6TGlzdEFnZW50Q2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6QWNsOjpNb2R1bGUjIyMyMDAtVGlja2V0OjpBY2w6Ok1vZHVsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIEFDTCBtb2R1bGUgcmVzdHJpY3RzIHRoZSB1c3VhZ2Ugb2YgdGhlIHRpY2tldCB0eXBlcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzeXNjb25maWcgb3B0aW9uICdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnLCB0byB1c2VycyBvZiB0aGUgZ3JvdXBzIGFzIGRlZmluZWQgaW4gIklUU01DaGFuZ2U6OlJlc3RyaWN0VGlja2V0VHlwZXM6Okdyb3VwcyIuIEFzIHRoaXMgQUNMIGNvdWxkIGNvbGxpZGUgd2l0aCBvdGhlciBBQ0xzIHdoaWNoIGFyZSBhbHNvIHJlbGF0ZWQgdG8gdGhlIHRpY2tldCB0eXBlLCB0aGlzIHN5c2NvbmZpZyBvcHRpb24gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgc2hvdWxkIG9ubHkgYmUgYWN0aXZhdGVkIGlmIG5lZWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDo6QUNMPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QWNsOjpSZXN0cmljdFRpY2tldFR5cGVzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCMjI0NoYW5nZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVN0YXRlTWFjaGluZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCMjI1dvcmtPcmRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciB3b3Jrb3JkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTVN0YXRlTWFjaGluZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5Xb3JrT3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgd2hldGhlciBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Tm90aWZpY2F0aW9uczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlRpbWVSZWFjaGVkTm90aWZpY2F0aW9ucyMjI0ZyZXF1ZW5jeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWd1cmVzIGhvdyBvZnRlbiB0aGUgbm90aWZpY2F0aW9ucyBhcmUgc2VudCB3aGVuIHBsYW5uZWQgdGhlIHN0YXJ0IHRpbWUgb3Igb3RoZXIgdGltZSB2YWx1ZXMgaGF2ZSBiZWVuIHJlYWNoZWQvcGFzc2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Tm90aWZpY2F0aW9uczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJvbmNlIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0ib25jZSIgVHJhbnNsYXRhYmxlPSIxIj5vbmNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJyZWd1bGFybHkiIFRyYW5zbGF0YWJsZT0iMSI+cmVndWxhcmx5PC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OlRpbWVSZWFjaGVkTm90aWZpY2F0aW9ucyMjI0hvdXJzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIGZyZXF1ZW5jeSBpcyAncmVndWxhcmx5JywgeW91IGNhbiBjb25maWd1cmUgaG93IG9mdGVuIHRoZSBub3RpZmljYXRpb25zIGFyZSBzZW50IChldmVyeSBYIGhvdXJzKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6Ok5vdGlmaWNhdGlvbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlN0YXRzOjpFeGNoYW5nZUF4aXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiBhbiBhZ2VudCBjYW4gZXhjaGFuZ2UgdGhlIFgtYXhpcyBvZiBhIHN0YXQgaWYgaGUgZ2VuZXJhdGVzIG9uZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6U3RhdHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRldGVybWluZXMgaWYgdGhlIGNvbW1vbiBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTdGF0czwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgY29tbW9uIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgY2hhbmdlcyByZWdhcmRpbmcgY2hhbmdlIHN0YXRlIHVwZGF0ZXMgd2l0aGluIGEgdGltZXBlcmlvZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN0YXRzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgY29tbW9uIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgY2hhbmdlcyByZWdhcmRpbmcgdGhlIHJlbGF0aW9uIGJldHdlZW4gY2hhbmdlcyBhbmQgaW5jaWRlbnQgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN0YXRzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3RlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZXRlcm1pbmVzIGlmIHRoZSBjb21tb24gc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCB0aGUgbnVtYmVyIG9mIFJmYyB0aWNrZXRzIGEgcmVxdWVzdGVyIGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpTdGF0czwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRSZmNSZXF1ZXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNQZXJDSUNsYXNzZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyBpZiB0aGUgY29tbW9uIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgY2hhbmdlcyBkb25lIGZvciBjb25maWcgaXRlbSBjbGFzc2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3RhdHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc1BlckNJQ2xhc3NlczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VsZWN0cyB0aGUgY2hhbmdlIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY2hhbmdlIG51bWJlciwgdGhlIFN5c3RlbUlEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZCB3aXRoIFN5c3RlbUlELmNvdW50ZXIgZm9ybWF0IChlLmcuIDEwMDExOCwgMTAwMTE5KS4gV2l0aCAiRGF0ZSIsIHRoZSBjaGFuZ2UgbnVtYmVycyB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCBkYXRlIGFuZCBhIGNvdW50ZXI7IHRoaXMgZm9ybWF0IGxvb2tzIGxpa2UgWWVhci5Nb250aC5EYXkuY291bnRlciwgZS5nLiAyMDEwMDYyNDAwMDAxLCAyMDEwMDYyNDAwMDAyLiBXaXRoICJEYXRlQ2hlY2tzdW0iLCB0aGUgY291bnRlciB3aWxsIGJlIGFwcGVuZGVkIGFzIGNoZWNrc3VtIHRvIHRoZSBzdHJpbmcgb2YgZGF0ZSBwbHVzIHRoZSBTeXN0ZW1JRC4gVGhlIGNoZWNrc3VtIHdpbGwgYmUgcm90YXRlZCBvbiBhIGRhaWx5IGJhc2lzLiBUaGlzIGZvcm1hdCBsb29rcyBsaWtlIFllYXIuTW9udGguRGF5LlN5c3RlbUlELkNvdW50ZXIuQ2hlY2tTdW0sIGUuZy4gMjAxMDA2MjQxMDAwMDAxNywgMjAxMDA2MjQxMDAwMDAyNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlBlcmxNb2R1bGUiIFZhbHVlRmlsdGVyPSJLZXJuZWwvU3lzdGVtL0lUU01DaGFuZ2UvTnVtYmVyLyoucG0iPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXI6OkRhdGVDaGVja3N1bTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yOjpNaW5Db3VudGVyU2l6ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBtaW5pbWFsIGNoYW5nZSBjb3VudGVyIHNpemUgKGlmICJBdXRvSW5jcmVtZW50IiB3YXMgc2VsZWN0ZWQgYXMgSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yKS4gRGVmYXVsdCBpcyA1LCB0aGlzIG1lYW5zIHRoZSBjb3VudGVyIHN0YXJ0cyBmcm9tIDEwMDAwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeWzAtOV0kIj41PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3I6OkF1dG9JbmNyZW1lbnQ6Ok1pbkNvdW50ZXJTaXplIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIG1pbmltYWwgY2hhbmdlIGNvdW50ZXIgc2l6ZSAoaWYgIkF1dG9JbmNyZW1lbnQiIHdhcyBzZWxlY3RlZCBhcyBJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3IpLiBEZWZhdWx0IGlzIDUsIHRoaXMgbWVhbnMgdGhlIGNvdW50ZXIgc3RhcnRzIGZyb20gMTAwMDAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpJVFNNQ2hhbmdlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMC05XSQiPjU8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6Ok51bWJlckdlbmVyYXRvcjo6RGF0ZTo6VXNlRm9ybWF0dGVkQ291bnRlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIHRoZSBtaW5pbWFsIGNoYW5nZSBjb3VudGVyIHNpemUgKGlmICJEYXRlIiB3YXMgc2VsZWN0ZWQgYXMgSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01DaGFuZ2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQcmVmZXJlbmNlc0dyb3VwcyMjI1VzZXJDcmVhdGVXb3JrT3JkZXJOZXh0TWFzayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgVXNlckNyZWF0ZVdvcmtPcmRlck5leHRNYXNrIG9iamVjdCBpbiB0aGUgcHJlZmVyZW5jZSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlByZWZlcmVuY2VzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmZXJlbmNlR3JvdXAiPk1pc2NlbGxhbmVvdXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHVtbiIgVHJhbnNsYXRhYmxlPSIxIj5PdGhlciBTZXR0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+U2NyZWVuIGFmdGVyIGNyZWF0aW5nIGEgd29ya29yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZ3VyZSB3aGljaCBzY3JlZW4gc2hvdWxkIGJlIHNob3duIGFmdGVyIGEgbmV3IHdvcmtvcmRlciBoYXMgYmVlbiBjcmVhdGVkLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5IiBUcmFuc2xhdGFibGU9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRJVFNNV29ya09yZGVyWm9vbSIgVHJhbnNsYXRhYmxlPSIxIj5Xb3Jrb3JkZXIgWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudElUU01DaGFuZ2Vab29tIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBab29tPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YVNlbGVjdGVkIj5BZ2VudElUU01Xb3JrT3JkZXJab29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Vc2VyQ3JlYXRlV29ya09yZGVyTmV4dE1hc2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQwMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQcmVmZXJlbmNlc0dyb3VwcyMjI0NoYW5nZU92ZXJ2aWV3U21hbGxQYWdlU2hvd24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIHBhZ2VzIChpbiB3aGljaCB0aGUgY2hhbmdlcyBhcmUgc2hvd24pIG9mIHRoZSBzbWFsbCBjaGFuZ2Ugb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlByZWZlcmVuY2VzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmZXJlbmNlR3JvdXAiPk1pc2NlbGxhbmVvdXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHVtbiIgVHJhbnNsYXRhYmxlPSIxIj5PdGhlciBTZXR0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIE92ZXJ2aWV3ICJTbWFsbCIgTGltaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIGxpbWl0IHBlciBwYWdlIGZvciBDaGFuZ2UgT3ZlcnZpZXcgIlNtYWxsIi48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSIgVHJhbnNsYXRhYmxlPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4xMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjAiPjIwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4yNTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMCI+MzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzUiPjM1PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YVNlbGVjdGVkIj4yNTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+VXNlckNoYW5nZU92ZXJ2aWV3U21hbGxQYWdlU2hvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjgwMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQcmVmZXJlbmNlc0dyb3VwcyMjI1VzZXJJVFNNQ2hhbmdlTWFuYWdlbWVudFRlbXBsYXRlRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TdG9yZXMgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgaWRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRlbXBsYXRlIGlkLCB3aGlsZSBhIHVzZXIgaXMgZWRpdGluZyBhIHRlbXBsYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpQcmVmZXJlbmNlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZmVyZW5jZUdyb3VwIj5NaXNjZWxsYW5lb3VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb2x1bW4iIFRyYW5zbGF0YWJsZT0iMSI+T3RoZXIgU2V0dGluZ3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBhbmQgV29ya29yZGVyIFRlbXBsYXRlczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgYW5kIHdvcmtvcmRlciB0ZW1wbGF0ZXMgZWRpdGVkIGJ5IHRoaXMgdXNlci48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPklucHV0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEYXRhIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlVzZXJJVFNNQ2hhbmdlTWFuYWdlbWVudFRlbXBsYXRlRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+OTAwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpTZWFyY2gjIyNDaGFuZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51OjpTZWFyY2g8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iXig/OkFnZW50fEFkbWluKUlUU00oQ2hhbmdlfFdvcmtPcmRlcnxUZW1wbGF0ZU92ZXJ2aWV3KSI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVNlYXJjaDtTdWJhY3Rpb249QUpBWDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6U2VhcmNoOjpKYXZhU2NyaXB0IyMjQ2hhbmdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkphdmFTY3JpcHQgZnVuY3Rpb24gZm9yIHRoZSBzZWFyY2ggZnJvbnRlbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU6OlNlYXJjaDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJeKD86QWdlbnR8QWRtaW4pSVRTTShDaGFuZ2V8V29ya09yZGVyfFRlbXBsYXRlT3ZlcnZpZXcpIj5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuU2VhcmNoLk9wZW5TZWFyY2hEaWFsb2coJ0FnZW50SVRTTUNoYW5nZVNlYXJjaCcpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyNTZWFyY2hDU1ZEYXRhIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRhdGEgdXNlZCB0byBleHBvcnQgdGhlIHNlYXJjaCByZXN1bHQgaW4gQ1NWIGZvcm1hdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVNlYXJjaDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZU51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZVRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlQnVpbGRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPldvcmtPcmRlckNvdW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlBsYW5uZWRTdGFydFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5QbGFubmVkRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXQgdGhlIGRlZmF1bHQgaGVpZ2h0IChpbiBwaXhlbHMpIG9mIGlubGluZSBIVE1MIGZpZWxkcyBpbiB0aGUgY2hhbmdlIHpvb20gc2NyZWVuIGFuZCB3b3Jrb3JkZXIgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlswLTldezEsNH0kIj4xMDA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudEhUTUxGaWVsZEhlaWdodE1heCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXQgdGhlIG1heGltdW0gaGVpZ2h0IChpbiBwaXhlbHMpIG9mIGlubGluZSBIVE1MIGZpZWxkcyBpbiB0aGUgY2hhbmdlIHpvb20gc2NyZWVuIGFuZCB3b3Jrb3JkZXIgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6SVRTTUNoYW5nZVpvb208L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlswLTldezEsNX0kIj4yNTAwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzEwMC1JVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIEpTIGZpbGVzIHRvIGFsd2F5cyBiZSBsb2FkZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNBQk1lbWJlclNlYXJjaC5qczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5TZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuVXNlclNlYXJjaC5qczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRXZlbnRzIyMjSVRTTUNoYW5nZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBjaGFuZ2UgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlQWRkUHJlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlQWRkUG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZVVwZGF0ZVByZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZVVwZGF0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DaGFuZ2VDQUJVcGRhdGVQcmU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DaGFuZ2VDQUJVcGRhdGVQb3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlQ0FCRGVsZXRlUHJlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2hhbmdlQ0FCRGVsZXRlUG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZURlbGV0ZVByZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZURlbGV0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DaGFuZ2VBdHRhY2htZW50QWRkUG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNoYW5nZUF0dGFjaG1lbnREZWxldGVQb3N0PC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFdmVudHMjIyNJVFNNV29ya09yZGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgYWxsIHdvcmtvcmRlciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW48L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Xb3JrT3JkZXJBZGRQcmU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Xb3JrT3JkZXJBZGRQb3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+V29ya09yZGVyVXBkYXRlUHJlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+V29ya09yZGVyVXBkYXRlUG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPldvcmtPcmRlckRlbGV0ZVByZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPldvcmtPcmRlckRlbGV0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Xb3JrT3JkZXJBdHRhY2htZW50QWRkUG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGVQb3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudEFkZFBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Xb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50RGVsZXRlUG9zdDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyMxMDAwLUdlbmVyaWNJbnRlcmZhY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGVyZm9ybXMgdGhlIGNvbmZpZ3VyZWQgYWN0aW9uIGZvciBlYWNoIGV2ZW50IChhcyBhbiBJbnZva2VyKSBmb3IgZWFjaCBjb25maWd1cmVkIFdlYnNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTUNoYW5nZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RXZlbnQ6OkhhbmRsZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+PC9JdGVtPjwhLS0gcnVuIG9uIGFsbCBldmVudHMgLS0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVdvcmtPcmRlcjo6RXZlbnRNb2R1bGUjIyMxMDAwLUdlbmVyaWNJbnRlcmZhY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGVyZm9ybXMgdGhlIGNvbmZpZ3VyZWQgYWN0aW9uIGZvciBlYWNoIGV2ZW50IChhcyBhbiBJbnZva2VyKSBmb3IgZWFjaCBjb25maWd1cmVkIFdlYnNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFdmVudDo6SVRTTVdvcmtPcmRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RXZlbnQ6OkhhbmRsZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+PC9JdGVtPjwhLS0gcnVuIG9uIGFsbCBldmVudHMgLS0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6OkFkbWluTW9kdWxlR3JvdXBzIyMjMjAwLUlUU01DaGFuZ2VNYW5hZ2VtZW50IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYXZhaWxhYmxlIGdyb3VwcyBmb3IgdGhlIGFkbWluIG92ZXJ2aWV3IHNjcmVlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpOYXZCYXJNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU2V0dGluZ3MiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoYW5nZSBTZXR0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPcmRlciI+OTAwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L29mb3JrX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9HZW5lcmljSW50ZXJmYWNlL0V2ZW50L09iamVjdFR5cGUvSVRTTUNoYW5nZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE2IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RXZlbnQ6Ok9iamVjdFR5cGU6OklUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpFdmVudDo6T2JqZWN0VHlwZTo6SVRTTUNoYW5nZSAtIEdlbmVyaWNJbnRlcmZhY2UgZXZlbnQgZGF0YSBoYW5kbGVyCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgZXZlbnQgaGFuZGxlciBnYXRoZXJzIGRhdGEgZnJvbSBvYmplY3RzLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSUQgPSAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH07CgogICAgaWYgKCAhJElEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDaGFuZ2VJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVPYmplY3REYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJU9iamVjdERhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9HZW5lcmljSW50ZXJmYWNlL0V2ZW50L09iamVjdFR5cGUvSVRTTVdvcmtPcmRlci5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNV29ya09yZGVyLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE2IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RXZlbnQ6Ok9iamVjdFR5cGU6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpFdmVudDo6T2JqZWN0VHlwZTo6SVRTTVdvcmtPcmRlciAtIEdlbmVyaWNJbnRlcmZhY2UgZXZlbnQgZGF0YSBoYW5kbGVyCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgZXZlbnQgaGFuZGxlciBnYXRoZXJzIGRhdGEgZnJvbSBvYmplY3RzLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSUQgPSAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH07CgogICAgaWYgKCAhJElEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBXb3JrT3JkZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVPYmplY3REYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJU9iamVjdERhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBkZV9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSx2IDEuMyAyMDE4LzExLzExIDEyOjU0OjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01DaGFuZ2VNYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGVnb3J5IOKGlCBJbXBhY3Qg4oaUIFByaW9yaXR5J30gPSAnS2F0ZWdvcmllIOKGlCBBdXN3aXJrdW5nIOKGlCBQcmlvcml0w6R0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSB0aGUgcHJpb3JpdHkgcmVzdWx0IG9mIGNvbWJpbmF0aW5nIENhdGVnb3J5IOKGlCBJbXBhY3QuJ30gPQogICAgICAgICdWZXJ3YWx0dW5nIGRlciBQcmlvcml0w6R0IGF1cyBkZXIgS29tYmluYXRpb24gdm9uIEthdGVnb3JpZSDihpQgSW1wYWN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gPSAnUHJpb3JpdMOkdCB6dW9yZG5lbic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENoYW5nZU1hbmFnZW1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdJVFNNIENoYW5nZU1hbmFnZW1lbnQgQmVuYWNocmljaHRpZ3VuZ3MtVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTm90aWZpY2F0aW9uIFJ1bGUnfSA9ICdCZW5hY2hyaWNodGlndW5ncy1SZWdlbCBoaW56dWbDvGdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IE5vdGlmaWNhdGlvbiBSdWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Egbm90aWZpY2F0aW9uIHNob3VsZCBoYXZlIGEgbmFtZSEnfSA9ICdFaW5lIEJlbmFjaHJpY2h0aWd1bmcgYmVuw7Z0aWd0IGVpbmVuIE5hbWVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ05hbWUgaXN0IGVyZm9yZGVybGljaC4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTVN0YXRlTWFjaGluZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4gU3RhdGUgTWFjaGluZSd9ID0gJ0FkbWluIFN0YXRlIE1hY2hpbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgY2F0YWxvZyBjbGFzcyEnfSA9ICdXw6RobGVuIFNpZSBlaW5lIEthdGFsb2ctS2xhc3NlIGF1cyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBjYXRhbG9nIGNsYXNzIGlzIHJlcXVpcmVkISd9ID0gJ0VpbmUgS2F0YWxvZy1LbGFzc2UgaXN0IGVyZm9yZGVybGljaCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgc3RhdGUgdHJhbnNpdGlvbid9ID0gJ0hpbnp1ZsO8Z2VuIGVpbmVzIFN0YXR1cy3DnGJlcmdhbmdzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbG9nLUtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgTmFtZSd9ID0gJ09iamVrdC1OYW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG92ZXIgc3RhdGUgdHJhbnNpdGlvbnMgZm9yJ30gPSAnw5xiZXJzaWNodCDDvGJlciBTdGF0dXPDvGJlcmfDpG5nZSBmw7xyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSB0aGlzIHN0YXRlIHRyYW5zaXRpb24nfSA9ICdMw7ZzY2hlbiBkaWVzZXMgU3RhdHVzLcOcYmVyZ2FuZ3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgbmV3IHN0YXRlIHRyYW5zaXRpb24gZm9yJ30gPSAnSGluenVmw7xnZW4gZWluZXMgbmV1ZW4gU3RhdHVzLcOcYmVyZ2FuZ3MgZsO8cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgc3RhdGUhJ30gPSAnQml0dGUgd8OkaGxlbiBTaWUgZWluZW4gU3RhdHVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgbmV4dCBzdGF0ZSEnfSA9ICdCaXR0ZSB3w6RobGVuIHNpZSBkZW4gRm9sZ2UtU3RhdHVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGEgc3RhdGUgdHJhbnNpdGlvbiBmb3InfSA9ICdCZWFyYmVpdGVuIGVpbmVzIFN0YXR1cy3DnGJlcmdhbmdzIGbDvHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgc3RhdGUgdHJhbnNpdGlvbid9ID0gJ1dvbGxlbiBTaWUgZGllc2VuIFN0YXR1cy3DnGJlcmdhbmcgd2lya2xpY2ggbMO2c2NoZW4/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VBZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDaGFuZ2UnfSA9ICdDaGFuZ2UgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDaGFuZ2UnfSA9ICdDaGFuZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdGlmaWNhdGlvbid9ID0gJ0JlZ3LDvG5kdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lucHV0IGludmFsaWQuJ30gPSAnVW5nw7xsdGlnZSBFaW5nYWJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdBdXN3aXJrdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVlc3RlZCBEYXRlJ30gPSAnV3Vuc2NodGVybWluJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBDaGFuZ2UgVGVtcGxhdGUnfSA9ICdDaGFuZ2UtVm9ybGFnZSBhdXN3w6RobGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgdHlwZSd9ID0gJ1plaXQtVHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgdGltZSB0eXBlLid9ID0gJ1VuZ8O8bHRpZ2VyIFplaXQtVHlwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgdGltZSd9ID0gJ05ldWUgWmVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NhdmUgQ2hhbmdlIENBQiBhcyB0ZW1wbGF0ZSd9ID0gJ0RpZXNlbiBDaGFuZ2UgYWxzIFZvcmxhZ2Ugc3BlaWNoZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2dvIHRvIGludm9sdmVkIHBlcnNvbnMgc2NyZWVuJ30gPSAnZ2VoZSB6dW0gU2NyZWVuICJCZXRlaWxpZ3RlIFBlcnNvbmVuIic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIE5hbWUnfSA9ICdVbmfDvGx0aWdlciBOYW1lJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmRpdGlvbnMgYW5kIEFjdGlvbnMnfSA9ICdCZWRpbmd1bmdlbiB1bmQgQWt0aW9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIENvbmRpdGlvbid9ID0gJ0JlZGluZ3VuZyBsw7ZzY2hlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IGNvbmRpdGlvbid9ID0gJ0JlZGluZ3VuZyBoaW56dWbDvGdlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDb25kaXRpb24nfSA9ICdCZWRpbmd1bmcgYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIGEgdmFsaWQgbmFtZS4nfSA9ICdFaW4gZ8O8bHRpZ2VyIE5hbWUgaXN0IGVyZm9yZGVybGljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSB2YWxpZCBuYW1lIGlzIG5lZWRlZC4nfSA9ICdFaW4gZ8O8bHRpZ2VyIE5hbWUgaXN0IGVyZm9yZGVybGljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWU6J30gPSAnRG9wcGVsdGVyIE5hbWU6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgbmFtZSBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjb25kaXRpb24uJ30gPSAnRGllc2VyIE5hbWUgd2lyZCBiZXJlaXRzIHZvbiBlaW5lciBhbmRlcmVuIEJlZGluZ3VuZyB2ZXJ3ZW5kZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hdGNoaW5nJ30gPSAnw5xiZXJlaW5zdGltbXVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbnkgZXhwcmVzc2lvbiAoT1IpJ30gPSAnQmVsaWViaWdlciBsb2dpc2NoZXIgQXVzZHJ1Y2sgKE9ERVIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleHByZXNzaW9ucyAoQU5EKSd9ID0gJ0FsbGUgbG9naXNjaGVuIEF1c2Ryw7xja2UgKFVORCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwcmVzc2lvbnMnfSA9ICdMb2dpc2NoZSBBdXNkcsO8Y2tlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdG9yJ30gPSAnU2VsZWt0b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlcmF0b3InfSA9ICdPcGVyYXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgRXhwcmVzc2lvbid9ID0gJ0F1c2RydWNrIGzDtnNjaGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIEV4cHJlc3Npb25zIGZvdW5kLid9ID0gJ0tlaW5lbiBsb2dpc2NoZW4gQXVzZHJ1Y2sgZ2VmdW5kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgZXhwcmVzc2lvbid9ID0gJ0bDvGdlIGVpbmVuIG5ldWVuIGxvZ2lzY2hlbiBBdXNkcnVjayBoaW56dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgQWN0aW9uJ30gPSAnQWt0aW9uIGzDtnNjaGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIEFjdGlvbnMgZm91bmQuJ30gPSAnS2VpbmUgQWt0aW9uZW4gZ2VmdW5kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgYWN0aW9uJ30gPSAnRsO8Z2UgZWluZSBuZXVlIEFrdGlvbiBoaW56dSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlRGVsZXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY2hhbmdlPyd9ID0gJ03DtmNodGVuIFNpZSBkaWVzZW4gQ2hhbmdlIHdpcmtsaWNoIGzDtnNjaGVuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCAlcyVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VIaXN0b3J5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IG9mICVzJXMnfSA9ICdWZXJsYXVmIHZvbiAlcyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hpc3RvcnkgQ29udGVudCd9ID0gJ8OEbmRlcnVuZ3N2ZXJsYXVmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlcid9ID0gJ0FyYmVpdHNhdWZ0cmFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZXRpbWUnfSA9ICdFcnN0ZWxsdCBhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGRldGFpbHMnfSA9ICdEZXRhaWxzIGFuemVpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgd29ya29yZGVyJ30gPSAnQXJiZWl0c2F1ZnRyYWcgYW56ZWlnZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRhaWxlZCBoaXN0b3J5IGluZm9ybWF0aW9uIG9mICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVkJ30gPSAnTW9kaWZpemllcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2xkIFZhbHVlJ30gPSAnQWx0ZXIgV2VydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgVmFsdWUnfSA9ICdOZXVlciBXZXJ0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgSW52b2x2ZWQgUGVyc29ucyBvZiAlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludm9sdmVkIFBlcnNvbnMnfSA9ICdCZXRlaWxpZ3RlIFBlcnNvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZU1hbmFnZXInfSA9ICdDaGFuZ2UtTWFuYWdlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIGludmFsaWQuJ30gPSAnVW5nw7xsdGlnZXIgQmVudXR6ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlQnVpbGRlcid9ID0gJ0NoYW5nZS1CdWlsZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBBZHZpc29yeSBCb2FyZCd9ID0gJ0NoYW5nZS1BZHZpc29yeS1Cb2FyZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDQUIgVGVtcGxhdGUnfSA9ICdDQUItVm9ybGFnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBseSBUZW1wbGF0ZSd9ID0gJ1ZvcmxhZ2UgYW53ZW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3VGVtcGxhdGUnfSA9ICdOZXVlIFZvcmxhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2F2ZSB0aGlzIENBQiBhcyB0ZW1wbGF0ZSd9ID0gJ0RpZXNlcyBDQUIgYWxzIFZvcmxhZ2Ugc3BlaWNoZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCB0byBDQUInfSA9ICdadW0gQ0FCIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVXNlcid9ID0gJ1VuZ8O8bHRpZ2VyIEJlbnV0emVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgQ0FCJ30gPSAnQWt0dWVsbGVzIENBQic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdOYXZCYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbnRleHQgU2V0dGluZ3MnfSA9ICdLb250ZXh0LUVpbnN0ZWxsdW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlcyBwZXIgcGFnZSd9ID0gJ0NoYW5nZXMgcHJvIFNlaXRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VPdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgVGl0bGUnfSA9ICdBcmJlaXRzYXVmdHJhZ3N0aXRlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgVGl0bGUnfSA9ICdUaXRlbCDDpG5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlciBBZ2VudCd9ID0gJ0FyYmVpdHNhdWZ0cmFnc2FnZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBCdWlsZGVyJ30gPSAnQ2hhbmdlLUJ1aWxkZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIE1hbmFnZXInfSA9ICdDaGFuZ2UtTWFuYWdlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXJzJ30gPSAnQXJiZWl0c2F1ZnRyw6RnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgU3RhdGUnfSA9ICfDhG5kZXJ1bmdzc3RhdHVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlciBTdGF0ZSd9ID0gJ0FyYmVpdHNhdWZ0cmFnc3N0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgVHlwZSd9ID0gJ0FyYmVpdHNhdWZ0cmFndHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVlc3RlZCBUaW1lJ30gPSAnV3Vuc2NodGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQgU3RhcnQgVGltZSd9ID0gJ0dlcGxhbnRlIFN0YXJ0emVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkIEVuZCBUaW1lJ30gPSAnR2VwbGFudGUgRW5kemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBY3R1YWwgU3RhcnQgVGltZSd9ID0gJ1RhdHPDpGNobGljaGUgU3RhcnR6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FjdHVhbCBFbmQgVGltZSd9ID0gJ1RhdHPDpGNobGljaGUgRW5kemVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlUmVzZXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byByZXNldCB0aGlzIGNoYW5nZT8nfSA9ICdNw7ZjaHRlbiBTaWUgZGllc2VuIENoYW5nZSB3aXJrbGljaCB6dXLDvGNrc2V0emVuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNQ2hhbmdlU2VhcmNoCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycoZS5nLiAxMCo1MTU1IG9yIDEwNTY1OCopJ30gPSAnKHouIEIuIDEwKjUxNTUgb3IgMTA1NjU4KiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ0FCIEFnZW50J30gPSAnQ0FCLUFnZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2UuZy4nfSA9ICd6LiBCLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDQUIgQ3VzdG9tZXInfSA9ICdDQUItS3VuZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBXb3Jrb3JkZXIgSW5zdHJ1Y3Rpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBXb3Jrb3JkZXIgUmVwb3J0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ2hhbmdlIFByaW9yaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ2hhbmdlIEltcGFjdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgQ2F0ZWdvcnknfSA9ICdDaGFuZ2UtS2F0ZWdvcmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyhiZWZvcmUvYWZ0ZXIpJ30gPSAnKHZvci9uYWNoKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycoYmV0d2VlbiknfSA9ICcoendpc2NoZW4pJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01DaGFuZ2VUZW1wbGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2F2ZSBDaGFuZ2UgYXMgVGVtcGxhdGUnfSA9ICdTcGVpY2hlcmUgQ2hhbmdlIGFscyBWb3JsYWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgdGVtcGxhdGUgc2hvdWxkIGhhdmUgYSBuYW1lISd9ID0gJ0VpbmUgVm9ybGFnZSBiZW7DtnRpZ3QgZWluZW4gTmFtZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSB0ZW1wbGF0ZSBuYW1lIGlzIHJlcXVpcmVkLid9ID0gJ0RlciBWb3JsYWdlbi1OYW1lIGlzdCBlcmZvcmRlcmxpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc2V0IFN0YXRlcyd9ID0gJ1NldHplIFN0YXR1cyB6dXLDvGNrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ3cml0ZSBvcmlnaW5hbCB0ZW1wbGF0ZSd9ID0gJ09yaWdpbmFsLVRlbXBsYXRlIMO8YmVyc2NocmVpYmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBvcmlnaW5hbCBjaGFuZ2UnfSA9ICdPcmlnaW5hbC1DaGFuZ2UgbMO2c2NoZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNoYW5nZVRpbWVTbG90CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIFRpbWUgU2xvdCd9ID0gJ1ZlcnNjaGllYmUgWmVpdGZlbnN0ZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTUNoYW5nZVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJbmZvcm1hdGlvbid9ID0gJ0NoYW5nZS1JbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWQgRWZmb3J0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FjY291bnRlZCBUaW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJbml0aWF0b3IocyknfSA9ICdDaGFuZ2UgSW5pdGlhdG9yKHMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NBQid9ID0gJ0NBQic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQnfSA9ICdadWxldHp0IGdlw6RuZGVydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IGNoYW5nZWQgYnknfSA9ICdadWxldHp0IGdlw6RuZGVydCB2b24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuJ30gPQogICAgICAgICdVbSBkaWUgTGlua3MgaW0gZm9sZ2VuZGVuIEJlaXRyYWcgenUgw7ZmZm5lbiwga2FubiBlcyBub3R3ZW5kaWcgc2VpbiBTdHJnIG9kZXIgU2hpZnQgenUgZHLDvGNrZW4sIHfDpGhyZW5kIGF1ZiBkZW4gTGluayBnZWtsaWNrdCB3aXJkIChhYmjDpG5naWcgdm9tIHZlcndlbmRldGVuIEJyb3dzZXIgdW5kIEJldHJpZWJzc3lzdGVtKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgQXR0YWNobWVudCd9ID0gJ0FuaGFuZyBoZXJ1bnRlcmxhZGVuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ0FCIFRlbXBsYXRlJ30gPSAnQ0FCLVRlbXBsYXRlIGJlYXJiZWl0ZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVRlbXBsYXRlRWRpdENvbnRlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgd2lsbCBjcmVhdGUgYSBuZXcgY2hhbmdlIGZyb20gdGhpcyB0ZW1wbGF0ZSwgc28geW91IGNhbiBlZGl0IGFuZCBzYXZlIGl0Lid9ID0KICAgICAgICAnRGllc2VzIHdpcmQgZWluZW4gbmV1ZW4gQ2hhbmdlIGF1cyBkaWVzZW0gVGVtcGxhdGUgZXJzdGVsbGVuLCBTaWUga8O2bm5lbiBkaWVzZW4gZWRpdGllcmVuIHVuZCBzcGVpY2hlcm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBuZXcgY2hhbmdlIHdpbGwgYmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIGl0IGhhcyBiZWVuIHNhdmVkIGFzIHRlbXBsYXRlLid9ID0KICAgICAgICAnRGVyIG5ldWUgQ2hhbmdlIHdpcmQgYXV0b21hdGlzY2ggZ2Vsw7ZzY2h0LCBuYWNoZGVtIGRpZXNlciBhbHMgVGVtcGxhdGUgZ2VzcGVpY2hlcnQgd3VyZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd29ya29yZGVyIGZyb20gdGhpcyB0ZW1wbGF0ZSwgc28geW91IGNhbiBlZGl0IGFuZCBzYXZlIGl0Lid9ID0KICAgICAgICAnRGllc2VzIHdpcmQgZWluZW4gbmV1ZW4gQXJiZWl0c2F1ZnRyYWcgYXVzIGRpZXNlciBWb3JsYWdlIGVyc3RlbGxlbiwgU2llIGvDtm5uZW4gZGllc2UgZWRpdGllcmVuIHVuZCBzcGVpY2hlcm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgdGVtcG9yYXJ5IGNoYW5nZSB3aWxsIGJlIGNyZWF0ZWQgd2hpY2ggY29udGFpbnMgdGhlIHdvcmtvcmRlci4nfSA9CiAgICAgICAgJ0VpbmUgdGVtcG9yw6RyZSDDhG5kZXJ1bmcgd2lyZCBlcnN0ZWxsdCwgZGVyIGRlbiBBcmJlaXRzYXVmdHJhZyBlbnRow6RsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIHRlbXBvcmFyeSBjaGFuZ2UgYW5kIG5ldyB3b3Jrb3JkZXIgd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIHdvcmtvcmRlciBoYXMgYmVlbiBzYXZlZCBhcyB0ZW1wbGF0ZS4nfSA9CiAgICAgICAgJ0RpZSB0ZW1wb3LDpHJlIMOEbmRlcnVuZyB1bmQgZGVyIG5ldWUgQXJiZWl0c2F1ZnRyYWcgd2lyZCBhdXRvbWF0aXNjaCBnZWzDtnNjaHQsIG5hY2hkZW0gZGVyIEFyYmVpdHNhdWZ0cmFnIGFscyBWb3JsYWdlIGdlc3BlaWNoZXJ0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3Ugd2FudCB0byBwcm9jZWVkPyd9ID0gJ03DtmNodGVuIFNpZSBmb3J0ZmFocmVuPyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENvbnRlbnQnfSA9ICdJbmhhbHQgYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYnknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGJ5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBUaW1lJ30gPSAnWmVpdCDDpG5kZXJuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Xb3JrT3JkZXJBZGQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBXb3Jrb3JkZXIgdG8gJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnN0cnVjdGlvbid9ID0gJ0Fud2Vpc3VuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIHdvcmtvcmRlciB0eXBlLid9ID0gJ1VuZ8O8bHRpZ2VyIEFyYmVpdHNhdWZ0cmFnc3R5cCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgcGxhbm5lZCBzdGFydCB0aW1lIG11c3QgYmUgYmVmb3JlIHRoZSBwbGFubmVkIGVuZCB0aW1lISd9ID0gJ0RlciBnZXBsYW50ZSBTdGFydCBtdXNzIHZvciBkZW0gZ2VwbGFudGVuIEVuZGUgbGllZ2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGZvcm1hdC4nfSA9ICdVbmfDvGx0aWdlcyBGb3JtYXQuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbGVjdCBXb3Jrb3JkZXIgVGVtcGxhdGUnfSA9ICdBcmJlaXRzYXVmdHJhZ3N2b3JsYWdlIGF1c3fDpGhsZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVdvcmtPcmRlckFnZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IFdvcmtvcmRlciBBZ2VudCBvZiAlcyVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyB3b3Jrb3JkZXI/J30gPSAnTcO2Y2h0ZW4gU2llIGRpZXNlbiBBcmJlaXRzYXVmdHJhZyB3aXJrbGljaCBsw7ZzY2hlbj8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGNhbiBub3QgZGVsZXRlIHRoaXMgV29ya29yZGVyLiBJdCBpcyB1c2VkIGluIGF0IGxlYXN0IG9uZSBDb25kaXRpb24hJ30gPQogICAgICAgICdTaWUga8O2bm5lbiBkaWVzZW4gQXJiZWl0c2F1ZnRyYWcgbmljaHQgbMO2c2NoZW4uIFNpZSB3aXJkIGluIG1pbmRlc3RlbnMgZWluZXIgQmVkaW5ndW5nIHZlcndlbmRldCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBXb3Jrb3JkZXIgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIENvbmRpdGlvbihzKSd9ID0gJ0RpZXNlciBBcmJlaXRzYXVmdHJhZyBmaW5kZXQgVmVyd2VuZHVuZyBpbiBkZW4gZm9sZ2VuZGVuIEJlZGluZ3VuZyhlbiknOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVdvcmtPcmRlckVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgJXMlcy0lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGZvbGxvd2luZyB3b3Jrb3JkZXJzIGFjY29yZGluZ2x5J30gPSAnTmFjaGZvbGdlbmRlIEFyYmVpdHNhdWZ0csOkZ2UgZW50c3ByZWNoZW5kIHZlcnNjaGllYmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIHRoZSBwbGFubmVkIGVuZCB0aW1lIG9mIHRoaXMgd29ya29yZGVyIGlzIGNoYW5nZWQsIHRoZSBwbGFubmVkIHN0YXJ0IHRpbWVzIG9mIGFsbCBmb2xsb3dpbmcgd29ya29yZGVycyB3aWxsIGJlIGNoYW5nZWQgYWNjb3JkaW5nbHknfSA9CiAgICAgICAgJ1dlbm4gZGllIGdlcHBsYW50ZSBFbmR6ZWl0IGVpbmVzIEFyYmVpdHNhdWZ0cmFncyBnZcOkbmRlcnQgd2lyZCwgZGFubiB3ZXJkZW4gZGllIG5hY2hmb2xnZW5kZW4gQXJiZWl0c2F1ZnRyw6RnZSBlbnRzcHJlY2hlbmQgdmVyc2Nob2Jlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBvZiAlcyVzLSVzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgUmVwb3J0IG9mICVzJXMtJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwb3J0J30gPSAnQmVyaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgYWN0dWFsIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIGFjdHVhbCBlbmQgdGltZSEnfSA9ICdEaWUgdGF0c8OkY2hsaWNoZSBTdGFydHplaXQgbXVzcyB2b3IgZGVyIHRhdHPDpGNobGljaGVuIEVuZHplaXQgbGllZ2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgYWN0dWFsIHN0YXJ0IHRpbWUgbXVzdCBiZSBzZXQsIHdoZW4gdGhlIGFjdHVhbCBlbmQgdGltZSBpcyBzZXQhJ30gPQogICAgICAgICdEaWUgdGF0c8OkY2hsaWNoZSBTdGFydHplaXQgbXVzcyBhbmdlZ2ViZW4gd3JlZGVuLCB3ZW5uIGVpbmUgdGF0c8OkY2hsaWNoZSBFbmR6ZWl0IGFuZ2VnZWJlbiB3dXJkZSEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVdvcmtPcmRlclRha2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgQWdlbnQnfSA9ICdBa3R1ZWxsZXIgQWdlbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8geW91IHJlYWxseSB3YW50IHRvIHRha2UgdGhpcyB3b3Jrb3JkZXI/J30gPSAnV29sbGVuIHNpZSBkaWVzZW4gQXJiZWl0c2F1ZnRyYWcgd2lya2xpY2ggw7xiZXJuZWhtZW4/JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2F2ZSBXb3Jrb3JkZXIgYXMgVGVtcGxhdGUnfSA9ICdBcmJlaXRzYXVmdHJhZyBhbHMgVm9ybGFnZSBzcGVpY2hlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIG9yaWdpbmFsIHdvcmtvcmRlciAoYW5kIHN1cnJvdW5kaW5nIGNoYW5nZSknfSA9ICdPcmlnaW5hbC1BcmJlaXRzYXVmdHJhZyAodW5kIGRlciB1bWdlYmVuZGVuIMOEbmRlcnVuZykgbMO2c2NoZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVdvcmtPcmRlclpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlciBJbmZvcm1hdGlvbid9ID0gJ0FyYmVpdHNhdWZ0cmFnc2luZm9ybWF0aW9uZW4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIEFkZGVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmtub3duIG5vdGlmaWNhdGlvbiAlcyEnfSA9ICdVbmJla2FubnRlIEJlbmFjaHJpY2h0aWd1bmcgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgbm90aWZpY2F0aW9uLid9ID0gJ0JlaW0gRXJzdGVsbGVuIGRlciBCZW5hY2hyaWNodGlndW5nIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JVFNNU3RhdGVNYWNoaW5lLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGF0ZSBUcmFuc2l0aW9uIFVwZGF0ZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXRlIFRyYW5zaXRpb24gQWRkZWQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBJVFNNIENoYW5nZXMnfSA9ICdDaGFuZ2VzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VBZGQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCB3aXRoIFRpY2tldElEICVzIGRvZXMgbm90IGV4aXN0ISd9ID0gJ1RpY2tldCBtaXQgVGlja2V0LUtlbm51bmcgJXMgaXN0IG5pY2h0IHZvcmhhbmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWlzc2luZyBzeXNjb25maWcgb3B0aW9uICJJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMiISd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBhZGQgY2hhbmdlISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gY3JlYXRlIGNoYW5nZSBmcm9tIHRlbXBsYXRlISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENoYW5nZUlEIGlzIGdpdmVuISd9ID0gJ0tlaW5lIMOEbmRlcnVuZ3NrZW5udW5nIMO8YmVybWl0dGVsdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2hhbmdlIGZvdW5kIGZvciBjaGFuZ2VJRCAlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIENBQiBvZiBjaGFuZ2UgIiVzIiBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGFkZCB0aGUgdGVtcGxhdGUuJ30gPSAnVm9ybGFnZSBrb25udGUgbmljaHQgaGluenVnZWbDvGd0IHdlcmRlbi4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJ8OEbmRlcnVuZyAiJXMiIGluIGRlciBEYXRlbmJhbmsgbmljaHQgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBkZWxldGUgQ29uZGl0aW9uSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyBpcyBnaXZlbiEnfSA9ICdLZWluKGUpICVzIMO8YmVybWl0dGVsdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGNyZWF0ZSBuZXcgY29uZGl0aW9uISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgdXBkYXRlIENvbmRpdGlvbklEICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgdXBkYXRlIEV4cHJlc3Npb25JRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGFkZCBuZXcgRXhwcmVzc2lvbiEnfSA9ICdOZXVlciBBdXNkcnVjayBrb25udGUgbmljaHQgaGluenVnZWbDvGd0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHVwZGF0ZSBBY3Rpb25JRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGFkZCBuZXcgQWN0aW9uISd9ID0gJ05ldWUgQWt0aW9uIGtvbm50ZSBuaWNodCBoaW56dWdlZsO8Z3Qgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgZGVsZXRlIEV4cHJlc3Npb25JRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRlbGV0ZSBBY3Rpb25JRCAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3I6IFVua25vd24gZmllbGQgdHlwZSAiJXMiISd9ID0gJ0ZlaGxlcjogVW5iZWthbm50ZXIgRmVsZHR5cCAiJXMiISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25kaXRpb25JRCAlcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGdpdmVuIENoYW5nZUlEICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlRGVsZXRlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgIiVzIiBkb2VzIG5vdCBoYXZlIGFuIGFsbG93ZWQgY2hhbmdlIHN0YXRlIHRvIGJlIGRlbGV0ZWQhJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY2hhbmdlSUQgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUhpc3RvcnkucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBzaG93IGhpc3RvcnksIGFzIG5vIENoYW5nZUlEIGlzIGdpdmVuISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgIiVzIiBub3QgZm91bmQgaW4gdGhlIGRhdGFiYXNlISd9ID0gJ8OEbmRlcnVuZyAiJXMiIGluIGRlciBEYXRlbmJhbmsgbmljaHQgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24gdHlwZSAiJXMiIGVuY291bnRlcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSGlzdG9yeSd9ID0gJ8OEbmRlcnVuZ3NjaHJvbmlrJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VIaXN0b3J5Wm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSB6b29tLCBubyBIaXN0b3J5RW50cnlJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeUVudHJ5ICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSBDQUIgZm9yIENoYW5nZSAlcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIHVwZGF0ZSBDaGFuZ2UgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VNYW5hZ2VyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogQ2hhbmdlTWFuYWdlcid9ID0gJ8OcYmVyc2ljaHQ6IMOEbmRlcnVuZ3NWZXJ3YWx0ZXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15Q0FCLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldzogTXkgQ0FCJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBNeSBDaGFuZ2VzJ30gPSAnw5xiZXJzaWNodDogTWVpbmUgw4RuZGVydW5nZW4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IE15IFdvcmtvcmRlcnMnfSA9ICfDnGJlcnNpY2h0OiBNZWluZSBBcmJlaXRzYXVmdHLDpGdlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VQSVIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBQSVInfSA9ICfDnGJlcnNpY2h0OiBQSVInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVBTQS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IFBTQSd9ID0gJ092ZXJ2aWV3OiBQU0EnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVByaW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnQXJiZWl0c2F1ZnRyYWcgIiVzIiBpbiBEYXRlbmJhbmsgbmljaHQgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBjcmVhdGUgb3V0cHV0LCBhcyB0aGUgd29ya29yZGVyIGlzIG5vdCBhdHRhY2hlZCB0byBhIGNoYW5nZSEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgY3JlYXRlIG91dHB1dCwgYXMgbm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3Vua25vd24gY2hhbmdlIHRpdGxlJ30gPSAndW5iZWthbm50ZXIgw4RuZGVydW5nc3RpdGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gV29ya29yZGVyJ30gPSAnSVRTTSBBcmJlaXRzYXVmdHJhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJOdW1iZXInfSA9ICdBcmJlaXRzYXVmdHJhZ251bW1lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJUaXRsZSd9ID0gJ0FyYmVpdHNhdWZ0cmFndGl0ZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW5rbm93biB3b3Jrb3JkZXIgdGl0bGUnfSA9ICd1bmJla2FubnRlciBBcmJlaXRzYXVmdHJhZ3N0aXRlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2VTdGF0ZSd9ID0gJ0NoYW5nZS1TdGF0dXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZEVmZm9ydCd9ID0gJ0dlcGxhbnRlciBBdWZ3YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NBQiBBZ2VudHMnfSA9ICdDQUItQWdlbnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDQUIgQ3VzdG9tZXJzJ30gPSAnQ0FCLUt1bmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1ZXN0ZWRUaW1lJ30gPSAnV3Vuc2NodGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsYW5uZWRTdGFydFRpbWUnfSA9ICdHZXBsYW50ZXIgU3RhcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZEVuZFRpbWUnfSA9ICdHZXBsYW50ZXMgRW5kZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBY3R1YWxTdGFydFRpbWUnfSA9ICdUYXRzw6RjaGxpY2hlciBTdGFydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBY3R1YWxFbmRUaW1lJ30gPSAnVGF0c8OkY2hsaWNoZXMgRW5kZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2VUaW1lJ30gPSAnR2XDpG5kZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZU51bWJlcid9ID0gJ0NoYW5nZSBOdW1tZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya09yZGVyU3RhdGUnfSA9ICdBcmJlaXRzYXVmdHJhZ3N0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJUeXBlJ30gPSAnQXJiZWl0c2F1ZnRyYWd0eXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya09yZGVyQWdlbnQnfSA9ICdBcmJlaXRzYXVmdHJhZ2FnZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gV29ya29yZGVyIE92ZXJ2aWV3ICglcyknfSA9ICdJVFNNLUFyYmVpdHNhdWZ0cmFnw7xiZXJzaWNodCAoJXMpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VSZXNldC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIHJlc2V0IFdvcmtPcmRlciAlcyBvZiBDaGFuZ2UgJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byByZXNldCBDaGFuZ2UgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01DaGFuZ2VTY2hlZHVsZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXc6IENoYW5nZSBTY2hlZHVsZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgU2VhcmNoJ30gPSAnU3VjaGUgw6RuZGVybic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2VUaXRsZSd9ID0gJ0NoYW5nZS1UaXRlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJzJ30gPSAnQXJiZWl0c2F1ZnRyYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFNlYXJjaCBSZXN1bHQnfSA9ICdTdWNoZXJnZWJuaXMgw6RuZGVybic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgTnVtYmVyJ30gPSAnTnVtbWVyIMOkbmRlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29yayBPcmRlciBUaXRsZSd9ID0gJ0FyYmVpdHNhdWZ0cmFndGl0ZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlc2NyaXB0aW9uJ30gPSAnw4RuZGVydW5nc2Jlc2NocmVpYnVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSnVzdGlmaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXIgSW5zdHJ1Y3Rpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya09yZGVyIFJlcG9ydCd9ID0gJ0FyYmVpdHNhdWZ0cmFnc2JlcmljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFByaW9yaXR5J30gPSAnw4RuZGVydW5nc3ByaW9yaXTDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIEltcGFjdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGVkIEJ5J30gPSAnRXJzdGVsbHQgdm9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlciBTdGF0ZSd9ID0gJ0FyYmVpdHNhdWZ0cmFnc3N0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXIgVHlwZSd9ID0gJ0FyYmVpdHNhdWZ0cmFndHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlciBBZ2VudCd9ID0gJ0FyYmVpdHNhdWZ0cmFnc2FnZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSd9ID0gJ3Zvcic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBjaGFuZ2UgIiVzIiBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHVwZGF0ZSB0aGUgdGVtcGxhdGUgIiVzIi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRlbGV0ZSBjaGFuZ2UgIiVzIi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVRpbWVTbG90LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgY2hhbmdlIGNhblwndCBiZSBtb3ZlZCwgYXMgaXQgaGFzIG5vIHdvcmtvcmRlcnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIHdvcmtvcmRlciBmaXJzdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IG1vdmUgYSBjaGFuZ2Ugd2hpY2ggYWxyZWFkeSBoYXMgc3RhcnRlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1vdmUgdGhlIGluZGl2aWR1YWwgd29ya29yZGVycyBpbnN0ZWFkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgY3VycmVudCAlcyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlICVzIG9mIGFsbCB3b3Jrb3JkZXJzIGhhcyB0byBiZSBkZWZpbmVkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gbW92ZSB0aW1lIHNsb3QgZm9yIHdvcmtvcmRlciAjJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01UZW1wbGF0ZURlbGV0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IG5lZWQgJXMgcGVybWlzc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gVGVtcGxhdGVJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIHRlbXBsYXRlICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNVGVtcGxhdGVFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gdXBkYXRlIFRlbXBsYXRlICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q0FCLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gdXBkYXRlIFRlbXBsYXRlICIlcyIhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01UZW1wbGF0ZUVkaXRDb250ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gY3JlYXRlIGNoYW5nZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIGNyZWF0ZSB3b3Jrb3JkZXIgZnJvbSB0ZW1wbGF0ZSEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3OiBUZW1wbGF0ZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNV29ya09yZGVyQWRkLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyBvbiB0aGUgY2hhbmdlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gYWRkIHdvcmtvcmRlciEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFnZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBXb3JrT3JkZXJJRCBpcyBnaXZlbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2FzIG5vdCBhYmxlIHRvIHNldCB0aGUgd29ya29yZGVyIGFnZW50IG9mIHRoZSB3b3Jrb3JkZXIgIiVzIiB0byBlbXB0eSEnfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXMgbm90IGFibGUgdG8gdXBkYXRlIHRoZSB3b3Jrb3JkZXIgIiVzIiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Xb3JrT3JkZXJEZWxldGUucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byBkZWxldGUgdGhlIHdvcmtvcmRlciAlcyEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byB1cGRhdGUgV29ya09yZGVyICVzISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IHNob3cgaGlzdG9yeSwgYXMgbm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlciAiJXMiIG5vdCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlciBIaXN0b3J5J30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5Wm9vbS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGlzdG9yeSBlbnRyeSAiJXMiIG5vdCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlciBIaXN0b3J5IFpvb20nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclRha2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcyBub3QgYWJsZSB0byB0YWtlIHRoZSB3b3Jrb3JkZXIgJXMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIHdvcmtvcmRlciAiJXMiIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0xheW91dC9JVFNNQ2hhbmdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIGNvbmZpZyBvcHRpb24gJXMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpZyBvcHRpb24gJXMgbmVlZHMgdG8gYmUgYSBIQVNIIHJlZiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY29uZmlnIG9wdGlvbiBmb3VuZCBmb3IgdGhlIHZpZXcgIiVzIiEnfSA9ICdLZWluZSBLb25maWd1cmF0aW9uc29wdGlvbiBmw7xyIGRpZSBBbnNpY2h0ICIlcyIgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpdGxlOiAlcyB8IFR5cGU6ICVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvVG9vbEJhci9NeUNBQi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTXkgQ0FCcyd9ID0gJ01laW5lIENBQnMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL015Q2hhbmdlcy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTXkgQ2hhbmdlcyd9ID0gJ01laW5lIENoYW5nZXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL015V29ya09yZGVycy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTXkgV29yayBPcmRlcnMnfSA9ICdNZWluZSBBcmJlaXRzYXVmdHLDpGdlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0lUU01DaGFuZ2UvSGlzdG9yeS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXM6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBY3Rpb24gKElEPSVzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBY3Rpb24gKElEPSVzKSBkZWxldGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBBY3Rpb25zIG9mIENvbmRpdGlvbiAoSUQ9JXMpIGRlbGV0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWN0aW9uIChJRD0lcykgZXhlY3V0ZWQ6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIChBY3Rpb24gSUQ9JXMpOiAobmV3PSVzLCBvbGQ9JXMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSAoSUQ9JXMpIHJlYWNoZWQgYWN0dWFsIGVuZCB0aW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBzdGFydCB0aW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQ2hhbmdlIChJRD0lcyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEF0dGFjaG1lbnQ6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZWQgQXR0YWNobWVudCAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDQUIgRGVsZXRlZCAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclczogKG5ldz0lcywgb2xkPSVzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRvICVzIChJRD0lcykgYWRkZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0byAlcyAoSUQ9JXMpIGRlbGV0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIHNlbnQgdG8gJXMgKEV2ZW50OiAlcyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIGVuZCB0aW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgc3RhcnQgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCByZXF1ZXN0ZWQgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IENvbmRpdGlvbiAoSUQ9JXMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmRpdGlvbiAoSUQ9JXMpIGRlbGV0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIENvbmRpdGlvbnMgb2YgQ2hhbmdlIChJRD0lcykgZGVsZXRlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyAoQ29uZGl0aW9uIElEPSVzKTogKG5ldz0lcywgb2xkPSVzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgRXhwcmVzc2lvbiAoSUQ9JXMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cHJlc3Npb24gKElEPSVzKSBkZWxldGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBFeHByZXNzaW9ucyBvZiBDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIChFeHByZXNzaW9uIElEPSVzKTogKG5ldz0lcywgb2xkPSVzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBlbmQgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgc3RhcnQgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IFdvcmtvcmRlciAoSUQ9JXMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyhJRD0lcykgTmV3IEF0dGFjaG1lbnQgZm9yIFdvcmtPcmRlcjogJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlZCBBdHRhY2htZW50IGZyb20gV29ya09yZGVyOiAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycoSUQ9JXMpIERlbGV0ZWQgQXR0YWNobWVudCBmcm9tIFdvcmtPcmRlcjogJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IFJlcG9ydCBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyhJRD0lcykgTmV3IFJlcG9ydCBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZWQgUmVwb3J0IEF0dGFjaG1lbnQgZnJvbSBXb3JrT3JkZXI6ICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyhJRD0lcykgRGVsZXRlZCBSZXBvcnQgQXR0YWNobWVudCBmcm9tIFdvcmtPcmRlcjogJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIChJRD0lcykgZGVsZXRlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycoSUQ9JXMpIExpbmsgdG8gJXMgKElEPSVzKSBhZGRlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycoSUQ9JXMpIExpbmsgdG8gJXMgKElEPSVzKSBkZWxldGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyhJRD0lcykgTm90aWZpY2F0aW9uIHNlbnQgdG8gJXMgKEV2ZW50OiAlcyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIGVuZCB0aW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgc3RhcnQgdGltZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKElEPSVzKSAlczogKG5ldz0lcywgb2xkPSVzKSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JVFNNQ2hhbmdlL0lUU01Db25kaXRpb24vT2JqZWN0L0lUU01Xb3JrT3JkZXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FsbCd9ID0gJ2FsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYW55J30gPSAnYmVsaWViaWdlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0lUU01DaGFuZ2UvTm90aWZpY2F0aW9uLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmV2aW91cyBDaGFuZ2UgQnVpbGRlcid9ID0gJ1ZvcmhlcmlnZXIgQ2hhbmdlLUJ1aWxkZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJldmlvdXMgQ2hhbmdlIE1hbmFnZXInfSA9ICdWb3JoZXJpZ2VyIENoYW5nZS1NYW5hZ2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlciBBZ2VudHMnfSA9ICdBcmJlaXRzYXVmdHJhZ3NhZ2VudGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZXZpb3VzIFdvcmtvcmRlciBBZ2VudCd9ID0gJ1ZvcmhlcmlnZXIgQXJiZWl0c2F1ZnRyYWdzYWdlbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIEluaXRpYXRvcnMnfSA9ICdDaGFuZ2UtSW5pdGlhdG9yZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR3JvdXAgSVRTTUNoYW5nZSd9ID0gJ0dydXBwZSBJVFNNQ2hhbmdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyb3VwIElUU01DaGFuZ2VCdWlsZGVyJ30gPSAnR3J1cHBlIElUU01DaGFuZ2VCdWlsZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dyb3VwIElUU01DaGFuZ2VNYW5hZ2VyJ30gPSAnR3J1cHBlIElUU01DaGFuZ2VNYW5hZ2VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtvcmRlciBHcm91cCd9ID0gJ0FyYmVpdHNhdWZ0cmFnc2dydXBwZSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNoYW5nZU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncmVxdWVzdGVkJ30gPSAnUmVxdWVzdGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3BlbmRpbmcgYXBwcm92YWwnfSA9ICdQZW5kaW5nIEFwcHJvdmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3JlamVjdGVkJ30gPSAnUmVqZWN0ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYXBwcm92ZWQnfSA9ICdBcHByb3ZlZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbiBwcm9ncmVzcyd9ID0gJ0luIFByb2dyZXNzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3BlbmRpbmcgcGlyJ30gPSAnUGVuZGluZyBQSVInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnc3VjY2Vzc2Z1bCd9ID0gJ1N1Y2Nlc3NmdWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZmFpbGVkJ30gPSAnRmFpbGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NhbmNlbGVkJ30gPSAnQ2FuY2VsZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncmV0cmFjdGVkJ30gPSAnUmV0cmFjdGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2NyZWF0ZWQnfSA9ICdDcmVhdGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FjY2VwdGVkJ30gPSAnQWNjZXB0ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncmVhZHknfSA9ICdSZWFkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhcHByb3ZhbCd9ID0gJ0dlbmVobWlndW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3dvcmtvcmRlcid9ID0gJ0FyYmVpdHNhdWZ0cmFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JhY2tvdXQnfSA9ICdCYWNrb3V0IFBsYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZGVjaXNpb24nfSA9ICdFbnRzY2hlaWR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsncGlyJ30gPSAnUElSIChQb3N0IEltcGxlbWVudGF0aW9uIFJldmlldyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlU3RhdGVJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRlZ29yeUlEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdElEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByaW9yaXR5SUQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlTWFuYWdlcklEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZUJ1aWxkZXJJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJTdGF0ZUlEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvcmtPcmRlclR5cGVJRCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3JrT3JkZXJBZ2VudElEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzJ30gPSAnaXN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIG5vdCd9ID0gJ2lzdCBuaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyBlbXB0eSd9ID0gJ2lzdCBsZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIG5vdCBlbXB0eSd9ID0gJ2lzdCBuaWNodCBsZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIGdyZWF0ZXIgdGhhbid9ID0gJ2lzdCBncsO2c3NlciBhbHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgbGVzcyB0aGFuJ30gPSAnaXN0IGtsZWluZXIgYWxzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIGJlZm9yZSd9ID0gJ2lzdCB2b3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgYWZ0ZXInfSA9ICdpc3QgbmFjaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjb250YWlucyd9ID0gJ2VudGjDpGx0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J25vdCBjb250YWlucyd9ID0gJ2VudGjDpGx0IG5pY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZ2lucyB3aXRoJ30gPSAnYmVnaW5udCBtaXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZW5kcyB3aXRoJ30gPSAnZW5kZXQgbWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3NldCd9ID0gJ3NldHplJzsKCiAgICAjIEpTIEZpbGU6IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Db25kaXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBleHByZXNzaW9uPyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgYWN0aW9uPyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZGl0aW9uPyd9ID0gJyc7CgogICAgIyBKUyBGaWxlOiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZmlybURpYWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgbGlzdCBvZiB0aGUgYWdlbnRzIHdobyBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB3b3Jrb3JkZXJzLiBLZXkgaXMgYSBsb2dpbiBuYW1lLiBDb250ZW50IGlzIDAgb3IgMS4nfSA9CiAgICAgICAgJ0VpbmUgTGlzdGUgZGVyIEFnZW50ZW4sIGRpZSBadWdyaWZmIGF1ZiBBcmJlaXRzYXVmdHLDpGdlIGhhYmVuLiBTY2hsw7xzc2VsIGlzdCBkZXIgQW5tZWxkZW5hbWUuIEluaGFsdCBpc3QgMCBvZGVyIDEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBsaXN0IG9mIHdvcmtvcmRlciBzdGF0ZXMsIGF0IHdoaWNoIHRoZSBBY3R1YWxTdGFydFRpbWUgb2YgYSB3b3Jrb3JkZXIgd2lsbCBiZSBzZXQgaWYgaXQgd2FzIGVtcHR5IGF0IHRoaXMgcG9pbnQuJ30gPQogICAgICAgICdFaW5lIExpc3RlIHZvbiBBcmJlaXRzYXVmdHJhZ3NzdGF0ZW4sIGJlaSBkZW5lbiBkaWUgQWN0dWFsU3RhcnRUaW1lIGVpbmVzIEFyYmVpdHNhdWZ0cmFncyBmZXN0Z2VsZWd0IHdpcmQsIHdlbm4gZGllc2Ugdm9yaGVyIG5pY2h0IGZlc3RnZWxlZ3Qgd2FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBY3R1YWwgZW5kIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWN0dWFsIHN0YXJ0IHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFdvcmtvcmRlcid9ID0gJ0FyYmVpdHNhdWZ0cmFnIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBXb3Jrb3JkZXIgKGZyb20gVGVtcGxhdGUpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGNoYW5nZSBmcm9tIHRlbXBsYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBjaGFuZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIHdvcmtvcmRlciAoZnJvbSB0ZW1wbGF0ZSkgdG8gdGhlIGNoYW5nZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgd29ya29yZGVyIHRvIHRoZSBjaGFuZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBmcm9tIHRlbXBsYXRlJ30gPSAnVm9uIFRlbXBsYXRlIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluIG9mIHRoZSBDSVAgbWF0cml4Lid9ID0gJ0FkbWluIGRlciBDSVAtTWF0cml4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbiBvZiB0aGUgc3RhdGUgbWFjaGluZS4nfSA9ICdBZG1pbiBkZXIgU3RhdGUgTWFjaGluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCBpbnRlcmZhY2Ugbm90aWZpY2F0aW9uIG1vZHVsZSB0byBzZWUgdGhlIG51bWJlciBvZiBjaGFuZ2UgYWR2aXNvcnkgYm9hcmRzLid9ID0KICAgICAgICAnQWdlbnRlbi1BbnNpY2h0IEJlbmFjaHJpY2h0aWd1bmctTW9kdWwgdW0gZGllIFphaGwgZGVyIENoYW5nZS1BZHZpc29yeS1Cb2FyZHMgYW56dXplaWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgaW50ZXJmYWNlIG5vdGlmaWNhdGlvbiBtb2R1bGUgdG8gc2VlIHRoZSBudW1iZXIgb2YgY2hhbmdlcyBtYW5hZ2VkIGJ5IHRoZSB1c2VyLid9ID0KICAgICAgICAnQWdlbnRlbi1BbnNpY2h0IEJlbmFjaHJpY2h0aWd1bmctTW9kdWwgdW0gZGllIFphaGwgZGVyIENoYW5nZXMgYW56dXplaWdlbiBkaWUgdm9tIEJlbnV0emVyIHZlcndhbHRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IGludGVyZmFjZSBub3RpZmljYXRpb24gbW9kdWxlIHRvIHNlZSB0aGUgbnVtYmVyIG9mIGNoYW5nZXMuJ30gPQogICAgICAgICdBZ2VudGVuLUFuc2ljaHQgQmVuYWNocmljaHRpZ3VuZy1Nb2R1bCB1bSBkaWUgWmFobCBkZXIgQ2hhbmdlcyBhbnp1emVpZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCBpbnRlcmZhY2Ugbm90aWZpY2F0aW9uIG1vZHVsZSB0byBzZWUgdGhlIG51bWJlciBvZiB3b3Jrb3JkZXJzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NBQiBNZW1iZXIgU2VhcmNoJ30gPSAnQ0FCLU1pdGdsaWVkZXJzdWNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWNoZSB0aW1lIGluIG1pbnV0ZXMgZm9yIHRoZSBjaGFuZ2UgbWFuYWdlbWVudCB0b29sYmFycy4gRGVmYXVsdDogMyBob3VycyAoMTgwIG1pbnV0ZXMpLid9ID0KICAgICAgICAnQ2FjaGUtWmVpdCBpbiBNaW51dGVuIGbDvHIgZGllIENoYW5nZSBNYW5hZ2VtZW50IFdlcmt6ZXVnbGVpc3RlLiBTdGFuZGFyZDogMyBTdHVuZGVuICgxODAgTWludXRlbiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FjaGUgdGltZSBpbiBtaW51dGVzIGZvciB0aGUgY2hhbmdlIG1hbmFnZW1lbnQuIERlZmF1bHQ6IDUgZGF5cyAoNzIwMCBtaW51dGVzKS4nfSA9CiAgICAgICAgJ0NhY2hlLVplaXQgaW4gTWludXRlbiBmw7xyIGRpZSBDaGFuZ2UgTWFuYWdlbWVudC4gU3RhbmRhcmQ6IDUgVGFnZSAoNzIwMCBNaW51dGVuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIENBQiBUZW1wbGF0ZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIEhpc3RvcnkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJbnZvbHZlZCBQZXJzb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgT3ZlcnZpZXcgIlNtYWxsIiBMaW1pdCd9ID0gJ0NoYW5nZSDDnGJlcnNpY2h0IEFuemVpZ2UgTGltaXQgZsO8ciAiU21hbGwiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFByaW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgU2NoZWR1bGUnfSA9ICdDaGFuZ2UgU2NoZWR1bGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFNjaGVkdWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgU2V0dGluZ3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFpvb20nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIFpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBhbmQgV29ya29yZGVyIFRlbXBsYXRlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgYW5kIHdvcmtvcmRlciB0ZW1wbGF0ZXMgZWRpdGVkIGJ5IHRoaXMgdXNlci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIGFyZWEuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBpbnZvbHZlZCBwZXJzb25zIG9mIHRoZSBjaGFuZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBsaW1pdCBwZXIgcGFnZSBmb3IgQ2hhbmdlIE92ZXJ2aWV3ICJTbWFsbCIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHNlYXJjaCBiYWNrZW5kIHJvdXRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1N1Y2gtQmFja2VuZC1Sb3V0ZXIgZsO8ciBkaWUgQ2hhbmdlLVN1Y2hlIGluIGRlciBBZ2VudGVuLUFuc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBzdGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGl0bGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZGl0aW9uIEVkaXQnfSA9ICdCZWRpbmd1bmcgYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25kaXRpb24gT3ZlcnZpZXcnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJlIHdoaWNoIHNjcmVlbiBzaG91bGQgYmUgc2hvd24gYWZ0ZXIgYSBuZXcgd29ya29yZGVyIGhhcyBiZWVuIGNyZWF0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlndXJlcyBob3cgb2Z0ZW4gdGhlIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgd2hlbiBwbGFubmVkIHRoZSBzdGFydCB0aW1lIG9yIG90aGVyIHRpbWUgdmFsdWVzIGhhdmUgYmVlbiByZWFjaGVkL3Bhc3NlZC4nfSA9CiAgICAgICAgJ0tvbmZpZ3VyYXRpb24gd2llIGjDpHVmaWcgQmVuYWNocmljaHR1bmdlbiB2ZXJzY2hpY2t0IHdlcmRlbiB3ZW5uIGRpZSBnZXBsYW50ZSBTdGFydHplaXQgb2RlciBhbmRlcmUgWmVpdGVuIGVycmVpY2h0IHd1cmRlbiBiencuIHNjaG9uIHZvcmJlaSBzaW5kLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgQ2hhbmdlJ30gPSAnQ2hhbmdlIGVyc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgQ2hhbmdlIChmcm9tIFRlbXBsYXRlKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBjaGFuZ2UgKGZyb20gdGVtcGxhdGUpIGZyb20gdGhpcyB0aWNrZXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIGNoYW5nZSBmcm9tIHRoaXMgdGlja2V0Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBJVFNNIENoYW5nZSBNYW5hZ2VtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnSVRTTSBDaGFuZ2UtQmVuYWNocmljaHRpZ3VuZ2VuIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGNoYW5nZSBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZhdWx0IHR5cGUgZm9yIGEgd29ya29yZGVyLiBUaGlzIGVudHJ5IG11c3QgZXhpc3QgaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIFwnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlXCcuJ30gPQogICAgICAgICdTdGFuZGFyZHR5cCBmw7xyIGVpbmVuIEFyYmVpdHNhdWZ0cmFnLiBEaWVzZXIgRWludHJhZyBtdXNzIGluIGRlciBHZW5lcmFsIENhdGFsb2cgS2xhc3NlIFwnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlXCcgZXhpc3RpZXJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy4nfSA9CiAgICAgICAgJ0RlZmluaWVyZW4gU2llIEFjdGlvbnMsIGluIGRlbmVuIGltIFZlcmtuw7xwZnRlLU9iamVrdGUtV2lkZ2V0IGVpbiBFaW5zdGVsbHVuZ2VuLUtub3BmIHZlcmbDvGdiYXIgc2VpbiBzb2xsIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIEJpdHRlIGJlYWNodGVuIFNpZSwgZGFzcyBmw7xyIGRpZXNlIEFjdGlvbnMgZGllIGZvbGdlbmRlbiBKUy0gdW5kIENTUy1EYXRlaWVuIHJlZ2lzdHJpZXJ0IHNlaW4gbcO8c3NlbjogIENvcmUuQWxsb2NhdGlvbkxpc3QuY3NzLCBDb3JlLlVJLkFsbG9jYXRpb25MaXN0LmpzLCBDb3JlLlVJLlRhYmxlLlNvcnQuanMsIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLmpzIHVuZCBDb3JlLkFnZW50LkxpbmtPYmplY3QuanMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB0aGUgc2lnbmFscyBmb3IgZWFjaCB3b3Jrb3JkZXIgc3RhdGUuJ30gPSAnRGVmaW5pZXJlbiBlaW5lcyBTaWduYWxzIGbDvHIgZWluZW4gQXJiZWl0c2F1ZnRyYWdzc3RhdHVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBDaGFuZ2VzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBOb3RlOiBPbmx5IENoYW5nZSBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGZvciBEZWZhdWx0Q29sdW1ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBXb3Jrb3JkZXIgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIE5vdGU6IE9ubHkgV29ya29yZGVyIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQgZm9yIERlZmF1bHRDb2x1bW5zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjaGFuZ2UgbGlzdC4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkYXMgw5xiZXJzaWNodHNtb2R1bCB1bSBkaWUgU21hbGwtQW5zaWNodCBlaW5lciBDaGFuZ2UtTGlzdGUgYW56dXplaWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBvdmVydmlldyBtb2R1bGUgdG8gc2hvdyB0aGUgc21hbGwgdmlldyBvZiBhIHRlbXBsYXRlIGxpc3QuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGFzIMOcYmVyc2ljaHRzbW9kdWwgdW0gZGllIFNtYWxsLUFuc2ljaHQgZWluZXIgVGVtcGxhdGUtTGlzdGUgYW56dXplaWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHByaW50IHRoZSBhY2NvdW50ZWQgdGltZS4nfSA9ICdEZWZpbmllcnQgb2IgZGllIGVyZmFzc3RlIFplaXQgYXVzZ2VkcnVja3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBwcmludCB0aGUgcGxhbm5lZCBlZmZvcnQuJ30gPSAnRGVmaW5pZXJ0IG9iIGRlciBnZXBsYW50ZSBBdWZ3YW5kIGF1c2dlZHJ1Y2t0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHJlYWNoYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgc3RhdGUgbWFjaGluZSkgY2hhbmdlIGVuZCBzdGF0ZXMgc2hvdWxkIGJlIGFsbG93ZWQgaWYgYSBjaGFuZ2UgaXMgaW4gYSBsb2NrZWQgc3RhdGUuJ30gPQogICAgICAgICdEZWZpbmllcnQgb2IgbmFjaGZvbGdlbmRlIEVuZHp1c3TDpG5kZSBmw7xyIENoYW5nZXMgKHdpZSBpbiBkZXIgU3RhdGUgTWFjaGluZSBkZWZpbmllcnQpIGF1Y2ggZGFubiBlcmxhdWJ0IHNpbmQsIHdlbm4gc2ljaCBkZXIgQ2hhbmdlIGltIGdlc3BlcnJ0ZW4gWnVzdGFuZCBiZWZpbmRldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiByZWFjaGFibGUgKGFzIGRlZmluZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUpIHdvcmtvcmRlciBlbmQgc3RhdGVzIHNob3VsZCBiZSBhbGxvd2VkIGlmIGEgd29ya29yZGVyIGlzIGluIGEgbG9ja2VkIHN0YXRlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBvYiBuYWNoZm9sZ2VuZGUgRW5kenVzdMOkbmRlIGbDvHIgZWluZW4gQXJiZWl0c2F1ZnRyYWcgKHdpZSBpbiBkZXIgU3RhdGUgTWFjaGluZSBkZWZpbmllcnQpIGF1Y2ggZGFubiBlcmxhdWJ0IHNpbmQsIHdlbm4gc2ljaCBJaHJlIEFyYmVpdHNhdWZ0csOkZ2UgaW0gZ2VzcGVycnRlbiBadXN0YW5kIGJlZmluZGV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBhY2NvdW50ZWQgdGltZSBzaG91bGQgYmUgc2hvd24uJ30gPSAnU29sbCBkaWUgZ2VidWNodGUgWmVpdCBhbmdlemVpZ3Qgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCB0aW1lcyBzaG91bGQgYmUgc2V0Lid9ID0gJ1dlbm4gZGVyIHRhdHPDpGNobGljaGUgU3RhcnQtIHVuZCBFbmR6ZWl0cHVua3QgZ2VzZXR6dCB3ZXJkZW4gc29sbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgY2hhbmdlIHNlYXJjaCBhbmQgdGhlIHdvcmtvcmRlciBzZWFyY2ggZnVuY3Rpb25zIGNvdWxkIHVzZSB0aGUgbWlycm9yIERCLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBvYiBkaWUgw4RuZGVydW5nc3N1Y2hlIHVuZCBBcmJlaXRzYXVmdHJhZ3NzdWNoZSBkaWUgU3BpZWdlbGRhdGVuYmFuayBiZW51dHplbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBjaGFuZ2Ugc3RhdGUgY2FuIGJlIHNldCBpbiB0aGUgY2hhbmdlIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgcGxhbm5lZCBlZmZvcnQgc2hvdWxkIGJlIHNob3duLid9ID0gJ1NvbGwgZGVyIGdlcGxhbnRlIEF1ZndhbmQgYW5nZXplaWd0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgcmVxdWVzdGVkIGRhdGUgc2hvdWxkIGJlIHByaW50IGJ5IGN1c3RvbWVyLid9ID0gJ0RlZmluaWVydCBvYiBkYXMgQW5mcmFnZWRhdHVtIGbDvHIgZGVuIEt1bmRlbiBnZWRydWNrdCB3ZXJkZW4gc29sbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgcmVxdWVzdGVkIGRhdGUgc2hvdWxkIGJlIHNlYXJjaGVkIGJ5IGN1c3RvbWVyLid9ID0KICAgICAgICAnU29sbCBkZXIgV3Vuc2NodGVybWluIGRlcyBLdW5kZW4gZ2VzdWNodCB3ZXJkZW4ga8O2bm5lbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgcmVxdWVzdGVkIGRhdGUgc2hvdWxkIGJlIHNldCBieSBjdXN0b21lci4nfSA9ICdEZWZpbmllcnQgb2IgZGFzIEFuZnJhZ2VkYXR1bSB2b20gS3VuZGVuIGF1c2dlZsO8bGx0IHdlcmRlbiBzb2xsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSByZXF1ZXN0ZWQgZGF0ZSBzaG91bGQgYmUgc2hvd24gYnkgY3VzdG9tZXIuJ30gPSAnU29sbCBkZXIgV3Vuc2NodGVybWluIGRlcyBLdW5kZW4gYW5nZXplaWd0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgd29ya29yZGVyIHN0YXRlIHNob3VsZCBiZSBzaG93bi4nfSA9ICdTb2xsIGRlciBTdGF0dXMgZGVzIEFyYmVpdHNhdWZ0cmFncyBhbmdlemVpZ3Qgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSB3b3Jrb3JkZXIgdGl0bGUgc2hvdWxkIGJlIHNob3duLid9ID0gJ1NvbGwgZGVyIFRpdGVsIGRlcyBBcmJlaXRzYXVmdHJhZ3MgYW5nZXplaWd0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBzaG93biBncmFwaCBhdHRyaWJ1dGVzLid9ID0gJ0RlZmluaWVydCBBdHRyaWJ1dGUgZsO8ciBkaWUgQW56ZWlnZSBkZXMgR3JhcGhlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGF0IG9ubHkgY2hhbmdlcyBjb250YWluaW5nIFdvcmtvcmRlcnMgbGlua2VkIHdpdGggc2VydmljZXMsIHdoaWNoIHRoZSBjdXN0b21lciB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHVzZSB3aWxsIGJlIHNob3duLiBBbnkgb3RoZXIgY2hhbmdlcyB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgbnVyIMOEbmRlcnVuZ2VuIGFuZ2V6ZWlndCB3ZXJkZW4sIGRpZSBBcmJlaXRzYXVmdHLDpGdlIGVudGhhbHRlbiwgZGllIG1pdCBEaWVuc3RlbiB2ZXJsaW5rdCBzaW5kLCBmw7xyIGRpZSBkZXIgS3VuZGVuLUJlbnV0emVyIGVpbmUgQmVyZWNodGlndW5nIGhhdC4gQW5kZXJlIMOEbmRlcnVuZ2VuIHdlcmRlbiBuaWNodCBhbmdlemVpZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIGFsbG93ZWQgdG8gZGVsZXRlLid9ID0gJ0RlZmluaWVydCBkZW4gw4RuZGVydW5nc3N0YXR1cyB3ZWxjaGVyIGRhcyBsw7ZzY2hlbiBlcm3DtmdsaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBDaGFuZ2UgUFNBIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBDaGFuZ2UtU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBDaGFuZ2UgUFNBLcOcYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBDaGFuZ2UgU2NoZWR1bGUgb3ZlcnZpZXcuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIENoYW5nZSBTY2hlZHVsZS3DnGJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIE15Q0FCLcOcYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBNeUNoYW5nZXMgb3ZlcnZpZXcuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIE15Q2hhbmdlcy3DnGJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgY2hhbmdlIG1hbmFnZXIgb3ZlcnZpZXcuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIENoYW5nZS1NYW5hZ2VyLcOcYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBjaGFuZ2Ugb3ZlcnZpZXcuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIENoYW5nZS3DnGJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgY3VzdG9tZXIgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBDaGFuZ2UtU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBLdW5kZW4tQW5zaWNodCAiQ2hhbmdlIFNjaGVkdWxlIiB2ZXJ3ZW5kZXQgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGNoYW5nZSB0aXRsZSBmb3IgYSBkdW1teSBjaGFuZ2Ugd2hpY2ggaXMgbmVlZGVkIHRvIGVkaXQgYSB3b3Jrb3JkZXIgdGVtcGxhdGUuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkdGl0ZWwgZsO8ciBlaW5lIFNjaGVpbsOkbmRlcnVuZywgd2VsY2hlIGJlbsO2dGlndCB3aXJkLCB1bSBlaW5lIEFyYmVpdHNhdWZ0cmFnc3ZvcmxhZ2UgenUgZWRpdGllcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgY3JpdGVyaWEgaW4gdGhlIGNoYW5nZSBQU0Egb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UgUFNBLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBpbiB0aGUgY2hhbmdlIG1hbmFnZXIgb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UtTWFuYWdlci3DnGJlcnNpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgY3JpdGVyaWEgaW4gdGhlIGNoYW5nZSBvdmVydmlldy4nfSA9ICdTdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2Utw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIGluIHRoZSBjaGFuZ2Ugc2NoZWR1bGUgb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UgU2NoZWR1bGUtw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IGNyaXRlcmlhIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBNeUNBQiBvdmVydmlldy4nfSA9CiAgICAgICAgJ1N0YW5kYXJkIFNvcnRpZXJ1bmcgZGVyIENoYW5nZXMgaW4gZGVyIE15Q0FCLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgTXlDaGFuZ2VzIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnU3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgTXlDaGFuZ2VzLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnU3RhbmRhcmRzb3J0aWVydW5nIGRlciDDhG5kZXJ1bmdlbiBpbiBkZXIgTWVpbmVBcmJlaXRzYXVmdHLDpGdlLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgUElSIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnU3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgUElSLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgY3VzdG9tZXIgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnU3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgS3VuZGVuLUFuc2ljaHQgIkNoYW5nZSBTY2hlZHVsZSIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBjcml0ZXJpYSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgdGVtcGxhdGUgb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZCBTb3J0aWVydW5nIGRlciBUZW1wbGF0ZXMgaW4gZGVyIFRlbXBsYXRlLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuJ30gPSAnU3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIE15Q0FCLcOcYmVyc2ljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgTXlDaGFuZ2VzIG92ZXJ2aWV3Lid9ID0gJ1N0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBNeUNoYW5nZXMtw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBNeVdvcmtvcmRlcnMgb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZHJlaWhlbmZvbGdlIGRlciBBcmJlaXRzYXVmdHLDpGdlIGluIGRlciBNZWluZUFyYmVpdHNhdWZ0csOkZ2Utw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBQSVIgb3ZlcnZpZXcuJ30gPSAnU3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIFBJUi3DnGJlcnNpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGNoYW5nZSBQU0Egb3ZlcnZpZXcuJ30gPSAnU3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIENoYW5nZSBQU0Etw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy4nfSA9CiAgICAgICAgJ1N0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UtTWFuYWdlci3DnGJlcnNpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGNoYW5nZSBvdmVydmlldy4nfSA9ICdEZWZpbmllcnQgZGllIFN0YW5kYXJkIFNvcnRpZXJ1bmcgaW4gZGVyIMOEbmRlcnVuZ3PDvGJlcnNpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaW4gdGhlIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy4nfSA9CiAgICAgICAgJ1N0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UgU2NoZWR1bGUtw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGluIHRoZSBjdXN0b21lciBjaGFuZ2Ugc2NoZWR1bGUgb3ZlcnZpZXcuJ30gPQogICAgICAgICdTdGFuZGFyZCBSZWloZW5mb2xnZSBkZXIgQ2hhbmdlcyBpbiBkZXIgS3VuZGVuLUFuc2ljaHQgIkNoYW5nZSBTY2hlZHVsZSIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpbiB0aGUgdGVtcGxhdGUgb3ZlcnZpZXcuJ30gPSAnU3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIFRlbXBsYXRlcyBpbiBkZXIgVGVtcGxhdGUtw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNhdGVnb3J5IG9mIGEgY2hhbmdlLid9ID0gJ0RlciBTdGFuZGFyZC1XZXJ0IGbDvHIgZGllIEthdGVnb3JpZSBlaW5lcyBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW1wYWN0IG9mIGEgY2hhbmdlLid9ID0gJ0RlciBTdGFuZGFyZC1XZXJ0IGbDvHIgZGllIEF1c3dpcmt1bmcgZWluZXMgQ2hhbmdlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZmllbGQgdHlwZSBvZiBDb21wYXJlVmFsdWUgZmllbGRzIGZvciBjaGFuZ2UgYXR0cmlidXRlcyB1c2VkIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFZhbGlkIHZhbHVlcyBhcmUgU2VsZWN0aW9uLCBUZXh0IGFuZCBEYXRlLiBJZiBhIHR5cGUgaXMgbm90IGRlZmluZWQsIHRoZSBmaWVsZCB3aWxsIG5vdCBiZSBzaG93bi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBmaWVsZCB0eXBlIG9mIENvbXBhcmVWYWx1ZSBmaWVsZHMgZm9yIHdvcmtvcmRlciBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gVmFsaWQgdmFsdWVzIGFyZSBTZWxlY3Rpb24sIFRleHQgYW5kIERhdGUuIElmIGEgdHlwZSBpcyBub3QgZGVmaW5lZCwgdGhlIGZpZWxkIHdpbGwgbm90IGJlIHNob3duLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIGNoYW5nZSBvYmplY3RzIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3Igd29ya29yZGVyIG9iamVjdHMgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY2NvdW50ZWRUaW1lIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbFN0YXJ0VGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENhdGVnb3J5SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VCdWlsZGVySUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VNYW5hZ2VySUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VTdGF0ZUlEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlVGl0bGUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBEeW5hbWljRmllbGQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBJbXBhY3RJRCBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRFZmZvcnQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRW5kVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRTdGFydFRpbWUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQcmlvcml0eUlEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUmVxdWVzdGVkVGltZSBpbiB0aGUgY2hhbmdlIGNvbmRpdGlvbiBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlckFnZW50SUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJOdW1iZXIgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJTdGF0ZUlEIGluIHRoZSBjaGFuZ2UgY29uZGl0aW9uIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyVGl0bGUgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJUeXBlSUQgaW4gdGhlIGNoYW5nZSBjb25kaXRpb24gZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBwZXJpb2QgKGluIHllYXJzKSwgaW4gd2hpY2ggc3RhcnQgYW5kIGVuZCB0aW1lcyBjYW4gYmUgc2VsZWN0ZWQuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFplaXRyYXVtIChpbiBKYWhyZW4pIGluIHdlbGNoZXIgU3RhcnQtIHVuZCBFbmR6ZWl0ZW4gZ2V3w6RobHQgd2VyZGVuIGvDtm5uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGF0dHJpYnV0ZXMgb2YgYSB3b3Jrb3JkZXIgaW4gdGhlIHRvb2x0aXAgb2YgdGhlIHdvcmtvcmRlciBncmFwaCBpbiB0aGUgY2hhbmdlIHpvb20uIFRvIHNob3cgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzIGluIHRoZSB0b29sdGlwLCB0aGV5IG11c3QgYmUgc3BlY2lmaWVkIGxpa2UgRHluYW1pY0ZpZWxkX1dvcmtPcmRlckZpZWxkTmFtZTEsIER5bmFtaWNGaWVsZF9Xb3JrT3JkZXJGaWVsZE5hbWUyLCBldGMuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIEF0dHJpYnV0ZSBlaW5lciBXb3Jrb3JkZXIgZGllIGluIGRlciAiQ2hhbmdlIFpvb20iIEFuc2ljaHQgYWxzIEt1cnppbmZvIHp1bSBXb3Jrb3JkZXIgQmFsa2VuIGFuZ2V6ZWlndCB3ZXJkZW4uIFVtIER5bmFtaXNjaGUgZmVsZGVyIGRlciBXb3Jrb3JkZXIgYW56dXplaWdlbiwgbcO8c3NlbiBkaWVzIGFscyBEeW5hbWljRmllbGRfV29ya09yZGVyRmllbGROYW1lMSwgRHluYW1pY0ZpZWxkX1dvcmtPcmRlckZpZWxkTmFtZTIsIGV0Yy4gYW5nZWdlYmVuIHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgQ2hhbmdlIFBTQSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBDaGFuZ2UgUFNBLcOcYmVyc2ljaHQuIERpZXNlIE9wdGlvbiBoYXQga2VpbmVuIEVmZmVrdCBhdWYgZGllIFBvc2l0aW9uIGRlciBTcGFsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBDaGFuZ2UgU2NoZWR1bGUgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgQ2hhbmdlIFNjaGVkdWxlLcOcYmVyc2ljaHQuIERpZXNlIE9wdGlvbiBoYXQga2VpbmVuIEVmZmVrdCBhdWYgZGllIFBvc2l0aW9uIGRlciBTcGFsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBNeUNBQiBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBNeUNBQi3DnGJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgTXlDaGFuZ2VzIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIE15Q2hhbmdlcy3DnGJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIE15V29ya29yZGVycy3DnGJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgUElSIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIFBJUi3DnGJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY2hhbmdlIG1hbmFnZXIgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgQ2hhbmdlLU1hbmFnZXItw5xiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNoYW5nZSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBDaGFuZ2Utw5xiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNoYW5nZSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbSBTdWNoZXJnZWJuaXNzLiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgY3VzdG9tZXIgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIEt1bmRlbi1BbnNpY2h0ICJDaGFuZ2UgU2NoZWR1bGUiLiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgdGVtcGxhdGUgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgVGVtcGxhdGUtw5xiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHNpZ25hbHMgZm9yIGVhY2ggSVRTTSBjaGFuZ2Ugc3RhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRlbXBsYXRlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIHRlbXBsYXRlIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBUZW1wbGF0ZVR5cGVuIGRpZSBhbHMgRmlsdGVyIGluIGRlciBUZW1wbGF0ZS3DnGJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHdvcmtvcmRlciBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3Lid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBXb3Jrb3JkZXItU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBNeVdvcmtvcmRlcnMtw5xiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB3b3Jrb3JkZXIgc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIFBJUiBvdmVydmlldy4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgV29ya29yZGVyLVN0YXRlcyBkaWUgYWxzIEZpbHRlciBpbiBkZXIgUElSLcOcYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgd29ya29yZGVyIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNob3cgdGhlIFBJUiBvdmVydmlldy4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgV29ya29yZGVyLVR5cGVuIGRpZSBmw7xyIGRpZSBQSVItw5xiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHdoZXRoZXIgbm90aWZpY2F0aW9ucyBzaG91bGQgYmUgc2VudC4nfSA9ICdXZW5uIEJlbmFjaHJpY2h0aWd1bmdlbiB2ZXJzZW5kZXQgd2VyZGVuIHNvbGxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIGEgY2hhbmdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgdGhlIGNoYW5nZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIHRoZSB3b3Jrb3JkZXIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldGFpbHMgb2YgYSBjaGFuZ2UgaGlzdG9yeSBlbnRyeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyBpZiBhbiBhZ2VudCBjYW4gZXhjaGFuZ2UgdGhlIFgtYXhpcyBvZiBhIHN0YXQgaWYgaGUgZ2VuZXJhdGVzIG9uZS4nfSA9CiAgICAgICAgJ1dlbm4gZGllc2UgT3B0aW9uIGFrdGl2aWVydCB3aXJkLCBoYXQgZGVyIEFnZW50IGRpZSBNw7ZnbGljaGtlaXQgYmVpbSBHZW5lcmllcmVuIGVpbmVyIFN0YXRpc3RpayBkaWUgYmVpZGVuIEFjaHNlbiB6dSB2ZXJ0YXVzY2hlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyBpZiB0aGUgY29tbW9uIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgY2hhbmdlcyBkb25lIGZvciBjb25maWcgaXRlbSBjbGFzc2VzLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBhbGxnZW1laW5lIFN0YXRpc3Rpa2VuIMO8YmVyIGRpZSBBbnphaGwgZGVyIGR1cmNoZ2Vmw7xocnRlbiBDaGFuZ2VzIG5hY2ggQ0ktS2xhc3NlIGdlbmVyaWVyZW4gZGFyZi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyBpZiB0aGUgY29tbW9uIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgY2hhbmdlcyByZWdhcmRpbmcgY2hhbmdlIHN0YXRlIHVwZGF0ZXMgd2l0aGluIGEgdGltZXBlcmlvZC4nfSA9CiAgICAgICAgJ0hpZXIga8O2bm5lbiBTaWUgZmVzdGxlZ2VuLCBvYiBkYXMgU3RhdGlzdGlrLU1vZHVsIGF1Y2ggYWxsZ2VtZWluZSBTdGF0aXN0aWtlbiDDvGJlciBDaGFuZ2VzIGJ6Z2wuIFN0YXR1cy1VcGRhdGVzIGlubmVyaGFsYiBlaW5lciBaZWl0cGVyaW9kZSBnZW5lcmllcmVuIGRhcmYuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RldGVybWluZXMgaWYgdGhlIGNvbW1vbiBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGNoYW5nZXMgcmVnYXJkaW5nIHRoZSByZWxhdGlvbiBiZXR3ZWVuIGNoYW5nZXMgYW5kIGluY2lkZW50IHRpY2tldHMuJ30gPQogICAgICAgICdIaWVyIGvDtm5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIGFsbGdlbWVpbmUgU3RhdGlzdGlrZW4gw7xiZXIgQ2hhbmdlcyBiemdsLiBkZW0gWnVzYW1tZW5oYW5nIHp3aXNjaGVuIENoYW5nZXMgdW5kIFZvcmZhbGxzLVRpY2tldHMgZ2VuZXJpZXJlbiBkYXJmLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIGlmIHRoZSBjb21tb24gc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCBjaGFuZ2VzLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBhbGxnZW1laW5lIFN0YXRpc3Rpa2VuIMO8YmVyIENoYW5nZXMgZ2VuZXJpZXJlbiBkYXJmLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIGlmIHRoZSBjb21tb24gc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCB0aGUgbnVtYmVyIG9mIFJmYyB0aWNrZXRzIGEgcmVxdWVzdGVyIGNyZWF0ZWQuJ30gPQogICAgICAgICdIaWVyIGvDtm5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIGFsbGdlbWVpbmUgU3RhdGlzdGlrZW4gw7xiZXIgZGllIEFuemFobCB2b24gUmZDLVRpY2tldHMsIGRpZSB2b24gQmVudXR6ZXJuIGVyemV1Z3Qgd3VyZGVuLCBnZW5lcmllcmVuIGRhcmYuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIChmb3IgY2hhbmdlcyBhbmQgd29ya29yZGVycykgc2hvd24gaW4gdGhlIGNoYW5nZSBwcmludCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgY2hhbmdlIGFkZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgY2hhbmdlIGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGNoYW5nZSBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGNoYW5nZSB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB3b3Jrb3JkZXIgYWRkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB3b3Jrb3JkZXIgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgd29ya29yZGVyIHJlcG9ydCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgd29ya29yZGVyIHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkIGV2ZW50IG1vZHVsZSB0byBoYW5kbGUgdGhlIHVwZGF0ZSBvZiBjb25kaXRpb25zIGlmIGR5bmFtaWMgZmllbGRzIGFyZSBhZGRlZCwgdXBkYXRlZCBvciBkZWxldGVkLid9ID0KICAgICAgICAnRHluYW1pc2NoZSBGZWxkZXIgRXZlbnQtTW9kdWwgenVyIEJlaGFuZGx1bmcgZGVyIEJlZGluZ3VuZ2VuIHdlbm4gRHluYW1pc2NoZSBGZWxkZXIgaGluenVnZWbDvGd0LCBnZcOkbmRlcnQgb2RlciBnZWzDtnNjaHQgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGEgY2hhbmdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHRoZSBjaGFuZ2UuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGNoYW5nZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCB0aGUgd29ya29yZGVyLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBtaW5pbWFsIGNoYW5nZSBjb3VudGVyIHNpemUgKGlmICJEYXRlIiB3YXMgc2VsZWN0ZWQgYXMgSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3J3YXJkIHNjaGVkdWxlIG9mIGNoYW5nZXMuIE92ZXJ2aWV3IG92ZXIgYXBwcm92ZWQgY2hhbmdlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaXN0b3J5IFpvb20nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDaGFuZ2UgQ0FCIFRlbXBsYXRlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDaGFuZ2UgQ29uZGl0aW9uIEVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ2hhbmdlIENvbmRpdGlvbiBPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDaGFuZ2UgTWFuYWdlciBPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBDaGFuZ2UgTm90aWZpY2F0aW9ucyd9ID0gJ0lUU00gQ2hhbmdlLUJlbmFjaHJpY2h0aWd1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENoYW5nZSBQSVIgT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gQ2hhbmdlIG5vdGlmaWNhdGlvbiBydWxlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIENoYW5nZXMnfSA9ICdDaGFuZ2VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gTXlDQUIgT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gTXlDaGFuZ2VzIE92ZXJ2aWV3Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIE15V29ya29yZGVycyBPdmVydmlldy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBUZW1wbGF0ZSBEZWxldGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gVGVtcGxhdGUgRWRpdCBDQUIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gVGVtcGxhdGUgRWRpdCBDb250ZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIFRlbXBsYXRlIEVkaXQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gVGVtcGxhdGUgT3ZlcnZpZXcuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gZXZlbnQgbW9kdWxlIHRoYXQgY2xlYW5zIHVwIGNvbmRpdGlvbnMuJ30gPSAnSVRTTSBFdmVudCBNb2R1bCB6dW0gQXVmcsOkdW1lbiB2b24gQ29uZGl0aW9ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBldmVudCBtb2R1bGUgdGhhdCBkZWxldGVzIHRoZSBjYWNoZSBmb3IgYSB0b29sYmFyLid9ID0gJ0lUU00tRXJlaWduaXNtb2R1bCwgZGFzIGRlbiBDYWNoZSBmw7xyIGVpbmUgV2Vya3pldWdsZWlzdGUgbMO2c2NodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBldmVudCBtb2R1bGUgdGhhdCBkZWxldGVzIHRoZSBoaXN0b3J5IG9mIGNoYW5nZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gZXZlbnQgbW9kdWxlIHRoYXQgbWF0Y2hlcyBjb25kaXRpb25zIGFuZCBleGVjdXRlcyBhY3Rpb25zLid9ID0KICAgICAgICAnSVRTTSBFdmVudCBNb2R1bCB6dW0gw5xiZXJwcsO8ZmVuIHZvbiBDb25kaXRpb25zIHVuZCB6dW0gQXVzZsO8aHJlbiB2b24gQWN0aW9ucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBldmVudCBtb2R1bGUgdGhhdCBzZW5kcyBub3RpZmljYXRpb25zLid9ID0gJ0lUU00gRXZlbnQgTW9kdWwgenVtIFNlbmRlbiB2b24gQmVuYWNocmljaHRpZ3VuZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2YgY2hhbmdlcy4nfSA9ICdJVFNNIEV2ZW50IE1vZHVsIGFrdHVhbGlzaWVydCBkaWUgSGlzdG9yaWUgdm9uIENoYW5nZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUU00gZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgaGlzdG9yeSBvZiBjb25kaXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2Ygd29ya29yZGVycy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBldmVudCBtb2R1bGUgdG8gcmVjYWxjdWxhdGUgdGhlIHdvcmtvcmRlciBudW1iZXJzLid9ID0gJ0lUU00gRXZlbnQgTW9kdWwsIGRhcyBkaWUgV29ya29yZGVyIE51bW1lcm4gbmV1IGJlcmVjaG5ldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBldmVudCBtb2R1bGUgdG8gc2V0IHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCB0aW1lcyBvZiB3b3Jrb3JkZXJzLid9ID0KICAgICAgICAnSVRTTSBFdmVudCBNb2R1bCwgZGFzIGRpZSBBY3R1YWxTdGFydCB1bmQgQWN0dWFsRW5kIFplaXRlbiB2b24gV29ya29yZGVycyBzZXR6dC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTUNoYW5nZSd9ID0gJ0NoYW5nZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVFNNV29ya09yZGVyJ30gPSAnQXJiZWl0c2F1ZnRyYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZnJlcXVlbmN5IGlzIFwncmVndWxhcmx5XCcsIHlvdSBjYW4gY29uZmlndXJlIGhvdyBvZnRlbiB0aGUgbm90aWZpY2F0aW9ucyBhcmUgc2VudCAoZXZlcnkgWCBob3VycykuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayBhbm90aGVyIG9iamVjdCB0byB0aGUgY2hhbmdlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIGFub3RoZXIgb2JqZWN0IHRvIHRoZSB3b3Jrb3JkZXIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNoYW5nZSBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIHdvcmtvcmRlciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvb2t1cCBvZiBDQUIgbWVtYmVycyBmb3IgYXV0b2NvbXBsZXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvb2t1cCBvZiBhZ2VudHMsIHVzZWQgZm9yIGF1dG9jb21wbGV0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudCBzdGF0ZSBtYWNoaW5lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgdGhlIGNhdGVnb3J5IOKGlCBpbXBhY3Qg4oaUIHByaW9yaXR5IG1hdHJpeC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIGlmIFdvcmtPcmRlckFkZCBvciBXb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUgc2hvdWxkIGJlIHBlcm1pdHRlZC4nfSA9CiAgICAgICAgJ01vZHVsIHp1ciBQcsO8ZnVuZyBvYiBXb3JrT3JkZXJBZGQgb2RlciBXb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUgZXJsYXVidCBpc3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgQ0FCIG1lbWJlcnMuJ30gPSAnTW9kdWwgenVtIMOcYmVycHLDvGZlbiBkZXMgQWdlbnRlbiBpbSBDQUIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgYWdlbnQuJ30gPSAnTW9kdWwgenVtIMOcYmVycHLDvGZlbiBkZXMgQWdlbnRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHRoZSBjaGFuZ2UgYnVpbGRlci4nfSA9ICdNb2R1bCB6dW0gw5xiZXJwcsO8ZmVuIGRlcyBDaGFuZ2UgQnVpbGRlcnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayB0aGUgY2hhbmdlIG1hbmFnZXIuJ30gPSAnTW9kdWwgenVtIMOcYmVycHLDvGZlbiBkZXMgQ2hhbmdlIE1hbmFnZXJzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgdGhlIHdvcmtvcmRlciBhZ2VudC4nfSA9ICdNb2R1bCB6dW0gw5xiZXJwcsO8ZmVuIGRlcyBXb3Jrb3JkZXItQWdlbnRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGNoZWNrIHdoZXRoZXIgbm8gd29ya29yZGVyIGFnZW50IGlzIHNldC4nfSA9ICdNb2R1bCB6dW0gw5xiZXJwcsO8ZmVuIG9iIGVzIGtlaW5lbiBBZ2VudGVuIGbDvHIgZGllIFdvcmtvcmRlciBnaWJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gY2hlY2sgd2hldGhlciB0aGUgYWdlbnQgaXMgY29udGFpbmVkIGluIHRoZSBjb25maWd1cmVkIGxpc3QuJ30gPQogICAgICAgICdNb2R1bCB6dW0gw5xiZXJwcsO8ZmVuIG9iIGRlciBBZ2VudCBpbiBkZXIga29uZmlndXJpZXJ0ZW4gTGlzdGUgZW50aGFsdGVuIGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIHNob3cgYSBsaW5rIHRvIGNyZWF0ZSBhIGNoYW5nZSBmcm9tIHRoaXMgdGlja2V0LiBUaGUgdGlja2V0IHdpbGwgYmUgYXV0b21hdGljYWxseSBsaW5rZWQgd2l0aCB0aGUgbmV3IGNoYW5nZS4nfSA9CiAgICAgICAgJ01pdCBkaWVzZW0gTW9kdWwgd2lyZCBlaW4gTGluayBpbSBNZW7DvCBkZXIgVGlja2V0YW5zaWNodCBhbmdlemVpZ3QsIG1pdCBkZW0gZWluIENoYW5nZSBlcnN0ZWxsdCB3ZXJkZW4ga2Fubi4gRGFzIFRpY2tldCB3aXJkIGF1dG9tYXRpc2NoIG1pdCBkZW0gbmV1IGVyc3RlbGx0ZW4gQ2hhbmdlIHZlcmxpbmt0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIFRpbWUgU2xvdC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBhbGwgd29ya29yZGVycyBpbiB0aW1lLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgKGZyb20gdGVtcGxhdGUpJ30gPSAnTmV1ICh2b24gVGVtcGxhdGUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09ubHkgdXNlcnMgb2YgdGhlc2UgZ3JvdXBzIGhhdmUgdGhlIHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0aWNrZXQgdHlwZXMgYXMgZGVmaW5lZCBpbiAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBpZiB0aGUgZmVhdHVyZSAiVGlja2V0OjpBY2w6Ok1vZHVsZSMjIzIwMC1UaWNrZXQ6OkFjbDo6TW9kdWxlIiBpcyBlbmFibGVkLid9ID0KICAgICAgICAnTnVyIGRpZSBNaXRnbGllZGVyIGRpZXNlciBHcnVwcGVuIGhhYmVuIGRpZSBFcmxhdWJuaXMgZGllIFRpY2tldC1UeXBlbiB6dSB2ZXJ3ZW5kZW4sIGRpZSBpbiAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBkZWZpbmllcnQgc2luZCwgd2VubiBkYXMgRmVhdHVyZSAiVGlja2V0OjpBY2w6Ok1vZHVsZSMjIzIwMC1UaWNrZXQ6OkFjbDo6TW9kdWxlIiBha3RpdmllcnQgaXN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlciBTZXR0aW5ncyd9ID0gJ0FuZGVyZSBFaW5zdGVsbHVuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG92ZXIgYWxsIENoYW5nZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BJUid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQSVIgKFBvc3QgSW1wbGVtZW50YXRpb24gUmV2aWV3KSd9ID0gJ1BJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BTQSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgVXNlckNyZWF0ZVdvcmtPcmRlck5leHRNYXNrIG9iamVjdCBpbiB0aGUgcHJlZmVyZW5jZSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgZsO8ciBkYXMgVXNlckNyZWF0ZVdvcmtPcmRlck5leHRNYXNrIE9iamVrdCBpbiBkZW4gQmVudXR6ZXJlaW5zdGVsbHVuZ2VuIGRlciBBZ2VudGVuLU9iZXJmbMOkY2hlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgcGFnZXMgKGluIHdoaWNoIHRoZSBjaGFuZ2VzIGFyZSBzaG93bikgb2YgdGhlIHNtYWxsIGNoYW5nZSBvdmVydmlldy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciBmw7xyIGRpZSBDaGFuZ2Ugw5xiZXJzaWNodHMtQW56ZWlnZSBpbiBkZXIgQW56ZWlnZS1WYXJpYW50ZSAiUyIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlcmZvcm1zIHRoZSBjb25maWd1cmVkIGFjdGlvbiBmb3IgZWFjaCBldmVudCAoYXMgYW4gSW52b2tlcikgZm9yIGVhY2ggY29uZmlndXJlZCBXZWJzZXJ2aWNlLid9ID0KICAgICAgICAnRsO8aHJ0IGRpZSBrb25maWd1cmllcnRlIEFrdGlvbiBmw7xyIGplZGVzIEVyZWlnbmlzIGbDvHIgamVkZW4ga29uZmlndXJpZXJ0ZW4gV2Vic2VydmljZSBhdXMgKGFscyBJbnZva2VyKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxhbm5lZCBlbmQgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGFubmVkIHN0YXJ0IHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnQgdGhlIGNoYW5nZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJpbnQgdGhlIHdvcmtvcmRlci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb2plY3RlZCBTZXJ2aWNlIEF2YWlsYWJpbGl0eSAoUFNBKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9qZWN0ZWQgU2VydmljZSBBdmFpbGFiaWxpdHkgKFBTQSkgb2YgY2hhbmdlcy4gT3ZlcnZpZXcgb2YgYXBwcm92ZWQgY2hhbmdlcyBhbmQgdGhlaXIgc2VydmljZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWVzdGVkIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyBpbiBvcmRlciBmb3IgYW4gYWdlbnQgdG8gdGFrZSBhIHdvcmtvcmRlci4nfSA9CiAgICAgICAgJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSDDnGJlcm5laG1lbiBlaW5lciBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gYWNjZXNzIHRoZSBvdmVydmlldyBvZiBhbGwgY2hhbmdlcy4nfSA9ICdFcmZvcmRlcmxpY2hlIEJlcmVjaHRpZ3VuZ2VuLCB1bSBhdWYgZGllIMOcYmVyc2ljaHQgYWxsZXIgw4RuZGVydW5nZW4genV6dWdyZWlmZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gYWRkIGEgd29ya29yZGVyLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBMw7ZzY2hlbiBlaW5lciBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gY2hhbmdlIHRoZSB3b3Jrb3JkZXIgYWdlbnQuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIMOEbmRlcm4gZGVzIEFnZW50ZW4gZWluZXIgV29ya29yZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIGZyb20gYSBjaGFuZ2UuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgdW0gZWluZSBWb3JsYWdlIGF1cyBlaW5lbSBDaGFuZ2UgenUgZXJzdGVsbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIGZyb20gYSBjaGFuZ2VzXCcgQ0FCLid9ID0KICAgICAgICAnQmVuw7Z0aWd0ZXMgUmVjaHQgdW0gZWluZSBWb3JsYWdlIGF1cyBlaW5lbSBDQUIgZWluZXMgQ2hhbmdlIHp1IGVyc3RlbGxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBmcm9tIGEgd29ya29yZGVyLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHVtIGVpbmUgVm9ybGFnZSBhdXMgZWluZXIgV29ya29yZGVyIHp1IGVyc3RlbGxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBjcmVhdGUgY2hhbmdlcyBmcm9tIHRlbXBsYXRlcy4nfSA9ICdFcmZvcmRlcmxpY2hlIEJlcmVjaHRpZ3VuZ2VuLCB1bSDDhG5kZXJ1bmdlbiBhdXMgVm9ybGFnZW4genUgZXJzdGVsbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGNyZWF0ZSBjaGFuZ2VzLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBFcnN0ZWxsZW4gdm9uIENoYW5nZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGEgdGVtcGxhdGUuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEzDtnNjaGVuIGVpbmVyIFZvcmxhZ2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGEgd29ya29yZGVyLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBMw7ZzY2hlbiBlaW5lciBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gZGVsZXRlIGNoYW5nZXMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEzDtnNjaGVuIHZvbiBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGVkaXQgYSB0ZW1wbGF0ZS4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gw4RuZGVybiBlaW5lciBWb3JsYWdlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGVkaXQgYSB3b3Jrb3JkZXIuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIMOEbmRlcm4gZWluZXIgV29ya29yZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIGVkaXQgY2hhbmdlcy4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gQmVhcmJlaXRlbiB2b24gQ2hhbmdlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBlZGl0IHRoZSBjb25kaXRpb25zIG9mIGNoYW5nZXMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEJlYXJiZWl0ZW4gZGVyIENvbmRpdGlvbiB2b24gQ2hhbmdlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBlZGl0IHRoZSBjb250ZW50IG9mIGEgdGVtcGxhdGUuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIMOEbmRlcm4gZGVzIEluaGFsdHMgZWluZXIgVm9ybGFnZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byBlZGl0IHRoZSBpbnZvbHZlZCBwZXJzb25zIG9mIGEgY2hhbmdlLid9ID0KICAgICAgICAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIMOEbmRlcm4gZGVyIGJldGVpbGlndGVuIFBlcnNvbmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIG1vdmUgY2hhbmdlcyBpbiB0aW1lLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSB6ZWl0bGljaGVuIFZlcnNjaGllYmVuIHZvbiBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHByaW50IGEgY2hhbmdlLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBEcnVja2VuIHZvbiBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHJlc2V0IGNoYW5nZXMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIFp1csO8Y2tzZXR6ZW4gdm9uIENoYW5nZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBhIHdvcmtvcmRlci4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gQmV0cmFjaHRlbiBlaW5lciBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBjaGFuZ2VzLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBBbnNlaGVuIHZvbiBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgbGlzdCBvZiBjaGFuZ2VzIHdoZXJlIHRoZSB1c2VyIGlzIGEgQ0FCIG1lbWJlci4nfSA9CiAgICAgICAgJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgTGlzdGUgZGVyIENoYW5nZXMgYmVpIGRlbmVuIGRlciBCZW51dHplciBNaXRnbGllZCBkZXMgQ0FCcyBpc3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyBsaXN0IG9mIGNoYW5nZXMgd2hlcmUgdGhlIHVzZXIgaXMgdGhlIGNoYW5nZSBtYW5hZ2VyLid9ID0KICAgICAgICAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBMaXN0ZSBkZXIgQ2hhbmdlcyBiZWkgZGVuZW4gZGVyIEJlbnV0emVyIGNoYW5nZSBtYW5hZ2VyIGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IG92ZXJ2aWV3IG92ZXIgYWxsIHRlbXBsYXRlcy4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIExpc3RlIHZvbiBWb3JsYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBjb25kaXRpb25zIG9mIGNoYW5nZXMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEJldHJhY2h0ZW4gZGVyIENvbmRpdGlvbnMgdm9uIENoYW5nZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgaGlzdG9yeSBvZiBhIGNoYW5nZS4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIEhpc3RvcmllIGVpbmVzIENoYW5nZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBoaXN0b3J5IG9mIGEgd29ya29yZGVyLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBCZXRyYWNodGVuIGRlciBIaXN0b3JpZSBlaW5lciBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHByaXZpbGVnZXMgdG8gdmlldyB0aGUgaGlzdG9yeSB6b29tIG9mIGEgY2hhbmdlLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgSGlzdG9yaWVuZGV0YWlscyBlaW5lcyBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgdGhlIGhpc3Rvcnkgem9vbSBvZiBhIHdvcmtvcmRlci4nfSA9CiAgICAgICAgJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBCZXRyYWNodGVuIGRlciBIaXN0b3JpZW5kZXRhaWxzIGVpbmVyIFdvcmtvcmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBsaXN0IG9mIENoYW5nZSBTY2hlZHVsZS4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIENoYW5nZSBTY2hlZHVsZS3DnGJlcnNpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgdGhlIGxpc3Qgb2YgY2hhbmdlIFBTQS4nfSA9ICdCZW7DtnRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIENoYW5nZSBQU0Etw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcHJpdmlsZWdlcyB0byB2aWV3IHRoZSBsaXN0IG9mIGNoYW5nZXMgd2l0aCBhbiB1cGNvbWluZyBQSVIgKFBvc3QgSW1wbGVtZW50YXRpb24gUmV2aWV3KS4nfSA9CiAgICAgICAgJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgTGlzdGUgdm9uIENoYW5nZXMgbWl0IGVpbmVtIGFuc3RlaGVuZGVuIFBJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgdGhlIGxpc3Qgb2Ygb3duIGNoYW5nZXMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBMaXN0ZSBkZXIgZWlnZW5lbiBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHZpZXcgdGhlIGxpc3Qgb2Ygb3duIHdvcmtvcmRlcnMuJ30gPSAnQmVuw7Z0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBMaXN0ZSB2b24gZWlnZW5lbiBXb3Jrb3JkZXJzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwcml2aWxlZ2VzIHRvIHdyaXRlIGEgcmVwb3J0IGZvciB0aGUgd29ya29yZGVyLid9ID0gJ0JlbsO2dGlndGVzIFJlY2h0IHp1bSBWZXJmYXNzZW4gZWluZXMgQmVyaWNodGVzIGbDvHIgZWluZSBXb3Jrb3JkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc2V0IGEgY2hhbmdlIGFuZCBpdHMgd29ya29yZGVycy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzZXQgY2hhbmdlIGFuZCBpdHMgd29ya29yZGVycy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVuIHRhc2sgdG8gY2hlY2sgaWYgc3BlY2lmaWMgdGltZXMgaGF2ZSBiZWVuIHJlYWNoZWQgaW4gY2hhbmdlcyBhbmQgd29ya29yZGVycy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTYXZlIGNoYW5nZSBhcyBhIHRlbXBsYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTYXZlIHdvcmtvcmRlciBhcyBhIHRlbXBsYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2hlZHVsZSd9ID0gJ1plaXRwbGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjcmVlbid9ID0gJ0JpbGRzY2hpcm0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NyZWVuIGFmdGVyIGNyZWF0aW5nIGEgd29ya29yZGVyJ30gPSAnQW5zaWNodCBuYWNoIFdvcmtvcmRlci1FcnN0ZWxsdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBDaGFuZ2VzJ30gPSAnU3VjaGUgQ2hhbmdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggQ2hhbmdlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0cyB0aGUgY2hhbmdlIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY2hhbmdlIG51bWJlciwgdGhlIFN5c3RlbUlEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZCB3aXRoIFN5c3RlbUlELmNvdW50ZXIgZm9ybWF0IChlLmcuIDEwMDExOCwgMTAwMTE5KS4gV2l0aCAiRGF0ZSIsIHRoZSBjaGFuZ2UgbnVtYmVycyB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCBkYXRlIGFuZCBhIGNvdW50ZXI7IHRoaXMgZm9ybWF0IGxvb2tzIGxpa2UgWWVhci5Nb250aC5EYXkuY291bnRlciwgZS5nLiAyMDEwMDYyNDAwMDAxLCAyMDEwMDYyNDAwMDAyLiBXaXRoICJEYXRlQ2hlY2tzdW0iLCB0aGUgY291bnRlciB3aWxsIGJlIGFwcGVuZGVkIGFzIGNoZWNrc3VtIHRvIHRoZSBzdHJpbmcgb2YgZGF0ZSBwbHVzIHRoZSBTeXN0ZW1JRC4gVGhlIGNoZWNrc3VtIHdpbGwgYmUgcm90YXRlZCBvbiBhIGRhaWx5IGJhc2lzLiBUaGlzIGZvcm1hdCBsb29rcyBsaWtlIFllYXIuTW9udGguRGF5LlN5c3RlbUlELkNvdW50ZXIuQ2hlY2tTdW0sIGUuZy4gMjAxMDA2MjQxMDAwMDAxNywgMjAxMDA2MjQxMDAwMDAyNi4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkYXMgQ2hhbmdlIE51bW1lciBHZW5lcmllcnVuZyBNb2R1bC4gIkF1dG9JbmNyZW1lbnQiIGVyaMO2aHQgZGllIENoYW5nZSBOdW1tZXIgZm9ydGxhdWZlbmQsIGRpZXNlcyBGb3JtYXQgc3RlbGx0IHNpY2ggYWxzIFN5c3RlbUlELlrDpGhsZXIgZGFyICh6LiBCLiAxMDAxMTgsIDEwMDExOSkuIE1pdCAiRGF0dW0iIHdlcmRlbiBkaWUgQ2hhbmdlIE51bW1lcm4gYXVzIGRlbSBha3R1ZWxsZW4gRGF0dW0gdW5kIGVpbmVtIFrDpGhsZXIgZ2VuZXJpZXJ0LCBkaWVzZXMgRm9ybWF0IHN0ZWxsdCBzaWNoIGFscyBKYWhyLk1vbmF0LlRhZy5aw6RobGVyIGRhciwgei4gQi4gMjAxMDA2MjQwMDAwMSwgMjAxMDA2MjQwMDAwMi4gTWl0ICJEYXRhQ2hlY2tzdW0iIGjDpG5ndCBkZXIgWsOkaGxlciBlaW5lIFByw7xmemlmZmVyIGFuIGRlbiBXZXJ0IGFuIHp1esO8Z2xpY2ggZGVyIFN5c3RlbUlELiBEaWUgUHLDvGZ6aWZmZXIgw6RuZGVydCBzaWNoIHTDpGdsaWNoLCBkaWVzZXMgRm9ybWF0IHN0ZWxsdCBzaWNoIGFscyBKYWhyLk1vbmF0LlRhZy5TeXN0ZW1JRC5aw6RobGVyLlByw7xmemlmZmVyIGRhciwgei4gQi4gMjAxMDA2MjQxMDAwMDAxNywgMjAxMDA2MjQxMDAwMDAyNi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBhZ2VudCBmb3IgdGhlIHdvcmtvcmRlci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBkZWZhdWx0IGhlaWdodCAoaW4gcGl4ZWxzKSBvZiBpbmxpbmUgSFRNTCBmaWVsZHMgaW4gdGhlIGNoYW5nZSB6b29tIHNjcmVlbiBhbmQgd29ya29yZGVyIHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0IHRoZSBtYXhpbXVtIGhlaWdodCAoaW4gcGl4ZWxzKSBvZiBpbmxpbmUgSFRNTCBmaWVsZHMgaW4gdGhlIGNoYW5nZSB6b29tIHNjcmVlbiBhbmQgd29ya29yZGVyIHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgbWluaW1hbCBjaGFuZ2UgY291bnRlciBzaXplIChpZiAiQXV0b0luY3JlbWVudCIgd2FzIHNlbGVjdGVkIGFzIElUU01DaGFuZ2U6Ok51bWJlckdlbmVyYXRvcikuIERlZmF1bHQgaXMgNSwgdGhpcyBtZWFucyB0aGUgY291bnRlciBzdGFydHMgZnJvbSAxMDAwMC4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkaWUgbWluaW1hbGUgWsOkaGxlcmdyw7bDn2UgZsO8ciBDaGFuZ2VzICh3ZW5uICJBdXRvSW5jcmVtZW50IiB1bnRlciBJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3IgYXVzZ2V3w6RobHQgd3VyZGUpLiBTdGFuZGFyZCBpc3QgNSwgZC5oLiBkZXIgWsOkaGxlciBzdGFydGV0IG1pdCAxMDAwMC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB1cCB0aGUgc3RhdGUgbWFjaGluZSBmb3IgY2hhbmdlcy4nfSA9ICdLb25maWd1cmF0aW9uIGbDvHIgZGllIFN0YXRlIE1hY2hpbmUgZsO8ciBDaGFuZ2VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHVwIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciB3b3Jrb3JkZXJzLid9ID0gJ0tvbmZpZ3VyYXRpb24gZsO8ciBkaWUgU3RhdGUgTWFjaGluZSBmw7xyIFdvcmtvcmRlcnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgY2hlY2tib3ggaW4gdGhlIHdvcmtvcmRlciBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBpZiB0aGUgdGhlIGZvbGxvd2luZyB3b3Jrb3JkZXJzIHNob3VsZCBhbHNvIGJlIG1vdmVkIGlmIGEgd29ya29yZGVyIGlzIG1vZGlmaWVkIGFuZCB0aGUgcGxhbm5lZCBlbmQgdGltZSBoYXMgY2hhbmdlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgY2hhbmdpbmcgdGhlIHdvcmtvcmRlciBhZ2VudCwgaW4gdGhlIHpvb20gdmlldyBvZiB0aGUgd29ya29yZGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGRlZmluaW5nIGEgY2hhbmdlIGFzIGEgdGVtcGxhdGUgaW4gdGhlIHpvb20gdmlldyBvZiB0aGUgY2hhbmdlLCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyICJDaGFuZ2UgWm9vbSIgQW5zaWNodCBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBlaW5lbiAgTWVudSBMaW5rIGRlciBlcyBlcmxhdWJ0IGRlbiBDaGFuZ2UgYWxzIFZvcmxhZ2UgenUgc3BlaWNoZXJuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgZGVmaW5pbmcgYSB3b3Jrb3JkZXIgYXMgYSB0ZW1wbGF0ZSBpbiB0aGUgem9vbSB2aWV3IG9mIHRoZSB3b3Jrb3JkZXIsIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGVkaXRpbmcgdGhlIHJlcG9ydCBvZiBhIHdvcmtvcmRlciwgaW4gdGhlIHpvb20gdmlldyBvZiB0aGUgd29ya29yZGVyIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRoYXQgYWxsb3dzIGxpbmtpbmcgYSBjaGFuZ2Ugd2l0aCBhbm90aGVyIG9iamVjdCBpbiB0aGUgY2hhbmdlIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyICJDaGFuZ2UgWm9vbSIgQW5zaWNodCBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBlaW5lbiAgTWVudSBMaW5rIGRlciBlcyBlcmxhdWJ0IGRlbiBDaGFuZ2UgbWl0IGVpbmVtIGFuZGVyZW4gT2JqZWt0IHp1IHZlcmtuw7xwZmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgbGlua2luZyBhIHdvcmtvcmRlciB3aXRoIGFub3RoZXIgb2JqZWN0IGluIHRoZSB6b29tIHZpZXcgb2YgdGhlIHdvcmtvcmRlciBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0aGF0IGFsbG93cyBtb3ZpbmcgdGhlIHRpbWUgc2xvdCBvZiBhIGNoYW5nZSBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBpbiBkZXIgQ2hhbmdlIFpvb20gQW5zaWNodCBkZXMgQWdlbnRlbi1JbnRlcmZhY2VzIGVpbmVuIE1lbnUgTGluayB6dW0gw4RuZGVybiBkZXMgWmVpdGZlbnN0ZXJzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdGhhdCBhbGxvd3MgdGFraW5nIGEgd29ya29yZGVyIGluIHRoZSBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgY29uZGl0aW9ucyBvZiBhIGNoYW5nZSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyIENoYW5nZSBab29tIEFuc2ljaHQgZGVzIEFnZW50ZW4tSW50ZXJmYWNlcyBlaW5lbiBNZW51IExpbmsgenVtIFp1Z3JpZmYgYXVmIGRpZSBCZWRpbmd1bmdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIGNoYW5nZSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyIENoYW5nZSBab29tIEFuc2ljaHQgZGVzIEFnZW50ZW4tSW50ZXJmYWNlcyBlaW5lbiBNZW51IExpbmsgenVtIFp1Z3JpZmYgYXVmIGRpZSBIaXN0b3JpZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFjY2VzcyB0aGUgaGlzdG9yeSBvZiBhIHdvcmtvcmRlciBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSB3b3Jrb3JkZXIgaW4gdGhlIGNoYW5nZSB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZGVsZXRlIGEgY2hhbmdlIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGluIGRlciBDaGFuZ2UgWm9vbSBBbnNpY2h0IGRlcyBBZ2VudGVuLUludGVyZmFjZXMgZWluZW4gTWVudSBMaW5rIHp1bSBMw7ZzY2hlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGRlbGV0ZSBhIHdvcmtvcmRlciBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGVkaXQgYSBjaGFuZ2UgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGluIGRlciBDaGFuZ2UgWm9vbSBBbnNpY2h0IGRlcyBBZ2VudGVuLUludGVyZmFjZXMgZWluZW4gTWVudSBMaW5rIHp1bSBCZWFyYmVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZWRpdCBhIHdvcmtvcmRlciBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBnbyBiYWNrIGluIHRoZSBjaGFuZ2Ugem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBpbiBkZXIgQ2hhbmdlIFpvb20gQW5zaWNodCBkZXMgQWdlbnRlbi1JbnRlcmZhY2VzIGVpbmVuIE1lbnUgTGluayB6dW0gWnVyw7xja2dlaGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gZ28gYmFjayBpbiB0aGUgd29ya29yZGVyIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBwcmludCBhIGNoYW5nZSBpbiB0aGUgaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyICJDaGFuZ2UgWm9vbSIgQW5zaWNodCBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBlaW5lbiAgTWVudSBMaW5rIGRlciBlcyBlcmxhdWJ0IGRlbiBDaGFuZ2UgYXVzenVkcnVja2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcHJpbnQgYSB3b3Jrb3JkZXIgaW4gdGhlIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gcmVzZXQgYSBjaGFuZ2UgYW5kIGl0cyB3b3Jrb3JkZXJzIGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGluIGRlciAiQ2hhbmdlIFpvb20iIEFuc2ljaHQgZGVyIEFnZW50ZW4tT2JlcmZsw6RjaGUgZWluZW4gIE1lbnUgTGluayBkZXIgZXMgZXJsYXVidCBkZW4gQ2hhbmdlIHVuZCBzZWluZSBXb3Jrb3JkZXJzIHp1csO8Y2t6dXNldHplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIHNob3cgdGhlIGludm9sdmVkIHBlcnNvbnMgaW4gYSBjaGFuZ2UsIGluIHRoZSB6b29tIHZpZXcgb2YgdGhlIGNoYW5nZSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSBjaGFuZ2UgaGlzdG9yeSAocmV2ZXJzZSBvcmRlcmVkKSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gw4RuZGVydW5nc2Nocm9uaWsgKHVtZ2VrZWhydGUgUmVpaGVuZm9sZ2UpIGluIGRlciBBZ2VudGVub2JlcmZsw6RjaGUgYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXRlIE1hY2hpbmUnfSA9ICdTdGF0ZSBNYWNoaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0b3JlcyBjaGFuZ2UgYW5kIHdvcmtvcmRlciBpZHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGVtcGxhdGUgaWQsIHdoaWxlIGEgdXNlciBpcyBlZGl0aW5nIGEgdGVtcGxhdGUuJ30gPQogICAgICAgICdTcGVpY2hlcnQgQ2hhbmdlIHVuZCBXb3Jrb3JkZXIgSUQgdW5kIGRpZSB6dWdlaMO2cmlnZSBWb3JsYWdlbiBJRCB3w6RocmVuZCBlaW4gQmVudXR6ZXIgZGFzIFRlbXBsYXRlIGJlYXJiZWl0ZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rha2UgV29ya29yZGVyJ30gPSAnQXJiZWl0c2F1ZnRyYWcgw7xiZXJuZWhtZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFrZSBXb3Jrb3JkZXIuJ30gPSAnQXJiZWl0c2F1ZnRyYWcgw7xiZXJuZWhtZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Rha2UgdGhlIHdvcmtvcmRlci4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgT3ZlcnZpZXcnfSA9ICdWb3JsYWdlbsO8YmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgdHlwZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIGlkZW50aWZpZXIgZm9yIGEgY2hhbmdlLCBlLmcuIENoYW5nZSMsIE15Q2hhbmdlIy4gVGhlIGRlZmF1bHQgaXMgQ2hhbmdlIy4nfSA9CiAgICAgICAgJ0NoYW5nZS1JZGVudGlmaWthdG9yLCB6LiBCLiBDaGFuZ2UjLCBNZWluQ2hhbmdlIy4gQWxzIFN0YW5kYXJkIHdpcmQgQ2hhbmdlIyB2ZXJ3ZW5kZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZSBpZGVudGlmaWVyIGZvciBhIHdvcmtvcmRlciwgZS5nLiBXb3Jrb3JkZXIjLCBNeVdvcmtvcmRlciMuIFRoZSBkZWZhdWx0IGlzIFdvcmtvcmRlciMuJ30gPQogICAgICAgICdXb3Jrb3JkZXItSWRlbnRpZmlrYXRvciwgei4gQi4gV29ya29yZGVyIywgTWVpbmVXb3Jrb3JkZXIjLiBBbHMgU3RhbmRhcmQgd2lyZCBXb3Jrb3JkZXIjIHZlcndlbmRldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBBQ0wgbW9kdWxlIHJlc3RyaWN0cyB0aGUgdXN1YWdlIG9mIHRoZSB0aWNrZXQgdHlwZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3lzY29uZmlnIG9wdGlvbiBcJ0lUU01DaGFuZ2U6OkFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc1wnLCB0byB1c2VycyBvZiB0aGUgZ3JvdXBzIGFzIGRlZmluZWQgaW4gIklUU01DaGFuZ2U6OlJlc3RyaWN0VGlja2V0VHlwZXM6Okdyb3VwcyIuIEFzIHRoaXMgQUNMIGNvdWxkIGNvbGxpZGUgd2l0aCBvdGhlciBBQ0xzIHdoaWNoIGFyZSBhbHNvIHJlbGF0ZWQgdG8gdGhlIHRpY2tldCB0eXBlLCB0aGlzIHN5c2NvbmZpZyBvcHRpb24gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgc2hvdWxkIG9ubHkgYmUgYWN0aXZhdGVkIGlmIG5lZWRlZC4nfSA9CiAgICAgICAgJ0RpZXNlcyBBQ0wgTW9kdWwgYmVzY2hyw6Rua3QgZGllIE51dHp1bmcgdm9uIFRpY2tldHR5cGVuIHdlbGNoZSBpbiBkZXIgU3lzdGVta29uZmlndXJhdGlvbiB1bnRlciAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBkZWZpbmllcnQgc2luZCwgenUgZGVuIE51dHplcm4gZGVyIEdydXBwZW4gYXVzICJJVFNNQ2hhbmdlOjpSZXN0cmljdFRpY2tldFR5cGVzOjpHcm91cHMiLiBXZWlsIGRpZXNlIEFDTCBtaXQgYW5kZXJlbiBBQ0xcJ3MsIHdlbGNoZSBnZWJ1bmRlbiBhbiBkZW4gVGlja2V0dHlwZW4gc2luZCwga29sbGlkaWVyZW4ga8O2bm50ZSwgaXN0IGRpZXNlIE9wdGlvbiBzdGFuZGFyZG3DpMOfaWcgZGVha3RpdmllcnQgdW5kIHNvbGx0ZSBudXIgbmFjaCBCZWRhcmYgYWt0aXZpZXJ0IHdlcmRlbi4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgU2xvdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUeXBlcyBvZiB0aWNrZXRzLCB3aGVyZSBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBhIGxpbmsgdG8gYWRkIGEgY2hhbmdlIHdpbGwgYmUgZGlzcGxheWVkLid9ID0KICAgICAgICAnVHlwZW4gZGVyIFRpY2tldHMsIGluIGRlbmVuIGltIFRpY2tldC1ab29tIGVpbiBMaW5rIGFuZ2V6ZWlndCB3aXJkLCB1bSBlaW5lbiBDaGFuZ2UgenUgZXJzdGVsbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2VyIFNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgQWRkIChmcm9tIHRlbXBsYXRlKS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIEFkZC4nfSA9ICdBcmJlaXRzYXVmdHJhZyBoaW56dWbDvGdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIEFnZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgRGVsZXRlLid9ID0gJ0FyYmVpdHNhdWZ0cmFnIGzDtnNjaGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgRWRpdC4nfSA9ICdBcmJlaXRzYXVmdHJhZyBiZWFyYmVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgSGlzdG9yeSBab29tLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3Jrb3JkZXIgSGlzdG9yeS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIFJlcG9ydC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIFpvb20nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29ya29yZGVyIFpvb20uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J29uY2UnfSA9ICdlaW5tYWxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydyZWd1bGFybHknfSA9ICdyZWdlbG3DpMOfaWcnOwoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBhY3Rpb24/JywKICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uZGl0aW9uPycsCiAgICAnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGV4cHJlc3Npb24/JywKICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgbm90aWZpY2F0aW9uIGxhbmd1YWdlPycsCiAgICAnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIG5vdGlmaWNhdGlvbj8nLAogICAgJ05vJywKICAgICdPaycsCiAgICAnUGxlYXNlIGVudGVyIGF0IGxlYXN0IG9uZSBzZWFyY2ggdmFsdWUgb3IgKiB0byBmaW5kIGFueXRoaW5nLicsCiAgICAnU2V0dGluZ3MnLAogICAgJ1N1Ym1pdCcsCiAgICAnWWVzJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE2IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGVnb3J5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDSVBBbGxvY2F0ZScgKSB7CgogICAgICAgICMgZ2V0IG9wdGlvbiBsaXN0cwogICAgICAgIG15ICVPYmplY3RPcHRpb247CiAgICAgICAgJE9iamVjdE9wdGlvbntDYXRlZ29yeUxpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNhdGVnb3J5JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpQcmlvcml0eScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIFByaW9yaXR5SURzIG9mIHRoZSBtYXRyaXgKICAgICAgICBteSAkQWxsb2NhdGVEYXRhOwogICAgICAgIGZvciBteSAkSW1wYWN0SUQgKCBzb3J0IGtleXMgJXsgJE9iamVjdE9wdGlvbntJbXBhY3RMaXN0fSB9ICkgewoKICAgICAgICAgICAgQ0FURUdPUllJRDoKICAgICAgICAgICAgZm9yIG15ICRDYXRlZ29yeUlEICggc29ydCBrZXlzICV7ICRPYmplY3RPcHRpb257Q2F0ZWdvcnlMaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGZvcm0gcGFyYW0KICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAiUHJpb3JpdHlJRCIgLiAkSW1wYWN0SUQgLiAnLScgLiAkQ2F0ZWdvcnlJRAogICAgICAgICAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgICAgICAgICBuZXh0IENBVEVHT1JZSUQgaWYgISRQcmlvcml0eUlEOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZURhdGEtPnskSW1wYWN0SUR9LT57JENhdGVnb3J5SUR9ID0gJFByaW9yaXR5SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGFsbG9jYXRpb25zCiAgICAgICAgJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICAgICAgQWxsb2NhdGVEYXRhID0+ICRBbGxvY2F0ZURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG9wdGlvbiBsaXN0cwogICAgICAgIG15ICVPYmplY3RPcHRpb247CiAgICAgICAgJE9iamVjdE9wdGlvbntDYXRlZ29yeUxpc3R9ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNhdGVnb3J5JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpQcmlvcml0eScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsb2NhdGlvbiBkYXRhCiAgICAgICAgbXkgJEFsbG9jYXRlRGF0YSA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkQWxsb2NhdGVNYXRyaXg7CgogICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bMF0tPntPYmplY3RUeXBlfSA9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSW1wYWN0JykgLiAnIC8gJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2F0ZWdvcnknKTsKICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WzBdLT57Q2xhc3N9ID0gJ0hlYWRlckNvbHVtbkRlc2NyaXB0aW9uJzsKCiAgICAgICAgIyBnZW5lcmF0ZSB0YWJsZSBkZXNjcmlwdGlvbiAoSW1wYWN0KQogICAgICAgIG15ICRDb3VudGVySW1wYWN0ID0gMTsKICAgICAgICBmb3IgbXkgJEltcGFjdCAoCiAgICAgICAgICAgIHNvcnQgeyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGF9IGNtcCAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXJJbXBhY3RdLT5bMF0tPntPYmplY3RUeXBlfSAgID0gJ0ltcGFjdCc7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRDb3VudGVySW1wYWN0XS0+WzBdLT57SW1wYWN0S2V5fSAgICA9ICRJbXBhY3Q7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRDb3VudGVySW1wYWN0XS0+WzBdLT57T2JqZWN0T3B0aW9ufSA9ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH17JEltcGFjdH07CiAgICAgICAgICAgICRDb3VudGVySW1wYWN0Kys7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlIGRlc2NyaXB0aW9uIChDYXRlZ29yeSkKICAgICAgICBteSAkQ291bnRlckNhdGVnb3J5ID0gMTsKICAgICAgICBmb3IgbXkgJENhdGVnb3J5ICgKICAgICAgICAgICAgc29ydCB7ICRPYmplY3RPcHRpb257Q2F0ZWdvcnlMaXN0fS0+eyRhfSBjbXAgJE9iamVjdE9wdGlvbntDYXRlZ29yeUxpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0NhdGVnb3J5TGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyQ2F0ZWdvcnldLT57T2JqZWN0VHlwZX0gICA9ICdDYXRlZ29yeSc7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXJDYXRlZ29yeV0tPntDYXRlZ29yeUtleX0gID0gJENhdGVnb3J5OwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyQ2F0ZWdvcnldLT57T2JqZWN0T3B0aW9ufSA9ICRPYmplY3RPcHRpb257Q2F0ZWdvcnlMaXN0fXskQ2F0ZWdvcnl9OwogICAgICAgICAgICAkQ291bnRlckNhdGVnb3J5Kys7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGNvbnRlbnQKICAgICAgICBmb3IgbXkgJFJvdyAoIDEgLi4gKCAkQ291bnRlckltcGFjdCAtIDEgKSApIHsKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCAxIC4uICggJENvdW50ZXJDYXRlZ29yeSAtIDEgKSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qga2V5cwogICAgICAgICAgICAgICAgbXkgJEltcGFjdEtleSAgID0gJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlswXS0+e0ltcGFjdEtleX07CiAgICAgICAgICAgICAgICBteSAkQ2F0ZWdvcnlLZXkgPSAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb2x1bW5dLT57Q2F0ZWdvcnlLZXl9OwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG9wdGlvbiBzdHJpbmcKICAgICAgICAgICAgICAgIG15ICRPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcgLiAkSW1wYWN0S2V5IC4gJy0nIC4gJENhdGVnb3J5S2V5LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJE9iamVjdE9wdGlvbntQcmlvcml0eUxpc3R9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RLZXl9eyRDYXRlZ29yeUtleX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0tPntPcHRpb25TdHJnfSA9ICRPcHRpb25TdHJnOwogICAgICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlskQ29sdW1uXS0+e0NsYXNzfSAgICAgID0gJ0NvbnRlbnQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFJvdyAoIDAgLi4gJCN7JEFsbG9jYXRlTWF0cml4fSApIHsKCiAgICAgICAgICAgIGlmICggJFJvdyAhPSAwICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ1JvdycgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCAwIC4uICQjeyAkQWxsb2NhdGVNYXRyaXgtPlskUm93XSB9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIHJvdyBpcyBoZWFkZXIKICAgICAgICAgICAgICAgIGlmICggJFJvdyA9PSAwICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb2x1bW4gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDb2x1bW5EZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckNlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WyRDb2x1bW5dLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb2x1bW4gaXMgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvbkNlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDb250ZW50Q2VsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlskQ29sdW1uXSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01DaGFuZ2VDSVBBbGxvY2F0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbi5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb24ucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTYgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaGFzaCB3aXRoIGZlZWRiYWNrIHRvIHRoZSB1c2VyCiAgICBteSAlTm90aWZpY2F0aW9uOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICROb3RpZmljYXRpb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSAkUmljaFRleHQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIGlmICggJFJpY2hUZXh0ICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkUmljaFRleHQgPSAwOwogICAgfQoKICAgICMgc2V0IGNvbnRlbnQgdHlwZSBmb3Igbm90aWZpY2F0aW9ucwogICAgbXkgJENvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgaWYgKCRSaWNoVGV4dCkgewogICAgICAgICRDb250ZW50VHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJERhdGEgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlR2V0KCBJRCA9PiAkSUQgKTsKCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgQWN0aW9uTGFiZWwgPT4gJ0VkaXQnLAogICAgICAgICAgICBSaWNoVGV4dCAgICA9PiAkUmljaFRleHQsCiAgICAgICAgICAgICV7JERhdGF9LAogICAgICAgICk7CgogICAgICAgIG15ICRTdGF0dXMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhdHVzJyApIHx8ICcnOwoKICAgICAgICBpZiAoICRTdGF0dXMgZXEgJ1VwZGF0ZWQnICkgewogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKAogICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiB1cGRhdGVkIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTdGF0dXMgZXEgJ0FkZGVkJyApIHsKICAgICAgICAgICAgJU5vdGlmaWNhdGlvbiA9ICgKICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gQWRkZWQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CgogICAgICAgICMgZ2V0IHNjYWxhciBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoSUQgTmFtZSBFdmVudElEIENvbW1lbnQgVmFsaWRJRCBBdHRyaWJ1dGUgUnVsZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFycmF5IHBhcmFtZXRlcnMKICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50SURzfSA9IFsKICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1JlY2lwaWVudElEcycgKQogICAgICAgIF07CgogICAgICAgICMgZ2V0IG1lc3NhZ2UgcGFyYW1ldGVycyBmb3IgYWdlbnRzIGFuZCBjdXN0b21lcnMgYW5kIGVhY2ggcHJlc2VudCBsYW5ndWFnZQogICAgICAgIGZvciBteSAkVHlwZSAocXcoQWdlbnQgQ3VzdG9tZXIpKSB7CgogICAgICAgICAgICBteSBATGFuZ3VhZ2VJRHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkVHlwZSAuICdfTGFuZ3VhZ2VJRCcgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBzdWJqZWN0IGFuZCBib2R5IGZvciBhbGwgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUeXBlIC4gJ18nIC4gJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUeXBlIC4gJ18nIC4gJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIG5vdGlmaWNhdGlvbgogICAgICAgIGlmICggJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZVVwZGF0ZSglR2V0UGFyYW0pICkgewoKICAgICAgICAgICAgbXkgJENvbnRpbnVlQWZ0ZXJTYXZlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApOwoKICAgICAgICAgICAgaWYgKCRDb250aW51ZUFmdGVyU2F2ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1DaGFuZ2U7SUQ9JEdldFBhcmFte0lEfTtTdGF0dXM9VXBkYXRlZCIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3RhdHVzPVVwZGF0ZWQiICk7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYW4gZXJyb3Igb2NjdXJlZCAtPiBzaG93IG5vdGlmaWNhdGlvbgogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdFZGl0JywKICAgICAgICAgICAgICAgIFJpY2hUZXh0ICAgID0+ICRSaWNoVGV4dCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGQnICkgewogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgICAgPT4gJ0FkZCcsCiAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdBZGQnLAogICAgICAgICAgICBSaWNoVGV4dCAgICA9PiAkUmljaFRleHQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CgogICAgICAgICMgZ2V0IHNjYWxhciBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoSUQgTmFtZSBFdmVudElEIENvbW1lbnQgVmFsaWRJRCBBdHRyaWJ1dGUgUnVsZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFycmF5IHBhcmFtZXRlcnMKICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50SURzfSA9IFsKICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1JlY2lwaWVudElEcycgKQogICAgICAgIF07CgogICAgICAgICMgZ2V0IG1lc3NhZ2UgcGFyYW1ldGVycyBmb3IgYWdlbnRzIGFuZCBjdXN0b21lcnMgYW5kIGVhY2ggcHJlc2VudCBsYW5ndWFnZQogICAgICAgIGZvciBteSAkVHlwZSAocXcoQWdlbnQgQ3VzdG9tZXIpKSB7CgogICAgICAgICAgICBteSBATGFuZ3VhZ2VJRHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkVHlwZSAuICdfTGFuZ3VhZ2VJRCcgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBzdWJqZWN0IGFuZCBib2R5IGZvciBhbGwgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICAgICAgbXkgJEJvZHkgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZUlEfSA9IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQ29udGVudFR5cGUsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUeXBlIC4gJ18nIC4gJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUeXBlIC4gJ18nIC4gJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGlmaWNhdGlvbgogICAgICAgIG15ICROZXdJRCA9ICROb3RpZmljYXRpb25PYmplY3QtPk5vdGlmaWNhdGlvblJ1bGVBZGQoJUdldFBhcmFtKTsKICAgICAgICBpZiAoJE5ld0lEKSB7CgogICAgICAgICAgICBteSAkQ29udGludWVBZnRlclNhdmUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICk7CgogICAgICAgICAgICBpZiAoJENvbnRpbnVlQWZ0ZXJTYXZlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPUNoYW5nZTtJRD0kTmV3SUQ7U3RhdHVzPUFkZGVkIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdGF0dXM9QWRkZWQiICk7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYW4gZXJyb3Igb2NjdXJlZCAtPiBzaG93IG5vdGlmaWNhdGlvbgogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQWRkJywKICAgICAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdBZGQnLAogICAgICAgICAgICAgICAgUmljaFRleHQgICAgPT4gJFJpY2hUZXh0LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGUgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlRGVsZXRlKAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJERlbGV0ZSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgTm90aWZpY2F0aW9uQ29weQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ05vdGlmaWNhdGlvbkNvcHknICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBOb3RpZmljYXRpb24gZGF0YQogICAgICAgIG15ICREYXRhID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZUdldCgKICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRGF0YSkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVW5rbm93biBub3RpZmljYXRpb24gJXMhJywgJEdldFBhcmFte0lEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IE5vdGlmaWNhdGlvbiBuYW1lCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbk5hbWUgPQogICAgICAgICAgICAkRGF0YS0+e05hbWV9CiAgICAgICAgICAgIC4gJyAoJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ29weScpCiAgICAgICAgICAgIC4gJyknOwoKICAgICAgICAjIG90aGVyd2lzZSBzYXZlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0byBvdmVydmlldyBzY3JlZW4KICAgICAgICBteSAkTmV3Tm90aWZpY2F0aW9uSUQgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlQWRkKAogICAgICAgICAgICAleyREYXRhfSwKICAgICAgICAgICAgTmFtZSA9PiAkTm90aWZpY2F0aW9uTmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgY2FuJ3QgY3JlYXRlCiAgICAgICAgaWYgKCAhJE5ld05vdGlmaWNhdGlvbklEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlcmUgd2FzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBub3RpZmljYXRpb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KCk7CgogICAgICAgIG15ICRTdGF0dXMgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhdHVzJyApIHx8ICcnOwoKICAgICAgICBpZiAoICRTdGF0dXMgZXEgJ1VwZGF0ZWQnICkgewogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKAogICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiB1cGRhdGVkIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTdGF0dXMgZXEgJ0FkZGVkJyApIHsKICAgICAgICAgICAgJU5vdGlmaWNhdGlvbiA9ICgKICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gQWRkZWQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICBpZiAoJU5vdGlmaWNhdGlvbikgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCVOb3RpZmljYXRpb24pIHx8ICcnOwogICAgfQogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb24nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCiMgc2hvdyB0aGUgZWRpdCBtYXNrIGZvciBhIG5vdGlmaWNhdGlvbiBydWxlCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwogICAgbXkgJFZhbGlkT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgJFBhcmFte1ZhbGlkT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgKCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKVswXSwKICAgICAgICBTb3J0ICAgICAgID0+ICdOdW1lcmljS2V5JywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzUwcGMnLAogICAgKTsKICAgICRQYXJhbXtFdmVudE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+SGlzdG9yeVR5cGVMaXN0KCBVc2VySUQgPT4gMSApIHx8IFtdLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRXZlbnRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtFdmVudElEfSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgVHJhbnNsYXRhYmxlID0+IDAsCiAgICApOwogICAgJFBhcmFte1JlY2lwaWVudE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24nKS0+UmVjaXBpZW50TGlzdCggVXNlcklEID0+IDEgKSB8fCBbXSwKICAgICAgICBOYW1lICAgICAgID0+ICdSZWNpcGllbnRJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZWNpcGllbnRJRHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYycsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIFZhbHVlID0+IDEKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBkaWZmZXJlbnQgd2lkZ2V0IGNvbnRhaW5lcnMgZm9yIGFnZW50IGFuZCBjdXN0b21lciBub3RpZmljYXRpb25zCiAgICBmb3IgbXkgJFR5cGUgKHF3KEFnZW50IEN1c3RvbWVyKSkgewoKICAgICAgICAjIHNob3cgdGhlIHdpZGdldCBjb250YWluZXIgZm9yIHRoaXMgdHlwZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25UeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGxhbmd1YWdlIGlkcyBmcm9tIG1lc3NhZ2UgcGFyYW1ldGVyLCB1c2UgRW5nbGlzaCBpZiBubyBtZXNzYWdlIGlzIGdpdmVuCiAgICAgICAgIyBtYWtlIHN1cmUgRW5nbGlzaCBpcyB0aGUgZmlyc3QgbGFuZ3VhZ2UKICAgICAgICBteSBATGFuZ3VhZ2VJRHM7CiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9ICkgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57ZW59ICkgewogICAgICAgICAgICAgICAgcHVzaCBATGFuZ3VhZ2VJRHMsICdlbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTEFOR1VBR0VJRDoKICAgICAgICAgICAgZm9yIG15ICRMYW5ndWFnZUlEICggc29ydCBrZXlzICV7ICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBMQU5HVUFHRUlEIGlmICRMYW5ndWFnZUlEIGVxICdlbic7CiAgICAgICAgICAgICAgICBwdXNoIEBMYW5ndWFnZUlEcywgJExhbmd1YWdlSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEBMYW5ndWFnZUlEcyA9ICgnZW4nKTsKICAgICAgICB9CgogICAgICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlcyAgICAgICAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdEZWZhdWx0VXNlZExhbmd1YWdlcycpIH07CiAgICAgICAgbXkgJU9yaWdpbmFsRGVmYXVsdFVzZWRMYW5ndWFnZXMgPSAlRGVmYXVsdFVzZWRMYW5ndWFnZXM7CgogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICAgICAjIGZvcm1hdCB0aGUgY29udGVudCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQgdHlwZQogICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfSA9fiBte3RleHRcL3BsYWlufXhtc2kKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgcmVmb3JtYXQgZnJvbSBIVE1MIHRvIHBsYWluCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Q29udGVudFR5cGV9CiAgICAgICAgICAgICAgICAgICAgJiYgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH14bXNpCiAgICAgICAgICAgICAgICAgICAgJiYgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Qm9keX0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlSUR9LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2VJRH0tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9ICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCAgICAgICAgID0+ICRMYW5ndWFnZUlELAogICAgICAgICAgICAgICAgICAgIExhbmd1YWdlICAgICAgICAgICA9PiAkRGVmYXVsdFVzZWRMYW5ndWFnZXN7JExhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3RTZXJ2ZXJFcnJvciA9PiAkUGFyYW17ICRUeXBlIC4gJ18nIC4gJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBCb2R5U2VydmVyRXJyb3IgICAgPT4gJFBhcmFteyAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IHRoZSBidXR0b24gdG8gcmVtb3ZlIGEgbm90aWZpY2F0aW9uIG9ubHkgaWYgaXQgaXMgbm90IHRoZSBFbmdsaXNoIG5vdGlmaWNhdGlvbgogICAgICAgICAgICBpZiAoICRMYW5ndWFnZUlEIG5lICdlbicgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZVJlbW92ZUJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkVHlwZSAuICdfJyAuICRMYW5ndWFnZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRlbGV0ZSBsYW5ndWFnZSBmcm9tIGRyb3AtZG93biBsaXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93bgogICAgICAgICAgICBkZWxldGUgJERlZmF1bHRVc2VkTGFuZ3VhZ2VzeyRMYW5ndWFnZUlEfTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBsYW5ndWFnZSBhZGQgZHJvcGRvd24KICAgICAgICAkUGFyYW17TGFuZ3VhZ2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEZWZhdWx0VXNlZExhbmd1YWdlcywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRUeXBlIC4gJ0xhbmd1YWdlQWRkJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVzUwcGMgTGFuZ3VhZ2VBZGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0xhbmd1YWdlT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJU9yaWdpbmFsRGVmYXVsdFVzZWRMYW5ndWFnZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVHlwZSAuICdMYW5ndWFnZU9yaWcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICA9PiAwLAoKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZUFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIHNob3cgYSB0YWJsZSBvZiBub3RpZmljYXRpb24gcnVsZXMKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uQWRkJyApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgIFZhbHVlID0+IDEsCiAgICApOwoKICAgICMgZ2V0IG5vdGlmaWNhdGlvbiBvYmplY3QKICAgIG15ICROb3RpZmljYXRpb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJyk7CgogICAgbXkgJFJ1bGVJRHMgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlTGlzdCgpIHx8IFtdOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBmb3IgbXkgJFJ1bGVJRCAoIEB7JFJ1bGVJRHN9ICkgewoKICAgICAgICBteSAkRGF0YSA9ICROb3RpZmljYXRpb25PYmplY3QtPk5vdGlmaWNhdGlvblJ1bGVHZXQoIElEID0+ICRSdWxlSUQgKTsKICAgICAgICBteSAkUmVjaXBpZW50cyA9IGpvaW4gJywgJywgQHsgJERhdGEtPntSZWNpcGllbnRzfSB8fCBbXSB9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICREYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICV7JERhdGF9LAogICAgICAgICAgICAgICAgUmVjaXBpZW50cyA9PiAkUmVjaXBpZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTVN0YXRlTWFjaGluZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pbklUU01TdGF0ZU1hY2hpbmUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTYgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01TdGF0ZU1hY2hpbmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3I7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBzdG9yZSBjb21tb25seSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0KICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhTdGF0ZUlEIE5leHRTdGF0ZUlEIENsYXNzIFN0YXR1cykpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyByZWFkIHRoZSBjb25maWcsCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNU3RhdGVNYWNoaW5lOjpPYmplY3QiKSB8fCB7fTsKCiAgICAjIHByZXBhcmUgdGhlIGNvbmZpZyBmb3IgbG9va3VwIGJ5IGNsYXNzCiAgICAjIHRoZSBoYXNoIGtleXMgb2YgJENvbmZpZyBhcmUgbm90IHNpZ25pZmljYW50CiAgICAkU2VsZi0+e0NvbmZpZ0J5Q2xhc3N9ID0ge307CiAgICBmb3IgbXkgJEhhc2hSZWYgKCB2YWx1ZXMgJXskQ29uZmlnfSApIHsKICAgICAgICAkU2VsZi0+e0NvbmZpZ0J5Q2xhc3N9LT57ICRIYXNoUmVmLT57Q2xhc3N9IH0gPSAkSGFzaFJlZjsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZSBmcm9tIG5hbWUgdG8gY2xhc3MgYW5kIHZpY2UgdmVyc2EKICAgIGlmICggJEdldFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkR2V0UGFyYW17Q2xhc3NTaG9ydE5hbWV9ID0gJFNlbGYtPntDb25maWdCeUNsYXNzfS0+eyAkR2V0UGFyYW17Q2xhc3N9IH0tPntOYW1lfTsKICAgIH0KCiAgICAjIGVycm9yIG1lc3NhZ2VzIGFyZSBhZGRlZCB0byB0aGlzIHZhcmlhYmxlCiAgICBteSAkTm90ZSA9ICcnOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0ZVRyYW5zaXRpb25VcGRhdGUnICkgewoKICAgICAgICAjIHByb3ZpZGUgZm9ybSBmb3IgY2hhbmdpbmcgdGhlIG5leHQgc3RhdGUKICAgICAgICByZXR1cm4gJFNlbGYtPl9TdGF0ZVRyYW5zaXRpb25VcGRhdGVQYWdlR2V0KAogICAgICAgICAgICBBY3Rpb24gPT4gJ1N0YXRlVHJhbnNpdGlvblVwZGF0ZScsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRlVHJhbnNpdGlvbkFkZCcgKSB7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0NsYXNzfSApIHsKICAgICAgICAgICAgJEVycm9yeydDbGFzc0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBwcm92aWRlIGZvcm0gZm9yIGFkZGluZyBhIHN0YXRlIHRyYW5zaXRpb24KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RhdGVUcmFuc2l0aW9uQWRkUGFnZUdldCgKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnU3RhdGVUcmFuc2l0aW9uQWRkJywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RhdGVUcmFuc2l0aW9uRGVsZXRlJyApIHsKCiAgICAgICAgIyBzaG93IGNvbmZpcm1hdGlvbiBwYWdlIGZvciBzdGF0ZSBkZWxldGlvbgogICAgICAgIHJldHVybiAkU2VsZi0+X1N0YXRlVHJhbnNpdGlvbkRlbGV0ZVBhZ2VHZXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnU3RhdGVUcmFuc2l0aW9uRGVsZXRlJywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBCdWlsZCBkcm9wLWRvd24gZm9yIHRoZSBjbGFzcyBzZWxlY3Rpb24gb24gdGhlIGxlZnQgc2lkZS4KICAgIG15IEBBcnJIYXNoUmVmOwogICAgZm9yIG15ICRDbGFzcyAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NvbmZpZ0J5Q2xhc3N9IH0gKSB7CiAgICAgICAgcHVzaCBAQXJySGFzaFJlZiwgewogICAgICAgICAgICBLZXkgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbHVlID0+ICRDbGFzcywKICAgICAgICB9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJEdldFBhcmFte0NsYXNzU2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcQEFyckhhc2hSZWYsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtDbGFzc30sCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgVzEwMHBjICcgLiAoICRFcnJvcntDbGFzc0ludmFsaWR9IHx8ICcnICksCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICApOwoKICAgICMgcGVyZm9ybSBhY3Rpb25zCiAgICBteSAkQWN0aW9uSXNPayA9IDE7CgogICAgIyBnZXQgc3RhdGUgbWFjaGluZSBvYmplY3QKICAgIG15ICRTdGF0ZU1hY2hpbmVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpOwoKICAgICMgdXBkYXRlIHRoZSBuZXh0IHN0YXRlIG9mIGEgc3RhdGUgdHJhbnNpdGlvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRlVHJhbnNpdGlvblVwZGF0ZUFjdGlvbicgKSB7CgogICAgICAgICMgcGFyYW1zIHNwZWNpZmljIHRvIFN0YXRlVHJhbnNpdGlvblVwZGF0ZQogICAgICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhOZXdOZXh0U3RhdGVJRCkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KCiAgICAgICAgIyBVcGRhdGUgdGhlIHN0YXRlIHRyYW5zaXRpb24KICAgICAgICAkQWN0aW9uSXNPayA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJEdldFBhcmFte0NsYXNzfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVJRCAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBOZXdOZXh0U3RhdGVJRCA9PiAkR2V0UGFyYW17TmV3TmV4dFN0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY3Rpb25Jc09rKSB7CgogICAgICAgICAgICBteSAkQ29udGludWVBZnRlclNhdmUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICk7CgogICAgICAgICAgICBpZiAoJENvbnRpbnVlQWZ0ZXJTYXZlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVN0YXRlVHJhbnNpdGlvblVwZGF0ZTtDbGFzcz0kR2V0UGFyYW17Q2xhc3N9O1N0YXRlSUQ9JEdldFBhcmFte1N0YXRlSUR9O05leHRTdGF0ZUlEPSRHZXRQYXJhbXtOZXdOZXh0U3RhdGVJRH07U3RhdHVzPVVwZGF0ZWQiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N0YXR1cz1VcGRhdGVkIiApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0ZVRyYW5zaXRpb25BZGRBY3Rpb24nICkgewoKICAgICAgICBteSAkSXNWYWxpZCA9IDE7CiAgICAgICAgJUVycm9yID0gKCk7CgogICAgICAgICMgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVtcHR5IHN0cmluZyAnJyBhbmQgdGhlIHN0cmluZyAnMCcuCiAgICAgICAgIyAnJyBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSB3YXMgc2VsZWN0ZWQsIHdoaWNoIGlzIGludmFsaWQKICAgICAgICAjICcwJyBpbmRpY2F0ZWQgJypTVEFSVConIG9yICcqRU5EKicKICAgICAgICBpZiAoICRHZXRQYXJhbXtTdGF0ZUlEfSBlcSAnJyApIHsKICAgICAgICAgICAgJElzVmFsaWQgPSAwOwogICAgICAgICAgICAkRXJyb3J7J1N0YXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte05leHRTdGF0ZUlEfSBlcSAnJyApIHsKICAgICAgICAgICAgJElzVmFsaWQgPSAwOwogICAgICAgICAgICAkRXJyb3J7J05leHRTdGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkSXNWYWxpZCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RhdGVUcmFuc2l0aW9uQWRkUGFnZUdldCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnU3RhdGVUcmFuc2l0aW9uQWRkJywKICAgICAgICAgICAgICAgIE5vdGUgICA9PiAkTm90ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCiAgICAgICAgJEFjdGlvbklzT2sgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRHZXRQYXJhbXtDbGFzc30sCiAgICAgICAgICAgIFN0YXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJEFjdGlvbklzT2spIHsKICAgICAgICAgICAgbXkgJENvbnRpbnVlQWZ0ZXJTYXZlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApOwoKICAgICAgICAgICAgaWYgKCRDb250aW51ZUFmdGVyU2F2ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1TdGF0ZVRyYW5zaXRpb25VcGRhdGU7Q2xhc3M9JEdldFBhcmFte0NsYXNzfTtTdGF0ZUlEPSRHZXRQYXJhbXtTdGF0ZUlEfTtOZXh0U3RhdGVJRD0kR2V0UGFyYW17TmV4dFN0YXRlSUR9O1N0YXR1cz1BZGRlZCIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3RhdHVzPUFkZGVkIiApOwoKICAgICAgICB9CgogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRlVHJhbnNpdGlvbkRlbGV0ZUFjdGlvbicgKSB7CgogICAgICAgICMgRGVsZXRlIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCiAgICAgICAgJEFjdGlvbklzT2sgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25EZWxldGUoCiAgICAgICAgICAgIFN0YXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyBsaXN0IG9mIHN0YXRlIHRyYW5zaXRpb25zIGZvciB0aGUgY2xhc3MKICAgIGlmICggJEdldFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkTm90ZSAuPSAkQWN0aW9uSXNPayA/ICcnIDogJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3U3RhdGVUcmFuc2l0aW9uc1BhZ2VHZXQoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgTm90ZSA9PiAkTm90ZSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlc2VudCBhIGxpc3Qgb2YgYWxsIGNvbmZpZ3VyZWQgY2xhc3NlcywgYXMgdGhlIGNsYXNzIGlzIG5vdCBrbm93biB5ZXQKICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3Q2xhc3Nlc1BhZ2VHZXQoCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIE5vdGUgPT4gJE5vdGUsCiAgICApOwp9CgojIHByb3ZpZGUgYSBmb3JtIGZvciBjaGFuZ2luZyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRyYW5zaXRpb24Kc3ViIF9TdGF0ZVRyYW5zaXRpb25VcGRhdGVQYWdlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc3RhdGUgbWFjaGluZSBvYmplY3QKICAgIG15ICRTdGF0ZU1hY2hpbmVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpOwoKICAgICRQYXJhbXtTdGF0ZU5hbWV9ID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgQ2xhc3MgICA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgIFN0YXRlSUQgPT4gJFBhcmFte1N0YXRlSUR9LAogICAgKSB8fCAnKlNUQVJUKic7CgogICAgIyBBcnJheUhhc2hSZWYgd2l0aCBhbGwgc3RhdGVzIGZvciBhIGNhdGFsb2cgY2xhc3MKICAgIG15ICRBbGxTdGF0ZXNBcnJheUhhc2hSZWYgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxpc3QoCiAgICAgICAgQ2xhc3MgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBBZGQgdGhlIHNwZWNpYWwgZmluYWwgc3RhdGUKICAgIHB1c2ggQHskQWxsU3RhdGVzQXJyYXlIYXNoUmVmfSwKICAgICAgICB7CiAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgIFZhbHVlID0+ICcqRU5EKicKICAgICAgICB9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte05leHRTdGF0ZVNlbGVjdGlvblN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRBbGxTdGF0ZXNBcnJheUhhc2hSZWYsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3TmV4dFN0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1N0YXRlVHJhbnNpdGlvblVwZGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkU3RhdHVzID0gJFBhcmFteydTdGF0dXMnfSB8fCAnJzsKICAgIG15ICVOb3RpZmljYXRpb247CiAgICBpZiAoICRTdGF0dXMgZXEgJ1VwZGF0ZWQnICkgewogICAgICAgICVOb3RpZmljYXRpb24gPSAoCiAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdTdGF0ZSBUcmFuc2l0aW9uIFVwZGF0ZWQhJyksCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFN0YXR1cyBlcSAnQWRkZWQnICkgewogICAgICAgICVOb3RpZmljYXRpb24gPSAoCiAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdTdGF0ZSBUcmFuc2l0aW9uIEFkZGVkIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBIVE1MCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgIGlmICglTm90aWZpY2F0aW9uKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoJU5vdGlmaWNhdGlvbikgfHwgJyc7CiAgICB9CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIHByb3ZpZGUgYSBmb3JtIGZvciBhZGRpbmcgYSBuZXcgc3RhdGUgdHJhbnNpdGlvbgpzdWIgX1N0YXRlVHJhbnNpdGlvbkFkZFBhZ2VHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIEFycmF5SGFzaFJlZiB3aXRoIGFsbCBzdGF0ZXMgZm9yIGEgY2F0YWxvZyBjbGFzcwogICAgbXkgJEFsbFN0YXRlc0FycmF5SGFzaFJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyktPlN0YXRlTGlzdCgKICAgICAgICBDbGFzcyAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEFkZCB0aGUgc3BlY2lhbCBmaW5hbCBzdGF0ZQogICAgcHVzaCBAeyRBbGxTdGF0ZXNBcnJheUhhc2hSZWZ9LCB7CiAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgIFZhbHVlID0+ICcqU1RBUlQqJywKICAgIH07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGRyb3Bkb3duIG1lbnUsIHdoZXJlIHRoZSBzdGF0ZSBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFkZGl0aW9uCiAgICAkUGFyYW17U3RhdGVTZWxlY3Rpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRBbGxTdGF0ZXNBcnJheUhhc2hSZWYsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YXRlSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRQYXJhbXtTdGF0ZUludmFsaWR9IHx8ICcnICksCiAgICApOwoKICAgICMgZHJvcGRvd24gbWVudSwgd2hlcmUgdGhlIG5leHQgc3RhdGUgY2FuIGJlIHNlbGVjdGVkIGZvciBhZGRpdGlvbgogICAgJEFsbFN0YXRlc0FycmF5SGFzaFJlZi0+Wy0xXSA9IHsKICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgVmFsdWUgPT4gJypFTkQqJywKICAgIH07CiAgICAkUGFyYW17TmV4dFN0YXRlU2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkQWxsU3RhdGVzQXJyYXlIYXNoUmVmLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRQYXJhbXtOZXh0U3RhdGVJbnZhbGlkfSB8fCAnJyApLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3RhdGVUcmFuc2l0aW9uQWRkJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIHByb3ZpZGUgYSBmb3JtIGZvciBjb25maXJtaW5nIHRoZSBkZWxldGlvbiBvZiBhIHN0YXRlIHRyYW5zaXRpb24Kc3ViIF9TdGF0ZVRyYW5zaXRpb25EZWxldGVQYWdlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIG1hY2hpbmUgb2JqZWN0CiAgICBteSAkU3RhdGVNYWNoaW5lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKTsKCiAgICAkUGFyYW17U3RhdGVOYW1lfSA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICkgfHwgJypTVEFSVConOwoKICAgICRQYXJhbXtOZXh0U3RhdGVOYW1lfSA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICApIHx8ICcqRU5EKic7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3RhdGVUcmFuc2l0aW9uRGVsZXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIFNob3cgYSB0YWJsZSBvZiBhbGwgc3RhdGUgdHJhbnNpdGlvbnMKc3ViIF9PdmVydmlld1N0YXRlVHJhbnNpdGlvbnNQYWdlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3U3RhdGVUcmFuc2l0aW9ucycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBzdGF0ZSBtYWNoaW5lIG9iamVjdAogICAgbXkgJFN0YXRlTWFjaGluZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyk7CgogICAgIyBsb29rdXAgZm9yIHN0YXRlIG5hbWVzCiAgICBteSAlTmV4dFN0YXRlSURzID0gJXsgJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uTGlzdCggQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSApIHx8IHt9IH07CgogICAgIyBsb29wIG92ZXIgYWxsICdTdGF0ZScgYW5kICdOZXh0U3RhdGUnIHBhaXJzIGZvciB0aGUgY2F0YWxvZyBjbGFzcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVOZXh0U3RhdGVJRHMgKSB7CgogICAgICAgIGZvciBteSAkTmV4dFN0YXRlSUQgKCBAeyAkTmV4dFN0YXRlSURzeyRTdGF0ZUlEfSB9ICkgewoKICAgICAgICAgICAgIyBzdGF0ZSBuYW1lcwogICAgICAgICAgICBteSAkU3RhdGVOYW1lID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgICAgICAgICBTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgICAgICApIHx8ICcqU1RBUlQqJzsKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZU5hbWUgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICApIHx8ICcqRU5EKic7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlVHJhbnNpdGlvblJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBTdGF0ZU5hbWUgICAgID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgICA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlTmFtZSA9PiAkTmV4dFN0YXRlTmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG9ubHkgc2hvdyB0aGUgZGVsZXRlIGxpbmsgaWYgaXQgaXMgbm90IHRoZSBzdGFydCBzdGF0ZQogICAgICAgICAgICBpZiAoICRTdGF0ZU5hbWUgbmUgJypTVEFSVConICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVUcmFuc2l0aW9uRGVsZXRlQnV0dG9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU5hbWUgICAgID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBOZXh0U3RhdGVOYW1lID0+ICROZXh0U3RhdGVOYW1lLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIFNob3cgYSBsaXN0IG9mIHJlbGV2YW50IG9iamVjdCB0eXBlcwpzdWIgX092ZXJ2aWV3Q2xhc3Nlc1BhZ2VHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZFN0YXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NlcycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIHJlYWQgdGhlIGNvbmZpZywKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCIpIHx8IHt9OwoKICAgICMgcHJlcGFyZSB0aGUgY29uZmlnIGZvciBsb29rdXAgYnkgY2xhc3MKICAgICMgdGhlIGhhc2gga2V5cyBvZiAkQ29uZmlnIGFyZSBub3Qgc2lnbmlmaWNhbnQKICAgICRTZWxmLT57Q29uZmlnQnlDbGFzc30gPSB7fTsKICAgIGZvciBteSAkSGFzaFJlZiAoIHZhbHVlcyAleyRDb25maWd9ICkgewogICAgICAgICRTZWxmLT57Q29uZmlnQnlDbGFzc30tPnsgJEhhc2hSZWYtPntDbGFzc30gfSA9ICRIYXNoUmVmOwogICAgfQoKICAgIGZvciBteSAkQ2xhc3MgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntDb25maWdCeUNsYXNzfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzZXNSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzU2hvcnROYW1lID0+ICRTZWxmLT57Q29uZmlnQnlDbGFzc30tPnskQ2xhc3N9LT57TmFtZX0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkU3RhdHVzID0gJFBhcmFteydTdGF0dXMnfSB8fCAnJzsKICAgIG15ICVOb3RpZmljYXRpb247CiAgICBpZiAoICRTdGF0dXMgZXEgJ1VwZGF0ZWQnICkgewogICAgICAgICVOb3RpZmljYXRpb24gPSAoCiAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdTdGF0ZSBUcmFuc2l0aW9uIFVwZGF0ZWQhJyksCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFN0YXR1cyBlcSAnQWRkZWQnICkgewogICAgICAgICVOb3RpZmljYXRpb24gPSAoCiAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdTdGF0ZSBUcmFuc2l0aW9uIEFkZGVkIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBIVE1MCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgIGlmICglTm90aWZpY2F0aW9uKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoJU5vdGlmaWNhdGlvbikgfHwgJyc7CiAgICB9CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluUmVxdWVzdEZvcm0ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFkbWluUmVxdWVzdEZvcm0ucG0sdiAxLjkgMjAxOS8wNi8yMyAxMzo0MTozMSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluUmVxdWVzdEZvcm07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUVycm9yID0gKCk7CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFZhbGlkT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkUmVxdWVzdE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdCcpOwogICAgbXkgJFJlcXVlc3RGaWVsZHNPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGaWVsZHMnKTsKICAgIG15ICRSZXF1ZXN0Rm9ybU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Rm9ybScpOwogICAgbXkgJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtQmxvY2snKTsKICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkUmVxdWVzdENhdGVnb3JpZXNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdENhdGVnb3JpZXMnKTsKICAgIG15ICRUeXBlT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CiAgICBteSAkVGVtcGxhdGVPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXF1ZXN0RWRpdCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtICgKICAgICAgICAgICAgcXcoUmVxdWVzdElEIFJlcXVlc3RGb3JtSUQgUmVxdWVzdEZvcm1CbG9ja0lEIFJlcXVlc3RGb3JtVmFsdWVJRCBSZXF1ZXN0Rm9ybVZhbHVlVGV4dCBSZXF1ZXN0Rm9ybUxhYmVsKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaHRtbCBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgUmVxdWVzdElEICAgICAgICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgICAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSwKICAgICAgICAgICAgUmVxdWVzdEZvcm1CbG9ja0lEICAgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0sCiAgICAgICAgICAgIFJlcXVlc3RGb3JtVmFsdWVJRCAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybVZhbHVlSUR9LAogICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlVGV4dCA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1WYWx1ZVRleHR9LAogICAgICAgICAgICBSZXF1ZXN0Rm9ybUxhYmVsICAgICA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1MYWJlbH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyAgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1JlcXVlc3RTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJUdldFBhcmFtOwoKICAgICAgICBteSBAU2hvd0NvbmZpZ0l0ZW1zID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Nob3dDb25maWdJdGVtJyApOwogICAgICAgICRHZXRQYXJhbXtTaG93Q29uZmlnSXRlbXN9ID0gJyc7CiAgICAgICAgZm9yIG15ICRTaG93Q29uZmlnSXRlbXMgKEBTaG93Q29uZmlnSXRlbXMpIHsKICAgICAgICAgICAgJEdldFBhcmFte1Nob3dDb25maWdJdGVtc30gLj0gIiRTaG93Q29uZmlnSXRlbXMsIjsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkUGFyYW0gKAoKICAgICAgICAgICAgcXcoUmVxdWVzdElEIE5hbWUgUXVldWUgVHlwZSBOZXdPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQgVGVtcGxhdGVJRCBSZXF1ZXN0Q2F0ZWdvcmllc0lEIFZhbGlkSUQgQ29tbWVudCBJbWFnZUlEIFN1YmplY3QgU2hvd0F0dGFjaG1lbnQgUmVxdWVzdEdyb3VwIFN1YmplY3RDaGFuZ2VhYmxlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICBpZiAoICEkR2V0UGFyYW17TmFtZX0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnTmFtZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICdObyBzdWJqZWN0IHlldCc7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvciApIHsKCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWV9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VHlwZX0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUZW1wbGF0ZUlEfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld093bmVySUR9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtJbWFnZUlEfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtJbWFnZUlEfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0NvbW1lbnR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0NvbW1lbnR9ID0gJy0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtSZXF1ZXN0R3JvdXB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RHcm91cH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Nob3dDb25maWdJdGVtc30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2hvd0NvbmZpZ0l0ZW19ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTaG93Q29uZmlnSXRlbX0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZXF1ZXN0SUR9ICkgewoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1JlcXVlc3RDYXRlZ29yaWVzSUR9ICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVLYXRlZ29yaWVuSUQKICAgICAgICAgICAgICAgICAgICAgICAgPSAkUmVxdWVzdENhdGVnb3JpZXNPYmplY3QtPlJlcXVlc3RDYXRlZ29yaWVzVGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJFRlbXBsYXRlS2F0ZWdvcmllbklEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0Q2F0ZWdvcmllc1RlbXBsYXRlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJlcXVlc3RDYXRlZ29yaWVzT2JqZWN0LT5SZXF1ZXN0Q2F0ZWdvcmllc1RlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgICAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RDYXRlZ29yaWVzSUQgPT4gJEdldFBhcmFte1JlcXVlc3RDYXRlZ29yaWVzSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RDYXRlZ29yaWVzVGVtcGxhdGVJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUmVxdWVzdENhdGVnb3JpZXNPYmplY3QtPlJlcXVlc3RDYXRlZ29yaWVzVGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdENhdGVnb3JpZXNJRCA9PiAkR2V0UGFyYW17UmVxdWVzdENhdGVnb3JpZXNJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0SUQgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdFVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3RDaGFuZ2VhYmxlID0+ICRHZXRQYXJhbXtTdWJqZWN0Q2hhbmdlYWJsZX0sCiAgICAgICAgICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgICAgPT4gJEdldFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgSW1hZ2VJRCAgICAgICAgICAgPT4gJEdldFBhcmFte0ltYWdlSUR9LAogICAgICAgICAgICAgICAgICAgIFNob3dDb25maWdJdGVtICAgID0+ICRHZXRQYXJhbXtTaG93Q29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgU2hvd0NvbmZpZ0l0ZW1zICAgPT4gJEdldFBhcmFte1Nob3dDb25maWdJdGVtc30sCiAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgICAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBTaG93QXR0YWNobWVudCAgICA9PiAkR2V0UGFyYW17U2hvd0F0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RHcm91cCAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0R3JvdXB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RJRCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17UXVldWV9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0Q2hhbmdlYWJsZSA9PiAkR2V0UGFyYW17U3ViamVjdENoYW5nZWFibGV9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgICAgICA9PiAkR2V0UGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgID0+ICRHZXRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgICAgICAgICBJbWFnZUlEICAgICAgICAgICA9PiAkR2V0UGFyYW17SW1hZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgU2hvd0NvbmZpZ0l0ZW0gICAgPT4gJEdldFBhcmFte1Nob3dDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgICAgICBTaG93Q29uZmlnSXRlbXMgICA9PiAkR2V0UGFyYW17U2hvd0NvbmZpZ0l0ZW1zfSwKICAgICAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCAgICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFNob3dBdHRhY2htZW50ICAgID0+ICRHZXRQYXJhbXtTaG93QXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEdyb3VwICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdElEfSA9ICRSZXF1ZXN0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdENhdGVnb3JpZXNJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RDYXRlZ29yaWVzVGVtcGxhdGVJRAogICAgICAgICAgICAgICAgICAgICAgICA9ICRSZXF1ZXN0Q2F0ZWdvcmllc09iamVjdC0+UmVxdWVzdENhdGVnb3JpZXNUZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgICAgICA9PiAkUmVxdWVzdElELAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Q2F0ZWdvcmllc0lEID0+ICRHZXRQYXJhbXtSZXF1ZXN0Q2F0ZWdvcmllc0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0KICAgICAgICAgICAgJEVycm9ye01lc3NhZ2V9CiAgICAgICAgICAgID8gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiAkRXJyb3J7TWVzc2FnZX0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgIElERXJyb3IgICA9PiAkR2V0UGFyYW17SURFcnJvcn0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXF1ZXN0RmllbGREZWxldGUnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbSAoCgogICAgICAgICAgICBxdyhSZXF1ZXN0SUQgUmVxdWVzdEZvcm1JRCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRTdWNlc3MKICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGaWVsZERlbGV0ZSggUmVxdWVzdEZvcm1JRCA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRH0sICk7CiAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtSUR9ID0gJyc7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgIFJlcXVlc3RJRCA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXF1ZXN0RmllbGRCbG9ja0RlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtICgKCiAgICAgICAgICAgIHF3KFJlcXVlc3RGb3JtVmFsdWVJRCBSZXF1ZXN0Rm9ybUJsb2NrSUQgUmVxdWVzdElEIFJlcXVlc3RGb3JtSUQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjZXNzID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGaWVsZEJsb2NrRGVsZXRlKAogICAgICAgICAgICBSZXF1ZXN0Rm9ybUJsb2NrSUQgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0sCiAgICAgICAgKTsKICAgICAgICAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSA9ICcnOwoKICAgICAgICAjIGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyAgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ZpZWxkc1NhdmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbSAoCiAgICAgICAgICAgIHF3KFJlcXVlc3RGb3JtSUQgUmVxdWVzdElEIEZlbGRJRCBSZXF1aXJlZEZpZWxkIE9yZGVyIE1vdmVPdmVyIFZhbGlkSUQgVG9vbFRpcFVuZGVyKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICBpZiAoICEkR2V0UGFyYW17UmVxdWVzdElEfSApIHsKICAgICAgICAgICAgJEVycm9yeydSZXF1ZXN0SURJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3IgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1JlcXVlc3RGb3JtSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtSUQgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgRmVsZElEICAgICAgICA9PiAkR2V0UGFyYW17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEZpZWxkID0+ICRHZXRQYXJhbXtSZXF1aXJlZEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVG9vbFRpcCAgICAgICA9PiAkR2V0UGFyYW17TW92ZU92ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIFRvb2xUaXBVbmRlciAgPT4gJEdldFBhcmFte1Rvb2xUaXBVbmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtSUQgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtQWRkKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgRmVsZElEICAgICAgICA9PiAkR2V0UGFyYW17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEZpZWxkID0+ICRHZXRQYXJhbXtSZXF1aXJlZEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVG9vbFRpcCAgICAgICA9PiAkR2V0UGFyYW17TW92ZU92ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIFRvb2xUaXBVbmRlciAgPT4gJEdldFBhcmFte1Rvb2xUaXBVbmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkUmVxdWVzdElER2V0ID0gJEdldFBhcmFte1JlcXVlc3RJRH07CiAgICAgICAgbXkgJElERXJyb3IgICAgICA9ICRHZXRQYXJhbXtJREVycm9yfTsKICAgICAgICAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAlUGFyYW0gICAgPSAoKTsKCiAgICAgICAgIyBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPQogICAgICAgICAgICAkRXJyb3J7TWVzc2FnZX0KICAgICAgICAgICAgPyAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgIEluZm8gICAgID0+ICRFcnJvcntNZXNzYWdlfSwKICAgICAgICAgICAgKQogICAgICAgICAgICA6ICcnOwoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgIFJlcXVlc3RJRCA9PiAkUmVxdWVzdElER2V0LAogICAgICAgICAgICBJREVycm9yICAgPT4gJElERXJyb3IsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBzYXZlIGJsb2NrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRmllbGRzU2F2ZUJsb2NrJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIG15IEBBZ2VudGVuUm9sbGVuQXJyYXk7CiAgICAgICAgZm9yIG15ICRQYXJhbSAoCiAgICAgICAgICAgIHF3KFJlcXVlc3RGb3JtSUQgUmVxdWVzdElEIFJlcXVlc3RGb3JtQmxvY2tJRCBSZXF1ZXN0Rm9ybVZhbHVlSUQgRmVsZElEQmxvY2sgUmVxdWlyZWRGaWVsZEJsb2NrIE9yZGVyQmxvY2sgTW92ZU92ZXJCbG9jayAgVmFsaWRJRCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte1JlcXVlc3RJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnUmVxdWVzdElESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gZXJyb3JzIG9jY3VycmVkCiAgICAgICAgaWYgKCAhJUVycm9yICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUJsb2NrSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtQmxvY2tJRCA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtQmxvY2tJRCA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtVmFsdWVJRCA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1WYWx1ZUlEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgRmVsZElEICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGZWxkSURCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRGaWVsZCAgICAgID0+ICRHZXRQYXJhbXtSZXF1aXJlZEZpZWxkQmxvY2t9LAogICAgICAgICAgICAgICAgICAgIE9yZGVyICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17T3JkZXJCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgVG9vbFRpcCAgICAgICAgICAgID0+ICRHZXRQYXJhbXtNb3ZlT3ZlckJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtQmxvY2tJRCA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrQWRkKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgICAgICA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1WYWx1ZUlEID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybVZhbHVlSUR9LAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICAgICAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICBGZWxkSUQgICAgICAgICAgICAgPT4gJEdldFBhcmFte0ZlbGRJREJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEZpZWxkICAgICAgPT4gJEdldFBhcmFte1JlcXVpcmVkRmllbGRCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlckJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBUb29sVGlwICAgICAgICAgICAgPT4gJEdldFBhcmFte01vdmVPdmVyQmxvY2t9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUJsb2NrSUQgZXEgIkV4aXN0cyIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJREVycm9yfSA9ICRSZXF1ZXN0Rm9ybUJsb2NrSUQ7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0gICAgICA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0gICAgICA9ICRSZXF1ZXN0Rm9ybUJsb2NrSUQ7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJREVycm9yfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJFJlcXVlc3RJREdldCA9ICRHZXRQYXJhbXtSZXF1ZXN0SUR9OwogICAgICAgIG15ICRJREVycm9yICAgICAgPSAkR2V0UGFyYW17SURFcnJvcn07CiAgICAgICAgJUdldFBhcmFtID0gKCk7CiAgICAgICAgJVBhcmFtICAgID0gKCk7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0KICAgICAgICAgICAgJEVycm9ye01lc3NhZ2V9CiAgICAgICAgICAgID8gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiAkRXJyb3J7TWVzc2FnZX0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJFJlcXVlc3RJREdldCwKICAgICAgICAgICAgSURFcnJvciAgID0+ICRJREVycm9yLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUVycm9yLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyAgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ09yZGVyRWRpdCcgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtICgKICAgICAgICAgICAgcXcoUmVxdWVzdElEIFJlcXVlc3RGb3JtSURzIFJlcXVlc3RGb3JtSURzQmxvY2spCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSBAUmVxdWVzdEZvcm1JREFycmF5ID0gc3BsaXQoIC8sLywgJEdldFBhcmFte1JlcXVlc3RGb3JtSURzfSApOwogICAgICAgIG15ICRPcmRlckdldCA9ICcnOwogICAgICAgIGZvciBteSAkTmV3VmFsdWUgKEBSZXF1ZXN0Rm9ybUlEQXJyYXkpIHsKICAgICAgICAgICAgJE9yZGVyR2V0ID0gJ09yZGVyJyAuICROZXdWYWx1ZTsKICAgICAgICAgICAgJEdldFBhcmFteyRPcmRlckdldH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkT3JkZXJHZXQgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybU9yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkTmV3VmFsdWUsCiAgICAgICAgICAgICAgICBPcmRlciAgICAgICAgID0+ICRHZXRQYXJhbXskT3JkZXJHZXR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAUmVxdWVzdEZvcm1JREJsb2NrQXJyYXkgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRHNCbG9ja30gKTsKICAgICAgICBteSAkT3JkZXJHZXRCbG9jayA9ICcnOwogICAgICAgIGZvciBteSAkTmV3VmFsdWUgKEBSZXF1ZXN0Rm9ybUlEQmxvY2tBcnJheSkgewogICAgICAgICAgICAkT3JkZXJHZXRCbG9jayA9ICdPcmRlckJsb2NrJyAuICROZXdWYWx1ZTsKICAgICAgICAgICAgJEdldFBhcmFteyRPcmRlckdldEJsb2NrfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRPcmRlckdldEJsb2NrICk7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybU9yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkTmV3VmFsdWUsCiAgICAgICAgICAgICAgICBPcmRlciAgICAgICAgID0+ICRHZXRQYXJhbXskT3JkZXJHZXRCbG9ja30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgIFJlcXVlc3RJRCA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSGVhZGxpbmVTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIG15IEBBZ2VudGVuUm9sbGVuQXJyYXk7CiAgICAgICAgZm9yIG15ICRQYXJhbSAoCiAgICAgICAgICAgIHF3KFJlcXVlc3RGb3JtSUQgUmVxdWVzdElEIEhlYWRsaW5lIEhlYWRBcnQgRGVzY3JpcHRpb25GaWVsZCBPcmRlcikKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte1JlcXVlc3RJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnUmVxdWVzdElESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gZXJyb3JzIG9jY3VycmVkCiAgICAgICAgaWYgKCAhJUVycm9yICkgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVxdWVzdEZvcm1JRCA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1IZWFkbGluZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgIEhlYWRsaW5lICAgICAgPT4gJEdldFBhcmFte0hlYWRsaW5lfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBPcmRlciAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtSUQgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtSGVhZGxpbmVBZGQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgSGVhZGxpbmUgICAgPT4gJEdldFBhcmFte0hlYWRsaW5lfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb25GaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICAgICAgPT4gJEdldFBhcmFte09yZGVyfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRH0gPSAnJzsKICAgICAgICAkR2V0UGFyYW17SGVhZGxpbmV9ICAgICAgPSAnJzsKICAgICAgICAkR2V0UGFyYW17SGVhZEFydH0gICAgICAgPSAnJzsKICAgICAgICAkR2V0UGFyYW17T3JkZXJ9ICAgICAgICAgPSAnJzsKCiAgICAgICAgIyBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPQogICAgICAgICAgICAkRXJyb3J7TWVzc2FnZX0KICAgICAgICAgICAgPyAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgIEluZm8gICAgID0+ICRFcnJvcntNZXNzYWdlfSwKICAgICAgICAgICAgKQogICAgICAgICAgICA6ICcnOwoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgIFJlcXVlc3RJRCA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgSURFcnJvciAgID0+ICRHZXRQYXJhbXtJREVycm9yfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVFcnJvciwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdIZWFkbGluZVNhdmVCbG9jaycgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBteSBAQWdlbnRlblJvbGxlbkFycmF5OwogICAgICAgIGZvciBteSAkUGFyYW0gKAogICAgICAgICAgICBxdyhSZXF1ZXN0Rm9ybVZhbHVlSUQgUmVxdWVzdEZvcm1CbG9ja0lEIFJlcXVlc3RGb3JtSUQgUmVxdWVzdElEIEhlYWRsaW5lQmxvY2sgSGVhZEFydEJsb2NrIERlc2NyaXB0aW9uRmllbGRCbG9jayBPcmRlckJsb2NrKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICBpZiAoICEkR2V0UGFyYW17UmVxdWVzdElEfSApIHsKICAgICAgICAgICAgJEVycm9yeydSZXF1ZXN0SURJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3IgKSB7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUJsb2NrSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFJlcXVlc3RGb3JtSUQgPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1IZWFkbGluZUJsb2NrVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtQmxvY2tJRCA9PiAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlSUQgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0sCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgSGVhZGxpbmUgICAgICAgICAgID0+ICRHZXRQYXJhbXtIZWFkbGluZUJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9uRmllbGRCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlckJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0Rm9ybUlEID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtSGVhZGxpbmVCbG9ja0FkZCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlSUQgPT4gJEdldFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0sCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgSGVhZGxpbmUgICAgICAgICAgID0+ICRHZXRQYXJhbXtIZWFkbGluZUJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9uRmllbGRCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtPcmRlckJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0gPSAnJzsKICAgICAgICAkR2V0UGFyYW17SGVhZGxpbmVCbG9ja30gICAgICA9ICcnOwogICAgICAgICRHZXRQYXJhbXtPcmRlckJsb2NrfSAgICAgICAgID0gJyc7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0KICAgICAgICAgICAgJEVycm9ye01lc3NhZ2V9CiAgICAgICAgICAgID8gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiAkRXJyb3J7TWVzc2FnZX0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgIElERXJyb3IgICA9PiAkR2V0UGFyYW17SURFcnJvcn0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkFkZCcgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgIGxpc3QKICAgICAgICBteSAlUmVxdWVzdExpc3QgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdExpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFZhbGlkT2JqZWN0LT5WYWxpZExpc3QoKTsKCiAgICAgICAgaWYgKCVSZXF1ZXN0TGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJFJlcXVlc3RJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsgbGMgJFJlcXVlc3RMaXN0eyRhfSBjbXAgbGMgJFJlcXVlc3RMaXN0eyRifSB9CiAgICAgICAgICAgICAgICBrZXlzICVSZXF1ZXN0TGlzdAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNsYSBkYXRhCiAgICAgICAgICAgICAgICBteSAlUmVxdWVzdERhdGEgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdEdldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJFJlcXVlc3RJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBsaXN0IHJvdwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVJlcXVlc3REYXRhLCBWYWxpZCA9PiAkVmFsaWRMaXN0eyAkUmVxdWVzdERhdGF7VmFsaWRJRH0gfSwgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5SZXF1ZXN0Rm9ybScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFza05ldyB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRWYWxpZE9iamVjdCAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgIG15ICRSZXF1ZXN0T2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdCcpOwogICAgbXkgJFJlcXVlc3RGaWVsZHNPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0RmllbGRzJyk7CiAgICBteSAkUmVxdWVzdEZvcm1PYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtJyk7CiAgICBteSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtQmxvY2snKTsKICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRSZXF1ZXN0Q2F0ZWdvcmllc09iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdENhdGVnb3JpZXMnKTsKICAgIG15ICRUeXBlT2JqZWN0ICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkVGVtcGxhdGVPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CiAgICBteSAkVXNlck9iamVjdCAgICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRSZXF1ZXN0Q2F0ZWdvcmllc0ljb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdENhdGVnb3JpZXNJY29uJyk7CiAgICBteSAkUmVxdWVzdEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RHcm91cCcpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJVJlcXVlc3REYXRhOwogICAgJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0gPSAkUGFyYW17UmVxdWVzdElEfSB8fCAnJzsKICAgICRSZXF1ZXN0RGF0YXtJREVycm9yfSAgID0gJFBhcmFte0lERXJyb3J9ICAgfHwgJyc7CgogICAgaWYgKCAkUmVxdWVzdERhdGF7UmVxdWVzdElEfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIHNsYSBkYXRhCiAgICAgICAgJVJlcXVlc3REYXRhID0gJFJlcXVlc3RPYmplY3QtPlJlcXVlc3RHZXQoCiAgICAgICAgICAgIFJlcXVlc3RJRCA9PiAkUmVxdWVzdERhdGF7UmVxdWVzdElEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFZhbGlkT2JqZWN0LT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICRSZXF1ZXN0RGF0YXtWYWxpZE9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkUmVxdWVzdERhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgKTsKCiAgICBteSAlU3ViamVjdENoYW5nZWFibGVZZXNObyA9ICggJzEnID0+ICd5ZXMnLCAnMicgPT4gJ25vJyApOwogICAgJFJlcXVlc3REYXRhe1N1YmplY3RDaGFuZ2VhYmxlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgID0+ICdTdWJqZWN0Q2hhbmdlYWJsZScsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVN1YmplY3RDaGFuZ2VhYmxlWWVzTm8sCiAgICAgICAgQ2xhc3MgICAgICA9PiAiTW9kZXJuaXplIiwKICAgICAgICBTZWxlY3RlZElEID0+ICRSZXF1ZXN0RGF0YXtTdWJqZWN0Q2hhbmdlYWJsZX0gfHwgMiwKICAgICk7CgogICAgbXkgJVF1ZXVlTGlzdCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAkUmVxdWVzdERhdGF7UXVldWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiIC4gKCAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0gfHwgJycgKSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3REYXRhe1F1ZXVlfSwKICAgICk7CgogICAgIyBidWlsZCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50TGVuZ3RoID0+IDUwLAogICAgICAgIFRlbXBsYXRlVHlwZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgKTsKCiAgICAkUmVxdWVzdERhdGF7VGVtcGxhdGVTZWxlY3Rpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZW1wbGF0ZUlEJywKICAgICAgICBEYXRhICAgICAgICAgPT4gJFRlbXBsYXRlTGlzdCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3REYXRhe1RlbXBsYXRlSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICBteSAlUmVxdWVzdEdyb3VwTGlzdCA9ICRSZXF1ZXN0R3JvdXBPYmplY3QtPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApOwogICAgJFJlcXVlc3REYXRhe1JlcXVlc3RHcm91cFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUmVxdWVzdEdyb3VwTGlzdCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1JlcXVlc3RHcm91cCcsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICJNb2Rlcm5pemUiLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVxdWVzdERhdGF7UmVxdWVzdEdyb3VwfSwKICAgICk7CgogICAgIyBidWlsZCBSZXF1ZXN0Q2F0ZWdvcmllcyBkcm9wZG93bgogICAgbXkgJVJlcXVlc3RDYXRlZ29yaWVzTGlzdCA9ICRSZXF1ZXN0Q2F0ZWdvcmllc09iamVjdC0+UmVxdWVzdENhdGVnb3JpZXNMaXN0KAogICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZUthdGVnb3JpZW5JRCA9ICcnOwogICAgaWYgKCAkUmVxdWVzdERhdGF7UmVxdWVzdElEfSApIHsKICAgICAgICAkVGVtcGxhdGVLYXRlZ29yaWVuSUQgPSAkUmVxdWVzdENhdGVnb3JpZXNPYmplY3QtPlJlcXVlc3RDYXRlZ29yaWVzVGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgJFJlcXVlc3REYXRhe1JlcXVlc3RDYXRlZ29yaWVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgID0+ICdSZXF1ZXN0Q2F0ZWdvcmllc0lEJywKICAgICAgICBEYXRhICAgICAgID0+IFwlUmVxdWVzdENhdGVnb3JpZXNMaXN0LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFRlbXBsYXRlS2F0ZWdvcmllbklELAogICAgICAgIENsYXNzICAgICAgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiCiAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1JlcXVlc3RDYXRlZ29yaWVzSURJbnZhbGlkfSB8fCAnJyApLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICBteSAlU2hvd0F0dGFjaG1lbnRZZXNObyA9ICggJzEnID0+ICd5ZXMnLCAnMicgPT4gJ25vJyApOwogICAgJFJlcXVlc3REYXRhe1Nob3dBdHRhY2htZW50U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgID0+ICdTaG93QXR0YWNobWVudCcsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3dBdHRhY2htZW50WWVzTm8sCiAgICAgICAgQ2xhc3MgICAgICA9PiAiTW9kZXJuaXplIiwKICAgICAgICBTZWxlY3RlZElEID0+ICRSZXF1ZXN0RGF0YXtTaG93QXR0YWNobWVudH0gfHwgMSwKICAgICk7CgogICAgbXkgJU5ld093bmVyID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgICRSZXF1ZXN0RGF0YXtPd25lclN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTmV3T3duZXIsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSIsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRSZXF1ZXN0RGF0YXtPd25lcklEfSwKICAgICk7CgogICAgbXkgJU5ld1Jlc3BvbnNpYmxlID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgICRSZXF1ZXN0RGF0YXtSZXNwb25zaWJsZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTmV3UmVzcG9uc2libGUsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSIsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRSZXF1ZXN0RGF0YXtSZXNwb25zaWJsZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgZWRpdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RGF0YSwgfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUmVxdWVzdEVkaXQnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RGF0YSwgfSwKICAgICk7CgogICAgIyBzaG93cyBoZWFkZXIKICAgIGlmICggJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKCiAgICAgICAgbXkgJVR5cGVMaXN0ID0gJFR5cGVPYmplY3QtPlR5cGVMaXN0KCBWYWxpZCA9PiAxICk7CgogICAgICAgICRSZXF1ZXN0RGF0YXtUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZUxpc3QsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3REYXRhe1R5cGV9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3REYXRhLCB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNob3dDb25maWdJdGVtID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb25maWdJdGVtWm9vbVNlYXJjaCcpOwogICAgaWYgKCAkU2hvd0NvbmZpZ0l0ZW0gJiYgJFNob3dDb25maWdJdGVtID49IDEgKSB7CgogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgICAgICA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFNob3dDb25maWdJdGVtcyA9IHNwbGl0KCAvLC8sICRSZXF1ZXN0RGF0YXtTaG93Q29uZmlnSXRlbXN9ICk7CiAgICAgICAgJFJlcXVlc3REYXRhe1Nob3dDb25maWdJdGVtU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwleyRDbGFzc0xpc3R9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Nob3dDb25maWdJdGVtJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA3LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIiIsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gXEBTaG93Q29uZmlnSXRlbXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZWRpdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93Q29uZmlnSXRlbScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RGF0YSwgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVMaXN0ID0gJFJlcXVlc3RDYXRlZ29yaWVzSWNvbk9iamVjdC0+UmVxdWVzdENhdGVnb3JpZXNJY29uTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICk7CgogICAgIyBpZiB0aGVyZSBhcmUgYW55IHJlc3VsdHMsIHRoZXkgYXJlIHNob3duCiAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIGZvciBteSAkSUQgKCBzb3J0IHsgJExpc3R7JGF9IGNtcCAkTGlzdHskYn0gfSBrZXlzICVMaXN0ICkgewogICAgICAgICAgICBteSAlRGF0YSA9ICRSZXF1ZXN0Q2F0ZWdvcmllc0ljb25PYmplY3QtPlJlcXVlc3RDYXRlZ29yaWVzSWNvbkdldCgKICAgICAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID0gZW5jb2RlX2Jhc2U2NCggJERhdGF7Q29udGVudH0gKTsKICAgICAgICAgICAgaWYgKCAkSUQgPT0gJFJlcXVlc3REYXRhe0ltYWdlSUR9ICkgewogICAgICAgICAgICAgICAgJERhdGF7Q2hlY2tlZEltYWdlSUR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICAgICAgICAgICREYXRhe0NvbG9ySW1hZ2VJRH0gICA9ICcjODBkMmExIDJweCBzb2xpZDsgYm9yZGVyLXJhZGl1czogM3B4Oyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXtDb2xvckltYWdlSUR9ID0gJyM4MGQyYTEgMnB4IHNvbGlkOyBib3JkZXItcmFkaXVzOiAzcHg7JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeUljb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVEYXRhLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEJlZ2lubiBuZXVlcyBGZWxkCiAgICBteSAlUmVxdWVzdEZpZWxkczsKICAgIG15ICVSZXF1ZXN0RmllbGRzTGlzdCA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzQWRtaW5MaXN0KAogICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVSZXF1ZXN0Rm9ybUVkaXQ7CiAgICBpZiAoICRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSApIHsKCiAgICAgICAgI2dldCBSZXF1ZXN0Rm9ybQogICAgICAgICVSZXF1ZXN0Rm9ybUVkaXQKICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtR2V0KCBSZXF1ZXN0Rm9ybUlEID0+ICRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSwgKTsKICAgIH0KCiAgICBteSAlUmVxdWVzdEZvcm1FZGl0SGVhZDsKICAgIGlmICggJFJlcXVlc3RGb3JtRWRpdHtIZWFkbGluZX0gKSB7CiAgICAgICAgJVJlcXVlc3RGb3JtRWRpdEhlYWQgPSAlUmVxdWVzdEZvcm1FZGl0OwogICAgICAgICVSZXF1ZXN0Rm9ybUVkaXQgICAgID0gKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmVxdWVzdEZpZWxkc3tPcmRlcn0gICAgPSAkUmVxdWVzdEZvcm1FZGl0e09yZGVyfTsKICAgICAgICAkUmVxdWVzdEZpZWxkc3tNb3ZlT3Zlcn0gPSAkUmVxdWVzdEZvcm1FZGl0e1Rvb2xUaXB9OwogICAgICAgICVSZXF1ZXN0Rm9ybUVkaXRIZWFkICAgICA9ICgpOwogICAgfQoKICAgICRSZXF1ZXN0RmllbGRze05ldWVzRmVsZFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVSZXF1ZXN0RmllbGRzTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRmVsZElEJywKICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRSZXF1ZXN0Rm9ybUVkaXR7RmVsZElEfSwKICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgIE1heCAgICAgICAgICAgID0+IDUwMCwKICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgIFNvcnQgICAgICAgICAgID0+ICdJbmRpdmlkdWFsS2V5JywKICAgICAgICBTb3J0SW5kaXZpZHVhbCA9PiBbICcoRHJvcGRvd24pJywgJyhUZXh0KScsICcoTXVsdGlzZWxlY3QpJywgJyhUZXh0QXJlYSknLCAnKERhdGUpJyBdCiAgICApOwoKICAgIGlmICggJFJlcXVlc3RGb3JtRWRpdHtUb29sVGlwVW5kZXJ9ICkgewogICAgICAgICRSZXF1ZXN0RmllbGRze1Rvb2xUaXBVbmRlckNoZWNrZWR9ID0gImNoZWNrZWQ9XCJjaGVja2VkXCIiOwogICAgfQoKICAgICRSZXF1ZXN0RmllbGRze1ZhbGlkT3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRSZXF1ZXN0Rm9ybUVkaXR7VmFsaWRJRH0sCiAgICApOwoKICAgIG15ICVGcmFnZUxpc3QgPSAoICcwJyA9PiAnLScsICcxJyA9PiAnamEnLCAnMicgPT4gJ25laW4nLCApOwogICAgaWYgKCAkUmVxdWVzdEZvcm1FZGl0e0hlYWRsaW5lfSApIHsKICAgICAgICAkUmVxdWVzdEZpZWxkc3tSZXF1aXJlZEZpZWxkU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUZyYWdlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVxdWlyZWRGaWVsZCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUmVxdWVzdEZvcm1FZGl0SGVhZHtSZXF1aXJlZEZpZWxkfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7UmVxdWlyZWRGaWVsZFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVGcmFnZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlcXVpcmVkRmllbGQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFJlcXVlc3RGb3JtRWRpdHtSZXF1aXJlZEZpZWxkfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRMYXN0T3JkZXIgPSAwOwogICAgaWYgKCAhJFBhcmFte1JlcXVlc3RJRH0gKSB7CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7T3JkZXJ9ID0gMTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1JlcXVlc3RJRH0gJiYgJFBhcmFte1JlcXVlc3RGb3JtSUR9ICkgewogICAgICAgIGlmICggJFJlcXVlc3RGb3JtRWRpdEhlYWR7SGVhZGxpbmV9ICkgewogICAgICAgICAgICAkTGFzdE9yZGVyCiAgICAgICAgICAgICAgICA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1MYXN0T3JkZXIoCiAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tPcmRlcn0gPSAkTGFzdE9yZGVyICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze09yZGVyfSA9ICRSZXF1ZXN0Rm9ybUVkaXR7T3JkZXJ9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte1JlcXVlc3RJRH0gJiYgISRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSApIHsKICAgICAgICAkTGFzdE9yZGVyID0KICAgICAgICAgICAgJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUxhc3RPcmRlciggUmVxdWVzdElEID0+ICRSZXF1ZXN0RGF0YXtSZXF1ZXN0SUR9LCApOwogICAgICAgICRSZXF1ZXN0RmllbGRze09yZGVyfSA9ICRMYXN0T3JkZXIgKyAxOwogICAgfQoKICAgIGlmICggJFBhcmFte1JlcXVlc3RJRH0gKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGZWxkQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3RGaWVsZHMsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3dzIGhlYWRlcgogICAgaWYgKCAkUGFyYW17UmVxdWVzdEZvcm1JRH0gJiYgJFJlcXVlc3RGb3JtRWRpdHtGZWxkSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGZWxkSGVhZGVyRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RmllbGRzLCB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmVsZEhlYWRlckFkZCcgKTsKICAgIH0KCiAgICBpZiAoICRSZXF1ZXN0Rm9ybUVkaXRIZWFke0hlYWRsaW5lfSApIHsKICAgICAgICAkUmVxdWVzdEZpZWxkc3tIZWFkQXJ0VWViZXJzY2hyaWZ0fSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7SGVhZGxpbmV9ICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1FZGl0SGVhZHtIZWFkbGluZX07CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7T3JkZXJ9ICAgICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1FZGl0SGVhZHtPcmRlcn07CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7RGVzY3JpcHRpb259ICAgICAgICAgPSAkUmVxdWVzdEZvcm1FZGl0SGVhZHtEZXNjcmlwdGlvbn07CgogICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tIZWFkbGluZX0KICAgICAgICAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7SGVhZGxpbmV9IC4gJzxicj4nIC4gJFJlcXVlc3RGaWVsZHN7RGVzY3JpcHRpb259OwogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRMYXN0T3JkZXIKICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtTGFzdE9yZGVyKCBSZXF1ZXN0SUQgPT4gJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0sICk7CiAgICAgICAgJFJlcXVlc3RGaWVsZHN7T3JkZXJ9ID0gJExhc3RPcmRlciArIDE7CiAgICB9CgogICAgJFJlcXVlc3RGaWVsZHN7UmVxdWlyZWRGaWVsZFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJUZyYWdlTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdSZXF1aXJlZEZpZWxkJywKICAgICAgICBTZWxlY3RlZElEID0+ICRSZXF1ZXN0Rm9ybUVkaXRIZWFke1JlcXVpcmVkRmllbGR9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtSZXF1ZXN0SUR9ICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmVsZEhlYWRsaW5lQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3RGaWVsZHMsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3dzIGhlYWRlcgogICAgaWYgKCAkUGFyYW17UmVxdWVzdEZvcm1JRH0gJiYgISRSZXF1ZXN0Rm9ybUVkaXR7RmVsZElEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmVsZEhlYWRsaW5lSGVhZGVyRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RmllbGRzLCB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmVsZEhlYWRsaW5lSGVhZGVyQWRkJyApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVSZXF1ZXN0RmllbGRzLAogICAgICAgICk7CiAgICB9CgogICAgIyBFbmRlIG5ldWVzIEZlbGQKCiAgICAjIEJlZ2lubiBuZXVlcyBGZWxkIEJsb2NrCiAgICBpZiAoICRQYXJhbXtSZXF1ZXN0Rm9ybUlEfSAmJiAkUGFyYW17UmVxdWVzdEZvcm1WYWx1ZUlEfSApIHsKCiAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHNCbG9jazsKICAgICAgICBteSAlUmVxdWVzdEZpZWxkc0xpc3RCbG9jayA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzQWRtaW5MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlUmVxdWVzdEZvcm1FZGl0QmxvY2s7CiAgICAgICAgaWYgKCAkUGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSApIHsKCiAgICAgICAgICAgICNnZXQgUmVxdWVzdEZvcm0KICAgICAgICAgICAgJVJlcXVlc3RGb3JtRWRpdEJsb2NrID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtQmxvY2tHZXQoCiAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRQYXJhbXtSZXF1ZXN0Rm9ybUJsb2NrSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVJlcXVlc3RGb3JtRWRpdEhlYWRCbG9jazsKICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tIZWFkbGluZX0gfHwgJFJlcXVlc3RGb3JtRWRpdEJsb2Nre0JldGVpbGlndGV9ICkgewogICAgICAgICAgICAlUmVxdWVzdEZvcm1FZGl0SGVhZEJsb2NrID0gJVJlcXVlc3RGb3JtRWRpdEJsb2NrOwogICAgICAgICAgICAlUmVxdWVzdEZvcm1FZGl0QmxvY2sgICAgID0gKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc0Jsb2Nre09yZGVyQmxvY2t9ICAgID0gJFJlcXVlc3RGb3JtRWRpdEJsb2Nre09yZGVyfTsKICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tNb3ZlT3ZlckJsb2NrfSA9ICRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tUb29sVGlwfTsKICAgICAgICAgICAgJVJlcXVlc3RGb3JtRWRpdEhlYWRCbG9jayAgICAgICAgICA9ICgpOwogICAgICAgIH0KCiAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tOZXVlc0ZlbGRTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVJlcXVlc3RGaWVsZHNMaXN0QmxvY2ssCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdGZWxkSURCbG9jaycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDEsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tGZWxkSUR9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgICA9PiA1MDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICAgID0+ICdJbmRpdmlkdWFsS2V5JywKICAgICAgICAgICAgU29ydEluZGl2aWR1YWwgPT4gWyAnKERyb3Bkb3duKScsICcoVGV4dCknLCAnKE11bHRpc2VsZWN0KScsICcoVGV4dEFyZWEpJywgJyhEYXRlKScgXQogICAgICAgICk7CgogICAgICAgIG15IEBEZWZhdWx0dmFsdWVWYWx1ZUVkaXRCbG9jazsKCiAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tWYWxpZE9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkUmVxdWVzdEZvcm1FZGl0QmxvY2t7VmFsaWRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUZyYWdlTGlzdEJsb2NrID0gKCAnMCcgPT4gJy0nLCAnMScgPT4gJ2phJywgJzInID0+ICduZWluJywgKTsKCiAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1FZGl0QmxvY2t7SGVhZGxpbmV9IHx8ICRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tCZXRlaWxpZ3RlfSApIHsKICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tSZXF1aXJlZEZpZWxkQmxvY2tTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUZyYWdlTGlzdEJsb2NrLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVxdWlyZWRGaWVsZEJsb2NrJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFJlcXVlc3RGb3JtRWRpdEhlYWRCbG9ja3tSZXF1aXJlZEZpZWxkfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXF1ZXN0RmllbGRzQmxvY2t7UmVxdWlyZWRGaWVsZEJsb2NrU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVGcmFnZUxpc3RCbG9jaywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlcXVpcmVkRmllbGRCbG9jaycsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tSZXF1aXJlZEZpZWxkfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRQYXJhbXtSZXF1ZXN0SUR9ICkgewogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc0Jsb2Nre09yZGVyQmxvY2t9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17UmVxdWVzdElEfSAmJiAkUGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSApIHsKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1FZGl0SGVhZEJsb2Nre0hlYWRsaW5lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0T3JkZXJCbG9jayA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUxhc3RPcmRlckJsb2NrKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICAgICAgICA9PiAkUmVxdWVzdERhdGF7UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlSUQgPT4gJFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tPcmRlckJsb2NrfSA9ICRMYXN0T3JkZXJCbG9jayArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc0Jsb2Nre09yZGVyQmxvY2t9ID0gJFJlcXVlc3RGb3JtRWRpdEJsb2Nre09yZGVyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtSZXF1ZXN0SUR9ICYmICEkUGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfSApIHsKICAgICAgICAgICAgbXkgJExhc3RPcmRlckJsb2NrID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtTGFzdE9yZGVyQmxvY2soCiAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgPT4gJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlSUQgPT4gJFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRSZXF1ZXN0RmllbGRzQmxvY2t7T3JkZXJCbG9ja30gPSAkTGFzdE9yZGVyQmxvY2sgKyAxOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZlbGRBZGRCbG9jaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RmllbGRzQmxvY2ssIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEfQogICAgICAgICAgICAmJiAkUmVxdWVzdEZvcm1FZGl0QmxvY2t7RmVsZElEfQogICAgICAgICAgICAmJiAkUGFyYW17UmVxdWVzdEZvcm1WYWx1ZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZlbGRIZWFkZXJFZGl0QmxvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3RGaWVsZHNCbG9jaywgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRH0KICAgICAgICAgICAgJiYgISRSZXF1ZXN0Rm9ybUVkaXRCbG9ja3tGZWxkSUR9CiAgICAgICAgICAgICYmICRQYXJhbXtSZXF1ZXN0Rm9ybVZhbHVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRmVsZEhlYWRlckFkZEJsb2NrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXF1ZXN0RmllbGRzQmxvY2ssIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUVkaXRIZWFkQmxvY2t7SGVhZGxpbmV9ICkgewogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc0Jsb2Nre0hlYWRBcnRVZWJlcnNjaHJpZnRCbG9ja30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICAkUmVxdWVzdEZpZWxkc0Jsb2Nre0hlYWRsaW5lQmxvY2t9ICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm1FZGl0SGVhZEJsb2Nre0hlYWRsaW5lfTsKICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHNCbG9ja3tPcmRlckJsb2NrfSAgICAgICAgICAgICAgID0gJFJlcXVlc3RGb3JtRWRpdEhlYWRCbG9ja3tPcmRlcn07CiAgICAgICAgICAgICRSZXF1ZXN0RmllbGRzQmxvY2t7RGVzY3JpcHRpb25CbG9ja30gICAgICAgICA9ICRSZXF1ZXN0Rm9ybUVkaXRIZWFkQmxvY2t7RGVzY3JpcHRpb259OwogICAgICAgICAgICBteSAkTGFzdE9yZGVyID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtTGFzdE9yZGVyQmxvY2soCiAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgPT4gJFJlcXVlc3REYXRhe1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybVZhbHVlSUQgPT4gJFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRSZXF1ZXN0RmllbGRzQmxvY2t7T3JkZXJCbG9ja30gPSAkTGFzdE9yZGVyICsgMTsKICAgICAgICB9CgogICAgICAgICRSZXF1ZXN0RmllbGRze1JlcXVpcmVkRmllbGRTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlRnJhZ2VMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZXF1aXJlZEZpZWxkQmxvY2snLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRSZXF1ZXN0Rm9ybUVkaXRIZWFkQmxvY2t7UmVxdWlyZWRGaWVsZH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZlbGRIZWFkbGluZUJsb2NrQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3RGaWVsZHNCbG9jaywgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3dzIGhlYWRlcgogICAgICAgIGlmICggJFBhcmFte1JlcXVlc3RGb3JtSUR9ICYmICEkUmVxdWVzdEZvcm1FZGl0QmxvY2t7RmVsZElEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGZWxkSGVhZGxpbmVIZWFkZXJCbG9ja0VkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3RGaWVsZHMsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmVsZEhlYWRsaW5lSGVhZGVyQmxvY2tBZGQnICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVJlcXVlc3RGaWVsZHNCbG9jaywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgRW5kZSBuZXVlcyBGZWxkIEJsb2NrCgogICAgbXkgJVJlcXVlc3RGb3JtTGlzdERldGFpbHM7CiAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tSZXF1ZXN0TmFtZX0gICAgPSAkUmVxdWVzdERhdGF7TmFtZX07CiAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tSZXF1ZXN0Rm9ybUlEc30gPSAnJzsKCiAgICBpZiAoICRQYXJhbXtSZXF1ZXN0SUR9ICkgewoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByZXN1bHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdGaWVsZHNMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmVxdWVzdEZvcm1MaXN0ID0gKCk7CiAgICBpZiAoICRSZXF1ZXN0RGF0YXtSZXF1ZXN0SUR9ICkgewogICAgICAgICVSZXF1ZXN0Rm9ybUxpc3QgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtTGlzdCgKICAgICAgICAgICAgUmVxdWVzdElEID0+ICRSZXF1ZXN0RGF0YXtSZXF1ZXN0SUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgZm9yIG15ICRSZXF1ZXN0Rm9ybUxpc3RJRCAoCiAgICAgICAgc29ydCB7ICRSZXF1ZXN0Rm9ybUxpc3R7JGF9IDw9PiAkUmVxdWVzdEZvcm1MaXN0eyRifSB9CiAgICAgICAga2V5cyAlUmVxdWVzdEZvcm1MaXN0CiAgICAgICAgKQogICAgewoKICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGZWxkQWt0dWVsbElEfSA9ICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgI2dldCBSZXF1ZXN0Rm9ybQogICAgICAgIG15ICVSZXF1ZXN0Rm9ybQogICAgICAgICAgICA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1HZXQoIFJlcXVlc3RGb3JtSUQgPT4gJFJlcXVlc3RGb3JtTGlzdElELCApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmllbGRzUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwoKICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn0gICAgICAgICA9ICRSZXF1ZXN0Rm9ybXtPcmRlcn07CiAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VG9vbFRpcH0gICAgICAgPSAkUmVxdWVzdEZvcm17VG9vbFRpcH07CiAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7UmVxdWVzdEZvcm1JRH0gPSAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1JlcXVlc3RGb3JtSURzfSAuPSAiJFJlcXVlc3RGb3JtTGlzdElELCI7CgogICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ID0gJFJlcXVlc3RGb3Jte1ZhbGlkSUR9OwoKICAgICAgICBpZiAoICEkUmVxdWVzdEZvcm17SGVhZGxpbmV9ICYmICEkUmVxdWVzdEZvcm17RGVzY3JpcHRpb259ICkgewoKICAgICAgICAgICAgI2dldCBSZXF1ZXN0RmVsZAogICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkcwogICAgICAgICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAjZ2V0IFJlcXVlc3RGaWVsZHNXZXJ0ZQogICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkc1dlcnRlCiAgICAgICAgICAgICAgICA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydGVHZXQoIElEID0+ICRSZXF1ZXN0RmllbGRze0lEfSwgKTsKCiAgICAgICAgICAgICNnZXQgbGlzdAogICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkc0xpc3RlCiAgICAgICAgICAgICAgICA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydGVMaXN0KCBGZWxkSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sICk7CgogICAgICAgICAgICBteSAlUmVxdWVzdFdlcnRlRHJvcGRvd24gPSAoKTsKICAgICAgICAgICAgaWYgKCVSZXF1ZXN0RmllbGRzTGlzdGUpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkUmVxdWVzdEZpZWxkc1dlcnRlSUQgKCBzb3J0IGtleXMgJVJlcXVlc3RGaWVsZHNMaXN0ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgI2dldCBSZXF1ZXN0RmllbGRzV2VydGUKICAgICAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkc1dlcnRlCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFJlcXVlc3RGaWVsZHNPYmplY3QtPlJlcXVlc3RGaWVsZHNXZXJ0ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFJlcXVlc3RGaWVsZHNXZXJ0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0V2VydGVEcm9wZG93bnsgJFJlcXVlc3RGaWVsZHNXZXJ0ZXtTY2hsdWVzc2VsfSB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFJlcXVlc3RGaWVsZHNXZXJ0ZXtJbmhhbHR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGaWVsZExhYmVsaW5nfSA9ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfTsKICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmllbGROYW1lfSAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfTsKCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgIG15IEBEZWZhdWx0dmFsdWVWYWx1ZTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBARGVmYXVsdHZhbHVlVmFsdWUgPSBzcGxpdCggLywvLCAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSAmJiAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAndW5nw7xsdGlnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGaWVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gXEBEZWZhdWx0dmFsdWVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3JkZXJ9ID0gJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZpZWxkc011bHRpc2VsZWN0UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUmVxdWVzdEZvcm1MaXN0RGV0YWlscywgJVBhcmFtLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICBteSBARGVmYXVsdHZhbHVlVmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgQERlZmF1bHR2YWx1ZVZhbHVlID0gc3BsaXQoIC8sLywgJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gJiYgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJ3VuZ8O8bHRpZyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmllbGROYW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVSZXF1ZXN0V2VydGVEcm9wZG93biwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFJlcXVlc3RGaWVsZHN7TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSwKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+IFxARGVmYXVsdHZhbHVlVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte09yZGVyfSA9ICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNNdWx0aXNlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkRyb3Bkb3duIiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1ZXN0Rm9ybVZhbHVlSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPSAkUGFyYW17UmVxdWVzdEZvcm1WYWx1ZUlEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGaWVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ICYmICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICd1bmfDvGx0aWcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPcmRlcn0gPSAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmllbGRzRHJvcGRvd25SZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiRHJvcGRvd24iICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1JlcXVlc3RGb3JtVmFsdWVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSA9ICRQYXJhbXtSZXF1ZXN0Rm9ybVZhbHVlSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZpZWxkTmFtZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUmVxdWVzdFdlcnRlRHJvcGRvd24sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRSZXF1ZXN0RmllbGRze05hbWV9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gJiYgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJ3VuZ8O8bHRpZyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte09yZGVyfSA9ICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIlRleHQiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZpZWxkTmFtZX0gICAgICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX07CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSAmJiAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAndW5nw7xsdGlnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3JkZXJ9ID0gJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZpZWxkc1RleHRSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiVGV4dCIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmVsZERlZmF1bHR2YWx1ZX0gPSAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9OwogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmllbGROYW1lfSAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ICYmICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICd1bmfDvGx0aWcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPcmRlcn0gPSAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmllbGRzVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIlRleHRBcmVhIiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGaWVsZE5hbWV9ICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9OwogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmVsZFJvd3N9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tSb3dzfTsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZlbGRDb2xzfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7Q29sc307CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSAmJiAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAndW5nw7xsdGlnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3JkZXJ9ID0gJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZpZWxkc1RleHRBcmVhUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUmVxdWVzdEZvcm1MaXN0RGV0YWlscywgJVBhcmFtLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIlRleHRBcmVhIiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGaWVsZE5hbWV9ICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9OwogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmVsZFJvd3N9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tSb3dzfTsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZlbGRDb2xzfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7Q29sc307CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSAmJiAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAndW5nw7xsdGlnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3JkZXJ9ID0gJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZpZWxkc1RleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVJlcXVlc3RGb3JtTGlzdERldGFpbHMsICVQYXJhbSwgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZpZWxkTmFtZX0gICAgICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX07CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tGZWxkQ2hlY2tlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gJiYgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJ3VuZ8O8bHRpZyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte09yZGVyfSA9ICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNDaGVja2JveFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVJlcXVlc3RGb3JtTGlzdERldGFpbHMsICVQYXJhbSwgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJDaGVja2JveCIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmVsZERlZmF1bHR2YWx1ZX0gPSAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9OwogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7RmllbGROYW1lfSAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0ZlbGRDaGVja2VkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSAmJiAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tWYWxpZElEfSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAndW5nw7xsdGlnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze3VuZ3VlbHRpZ30gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3JkZXJ9ID0gJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZpZWxkc0NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVJlcXVlc3RGb3JtTGlzdERldGFpbHMsICVQYXJhbSwgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiRGF0ZSIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDEgKSB7CgogICAgICAgICAgICAgICAgIyBkYXRlIGRhdGEgc3RyaW5nCiAgICAgICAgICAgICAgICAkUGFyYW17RmllbGROYW1lU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSwKICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gJiYgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJ3VuZ8O8bHRpZyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3t1bmd1ZWx0aWd9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte09yZGVyfSA9ICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNEYXRlUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUmVxdWVzdEZvcm1MaXN0RGV0YWlscywgJVBhcmFtLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkRhdGUiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgICMgZGF0ZSBkYXRhIHN0cmluZwogICAgICAgICAgICAgICAgJFBhcmFte0ZpZWxkTmFtZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ICYmICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze1ZhbGlkSUR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICd1bmfDvGx0aWcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7dW5ndWVsdGlnfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3JtTGlzdERldGFpbHN7T3JkZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPcmRlcn0gPSAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmllbGRzRGF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybXtIZWFkbGluZX0gKSB7CgogICAgICAgICAgICAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tIZWFkbGluZX0gPSAkUmVxdWVzdEZvcm17SGVhZGxpbmV9OwogICAgICAgICAgICAkUGFyYW17SGVhZGxpbmV9ICAgICAgICAgICAgICAgICAgPSAkUmVxdWVzdEZvcm17SGVhZGxpbmV9OwogICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze09yZGVyfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPcmRlcn0gPSAkUmVxdWVzdEZvcm1MaXN0RGV0YWlsc3tPcmRlcn07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn0gPX4gcy8oLiopPCguKik+LyQyL2lnOwogICAgICAgICAgICAgICAgJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufSA9fiBzLzwvJmx0Oy9pZzsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn0gPX4gcy8+LyZndDsvaWc7CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm17RGVzY3JpcHRpb259ID1+IHMvXG4vPGJyXC8+L2lnOwogICAgICAgICAgICAgICAgJFBhcmFte0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgID0gJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0Rlc2NyaXB0aW9ufSA9ICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtIZWFkbGluZX0gICAgPSAkUGFyYW17SGVhZGxpbmV9IC4gJzxicj4nIC4gJFBhcmFte0Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNIZWFkbGluZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVJlcXVlc3RGb3JtTGlzdERldGFpbHMsICVQYXJhbSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICRSZXF1ZXN0Rm9ybUxpc3REZXRhaWxze0Rlc2NyaXB0aW9ufSA9ICcnOwogICAgICAgIH0KCiAgICB9CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGaWVsZHNSZXF1ZXN0Rm9ybUlEcycsCiAgICAgICAgRGF0YSA9PiB7ICVSZXF1ZXN0Rm9ybUxpc3REZXRhaWxzLCAlUGFyYW0sIH0sCiAgICApOwoKICAgIGlmICggJFJlcXVlc3REYXRhe0lERXJyb3J9ICYmICRSZXF1ZXN0RGF0YXtJREVycm9yfSBlcSAiRXhpc3RzIiApIHsKCiAgICAgICAgIyBvdXRwdXQgc2xhIGVkaXQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9wcGVsdEVycm9yJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVJlcXVlc3REYXRhLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5SZXF1ZXN0Rm9ybScsIERhdGEgPT4gXCVQYXJhbSApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNBQk1lbWJlclNlYXJjaC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DQUJNZW1iZXJTZWFyY2gucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTYgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DQUJNZW1iZXJTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OID0gJyc7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHNlYXJjaCBmb3IgcG9zc2libGUgQ0FCIG1lbWJlcnMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICAjIGdldCBuZWVkZWQgcGFyYW1zCiAgICAgICAgbXkgJFNlYXJjaCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZXJtJyApICAgfHwgJyc7CiAgICAgICAgbXkgJEdyb3VwcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdHcm91cHMnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGFsbCBtZW1iZXJzIG9mIHRoZSBncm91cHMKICAgICAgICBteSAlR3JvdXBVc2VyczsKICAgICAgICBpZiAoJEdyb3VwcykgewogICAgICAgICAgICBteSBAR3JvdXBOYW1lcyA9IHNwbGl0IC8sXHMrLywgJEdyb3VwczsKCiAgICAgICAgICAgIGZvciBteSAkR3JvdXBOYW1lIChAR3JvdXBOYW1lcykgewoKICAgICAgICAgICAgICAgICMgZ2V0IGdyb3VwIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICAgICAgICAgbXkgJEdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEdyb3VwID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICAgICAgICAgICAgICBteSAlVXNlcnMgPSAkR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15IEBVc2VySURzID0ga2V5cyAlVXNlcnM7CiAgICAgICAgICAgICAgICBAR3JvdXBVc2Vyc3tAVXNlcklEc30gPSBAVXNlcklEczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdXNlciBvYmplY3QKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgZ2V0IGFnZW50IGxpc3QKICAgICAgICBteSAlVXNlckxpc3QgPSAkVXNlck9iamVjdC0+VXNlclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVXNlclNlYXJjaCgpIHJldHVybnMgdmFsdWVzIHdpdGggYSB0cmFpbGluZyBzcGFjZSwgZ2V0IHJpZCBvZiBpdAogICAgICAgIGZvciBteSAkTmFtZSAoIHZhbHVlcyAlVXNlckxpc3QgKSB7CiAgICAgICAgICAgICROYW1lID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgfQoKICAgICAgICAjIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IGFzIHJlc3BvbnNlCiAgICAgICAgbXkgQERhdGE7CgogICAgICAgIFVTRVJJRDoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkVXNlckxpc3R7JGF9IGNtcCAkVXNlckxpc3R7JGJ9IH0ga2V5cyAlVXNlckxpc3QgKSB7CgogICAgICAgICAgICAjIGlmIGdyb3VwcyBhcmUgcmVxdWlyZWQgYW5kIHVzZXIgaXMgbm90IG1lbWJlciBvZiBvbmUgb2YgdGhlIGdyb3VwcwogICAgICAgICAgICAjIHRoZSBza2lwIHRoZSB1c2VyCiAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICRHcm91cHMgJiYgISRHcm91cFVzZXJzeyRVc2VySUR9OwoKICAgICAgICAgICAgIyBUaGUgdmFsdWVzIGluICVVc2VyTGlzdCBhcmUgaW4gdGhlIGZvcm06ICdtbSBNYXggTXVzdGVybWFubicuCiAgICAgICAgICAgICMgU28gYXNzZW1ibGUgYSBuZWF0ZXIgc3RyaW5nIGZvciBkaXNwbGF5LgogICAgICAgICAgICAjIChBY3R1YWxseSBVc2VyU2VhcmNoKCkgY29udGFpbnMgY29kZSBmb3IgZm9ybWF0aW5nLCBidXQgdGhhdCBpcyB1c3VhbGx5IG5vdCBjYWxsZWQuKQogICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVmFsaWQgID0+ICRQYXJhbXtWYWxpZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRVc2VyVmFsdWVQbGFpbiA9IHNwcmludGYgJyIlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRnVsbG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKCiAgICAgICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgICAgIFVzZXJLZXkgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVXNlclZhbHVlID0+ICRVc2VyVmFsdWVQbGFpbiwKICAgICAgICAgICAgICAgIFVzZXJUeXBlICA9PiAnQ0FCQWdlbnRzJywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGxpc3QKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgQ1VTVE9NRVJVU0VSTE9HSU46CiAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJMb2dpbiAoCiAgICAgICAgICAgIHNvcnQgeyAkQ3VzdG9tZXJVc2VyTGlzdHskYX0gY21wICRDdXN0b21lclVzZXJMaXN0eyRifSB9CiAgICAgICAgICAgIGtleXMgJUN1c3RvbWVyVXNlckxpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgaWYgZ3JvdXBzIGFyZSByZXF1aXJlZCBhbmQgdXNlciBpcyBub3QgbWVtYmVyIG9mIG9uZSBvZiB0aGUgZ3JvdXBzCiAgICAgICAgICAgICMgdGhlIHNraXAgdGhlIHVzZXIKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgJEdyb3VwcyAmJiAhJEdyb3VwVXNlcnN7JEN1c3RvbWVyVXNlckxvZ2lufTsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyVmFsdWVQbGFpbiA9ICciJyAuICRDdXN0b21lclVzZXJ7VXNlckZ1bGxuYW1lfSAuICciIDwnIC4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9IC4gJz4nOwoKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgVXNlcktleSAgID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFVzZXJWYWx1ZSA9PiAkQ3VzdG9tZXJVc2VyVmFsdWVQbGFpbiwKICAgICAgICAgICAgICAgIFVzZXJUeXBlICA9PiAnQ0FCQ3VzdG9tZXJzJywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04gfHwgJycsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQ2hhbmdlTnVtYmVyJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQFNob3dDb2x1bW5zID0gZ3JlcCB7ICRQb3NzaWJsZUNvbHVtbnskX30gfSBzb3J0IGtleXMgJVBvc3NpYmxlQ29sdW1uOwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRV9TVEFURToKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggQHsgJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFX1NUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFX1NUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIHdpdGggcGFyYW1zIGZvciB0aGUgc2VhcmNoIG1ldGhvZAogICAgICAgICAgICAkRmlsdGVyc3skQ2hhbmdlU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gWyRDaGFuZ2VTdGF0ZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZmlsdGVyIGFuZCB2aWV3IHBhcmFtcwogICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApICAgfHwgJyc7CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIsIHdoaWNoIHNob3dzIGFsbCBpdGVtcwogICAgICAgICRGaWx0ZXJze0FsbH0gPSB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgbXkgJENvdW50ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRoZSBuYXZiYXIgZmlsdGVyCiAgICAgICAgJE5hdkJhckZpbHRlcnsgJEZpbHRlcnN7JEZpbHRlcn0tPntQcmlvfSB9ID0gewogICAgICAgICAgICBDb3VudCAgPT4gJENvdW50LAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyB0aGUgbGlzdAogICAgbXkgJExpbmtQYWdlID0KICAgICAgICAnRmlsdGVyPScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua1NvcnQgPQogICAgICAgICdGaWx0ZXI9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rRmlsdGVyID0KICAgICAgICAnU29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7JzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUxpc3RTaG93KAogICAgICAgIENoYW5nZUlEcyA9PiAkSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ092ZXJ2aWV3OiBJVFNNIENoYW5nZXMnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntOYW1lfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBTb3J0QnkgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKSwKICAgICAgICBPcmRlckJ5ICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICksCiAgICApOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUFkZC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VBZGQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KENoYW5nZVRpdGxlIERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24gVGlja2V0SUQgQ2F0ZWdvcnlJRCBJbXBhY3RJRCBQcmlvcml0eUlEIEF0dGFjaG1lbnRVcGxvYWQgRmlsZUlEKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QgYW5kIGFkZCB0aGUgcHJlZml4CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICkgewogICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAnUmVxdWVzdGVkVGltZScgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgY2F0ZWdvcnkKICAgICRQYXJhbXtDYXRlZ29yeUlEfSA9ICRHZXRQYXJhbXtDYXRlZ29yeUlEfTsKICAgIGlmICggISRQYXJhbXtDYXRlZ29yeUlEfSApIHsKICAgICAgICBteSAkRGVmYXVsdENhdGVnb3J5ID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpDYXRlZ29yeTo6RGVmYXVsdCcpOwogICAgICAgICRQYXJhbXtDYXRlZ29yeUlEfSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgQ0lQICA9PiAkRGVmYXVsdENhdGVnb3J5LAogICAgICAgICAgICBUeXBlID0+ICdDYXRlZ29yeScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBpbXBhY3QKICAgICRQYXJhbXtJbXBhY3RJRH0gPSAkR2V0UGFyYW17SW1wYWN0SUR9OwogICAgaWYgKCAhJFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICBteSAkRGVmYXVsdEltcGFjdCA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6SW1wYWN0OjpEZWZhdWx0Jyk7CiAgICAgICAgJFBhcmFte0ltcGFjdElEfSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgQ0lQICA9PiAkRGVmYXVsdEltcGFjdCwKICAgICAgICAgICAgVHlwZSA9PiAnSW1wYWN0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgUmVtZW1iZXIgdGhlIHJlYXNvbiB3aHkgc2F2aW5nIHdhcyBub3QgYXR0ZW1wdGVkLgogICAgbXkgJVZhbGlkYXRpb25FcnJvcjsKCiAgICAjIHRoZSBUaWNrZXRJRCBjYW4gYmUgdmFsaWRhdGVkIGV2ZW4gd2l0aG91dCB0aGUgU3ViYWN0aW9uICdTYXZlJywKICAgICMgYXMgaXQgaXMgcGFzc2VkIGFzIEdFVC1wYXJhbSBvciBpbiBhIGhpZGRlbiBmaWVsZC4KICAgIGlmICggJEdldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGRhdGEKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRHZXRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0aWNrZXQgZXhpc3RzCiAgICAgICAgaWYgKCAhJVRpY2tldCApIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaWNrZXQgd2l0aCBUaWNrZXRJRCAlcyBkb2VzIG5vdCBleGlzdCEnLCAkR2V0UGFyYW17VGlja2V0SUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBteSAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICAgICAgIyBjaGVjayB0aGUgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzCiAgICAgICAgICAgIHx8IHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWScKICAgICAgICAgICAgfHwgIUB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc30KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ01pc3Npbmcgc3lzY29uZmlnIG9wdGlvbiAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiEnKTsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIHRpY2tldCdzIHR5cGUgaXMgcmVsZXZhbnQKICAgICAgICBpZiAoICEkSXNSZWxldmFudHsgJFRpY2tldHtUeXBlfSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICJJbnZhbGlkIHRpY2tldCB0eXBlICckVGlja2V0e1R5cGV9JyBmb3IgZGlyZWN0bHkgbGlua2luZyBhIHRpY2tldCB3aXRoIGEgY2hhbmdlLiAiCiAgICAgICAgICAgICAgICAuICdPbmx5IHRoZSBmb2xsb3dpbmcgdGlja2V0IHR5cGUocykgYXJlIGFsbG93ZWQgZm9yIHRoaXMgb3BlcmF0aW9uOiAnCiAgICAgICAgICAgICAgICAuIGpvaW4gJywnLCBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQ0lQIGFsbG9jYXRlIG9iamVjdAogICAgbXkgJENJUEFsbG9jYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZScpOwoKICAgICMgcGVyZm9ybSB0aGUgYWRkaW5nCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgdGhlIHRpdGxlIGlzIHJlcXVpcmVkCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0NoYW5nZVRpdGxlfSApIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntDaGFuZ2VUaXRsZVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIENJUAogICAgICAgIGZvciBteSAkVHlwZSAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17IiR7VHlwZX1JRCJ9IHx8ICRHZXRQYXJhbXsiJHtUeXBlfUlEIn0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkVHlwZSAuICdJRFNlcnZlckVycm9yJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRDSVBJc1ZhbGlkID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJEdldFBhcmFteyIke1R5cGV9SUQifSwKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ0lQSXNWYWxpZCApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkVHlwZSAuICdJRFNlcnZlckVycm9yJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgcmVxdWVzdGVkIHRpbWUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICYmICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lVXNlZH0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVllYXJ9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1vbnRofQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVEYXl9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lSG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHRyYW5zZm9ybSBjaGFuZ2UgcmVxdWVzdGVkIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnUmVxdWVzdGVkVGltZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcCwgd2hlbiBhbGwgcmVxdWlyZWQgdGltZSBwYXJhbXMgd2VyZSBwYXNzZWQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lfSA9IHNwcmludGYgJyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1pbnV0ZX07CgogICAgICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgb2YgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1JlcXVlc3RlZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG8gbm90IHNhdmUgd2hlbiB0aW1lIGlzIGludmFsaWQKICAgICAgICAgICAgICAgIGlmICggISRTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7UmVxdWVzdGVkVGltZUludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGl0IHdhcyBpbmRpY2F0ZWQgdGhhdCB0aGUgcmVxdWVzdGVkIHRpbWUgc2hvdWxkIGJlIHNldCwKICAgICAgICAgICAgICAgICMgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgcmVxdWlyZWQgdGltZSBwYXJhbXMgaXMgbWlzc2luZwogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntSZXF1ZXN0ZWRUaW1lSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9CiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gaW5wdXQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICBpZiAoICElVmFsaWRhdGlvbkVycm9yICkgewoKICAgICAgICAgICAgbXkgJUFkZGl0aW9uYWxQYXJhbTsKCiAgICAgICAgICAgICMgYWRkIHJlcXVlc3RlZCB0aW1lIGlmIGNvbmZpZ3VyZWQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSApIHsKICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsUGFyYW17UmVxdWVzdGVkVGltZX0gPSAkR2V0UGFyYW17UmVxdWVzdGVkVGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIHRoZSBjaGFuZ2UKICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAkR2V0UGFyYW17SnVzdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRHZXRQYXJhbXtDaGFuZ2VUaXRsZX0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEICAgID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlQWRkaXRpb25hbFBhcmFtLAogICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgkQ2hhbmdlSUQpIHsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGFuZ2UgYWRkIG1hc2sgd2FzIGNhbGxlZCBmcm9tIHRoZSB0aWNrZXQgem9vbQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGxpbmsgdGlja2V0IHdpdGggbmV3bHkgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICBteSAkTGlua1N1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgbGluayBjb3VsZCBub3QgYmUgYWRkZWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGlua1N1Y2Nlc3MgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gIkNoYW5nZSB3aXRoIENoYW5nZUlEICRDaGFuZ2VJRCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJidXQgYSBsaW5rIHRvIFRpY2tldCB3aXRoIFRpY2tldElEICRHZXRQYXJhbXtUaWNrZXRJRH0gY291bGQgbm90IGJlIGNyZWF0ZWQhIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgbW92ZSBhdHRhY2htZW50cyBmcm9tIGNhY2hlIHRvIHZpcnR1YWwgZnMKICAgICAgICAgICAgICAgIG15IEBDYWNoZWRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQ2FjaGVkQXR0YWNobWVudCAoQENhY2hlZEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAleyRDYWNoZWRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgZmlsZSBmcm9tIGNhY2hlIGlmIG1vdmUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmV3cml0ZSBVUkwgZm9yIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2FjaGVkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ2hhbmdlRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIHVwbG9hZCBjYWNoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaCA9ICJBY3Rpb249UGljdHVyZVVwbG9hZCAuKyBGb3JtSUQ9JFNlbGYtPntGb3JtSUR9IC4rICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDb250ZW50SUQ9JENhY2hlZEF0dGFjaG1lbnQtPntDb250ZW50SUR9IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIGNoYW5nZSBhdHR0YWNobWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFJlcGxhY2UgPSAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiRmlsZW5hbWU9JENhY2hlZEF0dGFjaG1lbnQtPntGaWxlbmFtZX07Q2hhbmdlSUQ9JENoYW5nZUlEIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdXJscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZURhdGEtPntEZXNjcmlwdGlvbn0gPX4gc3skU2VhcmNofXskUmVwbGFjZX14bXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YS0+e0p1c3RpZmljYXRpb259ID1+IHN7JFNlYXJjaH17JFJlcGxhY2V9eG1zOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIGNoYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkQ2hhbmdlRGF0YS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICRDaGFuZ2VEYXRhLT57SnVzdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgdGhlIGlubGluZSBpbWFnZSBVUkxzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gImZvciBDaGFuZ2VJRCAnJENoYW5nZUlEJyEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENhY2hlZEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5ub3QgbW92ZSBGaWxlIGZyb20gQ2FjaGUgdG8gVmlydHVhbEZTJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIigkeyRDYWNoZWRBdHRhY2htZW50fXtGaWxlbmFtZX0pIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2sgb2YgdGhlIG5ldyBjaGFuZ2UsIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGFkZGluZyBmYWlsZWQKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnV2FzIG5vdCBhYmxlIHRvIGFkZCBjaGFuZ2UhJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBBSkFYVXBkYXRlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHByaW9yaXRpZXMKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgICAgICBUeXBlICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZWxlY3RlZCBwcmlvcml0eQogICAgICAgIG15ICRTZWxlY3RlZFByaW9yaXR5ID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBJbXBhY3RJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBqc29uCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGVjdGVkUHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGpzb24KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiB0aGVyZSB3YXMgYW4gYXR0YWNobWVudCBkZWxldGUgb3IgdXBsb2FkCiAgICAjIHdlIGRvIG5vdCB3YW50IHRvIHNob3cgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIG90aGVyIGZpZWxkcwogICAgaWYgKCAkVmFsaWRhdGlvbkVycm9ye0F0dGFjaG1lbnR9ICkgewogICAgICAgICVWYWxpZGF0aW9uRXJyb3IgPSAoKTsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJ0FkZCcsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBjaGVjayBpZiByZXF1ZXN0ZWQgdGltZSBzaG91bGQgYmUgc2hvd24KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CgogICAgICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICAgICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OlRpbWVQZXJpb2QnKSB9OwoKICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgbXkgJFRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgUmVxdWVzdGVkVGltZU9wdGlvbmFsID0+IDEsCiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVDbGFzcyAgICA9PiAnVmFsaWRhdGUgJyAuICggJFZhbGlkYXRpb25FcnJvcntSZXF1ZXN0ZWRUaW1lSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGZpZWxkcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkVGltZVN0cmluZycgPT4gJFRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgdGhlIGNhdGVnb3J5CiAgICAjIGFsbCBjYXRlZ29yaWVzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGNhdGVnb3J5IGlzIGNoYW5nZWQsIGEgbmV3IHByaW9yaXR5IGlzIHByb3Bvc2VkCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFte0NhdGVnb3J5U2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJENhdGVnb3JpZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBjcmVhdGUgZHJvcGRvd24gZm9yIHRoZSBpbXBhY3QKICAgICMgYWxsIGltcGFjdHMgYXJlIHNlbGVjdGFibGUKICAgICMgd2hlbiB0aGUgaW1wYWN0IGlzIGNoYW5nZWQsIGEgbmV3IHByaW9yaXR5IGlzIHByb3Bvc2VkCiAgICBteSAkSW1wYWN0cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnSW1wYWN0JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXtJbXBhY3RTZWxlY3Rpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkSW1wYWN0cywKICAgICAgICBOYW1lICAgICAgID0+ICdJbXBhY3RJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3JlYXRlIGRyb3Bkb3duIGZvciBwcmlvcml0eSwKICAgICMgYWxsIHByaW9yaXRpZXMgYXJlIHNlbGVjdGFibGUKICAgICMgdGhlIGRlZmF1bHQgdmFsdWUgbWlnaHQgZGVwZW5kIG9uIGNhdGVnb3J5IGFuZCBpbXBhY3QKICAgIG15ICRQcmlvcml0aWVzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAkU2VsZWN0ZWRQcmlvcml0eSA9ICRHZXRQYXJhbXtQcmlvcml0eUlEfQogICAgICAgIHx8ICRDSVBBbGxvY2F0ZU9iamVjdC0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgIENhdGVnb3J5SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgIEltcGFjdElEICAgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICApOwogICAgJFBhcmFte1ByaW9yaXR5U2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZWN0ZWRQcmlvcml0eSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGRzIGRlZmF1bHRzIGlmIHBhZ2UgaXMgbG9hZGVkIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgPT4gJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gfHwgJycsCiAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRIVE1MKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRoZSBhdHRhY2htZW50IHVwbG9hZCBidXR0b24KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRVcGxvYWQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IgamF2YXNjcmlwdAogICAgIyBvbmx5IGlmIGFjdGl2YXRlZCBhbmQgdGhlIGJyb3dzZXIgY2FuIGhhbmRsZSBpdAogICAgIyBvdGhlcndpc2UganVzdCBhIHRleHRhcmVhIGlzIHNob3duCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUFkZCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIGl0IHJlbG9hZGFibGUKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lICgKICAgICAgICBxdyhNb3ZlVGltZVR5cGUgTW92ZVRpbWVZZWFyIE1vdmVUaW1lTW9udGggTW92ZVRpbWVEYXkgTW92ZVRpbWVIb3VyIE1vdmVUaW1lTWludXRlIFRpY2tldElEIFRlbXBsYXRlSUQpCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgIG15ICRQYXJhbU5hbWUgPSAnTW92ZVRpbWUnIC4gJFRpbWVQYXJ0OwogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgUmVtZW1iZXIgdGhlIHJlYXNvbiB3aHkgc2F2aW5nIHdhcyBub3QgYXR0ZW1wdGVkLgogICAgbXkgJVZhbGlkYXRpb25FcnJvcjsKCiAgICAjIHRoZSBUaWNrZXRJRCBjYW4gYmUgdmFsaWRhdGVkIGV2ZW4gd2l0aG91dCB0aGUgU3ViYWN0aW9uICdTYXZlJywKICAgICMgYXMgaXQgaXMgcGFzc2VkIGFzIEdFVC1wYXJhbSBvciBpbiBhIGhpZGRlbiBmaWVsZC4KICAgIGlmICggJEdldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGRhdGEKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRHZXRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0aWNrZXQgZXhpc3RzCiAgICAgICAgaWYgKCAhJVRpY2tldCApIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaWNrZXQgd2l0aCBUaWNrZXRJRCAlcyBkb2VzIG5vdCBleGlzdCEnLCAkR2V0UGFyYW17VGlja2V0SUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBteSAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICAgICAgIyBjaGVjayB0aGUgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzCiAgICAgICAgICAgIHx8IHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWScKICAgICAgICAgICAgfHwgIUB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc30KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSBUcmFuc2xhdGFibGUoJ01pc3Npbmcgc3lzY29uZmlnIG9wdGlvbiAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiEnKTsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIHRpY2tldCdzIHR5cGUgaXMgcmVsZXZhbnQKICAgICAgICBpZiAoICEkSXNSZWxldmFudHsgJFRpY2tldHtUeXBlfSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICJJbnZhbGlkIHRpY2tldCB0eXBlICckVGlja2V0e1R5cGV9JyBmb3IgZGlyZWN0bHkgbGlua2luZyBhIHRpY2tldCB3aXRoIGEgY2hhbmdlLiAiCiAgICAgICAgICAgICAgICAuICdPbmx5IHRoZSBmb2xsb3dpbmcgdGlja2V0IHR5cGUocykgYXJlIGFsbG93ZWQgZm9yIHRoaXMgb3BlcmF0aW9uOiAnCiAgICAgICAgICAgICAgICAuIGpvaW4gJywnLCBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAjIGNyZWF0ZSBjaGFuZ2UgZnJvbSB0ZW1wbGF0ZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZUZyb21UZW1wbGF0ZScgKSB7CgogICAgICAgIG15ICROZXdUaW1lOwoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSB0aW1lIHR5cGUKICAgICAgICBteSAkTW92ZVRpbWVUeXBlID0gJEdldFBhcmFte01vdmVUaW1lVHlwZX07CiAgICAgICAgaWYgKAogICAgICAgICAgICAhZGVmaW5lZCAkTW92ZVRpbWVUeXBlCiAgICAgICAgICAgIHx8ICggJE1vdmVUaW1lVHlwZSBuZSAnUGxhbm5lZFN0YXJ0VGltZScgJiYgJE1vdmVUaW1lVHlwZSBuZSAnUGxhbm5lZEVuZFRpbWUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntNb3ZlVGltZVR5cGVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBjb21wbGV0ZW5lc3Mgb2YgdGhlIHRpbWUgcGFyYW1ldGVyIGxpc3QsCiAgICAgICAgIyBvbmx5IGhvdXIgYW5kIG1pbnV0ZSBhcmUgYWxsb3dlZCB0byBiZSAnMCcKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkR2V0UGFyYW17TW92ZVRpbWVZZWFyfQogICAgICAgICAgICB8fCAhJEdldFBhcmFte01vdmVUaW1lTW9udGh9CiAgICAgICAgICAgIHx8ICEkR2V0UGFyYW17TW92ZVRpbWVEYXl9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICRHZXRQYXJhbXtNb3ZlVGltZUhvdXJ9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICRHZXRQYXJhbXtNb3ZlVGltZU1pbnV0ZX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntNb3ZlVGltZUludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBzeXN0ZW0gdGltZSBmcm9tIHRoZSBpbnB1dCwgaWYgaXQgY2FuJ3QgYmUgZGV0ZXJtaW5lZCB3ZSBoYXZlIGEgdmFsaWRhdGlvbiBlcnJvcgogICAgICAgIGlmICggISVWYWxpZGF0aW9uRXJyb3IgKSB7CgogICAgICAgICAgICAjIHRyYW5zZm9ybSBjaGFuZ2UgcGxhbm5lZCB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ01vdmVUaW1lJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICBteSAkUGxhbm5lZFRpbWUgPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVEYXl9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9OwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgb2YgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgJE5ld1RpbWUgPSAkU2VsZi0+X1RpbWVTdGFtcDJFcG9jaCgKICAgICAgICAgICAgICAgIFRpbWVTdGFtcCA9PiAkUGxhbm5lZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTmV3VGltZSApIHsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7TW92ZVRpbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntUZW1wbGF0ZUlEU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggISVWYWxpZGF0aW9uRXJyb3IgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBjaGFuZ2UgYmFzZWQgb24gdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIG15ICRDaGFuZ2VJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBOZXdUaW1lSW5FcG9jaGUgPT4gJE5ld1RpbWUsCiAgICAgICAgICAgICAgICBNb3ZlVGltZVR5cGUgICAgPT4gJEdldFBhcmFte01vdmVUaW1lVHlwZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoYW5nZSBjb3VsZCBub3QgYmUgY3JlYXRlZAogICAgICAgICAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gYWRkaW5nIGZhaWxlZAogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdXYXMgbm90IGFibGUgdG8gY3JlYXRlIGNoYW5nZSBmcm9tIHRlbXBsYXRlIScpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhlIGNoYW5nZSBhZGQgbWFzayB3YXMgY2FsbGVkIGZyb20gdGhlIHRpY2tldCB6b29tCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICAgICAjIGxpbmsgdGlja2V0IHdpdGggbmV3bHkgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgICAgIG15ICRMaW5rU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsaW5rIGNvdWxkIG5vdCBiZSBhZGRlZAogICAgICAgICAgICAgICAgaWYgKCAhJExpbmtTdWNjZXNzICkgewoKICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAiQ2hhbmdlIHdpdGggQ2hhbmdlSUQgJENoYW5nZUlEIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiYnV0IGEgbGluayB0byBUaWNrZXQgd2l0aCBUaWNrZXRJRCAkR2V0UGFyYW17VGlja2V0SUR9IGNvdWxkIG5vdCBiZSBjcmVhdGVkISI7CgogICAgICAgICAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSBtYXNrLCB3aGVuIGFkZGluZyB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIENvbW1lbnRMZW5ndGggPT4gMTUsCiAgICAgICAgVGVtcGxhdGVUeXBlICA9PiAnSVRTTUNoYW5nZScsCiAgICApOwogICAgbXkgJFRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZW1wbGF0ZUlEJywKICAgICAgICBEYXRhICAgICAgICAgPT4gJFRlbXBsYXRlTGlzdCwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkVmFsaWRhdGlvbkVycm9ye1RlbXBsYXRlSURTZXJ2ZXJFcnJvcn0gfHwgJycgKSwKICAgICAgICBUcmVlVmlldyAgICAgPT4gMSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgIyBidWlsZCBkcm9wLWRvd24gd2l0aCB0aW1lIHR5cGVzCiAgICBteSAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnTW92ZVRpbWVUeXBlJywKICAgICAgICBEYXRhID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdQbGFubmVkRW5kVGltZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnUGxhbm5lZEVuZFRpbWUnCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9IHx8ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFZhbGlkYXRpb25FcnJvcntNb3ZlVGltZVR5cGVJbnZhbGlkfSB8fCAnJyApLAogICAgKTsKCiAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OlRpbWVQZXJpb2QnKSB9OwoKICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgIG15ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgUHJlZml4ICAgICAgICA9PiAnTW92ZVRpbWUnLAogICAgICAgIE1vdmVUaW1lQ2xhc3MgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRWYWxpZGF0aW9uRXJyb3J7TW92ZVRpbWVJbnZhbGlkfSB8fCAnJyApLAogICAgICAgIFZhbGlkYXRlICAgICAgPT4gMSwKICAgICAgICAlVGltZVBlcmlvZCwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdBZGQnLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nICAgICA9PiAkVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZyA9PiAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBNb3ZlVGltZVNlbGVjdGlvblN0cmluZyAgICAgPT4gJE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9UaW1lU3RhbXAyRXBvY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtLCApID0gQF87CgogICAgbXkgJFRpbWVTdGFtcCAgICAgID0gJFBhcmFte1RpbWVTdGFtcH07CiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkVGltZVN0YW1wLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJERhdGVUaW1lT2JqZWN0OwoKICAgIHJldHVybiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufQogICAgICAgICAgICApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBjaGFuZ2UgZm91bmQgZm9yIGNoYW5nZUlEICVzLicsICRDaGFuZ2VJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIGl0IHJlbG9hZGFibGUKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhUZW1wbGF0ZU5hbWUgQ29tbWVudCBWYWxpZElEKSkgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIHJldHVybiBTZXJ2ZXJFcnJvciBjbGFzcyB3aGVuIG5lZWRlZAogICAgbXkgJVNlcnZlckVycm9yOwoKICAgICMgYWRkIGEgdGVtcGxhdGUKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRUZW1wbGF0ZScgKSB7CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHRlbXBsYXRlIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSApIHsKICAgICAgICAgICAgJFNlcnZlckVycm9ye1RlbXBsYXRlTmFtZVNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICElU2VydmVyRXJyb3IgKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgICAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICAgICAjIHNlcmlhbGl6ZSB0aGUgY2hhbmdlCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUNvbnRlbnQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdDQUInLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVDb250ZW50ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIENBQiBvZiBjaGFuZ2UgIiVzIiBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4nLCAkQ2hhbmdlSUQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHNlcmlhbGl6ZWQgY2hhbmdlCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdDQUInLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgID0+ICRUZW1wbGF0ZUNvbnRlbnQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBhZGQgdGhlIHRlbXBsYXRlLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXZlcnl0aGluZyB3ZW50IHdlbGwsIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucztDaGFuZ2VJRD0kQ2hhbmdlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZScpLAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwoKICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgbXkgJFZhbGlkU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtWYWxpZElEfSB8fCAoICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApWzBdLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBWYWxpZFNlbGVjdGlvblN0cmluZyA9PiAkVmFsaWRTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb24ucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VDb25kaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIHRoaXMgcGFnZSByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoQ2hhbmdlSUQgQ29uZGl0aW9uSUQgQWRkQ29uZGl0aW9uKSkgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkR2V0UGFyYW17Q2hhbmdlSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENoYW5nZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259CiAgICAgICAgICAgICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlRGF0YSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkR2V0UGFyYW17Q2hhbmdlSUR9ICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgIyBhZGQgY29uZGl0aW9uIGJ1dHRvbiB3YXMgcHJlc3NlZAogICAgaWYgKCAkR2V0UGFyYW17QWRkQ29uZGl0aW9ufSApIHsKCiAgICAgICAgIyByZWRpcmVjdCB0byBjb25kaXRpb24gZWRpdCBtYXNrCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH07Q29uZGl0aW9uSUQ9TkVXIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBvYmplY3QKICAgIG15ICRDb25kaXRpb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpOwoKICAgICMgZ2V0IGFsbCBjb25kaXRpb24gaWRzIGZvciB0aGUgZ2l2ZW4gY2hhbmdlIGlkLCBpbmNsdWRpbmcgaW52YWxpZCBjb25kaXRpb25zCiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkR2V0UGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFZhbGlkICAgID0+IDAsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGEgY29uZGl0aW9uIHNob3VsZCBiZSBkZWxldGVkCiAgICBmb3IgbXkgJENvbmRpdGlvbklEICggQHskQ29uZGl0aW9uSURzUmVmfSApIHsKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZWxldGVDb25kaXRpb25JRDo6JyAuICRDb25kaXRpb25JRCApICkgewoKICAgICAgICAgICAgIyBkZWxldGUgdGhlIGNvbmRpdGlvbgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkRlbGV0ZSgKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgZGVsZXRlIENvbmRpdGlvbklEICVzIScsICRDb25kaXRpb25JRCApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb25seSBzaG93IHRoZSB0YWJsZSBoZWFkbGluZSBpZiB0aGVyZSBjb25kaXRpb25zIHRvIGJlIHNob3duCiAgICBpZiAoIEB7JENvbmRpdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRDaGFuZ2VEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBAeyRDb25kaXRpb25JRHNSZWZ9ICkgewoKICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgIG15ICRDb25kaXRpb25EYXRhID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uR2V0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByb3cKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRDb25kaXRpb25EYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICV7JENvbmRpdGlvbkRhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnT3ZlcnZpZXcnKSwKICAgICAgICBUeXBlICA9PiAnU21hbGwnLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VDb25kaXRpb24nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlRGF0YX0sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KAogICAgICAgIENoYW5nZUlEIENvbmRpdGlvbklEIE5hbWUgQ29tbWVudCBFeHByZXNzaW9uQ29uanVuY3Rpb24gVmFsaWRJRCBEZWxldGVFeHByZXNzaW9uSUQgRGVsZXRlQWN0aW9uSUQKICAgICAgICBTYXZlIEFkZEFjdGlvbiBBZGRFeHByZXNzaW9uIE5ld0V4cHJlc3Npb24gTmV3QWN0aW9uIEVsZW1lbnRDaGFuZ2VkIFVwZGF0ZURpdk5hbWUpCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hhbmdlSUQgQ29uZGl0aW9uSUQpKSB7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gJXMgaXMgZ2l2ZW4hJywgJE5lZWRlZCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkR2V0UGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkR2V0UGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgZXhpc3RzCiAgICBpZiAoICEkQ2hhbmdlRGF0YSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkR2V0UGFyYW17Q2hhbmdlSUR9ICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCk7CgogICAgbXkgJEV4cHJlc3Npb25JRHNSZWYgPSBbXTsKICAgIG15ICRBY3Rpb25JRHNSZWYgICAgID0gW107CgogICAgIyBnZXQgY29uZGl0aW9uIG9iamVjdAogICAgbXkgJENvbmRpdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyk7CgogICAgIyBvbmx5IGdldCBleHByZXNzaW9uIGxpc3QgYW5kIGFjdGlvbiBsaXN0IGlmIGNvbmRpdGlvbiBleGlzdHMgYWxyZWFkeQogICAgaWYgKCAkR2V0UGFyYW17Q29uZGl0aW9uSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGdldCBhbGwgZXhwcmVzc2lvbiBpZHMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgICAgICAkRXhwcmVzc2lvbklEc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25MaXN0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkR2V0UGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIGFjdGlvbiBpZHMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgICAgICAkQWN0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uTGlzdCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJEdldFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZXNlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgQFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY29uZGl0aW9uIHNhdmUgKGFsc28gYWRkL2RlbGV0ZSBleHByZXNzaW9uIGFuZCBhZGQvZGVsZXRlIGFjdGlvbikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgdXBkYXRlIG9ubHkgaWYgQ29uZGl0aW9uTmFtZSBpcyBnaXZlbgogICAgICAgIGlmICggISRHZXRQYXJhbXtOYW1lfSApIHsKICAgICAgICAgICAgJFBhcmFte0ludmFsaWROYW1lfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkTmFtZSc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGNvbmRpdGlvbiBuYW1lIGlzIGFscmVhZHkgdXNlZAogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjaGVjayBpZiBjb25kaXRpb24gbmFtZSBleGlzdHMgYWxyZWFkeSBmb3IgdGhpcyBjaGFuZ2UKICAgICAgICAgICAgbXkgJENvbmRpdGlvbklEID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTG9va3VwKAogICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaXQgaXMgb25seSBhbiBlcnJvciBpZiBhbm90aGVyIGNvbmRpdGlvbiBvZiB0aGlzIGNoYW5nZSB1c2VzIHRoaXMgbmFtZQogICAgICAgICAgICAjIGNoYW5naW5nIHRoZSBuYW1lIG9mIGEgY29uZGl0aW9uIGlzIHN0aWxsIHBvc3NpYmxlCiAgICAgICAgICAgIGlmICggJENvbmRpdGlvbklEICYmICggJEdldFBhcmFte0NvbmRpdGlvbklEfSBuZSAkQ29uZGl0aW9uSUQgKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEdXBsaWNhdGVOYW1lfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnRHVwbGljYXRlTmFtZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgYWxsIHBhc3NlZCBkYXRhIGlzIHZhbGlkCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIGFkZCBhIG5ldyBjb25kaXRpb24KICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q29uZGl0aW9uSUR9IGVxICdORVcnICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IGNvbmRpdGlvbgogICAgICAgICAgICAgICAgJEdldFBhcmFte0NvbmRpdGlvbklEfSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkFkZCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25Db25qdW5jdGlvbiA9PiAkR2V0UGFyYW17RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0NvbmRpdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBjcmVhdGUgbmV3IGNvbmRpdGlvbiEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSBhbiBleGlzdGluZyBjb25kaXRpb24KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIGNvbmRpdGlvbgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25VcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJEdldFBhcmFte0V4cHJlc3Npb25Db25qdW5jdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgdXBkYXRlIENvbmRpdGlvbklEICVzIScsICRHZXRQYXJhbXtDb25kaXRpb25JRH0KICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgYWxsIGV4aXN0aW5nIGV4cHJlc3Npb24gZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkRXhwcmVzc2lvbklEICggQHskRXhwcmVzc2lvbklEc1JlZn0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZXhwcmVzc2lvbiBmaWVsZHMKICAgICAgICAgICAgICAgIG15ICVFeHByZXNzaW9uRGF0YTsKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgQ29tcGFyZVZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICRFeHByZXNzaW9uRGF0YXskRmllbGR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0V4cHJlc3Npb25JRC0nIC4gJEV4cHJlc3Npb25JRCAuICctJyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZXhpc3RpbmcgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAgICAgIyAoYWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBlbXB0eSkKICAgICAgICAgICAgICAgIG15ICRGaWVsZHNPayA9IDE7CiAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQpKSB7CgogICAgICAgICAgICAgICAgICAgICMgbmV3IGV4cHJlc3Npb24gaXMgbm90IGNvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEV4cHJlc3Npb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZHNPayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIGV4aXN0aW5nIGV4cHJlc3Npb24gb25seSBpZiBhbGwgZmllbGRzIGFyZSBjb21wbGV0ZQogICAgICAgICAgICAgICAgaWYgKCRGaWVsZHNPaykgewoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvblVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICA9PiAkRXhwcmVzc2lvbkRhdGF7T2JqZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JJRCAgID0+ICRFeHByZXNzaW9uRGF0YXtPcGVyYXRvcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRFeHByZXNzaW9uRGF0YXtTZWxlY3Rvcn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBkZWZpbmVkICRFeHByZXNzaW9uRGF0YXtDb21wYXJlVmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICAgID8gJEV4cHJlc3Npb25EYXRhe0NvbXBhcmVWYWx1ZX0KICAgICAgICAgICAgICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgdXBkYXRlIEV4cHJlc3Npb25JRCAlcyEnLCAkRXhwcmVzc2lvbklECiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgbmV3IGV4cHJlc3Npb24gZmllbGRzCiAgICAgICAgICAgIG15ICVFeHByZXNzaW9uRGF0YTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCBDb21wYXJlVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkRXhwcmVzc2lvbkRhdGF7JEZpZWxkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0V4cHJlc3Npb25JRC1ORVctJyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgbmV3IGV4cHJlc3Npb24gaXMgY29tcGxldGUKICAgICAgICAgICAgIyAoYWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBlbXB0eSkKICAgICAgICAgICAgbXkgJEZpZWxkc09rID0gMTsKICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQpKSB7CgogICAgICAgICAgICAgICAgIyBuZXcgZXhwcmVzc2lvbiBpcyBub3QgY29tcGxldGUKICAgICAgICAgICAgICAgIGlmICggISRFeHByZXNzaW9uRGF0YXskRmllbGR9ICkgewogICAgICAgICAgICAgICAgICAgICRGaWVsZHNPayA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBGSUVMRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgbmV3IGV4cHJlc3Npb24KICAgICAgICAgICAgaWYgKCRGaWVsZHNPaykgewoKICAgICAgICAgICAgICAgICMgYWRkIG5ldyBleHByZXNzaW9uCiAgICAgICAgICAgICAgICBteSAkRXhwcmVzc2lvbklEID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkFkZCgKICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJEdldFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgPT4gJEV4cHJlc3Npb25EYXRhe09iamVjdElEfSwKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcklEICAgPT4gJEV4cHJlc3Npb25EYXRhe09wZXJhdG9ySUR9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkRXhwcmVzc2lvbkRhdGF7U2VsZWN0b3J9LAogICAgICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBkZWZpbmVkICRFeHByZXNzaW9uRGF0YXtDb21wYXJlVmFsdWV9CiAgICAgICAgICAgICAgICAgICAgPyAkRXhwcmVzc2lvbkRhdGF7Q29tcGFyZVZhbHVlfQogICAgICAgICAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJEV4cHJlc3Npb25JRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgYWRkIG5ldyBFeHByZXNzaW9uIScpLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIGFsbCBleGlzdGluZyBhY3Rpb24gZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBAeyRBY3Rpb25JRHNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGFjdGlvbiBmaWVsZHMKICAgICAgICAgICAgICAgIG15ICVBY3Rpb25EYXRhOwogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCBBY3Rpb25WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uRGF0YXskRmllbGR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0FjdGlvbklELScgLiAkQWN0aW9uSUQgLiAnLScgLiAkRmllbGQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGV4aXN0aW5nIGFjdGlvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAgICAgIyAoYWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCwgQWN0aW9uVmFsdWUgY2FuIGJlIGVtcHR5KQogICAgICAgICAgICAgICAgbXkgJEZpZWxkc09rID0gMTsKICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBuZXcgYWN0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgICAgICAgICAgICAgICAgIGlmICggISRBY3Rpb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZHNPayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIGV4aXN0aW5nIGFjdGlvbiBvbmx5IGlmIGFsbCBmaWVsZHMgYXJlIGNvbXBsZXRlCiAgICAgICAgICAgICAgICBpZiAoJEZpZWxkc09rKSB7CgogICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIHRoZSBhY3Rpb24KICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvblVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uSUQgICAgPT4gJEFjdGlvbklELAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkQWN0aW9uRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBY3Rpb25EYXRhe0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JJRCAgPT4gJEFjdGlvbkRhdGF7T3BlcmF0b3JJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRBY3Rpb25EYXRhe1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gJEFjdGlvbkRhdGF7QWN0aW9uVmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCB1cGRhdGUgQWN0aW9uSUQgJXMhJywgJEFjdGlvbklEICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBuZXcgYWN0aW9uIGZpZWxkcwogICAgICAgICAgICBteSAlQWN0aW9uRGF0YTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCBBY3Rpb25WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICRBY3Rpb25EYXRheyRGaWVsZH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdBY3Rpb25JRC1ORVctJyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgbmV3IGFjdGlvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAjIChhbGwgcmVxdWlyZWQgZmllbGRzIG11c3QgYmUgZmlsbGVkLCBBY3Rpb25WYWx1ZSBjYW4gYmUgZW1wdHkpCiAgICAgICAgICAgICRGaWVsZHNPayA9IDE7CiAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPYmplY3RJRCBTZWxlY3RvciBBdHRyaWJ1dGVJRCBPcGVyYXRvcklEKSkgewoKICAgICAgICAgICAgICAgICMgbmV3IGFjdGlvbiBpcyBub3QgY29tcGxldGUKICAgICAgICAgICAgICAgIGlmICggISRBY3Rpb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkc09rID0gMDsKICAgICAgICAgICAgICAgICAgICBsYXN0IEZJRUxEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBuZXcgYWN0aW9uCiAgICAgICAgICAgIGlmICgkRmllbGRzT2spIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBuZXcgYWN0aW9uCiAgICAgICAgICAgICAgICBteSAkQWN0aW9uSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25BZGQoCiAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJEdldFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkQWN0aW9uRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJEFjdGlvbkRhdGF7QXR0cmlidXRlSUR9LAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgID0+ICRBY3Rpb25EYXRhe09wZXJhdG9ySUR9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRBY3Rpb25EYXRhe1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb25WYWx1ZSA9PiAkQWN0aW9uRGF0YXtBY3Rpb25WYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICBpZiAoICEkQWN0aW9uSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGFkZCBuZXcgQWN0aW9uIScpLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBqdXN0IHRoZSBzYXZlIGJ1dHRvbiB3YXMgcHJlc3NlZCwgcmVkaXJlY3QgdG8gY29uZGl0aW9uIG92ZXJ2aWV3CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1NhdmV9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uO0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBleHByZXNzaW9uIGFkZCBidXR0b24gd2FzIHByZXNzZWQKICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QWRkRXhwcmVzc2lvbn0gKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBlZGl0IHZpZXcgYWdhaW4sIGJ1dCBub3cgd2l0aCBhIG5ldyBlbXB0eSBleHByZXNzaW9uIGxpbmUKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfTsiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbklEPSRHZXRQYXJhbXtDb25kaXRpb25JRH07TmV3RXhwcmVzc2lvbj0xIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWN0aW9uIGFkZCBidXR0b24gd2FzIHByZXNzZWQKICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QWRkQWN0aW9ufSApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgdGhlIGVkaXQgdmlldyBhZ2FpbiwgYnV0IG5vdyB3aXRoIGEgbmV3IGVtcHR5IGFjdGlvbiBsaW5lCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH07IgogICAgICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9O05ld0FjdGlvbj0xIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgYW4gZXhwcmVzc2lvbiBzaG91bGQgYmUgZGVsZXRlZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWxldGVFeHByZXNzaW9uSUR9ICYmICRHZXRQYXJhbXtEZWxldGVFeHByZXNzaW9uSUR9IG5lICdORVcnICkgewoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRHZXRQYXJhbXtEZWxldGVFeHByZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGRlbGV0ZSBFeHByZXNzaW9uSUQgJXMhJywgJEdldFBhcmFte0RlbGV0ZUV4cHJlc3Npb25JRH0KICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBlZGl0IHZpZXcgYWdhaW4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfTsiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbklEPSRHZXRQYXJhbXtDb25kaXRpb25JRH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBhbiBhY3Rpb24gc2hvdWxkIGJlIGRlbGV0ZWQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVsZXRlQWN0aW9uSUR9ICYmICRHZXRQYXJhbXtEZWxldGVBY3Rpb25JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGFjdGlvbgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uSUQgPT4gJEdldFBhcmFte0RlbGV0ZUFjdGlvbklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGRlbGV0ZSBBY3Rpb25JRCAlcyEnLCAkR2V0UGFyYW17RGVsZXRlQWN0aW9uSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgZWRpdCB2aWV3IGFnYWluCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH07IgogICAgICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyB0aGUgZWRpdCB2aWV3IGFnYWluCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdDtDaGFuZ2VJRD0kR2V0UGFyYW17Q2hhbmdlSUR9OyIKICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBoYW5kbGUgQUpBWFVwZGF0ZSAoY2hhbmdlIHRoZSBjb250ZW50IG9mIGRyb3Bkb3dubGlzdHMpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgdG8gc3RvcmUgdGhlIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT047CgogICAgICAgICMgZXhwcmVzc2lvbiBvciBhY3Rpb24gZmllbGQgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPX4gbXsgXEEgKCBFeHByZXNzaW9uSUQgfCBBY3Rpb25JRCApIC0gKCBcZCsgfCBORVcgKSB9eG1zICkKICAgICAgICB7CgogICAgICAgICAgICAjIGdldCBpZCBuYW1lIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50ICggJ0V4cHJlc3Npb25JRCcgb3IgJ0FjdGlvbklEJyApCiAgICAgICAgICAgIG15ICRJRE5hbWUgPSAkMTsKCiAgICAgICAgICAgICMgZ2V0IGlkIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50CiAgICAgICAgICAgIG15ICRJRCA9ICQyOwoKICAgICAgICAgICAgIyBnZXQgdmFsdWUgZmllbGQgbmFtZQogICAgICAgICAgICBteSAkVmFsdWVGaWVsZE5hbWU7CiAgICAgICAgICAgIGlmICggJElETmFtZSBlcSAnRXhwcmVzc2lvbklEJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdDb21wYXJlVmFsdWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJElETmFtZSBlcSAnQWN0aW9uSUQnICkgewogICAgICAgICAgICAgICAgJFZhbHVlRmllbGROYW1lID0gJ0FjdGlvblZhbHVlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZXhwcmVzc2lvbiBvciBhY3Rpb24gZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgQ29tcGFyZVZhbHVlIEFjdGlvblZhbHVlKSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRGaWVsZH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLScgLiAkRmllbGQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBvYmplY3Qgc2VsZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+X0dldE9iamVjdFNlbGVjdGlvbigpOwoKICAgICAgICAgICAgIyBnZXQgc2VsZWN0b3Igc2VsZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJFNlbGVjdG9yTGlzdCA9ICRTZWxmLT5fR2V0U2VsZWN0b3JTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkR2V0UGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJEdldFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgICAgICRJRE5hbWUgICAgID0+ICRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGF0dHJpYnV0ZSBzZWxlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkQXR0cmlidXRlTGlzdCA9ICRTZWxmLT5fR2V0QXR0cmlidXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gJEdldFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yID0+ICRHZXRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgICAgICAkSUROYW1lICA9PiAkSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBvcGVyYXRvciBzZWxlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkT3BlcmF0b3JMaXN0ID0gJFNlbGYtPl9HZXRPcGVyYXRvclNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRHZXRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkR2V0UGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICAgICAgICAgJElETmFtZSAgICAgPT4gJElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0b3Igc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgbXkgJFBvc3NpYmxlTm9uZVNlbGVjdG9yID0gMDsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxlY3Rvckxpc3QKICAgICAgICAgICAgICAgIHx8ICFyZWYgJFNlbGVjdG9yTGlzdCBlcSAnSEFTSCcKICAgICAgICAgICAgICAgIHx8ICEleyRTZWxlY3Rvckxpc3R9CiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLU9iamVjdElEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUG9zc2libGVOb25lU2VsZWN0b3IgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBhbiBlbXB0eSBhdHRyaWJ1dGUgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgbXkgJFBvc3NpYmxlTm9uZUF0dHJpYnV0ZUlEID0gMDsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRBdHRyaWJ1dGVMaXN0CiAgICAgICAgICAgICAgICB8fCAhcmVmICRBdHRyaWJ1dGVMaXN0IGVxICdIQVNIJwogICAgICAgICAgICAgICAgfHwgISV7JEF0dHJpYnV0ZUxpc3R9CiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLU9iamVjdElEJwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy1TZWxlY3RvcicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZUF0dHJpYnV0ZUlEID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgYW4gZW1wdHkgb3BlcmF0b3Igc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgbXkgJFBvc3NpYmxlTm9uZU9wZXJhdG9ySUQgPSAwOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJE9wZXJhdG9yTGlzdAogICAgICAgICAgICAgICAgfHwgIXJlZiAkT3BlcmF0b3JMaXN0IGVxICdIQVNIJwogICAgICAgICAgICAgICAgfHwgISV7JE9wZXJhdG9yTGlzdH0KICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJElETmFtZSAuICctJyAuICRJRCAuICctT2JqZWN0SUQnCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLVNlbGVjdG9yJwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy1BdHRyaWJ1dGVJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZU9wZXJhdG9ySUQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG9iamVjdCB3YXMgY2hhbmdlZCwgcmVzZXQgdGhlIGF0dHJpYnV0ZSBhbmQgb3BlcmF0b3IgbGlzdAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJElETmFtZSAuICctJyAuICRJRCAuICctT2JqZWN0SUQnICkgewogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZUxpc3QgPSB7fTsKICAgICAgICAgICAgICAgICRPcGVyYXRvckxpc3QgID0ge307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQganNvbgogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy1PYmplY3RJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLVNlbGVjdG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZWxlY3Rvckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUG9zc2libGVOb25lU2VsZWN0b3IgPyAnJyA6ICRHZXRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lU2VsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJElETmFtZSAuICctJyAuICRJRCAuICctQXR0cmlidXRlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEF0dHJpYnV0ZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17QXR0cmlidXRlSUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZUF0dHJpYnV0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLU9wZXJhdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtPcGVyYXRvcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmVPcGVyYXRvcklELAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIGpzb24KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaGFuZGxlIEFKQVhVcGRhdGUgKHJlcGxhY2UgdGhlIGZpZWxkIHR5cGUsIGUuZy4gcmVwbGFjZSBhIHRleHQgZmllbGQgd2l0aCBhIHNlbGVjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYQ29udGVudFVwZGF0ZScgKSB7CgogICAgICAgICMgdG8gc3RvcmUgdGhlIEhUTUwgc3RyaW5nIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBicm93c2VyCiAgICAgICAgbXkgJEhUTUxTdHJpbmc7CgogICAgICAgICMgZXhwcmVzc2lvbiBvciBhY3Rpb24gZmllbGQgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPX4gbXsgXEEgKCBFeHByZXNzaW9uSUQgfCBBY3Rpb25JRCApIFwtICggXGQrIHwgTkVXICkgfXhtcyApCiAgICAgICAgewoKICAgICAgICAgICAgIyBnZXQgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgICAgICAgICBteSAkSUROYW1lID0gJDE7CgogICAgICAgICAgICAjIGdldCBpZCBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudAogICAgICAgICAgICBteSAkSUQgPSAkMjsKCiAgICAgICAgICAgICMgZ2V0IHZhbHVlIGZpZWxkIG5hbWUKICAgICAgICAgICAgbXkgJFZhbHVlRmllbGROYW1lOwogICAgICAgICAgICBpZiAoICRJRE5hbWUgZXEgJ0V4cHJlc3Npb25JRCcgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWVGaWVsZE5hbWUgPSAnQ29tcGFyZVZhbHVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJRE5hbWUgZXEgJ0FjdGlvbklEJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdBY3Rpb25WYWx1ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGV4cHJlc3Npb24gb3IgYWN0aW9uIGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPYmplY3RJRCBTZWxlY3RvciBBdHRyaWJ1dGVJRCBPcGVyYXRvcklEIENvbXBhcmVWYWx1ZSBBY3Rpb25WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskRmllbGR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy0nIC4gJEZpZWxkLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgY29tcGFyZSB2YWx1ZSBmaWVsZCB0eXBlCiAgICAgICAgICAgIG15ICRGaWVsZFR5cGUgPSAkU2VsZi0+X0dldENvbXBhcmVWYWx1ZUZpZWxkVHlwZSglR2V0UGFyYW0pOwoKICAgICAgICAgICAgIyBidWlsZCBDb21wYXJlVmFsdWUgc2VsZWN0aW9uCiAgICAgICAgICAgIGlmICggJEZpZWxkVHlwZSBlcSAnU2VsZWN0aW9uJyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBjb21wYXJlIHZhbHVlIHNlbGVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRTZWxmLT5fR2V0Q29tcGFyZVZhbHVlU2VsZWN0aW9uKCVHZXRQYXJhbSk7CgogICAgICAgICAgICAgICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQb3NzaWJsZU5vbmV9CiAgICAgICAgICAgICAgICAgICAgfHwgISRQYXJhbXskVmFsdWVGaWVsZE5hbWV9CiAgICAgICAgICAgICAgICAgICAgfHwgISRDb21wYXJlVmFsdWVMaXN0CiAgICAgICAgICAgICAgICAgICAgfHwgKCByZWYgJENvbXBhcmVWYWx1ZUxpc3QgZXEgJ0hBU0gnICAmJiAhJXskQ29tcGFyZVZhbHVlTGlzdH0gKQogICAgICAgICAgICAgICAgICAgIHx8ICggcmVmICRDb21wYXJlVmFsdWVMaXN0IGVxICdBUlJBWScgJiYgIUB7JENvbXBhcmVWYWx1ZUxpc3R9ICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSBWYWx1ZU9wdGlvblN0cmluZwogICAgICAgICAgICAgICAgJEhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvbXBhcmVWYWx1ZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnLScgLiAkSUQgLiAnLScgLiAkVmFsdWVGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskVmFsdWVGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCB0ZXh0IGlucHV0IGZpZWxkCiAgICAgICAgICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnVGV4dCcgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBhbiBlbXB0eSBpbnB1dCBmaWVsZAogICAgICAgICAgICAgICAgJEhUTUxTdHJpbmcgPSAnJwogICAgICAgICAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJ0ZXh0IiAnCiAgICAgICAgICAgICAgICAgICAgLiAnaWQ9IicgLiAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy0nIC4gJFZhbHVlRmllbGROYW1lIC4gJyIgJwogICAgICAgICAgICAgICAgICAgIC4gJ25hbWU9IicgLiAkSUROYW1lIC4gJy0nIC4gJElEIC4gJy0nIC4gJFZhbHVlRmllbGROYW1lIC4gJyIgJwogICAgICAgICAgICAgICAgICAgIC4gJ3ZhbHVlPSIiIGNsYXM9Ilc3NXBjIiBtYXhsZW5ndGg9IjI1MCIgLz4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgZm9yIHVua25vd24gZmllbGQgdHlwZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRIVE1MU3RyaW5nID0gJzxzcGFuPjxiPicKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0Vycm9yOiBVbmtub3duIGZpZWxkIHR5cGUgIiVzIiEnLCAkRmllbGRUeXBlICkKICAgICAgICAgICAgICAgICAgICAuICc8L2I+PC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIEhUTUwKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRIVE1MU3RyaW5nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY29uZGl0aW9uIGVkaXQgdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIG15ICVDb25kaXRpb25EYXRhOwoKICAgICMgZ2V0IENvbmRpdGlvbklECiAgICAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0gPSAkR2V0UGFyYW17Q29uZGl0aW9uSUR9OwoKICAgICMgaWYgdGhpcyBpcyBhbiBleGlzdGluZyBjb25kaXRpb24KICAgIGlmICggJENvbmRpdGlvbkRhdGF7Q29uZGl0aW9uSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgIG15ICRDb25kaXRpb24gPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25EYXRhe0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbmRpdGlvbiBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjaGFuZ2UKICAgICAgICBpZiAoICRDb25kaXRpb24tPntDaGFuZ2VJRH0gbmUgJEdldFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvbmRpdGlvbklEICVzIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgZ2l2ZW4gQ2hhbmdlSUQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NoYW5nZUlEfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGRhdGEgZnJvbSBjb25kaXRpb24KICAgICAgICAlQ29uZGl0aW9uRGF0YSA9ICggJUNvbmRpdGlvbkRhdGEsICV7JENvbmRpdGlvbn0gKTsKCiAgICAgICAgIyBzaG93IGV4aXN0aW5nIGV4cHJlc3Npb25zCiAgICAgICAgJFNlbGYtPl9FeHByZXNzaW9uT3ZlcnZpZXcoCiAgICAgICAgICAgICV7JENoYW5nZURhdGF9LAogICAgICAgICAgICAlQ29uZGl0aW9uRGF0YSwKICAgICAgICAgICAgRXhwcmVzc2lvbklEcyA9PiAkRXhwcmVzc2lvbklEc1JlZiwKICAgICAgICAgICAgTmV3RXhwcmVzc2lvbiA9PiAkR2V0UGFyYW17TmV3RXhwcmVzc2lvbn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGV4aXN0aW5nIGFjdGlvbnMKICAgICAgICAkU2VsZi0+X0FjdGlvbk92ZXJ2aWV3KAogICAgICAgICAgICAleyRDaGFuZ2VEYXRhfSwKICAgICAgICAgICAgJUNvbmRpdGlvbkRhdGEsCiAgICAgICAgICAgIEFjdGlvbklEcyA9PiAkQWN0aW9uSURzUmVmLAogICAgICAgICAgICBOZXdBY3Rpb24gPT4gJEdldFBhcmFte05ld0FjdGlvbn0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dOb0RhdGEnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3Um93Tm9EYXRhJyApOwogICAgfQoKICAgICMgZ2V0IGV4cHJlc3Npb24gY29uanVuY3Rpb24gZnJvbSBjb25kaXRpb24KICAgIGlmICggISRHZXRQYXJhbXtFeHByZXNzaW9uQ29uanVuY3Rpb259ICkgewogICAgICAgICRHZXRQYXJhbXtFeHByZXNzaW9uQ29uanVuY3Rpb259ID0gJENvbmRpdGlvbkRhdGF7RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSB8fCAnJzsKICAgIH0KCiAgICAjIHNldCByYWRpbyBidXR0b25zIGZvciBleHByZXNzaW9uIGNvbmp1bmN0aW9uCiAgICBpZiAoICRHZXRQYXJhbXtFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbGwnICkgewogICAgICAgICRDb25kaXRpb25EYXRhe2FsbHNlbGVjdGVkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29uZGl0aW9uRGF0YXthbnlzZWxlY3RlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmluZwogICAgJENvbmRpdGlvbkRhdGF7VmFsaWRPcHRpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRDb25kaXRpb25EYXRhe1ZhbGlkSUR9IHx8ICggJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpIClbMF0sCiAgICAgICAgU29ydCAgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgYWRkIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgbXkgJEJsb2NrTmFtZSAoQFZhbGlkYXRpb25FcnJvcnMpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlRGF0YX0sCiAgICAgICAgICAgICVDb25kaXRpb25EYXRhLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyBzaG93IGV4aXN0aW5nIGV4cHJlc3Npb25zCnN1YiBfRXhwcmVzc2lvbk92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17RXhwcmVzc2lvbklEc307CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtFeHByZXNzaW9uSURzfSBuZSAnQVJSQVknOwoKICAgIG15IEBFeHByZXNzaW9uSURzID0gQHsgJFBhcmFte0V4cHJlc3Npb25JRHN9IH07CgogICAgIyBhbHNvIHNob3cgYSBuZXcgZW1wdHkgZXhwcmVzc2lvbiBsaW5lCiAgICBpZiAoICRQYXJhbXtOZXdFeHByZXNzaW9ufSApIHsKICAgICAgICBwdXNoIEBFeHByZXNzaW9uSURzLCAnTkVXJzsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGlmICggIUBFeHByZXNzaW9uSURzICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dOb0RhdGEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIEVYUFJFU1NJT05JRDoKICAgIGZvciBteSAkRXhwcmVzc2lvbklEICggc29ydCB7ICRhIGNtcCAkYiB9IEBFeHByZXNzaW9uSURzICkgewoKICAgICAgICAjIHRvIHN0b3JlIHRoZSBkYXRlIG9mIGFuIGV4cHJlc3Npb24KICAgICAgICBteSAkRXhwcmVzc2lvbkRhdGEgPSB7fTsKCiAgICAgICAgIyBzZXQgZXhwcmVzc2lvbiBpZCB0byAnTkVXJyBmb3IgZnVydGhlciBmdW5jdGlvbiBjYWxscwogICAgICAgIGlmICggJEV4cHJlc3Npb25JRCBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJEV4cHJlc3Npb25EYXRhLT57RXhwcmVzc2lvbklEfSA9ICRFeHByZXNzaW9uSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkYXRhIGZvciBhbiBleGlzdGluZyBleHByZXNzaW9uCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgICAgICAkRXhwcmVzc2lvbkRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5FeHByZXNzaW9uR2V0KAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9OSUQgaWYgISRFeHByZXNzaW9uRGF0YTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJvdwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7JEV4cHJlc3Npb25EYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb2JqZWN0IHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd09iamVjdFNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRFeHByZXNzaW9uRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHNlbGVjb3Igc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPl9TaG93U2VsZWN0b3JTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskRXhwcmVzc2lvbkRhdGF9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBhdHRyaWJ1dGUgc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPl9TaG93QXR0cmlidXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JEV4cHJlc3Npb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb3BlcmF0b3Igc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPl9TaG93T3BlcmF0b3JTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskRXhwcmVzc2lvbkRhdGF9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBjb21wYXJlIHZhbHVlIGZpZWxkCiAgICAgICAgJFNlbGYtPl9TaG93Q29tcGFyZVZhbHVlRmllbGQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskRXhwcmVzc2lvbkRhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCiMgc2hvdyBleGlzdGluZyBhY3Rpb25zCnN1YiBfQWN0aW9uT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtBY3Rpb25JRHN9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17QWN0aW9uSURzfSBuZSAnQVJSQVknOwoKICAgIG15IEBBY3Rpb25JRHMgPSBAeyAkUGFyYW17QWN0aW9uSURzfSB9OwoKICAgICMgYWxzbyBzaG93IGEgbmV3IGVtcHR5IGFjdGlvbiBsaW5lCiAgICBpZiAoICRQYXJhbXtOZXdBY3Rpb259ICkgewogICAgICAgIHB1c2ggQEFjdGlvbklEcywgJ05FVyc7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBpZiAoICFAQWN0aW9uSURzICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlld1Jvd05vRGF0YScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgQWN0aW9uSUQ6CiAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCB7ICRhIGNtcCAkYiB9IEBBY3Rpb25JRHMgKSB7CgogICAgICAgICMgdG8gc3RvcmUgdGhlIGRhdGUgb2YgYW4gYWN0aW9uCiAgICAgICAgbXkgJEFjdGlvbkRhdGEgPSB7fTsKCiAgICAgICAgIyBzZXQgYWN0aW9uIGlkIHRvICdORVcnIGZvciBmdXJ0aGVyIGZ1bmN0aW9uIGNhbGxzCiAgICAgICAgaWYgKCAkQWN0aW9uSUQgZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRBY3Rpb25EYXRhLT57QWN0aW9uSUR9ID0gJEFjdGlvbklEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGF0YSBmb3IgYW4gZXhpc3RpbmcgYWN0aW9uCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgICAgICAkQWN0aW9uRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkFjdGlvbkdldCgKICAgICAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQWN0aW9uSUQgaWYgISRBY3Rpb25EYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcm93CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb2JqZWN0IHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd09iamVjdFNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgc2VsZWNvciBzZWxlY3Rpb24KICAgICAgICAkU2VsZi0+X1Nob3dTZWxlY3RvclNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYXR0cmlidXRlIHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd0F0dHJpYnV0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb3BlcmF0b3Igc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPl9TaG93T3BlcmF0b3JTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQWN0aW9uRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGNvbXBhcmUgdmFsdWUgZmllbGQKICAgICAgICAkU2VsZi0+X1Nob3dDb21wYXJlVmFsdWVGaWVsZCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIHNob3cgb2JqZWN0IGRyb3Bkb3duIGZpZWxkCnN1YiBfU2hvd09iamVjdFNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG9iamVjdCBzZWxlY3Rpb24gbGlzdAogICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+X0dldE9iamVjdFNlbGVjdGlvbiglUGFyYW0pOwoKICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgIGlmICgKICAgICAgICAhJE9iamVjdExpc3QKICAgICAgICB8fCAhcmVmICRPYmplY3RMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRPYmplY3RMaXN0fQogICAgICAgIHx8ICEkUGFyYW17T2JqZWN0SUR9CiAgICAgICAgKQogICAgewogICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgfQoKICAgICMgbmFtZSBvZiB0aGUgZGl2IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15ICRVcGRhdGVEaXZOYW1lOwoKICAgICMgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgbXkgJElETmFtZTsKCiAgICAjIGJsb2NrIG5hbWUgZm9yIHRoZSBvdXRwdXQgbGF5b3V0IGJsb2NrCiAgICBteSAkQmxvY2tOYW1lOwoKICAgICMgZm9yIGV4cHJlc3Npb24gZWxlbWVudHMKICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgPSAiRXhwcmVzc2lvbklELSRQYXJhbXtFeHByZXNzaW9uSUR9LUNvbXBhcmVWYWx1ZS1EaXYiOwogICAgICAgICRJRE5hbWUgICAgICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSAgICAgPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9iamVjdCc7CiAgICB9CgogICAgIyBmb3IgYWN0aW9uIGVsZW1lbnRzCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgPSAiQWN0aW9uSUQtJFBhcmFte0FjdGlvbklEfS1BY3Rpb25WYWx1ZS1EaXYiOwogICAgICAgICRJRE5hbWUgICAgICAgID0gJ0FjdGlvbklEJzsKICAgICAgICAkQmxvY2tOYW1lICAgICA9ICdBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRPYmplY3QnOwogICAgfQoKICAgICMgcGFyYW1ldGVycyBmb3IgYWpheAogICAgJFBhcmFte09iamVjdE9wdGlvbk5hbWV9ID0gJElETmFtZSAuICctJyAuICRQYXJhbXskSUROYW1lfSAuICctT2JqZWN0SUQnOwogICAgJFBhcmFte0lETmFtZX0gICAgICAgICAgID0gJElETmFtZTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyaW5nCiAgICBteSAkT2JqZWN0T3B0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17T2JqZWN0T3B0aW9uTmFtZX0sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICApOwoKICAgICMgb3V0cHV0IG9iamVjdCBzZWxlY3Rpb24KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZSwKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBPYmplY3RPcHRpb25TdHJpbmcgPT4gJE9iamVjdE9wdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBzaG93IHNlbGVjdG9yIGRyb3Bkb3duIGZpZWxkCnN1YiBfU2hvd1NlbGVjdG9yU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VsZWN0b3Igc2VsZWN0aW9uIGxpc3QKICAgIG15ICRTZWxlY3Rvckxpc3QgPSAkU2VsZi0+X0dldFNlbGVjdG9yU2VsZWN0aW9uKCVQYXJhbSk7CgogICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgaWYgKAogICAgICAgICEkU2VsZWN0b3JMaXN0CiAgICAgICAgfHwgIXJlZiAkU2VsZWN0b3JMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRTZWxlY3Rvckxpc3R9CiAgICAgICAgfHwgISRQYXJhbXtTZWxlY3Rvcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICB9CgogICAgIyBpZCBuYW1lIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50ICggJ0V4cHJlc3Npb25JRCcgb3IgJ0FjdGlvbklEJyApCiAgICBteSAkSUROYW1lOwoKICAgICMgYmxvY2sgbmFtZSBmb3IgdGhlIG91dHB1dCBsYXlvdXQgYmxvY2sKICAgIG15ICRCbG9ja05hbWU7CgogICAgIyBmb3IgZXhwcmVzc2lvbiBlbGVtZW50cwogICAgaWYgKCAkUGFyYW17RXhwcmVzc2lvbklEfSApIHsKICAgICAgICAkSUROYW1lICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSA9ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3InOwogICAgfQoKICAgICMgZm9yIGFjdGlvbiBlbGVtZW50cwogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICRJRE5hbWUgICAgPSAnQWN0aW9uSUQnOwogICAgICAgICRCbG9ja05hbWUgPSAnQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3InOwogICAgfQoKICAgICMgcGFyYW1ldGVycyBmb3IgYWpheAogICAgJFBhcmFte09iamVjdE9wdGlvbk5hbWV9ID0gJElETmFtZSAuICctJyAuICRQYXJhbXskSUROYW1lfSAuICctU2VsZWN0b3InOwogICAgJFBhcmFte0lETmFtZX0gICAgICAgICAgID0gJElETmFtZTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2VuZXJhdGUgU2VsZWN0b3JPcHRpb25TdHJpbmcKICAgIG15ICRTZWxlY3Rvck9wdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkU2VsZWN0b3JMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17T2JqZWN0T3B0aW9uTmFtZX0sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICApOwoKICAgICMgb3V0cHV0IHNlbGVjdG9yIHNlbGVjdGlvbgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFNlbGVjdG9yT3B0aW9uU3RyaW5nID0+ICRTZWxlY3Rvck9wdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBzaG93IGF0dHJpYnV0ZSBkcm9wZG93biBmaWVsZApzdWIgX1Nob3dBdHRyaWJ1dGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG5hbWUgb2YgdGhlIGRpdiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkCiAgICBteSAkVXBkYXRlRGl2TmFtZTsKCiAgICAjIGlkIG5hbWUgb2YgdGhlIGludm9sdmVkIGVsZW1lbnQgKCAnRXhwcmVzc2lvbklEJyBvciAnQWN0aW9uSUQnICkKICAgIG15ICRJRE5hbWU7CgogICAgIyBibG9jayBuYW1lIGZvciB0aGUgb3V0cHV0IGxheW91dCBibG9jawogICAgbXkgJEJsb2NrTmFtZTsKCiAgICAjIG5hbWUgb2YgdGhlIHZhbHVlIGZpZWxkICggQ29tcGFyZVZhbHVlIG9yIEFjdGlvblZhbHVlICkKICAgIG15ICRWYWx1ZUZpZWxkTmFtZTsKCiAgICAjIGZvciBleHByZXNzaW9uIGVsZW1lbnRzCiAgICBpZiAoICRQYXJhbXtFeHByZXNzaW9uSUR9ICkgewogICAgICAgICRVcGRhdGVEaXZOYW1lICA9ICJFeHByZXNzaW9uSUQtJFBhcmFte0V4cHJlc3Npb25JRH0tQ29tcGFyZVZhbHVlLURpdiI7CiAgICAgICAgJElETmFtZSAgICAgICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSAgICAgID0gJ0V4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRBdHRyaWJ1dGUnOwogICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdDb21wYXJlVmFsdWUnOwogICAgfQoKICAgICMgZm9yIGFjdGlvbiBlbGVtZW50cwogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICRVcGRhdGVEaXZOYW1lICA9ICJBY3Rpb25JRC0kUGFyYW17QWN0aW9uSUR9LUFjdGlvblZhbHVlLURpdiI7CiAgICAgICAgJElETmFtZSAgICAgICAgID0gJ0FjdGlvbklEJzsKICAgICAgICAkQmxvY2tOYW1lICAgICAgPSAnQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QXR0cmlidXRlJzsKICAgICAgICAkVmFsdWVGaWVsZE5hbWUgPSAnQWN0aW9uVmFsdWUnOwogICAgfQoKICAgICMgZ2V0IGF0dHJpYnV0ZSBzZWxlY3Rpb24gbGlzdAogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+X0dldEF0dHJpYnV0ZVNlbGVjdGlvbigKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIFNlbGVjdG9yID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgJElETmFtZSAgPT4gJFBhcmFteyRJRE5hbWV9LAogICAgKTsKCiAgICAjIGFkZCBhbiBlbXB0eSBzZWxlY3Rpb24gaWYgbm8gbGlzdCBpcyBhdmFpbGFibGUgb3Igbm90aGluZyBpcyBzZWxlY3RlZAogICAgbXkgJFBvc3NpYmxlTm9uZSA9IDA7CiAgICBpZiAoCiAgICAgICAgISRBdHRyaWJ1dGVMaXN0CiAgICAgICAgfHwgIXJlZiAkQXR0cmlidXRlTGlzdCBlcSAnSEFTSCcKICAgICAgICB8fCAhJXskQXR0cmlidXRlTGlzdH0KICAgICAgICB8fCAhJFBhcmFte0F0dHJpYnV0ZUlEfQogICAgICAgICkKICAgIHsKICAgICAgICAkUG9zc2libGVOb25lID0gMTsKICAgIH0KCiAgICAjIHBhcmFtZXRlcnMgZm9yIGFqYXgKICAgICRQYXJhbXtPYmplY3RPcHRpb25OYW1lfSA9ICRJRE5hbWUgLiAnLScgLiAkUGFyYW17JElETmFtZX0gLiAnLUF0dHJpYnV0ZUlEJzsKICAgICRQYXJhbXtJRE5hbWV9ICAgICAgICAgICA9ICRJRE5hbWU7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdlbmVyYXRlIEF0dHJpYnV0ZU9wdGlvblN0cmluZwogICAgbXkgJEF0dHJpYnV0ZU9wdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkQXR0cmlidXRlTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte09iamVjdE9wdGlvbk5hbWV9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgKTsKCiAgICAjIG91dHB1dCBhdHRyaWJ1dGUgc2VsZWN0aW9uCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQXR0cmlidXRlT3B0aW9uU3RyaW5nID0+ICRBdHRyaWJ1dGVPcHRpb25TdHJpbmcsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiMgc2hvdyBvcGVyYXRvciBkcm9wZG93biBmaWVsZApzdWIgX1Nob3dPcGVyYXRvclNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgbXkgJElETmFtZTsKCiAgICAjIGJsb2NrIG5hbWUgZm9yIHRoZSBvdXRwdXQgbGF5b3V0IGJsb2NrCiAgICBteSAkQmxvY2tOYW1lOwoKICAgICMgZm9yIGV4cHJlc3Npb24gZWxlbWVudHMKICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgJElETmFtZSAgICA9ICdFeHByZXNzaW9uSUQnOwogICAgICAgICRCbG9ja05hbWUgPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yJzsKICAgIH0KCiAgICAjIGZvciBhY3Rpb24gZWxlbWVudHMKICAgIGVsc2lmICggJFBhcmFte0FjdGlvbklEfSApIHsKICAgICAgICAkSUROYW1lICAgID0gJ0FjdGlvbklEJzsKICAgICAgICAkQmxvY2tOYW1lID0gJ0FjdGlvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yJzsKICAgIH0KCiAgICAjIGdldCBvcGVyYXRvciBzZWxlY3Rpb24gbGlzdAogICAgbXkgJE9wZXJhdG9yTGlzdCA9ICRTZWxmLT5fR2V0T3BlcmF0b3JTZWxlY3Rpb24oCiAgICAgICAgT2JqZWN0SUQgICAgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICRJRE5hbWUgICAgID0+ICRQYXJhbXskSUROYW1lfSwKICAgICk7CgogICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgaWYgKAogICAgICAgICEkT3BlcmF0b3JMaXN0CiAgICAgICAgfHwgIXJlZiAkT3BlcmF0b3JMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRPcGVyYXRvckxpc3R9CiAgICAgICAgfHwgISRQYXJhbXtPcGVyYXRvcklEfQogICAgICAgICkKICAgIHsKICAgICAgICAkUG9zc2libGVOb25lID0gMTsKICAgIH0KCiAgICAjIHBhcmFtZXRlcnMgZm9yIGFqYXgKICAgICRQYXJhbXtPYmplY3RPcHRpb25OYW1lfSA9ICRJRE5hbWUgLiAnLScgLiAkUGFyYW17JElETmFtZX0gLiAnLU9wZXJhdG9ySUQnOwogICAgJFBhcmFte0lETmFtZX0gICAgICAgICAgID0gJElETmFtZTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2VuZXJhdGUgT3BlcmF0b3JPcHRpb25TdHJpbmcKICAgIG15ICRPcGVyYXRvck9wdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkT3BlcmF0b3JMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17T2JqZWN0T3B0aW9uTmFtZX0sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtPcGVyYXRvcklEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICk7CgogICAgIyBvdXRwdXQgb3BlcmF0b3Igc2VsZWN0aW9uCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgT3BlcmF0b3JPcHRpb25TdHJpbmcgPT4gJE9wZXJhdG9yT3B0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIHNob3cgY29tcGFyZSB2YWx1ZSBmaWVsZApzdWIgX1Nob3dDb21wYXJlVmFsdWVGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbXBhcmUgdmFsdWUgZmllbGQgdHlwZQogICAgbXkgJEZpZWxkVHlwZSA9ICRTZWxmLT5fR2V0Q29tcGFyZVZhbHVlRmllbGRUeXBlKCVQYXJhbSk7CgogICAgIyBpZCBuYW1lIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50ICggJ0V4cHJlc3Npb25JRCcgb3IgJ0FjdGlvbklEJyApCiAgICBteSAkSUROYW1lOwoKICAgICMgYmxvY2sgbmFtZXMgZm9yIHRoZSBvdXRwdXQgbGF5b3V0IGJsb2NrCiAgICBteSAkQmxvY2tOYW1lVGV4dDsKICAgIG15ICRCbG9ja05hbWVTZWxlY3Rpb247CgogICAgbXkgJFZhbHVlRmllbGROYW1lOwoKICAgICMgZm9yIGV4cHJlc3Npb24gZWxlbWVudHMKICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgJElETmFtZSAgICAgICAgICAgICA9ICdFeHByZXNzaW9uSUQnOwogICAgICAgICRCbG9ja05hbWVUZXh0ICAgICAgPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVRleHQnOwogICAgICAgICRCbG9ja05hbWVTZWxlY3Rpb24gPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVNlbGVjdGlvbic7CiAgICAgICAgJFZhbHVlRmllbGROYW1lICAgICA9ICdDb21wYXJlVmFsdWUnOwogICAgfQoKICAgICMgZm9yIGFjdGlvbiBlbGVtZW50cwogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICRJRE5hbWUgICAgICAgICAgICAgPSAnQWN0aW9uSUQnOwogICAgICAgICRCbG9ja05hbWVUZXh0ICAgICAgPSAnQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QWN0aW9uVmFsdWVUZXh0JzsKICAgICAgICAkQmxvY2tOYW1lU2VsZWN0aW9uID0gJ0FjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlU2VsZWN0aW9uJzsKICAgICAgICAkVmFsdWVGaWVsZE5hbWUgICAgID0gJ0FjdGlvblZhbHVlJzsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY29tcGFyZSB2YWx1ZSBpcyBhIHRleHQgZmllbGQKICAgIGlmICggJEZpZWxkVHlwZSBlcSAnVGV4dCcgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZVRleHQsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb21wYXJlIHZhbHVlIGlzIGEgc2VsZWN0aW9uIGZpZWxkCiAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ1NlbGVjdGlvbicgKSB7CgogICAgICAgICMgZ2V0IGNvbXBhcmUgdmFsdWUgc2VsZWN0aW9uIGxpc3QKICAgICAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRTZWxmLT5fR2V0Q29tcGFyZVZhbHVlU2VsZWN0aW9uKCVQYXJhbSk7CgogICAgICAgIG15ICRBdHRyaWJ1dGVOYW1lOwogICAgICAgIGlmICggJFBhcmFte0F0dHJpYnV0ZUlEfSApIHsKCiAgICAgICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgICAgICRBdHRyaWJ1dGVOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+QXR0cmlidXRlTG9va3VwKAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICAgICAgIyBvciB0aGUgbGlzdCBpcyB0aGUgd29ya29yZGVyIGFnZW50IGxpc3QKICAgICAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtQb3NzaWJsZU5vbmV9CiAgICAgICAgICAgIHx8ICEkUGFyYW17JFZhbHVlRmllbGROYW1lfQogICAgICAgICAgICB8fCAhJENvbXBhcmVWYWx1ZUxpc3QKICAgICAgICAgICAgfHwgKCByZWYgJENvbXBhcmVWYWx1ZUxpc3QgZXEgJ0hBU0gnICAmJiAhJXskQ29tcGFyZVZhbHVlTGlzdH0gKQogICAgICAgICAgICB8fCAoIHJlZiAkQ29tcGFyZVZhbHVlTGlzdCBlcSAnQVJSQVknICYmICFAeyRDb21wYXJlVmFsdWVMaXN0fSApCiAgICAgICAgICAgIHx8ICgKICAgICAgICAgICAgICAgICRWYWx1ZUZpZWxkTmFtZSBlcSAnQWN0aW9uVmFsdWUnCiAgICAgICAgICAgICAgICAmJiAkQXR0cmlidXRlTmFtZQogICAgICAgICAgICAgICAgJiYgJEF0dHJpYnV0ZU5hbWUgZXEgJ1dvcmtPcmRlckFnZW50SUQnCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIFZhbHVlT3B0aW9uU3RyaW5nCiAgICAgICAgbXkgJFZhbHVlT3B0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ29tcGFyZVZhbHVlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnLScgLiAkUGFyYW17JElETmFtZX0gLiAnLScgLiAkVmFsdWVGaWVsZE5hbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17JFZhbHVlRmllbGROYW1lfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHNlbGVjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRCbG9ja05hbWVTZWxlY3Rpb24sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVmFsdWVPcHRpb25TdHJpbmcgPT4gJFZhbHVlT3B0aW9uU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb21wYXJlIHZhbHVlIGlzIGEgZGF0ZSBmaWVsZAogICAgZWxzaWYgKCAkRmllbGRUeXBlIGVxICdEYXRlJyApIHsKCiAgICAgICAgIyBUT0RPIDogSW1wbGVtZW50IGRhdGUgc2VsZWN0aW9uIGxhdGVyIQogICAgfQoKICAgICMgY29tcGFyZSB2YWx1ZSBpcyBhbiBhdXRvY29tcGxldGUgZmllbGQKICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnQXV0b2NvbXBsZXRlJyApIHsKCiAgICAgICAgIyBUT0RPIDogSW1wbGVtZW50IGF1dG9jb21wbGV0ZSBzZWxlY3Rpb24gbGF0ZXIhCiAgICB9CgogICAgIyBzaG93IGVtcHR5IGJsb2NrIGlmIGZpZWxkIHR5cGUgaXMgdW5rbm93bgogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGVtcHR5IGJsb2NrCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZVNlbGVjdGlvbiwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBnZXQgY29tcGFyZSB2YWx1ZSBmaWVsZCB0eXBlCnN1YiBfR2V0Q29tcGFyZVZhbHVlRmllbGRUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgZGVmYXVsdCBmaWVsZCB0eXBlCiAgICBteSAkRmllbGRUeXBlID0gJ1NlbGVjdGlvbic7CgogICAgIyBpZiBhbiBhdHRyaWJ1dGUgaXMgc2V0CiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVJRH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmRpdGlvbiBvYmplY3QKICAgICAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKCiAgICAgICAgIyBsb29rdXAgYXR0cmlidXRlIG5hbWUKICAgICAgICBteSAkQXR0cmlidXRlTmFtZSA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJEF0dHJpYnV0ZU5hbWUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRyaWJ1dGVJRCAkUGFyYW17QXR0cmlidXRlSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBmaWVsZCB0eXBlCiAgICAgICAgJEZpZWxkVHlwZSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkNvbXBhcmVWYWx1ZUZpZWxkVHlwZSgKICAgICAgICAgICAgT2JqZWN0SUQgICAgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJEZpZWxkVHlwZTsKICAgIH0KCiAgICAjIFdvcmthcm91bmQgZm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZmllbGQgdHlwZXMKICAgICMgVE9ETzogaW1wbGVtZW50IHRoZXNlIGZpZWxkIHR5cGVzIGxhdGVyIQogICAgaWYgKCAkRmllbGRUeXBlIGVxICdEYXRlJyApIHsKICAgICAgICAkRmllbGRUeXBlID0gJ1RleHQnOwogICAgfQogICAgZWxzaWYgKCAkRmllbGRUeXBlIGVxICdBdXRvY29tcGxldGUnICkgewogICAgICAgICRGaWVsZFR5cGUgPSAnU2VsZWN0aW9uJzsKICAgIH0KCiAgICByZXR1cm4gJEZpZWxkVHlwZTsKfQoKIyBnZXQgb2JqZWN0IGRyb3Bkb3duIGZpZWxkIGRhdGEKc3ViIF9HZXRPYmplY3RTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBvYmplY3QgbGlzdAogICAgbXkgJE9iamVjdExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5PYmplY3RMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkT2JqZWN0TGlzdDsKfQoKIyBnZXQgc2VsZWN0b3IgZHJvcGRvd24gZmllbGQgZGF0YQpzdWIgX0dldFNlbGVjdG9yU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdG9yTGlzdCA9IHt9OwoKICAgICMgaWYgYW4gb2JqZWN0IGlzIHNldAogICAgaWYgKCAkUGFyYW17T2JqZWN0SUR9ICkgewoKICAgICAgICAjIGdldCBzZWxlY3RvciBsaXN0CiAgICAgICAgJFNlbGVjdG9yTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPk9iamVjdFNlbGVjdG9yTGlzdCgKICAgICAgICAgICAgT2JqZWN0SUQgICAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgICAgIEFjdGlvbklEICAgICA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxlY3Rvckxpc3Q7Cn0KCiMgZ2V0IGF0dHJpYnV0ZSBzZWxlY3Rpb24gbGlzdCBkYXRhCnN1YiBfR2V0QXR0cmlidXRlU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgYXR0cml1dGVzCiAgICBteSAlQXR0cmlidXRlczsKCiAgICAjIGlmIGEgc2VsZWN0b3IgaXMgc2V0CiAgICBpZiAoICRQYXJhbXtTZWxlY3Rvcn0gKSB7CgogICAgICAgICMgZ2V0IGNvbmRpdGlvbiBvYmplY3QKICAgICAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKCiAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgYXR0cmlidXRlcwogICAgICAgIG15ICRBbGxBdHRyaWJ1dGVzID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb2t1cCBvYmplY3QgbmFtZQogICAgICAgIG15ICRPYmplY3ROYW1lID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TG9va3VwKAogICAgICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkT2JqZWN0TmFtZSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9iamVjdElEICRQYXJhbXtPYmplY3RJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZSBtYXBwaW5nIGZyb20gc3lzY29uZmlnCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZU1hcHBpbmc7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBjb25maWcgZm9yIGV4cHJlc3Npb25zIG9yIGFjdGlvbnMKICAgICAgICBpZiAoICRQYXJhbXtFeHByZXNzaW9uSUR9ICkgewogICAgICAgICAgICAkT2JqZWN0QXR0cmlidXRlTWFwcGluZyA9ICRDb25maWdPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgICRPYmplY3ROYW1lIC4gJzo6TWFwcGluZzo6RXhwcmVzc2lvbjo6T2JqZWN0OjpBdHRyaWJ1dGUnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICRPYmplY3RBdHRyaWJ1dGVNYXBwaW5nID0gJENvbmZpZ09iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgJE9iamVjdE5hbWUgLiAnOjpNYXBwaW5nOjpBY3Rpb246Ok9iamVjdDo6QXR0cmlidXRlJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGR5bmFtaWMgZmllbGRzIChjaGFuZ2Ugb3Igd29ya29yZGVyKQogICAgICAgIG15ICREeW5hbWljRmllbGRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJE9iamVjdE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgb2JqZWN0IChjaGFuZ2Ugb3Igd29ya29yZGVyKQogICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lOwogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGROYW1leyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgdmFsaWQgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIG9iamVjdAogICAgICAgIEFUVFJJQlVURUlEOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlSUQgKCBzb3J0IGtleXMgJXskQWxsQXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGF0dHJpYnV0ZSBpcyBpbiB0aGUgbWFwcGluZwogICAgICAgICAgICBpZiAoICRPYmplY3RBdHRyaWJ1dGVNYXBwaW5nLT57ICRBbGxBdHRyaWJ1dGVzLT57JEF0dHJpYnV0ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZXN7JEF0dHJpYnV0ZUlEfSA9ICRBbGxBdHRyaWJ1dGVzLT57JEF0dHJpYnV0ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhdHRyaWJ1dGUgbmFtZQogICAgICAgICAgICAgICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkQWxsQXR0cmlidXRlcy0+eyRBdHRyaWJ1dGVJRH07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIGEgZHluYW1pYyBmaWVsZCBhbmQgZHluYW1pYyBmaWVsZHMgc2hvdWxkIGJlIHVzZWQgYXMgYXR0cmlidXRlcwogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEVJRCBpZiAhJE9iamVjdEF0dHJpYnV0ZU1hcHBpbmctPntEeW5hbWljRmllbGR9OwogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEVJRCBpZiAkQXR0cmlidXRlTmFtZSAhfiBteyBcQSBEeW5hbWljRmllbGRfIChcdyspIH14bXM7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgdGhlIHByZWZpeCAnRHluYW1pY0ZpZWxkXycgZnJvbSBkeW5hbWljIGZpZWxkcyBmb3IgbmljZXIgZGlzcGxheQogICAgICAgICAgICAgICAgbXkgJEF0dHJpYnV0ZVdpdGhvdXRQcmVmaXggPSAkMTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGl0IGlzIGEgZHluYW1pYyBmaWVsZCBmb3IgdGhlIGNvcnJlY3Qgb2JqZWN0CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURUlEIGlmICEkRHluYW1pY0ZpZWxkTmFtZXskQXR0cmlidXRlV2l0aG91dFByZWZpeH07CgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIGR5bmFtaWMgZmllbGQgdG8gYXR0cmlidXRlIGxpc3QKICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVzeyRBdHRyaWJ1dGVJRH0gPSAkQXR0cmlidXRlV2l0aG91dFByZWZpeDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCB2YWx1ZXMgJUF0dHJpYnV0ZXMgKSB7CgogICAgICAgICAgICAjIHJlbW92ZSAnSUQnIGF0IHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciBuaWNlciBkaXNwbGF5CiAgICAgICAgICAgICRBdHRyaWJ1dGUgPX4gc3sgSUQgXHogfXt9eG1zOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVBdHRyaWJ1dGVzOwp9CgojIGdldCBvcGVyYXRvciBsaXN0IGRhdGEKc3ViIF9HZXRPcGVyYXRvclNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdG8gc3RvcmUgdGhlIG9wZXJhdG9ycwogICAgbXkgJU9wZXJhdG9yczsKCiAgICAjIGlmIGFuIGF0cmlidXRlIGlzIHNldAogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICkgewoKICAgICAgICAjIGdldCBjb25kaXRpb24gb2JqZWN0CiAgICAgICAgbXkgJENvbmRpdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyk7CgogICAgICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICAgICAgbXkgJE9iamVjdE5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbG9nIG9iamVjdAogICAgICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkT2JqZWN0TmFtZSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RJRCAkUGFyYW17T2JqZWN0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIGlmICggISRBdHRyaWJ1dGVOYW1lICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUlEICRQYXJhbXtBdHRyaWJ1dGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgb3BlcmF0b3JzCiAgICAgICAgbXkgJEFsbE9wZXJhdG9ycyA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgb3BlcmF0b3IgbWFwcGluZyBmcm9tIHN5c2NvbmZpZwogICAgICAgIG15ICRNYXBwaW5nQ29uZmlnOwoKICAgICAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgY29uZmlnIGZvciBleHByZXNzaW9ucyBvciBhY3Rpb25zCiAgICAgICAgaWYgKCAkUGFyYW17RXhwcmVzc2lvbklEfSApIHsKICAgICAgICAgICAgJE1hcHBpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSAuICc6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGlvbklEfSApIHsKICAgICAgICAgICAgJE1hcHBpbmdDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSAuICc6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvcicKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHRoZSBuYW1lIHBhcnQgb2YgdGhlIGR5bmFtaWMgZmllbGQgYW5kIHJlcGxhY2Ugb25seSB3aXRoIHRoZSBzdHJpbmcgIkR5bmFtaWNGaWVsZCIKICAgICAgICAkQXR0cmlidXRlTmFtZSA9fiBzeyBcQSBEeW5hbWljRmllbGRfIChcdyspIH17RHluYW1pY0ZpZWxkfXhtczsKCiAgICAgICAgbXkgJEF0dHJpYnV0ZU9wZXJhdG9yTWFwcGluZzsKICAgICAgICBpZiAoJE1hcHBpbmdDb25maWcpIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZU9wZXJhdG9yTWFwcGluZyA9ICRNYXBwaW5nQ29uZmlnLT57JEF0dHJpYnV0ZU5hbWV9IHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsb3dlZCBvcGVyYXRvcnMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUKICAgICAgICBPUEVSQVRPUklEOgogICAgICAgIGZvciBteSAkT3BlcmF0b3JJRCAoIHNvcnQga2V5cyAleyRBbGxPcGVyYXRvcnN9ICkgewoKICAgICAgICAgICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgICAgICAgICBteSAkT3BlcmF0b3JOYW1lID0gJEFsbE9wZXJhdG9ycy0+eyRPcGVyYXRvcklEfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgb3BlcmF0b3IgaXMgYWxsb3dlZCBmb3IgdGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgbmV4dCBPUEVSQVRPUklEIGlmICEkQXR0cmlidXRlT3BlcmF0b3JNYXBwaW5nLT57JE9wZXJhdG9yTmFtZX07CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSBvcGVyYXRvcgogICAgICAgICAgICAkT3BlcmF0b3JzeyRPcGVyYXRvcklEfSA9ICRPcGVyYXRvck5hbWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJU9wZXJhdG9yczsKfQoKIyBnZXQgY29tcGFyZSB2YWx1ZSBsaXN0CnN1YiBfR2V0Q29tcGFyZVZhbHVlU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgY29tcGFyZSB2YWx1ZSBsaXN0CiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9IHt9OwoKICAgICMgaWYgYW4gYXR0cmlidXRlIGlzIHNldAogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICkgewoKICAgICAgICAjIGdldCBjb25kaXRpb24gb2JqZWN0CiAgICAgICAgbXkgJENvbmRpdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyk7CgogICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIGlmICggISRBdHRyaWJ1dGVOYW1lICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQXR0cmlidXRlSUQgJFBhcmFte0F0dHJpYnV0ZUlEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYXJlIHZhbHVlIGxpc3QKICAgICAgICAkQ29tcGFyZVZhbHVlTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdENvbXBhcmVWYWx1ZUxpc3QoCiAgICAgICAgICAgIE9iamVjdElEICAgICAgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgQXR0cmlidXRlTmFtZSA9PiAkQXR0cmlidXRlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJENvbXBhcmVWYWx1ZUxpc3Q7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZURlbGV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VEZWxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoIGZvciB0aGUgYWxsb3dlZCBjaGFuZ2Ugc3RhdGVzCiAgICBteSAlQWxsb3dlZENoYW5nZVN0YXRlcyA9IG1hcCB7ICRfID0+IDEgfSBAeyAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VTdGF0ZXN9IH07CgogICAgIyBvbmx5IGFsbG93IGRlbGV0aW9uIGlmIGNoYW5nZSBpcyBpbiBvbmUgb2YgdGhlIGFsbG93ZWQgY2hhbmdlIHN0YXRlcwogICAgaWYgKCAhJEFsbG93ZWRDaGFuZ2VTdGF0ZXN7ICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZX0gfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NoYW5nZSAiJXMiIGRvZXMgbm90IGhhdmUgYW4gYWxsb3dlZCBjaGFuZ2Ugc3RhdGUgdG8gYmUgZGVsZXRlZCEnLCAkQ2hhbmdlSUQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZURlbGV0ZScgKSB7CgogICAgICAgICMgZGVsZXRlIHRoZSBjaGFuZ2UKICAgICAgICBteSAkQ291bGREZWxldGVDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ291bGREZWxldGVDaGFuZ2UpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gY2hhbmdlIG92ZXJ2aWV3LCB3aGVuIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gZGVsZXRlIGZhaWxlZAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgY2hhbmdlSUQgJXMhJywgJENoYW5nZUlEICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSBkaWFsb2cgdHlwZS4gQXMgZGVmYXVsdCwgdGhlIGRpYWxvZyB3aWxsIGhhdmUgMiBidXR0b25zOiBZZXMgYW5kIE5vCiAgICBteSAkRGlhbG9nVHlwZSA9ICdDb25maXJtYXRpb24nOwoKICAgICMgb3V0cHV0IGNvbnRlbnQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VEZWxldGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRoZSByZXR1cm5lZCBkYXRhIHN0cnVjdHVyZQogICAgbXkgJURhdGEgPSAoCiAgICAgICAgSFRNTCAgICAgICA9PiAkT3V0cHV0LAogICAgICAgIERpYWxvZ1R5cGUgPT4gJERpYWxvZ1R5cGUsCiAgICApOwoKICAgICMgcmV0dXJuIEpTT04tU3RyaW5nIGJlY2F1c2Ugb2YgQUpBWC1Nb2RlCiAgICBteSAkT3V0cHV0SlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gXCVEYXRhICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0SlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUVkaXQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlRWRpdC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZUVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5lZWRlZCBDaGFuZ2VJRAogICAgbXkgJENoYW5nZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNoYW5nZSBpcyBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRDaGFuZ2VJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIHRoaXMgcGFnZSByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoCiAgICAgICAgQ2hhbmdlVGl0bGUgRGVzY3JpcHRpb24gSnVzdGlmaWNhdGlvbgogICAgICAgIENhdGVnb3J5SUQgSW1wYWN0SUQgUHJpb3JpdHlJRAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQgRmlsZUlECiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QgYW5kIGFkZCB0aGUgcHJlZml4CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICkgewogICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAnUmVxdWVzdGVkVGltZScgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBwZXJmb3JtaW5nIHRoZSBzdWJhY3Rpb24gd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICBteSAlVmFsaWRhdGlvbkVycm9yOwoKICAgICMga2VlcCBDaGFuZ2VTdGF0ZUlEIG9ubHkgaWYgY29uZmlndXJlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgJEdldFBhcmFte0NoYW5nZVN0YXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZVN0YXRlSUQnICk7CiAgICB9CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgdXBkYXRlIGNoYW5nZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIGNoZWNrIHRoZSB0aXRsZQogICAgICAgIGlmICggISRHZXRQYXJhbXtDaGFuZ2VUaXRsZX0gKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7Q2hhbmdlVGl0bGVTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBDSVAKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyIke1R5cGV9SUQifSB8fCAkR2V0UGFyYW17IiR7VHlwZX1JRCJ9ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFR5cGUgLiAnSURTZXJ2ZXJFcnJvcicgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkQ0lQSXNWYWxpZCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRHZXRQYXJhbXsiJHtUeXBlfUlEIn0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJENJUElzVmFsaWQgKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFR5cGUgLiAnSURTZXJ2ZXJFcnJvcicgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHJlcXVlc3RlZCB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSAmJiAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVVzZWR9ICkgewoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNb250aH0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lRGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17UmVxdWVzdGVkVGltZUhvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyB0cmFuc2Zvcm0gY2hhbmdlIHJlcXVlc3RlZCB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ1JlcXVlc3RlZFRpbWUnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAsIHdoZW4gYWxsIHJlcXVpcmVkIHRpbWUgcGFyYW1zIHdlcmUgcGFzc2VkCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZX0gPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVEYXl9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNaW51dGV9OwoKICAgICAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICAgICBteSAkU3lzdGVtVGltZURUT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1JlcXVlc3RlZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG8gbm90IHNhdmUgd2hlbiB0aW1lIGlzIGludmFsaWQKICAgICAgICAgICAgICAgIGlmICggISRTeXN0ZW1UaW1lRFRPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntSZXF1ZXN0ZWRUaW1lSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgaXQgd2FzIGluZGljYXRlZCB0aGF0IHRoZSByZXF1ZXN0ZWQgdGltZSBzaG91bGQgYmUgc2V0LAogICAgICAgICAgICAgICAgIyBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSByZXF1aXJlZCB0aW1lIHBhcmFtcyBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1JlcXVlc3RlZFRpbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0KICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgb25seSB3aGVuIHRoZXJlIGFyZSBubyBpbnB1dCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgIGlmICggISVWYWxpZGF0aW9uRXJyb3IgKSB7CgogICAgICAgICAgICAjIHNldHRpbmcgb2YgY2hhbmdlIHN0YXRlIGFuZCByZXF1ZXN0ZWQgdGltZSBpcyBjb25maWd1cmFibGUKICAgICAgICAgICAgbXkgJUFkZGl0aW9uYWxQYXJhbTsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAkQWRkaXRpb25hbFBhcmFte0NoYW5nZVN0YXRlSUR9ID0gJEdldFBhcmFte0NoYW5nZVN0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CiAgICAgICAgICAgICAgICAkQWRkaXRpb25hbFBhcmFte1JlcXVlc3RlZFRpbWV9ID0gJEdldFBhcmFte1JlcXVlc3RlZFRpbWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY2hhbmdlCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZUNoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAkR2V0UGFyYW17SnVzdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRHZXRQYXJhbXtDaGFuZ2VUaXRsZX0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEICAgID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlQWRkaXRpb25hbFBhcmFtLAogICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVDaGFuZ2UpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgZnJvbSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgYSBsb29rdXAgbG9va3VwIGhhc2ggb2YgdGhlIG5ldyBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgbXkgJU5ld0F0dGFjaG1lbnQ7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAjIGFwcGVuZCBjb250ZW50IGlkIGlmIGF2YWlsYWJsZSAoZm9yIG5ldyBpbmxpbmUgaW1hZ2VzKQogICAgICAgICAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2V5IC49ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgc3RvcmUgYWxsIG9mIHRoZSBuZXcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAgICAgJE5ld0F0dGFjaG1lbnR7JEtleX0gPSAkQXR0YWNobWVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEZJTEVOQU1FOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgY29uc2lkZXIgaW5saW5lIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUxFTkFNRSBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICAjIChubyBjb250ZW50IGlkLCBhcyBleGlzdGluZyBhdHRhY2htZW50cyBkb24ndCBoYXZlIGl0KQogICAgICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAgICAgICAgICMgYXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2gKICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdBdHRhY2htZW50eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJE5ld0F0dGFjaG1lbnR7JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGF0dGFjaG1lbnQgaXMgbm8gbG9uZ2VyIGluIG5ldyBhdHRhY2htZW50cyBoYXNoCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2Vzc2Z1bCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISREZWxldGVTdWNjZXNzZnVsICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHdyaXRlIHRoZSBuZXcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCB2YWx1ZXMgJU5ld0F0dGFjaG1lbnQgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYXR0YWNobWVudCBpcyBhbiBpbmxpbmUgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICRJbmxpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyByZW1lbWJlciB0aGF0IGl0IGlzIGlubGluZQogICAgICAgICAgICAgICAgICAgICAgICAkSW5saW5lID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaWYgdGhpcyBpbmxpbmUgYXR0YWNobWVudCBpcyB1c2VkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGNoYW5nZSBkZXNjcmlwdGlvbiBvciBqdXN0aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURGb3VuZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY2hhbmdlIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uIGZvciBjb250ZW50IGlkCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEdldFBhcmFte0Rlc2NyaXB0aW9ufSA9fiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtcyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRHZXRQYXJhbXtKdXN0aWZpY2F0aW9ufSA9fiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtcyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvdW5kIHRoZSBjb250ZW50IGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29udGVudElERm91bmQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGtlZXAgdGhpcyBhdHRhY2htZW50LAogICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaXQgd2FzIGRlbGV0ZWQgaW4gdGhlIHJpY2h0IHRleHQgZWRpdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJENvbnRlbnRJREZvdW5kOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJElubGluZTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9OwoKICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIHVwbG9hZCBjYWNoZQogICAgICAgICAgICAgICAgICAgIG15ICRTZWFyY2ggPSAiQWN0aW9uPVBpY3R1cmVVcGxvYWQgLisgRm9ybUlEPSRTZWxmLT57Rm9ybUlEfSAuKyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbnRlbnRJRD0kQXR0YWNobWVudC0+e0NvbnRlbnRJRH0iOwoKICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIGNoYW5nZSBhdHR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICRSZXBsYWNlID0gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7IgogICAgICAgICAgICAgICAgICAgICAgICAuICJGaWxlbmFtZT0kQXR0YWNobWVudC0+e0ZpbGVuYW1lfTtDaGFuZ2VJRD0kQ2hhbmdlSUQiOwoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdXJscwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0gPX4gc3skU2VhcmNofXskUmVwbGFjZX14bXM7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0p1c3RpZmljYXRpb259ID1+IHN7JFNlYXJjaH17JFJlcGxhY2V9eG1zOwoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAkR2V0UGFyYW17SnVzdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB1cGRhdGUgdGhlIGlubGluZSBpbWFnZSBVUkxzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJmb3IgQ2hhbmdlSUQgJyRDaGFuZ2VJRCchISIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlIEFKQVhVcGRhdGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgcHJpb3JpdGllcwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgICAgIFR5cGUgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlbGVjdGVkIHByaW9yaXR5CiAgICAgICAgbXkgJFNlbGVjdGVkUHJpb3JpdHkKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIEltcGFjdElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBqc29uCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGVjdGVkUHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGpzb24KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgYWxsIGtleXMgZnJvbSAlR2V0UGFyYW0gd2hlbiBpdCBpcyBubyBTdWJhY3Rpb24KICAgIGVsc2UgewoKICAgICAgICAlR2V0UGFyYW0gPSAoKTsKCiAgICAgICAgIyBzZXQgdGhlIGNoYW5nZSBzdGF0ZSBmcm9tIGNoYW5nZSwgaWYgY29uZmlndXJlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2hhbmdlU3RhdGV9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Q2hhbmdlU3RhdGVJRH0gPSAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgcmVxdWVzdGVkIHRpbWUgZnJvbSBjaGFuZ2UgaWYgY29uZmlndXJlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gJiYgJENoYW5nZS0+e1JlcXVlc3RlZFRpbWV9ICkgewoKICAgICAgICAgICAgIyBnZXQgcmVxdWVzdGVkIHRpbWUgZnJvbSB0aGUgY2hhbmdlCiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lRFRPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ2hhbmdlLT57UmVxdWVzdGVkVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHBhcmFtZXRlciBoYXNoIGZvciBCdWlsZERhdGVTZWxlY3Rpb24oKQogICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVVzZWR9ICAgPSAxOwogICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1pbnV0ZX0gPSAkU3lzdGVtVGltZURUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVNJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVIb3VyfSA9ICRTeXN0ZW1UaW1lRFRPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnJUgnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZURheX0gPSAkU3lzdGVtVGltZURUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVkJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNb250aH0gPSAkU3lzdGVtVGltZURUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVtJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfSA9ICRTeXN0ZW1UaW1lRFRPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnJVknLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAjIGNvcHkgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCBjYWNoZQogICAgICAgIEZJTEVOQU1FOgogICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCBjb25zaWRlciBpbmxpbmUgYXR0YWNobWVudHMKICAgICAgICAgICAgbmV4dCBGSUxFTkFNRSBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudCB0byB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRBdHRhY2htZW50RGF0YS0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudFR5cGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIHRoZXJlIHdhcyBhbiBhdHRhY2htZW50IGRlbGV0ZSBvciB1cGxvYWQKICAgICMgd2UgZG8gbm90IHdhbnQgdG8gc2hvdyB2YWxpZGF0aW9uIGVycm9ycyBmb3Igb3RoZXIgZmllbGRzCiAgICBpZiAoICRWYWxpZGF0aW9uRXJyb3J7QXR0YWNobWVudH0gKSB7CiAgICAgICAgJVZhbGlkYXRpb25FcnJvciA9ICgpOwogICAgfQoKICAgICMgY2hlY2sgaWYgY2hhbmdlIHN0YXRlIGlzIGNvbmZpZ3VyZWQKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2hhbmdlU3RhdGV9ICkgewoKICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgbGlzdAogICAgICAgIG15ICRDaGFuZ2VQb3NzaWJsZVN0YXRlcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGRyb3AtZG93biB3aXRoIGNoYW5nZSBzdGF0ZXMKICAgICAgICBteSAkU3RhdGVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkQ2hhbmdlUG9zc2libGVTdGF0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0NoYW5nZVN0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIHNob3cgY2hhbmdlIHN0YXRlIGRyb3Bkb3duCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdGF0ZVNlbGVjdGlvblN0cmluZyA9PiAkU3RhdGVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0JyksCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICk7CgogICAgIyBjaGVjayBpZiByZXF1ZXN0ZWQgdGltZSBzaG91bGQgYmUgc2hvd24KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CgogICAgICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICAgICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OlRpbWVQZXJpb2QnKSB9OwoKICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgbXkgJFRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgUmVxdWVzdGVkVGltZU9wdGlvbmFsID0+IDEsCiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVDbGFzcyAgICA9PiAnVmFsaWRhdGUgJyAuICggJFZhbGlkYXRpb25FcnJvcntSZXF1ZXN0ZWRUaW1lSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGZpZWxkcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkVGltZVN0cmluZycgPT4gJFRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgdGhlIGNhdGVnb3J5CiAgICAjIGFsbCBjYXRlZ29yaWVzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGNhdGVnb3J5IGlzIGNoYW5nZWQsIGEgbmV3IHByaW9yaXR5IGlzIHByb3Bvc2VkCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFte0NhdGVnb3J5U2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJENhdGVnb3JpZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0gfHwgJENoYW5nZS0+e0NhdGVnb3J5SUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3JlYXRlIGRyb3Bkb3duIGZvciB0aGUgaW1wYWN0CiAgICAjIGFsbCBpbXBhY3RzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGltcGFjdCBpcyBjaGFuZ2VkLCBhIG5ldyBwcmlvcml0eSBpcyBwcm9wb3NlZAogICAgbXkgJEltcGFjdHMgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17SW1wYWN0U2VsZWN0aW9uU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJEltcGFjdHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnSW1wYWN0SUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAkQ2hhbmdlLT57SW1wYWN0SUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3JlYXRlIGRyb3Bkb3duIGZvciBwcmlvcml0eSwKICAgICMgYWxsIHByaW9yaXRpZXMgYXJlIHNlbGVjdGFibGUKICAgIG15ICRQcmlvcml0aWVzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17UHJpb3JpdHlTZWxlY3Rpb25TdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICBOYW1lICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSB8fCAkQ2hhbmdlLT57UHJpb3JpdHlJRH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgZnJvbSBjaGFuZ2UgaWYgcGFnZSBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUKICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICA9ICRDaGFuZ2UtPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgPT4gJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gfHwgJycsCiAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRIVE1MKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBzaG93IHRoZSBhdHRhY2htZW50IHVwbG9hZCBidXR0b24KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRVcGxvYWQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEF0dGFjaG1lbnRMaXN0ID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvciBqYXZhc2NyaXB0CiAgICAjIG9ubHkgaWYgYWN0aXZhdGVkIGFuZCB0aGUgYnJvd3NlciBjYW4gaGFuZGxlIGl0CiAgICAjIG90aGVyd2lzZSBqdXN0IGEgdGV4dGFyZWEgaXMgc2hvd24KICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUhpc3RvcnkucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZUhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgY2hhbmdlIGlkCiAgICBteSAkQ2hhbmdlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENoYW5nZUlEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBhcyBubyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDaGFuZ2VPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKICAgIG15ICRIaXN0b3J5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBpbmZvcm1hdGlvbgogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIHRoZSBkYXRhYmFzZSEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoIHdpdGggYWxsIHdvcmtvcmRlciBJRHMgb2YgdGhpcyBjaGFuZ2UKICAgIG15ICVXb3JrT3JkZXJJRExvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9OwoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnlFbnRyaWVzUmVmID0gJEhpc3RvcnlPYmplY3QtPkNoYW5nZUhpc3RvcnlHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICkgfHwgW107CgogICAgIyBnZXQgb3JkZXIgZGlyZWN0aW9uCiAgICBteSBASGlzdG9yeUxpbmVzID0gQHskSGlzdG9yeUVudHJpZXNSZWZ9OwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpIaXN0b3J5T3JkZXInKSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgQEhpc3RvcnlMaW5lcyA9IHJldmVyc2UgQHskSGlzdG9yeUVudHJpZXNSZWZ9OwogICAgfQoKICAgICMgbWFrZSBzb21lIGxvb2t1cHMgaW4gYWR2YW5jZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCiAgICBteSAkQ2FjaGUgPSB7fTsKCiAgICAjIGdldCBjb25kaXRpb24gb2JqZWN0CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKCiAgICAjIGdldCB0aGUgb2JqZWN0IGxpc3QKICAgICRDYWNoZS0+e09iamVjdExpc3R9ID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgYXR0cmlidXRlIGxpc3QKICAgICRDYWNoZS0+e0F0dHJpYnV0ZUxpc3R9ID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgb3BlcmF0b3IgbGlzdAogICAgJENhY2hlLT57T3BlcmF0b3JMaXN0fSA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIG1heCBsZW5ndGggb2Ygc3RyaW5ncwogICAgbXkgJE1heExlbmd0aCA9IDMwOwoKICAgICMgR2V0IHRyYW5zbGF0YWJsZSBoaXN0b3J5IHN0cmluZ3MuCiAgICBteSAlSGlzdG9yeVN0cmluZ3MgPSAkSGlzdG9yeU9iamVjdC0+SGlzdG9yeVN0cmluZ3NMaXN0KCk7CgogICAgIyBjcmVhdGUgdGFibGUKICAgIG15ICRDb3VudGVyID0gMTsKICAgIEhJU1RPUllFTlRSWToKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5IChASGlzdG9yeUxpbmVzKSB7CiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgIyBzZXQgZmllbGRuYW1lIHRvIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBmaWVsZG5hbWUKICAgICAgICAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSB8fD0gJyc7CgogICAgICAgICMgZG8gbm90IHNob3cgaW50ZXJuYWwgZW50cmllcyBmcm9tIHdvcmtvcmRlciBudW1iZXIgcmVjYWxjdWxhdGlvbgogICAgICAgIG5leHQgSElTVE9SWUVOVFJZIGlmICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdOb051bWJlckNhbGMnOwoKICAgICAgICAjIGRhdGEgZm9yIGEgc2luZ2xlIHJvdywgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGR0bAogICAgICAgIG15ICVEYXRhID0gJXskSGlzdG9yeUVudHJ5fTsKCiAgICAgICAgIyBkZXRlcm1pbmUgd2hhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBteSAkSGlzdG9yeVR5cGUgPSAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9OwogICAgICAgIGlmICgKICAgICAgICAgICAgJEhpc3RvcnlUeXBlID1+IG17CiAgICAgICAgICAgICAgICBcQQogICAgICAgICAgICAgICAgKD86ICg/OiBDaGFuZ2UgfCBDaGFuZ2VDQUIgfCBXb3JrT3JkZXIgKSBVcGRhdGUgKQogICAgICAgICAgICAgICAgfCAoPzogKD86IENvbmRpdGlvbiB8IEV4cHJlc3Npb24gfCBBY3Rpb24gKSAoPzogQWRkIHwgVXBkYXRlIHwgRGVsZXRlIHwgRGVsZXRlQWxsIHwgRXhlY3V0ZSApICkKICAgICAgICAgICAgICAgIFx6CiAgICAgICAgICAgIH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgVGhlIGRpc3BsYXllZCBmaWVsZG5hbWUgbWlnaHQgYmUgY2hhbmdlZCBpbiB0aGUgZm9sbG93aW5nIGxvb3AKICAgICAgICAgICAgbXkgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9OwoKICAgICAgICAgICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUga2V5cwogICAgICAgICAgICBmb3IgbXkgJENvbnRlbnROZXdPck9sZCAocXcoQ29udGVudE5ldyBDb250ZW50T2xkKSkgewogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBvYmplY3QKICAgICAgICAgICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSBJRCBmaWVsZHMsIHdlIHJlcGxhY2UgSUQgd2l0aCBpdHMgdGV4dHVhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRUeXBlKSA9ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9ID1+IG17CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcQSAgICAgICAgICAjIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgIyBzdGFydCBjYXB0dXJlIG9mICRUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgfCBJbXBhY3QgfCBQcmlvcml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2hhbmdlU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdvcmtPcmRlclN0YXRlIHwgV29ya09yZGVyVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV29ya09yZGVyQWdlbnQgfCBDaGFuZ2VCdWlsZGVyIHwgQ2hhbmdlTWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVmFsaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9iamVjdCB8IEF0dHJpYnV0ZSB8IE9wZXJhdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAjIGVuZCBjYXB0dXJlIG9mICRUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICAjIHByb2Nlc3Npbmcgb25seSBmb3IgdGhlICdJRCcgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIH14bXMKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRpb25OZWVkZWQgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHdvcmsgb3JkZXIgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJUeXBlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdDaGFuZ2VTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFR5cGUgZXEgJ1dvcmtPcmRlckFnZW50JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRUeXBlIGVxICdDaGFuZ2VCdWlsZGVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRUeXBlIGVxICdDaGFuZ2VNYW5hZ2VyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBsb2dpbiBuYW1lcyBhcmUgbm90IHRvIGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHJhbnNsYXRpb25OZWVkZWQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUeXBlIGVxICdDYXRlZ29yeScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnSW1wYWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRUeXBlIGVxICdQcmlvcml0eScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnVmFsaWQnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgVXBkYXRlSUQgKENvbmRpdGlvbklEIG9yIEV4cHJlc3Npb25JRCBvciBBY3Rpb25JRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCB0aGUgQXR0cmlidXRlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBteyAlJSB9eG1zICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRIaXN0b3J5RW50cnktPntVcGRhdGVJRH0sICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSApID0gc3BsaXQgbS8lJS8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdPYmplY3QnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgVXBkYXRlSUQgKENvbmRpdGlvbklEIG9yIEV4cHJlc3Npb25JRCBvciBBY3Rpb25JRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCB0aGUgQXR0cmlidXRlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBteyAlJSB9eG1zICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRIaXN0b3J5RW50cnktPntVcGRhdGVJRH0sICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSApID0gc3BsaXQgbS8lJS8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2t1cCB0aGUgb2JqZWN0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkQ2FjaGUtPntPYmplY3RMaXN0fS0+eyAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdBdHRyaWJ1dGUnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgVXBkYXRlSUQgKENvbmRpdGlvbklEIG9yIEV4cHJlc3Npb25JRCBvciBBY3Rpb25JRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCB0aGUgQXR0cmlidXRlSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBteyAlJSB9eG1zICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRIaXN0b3J5RW50cnktPntVcGRhdGVJRH0sICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSApID0gc3BsaXQgbS8lJS8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2t1cCB0aGUgYXR0cmlidXRlIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkQ2FjaGUtPntBdHRyaWJ1dGVMaXN0fS0+eyAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ09wZXJhdG9yJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIFVwZGF0ZUlEIChDb25kaXRpb25JRCBvciBFeHByZXNzaW9uSUQgb3IgQWN0aW9uSUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgdGhlIEF0dHJpYnV0ZUlECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPX4gbXsgJSUgfXhtcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAkSGlzdG9yeUVudHJ5LT57VXBkYXRlSUR9LCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gKSA9IHNwbGl0IG0vJSUvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgdGhlIG9wZXJhdG9yIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkQ2FjaGUtPntPcGVyYXRvckxpc3R9LT57ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnVW5rbm93biB0eXBlICIlcyIgZW5jb3VudGVyZWQhJywgJFR5cGUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFLmcuIHRoZSB1c2VybmFtZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlZFZhbHVlID0gJFRyYW5zbGF0aW9uTmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSBzcHJpbnRmICclcyAoSUQ9JXMpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFZhbHVlLCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29udGVudCBoYXMgY2hhbmdlZCwgc28gY2hhbmdlIHRoZSBkaXNwbGF5ZWQgZmllbGRuYW1lIGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRUeXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdDQUJDdXN0b21lcnMnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50TmV3IGFuZCBDb250ZW50T2xkIGNvbnRhaW4gYSAnJSUnIHNlcGVyYXRlZCBsaXN0IG9mIGN1c3RvbWVyIHVzZXIgaWRzCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVmb3JtYXQgaXQgYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPX4gc3sgJSAlIH17LH14bXNnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdDQUJBZ2VudHMnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50TmV3IGFuZCBDb250ZW50T2xkIGNvbnRhaW4gYSAnJSUnIHNlcGFyYXRlZCBsaXN0IG9mIHVzZXIgaWRzCiAgICAgICAgICAgICAgICAgICAgICAgICMgbG9vayB1cCB0aGUgbG9naW4gbmFtZXMgZnJvbSB0aGUgdXNlciBpZHMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICMgZm9ybWF0IGl0IGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSBzcGxpdCBtLyUlLywgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9OwogICAgICAgICAgICAgICAgICAgICAgICBteSBAVXNlckxvZ2lucyA9IG1hcCB7ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VySUQgPT4gJF8gKSB9IEBVc2VySURzOwogICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSBqb2luICcsJywgQFVzZXJMb2dpbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gZXEgJ0V4cHJlc3Npb25Db25qdW5jdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gZXEgJ05hbWUnCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdDb21tZW50JwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSBlcSAnU2VsZWN0b3InCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdBY3Rpb25WYWx1ZScKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gZXEgJ0NvbXBhcmVWYWx1ZScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBVcGRhdGVJRCAoQ29uZGl0aW9uSUQgb3IgRXhwcmVzc2lvbklEIG9yIEFjdGlvbklEKQogICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCB0aGUgQXR0cmlidXRlSUQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPX4gbXsgJSUgfXhtcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJEhpc3RvcnlFbnRyeS0+e1VwZGF0ZUlEfSwgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ICkgPSBzcGxpdCBtLyUlLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBIVE1MIGJyZWFrcyB3aXRoIHNpbmdsZSBzcGFjZQogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBzeyA8IGJyIFxzKiAvPyA+IH17IH14bXNnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSBmaWVsZG5hbWUgZm9yIGRpc3BsYXkKICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICREaXNwbGF5ZWRGaWVsZG5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBIVE1MIHV0aWxzIG9iamVjdAogICAgICAgICAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICAgICAgICAgIyB0cmltIHN0cmluZ3MgdG8gYSBtYXggbGVuZ3RoIG9mICRNYXhMZW5ndGgKICAgICAgICAgICAgbXkgJENvbnRlbnROZXcgPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENvbnRlbnRPbGQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBbLi4uXSBmb3IgdG9vIGxvbmcgc3RyaW5ncwogICAgICAgICAgICBmb3IgbXkgJENvbnRlbnQgKCAkQ29udGVudE5ldywgJENvbnRlbnRPbGQgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb250ZW50ICYmICggbGVuZ3RoICRDb250ZW50ID4gJE1heExlbmd0aCApICkgewogICAgICAgICAgICAgICAgICAgICRDb250ZW50ID0gc3Vic3RyKCAkQ29udGVudCwgMCwgJE1heExlbmd0aCApIC4gJ1suLi5dJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBkZXNjcmlwdGlvbiBhcnJheQogICAgICAgICAgICBteSBARGVzY3JpcHRpb24gPSAoICREaXNwbGF5ZWRGaWVsZG5hbWUgfHwgJycgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBJRCBvZiB0aGUgQ29uZGl0aW9uLCBFeHByZXNzaW9uIG9yIEFjdGlvbiB0aGF0IHdhcyB1cGRhdGVkCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRIaXN0b3J5VHlwZSBlcSAnQ29uZGl0aW9uVXBkYXRlJwogICAgICAgICAgICAgICAgfHwgJEhpc3RvcnlUeXBlIGVxICdFeHByZXNzaW9uVXBkYXRlJwogICAgICAgICAgICAgICAgfHwgJEhpc3RvcnlUeXBlIGVxICdBY3Rpb25VcGRhdGUnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeS0+e1VwZGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEZXNjcmlwdGlvbiwgJEhpc3RvcnlFbnRyeS0+e1VwZGF0ZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgZGVzY3JpcHRpb24KICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSBqb2luICclJScsIEBEZXNjcmlwdGlvbiwgJENvbnRlbnROZXcsICRDb250ZW50T2xkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld307CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgdGV4dAogICAgICAgIGlmICggJERhdGF7Q29udGVudH0gKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nICUlCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID1+IHN7IFxBICUlIH17fXhtc2c7CgogICAgICAgICAgICAjIHNwbGl0IHRoZSBjb250ZW50IGJ5ICUlCiAgICAgICAgICAgIG15IEBWYWx1ZXMgPSBzcGxpdCBtLyUlLywgJERhdGF7Q29udGVudH07CgogICAgICAgICAgICAjIGZvciB3aGF0IGl0ZW0gdHlwZSBpcyB0aGlzIGhpc3RvcnkgZW50cnkKICAgICAgICAgICAgbXkgJEhpc3RvcnlJdGVtVHlwZSA9ICdDaGFuZ2UnOwogICAgICAgICAgICBpZiAoICRIaXN0b3J5VHlwZSA9fiBteyBcQSBXb3JrT3JkZXIgfXhtcyApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5SXRlbVR5cGUgPSAnV29ya09yZGVyJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmb3Igd29ya29yZGVyIGVudHJpZXMgdGhhdCBzdGlsbCBleGlzdHMsIHNob3cgd29ya29yZGVyaWQKICAgICAgICAgICAgbXkgJEhpc3RvcnlFbnRyeVR5cGUgPSAkRGF0YXtIaXN0b3J5VHlwZX07CiAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnlUeXBlIC49ICdXaXRoV29ya09yZGVySUQnOwogICAgICAgICAgICAgICAgdW5zaGlmdCBAVmFsdWVzLCAkSGlzdG9yeUVudHJ5LT57V29ya09yZGVySUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBjb25kaXRpb24gYWRkIHdpdGggaWQKICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5VHlwZSBlcSAnQ29uZGl0aW9uQWRkJyAmJiAhJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gKSB7CiAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5VHlwZSAuPSAnSUQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBleHByZXNzaW9uIGFkZCB3aXRoIGlkCiAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeVR5cGUgZXEgJ0V4cHJlc3Npb25BZGQnICYmICEkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnlUeXBlIC49ICdJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGFjdGlvbiBhZGQgd2l0aCBpZAogICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnlUeXBlIGVxICdBY3Rpb25BZGQnICYmICEkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnlUeXBlIC49ICdJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcsIGNhbiBiZSBhZGRlZCB0byBkdGwgdG8gc2VlIHRoZSB1bnRyYW5zbGF0ZWQgb3V0cHV0CiAgICAgICAgICAgICREYXRhe0NvbnRlbnRVbnRyYW5zbGF0ZWR9ID0gJERhdGF7Q29udGVudH07CgogICAgICAgICAgICAjIHNob3cgJ25pY2UnIG91dHB1dCB3aXRoIHZhcmlhYmxlIHN1YnN0aXR1dGlvbgogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICRIaXN0b3J5U3RyaW5nc3sgJEhpc3RvcnlJdGVtVHlwZSAuICdIaXN0b3J5OjonIC4gJEhpc3RvcnlFbnRyeVR5cGUgfSwKICAgICAgICAgICAgICAgIEBWYWx1ZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9fiBzeyAlIHMgfXt9eG1zZzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGEgJ21vcmUgaW5mbycgbGluawogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9CiAgICAgICAgICAgICAgICAmJiBsZW5ndGgoICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSApID4gJE1heExlbmd0aAogICAgICAgICAgICApCiAgICAgICAgICAgIHx8ICgKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfQogICAgICAgICAgICAgICAgJiYgbGVuZ3RoKCAkSGlzdG9yeUVudHJ5LT57Q29udGVudE9sZH0gKSA+ICRNYXhMZW5ndGgKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBpcyBpdCBhIENoYW5nZUhpc3Rvcnlab29tIG9yIGEgV29ya09yZGVySGlzdG9yeVpvb20/CiAgICAgICAgICAgIG15ICRab29tVHlwZSA9ICdDaGFuZ2UnOwoKICAgICAgICAgICAgaWYgKCAkSGlzdG9yeVR5cGUgPX4gbXsgXEEgV29ya09yZGVyIH14bXMgJiYgJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSApIHsKICAgICAgICAgICAgICAgICRab29tVHlwZSA9ICdXb3JrT3JkZXInOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgaGlzdG9yeXpvb20gYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTaG93SGlzdG9yeVpvb20nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgWm9vbVR5cGUgPT4gJFpvb21UeXBlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZG9uJ3Qgc2hvdyBhIGxpbmsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0hpc3Rvcnlab29tJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBsaW5rIHRvIHdvcmtvcmRlciBmb3IgV29ya09yZGVyQWRkIGV2ZW50IC0gaWYgdGhlIHdvcmtvcmRlciBzdGlsbCBleGlzdHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX0gPX4gbXsgXEEgV29ya09yZGVyIH14bXMKICAgICAgICAgICAgJiYgJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfQogICAgICAgICAgICAmJiAkV29ya09yZGVySURMb29rdXB7ICRIaXN0b3J5RW50cnktPntXb3JrT3JkZXJJRH0gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzaG93IGxpbmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTaG93V29ya09yZGVyWm9vbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRvbid0IHNob3cgYW55IGxpbmsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb1dvcmtPcmRlclpvb20nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSBIaXN0b3J5JyksCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUhpc3RvcnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgY2hhbmdlIGlkCiAgICBteSAkSGlzdG9yeUVudHJ5SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnSGlzdG9yeUVudHJ5SUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEhpc3RvcnlFbnRyeUlEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5IHpvb20sIG5vIEhpc3RvcnlFbnRyeUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IGVudHJpZXMKICAgIG15ICRIaXN0b3J5RW50cnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeScpLT5IaXN0b3J5RW50cnlHZXQoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gJEhpc3RvcnlFbnRyeUlELAogICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJEhpc3RvcnlFbnRyeSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0hpc3RvcnlFbnRyeSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkSGlzdG9yeUVudHJ5SUQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENoYW5nZUlEID0+ICRIaXN0b3J5RW50cnktPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRIaXN0b3J5RW50cnktPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIHRoZSBkYXRhYmFzZSEnLCAkSGlzdG9yeUVudHJ5LT57Q2hhbmdlSUR9CiAgICAgICAgICAgICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBkYXNoICgnLScpIHdoZW4gdGhlIGZpZWxkIGlzIGVtcHR5CiAgICBmb3IgbXkgJEZpZWxkIChxdyhDb250ZW50TmV3IENvbnRlbnRPbGQpKSB7CiAgICAgICAgJEhpc3RvcnlFbnRyeS0+eyRGaWVsZH0gfHw9ICctJzsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiAnQ2hhbmdlSGlzdG9yeVpvb20nLAogICAgKTsKCiAgICAjIGhhbmRsZSBjb25kaXRpb24gdXBkYXRlCiAgICBpZiAoICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX0gZXEgJ0NvbmRpdGlvblVwZGF0ZScgKSB7CiAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9ID1+IHN7IFxBIFxkKyAlJSAoLispIFx6IH17JDF9eG1zOwogICAgICAgICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSA9fiBzeyBcQSBcZCsgJSUgKC4rKSBceiB9eyQxfXhtczsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VIaXN0b3J5Wm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRIaXN0b3J5RW50cnl9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdygpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBhbGwgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KENoYW5nZUJ1aWxkZXIgQ2hhbmdlQnVpbGRlclNlbGVjdGVkIENoYW5nZU1hbmFnZXIgQ2hhbmdlTWFuYWdlclNlbGVjdGVkCiAgICAgICAgTmV3Q0FCTWVtYmVyIE5ld0NBQk1lbWJlclNlbGVjdGVkIE5ld0NBQk1lbWJlclR5cGUgQ0FCVGVtcGxhdGUgQWRkQ0FCTWVtYmVyCiAgICAgICAgQWRkQ0FCVGVtcGxhdGUgVGVtcGxhdGVJRCBOZXdUZW1wbGF0ZSBTdWJtaXQpCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIHNlcnZlciBlcnJvciBoYXNoLCB0byBzdG9yZSB0aGUgaXRlbXMgd2l0aCBTZXJ2ZXJFcnJvciBjbGFzcwogICAgbXkgJVNlcnZlckVycm9yOwoKICAgICMgUmVtZW1iZXIgdGhlIHJlYXNvbiB3aHkgc2F2aW5nIHdhcyBub3QgYXR0ZW1wdGVkLgogICAgIyBUaGUgZW50cmllcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkdGwgdmFsaWRhdGlvbiBlcnJvciBibG9ja3MuCiAgICBteSBAVmFsaWRhdGlvbkVycm9yczsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CiAgICBteSAkVXNlck9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBnbyB0byBzdG9yZSB0aGUgbmV3IHRlbXBsYXRlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VGVtcGxhdGV9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlO0NoYW5nZUlEPSRDaGFuZ2VJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoYW5nZSBtYW5hZ2VyIGFuZCBjaGFuZ2UgYnVpbGRlciBhcmUgcmVxdWlyZWQgZm9yIGFuIHVwZGF0ZQogICAgICAgIG15ICVFcnJvckFsbFJlcXVpcmVkID0gJFNlbGYtPl9DaGVja0NoYW5nZU1hbmFnZXJBbmRDaGFuZ2VCdWlsZGVyKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBpcyBjYWIgbWVtYmVyIGRlbGV0ZSByZXF1ZXN0ZWQKICAgICAgICBteSAlRGVsZXRlTWVtYmVyID0gJFNlbGYtPl9Jc01lbWJlckRlbGV0aW9uKAogICAgICAgICAgICBDaGFuZ2UgPT4gJENoYW5nZSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBjaGFuZ2UKICAgICAgICBpZiAoICRHZXRQYXJhbXtBZGRDQUJNZW1iZXJ9ICYmICRHZXRQYXJhbXtOZXdDQUJNZW1iZXJ9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBtZW1iZXIKICAgICAgICAgICAgbXkgJUNBQlVwZGF0ZUluZm8gPSAkU2VsZi0+X0lzTmV3Q0FCTWVtYmVyT2soCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDaGFuZ2UgPT4gJENoYW5nZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgbWVtYmVyIGlzIHZhbGlkCiAgICAgICAgICAgIGlmICglQ0FCVXBkYXRlSW5mbykgewoKICAgICAgICAgICAgICAgICMgdXBkYXRlIGNoYW5nZSBDQUIKICAgICAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZUNBQiA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNBQlVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlQ0FCVXBkYXRlSW5mbywKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVDQUIpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgbmV3IGNoYW5nZSBkYXRhIGFzIGEgbWVtYmVyIHdhcyBhZGRlZAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBkaXNwbGF5IGEgbmFtZSBpbiBhdXRvY29tcGxldGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAjIGFuZCBkbyBub3Qgc2V0IHZhbHVlcyBpbiBoaWRkZW4gZmllbGRzIGFzIHRoZQogICAgICAgICAgICAgICAgICAgICMgdXNlciB3YXMgYWxyZWFkeSBhZGRlZAogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBAR2V0UGFyYW17cXcoTmV3Q0FCTWVtYmVyIE5ld0NBQk1lbWJlclNlbGVjdGVkIE5ld0NBQk1lbWJlclR5cGUpfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FzIG5vdCBhYmxlIHRvIHVwZGF0ZSBDaGFuZ2UgQ0FCIGZvciBDaGFuZ2UgJXMhJywgJENoYW5nZUlECiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1lbWJlciBpcyBpbnZhbGlkCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9ye05ld0NBQk1lbWJlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QWRkQ0FCVGVtcGxhdGV9ICkgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGVtcGxhdGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgQ0FCIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgbXkgJENyZWF0ZWRJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byBpbnZvbHZlZCBwZXJzb24sIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnM7Q2hhbmdlSUQ9JENoYW5nZUlEIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbm90aWZ5IGFib3V0IHRoZSBtaXNzaW5nIHRlbXBsYXRlIGlkCiAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntUZW1wbGF0ZUlERXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCVEZWxldGVNZW1iZXIpIHsKCiAgICAgICAgICAgICMgZmluZCB1c2VycyB3aG8gYXJlIHN0aWxsIG1lbWJlciBvZiBDQUIKICAgICAgICAgICAgbXkgJFR5cGUgPSAkRGVsZXRlTWVtYmVye1R5cGV9OwogICAgICAgICAgICBteSBAU3RpbGxNZW1iZXJzID0gZ3JlcCB7ICRfIG5lICREZWxldGVNZW1iZXJ7SUR9IH0gQHsgJENoYW5nZS0+eyRUeXBlfSB9OwoKICAgICAgICAgICAgIyB1cGRhdGUgQ2hhbmdlQ0FCCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZUNBQk1lbWJlciA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNBQlVwZGF0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAkVHlwZSAgICA9PiBcQFN0aWxsTWVtYmVycywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3VjY2Vzc2Z1bCB1cGRhdGUKICAgICAgICAgICAgaWYgKCAhJENvdWxkVXBkYXRlQ0FCTWVtYmVyICkgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSBDQUIgZm9yIENoYW5nZSAlcyEnLCAkQ2hhbmdlSUQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5ldyBjaGFuZ2UgZGF0YSBhcyBhIG1lbWJlciB3YXMgcmVtb3ZlZAogICAgICAgICAgICAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMganVzdCB1cGRhdGUgY2hhbmdlIHdoZW4gc3VibWl0IGJ1dHRvbiBjbGlja2VkCiAgICAgICAgZWxzaWYgKCAhJUVycm9yQWxsUmVxdWlyZWQgJiYgJEdldFBhcmFte1N1Ym1pdH0gKSB7CgogICAgICAgICAgICAjIHVwZGF0ZSBjaGFuZ2UKICAgICAgICAgICAgbXkgJENhblVwZGF0ZUNoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJEdldFBhcmFte0NoYW5nZU1hbmFnZXJTZWxlY3RlZH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJEdldFBhcmFte0NoYW5nZUJ1aWxkZXJTZWxlY3RlZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdWNjZXNzZnVsIHVwZGF0ZQogICAgICAgICAgICBpZiAoJENhblVwZGF0ZUNoYW5nZSkgewoKICAgICAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gY2hhbmdlIHpvb20gbWFzawogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1dhcyBub3QgYWJsZSB0byB1cGRhdGUgQ2hhbmdlICVzIScsICRDaGFuZ2VJRCApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBmaWVsZCBlcnJvcnMganVzdCB3aGVuIHN1Ym1pdAogICAgICAgIGVsc2lmICggJUVycm9yQWxsUmVxdWlyZWQgJiYgJEdldFBhcmFte1N1Ym1pdH0gKSB7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSBmb3IgY2hhbmdlIGJ1aWxkZXIKICAgICAgICAgICAgaWYgKCAkRXJyb3JBbGxSZXF1aXJlZHtDaGFuZ2VCdWlsZGVyfSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntDaGFuZ2VCdWlsZGVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UgZm9yIGNoYW5nZSBtYW5hZ2VyCiAgICAgICAgICAgIGlmICggJEVycm9yQWxsUmVxdWlyZWR7Q2hhbmdlTWFuYWdlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7Q2hhbmdlTWFuYWdlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlIHRoZSBzZWxlY3RlZCBjaGFuZ2UgYW5kIGJ1aWxkZXIgbWFuYWdlcnMKICAgICAgICBpZiAoICRHZXRQYXJhbXtDaGFuZ2VNYW5hZ2VyU2VsZWN0ZWR9ICkgewogICAgICAgICAgICAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSA9ICRHZXRQYXJhbXtDaGFuZ2VNYW5hZ2VyU2VsZWN0ZWR9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2hhbmdlQnVpbGRlclNlbGVjdGVkfSApIHsKICAgICAgICAgICAgJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH0gPSAkR2V0UGFyYW17Q2hhbmdlQnVpbGRlclNlbGVjdGVkfTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMgaWYgaXQgaXMgbm90ICdTYXZlJyBzdWJhY3Rpb24KICAgIGVsc2UgewoKICAgICAgICAjIGluaXRpYWxpemUgdmFyaWFibGVzCiAgICAgICAgbXkgJENoYW5nZU1hbmFnZXIgPSAnJzsKICAgICAgICBteSAkQ2hhbmdlQnVpbGRlciA9ICcnOwoKICAgICAgICAjIGdldCBjaGFuZ2VtYW5hZ2VyIHN0cmluZwogICAgICAgIGlmICggJENoYW5nZS0+e0NoYW5nZU1hbmFnZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2VtYW5hZ2VyIGRhdGEKICAgICAgICAgICAgbXkgJUNoYW5nZU1hbmFnZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VNYW5hZ2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDaGFuZ2VNYW5hZ2VyRGF0YSkgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgc3RyaW5nIHRvIGRpc3BsYXkKICAgICAgICAgICAgICAgICRDaGFuZ2VNYW5hZ2VyID0gc3ByaW50ZiAnIiVzIiA8JXM+JywKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlTWFuYWdlckRhdGF7VXNlckZ1bGxuYW1lfSwKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlTWFuYWdlckRhdGF7VXNlckVtYWlsfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hhbmdlYnVpbGRlciBzdHJpbmcKICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlYnVpbGRlciBkYXRhCiAgICAgICAgICAgIG15ICVDaGFuZ2VCdWlsZGVyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglQ2hhbmdlQnVpbGRlckRhdGEpIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHN0cmluZyB0byBkaXNwbGF5CiAgICAgICAgICAgICAgICAkQ2hhbmdlQnVpbGRlciA9IHNwcmludGYgJyIlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUJ1aWxkZXJEYXRhe1VzZXJGdWxsbmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUJ1aWxkZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZmlsbCBHZXRQYXJhbSBoYXNoCiAgICAgICAgJUdldFBhcmFtID0gKAogICAgICAgICAgICBDaGFuZ2VNYW5hZ2VyICAgPT4gJENoYW5nZU1hbmFnZXIsCiAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSwKICAgICAgICAgICAgQ2hhbmdlQnVpbGRlciAgID0+ICRDaGFuZ2VCdWlsZGVyLAogICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWxsIGFnZW50IG1lbWJlcnMgb2YgQ0FCCiAgICBpZiAoIEB7ICRDaGFuZ2UtPntDQUJBZ2VudHN9IH0gfHwgQHsgJENoYW5nZS0+e0NBQkN1c3RvbWVyc30gfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQ0FCTWVtYmVyVGFibGUnICk7CiAgICB9CgogICAgVVNFUklEOgogICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSB9ICkgewoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgbmV4dCBpZiBubyB1c2VyIGRhdGEgY2FuIGJlIGZvdW5kCiAgICAgICAgbmV4dCBVU0VSSUQgaWYgISVVc2VyRGF0YTsKCiAgICAgICAgIyBkaXNwbGF5IGNhYiBtZW1iZXIgaW5mbwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDQUJNZW1iZXJSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFVzZXJUeXBlICAgICAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgICAgIEludGVybmFsVXNlclR5cGUgPT4gJ0NBQkFnZW50cycsCiAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgdXNlciBvYmplY3QKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBzaG93IGFsbCBjdXN0b21lciBtZW1iZXJzIG9mIENBQgogICAgQ1VTVE9NRVJMT0dJTjoKICAgIGZvciBteSAkQ3VzdG9tZXJMb2dpbiAoIEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJEN1c3RvbWVyTG9naW4sCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBuZXh0IGlmIG5vIHVzZXIgZGF0YSBjYW4gYmUgZm91bmQKICAgICAgICBuZXh0IENVU1RPTUVSTE9HSU4gaWYgISVDdXN0b21lclVzZXJEYXRhOwoKICAgICAgICAjIGRpc3BsYXkgY2FiIG1lbWJlciBpbmZvCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQk1lbWJlclJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVXNlclR5cGUgICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgSW50ZXJuYWxVc2VyVHlwZSA9PiAnQ0FCQ3VzdG9tZXJzJywKICAgICAgICAgICAgICAgICVDdXN0b21lclVzZXJEYXRhLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHZhbGlkYXRpb24gZXJyb3JzIGluIENBQlRlbXBsYXRlIGJsb2NrCiAgICBteSAlVmFsaWRhdGlvbkVycm9yTmFtZXM7CiAgICBteSAkVGVtcGxhdGVFcnJvciA9ICcnOwoKICAgICRWYWxpZGF0aW9uRXJyb3JOYW1lc3tAVmFsaWRhdGlvbkVycm9yc30gPSAoMSkgeCBAVmFsaWRhdGlvbkVycm9yczsKCiAgICBmb3IgbXkgJENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yIChxdyhJbnZhbGlkVGVtcGxhdGUpKSB7CiAgICAgICAgaWYgKCAkVmFsaWRhdGlvbkVycm9yTmFtZXN7JENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yfSApIHsKICAgICAgICAgICAgJFNlcnZlckVycm9ye1RlbXBsYXRlSURFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHRlbXBsYXRlIGRyb3Bkb3duCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQ29tbWVudExlbmd0aCA9PiAxNSwKICAgICAgICBUZW1wbGF0ZVR5cGUgID0+ICdDQUInLAogICAgKTsKCiAgICBteSAkVGVtcGxhdGVEcm9wRG93biA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVGVtcGxhdGVJRCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRUZW1wbGF0ZUxpc3QsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIHNob3cgYmxvY2sgd2l0aCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ0FCVGVtcGxhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDQUJUZW1wbGF0ZVN0cmcgPT4gJFRlbXBsYXRlRHJvcERvd24sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBpZiBDQUIgTWVtYmVycyBzaG93IE5ldyBUZW1wbGF0ZSBCdXR0b24KICAgIGlmICggQHsgJENoYW5nZS0+e0NBQkFnZW50c30gfSB8fCBAeyAkQ2hhbmdlLT57Q0FCQ3VzdG9tZXJzfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdOZXdUZW1wbGF0ZUJ1dHRvbicgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmlnYXRpb24KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdJbnZvbHZlZCBQZXJzb25zJyksCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVNlcnZlckVycm9yLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0lzTWVtYmVyRGVsZXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRvIG5vdCBkZXRlY3QgZGVsZXRpb24gd2hlbiBubyBzdWJhY3Rpb24gaXMgZ2l2ZW4KICAgIHJldHVybiBpZiAhJFNlbGYtPntTdWJhY3Rpb259OwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtDaGFuZ2V9OwoKICAgICMgaW5mbyBhYm91dCB3aGF0IHRvIGRlbGV0ZQogICAgbXkgJURlbGV0ZUluZm87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBDaGVjayBmb3IgdGhlIG1lbWJlciB0byBkZWxldGUKICAgIG15ICREZWxldGVDQUJNZW1iZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdEZWxldGVDQUJNZW1iZXInLAogICAgKTsKCiAgICAjIFN0b3AgaGVyZSBpZiBubyBjYWIgbWVtYmVyIHdhcyBnaXZlbiB0byBkZWxldGUuCiAgICByZXR1cm4gaWYgISREZWxldGVDQUJNZW1iZXI7CgogICAgbXkgKCAkTWVtYmVyVHlwZSwgJE1lbWJlcklELCApID0gKCAkRGVsZXRlQ0FCTWVtYmVyID1+IG0vXihcdyspLSguKykkL2kgKTsKCiAgICAjIE5vIG1lbWJlciwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZS4KICAgIHJldHVybiBpZiAhJE1lbWJlcklEOwoKICAgICMgR2V0IHRoZSBtZW1iZXJzIGxpc3QuCiAgICBteSAkVmFsaWRNZW1iZXJzID0gJFBhcmFte0NoYW5nZX0tPnskTWVtYmVyVHlwZX0gfHwgW107CgogICAgIyBObyBtZW1iZXJzIGZvciB0aGUgdHlwZSwganVzdCByZXR1cm4uCiAgICByZXR1cm4gaWYgIUB7JFZhbGlkTWVtYmVyc307CgogICAgIyBDaGVjayBpZiB0aGUgZ2l2ZW4gbWVtYmVyIGlkIGlzIHZhbGlkLgogICAgbXkgJEZvdW5kID0gTGlzdDo6VXRpbDo6Zmlyc3QgeyAkXyBlcSAkTWVtYmVySUQgfSBAeyRWYWxpZE1lbWJlcnN9OwogICAgaWYgKCRGb3VuZCkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIFR5cGUgPT4gJE1lbWJlclR5cGUsCiAgICAgICAgICAgIElEICAgPT4gJE1lbWJlcklELAogICAgICAgICk7CiAgICB9CgogICAgIyBNZW1iZXIgbm90IGZvdW5kLgogICAgcmV0dXJuOwp9CgpzdWIgX0NoZWNrQ2hhbmdlTWFuYWdlckFuZENoYW5nZUJ1aWxkZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFRoZSBoYXNoIHdpdGggdGhlIGVycm9yIGluZm8gd2lsbCBiZSByZXR1cm5lZC4KICAgIG15ICVFcnJvcnM7CgogICAgUk9MRToKICAgIGZvciBteSAkUm9sZSAocXcoQ2hhbmdlQnVpbGRlciBDaGFuZ2VNYW5hZ2VyKSkgewoKICAgICAgICAjIGNoZWNrIHRoZSByb2xlCiAgICAgICAgaWYgKCAhJFBhcmFteyRSb2xlfSB8fCAhJFBhcmFteyAkUm9sZSAuICdTZWxlY3RlZCcgfSApIHsKICAgICAgICAgICAgJEVycm9yc3skUm9sZX0gPSAxOwogICAgICAgICAgICBuZXh0IFJPTEU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFteyAkUm9sZSAuICdTZWxlY3RlZCcgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgdXNlciBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISVVc2VyICkgewogICAgICAgICAgICAkRXJyb3JzeyRSb2xlfSA9IDE7CiAgICAgICAgICAgIG5leHQgUk9MRTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgd2hldGhlciB0aGUgaW5wdXQgaGFzIGJlZW4gbWFudWFsbHkgZWRpdGVkLgogICAgICAgICMgTG9vayBmb3IgZXhhY3QgbWF0Y2ggYXQgYmVnaW5uaW5nLAogICAgICAgICMgYXMgJFVzZXJ7VXNlckxhc3RuYW1lfSBtaWdodCBjb250YWluIGEgdHJhaWxpbmcgJ291dCBvZiBvZmZpY2UnIG5vdGUuCiAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyB3b24ndCBjYXRjaCBkZWxldGlvbnMgb2YgJFBhcmFteyRSb2xlfSBhdCB0aGUgZW5kLgogICAgICAgIG15ICRDaGVja1N0cmluZyA9IHNwcmludGYgJyIlcyIgPCVzPicsCiAgICAgICAgICAgICRVc2Vye1VzZXJGdWxsbmFtZX0sCiAgICAgICAgICAgICRVc2Vye1VzZXJFbWFpbH07CiAgICAgICAgaWYgKCBpbmRleCggJENoZWNrU3RyaW5nLCAkUGFyYW17JFJvbGV9ICkgIT0gMCApIHsKICAgICAgICAgICAgJEVycm9yc3skUm9sZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUVycm9yczsKfQoKc3ViIF9Jc05ld0NBQk1lbWJlck9rIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NoYW5nZX07CgogICAgIyBUaGUgbWVtYmVyIGluZm8gd2lsbCBiZSByZXR1cm5lZC4KICAgIG15ICVNZW1iZXJJbmZvOwoKICAgICMgQ0FCQ3VzdG9tZXJzIG9yIENBQkFnZW50cz8KICAgIG15ICRNZW1iZXJUeXBlID0gJFBhcmFte05ld0NBQk1lbWJlclR5cGV9OwoKICAgICMgY3VycmVudCBtZW1iZXJzCiAgICBteSBAQ3VycmVudE1lbWJlcnM7CgogICAgIyBhbiBhZ2VudCBpcyByZXF1ZXN0ZWQgdG8gYmUgYWRkZWQKICAgIGlmICggJE1lbWJlclR5cGUgZXEgJ0NBQkFnZW50cycgKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtOZXdDQUJNZW1iZXJTZWxlY3RlZH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCVVc2VyKSB7CgogICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgdXNlcnMKICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRQYXJhbXtDaGFuZ2V9LT57JE1lbWJlclR5cGV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGludmFsaWQgdXNlcnMgZnJvbSBDQUIKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlckRhdGF7VXNlcklEfTsKCiAgICAgICAgICAgICAgICBwdXNoIEBDdXJyZW50TWVtYmVycywgJFVzZXJJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDb21wYXJlIGlucHV0IHZhbHVlIHdpdGggdXNlciBkYXRhLgogICAgICAgICAgICAjIExvb2sgZm9yIGV4YWN0IG1hdGNoIGF0IGJlZ2lubmluZywKICAgICAgICAgICAgIyBhcyAkVXNlcntVc2VyTGFzdG5hbWV9IG1pZ2h0IGNvbnRhaW4gYSB0cmFpbGluZyAnb3V0IG9mIG9mZmljZScgbm90ZS4KICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyB3b24ndCBjYXRjaCBkZWxldGlvbnMgb2YgJFBhcmFte05ld0NBQk1lbWJlcn0gYXQgdGhlIGVuZC4KICAgICAgICAgICAgbXkgJENoZWNrU3RyaW5nID0gc3ByaW50ZiAnIiVzIiA8JXM+JywKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJGdWxsbmFtZX0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRW1haWx9OwogICAgICAgICAgICBpZiAoIGluZGV4KCAkQ2hlY2tTdHJpbmcsICRQYXJhbXtOZXdDQUJNZW1iZXJ9ICkgPT0gMCApIHsKCiAgICAgICAgICAgICAgICAjIHNhdmUgbWVtYmVyIGluZm9zCiAgICAgICAgICAgICAgICAlTWVtYmVySW5mbyA9ICgKICAgICAgICAgICAgICAgICAgICAkTWVtYmVyVHlwZSA9PiBbIEBDdXJyZW50TWVtYmVycywgJFVzZXJ7VXNlcklEfSBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFuIGN1c3RvbWVyIGlzIHJlcXVlc3RlZCB0byBiZSBhZGRlZAogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgb2JqZWN0CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAgICAgIyBjaGVjayBjdXJyZW50IGN1c3RvbWVyIHVzZXJzCiAgICAgICAgQ1VTVE9NRVJVU0VSOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyICggQHsgJFBhcmFte0NoYW5nZX0tPnskTWVtYmVyVHlwZX0gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgZGF0YQogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyICA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGludmFsaWQgY3VzdG9tZXIgdXNlcnMgZnJvbSBDQUIKICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVIgaWYgISVDdXN0b21lclVzZXJEYXRhOwoKICAgICAgICAgICAgcHVzaCBAQ3VycmVudE1lbWJlcnMsICRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGNhbiBiZSBmb3VuZAogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtOZXdDQUJNZW1iZXJTZWxlY3RlZH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyeyAkUGFyYW17TmV3Q0FCTWVtYmVyU2VsZWN0ZWR9IH0gKSB7CgogICAgICAgICAgICAjIHNhdmUgbWVtYmVyIGluZm9zCiAgICAgICAgICAgICVNZW1iZXJJbmZvID0gKAogICAgICAgICAgICAgICAgJE1lbWJlclR5cGUgPT4gWyBAQ3VycmVudE1lbWJlcnMsICRQYXJhbXtOZXdDQUJNZW1iZXJTZWxlY3RlZH0gXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVNZW1iZXJJbmZvOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU1hbmFnZXIucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlTWFuYWdlci5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZU1hbmFnZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQ2hhbmdlTnVtYmVyJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAkTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiBjaGFuZ2Ugc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIGNoYW5nZSBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgQ0hBTkdFU1RBVEU6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IGNoYW5nZSBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skQ2hhbmdlU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiAkQ2hhbmdlSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskQ2hhbmdlSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ092ZXJ2aWV3OiBDaGFuZ2VNYW5hZ2VyJyksCgogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAoKICAgICAgICBFbnYgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgPT4gJExpbmtTb3J0LAoKICAgICAgICBTaG93Q29sdW1ucyA9PiBcQFNob3dDb2x1bW5zLAogICAgICAgIFNvcnRCeSAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApLAogICAgICAgIE9yZGVyQnkgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15Q0FCLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZU15Q0FCLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlTXlDQUI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQ2hhbmdlTnVtYmVyJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAkTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiBjaGFuZ2Ugc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIGNoYW5nZSBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgQ0hBTkdFU1RBVEU6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IGNoYW5nZSBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skQ2hhbmdlU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiAkQ2hhbmdlSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskQ2hhbmdlSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPdmVydmlldzogTXkgQ0FCJyksCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICAgICAgU29ydEJ5ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICksCiAgICAgICAgT3JkZXJCeSAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15Q2hhbmdlcy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBSZWZyZXNoID0+ICRSZWZyZXNoICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICggc29ydCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbJENoYW5nZVN0YXRlXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmaWx0ZXIgYW5kIHZpZXcgcGFyYW1zCiAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICdBbGwnOwogICAgJFNlbGYtPntWaWV3fSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkRmlsdGVyTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCBkZWZhdWx0IGZpbHRlcgogICAgICAgICRGaWx0ZXJze0FsbH0gPSB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9LAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgRmlsdGVyOiAlcyEnLCAkU2VsZi0+e0ZpbHRlcn0gKSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VhcmNoIGNoYW5nZXMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJENoYW5nZUlEc1JlZiA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICApOwoKICAgICMgZGlzcGxheSBhbGwgbmF2YmFyIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgbXkgJENvdW50ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRoZSBuYXZiYXIgZmlsdGVyCiAgICAgICAgJE5hdkJhckZpbHRlcnsgJEZpbHRlcnN7JEZpbHRlcn0tPntQcmlvfSB9ID0gewogICAgICAgICAgICBDb3VudCAgPT4gJENvdW50LAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyBjaGFuZ2VzCiAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7U29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtGaWx0ZXIgPSAnU29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7JzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUxpc3RTaG93KAoKICAgICAgICBDaGFuZ2VJRHMgPT4gJENoYW5nZUlEc1JlZiwKICAgICAgICBUb3RhbCAgICAgPT4gc2NhbGFyIEB7JENoYW5nZUlEc1JlZn0sCgogICAgICAgIFZpZXcgPT4gJFNlbGYtPntWaWV3fSwKCiAgICAgICAgRmlsdGVyICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPdmVydmlldzogTXkgQ2hhbmdlcycpLAoKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBTb3J0QnkgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKSwKICAgICAgICBPcmRlckJ5ICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICksCiAgICApOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbldvcmtPcmRlcnMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBzb3J0IGJ5IGNoYW5nZSBudW1iZXIgZmlyc3QgaWYgdXNlciB3YW50cyB0byBzb3J0IGJ5IHdvcmtvcmRlciBudW1iZXIKICAgIGlmICggJFNvcnRCeSBlcSAnV29ya09yZGVyTnVtYmVyJyApIHsKICAgICAgICBAU29ydEJ5QXJyYXkgPSAoICdDaGFuZ2VOdW1iZXInLCAnV29ya09yZGVyTnVtYmVyJyApOwogICAgICAgIEBPcmRlckJ5QXJyYXkgPSAoICRPcmRlckJ5LCAkT3JkZXJCeSApOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgc3RhcnRpbmcgd2l0aCBwYWdlIC4uLgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkTGF5b3V0T2JqZWN0LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBmaWx0ZXJzCiAgICBteSAlRmlsdGVyczsKCiAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIHdvcmtvcmRlciBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgV09SS09SREVSU1RBVEU6CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgd29ya29yZGVyIHN0YXRlcwogICAgICAgICAgICBuZXh0IFdPUktPUkRFUlNUQVRFIGlmICEkV29ya09yZGVyU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJTdGF0ZUlEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCB3b3Jrb3JkZXIgc3RhdGVzCiAgICAgICAgICAgIG5leHQgV09SS09SREVSU1RBVEUgaWYgISRXb3JrT3JkZXJTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skV29ya09yZGVyU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gWyRXb3JrT3JkZXJTdGF0ZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgICA9PiAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpXb3JrT3JkZXJTdGF0ZXMnfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggd29ya29yZGVycyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkV29ya09yZGVySURzUmVmID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2Ygd29ya29yZGVycyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIFdvcmtPcmRlcklEcyA9PiAkV29ya09yZGVySURzUmVmLAogICAgICAgIFRvdGFsICAgICAgICA9PiBzY2FsYXIgQHskV29ya09yZGVySURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ092ZXJ2aWV3OiBNeSBXb3Jrb3JkZXJzJyksCgogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAoKICAgICAgICBFbnYgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgPT4gJExpbmtTb3J0LAoKICAgICAgICBTaG93Q29sdW1ucyA9PiBcQFNob3dDb2x1bW5zLAogICAgICAgIFNvcnRCeSAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApLAogICAgICAgIE9yZGVyQnkgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVBJUi5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VQSVIucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VQSVI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbldvcmtPcmRlcnMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBzb3J0IGJ5IGNoYW5nZSBudW1iZXIgZmlyc3QgaWYgdXNlciB3YW50cyB0byBzb3J0IGJ5IHdvcmtvcmRlciBudW1iZXIKICAgIGlmICggJFNvcnRCeSBlcSAnV29ya09yZGVyTnVtYmVyJyApIHsKICAgICAgICBAU29ydEJ5QXJyYXkgPSAoICdDaGFuZ2VOdW1iZXInLCAnV29ya09yZGVyTnVtYmVyJyApOwogICAgICAgIEBPcmRlckJ5QXJyYXkgPSAoICRPcmRlckJ5LCAkT3JkZXJCeSApOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgc3RhcnRpbmcgd2l0aCBwYWdlIC4uLgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkTGF5b3V0T2JqZWN0LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCB3b3Jrb3JkZXIgdHlwZXMgc2hvdWxkIGJlIHVzZWQgdG8gc2hvdyBQSVIKICAgIG15IEBXb3JrT3JkZXJUeXBlczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyVHlwZXN9ICkgewogICAgICAgIFdPUktPUkRFUlRZUEU6CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJUeXBlICggQHsgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyVHlwZXN9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHdvcmtvcmRlciB0eXBlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHR5cGUgaWQKICAgICAgICAgICAgbXkgJFdvcmtPcmRlclR5cGVJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICRXb3JrT3JkZXJUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgd29ya29yZGVyIHR5cGVzCiAgICAgICAgICAgIG5leHQgV09SS09SREVSVFlQRSBpZiAhJFdvcmtPcmRlclR5cGVJRDsKCiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlclR5cGVzLCAkV29ya09yZGVyVHlwZTsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIHdvcmtvcmRlciBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgV09SS09SREVSU1RBVEU6CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgd29ya29yZGVyIHN0YXRlcwogICAgICAgICAgICBuZXh0IFdPUktPUkRFUlNUQVRFIGlmICEkV29ya09yZGVyU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJTdGF0ZUlEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCB3b3Jrb3JkZXIgc3RhdGVzCiAgICAgICAgICAgIG5leHQgV09SS09SREVSU1RBVEUgaWYgISRXb3JrT3JkZXJTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skV29ya09yZGVyU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVzICAgPT4gXEBXb3JrT3JkZXJUeXBlcywKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgID0+IFskV29ya09yZGVyU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0gc29ydCBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIGxpbWl0IHRvIGNvbmZpZ3VyZWQgc3RhdGVzCiAgICAgICAgbXkgQFdvcmtPcmRlclN0YXRlcyA9IHNvcnQga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzICA9PiBcQFdvcmtPcmRlclN0YXRlcywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVzICAgPT4gXEBXb3JrT3JkZXJUeXBlcywKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdJbnZhbGlkIEZpbHRlcjogJXMhJywgJFNlbGYtPntGaWx0ZXJ9ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB3b3Jrb3JkZXJzIHdoaWNoIG1hdGNoIHRoZSBzZWxlY3RlZCBmaWx0ZXIKICAgIG15ICRXb3JrT3JkZXJJRHNSZWYgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiB3b3Jrb3JkZXJzIGZvciBlYWNoIGZpbHRlcgogICAgICAgIG15ICRDb3VudCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgY2hhbmdlcwogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua1NvcnQgPSAnRmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPklUU01DaGFuZ2VMaXN0U2hvdygKCiAgICAgICAgV29ya09yZGVySURzID0+ICRXb3JrT3JkZXJJRHNSZWYsCiAgICAgICAgVG90YWwgICAgICAgID0+IHNjYWxhciBAeyRXb3JrT3JkZXJJRHNSZWZ9LAoKICAgICAgICBWaWV3ID0+ICRTZWxmLT57Vmlld30sCgogICAgICAgIEZpbHRlciAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKCiAgICAgICAgVGl0bGVOYW1lID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnT3ZlcnZpZXc6IFBJUicpLAoKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBTb3J0QnkgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKSwKICAgICAgICBPcmRlckJ5ICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICksCiAgICApOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVByaW50LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVByaW50LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlUHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdyhtYXgpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgRmluZCBvdXQgd2hldGhlciBhIGNoYW5nZSBvciBhIHdvcmtvcmRlciBzaG91bGQgYmUgcHJpbnRlZC4KICAgICMgQSB3b3Jrb3JkZXIgaXMgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBXb3JrT3JkZXJJRCBpcyBwYXNzZWQuCiAgICAjIE90aGVyd2lzZSBhIGNoYW5nZSBzaG91bGQgYmUgcHJpbnRlZC4KICAgIG15ICRXb3JrT3JkZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKICAgIG15ICRQcmludFdvcmtPcmRlciA9ICRXb3JrT3JkZXJJRCA/IDEgOiAwOwogICAgbXkgJFByaW50Q2hhbmdlICAgID0gISRXb3JrT3JkZXJJRDsKICAgIG15ICRXb3JrT3JkZXIgICAgICA9IHt9OwogICAgbXkgJENoYW5nZUlEOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2hhbmdlT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIGlmICgkUHJpbnRXb3JrT3JkZXIpIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9uIG9uIHRoZSB3b3Jrb3JkZXIKICAgICAgICBteSAkQWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4KICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBpbmZvcm1hdGlvbgogICAgICAgICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnV29ya09yZGVyICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbmZlciB0aGUgY2hhbmdlIGlkIGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICRDaGFuZ2VJRCA9ICRXb3JrT3JkZXItPntDaGFuZ2VJRH07CgogICAgICAgIGlmICggISRDaGFuZ2VJRCApIHsKCiAgICAgICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IGNyZWF0ZSBvdXRwdXQsIGFzIHRoZSB3b3Jrb3JkZXIgaXMgbm90IGF0dGFjaGVkIHRvIGEgY2hhbmdlIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHRoZSBjaGFuZ2UgaWQgaXMgcmVxdWlyZWQsIGFzIHdlIGhhdmUgbm8gd29ya29yZGVyIGlkCiAgICAgICAgJENoYW5nZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CgogICAgICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBjcmVhdGUgb3V0cHV0LCBhcyBubyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbiBvbiB0aGUgY2hhbmdlCiAgICAgICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZXJyb3Igc2NyZWVuCiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBpbmZvcm1hdGlvbgogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDaGFuZ2UgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJENoYW5nZUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgc29tZSBpbml0IGZvciBQREYtT3V0cHV0CiAgICAjIHBhZ2UgY29udHJvbHMgdGhlIFBERi1nZW5lcmF0aW9uCiAgICAkU2VsZi0+e1BhZ2V9ID0ge307CiAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFnZX07CgogICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICRQYWdlLT57TWF4UGFnZXN9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICBpZiAoICEkUGFnZS0+e01heFBhZ2VzfSB8fCAkUGFnZS0+e01heFBhZ2VzfSA8IDEgfHwgJFBhZ2UtPntNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICRQYWdlLT57TWF4UGFnZXN9ID0gMTAwOwogICAgfQoKICAgICMgcGFnZSBsYXlvdXQgc2V0dGluZ3MKICAgICRQYWdlLT57TWFyZ2luVG9wfSAgICA9IDMwOwogICAgJFBhZ2UtPntNYXJnaW5SaWdodH0gID0gNDA7CiAgICAkUGFnZS0+e01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICRQYWdlLT57TWFyZ2luTGVmdH0gICA9IDQwOwoKICAgICMgdGhlIHNlY29uZCBpdGVtIGluIHRoZSBwYWdlIHRpdGxlIGlzIHRoZSBhcmVhIGluIHRoZSBwcm9kdWN0ICdJVFNNIENoYW5nZSBNYW5hZ2VtZW50JwogICAgbXkgJEhlYWRlckFyZWEgPSAkUHJpbnRDaGFuZ2UgPyAnSVRTTSBDaGFuZ2UnIDogJ0lUU00gV29ya29yZGVyJzsKICAgICRIZWFkZXJBcmVhID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRIZWFkZXJBcmVhKTsKCiAgICAjIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHBhZ2UgdGl0bGUgaXMgZWl0aGVyIHRoZSBjaGFuZ2UgbnVtYmVyIG9mIHRoZSBmdWxsIHdvcmtvcmRlciBudW1iZXIKICAgIG15ICRIZWFkZXJWYWx1ZSA9ICRQcmludENoYW5nZQogICAgICAgID8KICAgICAgICAkQ2hhbmdlLT57Q2hhbmdlTnVtYmVyfQogICAgICAgIDoKICAgICAgICBqb2luKCAnLScsICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LCAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSApOwoKICAgICMgc3RhcnQgdGhlIGRvY3VtZW50CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPl9TdGFydERvY3VtZW50KAogICAgICAgIEhlYWRlckFyZWEgID0+ICRIZWFkZXJBcmVhLAogICAgICAgIEhlYWRlclZhbHVlID0+ICRIZWFkZXJWYWx1ZSwKICAgICk7CgogICAgIyBnZXQgbGluayBvYmplY3QKICAgIG15ICRMaW5rT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKCiAgICAjIHRoZSBsaW5rIHR5cGVzIGFyZSBuZWVkZWQgZm9yIHNob3dpbmcgdGhlIGxpbmtlZCBvYmplY3RzCiAgICBteSAlTGlua1R5cGVMaXN0ID0gJExpbmtPYmplY3QtPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgcHJpbnQgdGhlIGNoYW5nZSBzcGVjaWZpYyBzdHVmZgogICAgaWYgKCRQcmludENoYW5nZSkgewoKICAgICAgICAjIHN0YXJ0IHRoZSBmaXJzdCBwYWdlCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dEhlYWRsaW5lKAogICAgICAgICAgICBIZWFkZXJBcmVhICAgICA9PiAkSGVhZGVyQXJlYSwKICAgICAgICAgICAgSGVhZGVyVmFsdWUgICAgPT4gJEhlYWRlclZhbHVlLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9IHx8IFRyYW5zbGF0YWJsZSgndW5rbm93biBjaGFuZ2UgdGl0bGUnKSwKICAgICAgICAgICAgVGVtcGxhdGVQcmVmaXggPT4gJ0NoYW5nZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY2hhbmdlIGluZm8KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0Q2hhbmdlSW5mbygKICAgICAgICAgICAgQ2hhbmdlICAgICAgICAgPT4gJENoYW5nZSwKICAgICAgICAgICAgUHJpbnRXb3JrT3JkZXIgPT4gJFByaW50V29ya09yZGVyLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGNoYW5nZSBkZXNjcmlwdGlvbiBhbmQganVzdGlmaWNhdGlvbgogICAgICAgICMgdGhlIHBsYWluIGNvbnRlbnQgd2lsbCBiZSBkaXNwbGF5ZWQKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoRGVzY3JpcHRpb24gSnVzdGlmaWNhdGlvbikpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dExvbmdUZXh0KAogICAgICAgICAgICAgICAgUHJpbnRDaGFuZ2UgICAgPT4gJFByaW50Q2hhbmdlLAogICAgICAgICAgICAgICAgUHJpbnRXb3JrT3JkZXIgPT4gJFByaW50V29ya09yZGVyLAogICAgICAgICAgICAgICAgVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEF0dHJpYnV0ZSksCiAgICAgICAgICAgICAgICBMb25nVGV4dCA9PiAkQ2hhbmdlLT57ICRBdHRyaWJ1dGUgLiAnUGxhaW4nIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyB3aGljaCBhcmUgZGlyZWN0bHkgbGlua2VkIHdpdGggdGhpcyBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkTGlua09iamVjdC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgS2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbWJpbmVkIGxpbmtlZCBvYmplY3RzIGZyb20gYWxsIHdvcmtvcmRlcnMgb2YgdGhpcyBjaGFuZ2UKICAgICAgICBteSAkTGlua0xpc3RXaXRoRGF0YUNvbWJpbmVkV29ya09yZGVycyA9IHt9OwogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMgb2YgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXIgPSAkTGlua09iamVjdC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgT0JKRUNUOgogICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyfSApIHsKCiAgICAgICAgICAgICAgICAjIG9ubHkgc2hvdyBsaW5rZWQgc2VydmljZXMgYW5kIGNvbmZpZyBpdGVtcyBvZiB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdCBuZSAnU2VydmljZScgJiYgJE9iamVjdCBuZSAnSVRTTUNvbmZpZ0l0ZW0nICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIExJTktUWVBFOgogICAgICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgIERJUkVDVElPTjoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29tYmluZSB0aGUgbGlua2VkIG9iamVjdCBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhQ29tYmluZWRXb3JrT3JkZXJzLT57JE9iamVjdH0tPnskTGlua1R5cGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JERpcmVjdGlvbn0tPnskSUR9ID0gJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+eyRJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGNvbWJpbmVkIGxpbmtlZCBvYmplY3RzIGZyb20gd29ya29yZGVyIHRvIGxpbmtlZCBvYmplY3RzIGZyb20gY2hhbmdlIG9iamVjdAogICAgICAgICRMaW5rTGlzdFdpdGhEYXRhID0gewogICAgICAgICAgICAleyRMaW5rTGlzdFdpdGhEYXRhfSwKICAgICAgICAgICAgJXskTGlua0xpc3RXaXRoRGF0YUNvbWJpbmVkV29ya09yZGVyc30sCiAgICAgICAgfTsKCiAgICAgICAgIyBnZXQgdGhlIGxpbmsgZGF0YQogICAgICAgIGlmICggJExpbmtMaXN0V2l0aERhdGEgJiYgcmVmICRMaW5rTGlzdFdpdGhEYXRhIGVxICdIQVNIJyAmJiAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICAgICAgbXkgJUxpbmtEYXRhID0gJExheW91dE9iamVjdC0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgICAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJ1NpbXBsZVJhdycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgICAgIFByaW50Q2hhbmdlICAgID0+ICRQcmludENoYW5nZSwKICAgICAgICAgICAgICAgIFByaW50V29ya09yZGVyID0+ICRQcmludFdvcmtPcmRlciwKICAgICAgICAgICAgICAgIExpbmtEYXRhICAgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgICA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFuIG92ZXJ2aWV3IG92ZXIgd29ya29yZGVycwogICAgICAgIG15IEBXb3JrT3JkZXJPdmVydmlldzsKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBpbmZvCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnV29ya09yZGVyICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlck92ZXJ2aWV3LCBbCiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSwKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGV9LAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+e1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+e1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+e0FjdHVhbEVuZFRpbWV9LAogICAgICAgICAgICBdOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dFdvcmtPcmRlck92ZXJ2aWV3KAogICAgICAgICAgICBXb3JrT3JkZXJPdmVydmlldyA9PiBcQFdvcmtPcmRlck92ZXJ2aWV3LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgZWl0aGVyIGEgc2luZ2xlIHdvcmtvcmRlciBvciBhbGwgd29ya29yZGVycyBvZiBhIGNoYW5nZQogICAgbXkgQFdvcmtPcmRlcklEcyA9ICRQcmludENoYW5nZSA/IEB7ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IHx8IFtdIH0gOiAoJFdvcmtPcmRlcklEKTsKCiAgICBmb3IgbXkgJFdvcmtPcmRlcklEIChAV29ya09yZGVySURzKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBpbmZvCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywKICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCBhIG5ldyBwYWdlIGZvciBldmVyeSB3b3Jrb3JkZXIKICAgICAgICBteSAkSGVhZGVyQXJlYSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnSVRTTSBXb3Jrb3JkZXInKTsKICAgICAgICBteSAkSGVhZGVyVmFsdWUgPSBqb2luICctJywgJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sICRXb3JrT3JkZXItPnsgVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXJOdW1iZXInKSB9OwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0SGVhZGxpbmUoCiAgICAgICAgICAgIEhlYWRlckFyZWEgICAgID0+ICRIZWFkZXJBcmVhLAogICAgICAgICAgICBIZWFkZXJWYWx1ZSAgICA9PiAkSGVhZGVyVmFsdWUsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgID0+ICRXb3JrT3JkZXItPnsgVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXJUaXRsZScpIH0gfHwgVHJhbnNsYXRhYmxlKCd1bmtub3duIHdvcmtvcmRlciB0aXRsZScpLAogICAgICAgICAgICBUZW1wbGF0ZVByZWZpeCA9PiAnV29ya09yZGVyJywKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0V29ya09yZGVySW5mbygKICAgICAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgICAgIFdvcmtPcmRlciA9PiAkV29ya09yZGVyLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHdvcmtvcmRlciBpbnN0cnVjdGlvbiBhbmQgcmVwb3J0CiAgICAgICAgIyBUaGUgcGxhaW4gY29udGVudCB3aWxsIGJlIGRpc3BsYXllZAogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhJbnN0cnVjdGlvbiBSZXBvcnQpKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdXRwdXRMb25nVGV4dCgKICAgICAgICAgICAgICAgIFByaW50Q2hhbmdlICAgID0+IDAsCiAgICAgICAgICAgICAgICBQcmludFdvcmtPcmRlciA9PiAxLAogICAgICAgICAgICAgICAgVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEF0dHJpYnV0ZSksCiAgICAgICAgICAgICAgICBMb25nVGV4dCA9PiAkV29ya09yZGVyLT57ICRBdHRyaWJ1dGUgLiAnUGxhaW4nIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJExpbmtPYmplY3QtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgIEtleSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBsaW5rIGRhdGEKICAgICAgICBpZiAoICRMaW5rTGlzdFdpdGhEYXRhICYmIHJlZiAkTGlua0xpc3RXaXRoRGF0YSBlcSAnSEFTSCcgJiYgJXskTGlua0xpc3RXaXRoRGF0YX0gKSB7CiAgICAgICAgICAgIG15ICVMaW5rRGF0YSA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQcmludENoYW5nZSAgICA9PiAwLAogICAgICAgICAgICAgICAgUHJpbnRXb3JrT3JkZXIgPT4gMSwKICAgICAgICAgICAgICAgIExpbmtEYXRhICAgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgICA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZW5lcmF0ZSBQREYgb3V0cHV0CiAgICAjIGdldCB0aW1lIG9iamVjdAoKICAgICMgZ2VuZXJhdGUgYSBmaWxlbmFtZQogICAgbXkgJEN1clN5c0RUT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSBARmlsZW5hbWU7CgogICAgaWYgKCRQcmludENoYW5nZSkgewogICAgICAgIHB1c2ggQEZpbGVuYW1lLCAnY2hhbmdlJywgJENoYW5nZS0+e0NoYW5nZU51bWJlcn07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwdXNoIEBGaWxlbmFtZSwgJ3dvcmtvcmRlcicsICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9IC4gJy0nIC4gJFdvcmtPcmRlci0+e1dvcmtPcmRlck51bWJlcn07CiAgICB9CgogICAgcHVzaCBARmlsZW5hbWUsICRDdXJTeXNEVE9iamVjdC0+Rm9ybWF0KAogICAgICAgIEZvcm1hdCA9PiAnJUZfJUgtJU0nLAogICAgKTsKCiAgICAjIHJldHVybiB0aGUgUERGIGRvY3VtZW50CiAgICBteSAkUERGU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpLT5Eb2N1bWVudE91dHB1dCgpOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIEZpbGVuYW1lICAgID0+IGpvaW4oICdfJywgQEZpbGVuYW1lICkgLiAnLnBkZicsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICk7Cn0KCiMgc3RhcnQgdGhlIGRvY3VtZW50CnN1YiBfU3RhcnREb2N1bWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSGVhZGVyQXJlYSBIZWFkZXJWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyB0aXRsZSBvZiB0aGUgUERGLURvY3VtZW50CiAgICBteSAkUHJvZHVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUHJvZHVjdCcpOwogICAgbXkgJFRpdGxlID0gc3ByaW50ZiAnJXM6ICVzIyVzJywgJFByb2R1Y3QsICRQYXJhbXtIZWFkZXJBcmVhfSwgJFBhcmFte0hlYWRlclZhbHVlfTsKCiAgICAjIGNyZWF0ZSBuZXcgUERGIGRvY3VtZW50CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyktPkRvY3VtZW50TmV3KAogICAgICAgIFRpdGxlICA9PiAkVGl0bGUsCiAgICAgICAgRW5jb2RlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICApOwoKICAgIHJldHVybiAnJzsKCn0KCiMgb3V0cHV0IHRoZSBoZWFkbGluZSwgY3JlYXRlIGEgbmV3IHBhZ2UKc3ViIF9PdXRwdXRIZWFkbGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSGVhZGVyQXJlYSBIZWFkZXJWYWx1ZSBUaXRsZSBUZW1wbGF0ZVByZWZpeCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJFByaW50ZWRCeSAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgncHJpbnRlZCBieScpOwogICAgbXkgJFRpbWUgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntUaW1lfTsKICAgIG15ICRVc2VyRnVsbE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTmFtZSgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHBhZ2UgY29udHJvbHMgdGhlIFBERi1nZW5lcmF0aW9uCiAgICAjIHBhZ2UgaGVhZGVycyBhbmQgZm9vdGVyCiAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFnZX07CiAgICAkUGFnZS0+e0hlYWRlclJpZ2h0fSA9IHNwcmludGYgJyVzIyVzJywgJFBhcmFte0hlYWRlckFyZWF9LCAkUGFyYW17SGVhZGVyVmFsdWV9OwogICAgJFBhZ2UtPntQYWdlVGV4dH0gICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BhZ2UnKTsKICAgICRQYWdlLT57UGFnZUNvdW50fSAgID0gJFNlbGYtPntQYWdlfS0+e1BhZ2VDb3VudH0gLy8gMTsKCiAgICAjIGNyZWF0ZSBuZXcgUERGIHBhZ2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKS0+UGFnZU5ldygKICAgICAgICAleyRQYWdlfSwKICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYWdlLT57UGFnZUNvdW50fSwKICAgICk7CgogICAgJFNlbGYtPntQYWdlfS0+e1BhZ2VDb3VudH0rKzsKCiAgICAjIGdldCBQREYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0IHRpdGxlCiAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRQYXJhbXtUaXRsZX0sCiAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0ICJwcmludGVkIGJ5IgogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ID0+ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgLiAkVXNlckZ1bGxOYW1lIC4gJyAnCiAgICAgICAgICAgIC4gJFRpbWUsCiAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTQsCiAgICApOwoKICAgIHJldHVybiAnJzsKfQoKIyBhIGhlbHBlciBmb3IgcHJlcGFyaW5nIGEgdGFibGUgcm93IGZvciBQREYgZ2VuZXJhdGlvbgpzdWIgX1ByZXBhcmVBbmRBZGRJbmZvUm93IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUm93U3BlYyBEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkUm93U3BlYywgJERhdGEgKSA9IEBQYXJhbXtxdyhSb3dTcGVjIERhdGEpfTsKCiAgICAjIHNob3J0IG5hbWUsIGp1c3QgZm9yIGNvbnZlbmllbmNlCiAgICBteSAkQXR0cmlidXRlID0gJFJvd1NwZWMtPntBdHRyaWJ1dGV9OwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgc2tpcCBpZiByb3cgaXMgc3dpdGNoZWQgb2ZmIGluIFN5c0NvbmZpZwogICAgcmV0dXJuIGlmICRSb3dTcGVjLT57SXNPcHRpb25hbH0gJiYgISRTZWxmLT57Q29uZmlnfS0+eyRBdHRyaWJ1dGV9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBrZXlzIGFyZSBhbHdheXMgdHJhbnNsYXRhYmxlCiAgICBteSAkS2V5ID0gJFJvd1NwZWMtPntLZXl9IHx8ICRBdHRyaWJ1dGU7CiAgICAkS2V5ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRLZXkpOwoKICAgICMgZGV0ZXJtaW5lIHRoZSB2YWx1ZQogICAgbXkgJFZhbHVlOwogICAgaWYgKCAkUm93U3BlYy0+e1ZhbHVlSXNUaW1lfSApIHsKCiAgICAgICAgIyBmb3JtYXQgdGhlIHRpbWUgdmFsdWUKICAgICAgICAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICdbJSBEYXRhLicgLiAkQXR0cmlidXRlIC4gJyB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdJywKICAgICAgICAgICAgRGF0YSAgICAgPT4gJERhdGEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJvd1NwZWMtPntWYWx1ZUlzVXNlcn0gKSB7CgogICAgICAgICMgZm9ybWF0IHRoZSB1c2VyIGlkCiAgICAgICAgaWYgKCAkRGF0YS0+eyAkQXR0cmlidXRlIC4gJ0lEJyB9ICkgewoKICAgICAgICAgICAgbXkgJFVzZXJGdWxsTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICREYXRhLT57ICRBdHRyaWJ1dGUgLiAnSUQnIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFVzZXJGdWxsTmFtZSkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJGdWxsTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICdJRD0nIC4gJERhdGEtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFJvd1NwZWMtPntWYWx1ZUlzRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93U3BlYy0+e1ZhbHVlfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHRha2UgdmFsdWUgZnJvbSB0aGUgcGFzc2VkIGluIGRhdGEKICAgICAgICAkVmFsdWUgPSAkRGF0YS0+eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgICMgdHJhbnNsYXRlIHRoZSB2YWx1ZQogICAgaWYgKCAkVmFsdWUgJiYgJFJvd1NwZWMtPntWYWx1ZUlzVHJhbnNsYXRhYmxlfSApIHsKICAgICAgICAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFZhbHVlKTsKICAgIH0KCiAgICAjIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBrZXkgYW5kIHZhbHVlCiAgICAkS2V5IC49ICc6JzsKCiAgICAjIHNob3cgcm93CiAgICBwdXNoIEB7ICRSb3dTcGVjLT57VGFibGV9IH0sCiAgICAgICAgewogICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgIH07CgogICAgcmV0dXJuOwp9CgojIGVtaXQgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGFuZ2UKc3ViIF9PdXRwdXRDaGFuZ2VJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2UgUHJpbnRXb3JrT3JkZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGp1c3QgZm9yIGhhdmluZyBzaG9ydGVyIG5hbWVzCiAgICBteSAkQ2hhbmdlID0gJFBhcmFte0NoYW5nZX07CgogICAgIyBmaWxsIHRoZSB0d28gdGFibGVzIG9uIHRvcCwKICAgICMgYm90aCB0YWJsZXMgaGF2ZSB0d28gY29sdW1zOiBLZXkgYW5kIFZhbHVlCiAgICBteSAoIEBUYWJsZUxlZnQsIEBUYWJsZVJpZ2h0ICk7CgogICAgIyBkZXRlcm1pbmUgdmFsdWVzIHRoYXQgY2FuJ3QgZWFzaWx5IGJlIGRldGVybWluZWQgaW4gX1ByZXBhcmVBbmRBZGRJbmZvUm93KCkKICAgIG15ICVDb21wbGljYXRlZFZhbHVlOwoKICAgICMgVmFsdWVzIGZvciBDQUIKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDQUJBZ2VudHMgQ0FCQ3VzdG9tZXJzKSkgewogICAgICAgIG15IEBMb25nTmFtZXM7CiAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdDQUJBZ2VudHMnICYmICRDaGFuZ2UtPnskQXR0cmlidXRlfSApIHsKCiAgICAgICAgICAgIGZvciBteSAkQ0FCQWdlbnQgKCBAeyAkQ2hhbmdlLT57JEF0dHJpYnV0ZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVXNlckZ1bGxOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRDQUJBZ2VudCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCRVc2VyRnVsbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMb25nTmFtZXMsICRVc2VyRnVsbE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMb25nTmFtZXMsICdJRD0nIC4gJENBQkFnZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnQ0FCQ3VzdG9tZXJzJyAmJiAkQ2hhbmdlLT57JEF0dHJpYnV0ZX0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJENBQkN1c3RvbWVyICggQHsgJENoYW5nZS0+eyRBdHRyaWJ1dGV9IH0gKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgID0+ICRDQUJDdXN0b21lciwKICAgICAgICAgICAgICAgICAgICBDYWNoZSA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVXNlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMb25nTmFtZXMsICRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATG9uZ05hbWVzLCAnSUQ9JyAuICRDQUJDdXN0b21lcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciB0aGUgdmFsdWUKICAgICAgICAkQ29tcGxpY2F0ZWRWYWx1ZXsgJEF0dHJpYnV0ZSAuICdMb25nJyB9ID0gam9pbiggIlxuIiwgQExvbmdOYW1lcyApIHx8ICctJzsKICAgIH0KCiAgICAjIHZhbHVlIGZvciBhdHRhY2htZW50cwogICAgewoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIGdldCBpbmZvIGFib3V0IGZpbGUKICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBhdHRhY2htZW50IGluZm9ybWF0aW9uCiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJEF0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgcHVzaCBAVmFsdWVzLCBzcHJpbnRmICclcyAlcycsCiAgICAgICAgICAgICAgICAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcm93CiAgICAgICAgJENvbXBsaWNhdGVkVmFsdWV7QXR0YWNobWVudHN9ID0gam9pbiggIlxuIiwgQFZhbHVlcyApIHx8ICctJzsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnSVRTTUNoYW5nZScsICdJVFNNV29ya09yZGVyJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZFJvd1NwZWM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNob3cgb25seSBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnSVRTTUNoYW5nZSc7CgogICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAxMDAwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICAjIGZvciBlbXB0eSB2YWx1ZXMKICAgICAgICBpZiAoICEkVmFsdWVTdHJnLT57VmFsdWV9ICkgewogICAgICAgICAgICAkVmFsdWVTdHJnLT57VmFsdWV9ID0gJy0nOwogICAgICAgIH0KCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkUm93U3BlYywgewogICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICAgICA9PiAkTGFiZWwsCiAgICAgICAgICAgIFZhbHVlSXNEeW5hbWljRmllbGQgPT4gMSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgIH07CiAgICB9CgogICAgbXkgQFJvd1NwZWMgPSAoCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlU3RhdGUnKSwKICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1RyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgID0+IFRyYW5zbGF0YWJsZSgnUGxhbm5lZEVmZm9ydCcpLAogICAgICAgICAgICBJc09wdGlvbmFsID0+IDEsCiAgICAgICAgICAgIFRhYmxlICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gVHJhbnNsYXRhYmxlKCdBY2NvdW50ZWRUaW1lJyksCiAgICAgICAgICAgIElzT3B0aW9uYWwgPT4gMSwKICAgICAgICAgICAgVGFibGUgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0NhdGVnb3J5JyksCiAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICAgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1RyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnSW1wYWN0JyksCiAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIFZhbHVlSXNUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1ByaW9yaXR5JyksCiAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1RyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQER5bmFtaWNGaWVsZFJvd1NwZWMsCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZU1hbmFnZXInKSwKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIFZhbHVlSXNVc2VyID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlQnVpbGRlcicpLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1VzZXIgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdDQUJBZ2VudHNMb25nJywKICAgICAgICAgICAgS2V5ICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ0FCIEFnZW50cycpLAogICAgICAgICAgICBUYWJsZSAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQ0FCQ3VzdG9tZXJzTG9uZycsCiAgICAgICAgICAgIEtleSAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0NBQiBDdXN0b21lcnMnKSwKICAgICAgICAgICAgVGFibGUgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0F0dGFjaG1lbnRzJywKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBdHRhY2htZW50cycsCiAgICAgICAgICAgIFRhYmxlICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdSZXF1ZXN0ZWRUaW1lJyksCiAgICAgICAgICAgIElzT3B0aW9uYWwgID0+IDEsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdQbGFubmVkU3RhcnRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdQbGFubmVkRW5kVGltZScpLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlUmlnaHQsCiAgICAgICAgICAgIFZhbHVlSXNUaW1lID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+IFRyYW5zbGF0YWJsZSgnQWN0dWFsU3RhcnRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdBY3R1YWxFbmRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdDcmVhdGVUaW1lJyksCiAgICAgICAgICAgIEtleSAgICAgICAgID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZVRpbWUnKSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ0NoYW5nZWQnLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlUmlnaHQsCiAgICAgICAgICAgIFZhbHVlSXNUaW1lID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRSb3dTcGVjIChAUm93U3BlYykgewoKICAgICAgICAjIGZpbGwgQFRhYmxlTGVmdCBhbmQgQFRhYmxlUmlnaHQKICAgICAgICAkU2VsZi0+X1ByZXBhcmVBbmRBZGRJbmZvUm93KAogICAgICAgICAgICBSb3dTcGVjID0+ICRSb3dTcGVjLAogICAgICAgICAgICBEYXRhICAgID0+IHsgJXskQ2hhbmdlfSwgJUNvbXBsaWNhdGVkVmFsdWUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGNoYW5nZSBpbmZvIHRhYmxlCiAgICBteSAkUm93cyA9IG1heCggc2NhbGFyKEBUYWJsZUxlZnQpLCBzY2FsYXIoQFRhYmxlUmlnaHQpICk7CgogICAgbXkgJVRhYmxlOwogICAgZm9yIG15ICRSb3cgKCAwIC4uICRSb3dzIC0gMSApIHsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdFskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHRbJFJvd10tPntWYWx1ZX07CiAgICB9CgogICAgJFRhYmxle0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxle0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxle0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGV7Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGV7Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxle1R5cGV9ICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGV7Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxle0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZXtCYWNrZ3JvdW5kQ29sb3JFdmVufSA9ICcjREREREREJzsKICAgICRUYWJsZXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGV7UGFkZGluZ1RvcH0gICAgICAgICAgPSAzOwogICAgJFRhYmxle1BhZGRpbmdCb3R0b219ICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgJFNlbGYtPl9QREZPdXRwdXRUYWJsZSgKICAgICAgICBUYWJsZSA9PiBcJVRhYmxlLAogICAgKTsKCiAgICByZXR1cm4gJyc7Cgp9CgojIGVtaXQgaW5mb3JtYXRpb24gYWJvdXQgYSB3b3Jrb3JkZXIKc3ViIF9PdXRwdXRXb3JrT3JkZXJJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2UgV29ya09yZGVyKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkV29ya09yZGVyLCAkQ2hhbmdlICkgPSBAUGFyYW17cXcoV29ya09yZGVyIENoYW5nZSl9OwoKICAgIG15ICRQcmludFdvcmtPcmRlciA9ICRQYXJhbXtQcmludFdvcmtPcmRlcn0gfHwgMDsKCiAgICAjIGZpbGwgdGhlIHR3byB0YWJsZXMgb24gdG9wLAogICAgIyBib3RoIHRhYmxlcyBoYXZlIHR3byBjb2x1bXM6IEtleSBhbmQgVmFsdWUKICAgIG15ICggQFRhYmxlTGVmdCwgQFRhYmxlUmlnaHQgKTsKCiAgICAjIGRldGVybWluZSB2YWx1ZXMgdGhhdCBjYW4ndCBiZSBkZXRlcm1pbmVkIGluIF9QcmVwYXJlQW5kQWRkSW5mb1JvdygpCiAgICBteSAlQ29tcGxpY2F0ZWRWYWx1ZTsKCiAgICAjIHZhbHVlIGZvciBhdHRhY2htZW50cwogICAgewoKICAgICAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50TGlzdCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBmaWxlCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgYXR0YWNobWVudCBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgc3ByaW50ZiAnJXMgJXMnLAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnREYXRhLT57RmlsZXNpemV9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHJvdwogICAgICAgICRDb21wbGljYXRlZFZhbHVle0F0dGFjaG1lbnRzfSA9IGpvaW4oICJcbiIsIEBWYWx1ZXMgKSB8fCAnLSc7CiAgICB9CgogICAgIyBhbGxvdyB3cmFwcGluZyBvZiBsb25nIHdvcmRzIGluIHRoZSBjaGFuZ2UgdGl0bGUKICAgICggJENvbXBsaWNhdGVkVmFsdWV7V3JhcHBhYmxlQ2hhbmdlVGl0bGV9ID0gJENoYW5nZS0+e0NoYW5nZVRpdGxlfSApCiAgICAgICAgPX4gc3sgKCBcU3syNX0gKSB9eyQxIH14bXNnOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdJVFNNQ2hhbmdlJywgJ0lUU01Xb3JrT3JkZXInIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBteSBARHluYW1pY0ZpZWxkUm93U3BlYzsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgc2hvdyBvbmx5IHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyBoZXJlCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdJVFNNV29ya09yZGVyJzsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDEwMDAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGVtcHR5IHZhbHVlcwogICAgICAgIGlmICggISRWYWx1ZVN0cmctPntWYWx1ZX0gKSB7CiAgICAgICAgICAgICRWYWx1ZVN0cmctPntWYWx1ZX0gPSAnLSc7CiAgICAgICAgfQoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRSb3dTcGVjLCB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgPT4gJExhYmVsLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgVmFsdWVJc0R5bmFtaWNGaWVsZCA9PiAxLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgfTsKICAgIH0KCiAgICBteSBAUm93U3BlYyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnV3JhcHBhYmxlQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICBUYWJsZSAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2VOdW1iZXInKSwKICAgICAgICAgICAgVGFibGUgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NoYW5nZU51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXJTdGF0ZScpLAogICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXJUeXBlJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIFZhbHVlSXNUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXJBZ2VudCcpLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1VzZXIgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICA9PiBUcmFuc2xhdGFibGUoJ1BsYW5uZWRFZmZvcnQnKSwKICAgICAgICAgICAgSXNPcHRpb25hbCA9PiAxLAogICAgICAgICAgICBUYWJsZSAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBLZXkgICAgICAgID0+ICdQbGFubmVkRWZmb3J0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICA9PiBUcmFuc2xhdGFibGUoJ0FjY291bnRlZFRpbWUnKSwKICAgICAgICAgICAgSXNPcHRpb25hbCA9PiAxLAogICAgICAgICAgICBUYWJsZSAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBLZXkgICAgICAgID0+ICdBY2NvdW50ZWRUaW1lJywKICAgICAgICB9LAogICAgICAgIEBEeW5hbWljRmllbGRSb3dTcGVjLAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlID0+IFRyYW5zbGF0YWJsZSgnQXR0YWNobWVudHMnKSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBdHRhY2htZW50cycsCiAgICAgICAgICAgIFRhYmxlICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdQbGFubmVkU3RhcnRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiBUcmFuc2xhdGFibGUoJ1BsYW5uZWRFbmRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ1BsYW5uZWRFbmRUaW1lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdBY3R1YWxTdGFydFRpbWUnKSwKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgICAgICBLZXkgICAgICAgICA9PiAnQWN0dWFsU3RhcnRUaW1lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gVHJhbnNsYXRhYmxlKCdBY3R1YWxFbmRUaW1lJyksCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ0FjdHVhbEVuZFRpbWUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiBUcmFuc2xhdGFibGUoJ0NyZWF0ZVRpbWUnKSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlUmlnaHQsCiAgICAgICAgICAgIFZhbHVlSXNUaW1lID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlVGltZScpLAogICAgICAgICAgICBLZXkgICAgICAgICA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBmb3IgbXkgJFJvd1NwZWMgKEBSb3dTcGVjKSB7CgogICAgICAgICMgZmlsbCBAVGFibGVMZWZ0IGFuZCBAVGFibGVSaWdodAogICAgICAgICMgdGhlIHdvcmtvcmRlciBkYXRhIG92ZXJyaWRlcyB0aGUgY2hhbmdlIGRhdGEKICAgICAgICAkU2VsZi0+X1ByZXBhcmVBbmRBZGRJbmZvUm93KAogICAgICAgICAgICBSb3dTcGVjID0+ICRSb3dTcGVjLAogICAgICAgICAgICBEYXRhICAgID0+IHsgJXskQ2hhbmdlfSwgJXskV29ya09yZGVyfSwgJUNvbXBsaWNhdGVkVmFsdWUgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRSb3dzID0gbWF4KCBzY2FsYXIoQFRhYmxlTGVmdCksIHNjYWxhcihAVGFibGVSaWdodCkgKTsKCiAgICBteSAlVGFibGU7CiAgICBmb3IgbXkgJFJvdyAoIDAgLi4gJFJvd3MgLSAxICkgewogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnRbJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHRbJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodFskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGV7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGV7Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGV7Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKCiAgICAkVGFibGV7VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZXtCb3JkZXJ9ICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGV7Rm9udFNpemV9ICAgICAgICAgICAgPSA2OwogICAgJFRhYmxle0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNEREREREQnOwogICAgJFRhYmxle1BhZGRpbmd9ICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGV7UGFkZGluZ0JvdHRvbX0gICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICAkU2VsZi0+X1BERk91dHB1dFRhYmxlKAogICAgICAgIFRhYmxlID0+IFwlVGFibGUsCiAgICApOwoKICAgIHJldHVybiAnJzsKCn0KCiMgb3V0cHV0IGEgYm9keSBvZiB0ZXh0LCBzdWNoIGFzIGEgY2hhbmdlIGRlc2NyaXB0aW9uCnN1YiBfT3V0cHV0TG9uZ1RleHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFByaW50Q2hhbmdlIFByaW50V29ya09yZGVyIFRpdGxlIExvbmdUZXh0KSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgUERGIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIHNvbWUgdmVydGljYWwgd2hpdGVzcGFjZQogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lIGZvciB0aGUgc2VjdGlvbgogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHZlcnRpY2FsIHdoaXRlc3BhY2UgYWZ0ZXIgdGl0bGUKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgdGFibGUgcGFyYW1zIGNvbW1vbiB0byBwcmludGluZyBhIGJvZHkgb2YgdGV4dCwKICAgICMgYWN0dWFsbHkgYSB0YWJsZSBpcyBhIGJpdCBvZiBvdmVya2lsbCBmb3IgYSBzaW5nbGUgdGV4dCwKICAgIG15ICVUYWJsZSA9ICgKICAgICAgICBUeXBlICAgICAgICAgICAgPT4gJ0N1dCcsCiAgICAgICAgQm9yZGVyICAgICAgICAgID0+IDAsCiAgICAgICAgRm9udCAgICAgICAgICAgID0+ICdNb25vc3BhY2VkJywKICAgICAgICBGb250U2l6ZSAgICAgICAgPT4gNywKICAgICAgICBCYWNrZ3JvdW5kQ29sb3IgPT4gJyNEREREREQnLAogICAgICAgIFBhZGRpbmcgICAgICAgICA9PiA0LAogICAgICAgIFBhZGRpbmdUb3AgICAgICA9PiA4LAogICAgICAgIFBhZGRpbmdCb3R0b20gICA9PiA4LAogICAgKTsKCiAgICAjIG91dHB1dCB0YWJsZXMKICAgICRUYWJsZXtDZWxsRGF0YX1bMF1bMF17Q29udGVudH0gPSAkUGFyYW17TG9uZ1RleHR9IHx8ICcnOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICAkU2VsZi0+X1BERk91dHB1dFRhYmxlKAogICAgICAgIFRhYmxlID0+IFwlVGFibGUsCiAgICApOwoKICAgIHJldHVybiAnJzsKCn0KCiMgb3V0cHV0IG92ZXJ2aWV3IG92ZXIgd29ya29yZGVycwpzdWIgX091dHB1dFdvcmtPcmRlck92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggIWRlZmluZWQoICRQYXJhbXtXb3JrT3JkZXJPdmVydmlld30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgV29ya09yZGVyT3ZlcnZpZXchIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IFBERiBvYmplY3QKICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgIyB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGJlZm9yZSBzZWN0aW9uIGhlYWRsaW5lCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBnZXQgbGF5dG91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUgZm9yIHRoZSBzZWN0aW9uCiAgICBteSAkVHJhbnNsYXRpb24gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9OwogICAgbXkgJFNlY3Rpb25UaXRsZSA9CiAgICAgICAgJFRyYW5zbGF0aW9uLT5UcmFuc2xhdGUoICdJVFNNIFdvcmtvcmRlciBPdmVydmlldyAoJXMpJywgc2NhbGFyIEB7ICRQYXJhbXtXb3JrT3JkZXJPdmVydmlld30gfSApOwogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkU2VjdGlvblRpdGxlLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHZlcnRpY2FsIHdoaXRlc3BhY2UgYWZ0ZXIgc2VjdGlvbiBoZWFkbGluZQogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIG92ZXJ2aWV3IHRhYmxlIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSBzaW5nbGUgd29ya29yZGVyLAogICAgIyBwcmludGluZyBhbiBlbXB0eSB0YWJsZSBtaWdodCBjcmVhdGUgaGF2b2MKICAgIGlmICggQHsgJFBhcmFte1dvcmtPcmRlck92ZXJ2aWV3fSB9ICkgewoKICAgICAgICBteSAlVGFibGU7CiAgICAgICAgbXkgJFJvdyA9IDA7CgogICAgICAgICMgYWRkIHRhYmxlIGhlYWRlcgogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bICRSb3crKyBdID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGb250ICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJyMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGb250ICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFRyYW5zbGF0aW9uLT5UcmFuc2xhdGUoJ1RpdGxlJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZvbnQgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVHJhbnNsYXRpb24tPlRyYW5zbGF0ZSgnU3RhdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRm9udCAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRUcmFuc2xhdGlvbi0+VHJhbnNsYXRlKCdQbGFubmVkU3RhcnRUaW1lJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZvbnQgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVHJhbnNsYXRpb24tPlRyYW5zbGF0ZSgnUGxhbm5lZEVuZFRpbWUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRm9udCAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRUcmFuc2xhdGlvbi0+VHJhbnNsYXRlKCdBY3R1YWxTdGFydFRpbWUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRm9udCAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRUcmFuc2xhdGlvbi0+VHJhbnNsYXRlKCdBY3R1YWxFbmRUaW1lJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXIgKCBAeyAkUGFyYW17V29ya09yZGVyT3ZlcnZpZXd9IH0gKSB7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bICRSb3crKyBdID0gWyBtYXAgeyB7IENvbnRlbnQgPT4gJF8gfSB9IEB7JFdvcmtPcmRlcn0gXTsKICAgICAgICB9CgogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSAyOwogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA2MzsKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gMjU7CiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDQwOwogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSA0MDsKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bNV17V2lkdGh9ID0gNDA7CiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzZde1dpZHRofSA9IDQwOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxle0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGV7QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGV7UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxle1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRhYmxlKAogICAgICAgICAgICBUYWJsZSA9PiBcJVRhYmxlLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCiMgb3V0cHV0IGluZm8gYWJvdXQgbGlua2VkIG9iamVjdHMgb2YgYSBjaGFuZ2Ugb3IgYSB3b3Jrb3JkZXIKc3ViIF9PdXRwdXRMaW5rZWRPYmplY3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcmludENoYW5nZSBQcmludFdvcmtPcmRlciBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKCiAgICBteSAlVGFibGU7CiAgICBteSAkUm93ID0gMDsKICAgIGZvciBteSAkTGlua1R5cGVMaW5rRGlyZWN0aW9uICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXsgJFBhcmFte0xpbmtEYXRhfSB9ICkgewoKICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgbXkgQExpbmtEYXRhID0gc3BsaXQgcXs6On0sICRMaW5rVHlwZUxpbmtEaXJlY3Rpb247CiAgICAgICAgbXkgJExpbmtUeXBlTmFtZSA9ICRUeXBlTGlzdHsgJExpbmtEYXRhWzBdIH0tPnsgJExpbmtEYXRhWzFdIC4gJ05hbWUnIH07CiAgICAgICAgJExpbmtUeXBlTmFtZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkTGlua1R5cGVOYW1lKTsKCiAgICAgICAgIyBkZWZpbmUgaGVhZGxpbmUKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExpbmtUeXBlTmFtZSAuICc6JzsKICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAnJzsKCiAgICAgICAgIyBleHRyYWN0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkUGFyYW17TGlua0RhdGF9LT57JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkT2JqZWN0TGlzdC0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSB8fD0gJyc7CiAgICAgICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgewogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUYWJsZXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBnZXQgUERGIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xpbmtlZCBPYmplY3RzJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGV7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGV7Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGV7QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICRUYWJsZXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgJFNlbGYtPl9QREZPdXRwdXRUYWJsZSgKICAgICAgICBUYWJsZSA9PiBcJVRhYmxlLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBvdXRwdXQgYSB0YWJsZSwgYWNjcm9zcyBzZXZlcmFsIHBhZ2VzIGlmIG5lY2Nlc3NhcnkKc3ViIF9QREZPdXRwdXRUYWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17VGFibGV9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFRhYmxlISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGp1c3QgZm9yIGhhdmluZyBzaG9ydGVyIG5hbWVzCiAgICBteSAkVGFibGUgPSAkUGFyYW17VGFibGV9OwogICAgbXkgJFBhZ2UgID0gJFNlbGYtPntQYWdlfTsKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZS0+e1BhZ2VDb3VudH0gLi4gJFBhZ2UtPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgZ2V0IFBERiBvYmplY3QKICAgICAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAleyRUYWJsZX0gPSAkUERGT2JqZWN0LT5UYWJsZSggJXskVGFibGV9ICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlLT57U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJXskUGFnZX0sCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiBqb2luKCAnICcsICRQYWdlLT57UGFnZVRleHR9LCAkUGFnZS0+e1BhZ2VDb3VudH0gKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2UtPntQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57UGFnZX0tPntQYWdlQ291bnR9ID0gJFBhZ2UtPntQYWdlQ291bnR9OwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVBTQS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VQU0EucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VQU0E7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBSZWZyZXNoID0+ICRSZWZyZXNoICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICggc29ydCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiAkQ2hhbmdlSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskQ2hhbmdlSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ092ZXJ2aWV3OiBQU0EnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICAgICAgU29ydEJ5ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICksCiAgICAgICAgT3JkZXJCeSAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVJlc2V0LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVJlc2V0LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlUmVzZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBDaGFuZ2VJRAogICAgbXkgJENoYW5nZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNoYW5nZSBpcyBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRDaGFuZ2VJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlc2V0IGNoYW5nZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Jlc2V0JyApIHsKCiAgICAgICAgIyBnZXQgc3RhdGUgbWFjaGluZSBvYmplY3QKICAgICAgICBteSAkU3RhdGVNYWNoaW5lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKTsKCiAgICAgICAgIyBnZXQgc3RhcnQgc3RhdGUgZm9yIENoYW5nZXMKICAgICAgICBteSAkTmV4dENoYW5nZVN0YXRlSURzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICk7CiAgICAgICAgbXkgJENoYW5nZVN0YXJ0U3RhdGVJRCA9ICROZXh0Q2hhbmdlU3RhdGVJRHMtPlswXTsKCiAgICAgICAgIyBnZXQgc3RhcnQgc3RhdGUgZm9yIFdvcmtPcmRlcnMKICAgICAgICBteSAkTmV4dFdvcmtPcmRlclN0YXRlSURzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICk7CiAgICAgICAgbXkgJFdvcmtPcmRlclN0YXJ0U3RhdGVJRCA9ICROZXh0V29ya09yZGVyU3RhdGVJRHMtPlswXTsKCiAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciB0aGUgb2JqZWN0IHR5cGUgSVRTTVdvcmtPcmRlcgogICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0V29ya09yZGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgV29ya09yZGVycwogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewoKICAgICAgICAgICAgIyBkZWxldGUgZHluYW1pY2ZpZWxkIHZhbHVlcyBmb3IgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3RXb3JrT3JkZXJ9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlZhbHVlRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzZXQgd29ya29yZGVyCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZVdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEICAgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEICAgPT4gJFdvcmtPcmRlclN0YXJ0U3RhdGVJRCwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEJ5cGFzc1N0YXRlTWFjaGluZSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRDb3VsZFVwZGF0ZVdvcmtPcmRlciApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnV2FzIG5vdCBhYmxlIHRvIHJlc2V0IFdvcmtPcmRlciAlcyBvZiBDaGFuZ2UgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlSUQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgdGhlIG9iamVjdCB0eXBlIElUU01DaGFuZ2UKICAgICAgICBteSAkRHluYW1pY0ZpZWxkTGlzdENoYW5nZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBkeW5hbWljZmllbGQgdmFsdWVzIGZvciB0aGlzIGNoYW5nZQogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3RDaGFuZ2V9ICkgewoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZURlbGV0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlc2V0IENoYW5nZQogICAgICAgIG15ICRDb3VsZFVwZGF0ZUNoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICAgID0+ICRDaGFuZ2VTdGFydFN0YXRlSUQsCiAgICAgICAgICAgIEJ5cGFzc1N0YXRlTWFjaGluZSA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgaWYgKCRDb3VsZFVwZGF0ZUNoYW5nZSkgewoKICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIsCiAgICAgICAgICAgICk7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnV2FzIG5vdCBhYmxlIHRvIHJlc2V0IENoYW5nZSAlcyEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgdGhlIGRpYWxvZyB0eXBlLiBBcyBkZWZhdWx0LCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSAyIGJ1dHRvbnM6IFllcyBhbmQgTm8KICAgIG15ICREaWFsb2dUeXBlID0gJ0NvbmZpcm1hdGlvbic7CgogICAgIyBvdXRwdXQgY29udGVudAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZVJlc2V0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBidWlsZCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVEYXRhID0gKAogICAgICAgIEhUTUwgICAgICAgPT4gJE91dHB1dCwKICAgICAgICBEaWFsb2dUeXBlID0+ICREaWFsb2dUeXBlLAogICAgKTsKCiAgICAjIHJldHVybiBKU09OLVN0cmluZyBiZWNhdXNlIG9mIEFKQVgtTW9kZQogICAgbXkgJE91dHB1dEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFwlRGF0YSApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVNjaGVkdWxlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVNjaGVkdWxlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBSZWZyZXNoID0+ICRSZWZyZXNoICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICggc29ydCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJzsnOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiAkQ2hhbmdlSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskQ2hhbmdlSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ092ZXJ2aWV3OiBDaGFuZ2UgU2NoZWR1bGUnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICAgICAgU29ydEJ5ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICksCiAgICAgICAgT3JkZXJCeSAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVNlYXJjaC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLnBtLHYgMS4yIDIwMTgvMTAvMTIgMDk6Mzg6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IGNvbmZpZCBkYXRhCiAgICAkU2VsZi0+e1N0YXJ0SGl0fSA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDEgKTsKICAgICRTZWxmLT57U2VhcmNoTGltaXR9ID0gJFNlbGYtPntDb25maWd9LT57U2VhcmNoTGltaXR9IHx8IDUwMDsKICAgICRTZWxmLT57U29ydEJ5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQ2hhbmdlSUQnOwogICAgJFNlbGYtPntPcmRlckJ5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnRG93bic7CiAgICAkU2VsZi0+e1Byb2ZpbGV9ICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcm9maWxlJyApICAgICAgICB8fCAnJzsKICAgICRTZWxmLT57U2F2ZVByb2ZpbGV9ICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVQcm9maWxlJyApICAgIHx8ICcnOwogICAgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGFrZUxhc3RTZWFyY2gnICkgfHwgJyc7CiAgICAkU2VsZi0+e1NlbGVjdFRlbXBsYXRlfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RUZW1wbGF0ZScgKSB8fCAnJzsKICAgICRTZWxmLT57RXJhc2VUZW1wbGF0ZX0gID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VyYXNlVGVtcGxhdGUnICkgIHx8ICcnOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayByZXF1ZXN0CiAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2hUZW1wbGF0ZScgKSAmJiAkU2VsZi0+e1Byb2ZpbGV9ICkgewoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVNlYXJjaDtTdWJhY3Rpb249U2VhcmNoO1Rha2VMYXN0U2VhcmNoPTE7U2F2ZVByb2ZpbGU9MTtQcm9maWxlPSRTZWxmLT57UHJvZmlsZX0iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuIChjaGFuZ2UgZHluYW1pYyBmaWVsZHMpCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZENoYW5nZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4gKHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcykKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkV29ya09yZGVyfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJFNlYXJjaFByb2ZpbGVPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VhcmNoUHJvZmlsZScpOwoKICAgICMgZ2V0IHNpbmdsZSBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIGxvYWQgcGFyYW1ldGVycyBmcm9tIHNlYXJjaCBwcm9maWxlLAogICAgIyB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgbmV4dCByZXN1bHQgcGFnZSBzaG91bGQgYmUgc2hvd24sIG9yIHdoZW4gdGhlIHJlc3VsdHMgYXJlIHJlb3JkZXJlZAogICAgaWYgKCAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9hZFByb2ZpbGUnICYmICRTZWxmLT57UHJvZmlsZX0gKSB8fCAkU2VsZi0+e1Rha2VMYXN0U2VhcmNofSApIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUdldCgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBzY2FsYXIgc2VhcmNoIHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW1OYW1lICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgIENoYW5nZU51bWJlciBDaGFuZ2VUaXRsZSBEZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uCiAgICAgICAgICAgIENBQkN1c3RvbWVyCiAgICAgICAgICAgIENBQkFnZW50CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlIFdvcmtPcmRlckluc3RydWN0aW9uIFdvcmtPcmRlclJlcG9ydCBSZXN1bHRGb3JtCiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVTZWFyY2hUeXBlIFBsYW5uZWRTdGFydFRpbWVTZWFyY2hUeXBlIFBsYW5uZWRFbmRUaW1lU2VhcmNoVHlwZQogICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVTZWFyY2hUeXBlIEFjdHVhbEVuZFRpbWVTZWFyY2hUeXBlIENyZWF0ZVRpbWVTZWFyY2hUeXBlCiAgICAgICAgICAgIENoYW5nZVRpbWVTZWFyY2hUeXBlCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwoKICAgICAgICAgICAgIyByZW1vdmUgd2hpdGVzcGFjZSBvbiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9fiBzeyBcQSBccysgfXt9eG1zOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGFycmF5IHNlYXJjaCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFNlYXJjaFBhcmFtICgKICAgICAgICAgICAgcXcoIENoYW5nZVN0YXRlSURzCiAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgQ2hhbmdlQnVpbGRlcklEcwogICAgICAgICAgICBQcmlvcml0eUlEcyBDYXRlZ29yeUlEcyBJbXBhY3RJRHMKICAgICAgICAgICAgQ3JlYXRlQnkKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgV29ya09yZGVyVHlwZUlEcyBXb3JrT3JkZXJBZ2VudElEcwogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRTZWFyY2hQYXJhbSApOwogICAgICAgICAgICBpZiAoQEFycmF5KSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFNlYXJjaFBhcmFtfSA9IFxAQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpbWUgcmVsYXRlZCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlICgKICAgICAgICAgICAgcXcoIFJlcXVlc3RlZCBQbGFubmVkU3RhcnQgUGxhbm5lZEVuZCBBY3R1YWxTdGFydCBBY3R1YWxFbmQgQ3JlYXRlIENoYW5nZSApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGdldCB0aW1lIHBhcmFtcyBmaWVsZHMKICAgICAgICAgICAgbXkgQEFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFRpbWVUeXBlIC4gJ1RpbWVTZWFyY2hUeXBlJyApOwogICAgICAgICAgICBpZiAoQEFycmF5KSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJEl0ZW0gLiAnRmllbGQnIH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aW1lIHBhcmFtcyBkZXRhaWxzCiAgICAgICAgICAgIGZvciBteSAkUGFydCAoCiAgICAgICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIFBvaW50Rm9ybWF0IFBvaW50IFBvaW50U3RhcnQKICAgICAgICAgICAgICAgIFN0YXJ0IFN0YXJ0RGF5IFN0YXJ0TW9udGggU3RhcnRZZWFyCiAgICAgICAgICAgICAgICBTdG9wICBTdG9wRGF5ICBTdG9wTW9udGggIFN0b3BZZWFyCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRQYXJhbUtleSA9ICIke1RpbWVUeXBlfVRpbWUke1BhcnR9IjsKICAgICAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbUtleSApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIG9uIHRoZSBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFtVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxBIFxzKyB9e314bXM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtVmFsID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzdG9yZSBpbiAlR2V0UGFyYW0KICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1LZXl9ID0gJFBhcmFtVmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmcm9tIHBhcmFtIG9iamVjdAogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICgKICAgICAgICAgICAgQHsgJFNlbGYtPntEeW5hbWljRmllbGRDaGFuZ2V9IH0sCiAgICAgICAgICAgIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkV29ya09yZGVyfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFJldHVyblByb2ZpbGVTdHJ1Y3R1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgIyBzZXQgdGhlIGNvbXBsZXRlIHZhbHVlIHN0cnVjdHVyZSBpbiBHZXRQYXJhbSB0byBzdG9yZSBpdCBsYXRlciBpbiB0aGUgc2VhcmNoIHByb2ZpbGUKICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJXskRHluYW1pY0ZpZWxkVmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgcmVzdWx0IGZvcm0gZW52CiAgICBpZiAoICEkR2V0UGFyYW17UmVzdWx0Rm9ybX0gKSB7CiAgICAgICAgJEdldFBhcmFte1Jlc3VsdEZvcm19ID0gJyc7CiAgICB9CgogICAgIyBzaG93IHJlc3VsdCBzaXRlIG9yIHBlcmZvcm0gb3RoZXIgYWN0aW9ucwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcgJiYgISRTZWxmLT57RXJhc2VUZW1wbGF0ZX0gKSB7CgogICAgICAgICMgZmlsbCB1cCBwcm9maWxlIG5hbWUgKGUuZy4gd2l0aCBsYXN0LXNlYXJjaCkKICAgICAgICBpZiAoICEkU2VsZi0+e1Byb2ZpbGV9IHx8ICEkU2VsZi0+e1NhdmVQcm9maWxlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntQcm9maWxlfSA9ICdsYXN0LXNlYXJjaCc7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgc2VhcmNoIHByb2ZpbGUgKHVuZGVyIGxhc3Qtc2VhcmNoIG9yIHJlYWwgcHJvZmlsZSBuYW1lKQogICAgICAgICRTZWxmLT57U2F2ZVByb2ZpbGV9ID0gMTsKCiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNlYXJjaCB2YWx1ZXMKICAgICAgICBpZiAoICRTZWxmLT57U2F2ZVByb2ZpbGV9ICYmICRTZWxmLT57UHJvZmlsZX0gKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBvbGQgcHJvZmlsZSBzdHVmZgogICAgICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnSVRTTUNoYW5nZVNlYXJjaCcsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGluc2VydCBuZXcgcHJvZmlsZSBwYXJhbXMKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUdldFBhcmFtICkgewogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnSVRTTUNoYW5nZVNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgQ0FCQWdlbnRzIGFuZCBDQUJDdXN0b21lcnMKICAgICAgICBpZiAoICRHZXRQYXJhbXtDQUJBZ2VudH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDQUJBZ2VudHN9ID0gWyAkR2V0UGFyYW17Q0FCQWdlbnR9IF07CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte0NBQkN1c3RvbWVyfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0NBQkN1c3RvbWVyc30gPSBbICRHZXRQYXJhbXtDQUJDdXN0b21lcn0gXTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlc3Npb24gb2JqZWN0CiAgICAgICAgbXkgJFNlc3Npb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKTsKCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIG15ICRVUkwKICAgICAgICAgICAgPSAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVNlYXJjaDtTdWJhY3Rpb249U2VhcmNoO1Byb2ZpbGU9JFNlbGYtPntQcm9maWxlfTtTb3J0Qnk9JFNlbGYtPntTb3J0Qnl9IgogICAgICAgICAgICAuICI7T3JkZXJCeT0kU2VsZi0+e09yZGVyQnl9O1Rha2VMYXN0U2VhcmNoPTE7U3RhcnRIaXQ9JFNlbGYtPntTdGFydEhpdH0iOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVSTCwKICAgICAgICApOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdENoYW5nZVZpZXcnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVSTCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbmQgY2hlY2sgdGhlIHRpbWUgc2VhcmNoIHBhcmFtZXRlcnMKICAgICAgICBUSU1FVFlQRToKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlICgKICAgICAgICAgICAgcXcoIFJlcXVlc3RlZCBQbGFubmVkU3RhcnQgUGxhbm5lZEVuZCBBY3R1YWxTdGFydCBBY3R1YWxFbmQgQ3JlYXRlIENoYW5nZSApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIHRpbWUgc2VhcmNoIHBhcmFtZXRlcnMgZm9yICRUaW1lVHlwZSBpbnRvICVUaW1lU2VsZWN0aW9uUGFyYW0KICAgICAgICAgICAgbXkgJVRpbWVTZWxlY3Rpb25QYXJhbTsKICAgICAgICAgICAgZm9yIG15ICRQYXJ0ICgKICAgICAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgU2VhcmNoVHlwZQogICAgICAgICAgICAgICAgUG9pbnRGb3JtYXQgUG9pbnQgUG9pbnRTdGFydAogICAgICAgICAgICAgICAgU3RhcnQgU3RhcnREYXkgU3RhcnRNb250aCBTdGFydFllYXIKICAgICAgICAgICAgICAgIFN0b3AgIFN0b3BEYXkgIFN0b3BNb250aCAgU3RvcFllYXIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXskUGFydH0gPSAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdUaW1lJyAuICRQYXJ0IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbm90aGluZyB0byBkbywgd2hlbiBubyB0aW1lIHNlYXJjaCB0eXBlIGhhcyBiZWVuIHNlbGVjdGVkCiAgICAgICAgICAgIG5leHQgVElNRVRZUEUgaWYgISRUaW1lU2VsZWN0aW9uUGFyYW17U2VhcmNoVHlwZX07CgogICAgICAgICAgICBpZiAoICRUaW1lU2VsZWN0aW9uUGFyYW17U2VhcmNoVHlwZX0gZXEgJ1RpbWVTbG90JyApIHsKCiAgICAgICAgICAgICAgICBteSAlU3lzdGVtVGltZTsgICAgIyB1c2VkIGZvciBjaGVja2luZyB0aGUgb3JkZXJpbmcgb2YgdGhlIHR3byB0aW1lcwoKICAgICAgICAgICAgICAgICMgdGhlIGVhcmxpZXIgbGltaXQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1N0YXJ0RGF5fQogICAgICAgICAgICAgICAgICAgICYmICRUaW1lU2VsZWN0aW9uUGFyYW17U3RhcnRNb250aH0KICAgICAgICAgICAgICAgICAgICAmJiAkVGltZVNlbGVjdGlvblBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVOZXdlckRhdGUnIH0gPSBzcHJpbnRmCiAgICAgICAgICAgICAgICAgICAgICAgICclMDRkLSUwMmQtJTAyZCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdGFydERheX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0aGUgbGF0ZXIgbGltaXQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1N0b3BEYXl9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wTW9udGh9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wWWVhcn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVPbGRlckRhdGUnIH0gPSBzcHJpbnRmCiAgICAgICAgICAgICAgICAgICAgICAgICclMDRkLSUwMmQtJTAyZCAyMzo1OTo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17U3RvcFllYXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1N0b3BNb250aH0sCiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17U3RvcERheX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVGltZVNlbGVjdGlvblBhcmFte1NlYXJjaFR5cGV9IGVxICdUaW1lUG9pbnQnICkgewoKICAgICAgICAgICAgICAgICMgcXVlcmllcyByZWxhdGl2ZSB0byBub3cKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fQogICAgICAgICAgICAgICAgICAgICYmICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRTdGFydH0KICAgICAgICAgICAgICAgICAgICAmJiAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50Rm9ybWF0fQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ3VyU3lzRFRPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgICAgICAgICBteSAkU2VhcmNoRFRPYmplY3QgPSAkQ3VyU3lzRFRPYmplY3QtPkNsb25lKCk7CgogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lVW5pdCAgPSB1Y2ZpcnN0ICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRGb3JtYXR9IC4gJ3MnOwogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lVmFsdWUgPSAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGltZVVuaXQgZXEgJ1dlZWtzJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVVbml0ICA9ICdEYXlzJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVWYWx1ZSA9ICRUaW1lVmFsdWUgKiA3OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50U3RhcnR9IGVxICdCZWZvcmUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VhcmNoRFRPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lVW5pdCA9PiAkVGltZVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVGltZU5ld2VyRGF0ZScgfSA9ICRDdXJTeXNEVE9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVGltZU9sZGVyRGF0ZScgfSA9ICRTZWFyY2hEVE9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWFyY2hEVE9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVVuaXQgPT4gJFRpbWVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVOZXdlckRhdGUnIH0gPSAkU2VhcmNoRFRPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVPbGRlckRhdGUnIH0gPSAkQ3VyU3lzRFRPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgdW5rbm93biBzZWFyY2ggdHlwZXMgYXJlIHNpbXBseSBpZ25vcmVkCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2VhcmNoIGZvciBzdWJzdHJpbmdzIGJ5IGRlZmF1bHQKICAgICAgICBmb3IgbXkgJEZpZWxkICgKICAgICAgICAgICAgcXcoQ2hhbmdlVGl0bGUgV29ya09yZGVyVGl0bGUgRGVzY3JpcHRpb24gSnVzdGlmaWNhdGlvbgogICAgICAgICAgICBXb3JrT3JkZXJJbnN0cnVjdGlvbiBXb3JrT3JkZXJSZXBvcnQKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXskRmllbGR9ICkgJiYgJEdldFBhcmFteyRGaWVsZH0gbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEZpZWxkfSA9ICIqJEdldFBhcmFteyRGaWVsZH0qIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkeW5hbWljIGZpZWxkcyBzZWFyY2ggcGFyYW1ldGVycyBmb3IgdGlja2V0IHNlYXJjaAogICAgICAgIG15ICVEeW5hbWljRmllbGRTZWFyY2hQYXJhbWV0ZXJzOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoCiAgICAgICAgICAgIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkQ2hhbmdlfSB9LAogICAgICAgICAgICBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZFdvcmtPcmRlcn0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggZmllbGQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgcHJvZmlsZQogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtZXRlciA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFBhcmFtZXRlckJ1aWxkKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBzZWFyY2ggcGFyYW1ldGVyCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlYXJjaFBhcmFtZXRlciApIHsKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkU2VhcmNoUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIHBlcmZvcm0gY2hhbmdlIHNlYXJjaAogICAgICAgIG15ICRWaWV3YWJsZUNoYW5nZUlEcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFsgJFNlbGYtPntTb3J0Qnl9IF0sCiAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAkU2VsZi0+e09yZGVyQnl9IF0sCiAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlbGYtPntTZWFyY2hMaW1pdH0sCiAgICAgICAgICAgIE1pcnJvckRCICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnMsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBvYmplY3QKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgQ1NWIG91dHB1dAogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdDU1YnCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnRXhjZWwnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBDU1ZIZWFkOwogICAgICAgICAgICBteSBAQ1NWRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IGFsbCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgdGhhdCBhcmUgY29uZmlndXJlZCBmb3IgdGhlIHNlYXJjaCBjc3Ygb3V0cHV0CiAgICAgICAgICAgIG15ICVGaWVsZEZpbHRlcjsKICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hDU1ZEYXRhfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgPX4gbXsgXEEgRHluYW1pY0ZpZWxkXyAoIFthLXpBLVpcZF0rICkgXHogfXhtcyApIHsKICAgICAgICAgICAgICAgICAgICAkRmllbGRGaWx0ZXJ7JDF9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNQ2hhbmdlIHdpdGggdGhlIHNlbGVjdGVkIGZpZWxkIGZpbHRlcgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkc0lUU01DaGFuZ2UgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+IFwlRmllbGRGaWx0ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBJRDoKICAgICAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoIEB7JFZpZXdhYmxlQ2hhbmdlSURzfSApIHsKCiAgICAgICAgICAgICAgICAjIHRvIHN0b3JlIGRhdGEgb2Ygc3ViLWVsZW1lbnRzCiAgICAgICAgICAgICAgICBteSAlU3ViRWxlbWVudERhdGE7CgogICAgICAgICAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJENoYW5nZTsKCiAgICAgICAgICAgICAgICAjIHRvIHN0b3JlIGFsbCBkYXRhCiAgICAgICAgICAgICAgICBteSAlSW5mbyA9ICV7JENoYW5nZX07CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGZvciBuZWVkZWQgdXNlciB0eXBlcwogICAgICAgICAgICAgICAgVVNFUlRZUEU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJUeXBlIChxdyhDaGFuZ2VCdWlsZGVyIENoYW5nZU1hbmFnZXIgV29ya09yZGVyQWdlbnQpKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgVXNlclR5cGUgYXR0cmlidXRlIGV4aXN0cyBlaXRoZXIgaW4gY2hhbmdlIG9yIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGFuZ2UtPnsgJFVzZXJUeXBlIC4gJ0lEJyB9ICYmICEkSW5mb3sgJFVzZXJUeXBlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJUWVBFOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57ICRVc2VyVHlwZSAuICdJRCcgfSB8fCAkSW5mb3sgJFVzZXJUeXBlIC4gJ0lEJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCB1c2VyIGZ1bGwgbmFtZQogICAgICAgICAgICAgICAgICAgICRJbmZveyRVc2VyVHlwZX0gPSAkVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgdGhlIGxpbmtlZCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0ge307CgogICAgICAgICAgICAgICAgbXkgQFdvcmtPcmRlcklEczsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZSBjb21iaW5lZCBsaW5rZWQgc2VydmljZXMgZGF0YSBmcm9tIGFsbCB3b3Jrb3JkZXJzIG9mIHRoaXMgY2hhbmdlCiAgICAgICAgICAgICAgICBAV29ya09yZGVySURzID0gQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZSBjb21iaW5lZCBsaW5rZWQgc2VydmljZXMgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoQFdvcmtPcmRlcklEcykgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyBvZiB0aGlzIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzaG93IGxpbmtlZCBzZXJ2aWNlcyBvZiB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1QgaWYgJE9iamVjdCBuZSAnU2VydmljZSc7CgogICAgICAgICAgICAgICAgICAgICAgICBMSU5LVFlQRToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUSU9OOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+eyREaXJlY3Rpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29tYmluZSB0aGUgbGlua2VkIG9iamVjdCBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0V2l0aERhdGEtPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+eyREaXJlY3Rpb259LT57JElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdW5pcXVlIHNlcnZpY2UgaWRzCiAgICAgICAgICAgICAgICBteSAlVW5pcXVlU2VydmljZUlEczsKICAgICAgICAgICAgICAgIG15ICRTZXJ2aWNlc1JlZiA9ICRMaW5rTGlzdFdpdGhEYXRhLT57U2VydmljZX0gfHwge307CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7JFNlcnZpY2VzUmVmfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRTZXJ2aWNlc1JlZi0+eyRMaW5rVHlwZX07CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkU2VydmljZXNSZWYtPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbGxlY3QgdW5pcXVlIHNlcnZpY2UgaWRzCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVuaXF1ZVNlcnZpY2VJRHN7JFNlcnZpY2VJRH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgZGF0YSBmb3IgZWFjaCBzZXJ2aWNlCiAgICAgICAgICAgICAgICBteSBAU2VydmljZXNEYXRhOwogICAgICAgICAgICAgICAgU0VSVklDRUlEOgogICAgICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVVuaXF1ZVNlcnZpY2VJRHMgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgc3RvcmUgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VydmljZXNEYXRhLCBcJVNlcnZpY2VEYXRhOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc29ydCBzZXJ2aWNlcyBkYXRhIGJ5IHNlcnZpY2UgbmFtZQogICAgICAgICAgICAgICAgQFNlcnZpY2VzRGF0YSA9IHNvcnQgeyAkYS0+e05hbWV9IGNtcCAkYi0+e05hbWV9IH0gQFNlcnZpY2VzRGF0YTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIHNlcnZpY2VzIGRhdGEKICAgICAgICAgICAgICAgIGlmICggc2NhbGFyIEBTZXJ2aWNlc0RhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgU0VSVklDRToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2UgKEBTZXJ2aWNlc0RhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2UtPntOYW1lU2hvcnR9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRJbmZve1NlcnZpY2VzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJbmZve1NlcnZpY2VzfSAuPSAnICcgLiAkU2VydmljZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEluZm97U2VydmljZXN9ID0gJFNlcnZpY2VOYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNzdiBxdW90ZQogICAgICAgICAgICAgICAgaWYgKCAhQENTVkhlYWQgKSB7CiAgICAgICAgICAgICAgICAgICAgQENTVkhlYWQgPSBAeyAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hDU1ZEYXRhfSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBEYXRhOwogICAgICAgICAgICAgICAgZm9yIG15ICRIZWFkZXIgKEBDU1ZIZWFkKSB7CgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGNvbHVtbiBpcyBhIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoICRIZWFkZXIgPX4gbXsgXEEgRHluYW1pY0ZpZWxkXyAoIFthLXpBLVpcZF0rICkgXHogfXhtcyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICAgICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkc0lUU01DaGFuZ2V9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBuZSAkRHluYW1pY0ZpZWxkTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEluZm97JEhlYWRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEluZm97JEhlYWRlcn0gPSAkVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBEWU5BTUlDRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQERhdGEsICRJbmZveyRIZWFkZXJ9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQENTVkRhdGEsIFxARGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjc3YgcXVvdGUKICAgICAgICAgICAgIyB0cmFuc2xhdGUgbm9uIGV4aXN0aW5nIGhlYWRlciBtYXkgcmVzdWx0IGluIGEgZ2FyYmFnZSBmaWxlCiAgICAgICAgICAgIGlmICggIUBDU1ZIZWFkICkgewogICAgICAgICAgICAgICAgQENTVkhlYWQgPSBAeyAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hDU1ZEYXRhfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSBoZWFkZXJzCiAgICAgICAgICAgIGZvciBteSAkSGVhZGVyIChAQ1NWSGVhZCkgewoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBDaGFuZ2VOdW1iZXIgaGVhZGVyIHdpdGggdGhlIGN1cnJlbnQgQ2hhbmdlSG9vayBmcm9tIGNvbmZpZwogICAgICAgICAgICAgICAgaWYgKCAkSGVhZGVyIGVxICdDaGFuZ2VOdW1iZXInICkgewogICAgICAgICAgICAgICAgICAgICRIZWFkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6Okhvb2snKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIZWFkZXIgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEhlYWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDU1ZPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDU1YnKTsKICAgICAgICAgICAgbXkgJEN1clN5c0RUT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdDU1YnICkgewoKICAgICAgICAgICAgICAgICMgQXNzZW1ibGUgQ1NWIGRhdGEuCiAgICAgICAgICAgICAgICBteSAkQ1NWID0gJENTVk9iamVjdC0+QXJyYXkyQ1NWKAogICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICA9PiBcQENTVkhlYWQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgID0+IFxAQ1NWRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZXBhcmF0b3IgPT4gJFNlbGYtPntVc2VyQ1NWU2VwYXJhdG9yfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBSZXR1cm4gQ1NWIHRvIGRvd25sb2FkLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoYW5nZV9zZWFyY2hfJXMuY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgJEN1clN5c0RUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVGXyVILSVNJywKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L2NzdjsgY2hhcnNldD0iIC4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ1NWLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnRXhjZWwnICkgewoKICAgICAgICAgICAgICAgICMgQXNzZW1ibGUgRXhjZWwgZGF0YS4KICAgICAgICAgICAgICAgIG15ICRFeGNlbCA9ICRDU1ZPYmplY3QtPkFycmF5MkNTVigKICAgICAgICAgICAgICAgICAgICBIZWFkICAgICAgPT4gXEBDU1ZIZWFkLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICA9PiBcQENTVkRhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VwYXJhdG9yID0+ICRTZWxmLT57VXNlckNTVlNlcGFyYXRvcn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUmV0dXJuIEV4Y2VsIHRvIGRvd25sb2FkLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoYW5nZV9zZWFyY2hfJXMueGxzeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJTeXNEVE9iamVjdC0+Rm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclRl8lSC0lTScsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7IGNoYXJzZXQ9IgogICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRXhjZWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdQcmludCcgKSB7CgogICAgICAgICAgICAjIHRvIHN0b3JlIGFsbCBkYXRhCiAgICAgICAgICAgIG15ICVJbmZvOwoKICAgICAgICAgICAgIyBnZXQgcGRmIG9iamVjdAogICAgICAgICAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICAgICAgICAgIyB0byBzZW5kIGRhdGEgdG8gdGhlIFBERiBvdXRwdXQKICAgICAgICAgICAgbXkgQFBERkRhdGE7CiAgICAgICAgICAgIElEOgogICAgICAgICAgICBmb3IgbXkgJENoYW5nZUlEICggQHskVmlld2FibGVDaGFuZ2VJRHN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRDaGFuZ2U7CgogICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGRhdGEsCiAgICAgICAgICAgICAgICAlSW5mbyA9ICV7JENoYW5nZX07CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGZvciBuZWVkZWQgdXNlciB0eXBlcwogICAgICAgICAgICAgICAgVVNFUlRZUEU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJUeXBlIChxdyhDaGFuZ2VCdWlsZGVyIENoYW5nZU1hbmFnZXIgV29ya09yZGVyQWdlbnQpKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgVXNlclR5cGUgYXR0cmlidXRlIGV4aXN0cyBlaXRoZXIgaW4gY2hhbmdlIG9yIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGFuZ2UtPnsgJFVzZXJUeXBlIC4gJ0lEJyB9ICYmICEkSW5mb3sgJFVzZXJUeXBlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJUWVBFOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZS0+eyAkVXNlclR5cGUgLiAnSUQnIH0gfHwgJEluZm97ICRVc2VyVHlwZSAuICdJRCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgdXNlciBmdWxsIG5hbWUKICAgICAgICAgICAgICAgICAgICAkSW5mb3skVXNlclR5cGV9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJ1slIERhdGEuQ2hhbmdlVGl0bGUgfCB0cnVuY2F0ZSgzMCkgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJUluZm8sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRQbGFubmVkU3RhcnQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJ1slIERhdGEuUGxhbm5lZFN0YXJ0VGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJUluZm8sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRQbGFubmVkRW5kID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICdbJSBEYXRhLlBsYW5uZWRFbmRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwlSW5mbywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgQFBERlJvdzsKICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgICRJbmZve0NoYW5nZU51bWJlcn07CiAgICAgICAgICAgICAgICBwdXNoIEBQREZSb3csICAkQ2hhbmdlVGl0bGU7CiAgICAgICAgICAgICAgICBwdXNoIEBQREZSb3csICAkSW5mb3tDaGFuZ2VCdWlsZGVyfTsKICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgICRJbmZve1dvcmtPcmRlckNvdW50fTsKICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgICRJbmZve0NoYW5nZVN0YXRlfTsKICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgICRJbmZve1ByaW9yaXR5fTsKICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgICRQbGFubmVkU3RhcnQ7CiAgICAgICAgICAgICAgICBwdXNoIEBQREZSb3csICAkUGxhbm5lZEVuZDsKICAgICAgICAgICAgICAgIHB1c2ggQFBERkRhdGEsIFxAUERGUm93OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFBERiBPdXRwdXQKICAgICAgICAgICAgbXkgJFRpdGxlICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2hhbmdlIFNlYXJjaCcpOwogICAgICAgICAgICBteSAkUHJpbnRlZEJ5ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5Jyk7CiAgICAgICAgICAgIG15ICRQYWdlICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1BhZ2UnKTsKICAgICAgICAgICAgbXkgJFRpbWUgICAgICA9ICRMYXlvdXRPYmplY3QtPntUaW1lfTsKCiAgICAgICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgICAgIG15ICRNYXhQYWdlcyA9ICRDb25maWdPYmplY3QtPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgICAgICBpZiAoICEkTWF4UGFnZXMgfHwgJE1heFBhZ2VzIDwgMSB8fCAkTWF4UGFnZXMgPiAxMDAwICkgewogICAgICAgICAgICAgICAgJE1heFBhZ2VzID0gMTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSB0aGUgaGVhZGVyCiAgICAgICAgICAgIG15ICRDZWxsRGF0YTsKCiAgICAgICAgICAgICMgb3V0cHV0ICdObyB0aWNrZXQgZGF0YSBmb3VuZCcsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmIChAUERGRGF0YSkgewogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlswXS0+e0NvbnRlbnR9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpIb29rJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzBdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzFdLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2hhbmdlVGl0bGUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMV0tPntGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bMl0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDaGFuZ2VCdWlsZGVyJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzJdLT57Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzNdLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnV29ya09yZGVycycpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlszXS0+e0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls0XS0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZVN0YXRlJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzRdLT57Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzVdLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJpb3JpdHknKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNV0tPntGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNl0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQbGFubmVkU3RhcnRUaW1lJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzZdLT57Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzddLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGxhbm5lZEVuZFRpbWUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bN10tPntGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSB0aGUgY29udGVudCBhcnJheQogICAgICAgICAgICAgICAgbXkgJENvdW50ZXJSb3cgPSAxOwogICAgICAgICAgICAgICAgZm9yIG15ICRSb3cgKEBQREZEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkQ29udGVudCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WyRDb3VudGVyUm93XS0+WyRDb3VudGVyQ29sdW1uXS0+e0NvbnRlbnR9ID0gJENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudGVyQ29sdW1uKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDb3VudGVyUm93Kys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlswXS0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIHRpY2tldCBkYXRhIGZvdW5kLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHBhZ2UgcGFyYW1zCiAgICAgICAgICAgIG15ICVQYWdlUGFyYW07CiAgICAgICAgICAgICRQYWdlUGFyYW17UGFnZU9yaWVudGF0aW9ufSA9ICdsYW5kc2NhcGUnOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpblRvcH0gICAgICAgPSAzMDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtNYXJnaW5SaWdodH0gICAgID0gNDA7CiAgICAgICAgICAgICRQYWdlUGFyYW17TWFyZ2luQm90dG9tfSAgICA9IDQwOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpbkxlZnR9ICAgICAgPSA0MDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtIZWFkZXJSaWdodH0gICAgID0gJFRpdGxlOwoKICAgICAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAgICAgbXkgJVRhYmxlUGFyYW07CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfSAgICAgICAgICAgID0gJENlbGxEYXRhOwogICAgICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICA9IDY7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0RERERERCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgPSAzOwogICAgICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgICAgICRQREZPYmplY3QtPkRvY3VtZW50TmV3KAogICAgICAgICAgICAgICAgVGl0bGUgID0+ICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgICAgIEVuY29kZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdGFydCB0YWJsZSBvdXRwdXQKICAgICAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlUGFyYW0sCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZSAuICcgMScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHRpdGxlCiAgICAgICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkVGl0bGUsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiAxMywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgInByaW50ZWQgYnkiCiAgICAgICAgICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57VXNlckZ1bGxuYW1lfSAuICcgKCcKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgICAgICAgICAuICRUaW1lLAogICAgICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC0xNCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFBBR0U6CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAyIC4uICRNYXhQYWdlcyApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3IgYW5vdGhlciBwYWdlCiAgICAgICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICAgICAlUGFnZVBhcmFtLCBGb290ZXJSaWdodCA9PiAkUGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQREZTdHJpbmcgPSAkUERGT2JqZWN0LT5Eb2N1bWVudE91dHB1dCgpOwoKICAgICAgICAgICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgICAgICAgICBteSAkQ3VyU3lzRFRPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICdjaGFuZ2Vfc2VhcmNoXyVzLnBkZicsCiAgICAgICAgICAgICAgICAgICAgJEN1clN5c0RUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAnJUZfJUgtJU0nLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICk7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc3RhcnQgaHRtbCBwYWdlCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICAgICAgICAgJE91dHB1dCA9ICcnOwoKICAgICAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKICAgICAgICAgICAgJFNlbGYtPntWaWV3fSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICAgICAgICAgICMgc2hvdyBjaGFuZ2VzCiAgICAgICAgICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAgICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntTb3J0Qnl9ICkKICAgICAgICAgICAgICAgIC4gJztPcmRlckJ5PScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e09yZGVyQnl9ICkKICAgICAgICAgICAgICAgIC4gJztQcm9maWxlPScgLiAkU2VsZi0+e1Byb2ZpbGV9IC4gJztUYWtlTGFzdFNlYXJjaD0xO1N1YmFjdGlvbj1TZWFyY2gnCiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAgICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgICAgICAgICAgLiAnO1Byb2ZpbGU9JyAuICRTZWxmLT57UHJvZmlsZX0gLiAnO1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaCcKICAgICAgICAgICAgICAgIC4gJzsnOwogICAgICAgICAgICBteSAkTGlua0ZpbHRlciA9ICdUYWtlTGFzdFNlYXJjaD0xO1N1YmFjdGlvbj1TZWFyY2g7UHJvZmlsZT0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntQcm9maWxlfSApCiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtCYWNrID0gJ1N1YmFjdGlvbj1Mb2FkUHJvZmlsZTtQcm9maWxlPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1Byb2ZpbGV9ICkKICAgICAgICAgICAgICAgIC4gJztUYWtlTGFzdFNlYXJjaD0xOyc7CgogICAgICAgICAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgIG15IEBTaG93Q29sdW1uczsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICAgICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUxpc3RTaG93KAogICAgICAgICAgICAgICAgQ2hhbmdlSURzICAgID0+ICRWaWV3YWJsZUNoYW5nZUlEcywKICAgICAgICAgICAgICAgIFRvdGFsICAgICAgICA9PiBzY2FsYXIgQHskVmlld2FibGVDaGFuZ2VJRHN9LAogICAgICAgICAgICAgICAgVmlldyAgICAgICAgID0+ICRTZWxmLT57Vmlld30sCiAgICAgICAgICAgICAgICBFbnYgICAgICAgICAgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBMaW5rUGFnZSAgICAgPT4gJExpbmtQYWdlLAogICAgICAgICAgICAgICAgTGlua1NvcnQgICAgID0+ICRMaW5rU29ydCwKICAgICAgICAgICAgICAgIExpbmtGaWx0ZXIgICA9PiAkTGlua0ZpbHRlciwKICAgICAgICAgICAgICAgIExpbmtCYWNrICAgICA9PiAkTGlua0JhY2ssCiAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIFRpdGxlTmFtZSAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBTZWFyY2ggUmVzdWx0JyksCiAgICAgICAgICAgICAgICBTaG93Q29sdW1ucyAgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICAgICAgICAgIFNvcnRCeSAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U29ydEJ5fSApLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntPcmRlckJ5fSApLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVVJMID0+ICdBY3Rpb249JyAuICRTZWxmLT57QWN0aW9ufSAuICc7JyAuICRMaW5rUGFnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgZm9vdGVyCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFByb2ZpbGVEZWxldGUnICkgewogICAgICAgIG15ICRQcm9maWxlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2ZpbGUnICk7CgogICAgICAgICMgcmVtb3ZlIG9sZCBwcm9maWxlIHN0dWZmCiAgICAgICAgJFNlYXJjaFByb2ZpbGVPYmplY3QtPlNlYXJjaFByb2ZpbGVEZWxldGUoCiAgICAgICAgICAgIEJhc2UgICAgICA9PiAnSVRTTUNoYW5nZVNlYXJjaCcsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkUHJvZmlsZSwKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IDEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYJyApIHsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fTWFza0Zvcm0oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VTZWFyY2gnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScKICAgICAgICApOwoKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50U2VhcmNoLk9wZW4nLAogICAgICAgIFZhbHVlID0+IDEsCiAgICApOwoKICAgICMgVGhlcmUgd2FzIG5vICdTdWJBY3Rpb24nLCBvciB0aGVyZSB3ZXJlIHZhbGlkYXRpb24gZXJyb3JzLCBvciBhbiB1c2VyIG9yIGN1c3RvbWVyIHdhcyBzZWFyY2hlZAogICAgIyBnZW5lcmF0ZSBzZWFyY2ggbWFzawogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VTZWFyY2gnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfTWFza0Zvcm0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkUHJvZmlsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcm9maWxlJyApIHx8ICcnOwogICAgbXkgJEVtcHR5U2VhcmNoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtcHR5U2VhcmNoJyApOwogICAgaWYgKCAhJFByb2ZpbGUgKSB7CiAgICAgICAgJEVtcHR5U2VhcmNoID0gMTsKICAgIH0KCiAgICAjIGdldCBzZWFyY2ggcHJvZmlsZSBvYmplY3QKICAgIG15ICRTZWFyY2hQcm9maWxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlYXJjaFByb2ZpbGUnKTsKCiAgICBteSAlR2V0UGFyYW0gPSAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUdldCgKICAgICAgICBCYXNlICAgICAgPT4gJ0lUU01DaGFuZ2VTZWFyY2gnLAogICAgICAgIE5hbWUgICAgICA9PiAkUHJvZmlsZSwKICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgKTsKCiAgICAjIGFsbG93IHByb2ZpbGUgb3ZlcndyaXRlIHRoZSBjb250ZW50cyBvZiAlUGFyYW0KICAgICVQYXJhbSA9ICgKICAgICAgICAlUGFyYW0sCiAgICAgICAgJUdldFBhcmFtLAogICAgKTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgc2V0IHVzZXIgZnJpZW5kbHkgQ0FCQWdlbnQgZmllbGQKICAgIGlmICggJFBhcmFte0NBQkFnZW50fSAmJiAkUGFyYW17Q0FCQWdlbnR9IG5lICcnICkgewoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17Q0FCQWdlbnR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHVzZXIgZnJpZW5seSBDQUJBZ2VudCBzdHJpbmcKICAgICAgICBteSAkVXNlclZhbHVlID0gc3ByaW50ZiAnIiVzIiA8JXM+JywKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0sCiAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyRW1haWx9OwoKICAgICAgICAkUGFyYW17Q0FCQWdlbnRTZWFyY2h9ID0gJFVzZXJWYWx1ZTsKICAgIH0KCiAgICAjIHNldCB1c2VyIGZyaWVuZGx5IENBQkN1c3RvbWVyIGZpZWxkCiAgICBpZiAoICRQYXJhbXtDQUJDdXN0b21lcn0gJiYgJFBhcmFte0NBQkN1c3RvbWVyfSBuZSAnJyApIHsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgICAgIG15ICVDdXN0b21lclNlYXJjaExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte0NBQkN1c3RvbWVyfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17Q0FCQ3VzdG9tZXJTZWFyY2h9ID0gJEN1c3RvbWVyU2VhcmNoTGlzdHsgJFBhcmFte0NBQkN1c3RvbWVyfSB9OwogICAgfQoKICAgICMgc2V0IGF0dHJpYnV0ZXMgc3RyaW5nCiAgICBteSBAQXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSBOdW1iZXInKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2UgVGl0bGUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXb3JrIE9yZGVyIFRpdGxlJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDQUJBZ2VudCcsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ0FCIEFnZW50JyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDQUJDdXN0b21lcicsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ0FCIEN1c3RvbWVyJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICcnLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnLScsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIERlc2NyaXB0aW9uJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2UgSnVzdGlmaWNhdGlvbicpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnV29ya09yZGVySW5zdHJ1Y3Rpb24nLAogICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ1dvcmtPcmRlciBJbnN0cnVjdGlvbicpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnV29ya09yZGVyUmVwb3J0JywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXIgUmVwb3J0JyksCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZFNlcGFyYXRvciA9IDE7CiAgICBteSAkTGFzdE9iamVjdFR5cGUgICAgICAgID0gJyc7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyBzZWFyY2ggb3B0aW9ucyBmb3IgYXR0cmlidXRlIHNlbGVjdAogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICgKICAgICAgICBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZENoYW5nZX0gfSwKICAgICAgICBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZFdvcmtPcmRlcn0gfQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJyc7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJExhc3RPYmplY3RUeXBlIGVxICdJVFNNQ2hhbmdlJwogICAgICAgICAgICAmJiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0lUU01Xb3JrT3JkZXInCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICREeW5hbWljRmllbGRTZXBhcmF0b3IgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBsYXN0IG9iamVjdCB0eXBlIChuZWVkZWQgZm9yIHNlcGFyYXRvciBiZXR3ZWVuIGNoYW5nZSBhbmQgd29ya29yZGVyIGZpZWxkcykKICAgICAgICAkTGFzdE9iamVjdFR5cGUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX07CgogICAgICAgICMgY3JlYXRlIGEgc2VwYXJhdG9yIGZvciBkeW5hbWljIGZpZWxkcyBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCREeW5hbWljRmllbGRTZXBhcmF0b3IpIHsKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICctJywKICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRTZXBhcmF0b3IgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICMgdHJhbnNsYXRlIHRoZSBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgbXkgJFRyYW5zbGF0ZWREeW5hbWljRmllbGRMYWJlbCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSwKICAgICAgICApOwoKICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIHN1ZmZpeAogICAgICAgICAgICBteSAkVHJhbnNsYXRlZFN1ZmZpeCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlLT57TGFiZWxTdWZmaXh9LAogICAgICAgICAgICApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRUcmFuc2xhdGVkU3VmZml4KSB7CiAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFN1ZmZpeCA9ICcgKCcgLiAkVHJhbnNsYXRlZFN1ZmZpeCAuICcpJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnU2VhcmNoX0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVHJhbnNsYXRlZER5bmFtaWNGaWVsZExhYmVsIC4gJFRyYW5zbGF0ZWRTdWZmaXgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhIHNlcGFyYXRvciBpZiBhIGR5bmFtaWMgZmllbGQgYXR0cmlidXRlIHdhcyBwdXNoZWQKICAgIGlmICggISREeW5hbWljRmllbGRTZXBhcmF0b3IgKSB7CiAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICctJywKICAgICAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBIVE1MIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICgKICAgICAgICBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZENoYW5nZX0gfSwKICAgICAgICBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZFdvcmtPcmRlcn0gfQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgIG15ICRTZWFyY2hGaWVsZFByZWZlcmVuY2VzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkUHJlZmVyZW5jZXMoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0FycmF5UmVmV2l0aERhdGEoJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMpOwoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT3ZlcnJpZGVQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJFByZWZlcmVuY2UtPntUeXBlfSB9CiAgICAgICAgICAgICAgICA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlID0+CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RGVmYXVsdHN9LT57RHluYW1pY0ZpZWxkfQogICAgICAgICAgICAgICAgICAgIC0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRQcmVmZXJlbmNlLT57VHlwZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBwdXNoIEBBdHRyaWJ1dGVzLCAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSBQcmlvcml0eScpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSW1wYWN0SURzJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2UgSW1wYWN0JyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDYXRlZ29yeUlEcycsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIENhdGVnb3J5JyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFuZ2VTdGF0ZUlEcycsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIFN0YXRlJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFuZ2VNYW5hZ2VySURzJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2UgTWFuYWdlcicpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ2hhbmdlQnVpbGRlcklEcycsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIEJ1aWxkZXInKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NyZWF0ZUJ5JywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdDcmVhdGVkIEJ5JyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEcycsCiAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnV29ya09yZGVyIFN0YXRlJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdXb3JrT3JkZXJUeXBlSURzJywKICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXIgVHlwZScpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnV29ya09yZGVyQWdlbnRJRHMnLAogICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ1dvcmtPcmRlciBBZ2VudCcpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAnJywKICAgICAgICAgICAgVmFsdWUgICAgPT4gJy0nLAogICAgICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc2V0IHRpbWUgYXR0cmlidXRlcwogICAgbXkgQFRpbWVUeXBlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFByZWZpeCA9PiAnUmVxdWVzdGVkJywKICAgICAgICAgICAgVGl0bGUgID0+IFRyYW5zbGF0YWJsZSgnUmVxdWVzdGVkIERhdGUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgUHJlZml4ID0+ICdQbGFubmVkU3RhcnQnLAogICAgICAgICAgICBUaXRsZSAgPT4gVHJhbnNsYXRhYmxlKCdQbGFubmVkIFN0YXJ0IFRpbWUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgUHJlZml4ID0+ICdQbGFubmVkRW5kJywKICAgICAgICAgICAgVGl0bGUgID0+IFRyYW5zbGF0YWJsZSgnUGxhbm5lZCBFbmQgVGltZScpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBQcmVmaXggPT4gJ0FjdHVhbFN0YXJ0JywKICAgICAgICAgICAgVGl0bGUgID0+IFRyYW5zbGF0YWJsZSgnQWN0dWFsIFN0YXJ0IFRpbWUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgUHJlZml4ID0+ICdBY3R1YWxFbmQnLAogICAgICAgICAgICBUaXRsZSAgPT4gVHJhbnNsYXRhYmxlKCdBY3R1YWwgRW5kIFRpbWUnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgUHJlZml4ID0+ICdDcmVhdGUnLAogICAgICAgICAgICBUaXRsZSAgPT4gVHJhbnNsYXRhYmxlKCdDcmVhdGUgVGltZScpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBQcmVmaXggPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFRpdGxlICA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSBUaW1lJyksCiAgICAgICAgfSwKICAgICk7CgogICAgVElNRVRZUEU6CiAgICBmb3IgbXkgJFRpbWVUeXBlIChAVGltZVR5cGVzKSB7CiAgICAgICAgbXkgJFByZWZpeCA9ICRUaW1lVHlwZS0+e1ByZWZpeH07CgogICAgICAgICMgc2hvdyBSZXF1ZXN0ZWRUaW1lIG9ubHkgd2hlbiBlbmFibGVkIGluIFN5c0NvbmZpZwogICAgICAgIGlmICggJFByZWZpeCBlcSAnUmVxdWVzdGVkJyAmJiAhJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CiAgICAgICAgICAgIG5leHQgVElNRVRZUEU7CiAgICAgICAgfQoKICAgICAgICBteSAkVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaW1lVHlwZS0+e1RpdGxlfSApOwogICAgICAgIG15ICRCZWZvcmVBZnRlclRyYW5zbGF0YWJsZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKGJlZm9yZS9hZnRlciknKTsKICAgICAgICBteSAkQmV0d2VlblRyYW5zbGF0YWJsZSAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJyhiZXR3ZWVuKScpOwogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFByZWZpeCAuICdUaW1lUG9pbnRGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVGl0bGUgLiAiICRCZWZvcmVBZnRlclRyYW5zbGF0YWJsZSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRQcmVmaXggLiAnVGltZVNsb3RGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVGl0bGUgLiAiICRCZXR3ZWVuVHJhbnNsYXRhYmxlIiwKICAgICAgICAgICAgfSwKCiAgICAgICAgKTsKICAgIH0KCiAgICAkUGFyYW17QXR0cmlidXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQXR0cmlidXRlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0F0dHJpYnV0ZScsCiAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKICAgICRQYXJhbXtBdHRyaWJ1dGVzT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQXR0cmlidXRlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0F0dHJpYnV0ZU9yaWcnLAogICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBHZXQgYSBjb21wbGV0ZSBsaXN0IG9mIHVzZXJzCiAgICAjIGZvciB0aGUgc2VsZWN0aW9uICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInIGFuZCAnY3JlYXRlZCBieSB1c2VyJy4KICAgICMgSXQgaXMgaW1wb3J0YW50IHRvIGFsc28gc2VhcmNoIGZvciBpbnZhbGlkIGFnZW50cywgYXMgd2Ugd2FudCB0byBmaW5kCiAgICAjIHRoZXNlIGNoYW5nZXMgdG9vLgogICAgIyBPdXQgb2Ygb2ZmaWNlIG5pY2UgbWlnaHQgYmUgYXBwZW5kZWQgdG8gdGhlIHZhbHVlcy4KICAgIG15ICVVc2VycyA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBkcm9wZG93biBtZW51IGZvciAnY3JlYXRlZCBieSB1c2VycycKICAgICRQYXJhbXsnQ3JlYXRlQnlTZWxlY3Rpb25TdHJpbmcnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VycywKICAgICAgICBOYW1lICAgICAgID0+ICdDcmVhdGVCeScsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtDcmVhdGVCeX0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBidWlsZCBjaGFuZ2UgbWFuYWdlciBkcm9wZG93bgogICAgJFBhcmFteydDaGFuZ2VNYW5hZ2VyU2VsZWN0aW9uU3RyaW5nJ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlcnMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2hhbmdlTWFuYWdlcklEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtDaGFuZ2VNYW5hZ2VySURzfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGJ1aWxkIGNoYW5nZSBidWlsZGVyIGRyb3Bkb3duCiAgICAkUGFyYW17J0NoYW5nZUJ1aWxkZXJTZWxlY3Rpb25TdHJpbmcnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VycywKICAgICAgICBOYW1lICAgICAgID0+ICdDaGFuZ2VCdWlsZGVySURzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0NoYW5nZUJ1aWxkZXJJRHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IHBvc3NpYmxlIENoYW5nZSBDYXRlZ29yaWVzCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFteydDaGFuZ2VDYXRlZ29yeVNlbGVjdGlvblN0cmluZyd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkQ2F0ZWdvcmllcywKICAgICAgICBOYW1lICAgICAgID0+ICdDYXRlZ29yeUlEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtDYXRlZ29yeUlEc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBnZXQgcG9zc2libGUgQ2hhbmdlIEltcGFjdHMKICAgIG15ICRJbXBhY3RzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdJbXBhY3QnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFteydDaGFuZ2VJbXBhY3RTZWxlY3Rpb25TdHJpbmcnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJEltcGFjdHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnSW1wYWN0SURzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBnZXQgcG9zc2libGUgQ2hhbmdlIFByaW9yaXRpZXMKICAgIG15ICRQcmlvcml0aWVzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17J0NoYW5nZVByaW9yaXR5U2VsZWN0aW9uU3RyaW5nJ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ByaW9yaXR5SURzfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2Ugc3RhdGVzCiAgICBteSAkQ2hhbmdlU3RhdGVzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17J0NoYW5nZVN0YXRlU2VsZWN0aW9uU3RyaW5nJ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRDaGFuZ2VTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2hhbmdlU3RhdGVJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2V0IHdvcmtvcmRlciBhZ2VudHMKICAgICRQYXJhbXsnV29ya09yZGVyQWdlbnRJRFNlbGVjdGlvblN0cmluZyd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1dvcmtPcmRlckFnZW50SURzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1dvcmtPcmRlckFnZW50SURzfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgIyBnZXQgd29ya29yZGVyIHN0YXRlcwogICAgbXkgJFdvcmtPcmRlclN0YXRlcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgICRQYXJhbXsnV29ya09yZGVyU3RhdGVTZWxlY3Rpb25TdHJpbmcnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFdvcmtPcmRlclN0YXRlcywKICAgICAgICBOYW1lICAgICAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBnZXQgd29ya29yZGVyIHR5cGVzCiAgICBteSAkV29ya09yZGVyVHlwZXMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICAkUGFyYW17J1dvcmtPcmRlclR5cGVTZWxlY3Rpb25TdHJpbmcnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFdvcmtPcmRlclR5cGVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1dvcmtPcmRlclR5cGVJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17V29ya09yZGVyVHlwZUlEc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBzZXQgcmVzdWx0IG91dHB1dCBmb3JtYXRzCiAgICAkUGFyYW17UmVzdWx0Rm9ybVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE5vcm1hbCA9PiBUcmFuc2xhdGFibGUoJ05vcm1hbCcpLAogICAgICAgICAgICBQcmludCAgPT4gVHJhbnNsYXRhYmxlKCdQcmludCcpLAogICAgICAgICAgICBDU1YgICAgPT4gVHJhbnNsYXRhYmxlKCdDU1YnKSwKICAgICAgICAgICAgRXhjZWwgID0+IFRyYW5zbGF0YWJsZSgnRXhjZWwnKSwKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1Jlc3VsdEZvcm0nLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1Jlc3VsdEZvcm19IHx8ICdOb3JtYWwnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15ICVQcm9maWxlcyA9ICRTZWFyY2hQcm9maWxlT2JqZWN0LT5TZWFyY2hQcm9maWxlTGlzdCgKICAgICAgICBCYXNlICAgICAgPT4gJ0lUU01DaGFuZ2VTZWFyY2gnLAogICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICApOwogICAgZGVsZXRlICRQcm9maWxlc3snJ307CiAgICBkZWxldGUgJFByb2ZpbGVzeydsYXN0LXNlYXJjaCd9OwogICAgaWYgKCRFbXB0eVNlYXJjaCkgewogICAgICAgICRQcm9maWxlc3snJ30gPSAnLSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUHJvZmlsZXN7J2xhc3Qtc2VhcmNoJ30gPSAnLSc7CiAgICB9CiAgICAkUGFyYW17UHJvZmlsZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVByb2ZpbGVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJvZmlsZScsCiAgICAgICAgSUQgICAgICAgICAgID0+ICdTZWFyY2hQcm9maWxlJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFByb2ZpbGUsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAjIGh0bWwgc2VhcmNoIG1hc2sgb3V0cHV0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTZWFyY2hBSkFYJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LCAgICAjJUdldFBhcmFtIH0sCiAgICApOwoKICAgICMgbnVtYmVyIG9mIG1pbnV0ZXMsIGRheXMsIHdlZWtzLCBtb250aHMgYW5kIHllYXJzCiAgICBteSAlT25lVG9GaWZ0eU5pbmUgPSBtYXAgeyAkXyA9PiBzcHJpbnRmICclMnMnLCAkXyB9ICggMSAuLiA1OSApOwoKICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICBteSAlVGltZVBlcmlvZCA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgVElNRVRZUEU6CiAgICBmb3IgbXkgJFRpbWVUeXBlIChAVGltZVR5cGVzKSB7CiAgICAgICAgbXkgJFByZWZpeCA9ICRUaW1lVHlwZS0+e1ByZWZpeH07CgogICAgICAgICMgc2hvdyBSZXF1ZXN0ZWRUaW1lIG9ubHkgd2hlbiBlbmFibGVkIGluIFN5c0NvbmZpZwogICAgICAgIGlmICggJFByZWZpeCBlcSAnUmVxdWVzdGVkJyAmJiAhJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CiAgICAgICAgICAgIG5leHQgVElNRVRZUEU7CiAgICAgICAgfQoKICAgICAgICBteSAkVGl0bGUgICAgICAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaW1lVHlwZS0+e1RpdGxlfSApOwogICAgICAgIG15ICVUaW1lU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAgICAgUHJlZml4ID0+ICRQcmVmaXgsCiAgICAgICAgICAgIFRpdGxlICA9PiAkVGl0bGUsCiAgICAgICAgKTsKCiAgICAgICAgJFRpbWVTZWxlY3Rpb25EYXRhe1RpbWVQb2ludH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU9uZVRvRmlmdHlOaW5lLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnVGltZVBvaW50JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17ICRQcmVmaXggLiAnVGltZVBvaW50JyB9LAogICAgICAgICk7CgogICAgICAgICRUaW1lU2VsZWN0aW9uRGF0YXtUaW1lUG9pbnRTdGFydH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnTGFzdCcgICA9PiBUcmFuc2xhdGFibGUoJ2xhc3QnKSwKICAgICAgICAgICAgICAgICdCZWZvcmUnID0+IFRyYW5zbGF0YWJsZSgnYmVmb3JlJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJFByZWZpeCAuICdUaW1lUG9pbnRTdGFydCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1RpbWVQb2ludFN0YXJ0JyB9IHx8ICdMYXN0JywKICAgICAgICApOwoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVBvaW50Rm9ybWF0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIG1pbnV0ZSA9PiBUcmFuc2xhdGFibGUoJ21pbnV0ZShzKScpLAogICAgICAgICAgICAgICAgaG91ciAgID0+IFRyYW5zbGF0YWJsZSgnaG91cihzKScpLAogICAgICAgICAgICAgICAgZGF5ICAgID0+IFRyYW5zbGF0YWJsZSgnZGF5KHMpJyksCiAgICAgICAgICAgICAgICB3ZWVrICAgPT4gVHJhbnNsYXRhYmxlKCd3ZWVrKHMpJyksCiAgICAgICAgICAgICAgICBtb250aCAgPT4gVHJhbnNsYXRhYmxlKCdtb250aChzKScpLAogICAgICAgICAgICAgICAgeWVhciAgID0+IFRyYW5zbGF0YWJsZSgneWVhcihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnVGltZVBvaW50Rm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17ICRQcmVmaXggLiAnVGltZVBvaW50Rm9ybWF0JyB9LAogICAgICAgICk7CgogICAgICAgICRUaW1lU2VsZWN0aW9uRGF0YXtUaW1lU3RhcnR9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICAgICBQcmVmaXggICA9PiAkUHJlZml4IC4gJ1RpbWVTdGFydCcsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBWYWxpZGF0ZSA9PiAxLAogICAgICAgICAgICBEaWZmVGltZSA9PiAtKCAoIDYwICogNjAgKiAyNCApICogMzAgKSwKICAgICAgICApOwoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVN0b3B9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeCAuICdUaW1lU3RvcCcsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBmaWVsZAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVRpbWVTZWxlY3Rpb25EYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgRHluYW1pYyBmaWVsZHMgYmxvY2tzCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKAogICAgICAgIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkQ2hhbmdlfSB9LAogICAgICAgIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkV29ya09yZGVyfSB9CiAgICAgICAgKQogICAgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICggQHskU2VhcmNoRmllbGRQcmVmZXJlbmNlc30gKSB7CgogICAgICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgICAgIG5leHQgUFJFRkVSRU5DRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJFByZWZlcmVuY2UtPntUeXBlfSB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJFByZWZlcmVuY2UtPntUeXBlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJFByZWZlcmVuY2UtPntUeXBlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhdHRyaWJ1dGVzCiAgICBteSAlQWxyZWFkeVNob3duOwogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoQEF0dHJpYnV0ZXMpIHsKICAgICAgICBteSAkS2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgIG5leHQgSVRFTSBpZiAhJEtleTsKICAgICAgICBuZXh0IElURU0gaWYgIWRlZmluZWQgJFBhcmFteyRLZXl9OwogICAgICAgIG5leHQgSVRFTSBpZiAkUGFyYW17JEtleX0gZXEgJyc7CiAgICAgICAgbmV4dCBJVEVNIGlmICRBbHJlYWR5U2hvd257JEtleX07CiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICdBUlJBWScgJiYgIUB7ICRQYXJhbXskS2V5fSB9ICkgewogICAgICAgICAgICBuZXh0IElURU07CiAgICAgICAgfQogICAgICAgICRBbHJlYWR5U2hvd257JEtleX0gPSAxOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudFNlYXJjaC5BdHRyaWJ1dGUuJyAuICRLZXksCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIG5vIGF0dHJpYnV0ZSBpcyBzaG93biwgc2hvdyBjaGFuZ2UgbnVtYmVyCiAgICBpZiAoICEkUHJvZmlsZSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudFNlYXJjaC5BdHRyaWJ1dGUuQ2hhbmdlTnVtYmVyJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICBBSkFYICAgICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVRlbXBsYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRlbXBsYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgbmVlZGVkIENoYW5nZUlECiAgICBteSAkQ2hhbmdlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gY2hhbmdlIGZvdW5kIGZvciBjaGFuZ2VJRCAlcy4nLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVGVtcGxhdGVOYW1lIENvbW1lbnQgVmFsaWRJRCBTdGF0ZVJlc2V0IE92ZXJ3cml0ZVRlbXBsYXRlIERlbGV0ZUNoYW5nZSApKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgZ2V0IGV4aXN0aW5nIHVzZXIgcHJlZmVyZW5jZXMKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgcHJlZmVyZW5jZSB0byBzZWUgd2hpY2ggdGVtcGxhdGVzIGFyZSBpbiBlZGl0IGJ5IHRoZSB1c2VyCiAgICBteSAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZyA9ICRVc2VyUHJlZmVyZW5jZXN7VXNlcklUU01DaGFuZ2VNYW5hZ2VtZW50VGVtcGxhdGVFZGl0fSB8fCAnJzsKCiAgICAjIGNvbnZlcnQgdG8gbG9va3VwIGhhc2gKICAgIG15IEBFZGl0ZWRUZW1wbGF0ZXMgPSBzcGxpdCBtLzsvLCAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZzsKICAgIG15ICVPYmplY3QyVGVtcGxhdGU7CiAgICBmb3IgbXkgJFN0cmluZyAoQEVkaXRlZFRlbXBsYXRlcykgewogICAgICAgIG15ICggJE9iamVjdCwgJFRlbXBsYXRlICkgPSBzcGxpdCBtLzo6LywgJFN0cmluZzsKICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyRPYmplY3R9ID0gJFRlbXBsYXRlOwogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGlkIGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkT2JqZWN0MlRlbXBsYXRleyAnQ2hhbmdlSUQnIC4gJENoYW5nZUlEIH07CgogICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAjIGNoZWNrIGlmIHRoaXMgY2hhbmdlIHdhcyBjcmVhdGVkIGJ5IHRoaXMgdXNlciB1c2luZyBhIHRlbXBsYXRlCiAgICBpZiAoJFRlbXBsYXRlSUQpIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZURhdGEpIHsKCiAgICAgICAgICAgICMgb3ZlcndyaXRlIGVtcHR5IHZhbHVlcyB3aXRoIHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJEdldFBhcmFte1RlbXBsYXRlTmFtZX0gfHw9ICRUZW1wbGF0ZURhdGEtPntOYW1lfTsKICAgICAgICAgICAgJEdldFBhcmFte0NvbW1lbnR9ICAgICAgfHw9ICRUZW1wbGF0ZURhdGEtPntDb21tZW50fTsKICAgICAgICAgICAgJEdldFBhcmFte1ZhbGlkSUR9ICAgICAgfHw9ICRUZW1wbGF0ZURhdGEtPntWYWxpZElEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUZW1wbGF0ZUlEID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgcmVxdWlyZWQgZmllbGRzIHRvIGxvb2sgZm9yIGVycm9ycy4KICAgIG15ICVFcnJvcjsKCiAgICAjIGFkZCBhIHRlbXBsYXRlCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1RlbXBsYXRlTmFtZX0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnVGVtcGxhdGVOYW1lSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggISVFcnJvciApIHsKCiAgICAgICAgICAgICMgc2VyaWFsaXplIHRoZSBjaGFuZ2UKICAgICAgICAgICAgbXkgJFRlbXBsYXRlQ29udGVudCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgU3RhdGVSZXNldCAgID0+ICRHZXRQYXJhbXtTdGF0ZVJlc2V0fSB8fCAwLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVDb250ZW50ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1RoZSBjaGFuZ2UgIiVzIiBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4nLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIHRoaXMgY2hhbmdlIHdhcyBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSBhbmQgc2hvdWxkIGJlIHNhdmVkIGJhY2sKICAgICAgICAgICAgaWYgKCAkVGVtcGxhdGVJRCAmJiAkR2V0UGFyYW17T3ZlcndyaXRlVGVtcGxhdGV9ICkgewoKICAgICAgICAgICAgICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEdldFBhcmFte1RlbXBsYXRlTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICA9PiAkVGVtcGxhdGVDb250ZW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgaWYgKCAhJFVwZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHVwZGF0ZSB0aGUgdGVtcGxhdGUgIiVzIi4nLCAkVGVtcGxhdGVJRCApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlIHNlcmlhbGl6ZWQgY2hhbmdlIGFzIGEgbmV3IHRlbXBsYXRlCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtUZW1wbGF0ZU5hbWV9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICA9PiAkVGVtcGxhdGVDb250ZW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgYWRkIHRoZSB0ZW1wbGF0ZS4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZGVmaW5lIHJlZGlyZWN0IFVSTAogICAgICAgICAgICBteSAkUmVkaXJlY3RVUkwgPSAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIjsKCiAgICAgICAgICAgICMgaWYgdGhlIG9yaWdpbmFsIGNoYW5nZSBzaG91bGQgYmUgZGVsZXRlZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWxldGVDaGFuZ2V9ICkgewoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBjaGFuZ2UKICAgICAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBkZWxldGUgY2hhbmdlICIlcyIuJywgJENoYW5nZUlEICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB1c2VyIHByZWZlcmVuY2UgZW50cnkKICAgICAgICAgICAgICAgIGRlbGV0ZSAkT2JqZWN0MlRlbXBsYXRleyAnQ2hhbmdlSUQnIC4gJENoYW5nZUlEIH07CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB0ZW1wbGF0ZSBvdmVydmlldwogICAgICAgICAgICAgICAgJFJlZGlyZWN0VVJMID0gJ0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHVzZXIgcHJlZmVyZW5jZSB3aXRoIHRoZSBuZXcgdGVtcGxhdGUgaWQKICAgICAgICAgICAgZWxzaWYgKCAkT2JqZWN0MlRlbXBsYXRleyAnQ2hhbmdlSUQnIC4gJENoYW5nZUlEIH0gKSB7CiAgICAgICAgICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyAnQ2hhbmdlSUQnIC4gJENoYW5nZUlEIH0gPSAkVGVtcGxhdGVJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZyA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAlT2JqZWN0MlRlbXBsYXRlICkgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlRWRpdFByZWZlcmVuY2VTdHJpbmcgLj0gJE9iamVjdCAuICc6OicgLiAkT2JqZWN0MlRlbXBsYXRleyRPYmplY3R9IC4gJzsnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VySVRTTUNoYW5nZU1hbmFnZW1lbnRUZW1wbGF0ZUVkaXQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRUZW1wbGF0ZUVkaXRQcmVmZXJlbmNlU3RyaW5nLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICRSZWRpcmVjdFVSTCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZScpLAogICAgKTsKCiAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICMgYnVpbGQgdmFsaWQgc2VsZWN0aW9uCiAgICBteSAkVmFsaWRTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJFZhbGlkT2JqZWN0LT5WYWxpZExpc3QoKSwKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte1ZhbGlkSUR9IHx8ICggJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpIClbMF0sCiAgICAgICAgU29ydCAgICAgICA9PiAnTnVtZXJpY0tleScsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nIGZvciBzdGF0ZSByZXNldAogICAgbXkgJFN0YXRlUmVzZXRTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ05vJyksCiAgICAgICAgICAgIDEgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YXRlUmVzZXQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte1N0YXRlUmVzZXR9IC8vIDEsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBzaG93IGRyb3Bkb3ducyBvbmx5IGlmIHRoaXMgY2hhbmdlIHdhcyBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZQogICAgaWYgKCRUZW1wbGF0ZUlEKSB7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZyBmb3IgdGVtcGxhdGUgb3ZlcndyaXRlLCBkZWZhdWx0IGlzIHllcwogICAgICAgIG15ICRPdmVyd3JpdGVUZW1wbGF0ZVNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDAgPT4gVHJhbnNsYXRhYmxlKCdObycpLAogICAgICAgICAgICAgICAgMSA9PiBUcmFuc2xhdGFibGUoJ1llcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPdmVyd3JpdGVUZW1wbGF0ZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte092ZXJ3cml0ZVRlbXBsYXRlfSAvLyAxLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBvdmVyd3JpdGUgb3JpZ2luYWwgdGVtcGxhdGUgZHJvcGRvd24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcndyaXRlVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE92ZXJ3cml0ZVRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nID0+ICRPdmVyd3JpdGVUZW1wbGF0ZVNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcgZm9yIGRlbGV0ZSBjaGFuZ2UKICAgICAgICBteSAkRGVsZXRlQ2hhbmdlU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ05vJyksCiAgICAgICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0RlbGV0ZUNoYW5nZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0RlbGV0ZUNoYW5nZX0gLy8gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZGVsZXRlIGNoYW5nZSBkcm9wZG93bgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEZWxldGVDaGFuZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIERlbGV0ZUNoYW5nZVNlbGVjdGlvblN0cmluZyA9PiAkRGVsZXRlQ2hhbmdlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFZhbGlkU2VsZWN0aW9uU3RyaW5nICAgICAgPT4gJFZhbGlkU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBTdGF0ZVJlc2V0U2VsZWN0aW9uU3RyaW5nID0+ICRTdGF0ZVJlc2V0U2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VUaXRsZX0sCiAgICAgICAgICAgICVFcnJvciwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVRpbWVTbG90LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRpbWVTbG90LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlVGltZVNsb3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENoYW5nZUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENoYW5nZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDaGFuZ2UgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJENoYW5nZUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgTW92aW5nIGlzIHBvc3NpYmxlIG9ubHkgd2hlbiB0aGVyZSBhcmUgd29ya29yZGVycy4KICAgIGlmICggISRDaGFuZ2UtPntXb3JrT3JkZXJDb3VudH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlIGNoYW5nZSBjYW5cJ3QgYmUgbW92ZWQsIGFzIGl0IGhhcyBubyB3b3Jrb3JkZXJzLicpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnQWRkIGEgd29ya29yZGVyIGZpcnN0LicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBNb3ZpbmcgaXMgYWxsb3dlZCBvbmx5IHdoZW4gdGhlcmUgdGhlIGNoYW5nZSBoYXMgbm90IHN0YXJ0ZWQgeWV0LgogICAgaWYgKCAkQ2hhbmdlLT57QWN0dWFsU3RhcnRUaW1lfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3QgbW92ZSBhIGNoYW5nZSB3aGljaCBhbHJlYWR5IGhhcyBzdGFydGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIG1vdmUgdGhlIGluZGl2aWR1YWwgd29ya29yZGVycyBpbnN0ZWFkLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJ01vdmVUaW1lVHlwZScsCiAgICApIHx8ICdQbGFubmVkU3RhcnRUaW1lJzsKCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICBteSAkUGFyYW1OYW1lID0gJ01vdmVUaW1lJyAuICRUaW1lUGFydDsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAkUGFyYW1OYW1lLAogICAgICAgICk7CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICBteSAlVmFsaWRhdGlvbkVycm9yczsKCiAgICAjIGdldCB0aW1lIG9iamVjdAoKICAgICMgbW92ZSB0aW1lIHNsb3Qgb2YgY2hhbmdlCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTW92ZVRpbWVTbG90JyApIHsKCiAgICAgICAgIyBjaGVjayB2YWxpZGl0eSBvZiB0aGUgdGltZSB0eXBlCiAgICAgICAgbXkgJE1vdmVUaW1lVHlwZSA9ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9OwogICAgICAgIGlmICggIWRlZmluZWQgJE1vdmVUaW1lVHlwZSApCiAgICAgICAgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yc3tNb3ZlVGltZUludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBjb21wbGV0ZW5lc3Mgb2YgdGhlIHRpbWUgcGFyYW1ldGVyIGxpc3QsCiAgICAgICAgICAgICMgb25seSBob3VyIGFuZCBtaW51dGUgYXJlIGFsbG93ZWQgdG8gYmUgJzAnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkR2V0UGFyYW17TW92ZVRpbWVZZWFyfQogICAgICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZU1vbnRofQogICAgICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZURheX0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRHZXRQYXJhbXtNb3ZlVGltZUhvdXJ9CiAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3Jze01vdmVUaW1lSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3lzdGVtIHRpbWUgZnJvbSB0aGUgaW5wdXQsIGlmIGl0IGNhbid0IGJlIGRldGVybWluZWQgd2UgaGF2ZSBhIHZhbGlkYXRpb24gZXJyb3IKICAgICAgICBteSAkUGxhbm5lZFN5c3RlbVRpbWU7CiAgICAgICAgaWYgKCAhJVZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIHRyYW5zZm9ybSBjaGFuZ2UgcGxhbm5lZCB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ01vdmVUaW1lJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICBteSAkUGxhbm5lZFRpbWUgPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVEYXl9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9OwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgb2YgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBsYW5uZWRUaW1lLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQbGFubmVkU3lzdGVtVGltZSA9ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgaWYgKCAhJFBsYW5uZWRTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnN7TW92ZVRpbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgbW92ZSB0aW1lIHNsb3Qgb25seSB3aGVuIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgIGlmICggISVWYWxpZGF0aW9uRXJyb3JzICkgewoKICAgICAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2UgaW4gc2Vjb25kcwogICAgICAgICAgICBteSAkQ3VycmVudFBsYW5uZWRUaW1lID0gJENoYW5nZS0+eyRNb3ZlVGltZVR5cGV9OwoKICAgICAgICAgICAgIyBFdmVuIHdoZW4gdGhlcmUgYXJlIHdvcmtvcmRlcnMsIGEgY2hhbmdlIG1pZ2h0IHN0aWxsIG1pc3MgYSBwbGFubmVkIHRpbWUuCiAgICAgICAgICAgICMgSW4gdGhhdCBjYXNlIG1vdmluZyB0aGUgdGltZSBzbG90IGlzIG5vdCBwb3NzaWJsZS4KICAgICAgICAgICAgaWYgKCAhJEN1cnJlbnRQbGFubmVkVGltZSApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1RoZSBjdXJyZW50ICVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLicsICRNb3ZlVGltZVR5cGUgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdUaGUgJXMgb2YgYWxsIHdvcmtvcmRlcnMgaGFzIHRvIGJlIGRlZmluZWQuJywgJE1vdmVUaW1lVHlwZSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICA9PiAkQ3VycmVudFBsYW5uZWRUaW1lLAogICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRDb25maWdPYmplY3QtPkdldCgnVGltZVpvbmVVc2VyJyksCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ3VycmVudFBsYW5uZWRTeXN0ZW1UaW1lID0gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICBteSAkRGlmZlNlY29uZHMgPSAkUGxhbm5lZFN5c3RlbVRpbWUgLSAkQ3VycmVudFBsYW5uZWRTeXN0ZW1UaW1lOwoKICAgICAgICAgICAgbXkgJE1vdmVFcnJvciA9ICRTZWxmLT5fTW92ZVdvcmtPcmRlcnMoCiAgICAgICAgICAgICAgICBEaWZmU2Vjb25kcyAgPT4gJERpZmZTZWNvbmRzLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzID0+ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9LAogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRNb3ZlRXJyb3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTW92ZUVycm9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxvYWQgbmV3IFVSTCBpbiBwYXJlbnQgd2luZG93IGFuZCBjbG9zZSBwb3B1cAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHBsYW5uZWQgc3RhcnQgdGltZSBvciBwbGFubmVkIGVuZCB0aW1lIGZyb20gdGhlIGNoYW5nZQogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2UtPnsgJEdldFBhcmFte01vdmVUaW1lVHlwZX0gfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICMgc2V0IHRoZSBwYXJhbWV0ZXIgaGFzaCBmb3IgdGhlIGFuc3dlcnMKICAgICAgICAjIHRoZSBzZWNvbmRzIGFyZSBpZ25vcmVkCiAgICAgICAgbXkgJERhdGVUaW1lU2V0dGluZ3MgPSAkRGF0ZVRpbWVPYmplY3QtPkdldCgpOwoKICAgICAgICAjIGdldCBjb25maWcgZm9yIHRoZSBudW1iZXIgb2YgeWVhcnMgd2hpY2ggc2hvdWxkIGJlIHNlbGVjdGFibGUKICAgICAgICBteSAkVGltZVBlcmlvZCA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpOwogICAgICAgIG15ICRTdGFydFllYXIgID0gJERhdGVUaW1lU2V0dGluZ3MtPntZZWFyfSAtICRUaW1lUGVyaW9kLT57WWVhclBlcmlvZFBhc3R9OwogICAgICAgIG15ICRFbmRZZWFyICAgID0gJERhdGVUaW1lU2V0dGluZ3MtPntZZWFyfSArICRUaW1lUGVyaW9kLT57WWVhclBlcmlvZEZ1dHVyZX07CgogICAgICAgICMgYXNzZW1ibGUgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHJldHVybmVkCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZU1pbnV0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBbIG1hcCB7IHNwcmludGYgJyUwMmQnLCAkXyB9ICggMCAuLiA1OSApIF0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGF0ZVRpbWVTZXR0aW5ncy0+e01pbnV0ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01vdmVUaW1lSG91cicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBbIG1hcCB7IHNwcmludGYgJyUwMmQnLCAkXyB9ICggMCAuLiAyMyApIF0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGF0ZVRpbWVTZXR0aW5ncy0+e0hvdXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZURheScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7IG1hcCB7ICRfID0+IHNwcmludGYgJyUwMmQnLCAkXyB9ICggMSAuLiAzMSApIH0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiBpbnQgJERhdGVUaW1lU2V0dGluZ3MtPntEYXl9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZU1vbnRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IHsgbWFwIHsgJF8gPT4gc3ByaW50ZiAnJTAyZCcsICRfIH0gKCAxIC4uIDEyICkgfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGludCAkRGF0ZVRpbWVTZXR0aW5ncy0+e01vbnRofSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTW92ZVRpbWVZZWFyJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFsgJFN0YXJ0WWVhciAuLiAkRW5kWWVhciBdLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte01vdmVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIG5vIHN1YmFjdGlvbiwKICAgICAgICAjIGdldCBwbGFubmVkIHN0YXJ0IHRpbWUgb3IgcGxhbm5lZCBlbmQgdGltZSBmcm9tIHRoZSBjaGFuZ2UKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ2hhbmdlLT57ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICApOwogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICMgc2V0IHRoZSBwYXJhbWV0ZXIgaGFzaCBmb3IgQnVpbGREYXRlU2VsZWN0aW9uKCkKICAgICAgICAjIHRoZSBzZWNvbmRzIGFyZSBpZ25vcmVkCiAgICAgICAgbXkgJERhdGVUaW1lU2V0dGluZ3MgPSAkRGF0ZVRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1pbnV0ZX0gPSAkRGF0ZVRpbWVTZXR0aW5ncy0+e01pbnV0ZX07CiAgICAgICAgJEdldFBhcmFte01vdmVUaW1lSG91cn0gICA9ICREYXRlVGltZVNldHRpbmdzLT57SG91cn07CiAgICAgICAgJEdldFBhcmFte01vdmVUaW1lRGF5fSAgICA9ICREYXRlVGltZVNldHRpbmdzLT57RGF5fTsKICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNb250aH0gID0gJERhdGVUaW1lU2V0dGluZ3MtPntNb250aH07CiAgICAgICAgJEdldFBhcmFte01vdmVUaW1lWWVhcn0gICA9ICREYXRlVGltZVNldHRpbmdzLT57WWVhcn07CiAgICB9CgogICAgIyBidWlsZCBkcm9wLWRvd24gd2l0aCB0aW1lIHR5cGVzCiAgICBteSAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnUGxhbm5lZCBTdGFydCBUaW1lJykKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1BsYW5uZWRFbmRUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnUGxhbm5lZCBFbmQgVGltZScpCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZVR5cGUnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte01vdmVUaW1lVHlwZX0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyB0aW1lIHBlcmlvZCB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBHVUkKICAgIG15ICVUaW1lUGVyaW9kID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNV29ya09yZGVyOjpUaW1lUGVyaW9kJykgfTsKCiAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICBteSAkTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFByZWZpeCAgICAgICAgPT4gJ01vdmVUaW1lJywKICAgICAgICBWYWxpZGF0ZSAgICAgID0+IDEsCiAgICAgICAgTW92ZVRpbWVDbGFzcyA9PiAkVmFsaWRhdGlvbkVycm9yc3tNb3ZlVGltZUludmFsaWR9IHx8ICcnLAogICAgICAgICVUaW1lUGVyaW9kLAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdNb3ZlIFRpbWUgU2xvdCcpLAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZVRpbWVTbG90JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAlVmFsaWRhdGlvbkVycm9ycywKICAgICAgICAgICAgTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nID0+ICRNb3ZlVGltZVR5cGVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nICAgICA9PiAkTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCiMgdGhlIGFjdHVhbCBtb3ZpbmcgaXMgZG9uZSBoZXJlCnN1YiBfTW92ZVdvcmtPcmRlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAQ29sbGVjdGVkVXBkYXRlUGFyYW1zOyAgICAjIGFuIGFycmF5IG9mIHBhcmFtcyBmb3IgV29ya09yZGVyVXBkYXRlKCkKICAgIG15ICVXb3JrT3JkZXJJRDJOdW1iZXI7ICAgICAgICMgdXNlZCBvbmx5IGZvciBlcnJvciBtZXNzYWdlcwoKICAgICMgZ2V0IHdvcmsgb3JkZXIgb2JqZWN0CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBkZXRlcm1pbmUgdGhlIG5ldyB0aW1lcwogICAgV09SS09SREVSSUQ6CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJFBhcmFte1dvcmtPcmRlcklEc30gfSApIHsKICAgICAgICBteSAkV29ya09yZGVyID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICEkV29ya09yZGVyOwogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgcmVmICRXb3JrT3JkZXIgbmUgJ0hBU0gnOwogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgISV7JFdvcmtPcmRlcn07CgogICAgICAgICRXb3JrT3JkZXJJRDJOdW1iZXJ7JFdvcmtPcmRlcklEfSA9ICRXb3JrT3JkZXItPntXb3JrT3JkZXJOdW1iZXJ9OwogICAgICAgIG15ICVVcGRhdGVQYXJhbXM7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUpKSB7CgogICAgICAgICAgICBuZXh0IFRZUEUgaWYgISRXb3JrT3JkZXItPnskVHlwZX07CgogICAgICAgICAgICAjIGdldCBkYXRldGltZSBvYmplY3QKICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFdvcmtPcmRlci0+eyRUeXBlfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJERhdGVUaW1lT2JqZWN0OwoKICAgICAgICAgICAgIyBhZGQgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIHRpbWUgc2xvdCBzaG91bGQgYmUgbW92ZWQKICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5BZGQoIFNlY29uZHMgPT4gJFBhcmFte0RpZmZTZWNvbmRzfSApOwogICAgICAgICAgICAkVXBkYXRlUGFyYW1zeyRUeXBlfSA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgfQoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICElVXBkYXRlUGFyYW1zOwoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB3b3Jrb3JkZXIgdGhhdCBzaG91bGQgYmUgbW92ZWQKICAgICAgICAkVXBkYXRlUGFyYW1ze1dvcmtPcmRlcklEfSA9ICRXb3JrT3JkZXJJRDsKCiAgICAgICAgcHVzaCBAQ29sbGVjdGVkVXBkYXRlUGFyYW1zLCBcJVVwZGF0ZVBhcmFtczsKICAgIH0KCiAgICAjIGRvIHRoZSB1cGRhdGluZwogICAgVVBEQVRFUEFSQU1TOgogICAgZm9yIG15ICRVcGRhdGVQYXJhbXMgKEBDb2xsZWN0ZWRVcGRhdGVQYXJhbXMpIHsKCiAgICAgICAgIyBubyBudW1iZXIgY2FsY3VsYXRpb24gbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHdvcmtvcmRlciBvcmRlciBkb2Vzbid0IGNoYW5nZQogICAgICAgIG15ICRVcGRhdGVPayA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICAgICAgJXskVXBkYXRlUGFyYW1zfSwKICAgICAgICAgICAgTm9OdW1iZXJDYWxjID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVwZGF0ZU9rICkgewoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJE51bWJlciA9IGpvaW4gJy0nLAogICAgICAgICAgICAgICAgJFBhcmFte0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVySUQyTnVtYmVyeyAkVXBkYXRlUGFyYW1zLT57V29ya09yZGVySUR9IH07CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1dhcyBub3QgYWJsZSB0byBtb3ZlIHRpbWUgc2xvdCBmb3Igd29ya29yZGVyICMlcyEnLCAkTnVtYmVyICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbW92aW5nIHdhcyBzdWNjZXNzZnVsCiAgICByZXR1cm47Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVpvb20ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVpvb20ucG0sdiAxLjMgMjAxOC8xMC8xOSAxMjowOToyMyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJDaGFuZ2VJRCIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENoYW5nZUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENoYW5nZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgY2hhbmdlIHpvb20KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDaGFuZ2UgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJENoYW5nZUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgY2xlYW4gdGhlIHJpY2ggdGV4dCBmaWVsZHMgZnJvbSBhY3RpdmUgSFRNTCBjb250ZW50CiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoRGVzY3JpcHRpb24gSnVzdGlmaWNhdGlvbikpIHsKCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRDaGFuZ2UtPnskQXR0cmlidXRlfTsKCiAgICAgICAgIyByZW1vdmUgYWN0aXZlIGh0bWwgY29udGVudCAoc2NyaXB0cywgYXBwbGV0cywgZXRjLi4uKQogICAgICAgIG15ICVTYWZlQ29udGVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+U2FmZXR5KAogICAgICAgICAgICBTdHJpbmcgICAgICAgPT4gJENoYW5nZS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb0ludFNyY0xvYWQgPT4gMCwKICAgICAgICAgICAgTm9FeHRTcmNMb2FkID0+IDAsCiAgICAgICAgICAgIE5vSmF2YVNjcmlwdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdGFrZSB0aGUgc2FmZSBjb250ZW50IGlmIG5lY2Nlc3NhcnkKICAgICAgICBpZiAoICRTYWZlQ29udGVudHtSZXBsYWNlfSApIHsKICAgICAgICAgICAgJENoYW5nZS0+eyRBdHRyaWJ1dGV9ID0gJFNhZmVDb250ZW50e1N0cmluZ307CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBoYW5kbGUgSFRNTFZpZXcKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdIVE1MVmlldycgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgbXkgJEZpZWxkID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkZpZWxkIiApOwoKICAgICAgICAjIG5lZWRlZCBwYXJhbQogICAgICAgIGlmICggISRGaWVsZCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWRlZCBQYXJhbTogJEZpZWxkISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGVycm9yIGNoZWNraW5nCiAgICAgICAgaWYgKCAkRmllbGQgbmUgJ0Rlc2NyaXB0aW9uJyAmJiAkRmllbGQgbmUgJ0p1c3RpZmljYXRpb24nICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIlVua25vd24gZmllbGQ6ICRGaWVsZCEgRmllbGQgbXVzdCBiZSBlaXRoZXIgRGVzY3JpcHRpb24gb3IgSnVzdGlmaWNhdGlvbiEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIEZpZWxkIGNvbnRlbnQKICAgICAgICBteSAkRmllbGRDb250ZW50ID0gJENoYW5nZS0+eyRGaWVsZH07CgogICAgICAgICMgYnVpbGQgYmFzZSBVUkwgZm9yIGluLWxpbmUgaW1hZ2VzIGlmIG5vIHNlc3Npb24gY29va2llcyBhcmUgdXNlZAogICAgICAgIG15ICRTZXNzaW9uSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICkgewogICAgICAgICAgICAkU2Vzc2lvbklEID0gJzsnIC4gJFNlbGYtPntTZXNzaW9uTmFtZX0gLiAnPScgLiAkU2VsZi0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICRGaWVsZENvbnRlbnQgPX4gc3sKICAgICAgICAgICAgICAgIChBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0ZpbGVuYW1lPS4rO0NoYW5nZUlEPVxkKykKICAgICAgICAgICAgfXskMSRTZXNzaW9uSUR9Z21zeDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IEhUTUwgdXRpbHMgb2JqZWN0CiAgICAgICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKCiAgICAgICAgIyBkZXRlY3QgYWxsIHBsYWluIHRleHQgbGlua3MgYW5kIHB1dCB0aGVtIGludG8gYW4gSFRNTCA8YT4gdGFnCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGFyZ2V0PSJfYmxhbmsiIGF0dHJpYnV0ZSB0byBhbGwgSFRNTCA8YT4gdGFncwogICAgICAgICMgdGhlIExpbmtRdW90ZSBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4KICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgVGFyZ2V0QWRkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgICAgIENoYXJzZXQgPT4gJ3V0Zi04JywKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBjb21wbGV0ZSBIVE1MIGFzIGFuIGF0dGFjaG1lbnQKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgRG93bmxvYWRBdHRhY2htZW50CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmb3IgYXR0YWNobWVudAogICAgICAgIG15ICRGaWxlbmFtZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWxlbmFtZScgKTsKICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50R2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXNzaW9uIG9iamVjdAogICAgbXkgJFNlc3Npb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKTsKCiAgICAjIFN0b3JlIExhc3RDaGFuZ2VWaWV3LCBmb3IgYmFja2xpbmtzIGZyb20gY2hhbmdlIHNwZWNpZmljIHBhZ2VzCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0Q2hhbmdlVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBTdG9yZSBMYXN0U2NyZWVuT3ZlcnZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSBBZ2VudExpbmtPYmplY3QKICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBTdG9yZSBMYXN0U2NyZWVuT3ZlcnZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSBBZ2VudExpbmtPYmplY3QKICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIFN0b3JlIExhc3RTY3JlZW5Xb3JrT3JkZXJzLCBmb3IgYmFja2xpbmtzIGZyb20gSVRTTVdvcmtPcmRlclpvb20KICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5Xb3JrT3JkZXJzJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIHJ1biBjaGFuZ2UgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBpdGVtcyBmb3IgbWVudQogICAgICAgIG15ICVNZW51cyAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIH07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGNsYXNzZXMKICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ1BvcFVwJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnQXNQb3B1cCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0JhY2snICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57TWVudUNsYXNzfSA9ICdIaXN0b3J5QmFjayc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENoYW5nZSAgPT4gJENoYW5nZSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICAgICBNZW51SUQgID0+ICRNZW51LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFZhbHVlID0+ICRDaGFuZ2UtPntDaGFuZ2VUaXRsZX0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBidWlsZCB3b3Jrb3JkZXIgZ3JhcGggaW4gbGF5b3V0IG9iamVjdAogICAgbXkgJFdvcmtPcmRlckdyYXBoID0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUJ1aWxkV29ya09yZGVyR3JhcGgoCiAgICAgICAgQ2hhbmdlICAgICAgICAgICAgID0+ICRDaGFuZ2UsCiAgICAgICAgV29ya09yZGVyT2JqZWN0ICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyksCiAgICAgICAgRHluYW1pY0ZpZWxkT2JqZWN0ID0+ICREeW5hbWljRmllbGRPYmplY3QsCiAgICAgICAgQmFja2VuZE9iamVjdCAgICAgID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgKTsKCiAgICAjIGRpc3BsYXkgZ3JhcGggd2l0aGluIGFuIG93biBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyR3JhcGgnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHcmFwaCA9PiAkV29ya09yZGVyR3JhcGgsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIGdldCBhZ2VudHMgcHJlZmVyZW5jZXMKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyByZW1lbWJlciBpZiB1c2VyIGFscmVhZHkgY2xvc2VkIG1lc3NhZ2UgYWJvdXQgbGlua3MgaW4gaWZyYW1lcwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2Vze1VzZXJBZ2VudERvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbWVzc2FnZSBhYm91dCBsaW5rcyBpbiBpZnJhbWVzLCBpZiB1c2VyIGRpZG4ndCBjbG9zZSBpdCBhbHJlYWR5CiAgICBpZiAoICEkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZWN1cml0eSByZXN0cmljdGlvbiBzZXR0aW5nIGZvciBpZnJhbWVzCiAgICAjIHNlY3VyaXR5PSJyZXN0cmljdGVkIiBtYXkgYnJlYWsgU1NPIC0gZGlzYWJsZSB0aGlzIGZlYXR1cmUgaWYgcmVxdWVzdGVkCiAgICBteSAkTVNTZWN1cml0eVJlc3RyaWN0ZWQ7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRGlzYWJsZU1TSUZyYW1lU2VjdXJpdHlSZXN0cmljdGVkJykgKSB7CiAgICAgICAgJE1TU2VjdXJpdHlSZXN0cmljdGVkID0gJyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTVNTZWN1cml0eVJlc3RyaWN0ZWQgPSAnc2VjdXJpdHk9InJlc3RyaWN0ZWQiJzsKICAgIH0KCiAgICAjIHNob3cgdGhlIEhUTUwgZmllbGQgYmxvY2tzIGFzIGlmcmFtZXMKICAgIGZvciBteSAkRmllbGQgKHF3KERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24pKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJVFNNQ29udGVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgRmllbGQgICAgICAgICAgICAgICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgTVNTZWN1cml0eVJlc3RyaWN0ZWQgPT4gJE1TU2VjdXJpdHlSZXN0cmljdGVkLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGJ1aWxkZXIgZGF0YQogICAgbXkgJUNoYW5nZUJ1aWxkZXJVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGFsbCBwb3N0Zml4ZXMgbmVlZGVkIGZvciB1c2VyIGluZm9ybWF0aW9uCiAgICBteSBAUG9zdGZpeGVzID0gcXcoVXNlckZ1bGxuYW1lKTsKCiAgICAjIGdldCB1c2VyIGluZm9ybWF0aW9uIGZvciBDaGFuZ2VCdWlsZGVyLCBDcmVhdGVCeSwgQ2hhbmdlQnkKICAgIGZvciBteSAkUG9zdGZpeCAoQFBvc3RmaXhlcykgewogICAgICAgICRDaGFuZ2UtPnsgJ0NoYW5nZUJ1aWxkZXInIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VCdWlsZGVyVXNlcnskUG9zdGZpeH07CiAgICAgICAgJENoYW5nZS0+eyAnQ3JlYXRlJyAuICRQb3N0Zml4IH0gICAgICAgID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgICAgICRDaGFuZ2UtPnsgJ0NoYW5nZScgLiAkUG9zdGZpeCB9ICAgICAgICA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsdWVzIG9yIGRhc2ggKCctJykKICAgIGZvciBteSAkQmxvY2tOYW1lIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lIEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewogICAgICAgIGlmICggJENoYW5nZS0+eyRCbG9ja05hbWV9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICRCbG9ja05hbWUgPT4gJENoYW5nZS0+eyRCbG9ja05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHknIC4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGNvbmZpZ3VyYWJsZSBibG9ja3MKICAgIEJMT0NLTkFNRToKICAgIGZvciBteSAkQmxvY2tOYW1lIChxdyhSZXF1ZXN0ZWRUaW1lIFBsYW5uZWRFZmZvcnQgQWNjb3VudGVkVGltZSkpIHsKCiAgICAgICAgIyBza2lwIGlmIGJsb2NrIGlzIHN3aXRjaGVkIG9mZiBpbiBTeXNDb25maWcKICAgICAgICBuZXh0IEJMT0NLTkFNRSBpZiAhJFNlbGYtPntDb25maWd9LT57JEJsb2NrTmFtZX07CgogICAgICAgICMgc2hvdyBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93JyAuICRCbG9ja05hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHZhbHVlIG9yIGRhc2gKICAgICAgICBpZiAoICRDaGFuZ2UtPnskQmxvY2tOYW1lfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAkQmxvY2tOYW1lID0+ICRDaGFuZ2UtPnskQmxvY2tOYW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VtcHR5JyAuICRCbG9ja05hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBDSVAKICAgIGZvciBteSAkVHlwZSAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRUeXBlLAogICAgICAgICAgICBEYXRhID0+IHsgJXskQ2hhbmdlfSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDEwMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBmb3IgZW1wdHkgdmFsdWVzCiAgICAgICAgaWYgKCAhJFZhbHVlU3RyZy0+e1ZhbHVlfSApIHsKICAgICAgICAgICAgJFZhbHVlU3RyZy0+e1ZhbHVlfSA9ICctJzsKICAgICAgICB9CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZWxlbWVudAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG5vbiBsaW5rIGVsZW1lbnQKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBtYW5hZ2VyIGRhdGEKICAgIG15ICVDaGFuZ2VNYW5hZ2VyVXNlcjsKICAgIGlmICggJENoYW5nZS0+e0NoYW5nZU1hbmFnZXJJRH0gKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBtYW5hZ2VyIGRhdGEKICAgICAgICAlQ2hhbmdlTWFuYWdlclVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgbWFuYWdlciBpbmZvcm1hdGlvbgogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyRnVsbG5hbWUpKSB7CiAgICAgICAgJENoYW5nZS0+eyAnQ2hhbmdlTWFuYWdlcicgLiAkUG9zdGZpeCB9ID0gJENoYW5nZU1hbmFnZXJVc2VyeyRQb3N0Zml4fSB8fCAnJzsKICAgIH0KCiAgICAjIG91dHB1dCBjaGFuZ2UgbWFuYWdlciBibG9jawogICAgaWYgKCVDaGFuZ2VNYW5hZ2VyVXNlcikgewoKICAgICAgICAjIHNob3cgbmFtZSBhbmQgbWFpbCBhZGRyZXNzIGlmIHVzZXIgZXhpc3RzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgZGFzaCBpZiBubyBjaGFuZ2UgbWFuYWdlciBleGlzdHMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgb2JqZWN0CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgc2hvdyBDQUIgYmxvY2sgd2hlbiB0aGVyZSBpcyBhIENBQgogICAgaWYgKCBAeyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSB9IHx8IEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gKSB7CgogICAgICAgICMgb3V0cHV0IENBQiBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDQUInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhbmQgb3V0cHV0IENBQiBhZ2VudHMKICAgICAgICBDQUJBR0VOVDoKICAgICAgICBmb3IgbXkgJENBQkFnZW50ICggQHsgJENoYW5nZS0+e0NBQkFnZW50c30gfSApIHsKICAgICAgICAgICAgbmV4dCBDQUJBR0VOVCBpZiAhJENBQkFnZW50OwoKICAgICAgICAgICAgbXkgJUNBQkFnZW50VXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJENBQkFnZW50LAogICAgICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENBQkFHRU5UIGlmICElQ0FCQWdlbnRVc2VyRGF0YTsKCiAgICAgICAgICAgICMgYnVpbGQgY29udGVudCBmb3IgYWdlbnQgYmxvY2sKICAgICAgICAgICAgbXkgJUNBQkFnZW50RGF0YTsKICAgICAgICAgICAgZm9yIG15ICRQb3N0Zml4IChAUG9zdGZpeGVzKSB7CiAgICAgICAgICAgICAgICAkQ0FCQWdlbnREYXRheyAnQ0FCQWdlbnQnIC4gJFBvc3RmaXggfSA9ICRDQUJBZ2VudFVzZXJEYXRheyRQb3N0Zml4fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgYWdlbnQgYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDQUJBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlQ0FCQWdlbnREYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgYW5kIG91dHB1dCBDQUIgY3VzdG9tZXJzCiAgICAgICAgQ0FCQ1VTVE9NRVI6CiAgICAgICAgZm9yIG15ICRDQUJDdXN0b21lciAoIEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gKSB7CiAgICAgICAgICAgIG5leHQgQ0FCQ1VTVE9NRVIgaWYgISRDQUJDdXN0b21lcjsKCiAgICAgICAgICAgIG15ICVDQUJDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJENBQkN1c3RvbWVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDQUJDVVNUT01FUiBpZiAhJUNBQkN1c3RvbWVyVXNlckRhdGE7CgogICAgICAgICAgICAjIGJ1aWxkIGNvbnRlbnQgZm9yIENBQiBjdXN0b21lciBibG9jawogICAgICAgICAgICBteSAlQ0FCQ3VzdG9tZXJEYXRhOwogICAgICAgICAgICBmb3IgbXkgJFBvc3RmaXggKEBQb3N0Zml4ZXMpIHsKICAgICAgICAgICAgICAgICRDQUJDdXN0b21lckRhdGF7ICdDQUJDdXN0b21lcicgLiAkUG9zdGZpeCB9ID0gJENBQkN1c3RvbWVyVXNlckRhdGF7JFBvc3RmaXh9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBDQUIgY3VzdG9tZXIgYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDQUJDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlQ0FCQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGRhc2ggd2hlbiBubyBDQUIgZXhpc3RzCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlDQUInLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGluayBvYmplY3QKICAgIG15ICRMaW5rT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyB3aGljaCBhcmUgZGlyZWN0bHkgbGlua2VkIHdpdGggdGhpcyBjaGFuZ2Ugb2JqZWN0CiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgS2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgaW5pdGlhdG9ycyAoY3VzdG9tZXIgdXNlcnMgb2YgbGlua2VkIHRpY2tldHMpCiAgICBteSAkVGlja2V0c1JlZiA9ICRMaW5rTGlzdFdpdGhEYXRhLT57VGlja2V0fSB8fCB7fTsKICAgIG15ICVDaGFuZ2VJbml0aWF0b3JzSUQ7CiAgICBteSAkVGlja2V0Q3VzdG9tZXJVc2VySUQgPSAnJzsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXskVGlja2V0c1JlZn0gKSB7CgogICAgICAgIG15ICRUaWNrZXRSZWYgPSAkVGlja2V0c1JlZi0+eyRMaW5rVHlwZX0tPntTb3VyY2V9OwogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IGtleXMgJXskVGlja2V0UmVmfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGlkIG9mIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFRpY2tldFJlZi0+eyRUaWNrZXRJRH0tPntDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgICRUaWNrZXRDdXN0b21lclVzZXJJRCAgPSAkVGlja2V0UmVmLT57JFRpY2tldElEfS0+e0N1c3RvbWVyVXNlcklEfTsKICAgICAgICAgICAgJENoYW5nZS0+e1RpY2tldFRpdGxlfSA9ICRUaWNrZXRSZWYtPnskVGlja2V0SUR9LT57VGl0bGV9OwogICAgICAgICAgICAkQ2hhbmdlLT57VGlja2V0SUR9ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgIyBpZiBhIGN1c3RvbWVyCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgICAgICRDaGFuZ2VJbml0aWF0b3JzSUR7JEN1c3RvbWVyVXNlcklEfSA9ICdDdXN0b21lclVzZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJE93bmVySUQgPSAkVGlja2V0UmVmLT57JFRpY2tldElEfS0+e093bmVySUR9OwogICAgICAgICAgICAgICAgJENoYW5nZUluaXRpYXRvcnNJRHskT3duZXJJRH0gPSAnVXNlcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluaXRpYXRvcnMgaW5mbwogICAgaWYgKCBrZXlzICVDaGFuZ2VJbml0aWF0b3JzSUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUluaXRpYXRvckV4aXN0cycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ2hhbmdlSW5pdGlhdG9ycyA9ICcnOwogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJUNoYW5nZUluaXRpYXRvcnNJRCApIHsKICAgICAgICBteSAlVXNlcjsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlciBpbmZvIGlmIENJIGlzIGEgY3VzdG9tZXIgdXNlcgogICAgICAgIGlmICggJENoYW5nZUluaXRpYXRvcnNJRHskVXNlcklEfSBlcSAnQ3VzdG9tZXJVc2VyJyApIHsKICAgICAgICAgICAgJVVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgZ2V0IHVzZXIgaW5mbwogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB1c2VyIGluZm8gZXhpc3QKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VJbml0aWF0b3InLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVVzZXJ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENoYW5nZUluaXRpYXRvcnMgLj0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGRhc2ggaWYgbm8gY2hhbmdlIGluaXRpYXRvciBleGlzdHMKICAgIGlmICggISRDaGFuZ2VJbml0aWF0b3JzICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbXB0eUNoYW5nZUluaXRpYXRvcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBkaXNwbGF5IGEgc3RyaW5nIHdpdGggYWxsIGNoYW5nZWluaXRpYXRvcnMKICAgICRDaGFuZ2UtPnsnQ2hhbmdlIEluaXRhdG9ycyd9ID0gJENoYW5nZUluaXRpYXRvcnM7CgogICAgIyBzdG9yZSB0aGUgY29tYmluZWQgbGlua2VkIG9iamVjdHMgZnJvbSBhbGwgd29ya29yZGVycyBvZiB0aGlzIGNoYW5nZQogICAgbXkgJExpbmtMaXN0V2l0aERhdGFDb21iaW5lZFdvcmtPcmRlcnMgPSB7fTsKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewoKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyBvZiB0aGlzIHdvcmtvcmRlcgogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyID0gJExpbmtPYmplY3QtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgIEtleSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIE9CSkVDVDoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyfSApIHsKCiAgICAgICAgICAgICMgb25seSBzaG93IGxpbmtlZCBzZXJ2aWNlcyBhbmQgY29uZmlnIGl0ZW1zIG9mIHdvcmtvcmRlcgogICAgICAgICAgICBpZiAoICRPYmplY3QgbmUgJ1NlcnZpY2UnICYmICRPYmplY3QgbmUgJ0lUU01Db25maWdJdGVtJyApIHsKICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMSU5LVFlQRToKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgRElSRUNUSU9OOgogICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKAogICAgICAgICAgICAgICAgICAgIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgICAgICAgICAgICAgc29ydAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21iaW5lIHRoZSBsaW5rZWQgb2JqZWN0IGRhdGEgZnJvbSBhbGwgd29ya29yZGVycwogICAgICAgICAgICAgICAgICAgICAgICAkTGlua0xpc3RXaXRoRGF0YUNvbWJpbmVkV29ya09yZGVycy0+eyRPYmplY3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+eyRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGNvbWJpbmVkIGxpbmtlZCBvYmplY3RzIGZyb20gd29ya29yZGVyIHRvIGxpbmtlZCBvYmplY3RzIGZyb20gY2hhbmdlIG9iamVjdAogICAgJExpbmtMaXN0V2l0aERhdGEgPSB7CiAgICAgICAgJXskTGlua0xpc3RXaXRoRGF0YX0sCiAgICAgICAgJXskTGlua0xpc3RXaXRoRGF0YUNvbWJpbmVkV29ya09yZGVyc30sCiAgICB9OwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjb252ZXJ0IHRvIEpTT04gc3RyaW5nCiAgICBteSAkQWRkaXRpb25hbExpbmtMaXN0V2l0aERhdGFKU09OU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGFDb21iaW5lZFdvcmtPcmRlcnMsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBsaW5rIHRhYmxlCiAgICBteSAkTGlua1RhYmxlU3RyZyA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhICAgICAgICAgICAgICAgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgQWRkaXRpb25hbExpbmtMaXN0V2l0aERhdGFKU09OID0+ICRBZGRpdGlvbmFsTGlua0xpc3RXaXRoRGF0YUpTT05TdHJpbmcsCiAgICApOwoKICAgICMgb3V0cHV0IHRoZSBsaW5rIHRhYmxlCiAgICBpZiAoJExpbmtUYWJsZVN0cmcpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlJyAuICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkQ2hhbmdlLT57VGlja2V0SUR9ICkgewoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSWZDdXN0b21lcklEJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkQ2hhbmdlLT57VGlja2V0SUR9ICk7CgogICAgICAgICMgY3JlYXRlIGh1bWFuIGFnZQogICAgICAgICRUaWNrZXR7QWdlfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0FnZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwoKICAgICAgICAjIGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICgkVGlja2V0Q3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJExheW91dE9iamVjdC0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIE1heCAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb21NYXhTaXplJyksCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lmVGlja2V0SUQnLAogICAgICAgICAgICBEYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3duZXIgaW5mbwogICAgICAgIG15ICVPd25lckluZm8gPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVPd25lckluZm8gfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50cwogICAgbXkgQEF0dGFjaG1lbnRzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEZpbGVuYW1lIChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBmaWxlCiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudEdldCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgYXR0YWNobWVudCBpbmZvcm1hdGlvbgogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJEF0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIGRvIG5vdCBzaG93IGlubGluZSBhdHRhY2htZW50cyBpbiBhdHRhY2htZW50cyBsaXN0ICh0aGV5IGhhdmUgYSBjb250ZW50IGlkKQogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAjIHNob3cgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGZvciBteSAkSGVpZ2h0U2V0dGluZyAocXcoRGVmYXVsdCBNYXgpKSB7CiAgICAgICAgbXkgJEZ1bGxTZXR0aW5nID0gJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudEhUTUxGaWVsZEhlaWdodCcgLiAkSGVpZ2h0U2V0dGluZzsKICAgICAgICBteSAkVmFsdWUgPSBpbnQoICRDb25maWdPYmplY3QtPkdldCgkRnVsbFNldHRpbmcpIHx8IDAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAkRnVsbFNldHRpbmcsCiAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRGVsZXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVRlbXBsYXRlRGVsZXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNVGVtcGxhdGVEZWxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb24hJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBUZW1wbGF0ZUlECiAgICBteSAkVGVtcGxhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUZW1wbGF0ZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFRlbXBsYXRlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVGVtcGxhdGUgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRGVsZXRlJyApIHsKCiAgICAgICAgbXkgJENvdWxkRGVsZXRlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJENvdWxkRGVsZXRlVGVtcGxhdGUpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gdGVtcGxhdGUgb3ZlcnZpZXcgbWFzaywgd2hlbiB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgd2hlbiBkZWxldGUgZmFpbGVkCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUgJXMhJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgY29udGVudAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlRGVsZXRlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyRUZW1wbGF0ZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBidWlsZCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVEYXRhID0gKAogICAgICAgIEhUTUwgICAgICAgPT4gJE91dHB1dCwKICAgICAgICBEaWFsb2dUeXBlID0+ICdDb25maXJtYXRpb24nLAogICAgKTsKCiAgICAjIHJldHVybiBKU09OLVN0cmluZyBiZWNhdXNlIG9mIEFKQVgtTW9kZQogICAgbXkgJE91dHB1dEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFwlRGF0YSApOwoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRWRpdC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZUVkaXQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01UZW1wbGF0ZUVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb24hJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5lZWRlZCBUZW1wbGF0ZUlECiAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUZW1wbGF0ZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFRlbXBsYXRlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVGVtcGxhdGUgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJUdldFBhcmFtOwoKICAgICMgdXBkYXRlIHRoZSB0ZW1wbGF0ZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZVRlbXBsYXRlJyApIHsKCiAgICAgICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFRlbXBsYXRlTmFtZSBDb21tZW50IFZhbGlkSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHRlbXBsYXRlIG5hbWUKICAgICAgICBteSAkVGVtcGxhdGVOYW1lID0gJEdldFBhcmFte1RlbXBsYXRlTmFtZX0gfHwgJFRlbXBsYXRlLT57TmFtZX07CgogICAgICAgIGlmICgkVGVtcGxhdGVOYW1lKSB7CgogICAgICAgICAgICBteSAkQ291bGRVcGRhdGVUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkVGVtcGxhdGVOYW1lLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSB8fCAkVGVtcGxhdGUtPntWYWxpZElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRDb3VsZFVwZGF0ZVRlbXBsYXRlKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXciLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1dhcyBub3QgYWJsZSB0byB1cGRhdGUgVGVtcGxhdGUgJXMhJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gc3ViYWN0aW9uCiAgICB9CgogICAgIyBmaXggdXAgdGhlIG5hbWUKICAgICRUZW1wbGF0ZS0+e1RlbXBsYXRlTmFtZX0gPSAkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSB8fCAkVGVtcGxhdGUtPntOYW1lfTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiAkVGVtcGxhdGUtPntUZW1wbGF0ZU5hbWV9LAogICAgKTsKCiAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgIG15ICRWYWxpZFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17VmFsaWRJRH0KICAgICAgICAgICAgfHwgJFRlbXBsYXRlLT57VmFsaWRJRH0KICAgICAgICAgICAgfHwgKCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKVswXSwKICAgICAgICBTb3J0ICA9PiAnTnVtZXJpY0tleScsCiAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskVGVtcGxhdGV9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFZhbGlkU2VsZWN0aW9uU3RyaW5nID0+ICRWYWxpZFNlbGVjdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRWRpdENBQi5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUIucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKdXNlIERhdGE6OkR1bXBlcjsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9uIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGFsbCBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoVGVtcGxhdGVJRCBUZW1wbGF0ZUNvbnRlbnQgTmV3Q0FCTWVtYmVyIE5ld0NBQk1lbWJlclNlbGVjdGVkIE5ld0NBQk1lbWJlclR5cGUgQWRkQ0FCTWVtYmVyKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUZW1wbGF0ZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRUZW1wbGF0ZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdUZW1wbGF0ZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkR2V0UGFyYW17VGVtcGxhdGVJRH0gKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBvbiBmaXJzdCBwYWdlIGxvYWQgd2UgZmlsbCB0aGUgdGVtcGxhdGUgY29udGVudCBzdHJpbmcgcGFyYW1ldGVyIGZyb20gdGhlIHRlbXBsYXRlCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgJEdldFBhcmFte1RlbXBsYXRlQ29udGVudH0gPSAkVGVtcGxhdGUtPntDb250ZW50fTsKICAgIH0KCiAgICAjIGRlLXNlcmlhbGl6ZSB0aGUgQ0FCIGNvbnRlbnQKICAgIG15ICRDQUJSZWZlcmVuY2UgPSAkU2VsZi0+X0NBQkRlU2VyaWFsaXplKAogICAgICAgIENvbnRlbnQgPT4gJEdldFBhcmFte1RlbXBsYXRlQ29udGVudH0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgaXMgY2FiIG1lbWJlciBkZWxldGUgcmVxdWVzdGVkCiAgICBteSAlRGVsZXRlTWVtYmVyID0gJFNlbGYtPl9Jc01lbWJlckRlbGV0aW9uKAogICAgICAgIENBQlJlZmVyZW5jZSA9PiAkQ0FCUmVmZXJlbmNlLAogICAgKTsKICAgIGlmICglRGVsZXRlTWVtYmVyKSB7CgogICAgICAgICMgZmluZCB1c2VycyB3aG8gYXJlIHN0aWxsIG1lbWJlciBvZiBDQUIKICAgICAgICBteSAkVHlwZSA9ICREZWxldGVNZW1iZXJ7VHlwZX07CiAgICAgICAgbXkgQFN0aWxsTWVtYmVycyA9IGdyZXAgeyAkXyBuZSAkRGVsZXRlTWVtYmVye0lEfSB9IEB7ICRDQUJSZWZlcmVuY2UtPntDQUJBZGR9LT57JFR5cGV9IH07CgogICAgICAgICMgc3RvcmUgdGhlIHJlbWFpbmluZyBtZW1iZXJzCiAgICAgICAgJENBQlJlZmVyZW5jZS0+e0NBQkFkZH0tPnskVHlwZX0gPSBcQFN0aWxsTWVtYmVyczsKCiAgICAgICAgIyByZXNldCB0aGUgInNhdmUiIHN1YmFjdGlvbiwgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gc2hvdyB0aGUgdXBkYXRlZCBtZW1iZXIgbGlzdAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICcnOwogICAgfQoKICAgICMgc2VydmVyIGVycm9yIGhhc2gsIHRvIHN0b3JlIHRoZSBpdGVtcyB3aXRoIFNlcnZlckVycm9yIGNsYXNzCiAgICBteSAlU2VydmVyRXJyb3I7CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZSBlbnRyaWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgYWRkIGEgQ0FCIG1lbWJlcgogICAgaWYgKCAkR2V0UGFyYW17QWRkQ0FCTWVtYmVyfSAmJiAkR2V0UGFyYW17TmV3Q0FCTWVtYmVyfSApIHsKCiAgICAgICAgIyBhZGQgYSBtZW1iZXIKICAgICAgICBteSAlQ0FCVXBkYXRlSW5mbyA9ICRTZWxmLT5fSXNOZXdDQUJNZW1iZXJPaygKICAgICAgICAgICAgQ0FCUmVmZXJlbmNlID0+ICRDQUJSZWZlcmVuY2UsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGlmIG1lbWJlciBpcyB2YWxpZAogICAgICAgIGlmICglQ0FCVXBkYXRlSW5mbykgewoKICAgICAgICAgICAgIyBhZGQgbmV3IG1lbWJlcgogICAgICAgICAgICAkQ0FCUmVmZXJlbmNlLT57Q0FCQWRkfS0+eyAkR2V0UGFyYW17TmV3Q0FCTWVtYmVyVHlwZX0gfSA9ICRDQUJVcGRhdGVJbmZveyAkR2V0UGFyYW17TmV3Q0FCTWVtYmVyVHlwZX0gfTsKCiAgICAgICAgICAgICMgZG8gbm90IGRpc3BsYXkgYSBuYW1lIGluIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgICAgICAgICAjIGFuZCBkbyBub3Qgc2V0IHZhbHVlcyBpbiBoaWRkZW4gZmllbGRzIGFzIHRoZQogICAgICAgICAgICAjIHVzZXIgd2FzIGFscmVhZHkgYWRkZWQKICAgICAgICAgICAgZGVsZXRlIEBHZXRQYXJhbXtxdyhOZXdDQUJNZW1iZXIgTmV3Q0FCTWVtYmVyU2VsZWN0ZWQgTmV3Q0FCTWVtYmVyVHlwZSl9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiBtZW1iZXIgaXMgaW52YWxpZAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VydmVyRXJyb3J7TmV3Q0FCTWVtYmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgcmVzZXQgdGhlICJzYXZlIiBzdWJhY3Rpb24sIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHNob3cgdGhlIHVwZGF0ZWQgbWVtYmVyIGxpc3QKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnJzsKICAgIH0KCiAgICAjIHNhdmUgdGhlIENBQiB0ZW1wbGF0ZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGVtcGxhdGUKICAgICAgICBteSAkVXBkYXRlU3VjY2VzcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBDb250ZW50ICAgID0+ICRHZXRQYXJhbXtUZW1wbGF0ZUNvbnRlbnR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFVwZGF0ZVN1Y2Nlc3MpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gdGVtcGxhdGUgb3ZlcnZpZXcKICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1dhcyBub3QgYWJsZSB0byB1cGRhdGUgVGVtcGxhdGUgIiVzIiEnLCAkR2V0UGFyYW17VGVtcGxhdGVJRH0gKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBDQUIgY29udGFpbnMgYW55b25lCiAgICBpZiAoIEB7ICRDQUJSZWZlcmVuY2UtPntDQUJBZGR9LT57Q0FCQWdlbnRzfSB9IHx8IEB7ICRDQUJSZWZlcmVuY2UtPntDQUJBZGR9LT57Q0FCQ3VzdG9tZXJzfSB9ICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQ0FCTWVtYmVyVGFibGUnICk7CiAgICB9CgogICAgVVNFUklEOgogICAgZm9yIG15ICRVc2VySUQgKCBAeyAkQ0FCUmVmZXJlbmNlLT57Q0FCQWRkfS0+e0NBQkFnZW50c30gfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgbmV4dCBpZiBubyB1c2VyIGRhdGEgY2FuIGJlIGZvdW5kCiAgICAgICAgbmV4dCBVU0VSSUQgaWYgISVVc2VyRGF0YTsKCiAgICAgICAgIyBkaXNwbGF5IGNhYiBtZW1iZXIgaW5mbwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDQUJNZW1iZXJSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFVzZXJUeXBlICAgICAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgICAgIEludGVybmFsVXNlclR5cGUgPT4gJ0NBQkFnZW50cycsCiAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWxsIGN1c3RvbWVyIG1lbWJlcnMgb2YgQ0FCCiAgICBDVVNUT01FUkxPR0lOOgogICAgZm9yIG15ICRDdXN0b21lckxvZ2luICggQHsgJENBQlJlZmVyZW5jZS0+e0NBQkFkZH0tPntDQUJDdXN0b21lcnN9IH0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyICA9PiAkQ3VzdG9tZXJMb2dpbiwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG5leHQgaWYgbm8gdXNlciBkYXRhIGNhbiBiZSBmb3VuZAogICAgICAgIG5leHQgQ1VTVE9NRVJMT0dJTiBpZiAhJUN1c3RvbWVyVXNlckRhdGE7CgogICAgICAgICMgZGlzcGxheSBjYWIgbWVtYmVyIGluZm8KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ0FCTWVtYmVyUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgICAgICBJbnRlcm5hbFVzZXJUeXBlID0+ICdDQUJDdXN0b21lcnMnLAogICAgICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcmlhbGl6ZSB0aGUgQ0FCIHRvIGJlIHVzZWQgYXMgcGFyYW1ldGVyIGluIGhpZGRlbiBmaWVsZAogICAgJEdldFBhcmFte1RlbXBsYXRlQ29udGVudH0gPSAkU2VsZi0+X0NBQlNlcmlhbGl6ZSgKICAgICAgICBDb250ZW50ID0+ICRDQUJSZWZlcmVuY2UsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmlnYXRpb24KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0IENBQiBUZW1wbGF0ZScpLAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlRWRpdENBQicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRUZW1wbGF0ZX0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVNlcnZlckVycm9yLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0lzTWVtYmVyRGVsZXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRvIG5vdCBkZXRlY3QgZGVsZXRpb24gd2hlbiBubyBzdWJhY3Rpb24gaXMgZ2l2ZW4KICAgIHJldHVybiBpZiAhJFNlbGYtPntTdWJhY3Rpb259OwoKICAgICMgaW5mbyBhYm91dCB3aGF0IHRvIGRlbGV0ZQogICAgbXkgJURlbGV0ZUluZm87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgaWYgKCBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQ0FCTWVtYmVyJyApICkgewogICAgICAgIGlmICggJElEID1+IG17XkNBQkN1c3RvbWVycyguKyl9ICkgewoKICAgICAgICAgICAgIyBzYXZlIGluZm8KICAgICAgICAgICAgJURlbGV0ZUluZm8gPSAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdDQUJDdXN0b21lcnMnLAogICAgICAgICAgICAgICAgSUQgICA9PiAkMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSUQgPX4gbXteQ0FCQWdlbnRzKC4rKX0gKSB7CgogICAgICAgICAgICAjIHNhdmUgaW5mbwogICAgICAgICAgICAlRGVsZXRlSW5mbyA9ICgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NBQkFnZW50cycsCiAgICAgICAgICAgICAgICBJRCAgID0+ICQxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURlbGV0ZUluZm87Cn0KCnN1YiBfSXNOZXdDQUJNZW1iZXJPayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgVGhlIG1lbWJlciBpbmZvIHdpbGwgYmUgcmV0dXJuZWQuCiAgICBteSAlTWVtYmVySW5mbzsKCiAgICAjIENBQkN1c3RvbWVycyBvciBDQUJBZ2VudHM/CiAgICBteSAkTWVtYmVyVHlwZSA9ICRQYXJhbXtOZXdDQUJNZW1iZXJUeXBlfTsKCiAgICAjIG1lbWJlciBsb29rdXAKICAgIG15ICVDdXJyZW50TWVtYmVyTG9va3VwOwoKICAgICMgYW4gYWdlbnQgaXMgcmVxdWVzdGVkIHRvIGJlIGFkZGVkCiAgICBpZiAoICRNZW1iZXJUeXBlIGVxICdDQUJBZ2VudHMnICkgewoKICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17TmV3Q0FCTWVtYmVyU2VsZWN0ZWR9LAogICAgICAgICk7CgogICAgICAgIGlmICglVXNlcikgewoKICAgICAgICAgICAgIyBjaGVjayBjdXJyZW50IHVzZXJzCiAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBAeyAkUGFyYW17Q0FCUmVmZXJlbmNlfS0+e0NBQkFkZH0tPnskTWVtYmVyVHlwZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgaW52YWxpZCB1c2VycyBmcm9tIENBQgogICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyRGF0YXtVc2VySUR9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgaW4gbG9va3VwCiAgICAgICAgICAgICAgICAkQ3VycmVudE1lbWJlckxvb2t1cHskVXNlcklEfSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcGFyZSBpbnB1dCB2YWx1ZSB3aXRoIHVzZXIgZGF0YS4KICAgICAgICAgICAgIyBMb29rIGZvciBleGFjdCBtYXRjaCBhdCBiZWdpbm5pbmcsCiAgICAgICAgICAgICMgYXMgJFVzZXJ7VXNlckxhc3RuYW1lfSBtaWdodCBjb250YWluIGEgdHJhaWxpbmcgJ291dCBvZiBvZmZpY2UnIG5vdGUuCiAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgd29uJ3QgY2F0Y2ggZGVsZXRpb25zIG9mICRQYXJhbXtOZXdDQUJNZW1iZXJ9IGF0IHRoZSBlbmQuCiAgICAgICAgICAgIG15ICRDaGVja1N0cmluZyA9IHNwcmludGYgJyIlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRnVsbG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKICAgICAgICAgICAgaWYgKCBpbmRleCggJENoZWNrU3RyaW5nLCAkUGFyYW17TmV3Q0FCTWVtYmVyfSApID09IDAgKSB7CgogICAgICAgICAgICAgICAgJEN1cnJlbnRNZW1iZXJMb29rdXB7ICRVc2Vye1VzZXJJRH0gfSA9IDE7CgogICAgICAgICAgICAgICAgIyBzYXZlIG1lbWJlciBpbmZvcwogICAgICAgICAgICAgICAgJU1lbWJlckluZm8gPSAoCiAgICAgICAgICAgICAgICAgICAgJE1lbWJlclR5cGUgPT4gWyBzb3J0IGtleXMgJUN1cnJlbnRNZW1iZXJMb29rdXAgXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhbiBjdXN0b21lciBpcyByZXF1ZXN0ZWQgdG8gYmUgYWRkZWQKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIG9iamVjdAogICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgICAgICMgY2hlY2sgY3VycmVudCBjdXN0b21lciB1c2VycwogICAgICAgIENVU1RPTUVSVVNFUjoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlciAoIEB7ICRQYXJhbXtDQUJSZWZlcmVuY2V9LT57Q0FCQWRkfS0+eyRNZW1iZXJUeXBlfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgaW52YWxpZCBjdXN0b21lciB1c2VycyBmcm9tIENBQgogICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUiBpZiAhJUN1c3RvbWVyVXNlckRhdGE7CgogICAgICAgICAgICAjIHN0b3JlIGluIGxvb2t1cAogICAgICAgICAgICAkQ3VycmVudE1lbWJlckxvb2t1cHskQ3VzdG9tZXJVc2VyfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGNhbiBiZSBmb3VuZAogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtOZXdDQUJNZW1iZXJTZWxlY3RlZH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyeyAkUGFyYW17TmV3Q0FCTWVtYmVyU2VsZWN0ZWR9IH0gKSB7CgogICAgICAgICAgICAkQ3VycmVudE1lbWJlckxvb2t1cHsgJFBhcmFte05ld0NBQk1lbWJlclNlbGVjdGVkfSB9ID0gMTsKCiAgICAgICAgICAgICMgc2F2ZSBtZW1iZXIgaW5mb3MKICAgICAgICAgICAgJU1lbWJlckluZm8gPSAoCiAgICAgICAgICAgICAgICAkTWVtYmVyVHlwZSA9PiBbIHNvcnQga2V5cyAlQ3VycmVudE1lbWJlckxvb2t1cCBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJU1lbWJlckluZm87Cn0KCnN1YiBfQ0FCRGVTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENvbnRlbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBQZXJsIGRhdGFzdHJ1Y3R1cmUKICAgIG15ICRWQVIxOwoKICAgIHJldHVybiBpZiAhZXZhbCAiXCRWQVIxID0gJFBhcmFte0NvbnRlbnR9OyAxOyI7ICAgICMjIG5vIGNyaXRpYwoKICAgIHJldHVybiBpZiAhJFZBUjE7CiAgICByZXR1cm4gaWYgcmVmICRWQVIxIG5lICdIQVNIJzsKCiAgICByZXR1cm4gJFZBUjE7Cn0KCnN1YiBfQ0FCU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDb250ZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIGluZGVudGF0aW9uIChzYXZlcyBzcGFjZSkKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgogICAgIyBkbyBub3QgdXNlIGNyb3NzLXJlZmVyZW5jaW5nCiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpEZWVwY29weSA9IDE7CgogICAgIyBzZXJpYWxpemUgdGhlIGRhdGEgKGRvIG5vdCB1c2UgJFZBUjEsIGJ1dCAkVGVtcGxhdGVEYXRhIGZvciBEdW1wZXIgb3V0cHV0KQogICAgbXkgJFNlcmlhbGl6ZWREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RHVtcCggJFBhcmFte0NvbnRlbnR9LCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRWRpdENvbnRlbnQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q29udGVudC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVRlbXBsYXRlRWRpdENvbnRlbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb24hJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBUZW1wbGF0ZUlECiAgICBteSAkVGVtcGxhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUZW1wbGF0ZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFRlbXBsYXRlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVGVtcGxhdGUgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgYSBuZXcgY2hhbmdlIG9yIHdvcmtvcmRlciBzbyBpdCBjYW4gYmUgZWRpdGVkCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0Q29udGVudCcgKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gZXBvY2ggc2Vjb25kcwogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKTsKCiAgICAgICAgIyBnZXQgdXNlciBvYmplY3QKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHByZWZlcmVuY2UgdG8gc2VlIHdoaWNoIHRlbXBsYXRlcyBhcmUgaW4gZWRpdCBieSB0aGUgdXNlcgogICAgICAgIG15ICRUZW1wbGF0ZUVkaXRQcmVmZXJlbmNlU3RyaW5nID0gJFVzZXJQcmVmZXJlbmNlc3tVc2VySVRTTUNoYW5nZU1hbmFnZW1lbnRUZW1wbGF0ZUVkaXR9IHx8ICcnOwoKICAgICAgICAjIGNvbnZlcnQgdG8gbG9va3VwIGhhc2gKICAgICAgICBteSBARWRpdGVkVGVtcGxhdGVzID0gc3BsaXQgbS87LywgJFRlbXBsYXRlRWRpdFByZWZlcmVuY2VTdHJpbmc7CiAgICAgICAgbXkgJU9iamVjdDJUZW1wbGF0ZTsKICAgICAgICBmb3IgbXkgJFN0cmluZyAoQEVkaXRlZFRlbXBsYXRlcykgewogICAgICAgICAgICBteSAoICRPYmplY3QsICRUZW1wbGF0ZSApID0gc3BsaXQgbS86Oi8sICRTdHJpbmc7CiAgICAgICAgICAgICRPYmplY3QyVGVtcGxhdGV7JE9iamVjdH0gPSAkVGVtcGxhdGU7CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYSBjaGFuZ2UgdGVtcGxhdGUKICAgICAgICBpZiAoICRUZW1wbGF0ZS0+e1R5cGV9IGVxICdJVFNNQ2hhbmdlJyApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGNoYW5nZSBiYXNlZCBvbiB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgTW92ZVRpbWVUeXBlICAgID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgd2hlbiBhZGRpbmcgZmFpbGVkCiAgICAgICAgICAgIGlmICggISRDaGFuZ2VJRCApIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1dhcyBub3QgYWJsZSB0byBjcmVhdGUgY2hhbmdlIGZyb20gdGVtcGxhdGUhJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgY2hhbmdlIGlkIHRvIHRlbXBsYXRlIGlkIHJlZmVyZW5jZQogICAgICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyAnQ2hhbmdlSUQnIC4gJENoYW5nZUlEIH0gPSAkVGVtcGxhdGVJRDsKCiAgICAgICAgICAgICMgY29udmVydCB0byBzdHJpbmcKICAgICAgICAgICAgJFRlbXBsYXRlRWRpdFByZWZlcmVuY2VTdHJpbmcgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IGtleXMgJU9iamVjdDJUZW1wbGF0ZSApIHsKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUVkaXRQcmVmZXJlbmNlU3RyaW5nIC49ICRPYmplY3QgLiAnOjonIC4gJE9iamVjdDJUZW1wbGF0ZXskT2JqZWN0fSAuICc7JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcklUU01DaGFuZ2VNYW5hZ2VtZW50VGVtcGxhdGVFZGl0JywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGNoYW5nZSB6b29tIG1hc2ssIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlZGl0IGEgd29ya29yZGVyIHRlbXBsYXRlCiAgICAgICAgZWxzaWYgKCAkVGVtcGxhdGUtPntUeXBlfSBlcSAnSVRTTVdvcmtPcmRlcicgKSB7CgogICAgICAgICAgICAjIGFkZCBhIGR1bW15IGNoYW5nZSwgbmVlZGVkIHRvIGNvbnRhaW4gdGhlIHdvcmtvcmRlcgogICAgICAgICAgICBteSAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEZWZhdWx0Q2hhbmdlVGl0bGV9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gYWRkaW5nIGZhaWxlZAogICAgICAgICAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1dhcyBub3QgYWJsZSB0byBjcmVhdGUgY2hhbmdlIScpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIHdvcmtvcmRlciBiYXNlZCBvbiB0aGUgdGVtcGxhdGUsIGFuZCBhZGQgaXQgdG8gdGhlIGR1bW15IGNoYW5nZQogICAgICAgICAgICBteSAkV29ya09yZGVySUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgTW92ZVRpbWVUeXBlICAgID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgd2hlbiBhZGRpbmcgZmFpbGVkCiAgICAgICAgICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgd2hlbiBhZGRpbmcgZmFpbGVkCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1dhcyBub3QgYWJsZSB0byBjcmVhdGUgd29ya29yZGVyIGZyb20gdGVtcGxhdGUhJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgd29ya29yZGVyIGlkIHRvIHRlbXBsYXRlIGlkIHJlZmVyZW5jZQogICAgICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyAnV29ya09yZGVySUQnIC4gJFdvcmtPcmRlcklEIH0gPSAkVGVtcGxhdGVJRDsKCiAgICAgICAgICAgICMgY29udmVydCB0byBzdHJpbmcKICAgICAgICAgICAgJFRlbXBsYXRlRWRpdFByZWZlcmVuY2VTdHJpbmcgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IGtleXMgJU9iamVjdDJUZW1wbGF0ZSApIHsKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUVkaXRQcmVmZXJlbmNlU3RyaW5nIC49ICRPYmplY3QgLiAnOjonIC4gJE9iamVjdDJUZW1wbGF0ZXskT2JqZWN0fSAuICc7JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcklUU01DaGFuZ2VNYW5hZ2VtZW50VGVtcGxhdGVFZGl0JywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHdvcmtvcmRlciB6b29tIG1hc2ssIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgYSBkaWFsb2cgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IGNoYW5nZSBvciB3b3Jrb3JkZXIgdG8gYmUgZWRpdGVkCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0Q29udGVudFNob3dEaWFsb2cnICkgewoKICAgICAgICAjIHNob3cgdGhlIGVkaXQgY29udGVudCBkaWFsb2cKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRWRpdENvbnRlbnREaWFsb2cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGhlIGNvcnJlY3QgYmxvY2sgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIHR5cGUKICAgICAgICBpZiAoICRUZW1wbGF0ZS0+e1R5cGV9IGVxICdJVFNNQ2hhbmdlJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUZW1wbGF0ZS0+e1R5cGV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgY29udGVudAogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q29udGVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJ1Y3R1cmUKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgSFRNTCAgICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBEaWFsb2dUeXBlID0+ICdDb25maXJtYXRpb24nLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIEpTT04tU3RyaW5nIGJlY2F1c2Ugb2YgQUpBWC1Nb2RlCiAgICAgICAgbXkgJE91dHB1dEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFwlRGF0YSApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldy5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblRlbXBsYXRlcycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgc29ydGluZyBwYXJhbWV0ZXJzCiAgICBteSAkU29ydEJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdUZW1wbGF0ZUlEJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQFNob3dDb2x1bW5zID0gZ3JlcCB7ICRQb3NzaWJsZUNvbHVtbnskX30gfSBrZXlzICVQb3NzaWJsZUNvbHVtbjsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBmaWx0ZXJzCiAgICBteSAlRmlsdGVyczsKCiAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gdGVtcGxhdGUgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpUZW1wbGF0ZVR5cGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIHRlbXBsYXRlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIFRFTVBMQVRFVFlQRToKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlVHlwZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OlRlbXBsYXRlVHlwZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IHRlbXBsYXRlIHR5cGVzCiAgICAgICAgICAgIG5leHQgVEVNUExBVEVUWVBFIGlmICEkVGVtcGxhdGVUeXBlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgdGVtcGxhdGUgdHlwZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBpZAogICAgICAgICAgICBteSAkVGVtcGxhdGVUeXBlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAkVGVtcGxhdGVUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgdGVtcGxhdGUgdHlwZXMKICAgICAgICAgICAgbmV4dCBURU1QTEFURVRZUEUgaWYgISRUZW1wbGF0ZVR5cGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIHdpdGggcGFyYW1zIGZvciB0aGUgc2VhcmNoIG1ldGhvZAogICAgICAgICAgICAkRmlsdGVyc3skVGVtcGxhdGVUeXBlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkVGVtcGxhdGVUeXBlLAogICAgICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyAgICA9PiBbJFRlbXBsYXRlVHlwZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZmlsdGVyIHBhcmFtcwogICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkRmlsdGVyTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCBkZWZhdWx0IGZpbHRlciwgd2hpY2ggc2hvd3MgYWxsIGl0ZW1zCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdJbnZhbGlkIEZpbHRlcjogJXMhJywgJFNlbGYtPntGaWx0ZXJ9ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB0ZW1wbGF0ZXMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJElEc1JlZiA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRoZSBuYXZiYXIgZmlsdGVyCiAgICAgICAgJE5hdkJhckZpbHRlcnsgJEZpbHRlcnN7JEZpbHRlcn0tPntQcmlvfSB9ID0gewogICAgICAgICAgICBDb3VudCAgPT4gJENvdW50LAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyB0aGUgbGlzdAogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICc7T3JkZXJCeT0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnOyc7CiAgICBteSAkTGlua1NvcnQgPSAnRmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICc7JzsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SVRTTVRlbXBsYXRlTGlzdFNob3coCgogICAgICAgIFRlbXBsYXRlSURzID0+ICRJRHNSZWYsCiAgICAgICAgVG90YWwgICAgICAgPT4gc2NhbGFyIEB7JElEc1JlZn0sCiAgICAgICAgRmlsdGVyICAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdPdmVydmlldzogVGVtcGxhdGUnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntOYW1lfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICBPcmRlckJ5ICAgICA9PiAkT3JkZXJCeSwKICAgICAgICBTb3J0QnkgICAgICA9PiAkU29ydEJ5LAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVVzZXJTZWFyY2gucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVXNlclNlYXJjaC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVVzZXJTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OID0gJyc7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHNlYXJjaCB1c2VycwogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgICAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgICAgICMgZ2V0IG5lZWRlZCBwYXJhbXMKICAgICAgICBteSAkU2VhcmNoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rlcm0nICkgICB8fCAnJzsKICAgICAgICBteSAkR3JvdXBzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwcycgKSB8fCAnJzsKICAgICAgICBteSAkTWF4UmVzdWx0cyA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01heFJlc3VsdHMnICkgfHwgMjAgKTsKCiAgICAgICAgIyBnZXQgYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwcwogICAgICAgIG15ICVHcm91cFVzZXJzOwogICAgICAgIGlmICgkR3JvdXBzKSB7CiAgICAgICAgICAgIG15IEBHcm91cE5hbWVzID0gc3BsaXQgLyxccysvLCAkR3JvdXBzOwoKICAgICAgICAgICAgR1JPVVBOQU1FOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoQEdyb3VwTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAjIGFsbG93IHRyYWlsaW5nIGNvbW1hCiAgICAgICAgICAgICAgICBuZXh0IEdST1VQTkFNRSBpZiAhJEdyb3VwTmFtZTsKCiAgICAgICAgICAgICAgICAjIGdldCBncm91cCBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEdyb3VwT2JqZWN0LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEdST1VQTkFNRSBpZiAhJEdyb3VwSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlcnMgaW4gZ3JvdXAKICAgICAgICAgICAgICAgIG15ICVVc2VycyA9ICRHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSBrZXlzICVVc2VyczsKICAgICAgICAgICAgICAgIEBHcm91cFVzZXJze0BVc2VySURzfSA9IEBVc2VySURzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgIyBnZXQgdXNlciBsaXN0CiAgICAgICAgbXkgJVVzZXJMaXN0ID0gJFVzZXJPYmplY3QtPlVzZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkTWF4UmVzdWx0Q291bnQgPSAkTWF4UmVzdWx0czsKCiAgICAgICAgIyB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgc2VudCBhcyByZXNwb25zZQogICAgICAgIG15IEBEYXRhOwoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFVzZXJMaXN0eyRhfSBjbXAgJFVzZXJMaXN0eyRifSB9IGtleXMgJVVzZXJMaXN0ICkgewoKICAgICAgICAgICAgIyBpZiBncm91cHMgYXJlIHJlcXVpcmVkIGFuZCB1c2VyIGlzIG5vdCBtZW1iZXIgb2Ygb25lIG9mIHRoZSBncm91cHMKICAgICAgICAgICAgIyB0aGVuIHNraXAgdGhlIHVzZXIKICAgICAgICAgICAgaWYgKCAkR3JvdXBzICYmICEkR3JvdXBVc2Vyc3skVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRoZSB2YWx1ZXMgaW4gJVVzZXJMaXN0IGFyZSBpbiB0aGUgZm9ybTogJ21tIE1heCBNdXN0ZXJtYW5uJy4KICAgICAgICAgICAgIyBTbyBhc3NlbWJsZSBhIG5lYXRlciBzdHJpbmcgZm9yIGRpc3BsYXkuCiAgICAgICAgICAgICMgKEFjdHVhbGx5IFVzZXJTZWFyY2goKSBjb250YWlucyBjb2RlIGZvciBmb3JtYXRpbmcsIGJ1dCB0aGF0IGlzIHVzdWFsbHkgbm90IGNhbGxlZC4pCiAgICAgICAgICAgIG15ICVVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gJFBhcmFte1ZhbGlkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRVc2VyVmFsdWUgPSBzcHJpbnRmICciJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckZ1bGxuYW1lfSwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJFbWFpbH07CgogICAgICAgICAgICBwdXNoIEBEYXRhLCB7CiAgICAgICAgICAgICAgICBVc2VyS2V5ICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJWYWx1ZSA9PiAkVXNlclZhbHVlLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJE1heFJlc3VsdENvdW50LS07CiAgICAgICAgICAgIGxhc3QgVVNFUklEIGlmICRNYXhSZXN1bHRDb3VudCA8PSAwOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcQERhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFkZC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyQWRkLnBtLHYgMS4zIDIwMTgvMTAvMTggMTY6MTE6MDAgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENoYW5nZUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENoYW5nZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlIChXb3Jrb3JkZXJBZGQgaXMgYSBjaGFuZ2UgYWN0aW9uISkKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyBvbiB0aGUgY2hhbmdlIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259CiAgICAgICAgICAgICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkQ2hhbmdlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoV29ya09yZGVyVGl0bGUgSW5zdHJ1Y3Rpb24gV29ya09yZGVyVHlwZUlEIFdvcmtPcmRlckdyb3VwSUQgUGxhbm5lZEVmZm9ydCBBdHRhY2htZW50VXBsb2FkIEZpbGVJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZyb20gUGFyYW1PYmplY3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0IGFuZCBhZGQgdGhlIHByZWZpeAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbXkgJFBhcmFtTmFtZSA9ICRUaW1lVHlwZSAuICRUaW1lUGFydDsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgIG15ICVWYWxpZGF0aW9uRXJyb3I7CgogICAgIyBnZXQgd29ya29yZGVyIG9iamVjdAogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgYWRkIHRoZSB3b3Jrb3JkZXIKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyB0aGUgdGl0bGUgaXMgcmVxdWlyZWQKICAgICAgICBpZiAoICEkR2V0UGFyYW17V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1dvcmtPcmRlclRpdGxlU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgV29ya09yZGVyVHlwZUlECiAgICAgICAgbXkgJFdvcmtPcmRlclR5cGUgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJEdldFBhcmFte1dvcmtPcmRlclR5cGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFdvcmtPcmRlclR5cGUgKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7V29ya09yZGVyVHlwZUlEU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvZyBvYmplY3QKICAgICAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY29tcGxldGUgdGltZXMgYXJlIHBhc3NlZCBhbmQgYnVpbGQgdGhlIHRpbWUgc3RhbXBzCiAgICAgICAgbXkgJVN5c3RlbVRpbWU7CiAgICAgICAgVElNRVRZUEU6CiAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKICAgICAgICAgICAgZm9yIG15ICRUaW1lUGFydCAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyYW1OYW1lID0gJFRpbWVUeXBlIC4gJFRpbWVQYXJ0OwogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JFBhcmFtTmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFRJTUVUWVBFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRyYW5zZm9ybSB3b3JrIG9yZGVyIHBsYW5uZWQgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgUHJlZml4ID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICAkR2V0UGFyYW17JFRpbWVUeXBlfSA9IHNwcmludGYgJyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTW9udGgnIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdEYXknIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9LAogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTWludXRlJyB9OwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgJFN5c3RlbVRpbWV7JFRpbWVUeXBlfSA9ICRTZWxmLT5fVGltZVN0YW1wMkVwb2NoKCBUaW1lU3RhbXAgPT4gJEdldFBhcmFteyRUaW1lVHlwZX0gKTsKCiAgICAgICAgICAgICMgZG8gbm90IHNhdmUgaWYgdGltZSBpcyBpbnZhbGlkCiAgICAgICAgICAgIGlmICggISRTeXN0ZW1UaW1leyRUaW1lVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkVGltZVR5cGUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHBsYW5uZWQgc3RhcnQgYW5kIGVuZCB0aW1lcwogICAgICAgIGlmICggJFN5c3RlbVRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gJiYgISRTeXN0ZW1UaW1le1BsYW5uZWRFbmRUaW1lfSApIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntQbGFubmVkRW5kVGltZUludmFsaWR9ICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1BsYW5uZWRFbmRUaW1lRXJyb3JUeXBlfSA9ICdHZW5lcmljU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICEkU3lzdGVtVGltZXtQbGFubmVkU3RhcnRUaW1lfSAmJiAkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0gKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7UGxhbm5lZFN0YXJ0VGltZUludmFsaWR9ICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1BsYW5uZWRTdGFydFRpbWVFcnJvclR5cGV9ID0gJ0dlbmVyaWNTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgKCAkU3lzdGVtVGltZXtQbGFubmVkU3RhcnRUaW1lfSAmJiAkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0gKQogICAgICAgICAgICAmJiAoICRTeXN0ZW1UaW1le1BsYW5uZWRFbmRUaW1lfSA8PSAkU3lzdGVtVGltZXtQbGFubmVkU3RhcnRUaW1lfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7UGxhbm5lZFN0YXJ0VGltZUludmFsaWR9ICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1BsYW5uZWRTdGFydFRpbWVFcnJvclR5cGV9ID0gJ0JlZm9yZVRoYW5FbmRUaW1lU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3JtYXQgb2YgcGxhbm5lZCBlZmZvcnQsIGVtcHR5IGlzIGFsbG93ZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbGFubmVkRWZmb3J0fSAhfiBteyBcQSBcZCogKD86IFsuXSBcZHsxLDJ9ICk/IFx6IH14bXMgKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7J1BsYW5uZWRFZmZvcnRJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kCiAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkR2V0UGFyYW17V29ya09yZGVyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtXb3JrT3JkZXJHcm91cElEfSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIGlucHV0IHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCAhJVZhbGlkYXRpb25FcnJvciApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIHRoZSB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICRHZXRQYXJhbXtJbnN0cnVjdGlvbn0sCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICRHZXRQYXJhbXtQbGFubmVkU3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJEdldFBhcmFte1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJEdldFBhcmFte1dvcmtPcmRlclR5cGVJRH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJHcm91cElEID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJHcm91cElEfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgICAgPT4gJEdldFBhcmFte1BsYW5uZWRFZmZvcnR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGRpbmcgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKCRXb3JrT3JkZXJJRCkgewoKICAgICAgICAgICAgICAgICMgbW92ZSBhdHRhY2htZW50cyBmcm9tIGNhY2hlIHRvIHZpcnR1YWwgZnMKICAgICAgICAgICAgICAgIG15IEBDYWNoZWRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQ2FjaGVkQXR0YWNobWVudCAoQENhY2hlZEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAleyRDYWNoZWRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSBmaWxlIGZyb20gY2FjaGUgaWYgbW92ZSB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyByZXdyaXRlIFVSTCBmb3IgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDYWNoZWRBdHRhY2htZW50LT57Q29udGVudElEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGljdHVyZSB1cmwgaW4gdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU2VhcmNoID0gIkFjdGlvbj1QaWN0dXJlVXBsb2FkIC4rIEZvcm1JRD0kU2VsZi0+e0Zvcm1JRH0gLisgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbnRlbnRJRD0kQ2FjaGVkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGljdHVyZSB1cmwgaW4gd29ya29yZGVyIGF0dHRhY2htZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkUmVwbGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkZpbGVuYW1lPSRDYWNoZWRBdHRhY2htZW50LT57RmlsZW5hbWV9O1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIHVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlckRhdGEtPntJbnN0cnVjdGlvbn0gPX4gc3skU2VhcmNofXskUmVwbGFjZX14bXM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJFdvcmtPcmRlckRhdGEtPntJbnN0cnVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBpbmxpbmUgaW1hZ2UgVVJMcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJmb3IgV29ya09yZGVySUQgJyRXb3JrT3JkZXJJRCchIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDYWNoZWRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2Fubm90IG1vdmUgRmlsZSBmcm9tIENhY2hlIHRvIFZpcnR1YWxGUycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIoJHskQ2FjaGVkQXR0YWNobWVudH17RmlsZW5hbWV9KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgICAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVXb3JrT3JkZXJOZXh0TWFza30gfHwgJ0FnZW50SVRTTVdvcmtPcmRlclpvb20nOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBjb3JyZWN0IGlkCiAgICAgICAgICAgICAgICBpZiAoICROZXh0U2NyZWVuIGVxICdBZ2VudElUU01Xb3JrT3JkZXJab29tJyApIHsKICAgICAgICAgICAgICAgICAgICAkTmV4dFNjcmVlbiAuPSAiO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICROZXh0U2NyZWVuIGVxICdBZ2VudElUU01DaGFuZ2Vab29tJyApIHsKICAgICAgICAgICAgICAgICAgICAkTmV4dFNjcmVlbiAuPSAiO0NoYW5nZUlEPSRDaGFuZ2VJRCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPSROZXh0U2NyZWVuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gYWRkaW5nIGZhaWxlZAogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdXYXMgbm90IGFibGUgdG8gYWRkIHdvcmtvcmRlciEnKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgd2FzIGFuIGF0dGFjaG1lbnQgZGVsZXRlIG9yIHVwbG9hZAogICAgIyB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBvdGhlciBmaWVsZHMKICAgIGlmICggJFZhbGlkYXRpb25FcnJvcntBdHRhY2htZW50fSApIHsKICAgICAgICAlVmFsaWRhdGlvbkVycm9yID0gKCk7CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnQWRkJyksCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICk7CgogICAgIyBzZXQgc2VsZWN0ZWQgdHlwZQogICAgbXkgJVNlbGVjdGVkSW5mbyA9ICgKICAgICAgICBEZWZhdWx0ID0+IDEsCiAgICApOwoKICAgIGlmICggJEdldFBhcmFte1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgJVNlbGVjdGVkSW5mbyA9ICggU2VsZWN0ZWQgPT4gJEdldFBhcmFte1dvcmtPcmRlclR5cGVJRH0gKTsKICAgIH0KCiAgICAjIGdldCBXb3JrT3JkZXJUeXBlIGxpc3QKICAgIG15ICRXb3JrT3JkZXJUeXBlTGlzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgJVNlbGVjdGVkSW5mbywKICAgICkgfHwgW107CgogICAgIyBidWlsZCB0aGUgV29ya09yZGVyVHlwZSBkcm9wZG93bgogICAgJEdldFBhcmFte1dvcmtPcmRlclR5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgID0+ICdXb3JrT3JkZXJUeXBlSUQnLAogICAgICAgIERhdGEgID0+ICRXb3JrT3JkZXJUeXBlTGlzdCwKICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgJEdldFBhcmFte0dyb3VwT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICB9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnV29ya09yZGVyR3JvdXBJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJHcm91cElEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZHMgZGVmYXVsdHMgaWYgcGFnZSBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUKICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkcyBkZWZhdWx0cyBpZiBwYWdlIGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBTZXJ2ZXJFcnJvciAgPT4gJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gfHwgJycsCiAgICAgICAgICAgIE1hbmRhdG9yeSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBBSkFYVXBkYXRlICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRIVE1MKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aW1lIHBlcmlvZCB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBHVUkKICAgIG15ICVUaW1lUGVyaW9kID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNV29ya09yZGVyOjpUaW1lUGVyaW9kJykgfTsKCiAgICAjIHNldCB0aGUgdGltZSBzZWxlY3Rpb25zCiAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewoKICAgICAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciAkRGlmZlRpbWUKICAgICAgICAjIFdoZW4gbm8gdGltZSBpcyBnaXZlbiB5ZXQsIHRoZW4gdXNlIHRoZSBjdXJyZW50IHRpbWUgcGx1cyB0aGUgZGlmZnRpbWUKICAgICAgICAjIFdoZW4gYW4gZXhwbGljaXQgdGltZSB3YXMgcmV0cmlldmVkLCAkRGlmZlRpbWUgaXMgbm90IHVzZWQKICAgICAgICBteSAkRGlmZlRpbWUgPSAkVGltZVR5cGUgZXEgJ1BsYW5uZWRTdGFydFRpbWUnID8gMCA6IDYwICogNjA7CgogICAgICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdTZWxlY3Rpb25TdHJpbmcnIH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgPT4gJFRpbWVUeXBlLAogICAgICAgICAgICBEaWZmVGltZSAgICAgICAgICAgID0+ICREaWZmVGltZSwKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAkVGltZVR5cGUgLiAnQ2xhc3MnID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnCiAgICAgICAgICAgICAgICAuICggJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0ludmFsaWQnIH0gfHwgJycgKSwKICAgICAgICAgICAgJVRpbWVQZXJpb2QsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgcGxhbm5lZCB0aW1lcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRUaW1lVHlwZQogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0aW9uRXJyb3J7ICRUaW1lVHlwZSAuICdFcnJvclR5cGUnIH0gfHwgJ0dlbmVyaWNTZXJ2ZXJFcnJvcicgKQogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHBsYW5uZWQgZWZmb3J0IGlmIGl0IGlzIGNvbmZpZ3VyZWQKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UGxhbm5lZEVmZm9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Nob3dQbGFubmVkRWZmb3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQbGFubmVkRWZmb3J0ID0+ICRHZXRQYXJhbXtQbGFubmVkRWZmb3J0fSwKICAgICAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkUGFyYW17QXR0YWNobWVudExpc3R9ID0gXEBBdHRhY2htZW50czsKCiAgICAjIHNob3cgdGhlIGF0dGFjaG1lbnQgdXBsb2FkIGJ1dHRvbgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFVwbG9hZCcsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvciBqYXZhc2NyaXB0CiAgICAjIG9ubHkgaWYgYWN0aXZhdGVkIGFuZCB0aGUgYnJvd3NlciBjYW4gaGFuZGxlIGl0CiAgICAjIG90aGVyd2lzZSBqdXN0IGEgdGV4dGFyZWEgaXMgc2hvd24KICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJBZGQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1RpbWVTdGFtcDJFcG9jaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaW1lU3RhbXAgICAgICA9ICRQYXJhbXtUaW1lU3RhbXB9OwogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFRpbWVTdGFtcCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCkgaWYgJERhdGVUaW1lT2JqZWN0OwogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFkZEZyb21UZW1wbGF0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgbmVlZGVkIENoYW5nZUlECiAgICBteSAkQ2hhbmdlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDaGFuZ2VJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZSAoV29ya29yZGVyQWRkIGlzIGEgY2hhbmdlIGFjdGlvbiEpCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMgb24gdGhlIGNoYW5nZSEnLCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufQogICAgICAgICAgICApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hhbmdlICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRDaGFuZ2VJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIGl0IHJlbG9hZGFibGUKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lICgKICAgICAgICBxdyhNb3ZlVGltZVR5cGUgTW92ZVRpbWVZZWFyIE1vdmVUaW1lTW9udGggTW92ZVRpbWVEYXkgTW92ZVRpbWVIb3VyIE1vdmVUaW1lTWludXRlIFRlbXBsYXRlSUQpCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICBteSAkUGFyYW1OYW1lID0gJ01vdmVUaW1lJyAuICRUaW1lUGFydDsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICBteSAlVmFsaWRhdGlvbkVycm9yOwoKICAgICMgZ2V0IHRlbXBsYXRlIG9iamVjdAogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgIyBjcmVhdGUgd29ya29yZGVyIGZyb20gdGVtcGxhdGUKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVGcm9tVGVtcGxhdGUnICkgewoKICAgICAgICBteSAkTmV3VGltZTsKCiAgICAgICAgIyBjaGVjayB2YWxpZGl0eSBvZiB0aGUgdGltZSB0eXBlCiAgICAgICAgaWYgKAogICAgICAgICAgICAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfQogICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfSBuZSAnUGxhbm5lZFN0YXJ0VGltZScKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9IG5lICdQbGFubmVkRW5kVGltZScKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye01vdmVUaW1lVHlwZUludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIGNvbXBsZXRlbmVzcyBvZiB0aGUgdGltZSBwYXJhbWV0ZXIgbGlzdCwKICAgICAgICAjIG9ubHkgaG91ciBhbmQgbWludXRlIGFyZSBhbGxvd2VkIHRvIGJlICcwJwogICAgICAgIGlmICgKICAgICAgICAgICAgISRHZXRQYXJhbXtNb3ZlVGltZVllYXJ9CiAgICAgICAgICAgIHx8ICEkR2V0UGFyYW17TW92ZVRpbWVNb250aH0KICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZURheX0KICAgICAgICAgICAgfHwgIWRlZmluZWQgJEdldFBhcmFte01vdmVUaW1lSG91cn0KICAgICAgICAgICAgfHwgIWRlZmluZWQgJEdldFBhcmFte01vdmVUaW1lTWludXRlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye01vdmVUaW1lSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN5c3RlbSB0aW1lIGZyb20gdGhlIGlucHV0LCBpZiBpdCBjYW4ndCBiZSBkZXRlcm1pbmVkIHdlIGhhdmUgYSB2YWxpZGF0aW9uIGVycm9yCiAgICAgICAgaWYgKCAhJVZhbGlkYXRpb25FcnJvciApIHsKCiAgICAgICAgICAgICMgdHJhbnNmb3JtIHdvcmsgb3JkZXIgcGxhbm5lZCB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ01vdmVUaW1lJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICBteSAkUGxhbm5lZFRpbWUgPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVEYXl9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9OwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgb2YgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgJE5ld1RpbWUgPSAkU2VsZi0+X1RpbWVTdGFtcDJFcG9jaCgKICAgICAgICAgICAgICAgIFRpbWVTdGFtcCA9PiAkUGxhbm5lZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkTmV3VGltZSApIHsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7TW92ZVRpbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntUZW1wbGF0ZUlEU2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggISVWYWxpZGF0aW9uRXJyb3IgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSB3b3Jrb3JkZXIgYmFzZWQgb24gdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICksCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VGltZUluRXBvY2hlID0+ICROZXdUaW1lLAogICAgICAgICAgICAgICAgTW92ZVRpbWVUeXBlICAgID0+ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB3b3Jrb3JkZXIgY291bGQgbm90IGJlIGNyZWF0ZWQKICAgICAgICAgICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGFkZGluZyBmYWlsZWQKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnV2FzIG5vdCBhYmxlIHRvIGNyZWF0ZSB3b3Jrb3JkZXIgZnJvbSB0ZW1wbGF0ZSEnKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCByZWRpcmVjdCBzY3JlZW4KICAgICAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVXb3JrT3JkZXJOZXh0TWFza30gfHwgJ0FnZW50SVRTTVdvcmtPcmRlclpvb20nOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGNvcnJlY3QgaWQKICAgICAgICAgICAgaWYgKCAkTmV4dFNjcmVlbiBlcSAnQWdlbnRJVFNNV29ya09yZGVyWm9vbScgKSB7CiAgICAgICAgICAgICAgICAkTmV4dFNjcmVlbiAuPSAiO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkTmV4dFNjcmVlbiBlcSAnQWdlbnRJVFNNQ2hhbmdlWm9vbScgKSB7CiAgICAgICAgICAgICAgICAkTmV4dFNjcmVlbiAuPSAiO0NoYW5nZUlEPSRDaGFuZ2VJRCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249JE5leHRTY3JlZW4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHRlbXBsYXRlIGRyb3Bkb3duCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQ29tbWVudExlbmd0aCA9PiAxNSwKICAgICAgICBUZW1wbGF0ZVR5cGUgID0+ICdJVFNNV29ya09yZGVyJywKICAgICk7CiAgICBteSAkVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlbXBsYXRlSUQnLAogICAgICAgIERhdGEgICAgICAgICA9PiAkVGVtcGxhdGVMaXN0LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRWYWxpZGF0aW9uRXJyb3J7VGVtcGxhdGVJRFNlcnZlckVycm9yfSB8fCAnJyApLAogICAgICAgIFRyZWVWaWV3ICAgICA9PiAxLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAjIGJ1aWxkIGRyb3AtZG93biB3aXRoIHRpbWUgdHlwZXMKICAgIG15ICRNb3ZlVGltZVR5cGVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lID0+ICdNb3ZlVGltZVR5cGUnLAogICAgICAgIERhdGEgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ1BsYW5uZWQgU3RhcnQgVGltZScpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdQbGFubmVkRW5kVGltZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ1BsYW5uZWQgRW5kIFRpbWUnKQogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfSB8fCAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRWYWxpZGF0aW9uRXJyb3J7TW92ZVRpbWVUeXBlSW52YWxpZH0gfHwgJycgKSwKICAgICk7CgogICAgIyB0aW1lIHBlcmlvZCB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBHVUkKICAgIG15ICVUaW1lUGVyaW9kID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNV29ya09yZGVyOjpUaW1lUGVyaW9kJykgfTsKCiAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICBteSAkTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFByZWZpeCAgICAgICAgPT4gJ01vdmVUaW1lJywKICAgICAgICBNb3ZlVGltZUNsYXNzID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkVmFsaWRhdGlvbkVycm9ye01vdmVUaW1lSW52YWxpZH0gfHwgJycgKSwKICAgICAgICBWYWxpZGF0ZSAgICAgID0+IDEsCiAgICAgICAgJVRpbWVQZXJpb2QsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0FkZCcpLAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICApOwoKICAgICMgc2V0IHNlbGVjdGVkIHR5cGUKICAgIG15ICVTZWxlY3RlZEluZm8gPSAoCiAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgKTsKCiAgICBpZiAoICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICkgewogICAgICAgICVTZWxlY3RlZEluZm8gPSAoIFNlbGVjdGVkID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICk7CiAgICB9CgogICAgIyBnZXQgV29ya09yZGVyVHlwZSBsaXN0CiAgICBteSAkV29ya09yZGVyVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJUeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICVTZWxlY3RlZEluZm8sCiAgICApIHx8IFtdOwoKICAgICMgYnVpbGQgdGhlIFdvcmtPcmRlclR5cGUgZHJvcGRvd24KICAgICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICA9PiAnV29ya09yZGVyVHlwZUlEJywKICAgICAgICBEYXRhICA9PiAkV29ya09yZGVyVHlwZUxpc3QsCiAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlckFkZEZyb21UZW1wbGF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nICAgICA9PiAkVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZyA9PiAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBNb3ZlVGltZVNlbGVjdGlvblN0cmluZyAgICAgPT4gJE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICAlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1RpbWVTdGFtcDJFcG9jaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0sICkgPSBAXzsKCiAgICBteSAkVGltZVN0YW1wICAgICAgPSAkUGFyYW17VGltZVN0YW1wfTsKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRUaW1lU3RhbXAsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkRGF0ZVRpbWVPYmplY3Q7CgogICAgcmV0dXJuICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFnZW50LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckFnZW50LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVyQWdlbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgb2JqZWN0CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnV29ya09yZGVyICIlcyIgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyBvbiB0aGUgY2hhbmdlIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259CiAgICAgICAgICAgICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVXNlciBVc2VyU2VsZWN0ZWQpKSB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgIG15ICRVc2VyU2VydmVyRXJyb3IgPSAnJzsKCiAgICAjIGhhbmRsZSB0aGUgJ1NhdmUnIHN1YmFjdGlvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIHdvcmtvcmRlciBhZ2VudCBpcyBlbXB0eSBhbmQgbm8gYnV0dG9uIGJ1dCB0aGUgJ1NhdmUnIGJ1dHRvbiBpcyBjbGlja2VkCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1VzZXJ9ICkgewoKICAgICAgICAgICAgIyBzZXR0aW5nIHdvcmtvcmRlciBhZ2VudCB0byBlbXB0eQogICAgICAgICAgICBteSAkQ291bGRVcGRhdGVXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+IHVuZGVmLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlV29ya09yZGVyKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAkU2VsZi0+e0xhc3RXb3JrT3JkZXJWaWV3fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdXYXMgbm90IGFibGUgdG8gc2V0IHRoZSB3b3Jrb3JkZXIgYWdlbnQgb2YgdGhlIHdvcmtvcmRlciAiJXMiIHRvIGVtcHR5IScsCiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0KICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgYSB3b3Jrb3JkZXIgYWdlbnQgaXMgc2VsZWN0ZWQgYW5kIG5vIGJ1dHRvbiBidXQgdGhlICdTYXZlJyBidXR0b24gaXMgY2xpY2tlZAogICAgICAgIGVsc2lmICggJEdldFBhcmFte1VzZXJTZWxlY3RlZH0gKSB7CgogICAgICAgICAgICAjIHdvcmtvcmRlciBhZ2VudCBpcyByZXF1aXJlZCBmb3IgYW4gdXBkYXRlCiAgICAgICAgICAgIG15ICVFcnJvckFsbFJlcXVpcmVkID0gJFNlbGYtPl9DaGVja1dvcmtPcmRlckFnZW50KCVHZXRQYXJhbSk7CgogICAgICAgICAgICAjIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZQogICAgICAgICAgICBpZiAoICElRXJyb3JBbGxSZXF1aXJlZCApIHsKCiAgICAgICAgICAgICAgICBteSAkQ291bGRVcGRhdGVXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgICA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SUQgPT4gJEdldFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICAgICAgVVJMID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9JFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FzIG5vdCBhYmxlIHRvIHVwZGF0ZSB0aGUgd29ya29yZGVyICIlcyIhJywgJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICggJEVycm9yQWxsUmVxdWlyZWR7VXNlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFte1VzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRVc2VyU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgY3VycmVudCB3b3Jrb3JkZXIgYWdlbnQKICAgIGlmICggJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9ICkgewogICAgICAgIG15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJEYXRhe1VzZXJJRH07CiAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSBzcHJpbnRmICciJXMiIDwlcz4nLAogICAgICAgICAgICAkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSwKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgd2hldGhlciBjaGFuZ2Ugd2FzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJXMhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1VzZXJTZWFyY2hJbml0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXRlbUlEID0+ICdVc2VyJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSwKICAgICAgICBUeXBlICA9PiAnU21hbGwnLAogICAgKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVXNlclNlcnZlckVycm9yID0+ICRVc2VyU2VydmVyRXJyb3IsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9DaGVja1dvcmtPcmRlckFnZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBoYXNoIGZvciBlcnJvciBpbmZvCiAgICBteSAlRXJyb3JzOwoKICAgICMgY2hlY2sgd29ya29yZGVyIGFnZW50CiAgICBpZiAoICEkUGFyYW17VXNlcn0gfHwgISRQYXJhbXtVc2VyU2VsZWN0ZWR9ICkgewogICAgICAgICRFcnJvcnN7VXNlcn0gPSAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBhZ2VudCBkYXRhCiAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBpZiB1c2VyIG5vdCBleGlzdHMKICAgICAgICBpZiAoICElVXNlciApIHsKICAgICAgICAgICAgJEVycm9yc3tVc2VyfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjb21wYXJlIGlucHV0IHZhbHVlIHdpdGggdXNlciBkYXRhCiAgICAgICAgICAgIG15ICRDaGVja1N0cmluZyA9IHNwcmludGYgJyIlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRnVsbG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvcgogICAgICAgICAgICBpZiAoICRDaGVja1N0cmluZyBuZSAkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJ9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUVycm9yczsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckRlbGV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJEZWxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBvYmplY3QKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSAkV29ya09yZGVyID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHdvcmtvcmRlciBkZWxldGUgbWFzawogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyBvbiB0aGUgY2hhbmdlIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259CiAgICAgICAgICAgICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnV29ya09yZGVyRGVsZXRlJyApIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlcgogICAgICAgIG15ICRDb3VsZERlbGV0ZVdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ291bGREZWxldGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gY2hhbmdlLCB3aGVuIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JFdvcmtPcmRlci0+e0NoYW5nZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gZGVsZXRlIGZhaWxlZAogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnV2FzIG5vdCBhYmxlIHRvIGRlbGV0ZSB0aGUgd29ya29yZGVyICVzIScsICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNoYW5nZSBpcyBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBmaW5kIENoYW5nZSBmb3IgV29ya09yZGVyICVzIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25kaXRpb24gb2JqZWN0CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKCiAgICAjIGdldCBhZmZlY3RlZCBjb25kaXRpb24gaWRzCiAgICBteSAkQWZmZWN0ZWRDb25kaXRpb25JRHMgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25MaXN0QnlPYmplY3RUeXBlKAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFNlbGVjdG9yICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICBDaGFuZ2VJRCAgID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgc2V0IHRoZSBkaWFsb2cgdHlwZS4gQXMgZGVmYXVsdCwgdGhlIGRpYWxvZyB3aWxsIGhhdmUgMiBidXR0b25zOiBZZXMgYW5kIE5vCiAgICBteSAkRGlhbG9nVHlwZSA9ICdDb25maXJtYXRpb24nOwoKICAgICMgZGlzcGxheSBsaXN0IG9mIGFmZmVjdGVkIGNvbmRpdGlvbnMKICAgIGlmICggQHskQWZmZWN0ZWRDb25kaXRpb25JRHN9ICkgewoKICAgICAgICAjIHNldCB0aGUgZGlhbG9nIHR5cGUgdG8gaGF2ZSBvbmx5IDEgYnV0dG9uOiBPawogICAgICAgICREaWFsb2dUeXBlID0gJ01lc3NhZ2UnOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVySW5Db25kaXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgIENPTkRJVElPTklEOgogICAgICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBAeyRBZmZlY3RlZENvbmRpdGlvbklEc30gKSB7CgogICAgICAgICAgICAjIGdldCBjb25kaXRpb24KICAgICAgICAgICAgbXkgJENvbmRpdGlvbiA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkdldCgKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgY29uZGl0aW9uCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OSUQgaWYgISRDb25kaXRpb247CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckluQ29uZGl0aW9uUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENvbmRpdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9Xb3JrT3JkZXJJbkNvbmRpdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gJFdvcmtPcmRlciwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGNvbnRlbnQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRoZSByZXR1cm5lZCBkYXRhIHN0cnVjdHVyZQogICAgbXkgJURhdGEgPSAoCiAgICAgICAgSFRNTCAgICAgICA9PiAkT3V0cHV0LAogICAgICAgIERpYWxvZ1R5cGUgPT4gJERpYWxvZ1R5cGUsCiAgICApOwoKICAgICMgcmV0dXJuIEpTT04tU3RyaW5nIGJlY2F1c2Ugb2YgQUpBWC1Nb2RlCiAgICBteSAkT3V0cHV0SlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gXCVEYXRhICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0SlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckVkaXQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckVkaXQucG0sdiAxLjMgMjAxOC8xMC8xOCAxNjoxNDozNCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlckVkaXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtkb3JkZXIgb2JqZWN0CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIG9uIHRoZSBjaGFuZ2UhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KFdvcmtPcmRlclRpdGxlIFdvcmtPcmRlckdyb3VwSUQgSW5zdHJ1Y3Rpb24gUGxhbm5lZEVmZm9ydCBBdHRhY2htZW50VXBsb2FkIEZpbGVJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgICMgZ2V0IHRoZSBjaGVja2JveCB2YWx1ZSBhbmQgc3RvcmUgaXQgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgJEdldFBhcmFte01vdmVGb2xsb3dpbmdXb3JrT3JkZXJzfQogICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01vdmVGb2xsb3dpbmdXb3JrT3JkZXJzJyApOwoKICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgaWRzIGZvciB0aGlzIGNoYW5nZQogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZmluZCBvdXQgdGhlIGZvbGxvd2luZyB3b3Jrb3JkZXIgaWRzCiAgICBteSBARm9sbG93aW5nV29ya09yZGVySURzOwogICAgbXkgJE93bldvcmtPcmRlcklERm91bmQ7CiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkT3RoZXJXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc1JlZn0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIG90aGVyIHdvcmtvcmRlciBpZCBpcyB0aGUgb3duIHdvcmtvcmRlciBpZAogICAgICAgIGlmICggJE90aGVyV29ya09yZGVySUQgZXEgJFdvcmtPcmRlcklEICkgewogICAgICAgICAgICAkT3duV29ya09yZGVySURGb3VuZCA9IDE7CiAgICAgICAgICAgIG5leHQgV09SS09SREVSSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB3b3Jrb3JkZXIgaWRzCiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJE93bldvcmtPcmRlcklERm91bmQ7CgogICAgICAgICMgY29sbGVjdCB0aGUgZm9sbG93aW5nIHdvcmtvcmRlciBpZHMKICAgICAgICBwdXNoIEBGb2xsb3dpbmdXb3JrT3JkZXJJRHMsICRPdGhlcldvcmtPcmRlcklEOwogICAgfQoKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZyb20gUGFyYW1PYmplY3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0IGFuZCBhZGQgdGhlIHByZWZpeAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbXkgJFBhcmFtTmFtZSA9ICRUaW1lVHlwZSAuICRUaW1lUGFydDsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgIG15ICVWYWxpZGF0aW9uRXJyb3I7CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgdXBkYXRlIHdvcmtvcmRlcgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHRoZSB0aXRsZSBpcyByZXF1aXJlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7V29ya09yZGVyVGl0bGVTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbG9nIG9iamVjdAogICAgICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgICAgICMgY2hlY2sgd2hldGhlciBjb21wbGV0ZSB0aW1lcyBhcmUgcGFzc2VkIGFuZCBidWlsZCB0aGUgdGltZSBzdGFtcHMKICAgICAgICBteSAlU3lzdGVtVGltZTsKICAgICAgICBUSU1FVFlQRToKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewogICAgICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAkVGltZVR5cGUgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRQYXJhbU5hbWUhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgVElNRVRZUEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdHJhbnNmb3JtIHdvcmsgb3JkZXIgcGxhbm5lZCB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBQcmVmaXggPT4gJFRpbWVUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wCiAgICAgICAgICAgICRHZXRQYXJhbXskVGltZVR5cGV9ID0gc3ByaW50ZiAnJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwJywKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0RheScgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0hvdXInIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH07CgogICAgICAgICAgICAjIHNhbml0eSBjaGVjayB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgICAgICAgICAkU3lzdGVtVGltZXskVGltZVR5cGV9ID0gJFNlbGYtPl9UaW1lU3RhbXAyRXBvY2goCiAgICAgICAgICAgICAgICBUaW1lU3RhbXAgPT4gJEdldFBhcmFteyRUaW1lVHlwZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCBzYXZlIGlmIHRpbWUgaXMgaW52YWxpZAogICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZXskVGltZVR5cGV9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBwbGFubmVkIHN0YXJ0IGFuZCBlbmQgdGltZXMKICAgICAgICBpZiAoICRTeXN0ZW1UaW1le1BsYW5uZWRTdGFydFRpbWV9ICYmICEkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0gKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7UGxhbm5lZEVuZFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntQbGFubmVkRW5kVGltZUVycm9yVHlwZX0gPSAnR2VuZXJpY1NlcnZlckVycm9yJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJFN5c3RlbVRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gJiYgJFN5c3RlbVRpbWV7UGxhbm5lZEVuZFRpbWV9ICkgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1BsYW5uZWRTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntQbGFubmVkU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdHZW5lcmljU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICggJFN5c3RlbVRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gJiYgJFN5c3RlbVRpbWV7UGxhbm5lZEVuZFRpbWV9ICkKICAgICAgICAgICAgJiYgKCAkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0gPD0gJFN5c3RlbVRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9ye1BsYW5uZWRTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntQbGFubmVkU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9ybWF0IG9mIHBsYW5uZWQgZWZmb3J0LCBlbXB0eSBpcyBhbGxvd2VkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17UGxhbm5lZEVmZm9ydH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte1BsYW5uZWRFZmZvcnR9ICF+IG17IFxBIFxkKiAoPzogWy5dIFxkezEsMn0gKT8gXHogfXhtcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeydQbGFubmVkRWZmb3J0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0KICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1dvcmtPcmRlckdyb3VwSUR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17V29ya09yZGVyR3JvdXBJRH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhbGwgcGFzc2VkIGRhdGEgaXMgdmFsaWQKICAgICAgICBpZiAoICElVmFsaWRhdGlvbkVycm9yICkgewogICAgICAgICAgICBteSAkQ291bGRVcGRhdGVXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJEdldFBhcmFte1dvcmtPcmRlclRpdGxlfSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJEdldFBhcmFte0luc3RydWN0aW9ufSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckdyb3VwSUQgPT4gJEdldFBhcmFte1dvcmtPcmRlckdyb3VwSUR9LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAkR2V0UGFyYW17UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICRHZXRQYXJhbXtQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRWZmb3J0ICAgID0+ICRHZXRQYXJhbXtQbGFubmVkRWZmb3J0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgZnJvbSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgYSBsb29rdXAgbG9va3VwIGhhc2ggb2YgdGhlIG5ldyBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgbXkgJU5ld0F0dGFjaG1lbnQ7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAjIGFwcGVuZCBjb250ZW50IGlkIGlmIGF2YWlsYWJsZSAoZm9yIG5ldyBpbmxpbmUgaW1hZ2VzKQogICAgICAgICAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2V5IC49ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgc3RvcmUgYWxsIG9mIHRoZSBuZXcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAgICAgJE5ld0F0dGFjaG1lbnR7JEtleX0gPSAkQXR0YWNobWVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEZJTEVOQU1FOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgY29uc2lkZXIgaW5saW5lIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUxFTkFNRSBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICAjIChubyBjb250ZW50IGlkLCBhcyBleGlzdGluZyBhdHRhY2htZW50cyBkb24ndCBoYXZlIGl0KQogICAgICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAgICAgICAgICMgYXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2gKICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdBdHRhY2htZW50eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJE5ld0F0dGFjaG1lbnR7JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGF0dGFjaG1lbnQgaXMgbm8gbG9uZ2VyIGluIG5ldyBhdHRhY2htZW50cyBoYXNoCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2Vzc2Z1bCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2Vzc2Z1bCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSB0aGUgbmV3IGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggdmFsdWVzICVOZXdBdHRhY2htZW50ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGF0dGFjaG1lbnQgaXMgYW4gaW5saW5lIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICAgICBteSAkSW5saW5lID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCBpdCBpcyBpbmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgJElubGluZSA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlmIHRoaXMgaW5saW5lIGF0dGFjaG1lbnQgaXMgdXNlZCBpbiB0aGUgd29ya29yZGVyIGluc3RydWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURGb3VuZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd29ya29yZGVyIGluc3RydWN0aW9uIGZvciBjb250ZW50IGlkCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0luc3RydWN0aW9ufSA9fiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtcyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvdW5kIHRoZSBjb250ZW50IGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29udGVudElERm91bmQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGtlZXAgdGhpcyBhdHRhY2htZW50LAogICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaXQgd2FzIGRlbGV0ZWQgaW4gdGhlIHJpY2h0IHRleHQgZWRpdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJENvbnRlbnRJREZvdW5kOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJElubGluZTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9OwoKICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIHVwbG9hZCBjYWNoZQogICAgICAgICAgICAgICAgICAgIG15ICRTZWFyY2ggPSAiQWN0aW9uPVBpY3R1cmVVcGxvYWQgLisgRm9ybUlEPSRTZWxmLT57Rm9ybUlEfSAuKyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbnRlbnRJRD0kQXR0YWNobWVudC0+e0NvbnRlbnRJRH0iOwoKICAgICAgICAgICAgICAgICAgICAjIHBpY3R1cmUgdXJsIGluIHdvcmtvcmRlciBhdHR0YWNobWVudAogICAgICAgICAgICAgICAgICAgIG15ICRSZXBsYWNlID0gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7IgogICAgICAgICAgICAgICAgICAgICAgICAuICJGaWxlbmFtZT0kQXR0YWNobWVudC0+e0ZpbGVuYW1lfTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiOwoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgdXJsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0luc3RydWN0aW9ufSA9fiBzeyRTZWFyY2h9eyRSZXBsYWNlfXhtczsKCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJEdldFBhcmFte0luc3RydWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBpbmxpbmUgaW1hZ2UgVVJMcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiZm9yIFdvcmtPcmRlcklEICckV29ya09yZGVySUQnISEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiMgaWYgdGhlcmUgYXJlIGFueSBmb2xsb3dpbmcgd29ya29yZGVycwojIGFuZCBpZiB0aGUgZm9sbG93aW5nIHdvcmtvcmRlcnMgc2hvdWxkIGJlIG1vdmVkLAojIHRoYXQgbWVhbnMgd2Ugd2FudCB0byBrZWVwIHRoZSBkaWZmZXJlbmNlCiMgYmV0d2VlbiB0aGUgcGxhbm5lZCBlbmQgZGF0ZSBvZiB0aGlzIHdvcmtvcmRlciBhbmQgdGhlIHRoZSBwbGFubmVkIHN0YXJ0IGRhdGVzIG9mIEFMTCBMQVRFUiB3b3Jrb3JkZXJzCiAgICAgICAgICAgICAgICBpZiAoIEBGb2xsb3dpbmdXb3JrT3JkZXJJRHMgJiYgJEdldFBhcmFte01vdmVGb2xsb3dpbmdXb3JrT3JkZXJzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHRoZSBPTEQgcGxhbm5lZCBlbmQgdGltZSBvZiB0aGlzIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgICMgaW50byBzeXN0ZW0gdGltZSAoZXBvY2ggc2Vjb25kcykKICAgICAgICAgICAgICAgICAgICBteSAkT2xkUGxhbm5lZEVuZFRpbWVTeXN0ZW1UaW1lID0gJFNlbGYtPl9UaW1lU3RhbXAyRXBvY2goCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTdGFtcCA9PiAkV29ya09yZGVyLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCB0aGUgTkVXIHBsYW5uZWQgZW5kIHRpbWUgb2YgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgICAgICAjIGludG8gc3lzdGVtIHRpbWUgKGVwb2NoIHNlY29uZHMpCiAgICAgICAgICAgICAgICAgICAgbXkgJE5ld1BsYW5uZWRFbmRUaW1lU3lzdGVtVGltZSA9ICRTZWxmLT5fVGltZVN0YW1wMkVwb2NoKAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3RhbXAgPT4gJEdldFBhcmFte1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSB0aW1lCiAgICAgICAgICAgICAgICAgICAgbXkgJERpZmZUaW1lID0gJE5ld1BsYW5uZWRFbmRUaW1lU3lzdGVtVGltZSAtICRPbGRQbGFubmVkRW5kVGltZVN5c3RlbVRpbWU7CgogICAgICAgICAgICAgICAgICAgICMgbW9kaWZ5IGFsbCBmb2xsb3dpbmcgd29ya29yZGVycwogICAgICAgICAgICAgICAgICAgIFdPUktPUkRFUklEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKEBGb2xsb3dpbmdXb3JrT3JkZXJJRHMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSB0aGUgbmV3IHBsYW5uZWQgc3RhcnQgYW5kIGVuZCB0aW1lIGZvciB0aGlzIGZvbGxvd2luZyB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRpbWVEYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCB0aGUgb2xkIHBsYW5uZWQgdGltZXMgb2YgdGhlIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnRvIHN5c3RlbSB0aW1lIChlcG9jaCBzZWNvbmRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVEYXRheyRUaW1lVHlwZX0gPSAkU2VsZi0+X1RpbWVTdGFtcDJFcG9jaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3RhbXAgPT4gJFdvcmtPcmRlci0+eyRUaW1lVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBkaWZmZXJlbmNlIGFuZCBjb252ZXJ0IHRpbWUgdG8gdGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZURhdGF7JFRpbWVUeXBlfSA9ICRTZWxmLT5fRXBvY2gyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVwb2NoID0+ICRUaW1lRGF0YXskVGltZVR5cGV9ICsgJERpZmZUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHdvcmtvcmRlciB3aXRoIHRoZSBuZXcgdGltZXMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVGltZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgaWYgdXBkYXRlIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhcyBub3QgYWJsZSB0byB1cGRhdGUgV29ya09yZGVyICVzIScsICRXb3JrT3JkZXJJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAgICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIHVwZGF0ZSBmYWlsZWQKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdXYXMgbm90IGFibGUgdG8gdXBkYXRlIFdvcmtPcmRlciAlcyEnLCAkV29ya09yZGVySUQgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGRlbGV0ZSBhbGwga2V5cyBmcm9tIEdldFBhcmFtIHdoZW4gaXQgaXMgbm8gU3ViYWN0aW9uCiAgICAgICAgJUdldFBhcmFtID0gKCk7CgogICAgICAgICMgYWxzbyByZXNldCB0aGUgdGltZSBmaWVsZHMKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewoKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyLT57JFRpbWVUeXBlfSApIHsKCiAgICAgICAgICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkV29ya09yZGVyLT57JFRpbWVUeXBlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgcGFyYW1ldGVyIGhhc2ggZm9yIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH0gPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVNJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclSCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTW9udGgnIH0gPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVtJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclWScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50TGlzdCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICk7CgogICAgICAgICMgY29weSBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMgdG8gdXBsb2FkIGNhY2hlCiAgICAgICAgRklMRU5BTUU6CiAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBleGlzdGluZyBhdHRhY2htZW50IGRhdGEKICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90IGNvbnNpZGVyIGlubGluZSBhdHRhY2htZW50cwogICAgICAgICAgICBuZXh0IEZJTEVOQU1FIGlmICRBdHRhY2htZW50RGF0YS0+e1ByZWZlcmVuY2VzfS0+e0NvbnRlbnRJRH07CgogICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50IHRvIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHdoZXRoZXIgY2hhbmdlIHdhcyBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJXMhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgd2FzIGFuIGF0dGFjaG1lbnQgZGVsZXRlIG9yIHVwbG9hZAogICAgIyB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBvdGhlciBmaWVsZHMKICAgIGlmICggJFZhbGlkYXRpb25FcnJvcntBdHRhY2htZW50fSApIHsKICAgICAgICAlVmFsaWRhdGlvbkVycm9yID0gKCk7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICk7CgogICAgJEdldFBhcmFte0dyb3VwT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICB9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnV29ya09yZGVyR3JvdXBJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJHcm91cElEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzIGZyb20gd29ya29yZGVyIGlmIHBhZ2UgaXMgbG9hZGVkIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgPSAkV29ya09yZGVyLT57ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgU2VydmVyRXJyb3IgID0+ICRWYWxpZGF0aW9uRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9IHx8ICcnLAogICAgICAgICAgICBNYW5kYXRvcnkgICAgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgQUpBWFVwZGF0ZSAgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkSFRNTCk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICBteSAlVGltZVBlcmlvZCA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgIyBzZXQgdGhlIHRpbWUgc2VsZWN0aW9ucwogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKCiAgICAgICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgJERpZmZUaW1lCiAgICAgICAgIyBXaGVuIG5vIHRpbWUgaXMgZ2l2ZW4geWV0LCB0aGVuIHVzZSB0aGUgY3VycmVudCB0aW1lIHBsdXMgdGhlIGRpZmZ0aW1lCiAgICAgICAgIyBXaGVuIGFuIGV4cGxpY2l0IHRpbWUgd2FzIHJldHJpZXZlZCwgJERpZmZUaW1lIGlzIG5vdCB1c2VkCiAgICAgICAgbXkgJERpZmZUaW1lID0gJFRpbWVUeXBlIGVxICdQbGFubmVkU3RhcnRUaW1lJyA/IDAgOiA2MCAqIDYwOwoKICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnU2VsZWN0aW9uU3RyaW5nJyB9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICA9PiAkRGlmZlRpbWUsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgJFRpbWVUeXBlIC4gJ0NsYXNzJyA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJwogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0aW9uRXJyb3J7ICRUaW1lVHlwZSAuICdJbnZhbGlkJyB9IHx8ICcnICksCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHNlcnZlciBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHBsYW5uZWQgdGltZXMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkVGltZVR5cGUKICAgICAgICAgICAgICAgIC4gKCAkVmFsaWRhdGlvbkVycm9yeyAkVGltZVR5cGUgLiAnRXJyb3JUeXBlJyB9IHx8ICdHZW5lcmljU2VydmVyRXJyb3InICkKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBwbGFubmVkIGVmZm9ydCBpZiBpdCBpcyBjb25maWd1cmVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1BsYW5uZWRFZmZvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93UGxhbm5lZEVmZm9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGhlIGNoZWNrYm94IGZvciBNb3ZlRm9sbG93aW5nV29ya09yZGVycyBpZiBpdCBpcyBjb25maWd1cmVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e01vdmVGb2xsb3dpbmdXb3JrT3JkZXJzfSApIHsKCiAgICAgICAgIyBzZXQgY2hlY2tib3ggZm9yIE1vdmVGb2xsb3dpbmdXb3JrT3JkZXJzCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TW92ZUZvbGxvd2luZ1dvcmtPcmRlcnN9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17TW92ZUZvbGxvd2luZ1dvcmtPcmRlcnN9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNb3ZlRm9sbG93aW5nV29ya09yZGVycycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSA9IFsKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKQogICAgXTsKCiAgICAjIHNob3cgdGhlIGF0dGFjaG1lbnQgdXBsb2FkIGJ1dHRvbgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFVwbG9hZCcsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvciBqYXZhc2NyaXB0CiAgICAjIG9ubHkgaWYgYWN0aXZhdGVkIGFuZCB0aGUgYnJvd3NlciBjYW4gaGFuZGxlIGl0CiAgICAjIG90aGVyd2lzZSBqdXN0IGEgdGV4dGFyZWEgaXMgc2hvd24KICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJFZGl0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVZhbGlkYXRpb25FcnJvciwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9UaW1lU3RhbXAyRXBvY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtLCApID0gQF87CgogICAgbXkgJFRpbWVTdGFtcCAgICAgID0gJFBhcmFte1RpbWVTdGFtcH07CiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkVGltZVN0YW1wLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSBpZiAkRGF0ZVRpbWVPYmplY3Q7CiAgICByZXR1cm47Cn0KCnN1YiBfRXBvY2gyVGltZVN0YW1wIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSwgKSA9IEBfOwoKICAgIG15ICRFcG9jaCAgICAgICAgICA9ICRQYXJhbXtFcG9jaH07CiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIEVwb2NoID0+ICRFcG9jaCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpIGlmICREYXRlVGltZU9iamVjdDsKICAgIHJldHVybjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgd29ya29yZGVyIGlkCiAgICBteSAkV29ya09yZGVySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBhcyBubyBXb3JrT3JkZXJJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CiAgICBteSAkSGlzdG9yeU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBpbmZvcm1hdGlvbgogICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnV29ya09yZGVyICIlcyIgbm90IGZvdW5kIGluIHRoZSBkYXRhYmFzZSEnLCAkV29ya09yZGVySUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UhJywgJFdvcmtPcmRlci0+e0NoYW5nZUlEfSApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IGVudHJpZXMKICAgIG15ICRIaXN0b3J5RW50cmllc1JlZiA9ICRIaXN0b3J5T2JqZWN0LT5Xb3JrT3JkZXJIaXN0b3J5R2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgZ2V0IG9yZGVyIGRpcmVjdGlvbgogICAgbXkgQEhpc3RvcnlMaW5lcyA9IEB7JEhpc3RvcnlFbnRyaWVzUmVmfTsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyJykgZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBIaXN0b3J5TGluZXMgPSByZXZlcnNlIEB7JEhpc3RvcnlFbnRyaWVzUmVmfTsKICAgIH0KCiAgICAjIG1heCBsZW5ndGggb2Ygc3RyaW5ncwogICAgbXkgJE1heExlbmd0aCA9IDMwOwoKICAgICMgR2V0IHRyYW5zbGF0YWJsZSBoaXN0b3J5IHN0cmluZ3MuCiAgICBteSAlSGlzdG9yeVN0cmluZ3MgPSAkSGlzdG9yeU9iamVjdC0+SGlzdG9yeVN0cmluZ3NMaXN0KCk7CgogICAgIyBjcmVhdGUgdGFibGUKICAgIG15ICRDb3VudGVyID0gMTsKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5IChASGlzdG9yeUxpbmVzKSB7CiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgIyBkYXRhIGZvciBhIHNpbmdsZSByb3csIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBkdGwKICAgICAgICBteSAlRGF0YSA9ICV7JEhpc3RvcnlFbnRyeX07CgogICAgICAgICMgZGV0ZXJtaW5lIHdoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgbXkgJEhpc3RvcnlUeXBlID0gJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfTsKICAgICAgICBpZiAoICRIaXN0b3J5VHlwZSBlcSAnV29ya09yZGVyVXBkYXRlJyApIHsKCiAgICAgICAgICAgICMgVGhlIGRpc3BsYXllZCBmaWVsZG5hbWUgbWlnaHQgYmUgY2hhbmdlZCBpbiB0aGUgZm9sbG93aW5nIGxvb3AKICAgICAgICAgICAgbXkgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9OwoKICAgICAgICAgICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUga2V5cwogICAgICAgICAgICBmb3IgbXkgJENvbnRlbnROZXdPck9sZCAocXcoQ29udGVudE5ldyBDb250ZW50T2xkKSkgewogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIElEIGZpZWxkcywgd2UgcmVwbGFjZSBJRCB3aXRoIGl0cyB0ZXh0dWFsIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBteSAoJFR5cGUpID0gJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gPX4gbXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxBICAgICAgICAgICMgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAjIHN0YXJ0IGNhcHR1cmUgb2YgJFR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSB8IFdvcmtPcmRlclR5cGUgfCBXb3JrT3JkZXJBZ2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgIyBlbmQgY2FwdHVyZSBvZiAkVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgIyBwcm9jZXNzaW5nIG9ubHkgZm9yIHRoZSAnSUQnIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICB9eG1zCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0aW9uTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFR5cGUgZXEgJ1dvcmtPcmRlclN0YXRlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlclR5cGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlckFnZW50JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGxvZ2luIG5hbWVzIGFyZSBub3QgdG8gYmUgdHJhbnNsYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUcmFuc2xhdGlvbk5lZWRlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdVbmtub3duIHR5cGUgIiVzIiBlbmNvdW50ZXJlZCEnLCAkVHlwZSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEUuZy4gdGhlIHVzZXJuYW1lcyBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkVmFsdWUgPSAkVHJhbnNsYXRpb25OZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9IHNwcmludGYgJyVzIChJRD0lcyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUcmFuc2xhdGVkVmFsdWUsICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb250ZW50IGhhcyBjaGFuZ2VkLCBzbyBjaGFuZ2UgdGhlIGRpc3BsYXllZCBmaWVsZG5hbWUgYXMgd2VsbAogICAgICAgICAgICAgICAgICAgICAgICAkRGlzcGxheWVkRmllbGRuYW1lID0gJFR5cGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgSFRNTCBicmVha3Mgd2l0aCBzaW5nbGUgc3BhY2UKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPX4gc3sgPCBiciBccyogLz8gPiB9eyB9eG1zZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgZmllbGRuYW1lIGZvciBkaXNwbGF5CiAgICAgICAgICAgICREaXNwbGF5ZWRGaWVsZG5hbWUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAkRGlzcGxheWVkRmllbGRuYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgSFRNTCB1dGlscyBvYmplY3QKICAgICAgICAgICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKCiAgICAgICAgICAgICMgdHJpbSBzdHJpbmdzIHRvIGEgbWF4IGxlbmd0aCBvZiAkTWF4TGVuZ3RoCiAgICAgICAgICAgIG15ICRDb250ZW50TmV3ID0gJEhUTUxVdGlsc09iamVjdC0+VG9Bc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDb250ZW50T2xkID0gJEhUTUxVdGlsc09iamVjdC0+VG9Bc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSGlzdG9yeUVudHJ5LT57Q29udGVudE9sZH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgWy4uLl0gZm9yIHRvbyBsb25nIHN0cmluZ3MKICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggJENvbnRlbnROZXcsICRDb250ZW50T2xkICkgewogICAgICAgICAgICAgICAgaWYgKCAkQ29udGVudCAmJiAoIGxlbmd0aCAkQ29udGVudCA+ICRNYXhMZW5ndGggKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udGVudCA9IHN1YnN0ciggJENvbnRlbnQsIDAsICRNYXhMZW5ndGggKSAuICdbLi4uXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGRlc2NyaXB0aW9uCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID0gam9pbiAnJSUnLCAkRGlzcGxheWVkRmllbGRuYW1lLCAkQ29udGVudE5ldywgJENvbnRlbnRPbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fTsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSB0ZXh0CiAgICAgICAgaWYgKCAkRGF0YXtDb250ZW50fSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgJSUKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPX4gc3sgXEEgJSUgfXt9eG1zZzsKCiAgICAgICAgICAgICMgc3BsaXQgdGhlIGNvbnRlbnQgYnkgJSUKICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUvLCAkRGF0YXtDb250ZW50fSApOwoKICAgICAgICAgICAgIyBzaG93ICduaWNlJyBvdXRwdXQgd2l0aCB2YXJpYWJsZSBzdWJzdGl0dXRpb24KICAgICAgICAgICAgIyBzYW1wbGUgaW5wdXQ6CiAgICAgICAgICAgICMgQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0FkZCIsICJUaWNrZXQiLCAiMQogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICRIaXN0b3J5U3RyaW5nc3sgJ1dvcmtPcmRlckhpc3Rvcnk6OicgLiAkRGF0YXtIaXN0b3J5VHlwZX0gfSwKICAgICAgICAgICAgICAgIEBWYWx1ZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9fiBzeyAlIHMgfXt9eG1zZzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGEgJ21vcmUgaW5mbycgbGluawogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9CiAgICAgICAgICAgICAgICAmJiBsZW5ndGgoICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSApID4gJE1heExlbmd0aAogICAgICAgICAgICApCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfQogICAgICAgICAgICAgICAgJiYgbGVuZ3RoKCAkSGlzdG9yeUVudHJ5LT57Q29udGVudE9sZH0gKSA+ICRNYXhMZW5ndGgKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzaG93IGhpc3Rvcnl6b29tIGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2hvd0hpc3Rvcnlab29tJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVEYXRhfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZG9uJ3Qgc2hvdyBhIGxpbmsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0hpc3Rvcnlab29tJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93V29ya09yZGVyWm9vbScsCiAgICAgICAgICAgIERhdGEgPT4geyVEYXRhfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ1dvcmtPcmRlciBIaXN0b3J5JyksCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlckhpc3RvcnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgY2hhbmdlIGlkCiAgICBteSAkSGlzdG9yeUVudHJ5SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnSGlzdG9yeUVudHJ5SUQnICk7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEhpc3RvcnlFbnRyeUlEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2hvdyBoaXN0b3J5IHpvb20sIG5vIEhpc3RvcnlFbnRyeUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IGVudHJpZXMKICAgIG15ICRIaXN0b3J5RW50cnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeScpLT5IaXN0b3J5RW50cnlHZXQoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gJEhpc3RvcnlFbnRyeUlELAogICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJEhpc3RvcnlFbnRyeSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0hpc3RvcnkgZW50cnkgIiVzIiBub3QgZm91bmQgaW4gdGhlIGRhdGFiYXNlIScsICRIaXN0b3J5RW50cnlJRAogICAgICAgICAgICApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgb2JqZWN0CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgaW5mb3JtYXRpb24KICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gdGhlIGRhdGFiYXNlIScsICRIaXN0b3J5RW50cnktPntXb3JrT3JkZXJJRH0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRIaXN0b3J5RW50cnktPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NoYW5nZSAiJXMiIG5vdCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UhJywgJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfSApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgZGFzaCAoJy0nKSB3aGVuIHRoZSBmaWVsZCBpcyBlbXB0eQogICAgZm9yIG15ICRGaWVsZCAocXcoQ29udGVudE5ldyBDb250ZW50T2xkKSkgewogICAgICAgICRIaXN0b3J5RW50cnktPnskRmllbGR9IHx8PSAnLSc7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdXb3JrT3JkZXIgSGlzdG9yeSBab29tJyksCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgICV7JEhpc3RvcnlFbnRyeX0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclJlcG9ydC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSAkV29ya09yZGVyID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgdGhpcyBwYWdlIHJlbG9hZGFibGUKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW1OYW1lIChxdyhSZXBvcnQgV29ya09yZGVyU3RhdGVJRCBBY2NvdW50ZWRUaW1lIEF0dGFjaG1lbnRVcGxvYWQgRmlsZUlEKSkgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmcm9tIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdCBhbmQgYWRkIHRoZSBwcmVmaXgKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgYWN0dWFsIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKICAgICAgICAgICAgZm9yIG15ICRUaW1lUGFydCAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgVXNlZCkpIHsKICAgICAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAkVGltZVR5cGUgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBwZXJmb21pbmcgdGhlIHN1YmFjdGlvbiB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgJVZhbGlkYXRpb25FcnJvcjsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgdmFsaWRhdGUgdGhlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgcGFyYW1ldGVycwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QWN0dWFsVGltZVNwYW59ICkgewogICAgICAgICAgICBteSAlU3lzdGVtVGltZTsKICAgICAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CgogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVXNlZCcgfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB3aGVuIHRoZSBidXR0b24gd2FzIG5vdCBjaGVja2VkLCB0aGVuIGNsZWFyIHRoZSB0aW1lCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lVHlwZX0gPSB1bmRlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9CiAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdEYXknIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01pbnV0ZScgfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc2Zvcm0gd29yayBvcmRlciBhY3R1YWwgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAsIHdoZW4gYWxsIHJlcXVpcmVkIHRpbWUgcGFyYW1zIHdlcmUgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lVHlwZX0gPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH07CgogICAgICAgICAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgJFN5c3RlbVRpbWV7JFRpbWVUeXBlfSA9ICRTZWxmLT5fVGltZVN0YW1wMkVwb2NoKAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3RhbXAgPT4gJEdldFBhcmFteyRUaW1lVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3Qgc2F2ZSBpZiB0aW1lIGlzIGludmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZXskVGltZVR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkVGltZVR5cGUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgaXQgd2FzIGluZGljYXRlZCB0aGF0IHRoZSB0aW1lIHNob3VsZCBiZSBzZXQsCiAgICAgICAgICAgICAgICAgICAgIyBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSByZXF1aXJlZCB0aW1lIHBhcmFtcyBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0ludmFsaWQnIH0gICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0Vycm9yVHlwZScgfSA9ICdHZW5lcmljU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCB0aW1lcwogICAgICAgICAgICBpZiAoICRTeXN0ZW1UaW1le0FjdHVhbEVuZFRpbWV9ICYmICEkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntBY3R1YWxTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdTZXRTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCAkU3lzdGVtVGltZXtBY3R1YWxFbmRUaW1lfSAmJiAkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkKICAgICAgICAgICAgICAgICYmICggJFN5c3RlbVRpbWV7QWN0dWFsRW5kVGltZX0gPCAkU3lzdGVtVGltZXtBY3R1YWxTdGFydFRpbWV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcntBY3R1YWxTdGFydFRpbWVJbnZhbGlkfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSA9ICdCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGF0ZSBmb3JtYXQgb2YgYWNjb3VudGVkIHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfQogICAgICAgICAgICAmJiAkR2V0UGFyYW17QWNjb3VudGVkVGltZX0gIX4gbXsgXEEgLT8gXGQqICg/OiBbLl0gXGR7MSwyfSApPyBceiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7J0FjY291bnRlZFRpbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kCiAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvbkVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIGlucHV0IHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCAhJVZhbGlkYXRpb25FcnJvciApIHsKCiAgICAgICAgICAgICMgdGhlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgZmllbGRzIGFyZSBjb25maWd1cmFibGUKICAgICAgICAgICAgbXkgJUFkZGl0aW9uYWxQYXJhbTsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyAkR2V0UGFyYW17JFRpbWVUeXBlfSBpcyBlaXRoZXIgYSB2YWxpZCB0aW1lc3RhbXAgb3IgdW5kZWYKICAgICAgICAgICAgICAgICAgICAkQWRkaXRpb25hbFBhcmFteyRUaW1lVHlwZX0gPSAkR2V0UGFyYW17JFRpbWVUeXBlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHdvcmtvcmRlcgogICAgICAgICAgICBteSAkQ291bGRVcGRhdGVXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgPT4gJEdldFBhcmFte1JlcG9ydH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQWNjb3VudGVkVGltZSAgICA9PiAkR2V0UGFyYW17QWNjb3VudGVkVGltZX0sCiAgICAgICAgICAgICAgICAlQWRkaXRpb25hbFBhcmFtLAogICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgd29ya29yZGVyIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlV29ya09yZGVyKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIGZyb20gdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgbG9va3VwIGxvb2t1cCBoYXNoIG9mIHRoZSBuZXcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIG15ICVOZXdBdHRhY2htZW50OwogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0aGUga2V5IGlzIHRoZSBmaWxlbmFtZSArIGZpbGVzaXplICsgY29udGVudCB0eXBlCiAgICAgICAgICAgICAgICAgICAgbXkgJEtleSA9ICRBdHRhY2htZW50LT57RmlsZW5hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgIyBhcHBlbmQgY29udGVudCBpZCBpZiBhdmFpbGFibGUgKGZvciBuZXcgaW5saW5lIGltYWdlcykKICAgICAgICAgICAgICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtleSAuPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIGFsbCBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgICAgICROZXdBdHRhY2htZW50eyRLZXl9ID0gJEF0dGFjaG1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgYWxsIHJlcG9ydCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICAgICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRoZSBleGlzdGluZyBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgRklMRU5BTUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpbGVuYW1lIChARXhpc3RpbmdBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXJSZXBvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGNvbnNpZGVyIGlubGluZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgICAgIG5leHQgRklMRU5BTUUgaWYgJEF0dGFjaG1lbnREYXRhLT57UHJlZmVyZW5jZXN9LT57Q29udGVudElEfTsKCiAgICAgICAgICAgICAgICAgICAgIyB0aGUga2V5IGlzIHRoZSBmaWxlbmFtZSArIGZpbGVzaXplICsgY29udGVudCB0eXBlCiAgICAgICAgICAgICAgICAgICAgIyAobm8gY29udGVudCBpZCwgYXMgZXhpc3RpbmcgYXR0YWNobWVudHMgZG9uJ3QgaGF2ZSBpdCkKICAgICAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnREYXRhLT57RmlsZXNpemV9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAjIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSBleGlzdGluZywgd2UgY2FuIGRlbGV0ZSBpdCBmcm9tIHRoZSBuZXcgYXR0YWNobWVudCBoYXNoCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmV3QXR0YWNobWVudHskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICROZXdBdHRhY2htZW50eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBleGlzdGluZyBhdHRhY2htZW50IGlzIG5vIGxvbmdlciBpbiBuZXcgYXR0YWNobWVudHMgaGFzaAogICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3NmdWwgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXJSZXBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2Vzc2Z1bCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSB0aGUgbmV3IGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggdmFsdWVzICVOZXdBdHRhY2htZW50ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGF0dGFjaG1lbnQgaXMgYW4gaW5saW5lIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICAgICBteSAkSW5saW5lID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBdHRhY2htZW50LT57Q29udGVudElEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd29ya29yZGVyIHJlcG9ydCBmb3IgY29udGVudCBpZAogICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGtlZXAgdGhpcyBhdHRhY2htZW50LAogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGl0IHdhcyBkZWxldGVkIGluIHRoZSByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkR2V0UGFyYW17UmVwb3J0fSAhfiBteyAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gfXhtczsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCBpdCBpcyBpbmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgJElubGluZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXJSZXBvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpIGlmICEkU3VjY2VzczsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkSW5saW5lOwogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH07CgogICAgICAgICAgICAgICAgICAgICMgcGljdHVyZSB1cmwgaW4gdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaCA9ICJBY3Rpb249UGljdHVyZVVwbG9hZCAuKyBGb3JtSUQ9JFNlbGYtPntGb3JtSUR9IC4rICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29udGVudElEPSRBdHRhY2htZW50LT57Q29udGVudElEfSI7CgogICAgICAgICAgICAgICAgICAgICMgcGljdHVyZSB1cmwgaW4gd29ya29yZGVyIHJlcG9ydCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICAgICAgbXkgJFJlcGxhY2UgPSAiQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDsiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIkZpbGVuYW1lPSRBdHRhY2htZW50LT57RmlsZW5hbWV9O1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRDtUeXBlPVdvcmtPcmRlclJlcG9ydCI7CgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSB1cmwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVwb3J0fSA9fiBzeyRTZWFyY2h9eyRSZXBsYWNlfXhtczsKCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgPT4gJEdldFBhcmFte1JlcG9ydH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIHRoZSBpbmxpbmUgaW1hZ2UgVVJMcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiZm9yIFdvcmtPcmRlcklEICckV29ya09yZGVySUQnISEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAgICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnV2FzIG5vdCBhYmxlIHRvIHVwZGF0ZSBXb3JrT3JkZXIgJXMhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGRlbGV0ZSBhbGwga2V5cyBmcm9tIEdldFBhcmFtIHdoZW4gaXQgaXMgbm8gU3ViYWN0aW9uCiAgICAgICAgJUdldFBhcmFtID0gKCk7CgogICAgICAgICMgaW5pdGlhbGl6ZSB0aGUgYWN0dWFsIHRpbWUgcmVsYXRlZCBmaWVsZHMKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKICAgICAgICAgICAgVElNRVRZUEU6CiAgICAgICAgICAgIGZvciBteSAkVGltZVR5cGUgKHF3KEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewoKICAgICAgICAgICAgICAgIG5leHQgVElNRVRZUEUgaWYgISRXb3JrT3JkZXItPnskVGltZVR5cGV9OwoKICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRXb3JrT3JkZXItPnskVGltZVR5cGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBwYXJhbWV0ZXIgaGFzaCBmb3IgQnVpbGREYXRlU2VsZWN0aW9uKCkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1VzZWQnIH0gICA9IDE7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH0gPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVNJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclSCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTW9udGgnIH0gPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVtJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclWScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgcmVwb3J0IGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBFeGlzdGluZ0F0dGFjaG1lbnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGNvcHkgYWxsIGV4aXN0aW5nIHJlcG9ydCBhdHRhY2htZW50cyB0byB1cGxvYWQgY2FjaGUKICAgICAgICBGSUxFTkFNRToKICAgICAgICBmb3IgbXkgJEZpbGVuYW1lIChARXhpc3RpbmdBdHRhY2htZW50cykgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgQXR0YWNobWVudFR5cGUgPT4gJ1dvcmtPcmRlclJlcG9ydCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCBjb25zaWRlciBpbmxpbmUgYXR0YWNobWVudHMKICAgICAgICAgICAgbmV4dCBGSUxFTkFNRSBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudCB0byB0aGUgdXBsb2FkIGNhY2hlCiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRBdHRhY2htZW50RGF0YS0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudFR5cGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgdGhhdCB0aGUgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgbm8gY2hhbmdlIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJXMhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgd2FzIGFuIGF0dGFjaG1lbnQgZGVsZXRlIG9yIHVwbG9hZAogICAgIyB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBvdGhlciBmaWVsZHMKICAgIGlmICggJFZhbGlkYXRpb25FcnJvcntBdHRhY2htZW50fSApIHsKICAgICAgICAlVmFsaWRhdGlvbkVycm9yID0gKCk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHN0YXRlIGxpc3QKICAgIG15ICRXb3JrT3JkZXJQb3NzaWJsZVN0YXRlcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgYnVpbGQgZHJvcC1kb3duIHdpdGggd29ya29yZGVyIHN0YXRlcwogICAgJFBhcmFte1N0YXRlU2VsZWN0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1dvcmtPcmRlclN0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgc2hvdyBzdGF0ZSBkcm9wZG93bgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMgZnJvbSB3b3Jrb3JkZXIgaWYgcGFnZSBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUKICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICA9ICRXb3JrT3JkZXItPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgPT4gJFZhbGlkYXRpb25FcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gfHwgJycsCiAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRIVE1MKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBhY3R1YWwgdGltZXMgc2hvdWxkIGJlIHNob3duCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKCiAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsRW5kVGltZSBBY3R1YWxTdGFydFRpbWUpKSB7CgogICAgICAgICAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgICAgICAgICBteSAlVGltZVBlcmlvZCA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgICAgIG15ICRUaW1lU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICA9PiAkVGltZVR5cGUsCiAgICAgICAgICAgICAgICAiJHtUaW1lVHlwZX1PcHRpb25hbCIgPT4gMSwKICAgICAgICAgICAgICAgICRUaW1lVHlwZSAuICdDbGFzcycgPT4gJFZhbGlkYXRpb25FcnJvcnsgJFRpbWVUeXBlIC4gJ0ludmFsaWQnIH0gfHwgJycsCiAgICAgICAgICAgICAgICBWYWxpZGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgJVRpbWVQZXJpb2QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgdGltZSBmaWVsZAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFRpbWVUeXBlLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJFRpbWVUeXBlIC4gJ1NlbGVjdGlvblN0cmluZycgPT4gJFRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgc2VydmVyIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgYWN0dWFsIHN0YXJ0IHRpbWUKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0dWFsU3RhcnRUaW1lJwogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0aW9uRXJyb3J7QWN0dWFsU3RhcnRUaW1lRXJyb3JUeXBlfSB8fCAnR2VuZXJpY1NlcnZlckVycm9yJyApCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIHRpbWUgb25seSB3aGVuIGZvcm0gd2FzIHN1Ym1pdHRlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY2NvdW50ZWRUaW1lfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvd0FjY291bnRlZFRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFjY291bnRlZFRpbWUgPT4gJEdldFBhcmFte0FjY291bnRlZFRpbWV9LAogICAgICAgICAgICAgICAgJVZhbGlkYXRpb25FcnJvciwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhY2NvdW50ZWQgdGltZSBvbmx5IHdoZW4gZm9ybSB3YXMgc3VibWl0dGVkCiAgICBteSAkQWNjb3VudGVkVGltZSA9ICcnOwogICAgaWYgKCAkR2V0UGFyYW17QWNjb3VudGVkVGltZX0gKSB7CiAgICAgICAgJEFjY291bnRlZFRpbWUgPSAkR2V0UGFyYW17QWNjb3VudGVkVGltZX07CiAgICB9CgogICAgIyBnZXQgYWxsIHJlcG9ydCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICRQYXJhbXtBdHRhY2htZW50TGlzdH0gPSBbCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICkKICAgIF07CgogICAgIyBzaG93IHRoZSBhdHRhY2htZW50IHVwbG9hZCBidXR0b24KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRVcGxvYWQnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlclJlcG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgIEFjY291bnRlZFRpbWUgPT4gJEFjY291bnRlZFRpbWUsCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1RpbWVTdGFtcDJFcG9jaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0sICkgPSBAXzsKCiAgICBteSAkVGltZVN0YW1wICAgICAgPSAkUGFyYW17VGltZVN0YW1wfTsKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRUaW1lU3RhbXAsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpIGlmICREYXRlVGltZU9iamVjdDsKICAgIHJldHVybjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclRha2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyVGFrZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlclRha2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBvYmplY3QKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSAkV29ya09yZGVyID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICMgcXVlcnkgdGhlIHBlcm1pc3Npb24gbW9kdWxlcyByZWdpc3RlcmVkIGluICdJVFNNV29ya09yZGVyOjpUYWtlUGVybWlzc2lvbicKICAgIG15ICRBY2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBBY3Rpb24gICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFBlcm1pc3Npb25SZWdpc3RyeSA9PiAnSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb24nLAogICAgICAgIFdvcmtPcmRlcklEICAgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdXb3JrT3JkZXJUYWtlJyApIHsKCiAgICAgICAgIyBzZXQgdGhlIGN1cnJlbnQgdXNlciBhcyB0aGUgd29ya29yZGVyIGFnZW50CiAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gd29ya29yZGVyLCB3aGVuIHRoZSB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdXYXMgbm90IGFibGUgdG8gdGFrZSB0aGUgd29ya29yZGVyICVzIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIExvZ2luIG5hbWUgb2YgdGhlIGN1cnJlbnQgd29ya29yZGVyIGFnZW50CiAgICBteSAkV29ya09yZGVyQWdlbnQgPSAnLSc7CiAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSApIHsKICAgICAgICAkV29ya09yZGVyQWdlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IGZpbmQgQ2hhbmdlIGZvciBXb3JrT3JkZXIgJXMhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGNvbnRlbnQKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJUYWtlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIFdvcmtPcmRlckFnZW50ID0+ICRXb3JrT3JkZXJBZ2VudCwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRoZSByZXR1cm5lZCBkYXRhIHN0cnVjdHVyZQogICAgbXkgJURhdGEgPSAoCiAgICAgICAgSFRNTCAgICAgICA9PiAkT3V0cHV0LAogICAgICAgIERpYWxvZ1R5cGUgPT4gJ0NvbmZpcm1hdGlvbicsCiAgICApOwoKICAgICMgcmV0dXJuIEpTT04tU3RyaW5nIGJlY2F1c2Ugb2YgQUpBWC1Nb2RlCiAgICBteSAkT3V0cHV0SlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gXCVEYXRhICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0SlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIExheW91dE9iamVjdCBoYXMgVHJhbnNsYXRpb25PYmplY3QKICAgIGlmICggJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fSApIHsKCiAgICAgICAgIyB0cmFuc2xhdGUgd29ya29yZGVyIHR5cGUKICAgICAgICAkV29ya09yZGVyLT57V29ya09yZGVyVHlwZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJUeXBlfQogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlciApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1dvcmtPcmRlciAiJXMiIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnLCAkV29ya09yZGVySUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQWN0aW9uICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIENoYW5nZUlEICAgID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gKSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KFRlbXBsYXRlTmFtZSBDb21tZW50IFZhbGlkSUQgU3RhdGVSZXNldCBPdmVyd3JpdGVUZW1wbGF0ZSBEZWxldGVXb3JrT3JkZXIpCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgZ2V0IGV4aXN0aW5nIHVzZXIgcHJlZmVyZW5jZXMKICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgcHJlZmVyZW5jZSB0byBzZWUgd2hpY2ggdGVtcGxhdGVzIGFyZSBpbiBlZGl0IGJ5IHRoZSB1c2VyCiAgICBteSAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZyA9ICRVc2VyUHJlZmVyZW5jZXN7VXNlcklUU01DaGFuZ2VNYW5hZ2VtZW50VGVtcGxhdGVFZGl0fSB8fCAnJzsKCiAgICAjIGNvbnZlcnQgdG8gbG9va3VwIGhhc2gKICAgIG15IEBFZGl0ZWRUZW1wbGF0ZXMgPSBzcGxpdCBtLzsvLCAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZzsKICAgIG15ICVPYmplY3QyVGVtcGxhdGU7CiAgICBmb3IgbXkgJFN0cmluZyAoQEVkaXRlZFRlbXBsYXRlcykgewogICAgICAgIG15ICggJE9iamVjdCwgJFRlbXBsYXRlICkgPSBzcGxpdCBtLzo6LywgJFN0cmluZzsKICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyRPYmplY3R9ID0gJFRlbXBsYXRlOwogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGlkIGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkT2JqZWN0MlRlbXBsYXRleyAnV29ya09yZGVySUQnIC4gJFdvcmtPcmRlcklEIH07CgogICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAjIGNoZWNrIGlmIHRoaXMgd29ya29yZGVyIHdhcyBjcmVhdGVkIGJ5IHRoaXMgdXNlciB1c2luZyBhIHRlbXBsYXRlCiAgICBpZiAoJFRlbXBsYXRlSUQpIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZURhdGEpIHsKCiAgICAgICAgICAgICMgb3ZlcndyaXRlIGVtcHR5IHZhbHVlcyB3aXRoIHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJEdldFBhcmFte1RlbXBsYXRlTmFtZX0gfHw9ICRUZW1wbGF0ZURhdGEtPntOYW1lfTsKICAgICAgICAgICAgJEdldFBhcmFte0NvbW1lbnR9ICAgICAgfHw9ICRUZW1wbGF0ZURhdGEtPntDb21tZW50fTsKICAgICAgICAgICAgJEdldFBhcmFte1ZhbGlkSUR9ICAgICAgfHw9ICRUZW1wbGF0ZURhdGEtPntWYWxpZElEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUZW1wbGF0ZUlEID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgcmVxdWlyZWQgZmllbGRzIHRvIGxvb2sgZm9yIGVycm9ycy4KICAgIG15ICVFcnJvcjsKCiAgICAjIGFkZCBhIHRlbXBsYXRlCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1RlbXBsYXRlTmFtZX0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnVGVtcGxhdGVOYW1lSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggISVFcnJvciApIHsKCiAgICAgICAgICAgICMgc2VyaWFsaXplIHRoZSB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJFRlbXBsYXRlQ29udGVudCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgU3RhdGVSZXNldCAgID0+ICRHZXRQYXJhbXtTdGF0ZVJlc2V0fSB8fCAwLAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVDb250ZW50ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHdvcmtvcmRlciAiJXMiIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLicsICRXb3JrT3JkZXJJRAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGlzIHdvcmtvcmRlciB3YXMgY3JlYXRlZCBmcm9tIGEgdGVtcGxhdGUgYW5kIHNob3VsZCBiZSBzYXZlZCBiYWNrCiAgICAgICAgICAgIGlmICggJFRlbXBsYXRlSUQgJiYgJEdldFBhcmFte092ZXJ3cml0ZVRlbXBsYXRlfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVXBkYXRlU3VjY2VzcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRHZXRQYXJhbXtUZW1wbGF0ZU5hbWV9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJEdldFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgPT4gJFRlbXBsYXRlQ29udGVudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCB1cGRhdGUgdGhlIHRlbXBsYXRlICIlcyIuJywgJFRlbXBsYXRlSUQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgc2VyaWFsaXplZCB3b3Jrb3JkZXIgYXMgYSBuZXcgdGVtcGxhdGUKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEdldFBhcmFte1RlbXBsYXRlTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRHZXRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgID0+ICRUZW1wbGF0ZUNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBhZGQgdGhlIHRlbXBsYXRlLicpLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkZWZpbmUgcmVkaXJlY3QgVVJMCiAgICAgICAgICAgIG15ICRSZWRpcmVjdFVSTCA9ICJBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiOwoKICAgICAgICAgICAgIyBpZiB0aGUgb3JpZ2luYWwgY2hhbmdlIGFuZCBhbGwgd29ya29yZGVycyBzaG91bGQgYmUgZGVsZXRlZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWxldGVXb3JrT3JkZXJ9ICkgewoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBjaGFuZ2UgYW5kIGFsbCB3b3Jrb3JkZXJzIChpbmNsdWRpbmcgdGhpcyBvbmUpCiAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIGlmICggISREZWxldGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGRlbGV0ZSBjaGFuZ2UgIiVzIi4nLCAkV29ya09yZGVyLT57Q2hhbmdlSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB1c2VyIHByZWZlcmVuY2UgZW50cnkKICAgICAgICAgICAgICAgIGRlbGV0ZSAkT2JqZWN0MlRlbXBsYXRleyAnV29ya09yZGVySUQnIC4gJFdvcmtPcmRlcklEIH07CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB0ZW1wbGF0ZSBvdmVydmlldwogICAgICAgICAgICAgICAgJFJlZGlyZWN0VVJMID0gJ0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHVzZXIgcHJlZmVyZW5jZSB3aXRoIHRoZSBuZXcgdGVtcGxhdGUgaWQKICAgICAgICAgICAgZWxzaWYgKCAkT2JqZWN0MlRlbXBsYXRleyAnV29ya09yZGVySUQnIC4gJFdvcmtPcmRlcklEIH0gKSB7CiAgICAgICAgICAgICAgICAkT2JqZWN0MlRlbXBsYXRleyAnV29ya09yZGVySUQnIC4gJFdvcmtPcmRlcklEIH0gPSAkVGVtcGxhdGVJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgICAkVGVtcGxhdGVFZGl0UHJlZmVyZW5jZVN0cmluZyA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQga2V5cyAlT2JqZWN0MlRlbXBsYXRlICkgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlRWRpdFByZWZlcmVuY2VTdHJpbmcgLj0gJE9iamVjdCAuICc6OicgLiAkT2JqZWN0MlRlbXBsYXRleyRPYmplY3R9IC4gJzsnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VySVRTTUNoYW5nZU1hbmFnZW1lbnRUZW1wbGF0ZUVkaXQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRUZW1wbGF0ZUVkaXRQcmVmZXJlbmNlU3RyaW5nLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcHVwCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICRSZWRpcmVjdFVSTCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgdGhlIHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIG5vIGNoYW5nZSBmb3VuZAogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBmaW5kIENoYW5nZSBmb3IgV29ya09yZGVyICVzIScsICRXb3JrT3JkZXJJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlJyksCiAgICApOwoKICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgIyBidWlsZCB2YWxpZCBzZWxlY3Rpb24KICAgIG15ICRWYWxpZFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17VmFsaWRJRH0gfHwgKCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKVswXSwKICAgICAgICBTb3J0ICAgICAgID0+ICdOdW1lcmljS2V5JywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcgZm9yIHN0YXRlIHJlc2V0CiAgICBteSAkU3RhdGVSZXNldFNlbGVjdGlvblN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgMSA9PiBUcmFuc2xhdGFibGUoJ1llcycpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnU3RhdGVSZXNldCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17U3RhdGVSZXNldH0gLy8gMSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIHNob3cgZHJvcGRvd25zIG9ubHkgaWYgdGhpcyB3b3Jrb3JkZXIgd2FzIGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlCiAgICBpZiAoJFRlbXBsYXRlSUQpIHsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nIGZvciB0ZW1wbGF0ZSBvdmVyd3JpdGUsIGRlZmF1bHQgaXMgeWVzCiAgICAgICAgbXkgJE92ZXJ3cml0ZVRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiBUcmFuc2xhdGFibGUoJ05vJyksCiAgICAgICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ092ZXJ3cml0ZVRlbXBsYXRlJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17T3ZlcndyaXRlVGVtcGxhdGV9IC8vIDEsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IG92ZXJ3cml0ZSBvcmlnaW5hbCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVyd3JpdGVUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgT3ZlcndyaXRlVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcgPT4gJE92ZXJ3cml0ZVRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZyBmb3IgZGVsZXRlIHdvcmtvcmRlcgogICAgICAgIG15ICREZWxldGVXb3JrT3JkZXJTZWxlY3Rpb25TdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgIDEgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVsZXRlV29ya09yZGVyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17RGVsZXRlV29ya09yZGVyfSAvLyAxLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBkZWxldGUgV29ya09yZGVyIGRyb3Bkb3duCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlbGV0ZVdvcmtPcmRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgRGVsZXRlV29ya09yZGVyU2VsZWN0aW9uU3RyaW5nID0+ICREZWxldGVXb3JrT3JkZXJTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICBWYWxpZFNlbGVjdGlvblN0cmluZyAgICAgID0+ICRWYWxpZFNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgU3RhdGVSZXNldFNlbGVjdGlvblN0cmluZyA9PiAkU3RhdGVSZXNldFNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgJUVycm9yLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclpvb20ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclpvb20ucG0sdiAxLjIgMjAxOC8xMC8xMSAxNDozNDoxMCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlclpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIEFjdGlvbiAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259ICksCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdXb3JrT3JkZXIgIiVzIiBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywgJFdvcmtPcmRlcklEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgY2xlYW4gdGhlIHJpY2ggdGV4dCBmaWVsZHMgZnJvbSBhY3RpdmUgSFRNTCBjb250ZW50CiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoSW5zdHJ1Y3Rpb24gUmVwb3J0KSkgewoKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFdvcmtPcmRlci0+eyRBdHRyaWJ1dGV9OwoKICAgICAgICAjIHJlbW92ZSBhY3RpdmUgaHRtbCBjb250ZW50IChzY3JpcHRzLCBhcHBsZXRzLCBldGMuLi4pCiAgICAgICAgbXkgJVNhZmVDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyAgICAgICA9PiAkV29ya09yZGVyLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgIE5vQXBwbGV0ICAgICA9PiAxLAogICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgICAgIE5vSW50U3JjTG9hZCA9PiAwLAogICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMCwKICAgICAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWtlIHRoZSBzYWZlIGNvbnRlbnQgaWYgbmVjY2Vzc2FyeQogICAgICAgIGlmICggJFNhZmVDb250ZW50e1JlcGxhY2V9ICkgewogICAgICAgICAgICAkV29ya09yZGVyLT57JEF0dHJpYnV0ZX0gPSAkU2FmZUNvbnRlbnR7U3RyaW5nfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGhhbmRsZSBIVE1MVmlldwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0hUTUxWaWV3JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW0KICAgICAgICBteSAkRmllbGQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRmllbGQiICk7CgogICAgICAgICMgbmVlZGVkIHBhcmFtCiAgICAgICAgaWYgKCAhJEZpZWxkICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZGVkIFBhcmFtOiAkRmllbGQhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZXJyb3IgY2hlY2tpbmcKICAgICAgICBpZiAoICRGaWVsZCBuZSAnSW5zdHJ1Y3Rpb24nICYmICRGaWVsZCBuZSAnUmVwb3J0JyApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gZmllbGQ6ICRGaWVsZCEgRmllbGQgbXVzdCBiZSBlaXRoZXIgSW5zdHJ1Y3Rpb24gb3IgUmVwb3J0ISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgRmllbGQgY29udGVudAogICAgICAgIG15ICRGaWVsZENvbnRlbnQgPSAkV29ya09yZGVyLT57JEZpZWxkfTsKCiAgICAgICAgIyBidWlsZCBiYXNlIFVSTCBmb3IgaW4tbGluZSBpbWFnZXMgaWYgbm8gc2Vzc2lvbiBjb29raWVzIGFyZSB1c2VkCiAgICAgICAgbXkgJFNlc3Npb25JRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgICAgICRTZXNzaW9uSUQgPSAnOycgLiAkU2VsZi0+e1Nlc3Npb25OYW1lfSAuICc9JyAuICRTZWxmLT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgJEZpZWxkQ29udGVudCA9fiBzewogICAgICAgICAgICAgICAgKEFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZW5hbWU9Lis7V29ya09yZGVySUQ9XGQrKQogICAgICAgICAgICB9eyQxJFNlc3Npb25JRH1nbXN4OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgSFRNTCB1dGlscyBvYmplY3QKICAgICAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICAgICAjIGRldGVjdCBhbGwgcGxhaW4gdGV4dCBsaW5rcyBhbmQgcHV0IHRoZW0gaW50byBhbiBIVE1MIDxhPiB0YWcKICAgICAgICAkRmllbGRDb250ZW50ID0gJEhUTUxVdGlsc09iamVjdC0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0YXJnZXQ9Il9ibGFuayIgYXR0cmlidXRlIHRvIGFsbCBIVE1MIDxhPiB0YWdzCiAgICAgICAgIyB0aGUgTGlua1F1b3RlIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbgogICAgICAgICRGaWVsZENvbnRlbnQgPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyAgICA9PiAkRmllbGRDb250ZW50LAogICAgICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBuZWVkZWQgSFRNTCBoZWFkZXJzCiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgIFN0cmluZyAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGNvbXBsZXRlIEhUTUwgYXMgYW4gYXR0YWNobWVudAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSBEb3dubG9hZEF0dGFjaG1lbnQKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbGVuYW1lJyApOwogICAgICAgIG15ICRUeXBlICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUeXBlJyApOwogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAkVHlwZSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIExheW91dE9iamVjdCBoYXMgVHJhbnNsYXRpb25PYmplY3QKICAgIGlmICggJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fSApIHsKCiAgICAgICAgIyB0cmFuc2xhdGUgcGFyYW1ldGVyCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoV29ya09yZGVyVHlwZSkpIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHBhcmFtZXRlcgogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkV29ya09yZGVyLT57JFBhcmFtfTsKCiAgICAgICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgICAgICRXb3JrT3JkZXItPnskUGFyYW19ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+eyRQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNlc3Npb24gb2JqZWN0CiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwoKICAgICMgU3RvcmUgTGFzdFdvcmtPcmRlclZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSB3b3Jrb3JkZXIgc3BlY2lmaWMgcGFnZXMKICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RXb3JrT3JkZXJWaWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIFN0b3JlIExhc3RTY3JlZW5PdmVydmlldywgZm9yIGJhY2tsaW5rcyBmcm9tIEFnZW50TGlua09iamVjdAogICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJWaWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIFN0b3JlIExhc3RTY3JlZW5PdmVydmlldywgZm9yIGJhY2tsaW5rcyBmcm9tICdBZ2VudExpbmtPYmplY3QnCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGNoYW5nZSB0aGF0IHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHJ1biB3b3Jrb3JkZXIgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBpdGVtcyBmb3IgbWVudQogICAgICAgIG15ICVNZW51cyAgID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIH07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBjbGFzc2VzCiAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9ICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdQb3BVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudX0tPntNZW51Q2xhc3N9ID0gJ0FzUG9wdXAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdCYWNrJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnSGlzdG9yeUJhY2snOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXIgICAgPT4gJFdvcmtPcmRlciwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICAgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICAgICAgICAgTWVudUlEICAgICAgID0+ICRNZW51LAogICAgICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkQ2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRXb3JrT3JkZXItPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IENyZWF0ZUJ5IHVzZXIgaW5mb3JtYXRpb24KICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckZ1bGxuYW1lKSkgewogICAgICAgICRXb3JrT3JkZXItPnsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBDaGFuZ2VCeSB1c2VyIGluZm9ybWF0aW9uCiAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJGdWxsbmFtZSkpIHsKICAgICAgICAkV29ya09yZGVyLT57ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsdWVzIG9yIGRhc2ggKCctJykKICAgIGZvciBteSAkQmxvY2tOYW1lICgKICAgICAgICBxdyhXb3JrT3JkZXJUeXBlIFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFdvcmtPcmRlci0+eyRCbG9ja05hbWV9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICRCbG9ja05hbWUgPT4gJFdvcmtPcmRlci0+eyRCbG9ja05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHknIC4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGNvbmZpZ3VyYWJsZSBibG9ja3MKICAgIEJMT0NLTkFNRToKICAgIGZvciBteSAkQmxvY2tOYW1lIChxdyhQbGFubmVkRWZmb3J0IEFjY291bnRlZFRpbWUpKSB7CgogICAgICAgICMgc2tpcCBpZiBibG9jayBpcyBzd2l0Y2hlZCBvZmYgaW4gU3lzQ29uZmlnCiAgICAgICAgbmV4dCBCTE9DS05BTUUgaWYgISRTZWxmLT57Q29uZmlnfS0+eyRCbG9ja05hbWV9OwoKICAgICAgICAjIHNob3cgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvdycgLiAkQmxvY2tOYW1lLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB2YWx1ZSBvciBkYXNoCiAgICAgICAgaWYgKCAkV29ya09yZGVyLT57JEJsb2NrTmFtZX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJEJsb2NrTmFtZSA9PiAkV29ya09yZGVyLT57JEJsb2NrTmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFbXB0eScgLiAkQmxvY2tOYW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAxMDAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGVtcHR5IHZhbHVlcwogICAgICAgIGlmICggISRWYWx1ZVN0cmctPntWYWx1ZX0gKSB7CiAgICAgICAgICAgICRWYWx1ZVN0cmctPntWYWx1ZX0gPSAnLSc7CiAgICAgICAgfQoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGVsZW1lbnQKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dHB1dCBub24gbGluayBlbGVtZW50CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgYnVpbGRlciB1c2VyCiAgICBteSAlQ2hhbmdlQnVpbGRlclVzZXI7CiAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ICkgewogICAgICAgICVDaGFuZ2VCdWlsZGVyVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBidWlsZGVyIGluZm9ybWF0aW9uCiAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJGdWxsbmFtZSkpIHsKICAgICAgICAkV29ya09yZGVyLT57ICdDaGFuZ2VCdWlsZGVyJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlQnVpbGRlclVzZXJ7JFBvc3RmaXh9IHx8ICcnOwogICAgfQoKICAgICMgb3V0cHV0IGNoYW5nZSBidWlsZGVyIGJsb2NrCiAgICBpZiAoJUNoYW5nZUJ1aWxkZXJVc2VyKSB7CgogICAgICAgICMgc2hvdyBuYW1lIGFuZCBtYWlsIGFkZHJlc3MgaWYgdXNlciBleGlzdHMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlQnVpbGRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgc2hvdyBkYXNoIGlmIG5vIGNoYW5nZSBidWlsZGVyIGV4aXN0cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbXB0eUNoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGFnZW50IHVzZXIKICAgIGlmICggJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9ICkgewogICAgICAgIG15ICVXb3JrT3JkZXJBZ2VudFVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICglV29ya09yZGVyQWdlbnRVc2VyKSB7CgogICAgICAgICAgICAjIGdldCBXb3JrT3JkZXJBZ2VudCBpbmZvcm1hdGlvbgogICAgICAgICAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJGdWxsbmFtZSkpIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPnsgJ1dvcmtPcmRlckFnZW50JyAuICRQb3N0Zml4IH0gPSAkV29ya09yZGVyQWdlbnRVc2VyeyRQb3N0Zml4fSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgV29ya09yZGVyQWdlbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgaWYgbm8gV29ya09yZGVyQWdlbnQgaXMgZm91bmQKICAgIGlmICggISRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudFVzZXJGdWxsbmFtZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0VtcHR5V29ya09yZGVyQWdlbnQnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGdyb3VwCiAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJHcm91cElEfSApIHsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJEdyb3VwICAgICAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyR3JvdXBJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFdvcmtPcmRlci0+e1dvcmtPcmRlckdyb3VwfSA9ICRHcm91cDsKCiAgICAgICAgIyBvdXRwdXQgV29ya09yZGVyR3JvdXAgaW5mb3JtYXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyR3JvdXAnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBpZiBubyBXb3JrT3JkZXJHcm91cCBpcyBmb3VuZAogICAgaWYgKCAhJFdvcmtPcmRlci0+e1dvcmtPcmRlckdyb3VwSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbXB0eVdvcmtPcmRlckdyb3VwJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFnZW50cyBwcmVmZXJlbmNlcwogICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHJlbWVtYmVyIGlmIHVzZXIgYWxyZWFkeSBjbG9zZWQgbWVzc2FnZSBhYm91dCBsaW5rcyBpbiBpZnJhbWVzCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckFnZW50RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBtZXNzYWdlIGFib3V0IGxpbmtzIGluIGlmcmFtZXMsIGlmIHVzZXIgZGlkbid0IGNsb3NlIGl0IGFscmVhZHkKICAgIGlmICggISRTZWxmLT57RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnJvd3NlckxpbmtNZXNzYWdlJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNlY3VyaXR5IHJlc3RyaWN0aW9uIHNldHRpbmcgZm9yIGlmcmFtZXMKICAgICMgc2VjdXJpdHk9InJlc3RyaWN0ZWQiIG1heSBicmVhayBTU08gLSBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpZiByZXF1ZXN0ZWQKICAgIG15ICRNU1NlY3VyaXR5UmVzdHJpY3RlZDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdEaXNhYmxlTVNJRnJhbWVTZWN1cml0eVJlc3RyaWN0ZWQnKSApIHsKICAgICAgICAkUGFyYW17TVNTZWN1cml0eVJlc3RyaWN0ZWR9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17TVNTZWN1cml0eVJlc3RyaWN0ZWR9ID0gJ3NlY3VyaXR5PSJyZXN0cmljdGVkIic7CiAgICB9CgogICAgIyBzaG93IHRoZSBIVE1MIGZpZWxkIGJsb2NrcyBhcyBpZnJhbWVzCiAgICBmb3IgbXkgJEZpZWxkIChxdyhJbnN0cnVjdGlvbiBSZXBvcnQpKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJVFNNQ29udGVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgICAgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgRmllbGQgICAgICAgICAgICAgICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgTVNTZWN1cml0eVJlc3RyaWN0ZWQgPT4gJE1TU2VjdXJpdHlSZXN0cmljdGVkLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIEtleSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0YWJsZSB2aWV3IG1vZGUKICAgIG15ICRMaW5rVGFibGVWaWV3TW9kZSA9ICRDb25maWdPYmplY3QtPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkTGF5b3V0T2JqZWN0LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhdHRhY2htZW50cwogICAgbXkgQEF0dGFjaG1lbnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEZpbGVuYW1lIChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBmaWxlCiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgYXR0YWNobWVudCBpbmZvcm1hdGlvbgogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJEF0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIGRvIG5vdCBzaG93IGlubGluZSBhdHRhY2htZW50cyBpbiBhdHRhY2htZW50cyBsaXN0ICh0aGV5IGhhdmUgYSBjb250ZW50IGlkKQogICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkQXR0YWNobWVudERhdGEtPntQcmVmZXJlbmNlc30tPntDb250ZW50SUR9OwoKICAgICAgICAjIHNob3cgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHJlcG9ydCBhdHRhY2htZW50cwogICAgbXkgQFJlcG9ydEF0dGFjaG1lbnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgKTsKCiAgICAjIHNob3cgcmVwb3J0IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRGaWxlbmFtZSAoQFJlcG9ydEF0dGFjaG1lbnRzKSB7CgogICAgICAgICMgZ2V0IGluZm8gYWJvdXQgZmlsZQogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAnV29ya09yZGVyUmVwb3J0JywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBhdHRhY2htZW50IGluZm9ybWF0aW9uCiAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICEkQXR0YWNobWVudERhdGE7CgogICAgICAgICMgZG8gbm90IHNob3cgaW5saW5lIGF0dGFjaG1lbnRzIGluIGF0dGFjaG1lbnRzIGxpc3QgKHRoZXkgaGF2ZSBhIGNvbnRlbnQgaWQpCiAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICRBdHRhY2htZW50RGF0YS0+e1ByZWZlcmVuY2VzfS0+e0NvbnRlbnRJRH07CgogICAgICAgICMgc2hvdyBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXBvcnRBdHRhY2htZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgZm9yIG15ICRIZWlnaHRTZXR0aW5nIChxdyhEZWZhdWx0IE1heCkpIHsKICAgICAgICBteSAkRnVsbFNldHRpbmcgPSAnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0JyAuICRIZWlnaHRTZXR0aW5nOwogICAgICAgIG15ICRWYWx1ZSA9IGludCggJENvbmZpZ09iamVjdC0+R2V0KCRGdWxsU2V0dGluZykgfHwgMCApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICRGdWxsU2V0dGluZywKICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVyWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UmVxdWVzdC5wbSAtIHRvIGhhbmRsZSBjdXN0b21lciBtZXNzYWdlcwojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRSZXF1ZXN0LnBtLHYgMS4yIDIwMTkvMDUvMjAgMTQ6Mzg6MjIgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFJlcXVlc3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfQogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoIFN1YmplY3QgQm9keSBQcmlvcml0eUlEIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kIERlc3QgRnJvbUNoYXRJRCBSZXF1ZXN0SUQgUmVxdWVzdEZvcm1JRHMgUmVxdWVzdEZvcm1CbG9ja0lEcyBCb2R5QWx0KQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwogICAgJEFDTENvbXBhdEdldFBhcmFte093bmVySUR9ID0gJEdldFBhcmFte05ld1VzZXJJRH07CgogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQmFja2VuZE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRUeXBlT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKICAgIG15ICRSZXF1ZXN0T2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3QnKTsKICAgIG15ICRSZXF1ZXN0RmllbGRzT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGaWVsZHMnKTsKICAgIG15ICRSZXF1ZXN0Rm9ybU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtJyk7CiAgICBteSAkVGlja2V0UmVxdWVzdE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRSZXF1ZXN0Jyk7CiAgICBteSAkVGltZU9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CiAgICBteSAkTGlua09iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJFVzZXJPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkU2VuZG1haWxPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgbXkgJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdEZvcm1CbG9jaycpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRHZXRQYXJhbXtCb2R5QWx0fTsKICAgIH0KCiAgICBteSAkSWZOb1ZhbGlkID0gMDsKCiAgICBteSAlUmVxdWVzdCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0R2V0KAogICAgICAgIFJlcXVlc3RJRCA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICk7CgogICAgaWYgKCAkUmVxdWVzdHtTdWJqZWN0fSApIHsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkUmVxdWVzdHtTdWJqZWN0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICJObyBzdWJqZWN0IHlldCI7CiAgICB9CgogICAgaWYgKCAhJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgIGlmICggJFJlcXVlc3R7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgJElmTm9WYWxpZCsrOwogICAgICAgIH0KCiAgICAgICAgbXkgJFF1ZXVlTmFtZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFJlcXVlc3R7UXVldWV9LAogICAgICAgICk7CiAgICAgICAgJEdldFBhcmFte0Rlc3R9ID0gIiRSZXF1ZXN0e1F1ZXVlfXx8JFF1ZXVlTmFtZSI7CiAgICAgICAgJFBhcmFte0Rlc3R9ICAgID0gIiRSZXF1ZXN0e1F1ZXVlfXx8JFF1ZXVlTmFtZSI7CiAgICB9CgogICAgbXkgJUN1c3RvbWVyRGF0YTsKCiAgICBpZiAoICRJZk5vVmFsaWQgPj0gMSApIHsKCiAgICAgICAgbXkgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRTZWxmLT5fTWFza05ld05vVmFsaWQoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRHN9ICkgewogICAgICAgIG15IEBSZXF1ZXN0Rm9ybUlEQXJyYXkgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRHN9ICk7CiAgICAgICAgZm9yIG15ICROZXdWYWx1ZXMgKEBSZXF1ZXN0Rm9ybUlEQXJyYXkpIHsKICAgICAgICAgICAgbXkgQEZlbGRDaGVjayA9IHNwbGl0KCAvLS8sICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZlbGRDaGVja1sxXQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRGZWxkQ2hlY2tbMV0gIX4gL1thLXpdL2lnCiAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvSGVhZGxpbmUvCiAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvRGVzY3JpcHRpb24vCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1HZXQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzID0gJFJlcXVlc3RGaWVsZHNPYmplY3QtPlJlcXVlc3RGaWVsZHNHZXQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICkgewogICAgICAgICAgICAgICAgICAgIG15IEBNdWx0aUFycmF5OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1OZXcgKAogICAgICAgICAgICAgICAgICAgICAgICBxdygkTmV3VmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBATXVsdGlBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICROZXdWYWx1ZSAoQE11bHRpQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9IC49ICIkTmV3VmFsdWUsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJDaGVja2JveCIgJiYgISRHZXRQYXJhbXskTmV3VmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIk5laW4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRHZXRQYXJhbXskTmV3VmFsdWVzfSAmJiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gbmUgJ05laW4nICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIkphIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5ld1ZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIi0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15IEBSZXF1ZXN0SURBcnJheUJsb2NrOwogICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRHN9ICkgewogICAgICAgIEBSZXF1ZXN0SURBcnJheUJsb2NrID0gc3BsaXQoIC8sLywgJEdldFBhcmFte1JlcXVlc3RGb3JtSURzfSApOwogICAgfQoKICAgIG15ICRDaGVja1JlcXVlc3RGb3JtSURCbG9jayA9ICcnOwogICAgbXkgJE5ld0Jsb2NrVmFsdWVzICAgICAgICAgID0gJyc7CgogICAgZm9yIG15ICROZXdWYWx1ZXNCbG9jayAoQFJlcXVlc3RJREFycmF5QmxvY2spIHsKCiAgICAgICAgbXkgQEZlbGRDaGVja0Jsb2NrID0gc3BsaXQoIC8tLywgJE5ld1ZhbHVlc0Jsb2NrICk7CiAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHNCbG9jazsKCiAgICAgICAgaWYgKCAkRmVsZENoZWNrQmxvY2tbMV0gJiYgJEZlbGRDaGVja0Jsb2NrWzFdICF+IC9bYS16XS9pZyApIHsKICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtQmxvY2sgPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtR2V0KAogICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrQmxvY2tbMV0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDaGVja1JlcXVlc3RGb3JtSURCbG9jayA9ICRSZXF1ZXN0Rm9ybUJsb2Nre0lEfTsKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm1CbG9ja3tGZWxkSUR9ICkgewogICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHNCbG9jayA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzR2V0KAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm1CbG9ja3tGZWxkSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgICRGZWxkQ2hlY2tCbG9ja1sxXQogICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAkRmVsZENoZWNrQmxvY2tbMV0gIX4gL1thLXpdL2lnCiAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrQmxvY2tbMF0gIX4gL0hlYWRsaW5lLwogICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja0Jsb2NrWzBdICF+IC9EZXNjcmlwdGlvbi8KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRzQmxvY2t7VHlwfSBlcSAiRHJvcGRvd24iICkgewoKICAgICAgICAgICAgICAgIG15ICRHb0dldFBhcmFtTmV3ID0gIlJlcXVlc3RGb3JtQmxvY2tJRHMiIC4gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrOwoKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICgkR29HZXRQYXJhbU5ldykgewoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyRLZXl9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQFJlcXVlc3RGb3JtSURBcnJheSA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXskS2V5fSApOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICROZXdWYWx1ZXMgKEBSZXF1ZXN0Rm9ybUlEQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBGZWxkQ2hlY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZlbGRDaGVja1sxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEZlbGRDaGVja1sxXSAhfiAvW2Etel0vaWcgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJNdWx0aXNlbGVjdCIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNdWx0aUFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtTmV3ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF3KCROZXdWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBNdWx0aUFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJE5ld1ZhbHVlcyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmV3VmFsdWUgKEBNdWx0aUFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLj0gIiROZXdWYWx1ZSwiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3VmFsdWVzIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdCbG9ja1ZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdWYWx1ZXMgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9IC4gJyMnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICdOZWluJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdCbG9ja1ZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICRDaGVja1JlcXVlc3RGb3JtSURCbG9jayAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld1ZhbHVlcyAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9IC4gJyMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdCbG9ja1ZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICRDaGVja1JlcXVlc3RGb3JtSURCbG9jayAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld1ZhbHVlcyAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9IC4gJyMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRHZXRQYXJhbXskTmV3VmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3VmFsdWVzIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICRDaGVja1JlcXVlc3RGb3JtSURCbG9jayAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdWYWx1ZXMgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiLSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdCbG9ja1ZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdWYWx1ZXMgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9IC4gJyMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkR2V0UGFyYW17QmxvY2tWYWx1ZXN9ID0gJE5ld0Jsb2NrVmFsdWVzOwoKICAgIGlmICggISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgIGlmICggJFJlcXVlc3R7VHlwZX0gJiYgJFJlcXVlc3R7VHlwZX0gbmUgIjAiICkgewogICAgICAgICAgICAkR2V0UGFyYW17VHlwZUlEfSA9ICRSZXF1ZXN0e1R5cGV9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1R5cGVJRH0gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15IEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIHB1c2ggQEN1c3RvbWVyRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgIH0KICAgICREeW5hbWljRmllbGQgPSBcQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvcm0gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9CiAgICAgICAgICAgID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDaGF0IGlzIG5vdCBhY3RpdmUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNoYXQgcGFydGljaXBhbnQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgI0dldCBkZWZhdWx0IFF1ZXVlIElEIGlmIG5vbmUgaXMgc2V0CiAgICAgICAgbXkgJFF1ZXVlRGVmYXVsdElEOwogICAgICAgIGlmICggISRHZXRQYXJhbXtEZXN0fSAmJiAhJFBhcmFte1RvU2VsZWN0ZWR9ICkgewogICAgICAgICAgICBteSAkUXVldWVEZWZhdWx0ID0gJENvbmZpZy0+eydRdWV1ZURlZmF1bHQnfSB8fCAnJzsKICAgICAgICAgICAgaWYgKCRRdWV1ZURlZmF1bHQpIHsKICAgICAgICAgICAgICAgICRRdWV1ZURlZmF1bHRJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZURlZmF1bHQgKTsKICAgICAgICAgICAgICAgIGlmICgkUXVldWVEZWZhdWx0SUQpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG9TZWxlY3RlZH0gPSAkUXVldWVEZWZhdWx0SUQgLiAnfHwnIC4gJFF1ZXVlRGVmYXVsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRBQ0xDb21wYXRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZURlZmF1bHRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3YXJuIGlmIHRoZXJlIGlzIG5vICh2YWxpZCkgZGVmYXVsdCBxdWV1ZSBhbmQgdGhlIGN1c3RvbWVyIGNhbid0IHNlbGVjdCBvbmUKICAgICAgICAgICAgZWxzaWYgKCAhJENvbmZpZy0+eydRdWV1ZSd9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NoZWNrIFN5c0NvbmZpZyBzZXR0aW5nIGZvciAlczo6UXVldWVEZWZhdWx0LicsCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57QWN0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3InKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17RGVzdH0gKSB7CiAgICAgICAgICAgIG15ICggJFF1ZXVlSURQYXJhbSwgJFF1ZXVlUGFyYW0gKSA9IHNwbGl0KCAvXHxcfC8sICRHZXRQYXJhbXtEZXN0fSApOwogICAgICAgICAgICBteSAkUXVldWVJRExvb2t1cCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZVBhcmFtICk7CiAgICAgICAgICAgIGlmICggJFF1ZXVlSURMb29rdXAgJiYgJFF1ZXVlSURMb29rdXAgZXEgJFF1ZXVlSURQYXJhbSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lclBhbmVsT3duU2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24nKTsKICAgICAgICAgICAgICAgIGlmICggJXsgJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24gLy8ge30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG9TZWxlY3RlZH0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkUXVldWVJRFBhcmFtIC4gJ3x8JyAuICRDdXN0b21lclBhbmVsT3duU2VsZWN0aW9uLT57JFF1ZXVlUGFyYW19OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvU2VsZWN0ZWR9ID0gJEdldFBhcmFte0Rlc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEFDTENvbXBhdEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSURMb29rdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFRvU2VsZWN0ZWQgICAgICAgPT4gJFBhcmFte1RvU2VsZWN0ZWR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgRnJvbUNoYXRJRCAgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkQ29uZmlnLT57TmV4dFNjcmVlbkFmdGVyTmV3VGlja2V0fTsKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGRlc3RpbmF0aW9uIHF1ZXVlCiAgICAgICAgbXkgJERlc3QgPSAkR2V0UGFyYW17RGVzdH0gfHwgJyc7CiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJFRvICkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIGlmICggISRUbyApIHsKICAgICAgICAgICAgJE5ld1F1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3UXVldWVJRCcgKSB8fCAnJzsKICAgICAgICAgICAgJFRvID0gJ1N5c3RlbSc7CiAgICAgICAgfQoKICAgICAgICAjIGZhbGxiYWNrLCBpZiBubyBkZXN0aW5hdGlvbiBpcyBnaXZlbgogICAgICAgIGlmICggISROZXdRdWV1ZUlEICkgewogICAgICAgICAgICBteSAkUXVldWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUXVldWUnICkKICAgICAgICAgICAgICAgIHx8ICRDb25maWctPnsnUXVldWVEZWZhdWx0J30KICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBpZiAoJFF1ZXVlKSB7CiAgICAgICAgICAgICAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZSApOwogICAgICAgICAgICAgICAgJE5ld1F1ZXVlSUQgPSAkUXVldWVJRDsKICAgICAgICAgICAgICAgICRUbyAgICAgICAgID0gJFF1ZXVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRTZWxlY3RlZEN1c3RvbWVyVXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0KICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhckZyb20nICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMiApIHsKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJENvdW50IiApIHx8IDA7CiAgICAgICAgICAgIGlmICggJENvdW50ID09IDEgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRDb3VudCA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJElzVXBsb2FkID0gMDsKCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIG15IEBBdHRhY2htZW50SURzID0gbWFwIHsKICAgICAgICAgICAgbXkgKCRJRCkgPSAkXyA9fiBteyBcQSBBdHRhY2htZW50RGVsZXRlIChcZCspIFx6IH14bXM7CiAgICAgICAgICAgICRJRCA/ICRJRCA6ICgpOwogICAgICAgIH0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJc1VwbG9hZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQgb3IgR2V0UGFyYW0gRXhwYW5kCiAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEdldFBhcmFte0V4cGFuZH0gKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUaXRsZSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSAgfHwgJycsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgaXMgRnJvbUNoYXRJRCwgZ2V0IHJlbGF0ZWQgbWVzc2FnZXMgYW5kIHByZXBlbmQgdGhlbSB0byBib2R5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBxdWV1ZQogICAgICAgIGlmICggISROZXdRdWV1ZUlEICYmICEkSXNVcGxvYWQgJiYgISRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAkRXJyb3J7UXVldWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjICAgICAgICAjIHByZXZlbnQgdGFtcGVyIHdpdGggKFF1ZXVlL0Rlc3QpLCBzZWUgYnVnIzk0MDgKICAgICAgICAjICAgICAgICBpZiAoICROZXdRdWV1ZUlEICYmICEkSXNVcGxvYWQgKSB7CiAgICAgICAgIwogICAgICAgICMgICAgICAgICAgICAjIGdldCB0aGUgb3JpZ2luYWwgbGlzdCBvZiBxdWV1ZXMgdG8gZGlzcGxheQogICAgICAgICMgICAgICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgIyAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgIyAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgIyAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICMgICAgICAgICAgICApOwogICAgICAgICMKICAgICAgICAjICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIFF1ZXVlSUQgZXhpc3RzIGluIHRoZSBsaXN0IG9mIHF1ZXVlcyxcCiAgICAgICAgIyAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJpc2UgYW4gZXJyb3IKICAgICAgICAjICAgICAgICAgICAgaWYgKCAhJFRvcy0+eyROZXdRdWV1ZUlEfSApIHsKICAgICAgICAjICAgICAgICAgICAgICAgICRFcnJvcntRdWV1ZUludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAjICAgICAgICAgICAgfQogICAgICAgICMKICAgICAgICAjICAgICAgICAgICAgIyBzZXQgdGhlIGNvcnJlY3QgcXVldWUgbmFtZSBpbiAkVG8gaWYgaXQgd2FzIGFsdGVyZWQKICAgICAgICAjICAgICAgICAgICAgaWYgKCAkVG8gbmUgJFRvcy0+eyROZXdRdWV1ZUlEfSApIHsKICAgICAgICAjICAgICAgICAgICAgICAgICRUbyA9ICRUb3MtPnskTmV3UXVldWVJRH07CiAgICAgICAgIyAgICAgICAgICAgIH0KICAgICAgICAjICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSAmJiAhJElzVXBsb2FkICkgewogICAgICAgICAgICAkRXJyb3J7U3ViamVjdEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggISRTZWxlY3RlZEN1c3RvbWVyVXNlciAmJiAhJElzVXBsb2FkICkgewogICAgICAgICAgICAkRXJyb3J7RnJvbUN1c3RvbWVySW52YWxpZH0gPSAnRnJvbUN1c3RvbWVySW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gJiYgISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgJEVycm9ye0JvZHlJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7RXhwYW5kfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICYmICEkSXNVcGxvYWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSURJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTTEF9CiAgICAgICAgICAgICYmICRDb25maWctPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkSXNVcGxvYWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTTEFJREludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBteSBAUmVxdWVzdElEQXJyYXlDaGVjayA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKTsKICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlcyAoQFJlcXVlc3RJREFycmF5Q2hlY2spIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5ld1ZhbHVlc30gbmUgIi0iICkgewogICAgICAgICAgICAgICAgbXkgQEZlbGRDaGVjayA9IHNwbGl0KCAvLS8sICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtSURzfSA9ICcnOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0ICAgIC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAgICAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVG9TZWxlY3RlZCAgICAgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjayggVHlwZSA9PiAnQ3VzdG9tZXInICk7CgogICAgICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHByaW9yaXR5LCBzZXQgaXQgdG8gZGVmYXVsdAogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHl9ICAgPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlcXVlc3RGb3JtTmFtZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVxdWVzdCcpOwoKICAgICAgICBteSAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgPSAnPGI+JyAuICRSZXF1ZXN0Rm9ybU5hbWUgLiAnOiAnIC4gJFJlcXVlc3R7TmFtZX0gLiAnPC9iPjxicj48YnI+PGRpdiBpZD0iUmVxdWVzdCI+JzsKCiAgICAgICAgaWYgKCRUaWNrZXRJRCkgewoKICAgICAgICAgICAgbXkgJFRpY2tldElEU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRJRFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgUmVxdWVzdElEID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlQ2hlY2tSZXF1ZXN0ID0gJFJlcXVlc3RPYmplY3QtPlJlcXVlc3RHZXQoCiAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDaGVja1JlcXVlc3R7T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3duZXJTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJENoZWNrUmVxdWVzdHtPd25lcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdHtSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZXNwb25zaWJsZVN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkQ2hlY2tSZXF1ZXN0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNob3dDb25maWdJdGVtID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb25maWdJdGVtWm9vbVNlYXJjaCcpOwogICAgICAgICAgICBpZiAoICRTaG93Q29uZmlnSXRlbSAmJiAkU2hvd0NvbmZpZ0l0ZW0gPj0gMSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0e1Nob3dDb25maWdJdGVtfSBlcSAiMSIgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAgICAgICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENsYXNzICggJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2xhc3MgPX4gL15cZCskLyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ2hlY2tDb25maWdJdGVtc0lEID0gJ0NvbmZpZ0l0ZW1JRCcgLiAkQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQ29uZmlnSXRlbUFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkQ2hlY2tDb25maWdJdGVtc0lEICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtQXJyYXkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnUmVsZXZhbnRUbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFJlcXVlc3RJREFycmF5ICAgICA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKTsKICAgICAgICAgICAgbXkgJERhdGVTdHJpbmcgICAgICAgICA9ICcnOwogICAgICAgICAgICBteSAkRGF0ZUtleSAgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDaGVja1JlcXVlc3RGb3JtSUQgPSAnJzsKCiAgICAgICAgICAgIGZvciBteSAkTmV3VmFsdWVzIChAUmVxdWVzdElEQXJyYXkpIHsKICAgICAgICAgICAgICAgIG15IEBGZWxkQ2hlY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkczsKCiAgICAgICAgICAgICAgICBpZiAoICRGZWxkQ2hlY2tbMV0gJiYgJEZlbGRDaGVja1sxXSAhfiAvW2Etel0vaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrUmVxdWVzdEZvcm1JRCA9ICRSZXF1ZXN0Rm9ybXtJRH07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm17RmVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSA9ICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdCiAgICAgICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrWzBdICF+IC9IZWFkbGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvRGVzY3JpcHRpb24vCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQENoZWNrTXVsdGkgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17JE5ld1ZhbHVlc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE5ld1JlcXVlc3RGaWVsZEluaGFsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld011bHRpIChAQ2hlY2tNdWx0aSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0RmllbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkS2V5ID0+ICROZXdNdWx0aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3UmVxdWVzdEZpZWxkSW5oYWx0IC49ICRSZXF1ZXN0RmllbGRJbmhhbHQgLiAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdSZXF1ZXN0RmllbGRJbmhhbHQgPSBzdWJzdHIoICROZXdSZXF1ZXN0RmllbGRJbmhhbHQsIDAsIC0yICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJzxkaXYgc3R5bGU9IndpZHRoOjE1MHB4O2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPjxzdHJvbmc+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvc3Ryb25nPjo8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3UmVxdWVzdEZpZWxkSW5oYWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8YnI+PC9kaXY+PGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJE5ld1JlcXVlc3RGaWVsZEluaGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEcm9wZG93biIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0RmllbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRLZXkgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxNTBweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij48c3Ryb25nPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8L3N0cm9uZz46IDwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRJbmhhbHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkUmVxdWVzdEZpZWxkSW5oYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkR29HZXRQYXJhbU5ldyA9ICJSZXF1ZXN0Rm9ybUJsb2NrSURzIiAuICRDaGVja1JlcXVlc3RGb3JtSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbU5ldzsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCRHb0dldFBhcmFtTmV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW1OZXd7JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5IC49ICRTZWxmLT5fU2V0QmxvY2tIVE1MKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXF1ZXN0Rm9ybUlEICA9PiAkQ2hlY2tSZXF1ZXN0Rm9ybUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtTmV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1CbG9ja0lEcyA9PiAkR2V0UGFyYW1OZXd7JEdvR2V0UGFyYW1OZXd9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICdUZXh0QXJlYScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KCBTdHJpbmcgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OiA8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRmVsZENoZWNrWzBdID1+IC9IZWFkbGluZS8gKSB7CgogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrOyI+JwogICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAuICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRGZWxkQ2hlY2tbMF0gPX4gL0Rlc2NyaXB0aW9uLyApIHsKCiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAkRGF0ZUtleSA9ICRGZWxkQ2hlY2tbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9EYXkvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nIC49ICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9Nb250aC9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIi4iIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL1llYXIvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nIC49ICIuIiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvSG91ci9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIiAiIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL01pbnV0ZS9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIjoiIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdID1+IHMvTWludXRlLy9pZzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OiA8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRGF0ZVN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPGJyPjwvZGl2PjxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRSZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRLZXkgICAgICA9PiAkRGF0ZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkRGF0ZVN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVLZXkgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdHtUZW1wbGF0ZUlEfSAmJiAkQ2hlY2tSZXF1ZXN0e1RlbXBsYXRlSUR9ID49IDEgKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgY2hhbmdlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJENoZWNrUmVxdWVzdHtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VBZnRlciA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTZXROZXdUaXRsZSA9ICRDaGFuZ2VBZnRlci0+e0NoYW5nZVRpdGxlfSAuICcgLSAnIC4gJEdldFBhcmFte1N1YmplY3R9OwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkU2V0TmV3VGl0bGUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsaW5rIHRpY2tldCB3aXRoIG5ld2x5IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgICAgICAgICBteSAkTGlua1N1Y2Nlc3MgPSAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEFydGljbGVCb2R5IC49ICc8L2Rpdj4nOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gZXEgIi0iICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQXJ0aWNsZUJvZHk7CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEFydGljbGVCb2R5OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFBsYWluQm9keSA9ICRHZXRQYXJhbXtCb2R5fTsKCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBsYWluQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKCBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBhcnRpY2xlCiAgICAgICAgbXkgJEZ1bGxOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnICk7CgogICAgICAgIG15ICRGcm9tICAgICAgPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQogICAgICAgICAgICA/ICdhdXRvIHJlcGx5JwogICAgICAgICAgICA6ICcnLAogICAgICAgICAgICBPcmlnSGVhZGVyID0+IHsKICAgICAgICAgICAgICAgIEZyb20gICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBUbyAgICAgID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkUGxhaW5Cb2R5LAogICAgICAgICAgICB9LAogICAgICAgICAgICBRdWV1ZSA9PiAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQZXJtaXNzaW9ucyBjaGVjayB3ZXJlIGRvbmUgZWFybGllcgogICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgICAgICBteSAkQ2hhdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15ICVDaGF0ICAgICAgID0gJENoYXRPYmplY3QtPkNoYXRHZXQoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VMaXN0ID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDaGF0QXJ0aWNsZUlEOwoKICAgICAgICAgICAgaWYgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgIG15ICRKU09OQm9keSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkQ2hhdEFydGljbGVUeXBlID0gJ2NoYXQtZXh0ZXJuYWwnOwoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJFRpY2tldE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKCiAgICAgICAgICAgICAgICAgICAgI05vQWdlbnROb3RpZnkgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICRDaGF0QXJ0aWNsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAoKICAgICAgICAgICAgICAgICAgICBGcm9tID0+ICRGcm9tLAoKICAgICAgICAgICAgICAgICAgICAjIFRvICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdDaGF0JyksCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJEpTT05Cb2R5LAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJENvbmZpZy0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgICAgID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGF0QXJ0aWNsZUlEKSB7CiAgICAgICAgICAgICAgICAkQ2hhdE9iamVjdC0+Q2hhdERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0dGVkIGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewoKICAgICAgICAgICAgIyBza2lwLCBkZWxldGVkIG5vdCB1c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3cml0ZSBleGlzdGluZyBmaWxlIHRvIGJhY2tlbmQKICAgICAgICAgICAgJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVDdXN0b21lckNoZWNrUmVxdWVzdCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0R2V0KAogICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVRpY2tldE51bWJlclNlbmQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICBteSAkRGVzdCAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBteSAkUXVldWVJRCAgICAgID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlELAogICAgICAgICk7CgogICAgICAgIG15ICROZXdUb3M7CgogICAgICAgIGlmICgkVG9zKSB7CiAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgZm9yIG15ICRLZXlUbyAoIHNvcnQga2V5cyAleyRUb3N9ICkgewogICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkVG9zLT57JEtleVRvfSBlcSAnLScgKTsKICAgICAgICAgICAgICAgICROZXdUb3MtPnsiJEtleVRvfHwkVG9zLT57JEtleVRvfSJ9ID0gJFRvcy0+eyRLZXlUb307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXdUb3MsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBTdWJhY3Rpb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3InKSwKICAgICAgICApOwogICAgfQoKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9IHx8ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvcyA9ICggJycsICctJyApOwogICAgbXkgJE1vZHVsZQogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lclBhbmVsOjpOZXdUaWNrZXRRdWV1ZVNlbGVjdGlvbk1vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lck5ld1RpY2tldDo6UXVldWVTZWxlY3Rpb25HZW5lcmljJzsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICBEZWJ1ZyAgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CgogICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICYmICRTZWxmLT57RGVidWd9ID4gMSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1vZHVsZTogJE1vZHVsZSBsb2FkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJU5ld1RvcyA9ICgKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgQUNMUGFyYW1zID0+IFwlUGFyYW0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+RmF0YWxEaWUoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBsb2FkICRNb2R1bGUhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9NYXNrTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGVPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwogICAgbXkgJFJlcXVlc3RPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdCcpOwogICAgbXkgJFJlcXVlc3RGaWVsZHNPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdEZpZWxkcycpOwogICAgbXkgJFJlcXVlc3RGb3JtT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdEZvcm0nKTsKICAgIG15ICRUaWNrZXRSZXF1ZXN0T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldFJlcXVlc3QnKTsKICAgIG15ICRUaW1lT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKTsKICAgIG15ICRMaW5rT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAkVXNlck9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICRTZW5kbWFpbE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsJyk7CiAgICBteSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Rm9ybUJsb2NrJyk7CiAgICBteSAkUXVldWVPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICRQYXJhbXtGb3JtSUR9ID0gJFNlbGYtPntGb3JtSUR9OwogICAgJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9ID0gJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9IHx8ICcnOwoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBjcmVhdGUgYSBzdHJpbmcgd2l0aCB0aGUgcXVvdGVkIGR5bmFtaWMgZmllbGQgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZE5hbWVzKSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRHluYW1pY0ZpZWxkTmFtZXN9ICkgewogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkTmFtZXNTdHJnfSAuPSAiLCAnIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWcgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgcHJlcGFyZSBlcnJvcnMKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkUGFyYW17RXJyb3JzfS0+eyRffTsKICAgICAgICAgICAgbXkgJHRlc3QgPSAkUGFyYW17JF99OwogICAgICAgIH0KICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0R2V0KAogICAgICAgIFJlcXVlc3RJRCA9PiAkUGFyYW17UmVxdWVzdElEfSwKICAgICk7CgogICAgJFBhcmFte05vQm9keWRpc3BsYXl9ICAgICAgICAgICA9ICdkaXNwbGF5Om5vbmUnOwogICAgJFBhcmFte05vQm9keUFsdGRpc3BsYXl9ICAgICAgICA9ICdkaXNwbGF5OmlubGluZSc7CiAgICAkUGFyYW17IkJvZHlWYWxpZGF0ZV9SZXF1aXJlZCJ9ID0gJyc7CiAgICAkUGFyYW17UmVxdWVzdE5hbWV9ICAgICAgICAgICAgID0gJFJlcXVlc3R7TmFtZX07CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld0ZlbGRlckxpc3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17RnJvbUN1c3RvbWVySW52YWxpZH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0Zyb21TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KCiAgICBteSAlUmVxdWVzdEZvcm1MaXN0ID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUxpc3QoCiAgICAgICAgUmVxdWVzdElEID0+ICRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBteSAkSWZWYWx1ZTsKICAgIGZvciBteSAkUmVxdWVzdEZvcm1MaXN0SUQgKAogICAgICAgIHNvcnQgeyAkUmVxdWVzdEZvcm1MaXN0eyRhfSA8PT4gJFJlcXVlc3RGb3JtTGlzdHskYn0gfQogICAgICAgIGtleXMgJVJlcXVlc3RGb3JtTGlzdAogICAgICAgICkKICAgIHsKCiAgICAgICAgI2dldCBSZXF1ZXN0Rm9ybQogICAgICAgIG15ICVSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1HZXQoCiAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJFJlcXVlc3RGb3JtTGlzdElELAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUmVxdWVzdEZvcm17S3VuZGVufSA9IDE7CgogICAgICAgICRQYXJhbXtUb29sVGlwfSAgICAgICA9ICRSZXF1ZXN0Rm9ybXtUb29sVGlwfTsKICAgICAgICAkUGFyYW17RmVsZEFrdHVlbGxJRH0gPSAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICRQYXJhbXtUb29sVGlwVW5kZXJ9ID0gJFJlcXVlc3RGb3Jte1Rvb2xUaXB9OwogICAgICAgIGlmICggJFJlcXVlc3RGb3Jte1Rvb2xUaXBVbmRlcn0gKSB7CiAgICAgICAgICAgICRQYXJhbXtUb29sVGlwVW5kZXJ9ID1+IHMvXG4vPGJyPi9nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1Rvb2xUaXBVbmRlcn0gPSAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggISRSZXF1ZXN0Rm9ybXtIZWFkbGluZX0gJiYgISRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn0gKSB7CgogICAgICAgICAgICAjZ2V0IFJlcXVlc3RGaWVsZAogICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkcyA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzR2V0KAogICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgI2dldCBSZXF1ZXN0RmllbGRzV2VydGUKICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHNXZXJ0ZSA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkUmVxdWVzdEZpZWxkc3tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjZ2V0IGxpc3QKICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHNMaXN0ZSA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydGVMaXN0KAogICAgICAgICAgICAgICAgRmVsZElEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJVJlcXVlc3RXZXJ0ZURyb3Bkb3duID0gKCk7CiAgICAgICAgICAgIGlmICglUmVxdWVzdEZpZWxkc0xpc3RlKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlcXVlc3RGaWVsZHNXZXJ0ZUlEICggc29ydCBrZXlzICVSZXF1ZXN0RmllbGRzTGlzdGUgKSB7CgogICAgICAgICAgICAgICAgICAgICNnZXQgUmVxdWVzdEZpZWxkc1dlcnRlCiAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHNXZXJ0ZSA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydGVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIElEID0+ICRSZXF1ZXN0RmllbGRzV2VydGVJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0V2VydGVEcm9wZG93bnsgJFJlcXVlc3RGaWVsZHNXZXJ0ZXtTY2hsdWVzc2VsfSB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFJlcXVlc3RGaWVsZHNXZXJ0ZXtJbmhhbHR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17RmVsZExhYmVsaW5nfSA9ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfTsKICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfTsKCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgIG15IEBEZWZhdWx0dmFsdWVWYWx1ZTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBARGVmYXVsdHZhbHVlVmFsdWUgPSBzcGxpdCggLywvLCAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgIEBEZWZhdWx0dmFsdWVWYWx1ZSA9IHNwbGl0KCAvLC8sICRQYXJhbXskSWZWYWx1ZX0gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSAmJiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gXEBEZWZhdWx0dmFsdWVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJNdWx0aXNlbGVjdFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgIG15IEBEZWZhdWx0dmFsdWVWYWx1ZTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBARGVmYXVsdHZhbHVlVmFsdWUgPSBzcGxpdCggLywvLCAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgIEBEZWZhdWx0dmFsdWVWYWx1ZSA9IHNwbGl0KCAvLC8sICRQYXJhbXskSWZWYWx1ZX0gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSAmJiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gXEBEZWZhdWx0dmFsdWVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJNdWx0aXNlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEcm9wZG93biIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDEgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPSAkUGFyYW17JElmVmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ICYmICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUmVxdWVzdFdlcnRlRHJvcGRvd24sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElELAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckRyb3Bkb3duUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEcm9wZG93biIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPSAkUGFyYW17JElmVmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ICYmICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUmVxdWVzdFdlcnRlRHJvcGRvd24sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElELAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0sCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckRyb3Bkb3duJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIlRleHQiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAgICAgICAgICRJZlZhbHVlID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskSWZWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFBhcmFteyRJZlZhbHVlfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJUZXh0UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJUZXh0IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRQYXJhbXskSWZWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJUZXh0QXJlYSIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDEgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZERlZmF1bHR2YWx1ZX0gPSAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9OwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZFJvd3N9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tSb3dzfTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkQ29sc30gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze0NvbHN9OwoKICAgICAgICAgICAgICAgICRJZlZhbHVlID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskSWZWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFBhcmFteyRJZlZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJUZXh0QXJlYVJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiVGV4dEFyZWEiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRSb3dzfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7Um93c307CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZENvbHN9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tDb2xzfTsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRQYXJhbXskSWZWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkQ2hlY2tlZH0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmVsZENoZWNrZWR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyQ2hlY2tib3hSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmVsZENoZWNrZWR9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRDaGVja2VkfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckNoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkRhdGUiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJEYXksIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJNb250aCwiOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIlllYXIsIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJIb3VyLCI7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiTWludXRlLCI7CgogICAgICAgICAgICAgICAgbXkgJE5ld0RpZmZUaW1lICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMDsKICAgICAgICAgICAgICAgIG15ICRQZXJpb2RGdXR1cmUgPSA1OwogICAgICAgICAgICAgICAgbXkgJFBlcmlvZFBhc3QgICA9IDA7CgogICAgICAgICAgICAgICAgIyBkYXRlIGRhdGEgc3RyaW5nCiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgID0+ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElELAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgPT4gJFBlcmlvZFBhc3QsCiAgICAgICAgICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICA9PiAkUGVyaW9kRnV0dXJlLAogICAgICAgICAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgICAgPT4gJE5ld0RpZmZUaW1lLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyRGF0ZVJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiRGF0ZSIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIkRheSwiOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIk1vbnRoLCI7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiWWVhciwiOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIkhvdXIsIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJNaW51dGUsIjsKCiAgICAgICAgICAgICAgICBteSAkTmV3RGlmZlRpbWUgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwOwogICAgICAgICAgICAgICAgbXkgJFBlcmlvZEZ1dHVyZSA9IDU7CiAgICAgICAgICAgICAgICBteSAkUGVyaW9kUGFzdCAgID0gMDsKCiAgICAgICAgICAgICAgICAjIGRhdGUgZGF0YSBzdHJpbmcKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICA9PiAkUGVyaW9kUGFzdCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiAkUGVyaW9kRnV0dXJlLAogICAgICAgICAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICROZXdEaWZmVGltZSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSwKICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckRhdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFJlcXVlc3RGb3Jte0hlYWRsaW5lfSApIHsKCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn0gPX4gcy9cbi88YnJcLz4vaWc7CiAgICAgICAgICAgICAgICAkUGFyYW17RGVzY3JpcHRpb259ICAgICAgICAgPSAkUmVxdWVzdEZvcm17RGVzY3JpcHRpb259OwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lRGVzY3JpcHRpb259ID0gJ0Rlc2NyaXB0aW9uLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICdEZXNjcmlwdGlvbi0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVIZWFkbGluZX0gPSAnSGVhZGxpbmUtJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAnSGVhZGxpbmUtJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICRQYXJhbXtIZWFkbGluZX0gPSAkUmVxdWVzdEZvcm17SGVhZGxpbmV9OwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckhlYWRsaW5lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJSZXF1ZXN0Rm9ybUlEcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkU2hvd0NvbmZpZ0l0ZW0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkNvbmZpZ0l0ZW1ab29tU2VhcmNoJyk7CiAgICBpZiAoICRTaG93Q29uZmlnSXRlbSAmJiAkU2hvd0NvbmZpZ0l0ZW0gPj0gMSApIHsKCiAgICAgICAgaWYgKCAkUmVxdWVzdHtTaG93Q29uZmlnSXRlbX0gZXEgIjEiICkgewoKICAgICAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICAgICAgICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRWZXJzaW9uSUQ7CiAgICAgICAgICAgIG15ICRDaGVja0l0ZW0gICA9IDA7CiAgICAgICAgICAgIG15ICVDb25maWdJdGVtcyA9ICgpOwoKICAgICAgICAgICAgZm9yIG15ICRDbGFzcyAoICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDbGFzcyA9fiAvXlxkKyQvICkgewoKICAgICAgICAgICAgICAgICAgICBteSBAU2hvd0NvbmZpZ0l0ZW1zID0gc3BsaXQoIC8sLywgJFJlcXVlc3R7U2hvd0NvbmZpZ0l0ZW1zfSApOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENoZWNrSWZDbGFzcyAoQFNob3dDb25maWdJdGVtcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVja0lmQ2xhc3MgPT0gJENsYXNzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU2VhcmNoUmVzdWx0TGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyRDbGFzc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVdeydWZXJzaW9uJ31bJV17J093bmVyJ31bJV17J0NvbnRlbnQnfSIgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0NsYXNzfSA9ICR7JENsYXNzTGlzdH17JENsYXNzfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JFNlYXJjaFJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVmVyc2lvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFZlcnNpb25SZWYtPntOYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrSXRlbSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbXN7ICRWZXJzaW9uUmVmLT57Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRWZXJzaW9uUmVmLT57TmFtZX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVDb25maWdJdGVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NvbmZpZ0l0ZW1JRCcgLiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJENoZWNrSXRlbSA+PSAxICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWdJdGVtQ2xhc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDaGVja0l0ZW0gICA9IDA7CiAgICAgICAgICAgICAgICAlQ29uZmlnSXRlbXMgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRDb25maWctPntRdWV1ZX0gKSB7CgogICAgICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgICAgIG15ICVOZXdUb3MgPSAoICcnLCAnLScgKTsKICAgICAgICBteSAkTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsOjpOZXdUaWNrZXRRdWV1ZVNlbGVjdGlvbk1vZHVsZScpCiAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Q3VzdG9tZXJOZXdUaWNrZXQ6OlF1ZXVlU2VsZWN0aW9uR2VuZXJpYyc7CiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBTeXN0ZW1BZGRyZXNzID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyksCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBsb2cgbG9hZGVkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICYmICRTZWxmLT57RGVidWd9ID4gMSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1vZHVsZTogJE1vZHVsZSBsb2FkZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJU5ld1RvcyA9ICgKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICBFbnYgICAgICAgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgQUNMUGFyYW1zID0+IFwlUGFyYW0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAoICcnLCA9PiAnLScgKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdG8gc3RyaW5nCiAgICAgICAgaWYgKCVOZXdUb3MpIHsKICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVOZXdUb3MgKSB7CiAgICAgICAgICAgICAgICAkTmV3VG9zeyIkX3x8JE5ld1Rvc3skX30ifSA9ICROZXdUb3N7JF99OwogICAgICAgICAgICAgICAgZGVsZXRlICROZXdUb3N7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVOZXdUb3MsCiAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICIgLiAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1RvU2VsZWN0ZWR9IHx8ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgVHJlZVZpZXcgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSW52YWxpZCA9PiAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewogICAgICAgIG15ICVQcmlvcml0aWVzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICAgICAgbXkgJVByaW9yaXR5U2VsZWN0ZWQ7CiAgICAgICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fSB8fCAnMyBub3JtYWwnOwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiBcJVByaW9yaXRpZXMsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICVQcmlvcml0eVNlbGVjdGVkLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRDb25maWctPnsnVGlja2V0VHlwZSd9ICkgewogICAgICAgIG15ICVUeXBlID0gJFRpY2tldE9iamVjdC0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57J1RpY2tldFR5cGVEZWZhdWx0J30gJiYgISRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICBteSAlUmV2ZXJzZVR5cGUgPSByZXZlcnNlICVUeXBlOwogICAgICAgICAgICAkUGFyYW17VHlwZUlEfSA9ICRSZXZlcnNlVHlwZXsgJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9IH07CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBDbGFzcyA9PiAiVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICIgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlSURJbnZhbGlkID0+ICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJENvbmZpZy0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICVTZXJ2aWNlczsKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICAgICAlU2VydmljZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9ICkgewogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2VydmljZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiCiAgICAgICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U2VydmljZUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2VNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVTZXJ2aWNlcykgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICggISRTZXJ2aWNlc3sgJFBhcmFte1NlcnZpY2VJRH0gfHwgJycgfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgbXkgJVNMQTsKICAgICAgICBpZiAoICRDb25maWctPntTTEF9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJVNMQSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NMQUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVNMQSkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFBhcmFte0Vycm9yc30tPnskX307CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZQogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBwdXNoIEBDdXN0b21lckR5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CiAgICAkRHluYW1pY0ZpZWxkID0gXEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgc2tpcCBmaWVsZHMgdGhhdCBIVE1MIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBodG1sIHN0cmluZ3MgZm9ybSAkUGFyYW0KICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUmVxdWVzdHtTaG93QXR0YWNobWVudH0gPT0gMSB8fCAhJFJlcXVlc3R7U2hvd0F0dGFjaG1lbnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93QXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBQZXJtaXNzaW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBiZWZvcmUgaW4gUnVuKCkKICAgIGlmICggJFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgIENoYXRJRCA9PiAkUGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhdEFydGljbGVQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGF0TWVzc2FnZXMgPT4gXEBDaGF0TWVzc2FnZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UmVxdWVzdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKCiAgICAjIHNldCB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0YWJsZSB2aWEgQUpBWFVwZGF0ZQogICAgaWYgKCAhJFBhcmFte09ubHlEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBAVXBkYXRhYmxlRmllbGRzID0gcXcoIERlc3QgU2VydmljZUlEIFNMQUlEIFByaW9yaXR5SUQgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfU2V0QmxvY2tIVE1MIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Rm9ybUJsb2NrJyk7CiAgICBteSAkUmVxdWVzdEZpZWxkc09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0RmllbGRzJyk7CiAgICBteSAkUmVxdWVzdE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Jyk7CiAgICBteSAkVGlja2V0UmVxdWVzdE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRSZXF1ZXN0Jyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICVHZXRQYXJhbSAgICAgICAgICAgPSAleyAkUGFyYW17R2V0UGFyYW19IH07CiAgICBteSAkVGlja2V0SUQgICAgICAgICAgID0gJFBhcmFte1RpY2tldElEfTsKICAgIG15ICRUaWNrZXRVc2VySUQgICAgICAgPSAkUGFyYW17VXNlcklEfTsKICAgIG15ICRDaGVja1JlcXVlc3RGb3JtSUQgPSAkUGFyYW17Q2hlY2tSZXF1ZXN0Rm9ybUlEfTsKICAgICRHZXRQYXJhbXtSZXF1ZXN0SUR9ICAgICAgICAgICA9ICRQYXJhbXtSZXF1ZXN0SUR9OwogICAgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRHN9ID0gJFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRHN9OwoKICAgIGlmICggJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRHN9ICkgewogICAgICAgIG15IEBSZXF1ZXN0Rm9ybUlEQXJyYXkgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEc30gKTsKICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlcyAoQFJlcXVlc3RGb3JtSURBcnJheSkgewogICAgICAgICAgICBteSBARmVsZENoZWNrID0gc3BsaXQoIC8tLywgJE5ld1ZhbHVlcyApOwogICAgICAgICAgICBpZiAoICRGZWxkQ2hlY2tbMV0gJiYgKCAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZyApICkgewogICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtQmxvY2tHZXQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzID0gJFJlcXVlc3RGaWVsZHNPYmplY3QtPlJlcXVlc3RGaWVsZHNHZXQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICkgewogICAgICAgICAgICAgICAgICAgIG15IEBNdWx0aUFycmF5OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1OZXcgKAogICAgICAgICAgICAgICAgICAgICAgICBxdygkTmV3VmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBATXVsdGlBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICROZXdWYWx1ZSAoQE11bHRpQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9IC49ICIkTmV3VmFsdWUsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJDaGVja2JveCIgJiYgISRHZXRQYXJhbXskTmV3VmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIk5laW4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRHZXRQYXJhbXskTmV3VmFsdWVzfSAmJiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gbmUgJ05laW4nICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIkphIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5ld1ZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIi0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICVDaGVja1JlcXVlc3QgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdEdldCgKICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICApOwoKICAgIG15ICRBcnRpY2xlQm9keSA9ICcnOwoKICAgIGlmICggJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRHN9ICkgewoKICAgICAgICAkQXJ0aWNsZUJvZHkgLj0gJzxociBzdHlsZT0iYmFja2dyb3VuZDojMDAwMDAwO2hlaWdodDoxcHg7IiAvPjxici8+JzsKCiAgICAgICAgbXkgQEFudHJhZ0lEQXJyYXlCbG9jayA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUJsb2NrSURzfSApOwogICAgICAgIG15ICREYXRlU3RyaW5nQmxvY2sgICAgPSAnJzsKICAgICAgICBteSAkRGF0ZUtleUJsb2NrICAgICAgID0gJyc7CgogICAgICAgIGZvciBteSAkTmV3VmFsdWVzIChAQW50cmFnSURBcnJheUJsb2NrKSB7CiAgICAgICAgICAgIG15IEBGZWxkQ2hlY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzOwogICAgICAgICAgICBpZiAoICRGZWxkQ2hlY2tbMV0gJiYgJEZlbGRDaGVja1sxXSAhfiAvW2Etel0vaWcgKSB7CiAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm17RmVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAlUmVxdWVzdEZpZWxkcyA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRzSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSA9ICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRGZWxkQ2hlY2tbMV0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZwogICAgICAgICAgICAgICAgICAgICYmICRGZWxkQ2hlY2tbMF0gIX4gL0hlYWRsaW5lLwogICAgICAgICAgICAgICAgICAgICYmICRGZWxkQ2hlY2tbMF0gIX4gL0Rlc2NyaXB0aW9uLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiApIHsKICAgICAgICAgICAgICAgICAgICBteSBAQ2hlY2tNdWx0aSA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXskTmV3VmFsdWVzfSApOwogICAgICAgICAgICAgICAgICAgIG15ICROZXdBbnRyYWdGZWxkSW5oYWx0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICROZXdNdWx0aSAoQENoZWNrTXVsdGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFudHJhZ0ZlbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRLZXkgPT4gJE5ld011bHRpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3QW50cmFnRmVsZEluaGFsdCAuPSAkQW50cmFnRmVsZEluaGFsdCAuICcsICc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVDaGVja1JlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtQmxvY2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdEZvcm1JRCA9PSAkQ2hlY2tSZXF1ZXN0Rm9ybXtSZXF1ZXN0Rm9ybUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OjwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdBbnRyYWdGZWxkSW5oYWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8YnI+PC9kaXY+PGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJE5ld0FudHJhZ0ZlbGRJbmhhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRUaWNrZXRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEcm9wZG93biIgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFudHJhZ0ZlbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZEtleSA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAlQ2hlY2tSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVja1JlcXVlc3RGb3JtSUQgPT0gJENoZWNrUmVxdWVzdEZvcm17UmVxdWVzdEZvcm1JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJzxkaXYgc3R5bGU9IndpZHRoOjE1MHB4O2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPjxzdHJvbmc+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvc3Ryb25nPjo8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQW50cmFnRmVsZEluaGFsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPGJyPjwvZGl2PjxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRSZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRLZXkgICAgICA9PiAkRmVsZENoZWNrWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICRBbnRyYWdGZWxkSW5oYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGlja2V0VXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG15ICVDaGVja1JlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtQmxvY2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdEZvcm1JRCA9PSAkQ2hlY2tSZXF1ZXN0Rm9ybXtSZXF1ZXN0Rm9ybUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICdUZXh0QXJlYScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KCBTdHJpbmcgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OjwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPGJyPjwvZGl2PjxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRSZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRLZXkgICAgICA9PiAkRmVsZENoZWNrWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFRpY2tldFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRmVsZENoZWNrWzBdID1+IC9IZWFkbGluZS8gKSB7CgogICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgLj0gJzxkaXYgc3R5bGU9IndpZHRoOjk3JTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgLiAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAkRGF0ZUtleUJsb2NrID0gJEZlbGRDaGVja1swXTsKICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvRGF5L2lnICkgewogICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nQmxvY2sgLj0gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9Nb250aC9pZyApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVN0cmluZ0Jsb2NrIC49ICIuIiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvWWVhci9pZyApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVN0cmluZ0Jsb2NrIC49ICIuIiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL0hvdXIvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmdCbG9jayAuPSAiICIgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL01pbnV0ZS9pZyApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVN0cmluZ0Jsb2NrIC49ICI6IiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdID1+IHMvTWludXRlLy9pZzsKICAgICAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybXtGZWxkSUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2tSZXF1ZXN0Rm9ybUlEID09ICRSZXF1ZXN0Rm9ybXtSZXF1ZXN0Rm9ybUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OjwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREYXRlU3RyaW5nQmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJERhdGVLZXlCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkRGF0ZVN0cmluZ0Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGlja2V0VXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkRGF0ZVN0cmluZ0Jsb2NrID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJERhdGVLZXlCbG9jayAgICA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkQXJ0aWNsZUJvZHkgLj0gJzxici8+PGhyIHN0eWxlPSJiYWNrZ3JvdW5kOiMwMDAwMDA7aGVpZ2h0OjFweDsiIC8+JzsKICAgIH0KCiAgICByZXR1cm4gJEFydGljbGVCb2R5Owp9CgpzdWIgX01hc2tOZXdOb1ZhbGlkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UmVxdWVzdE5vVmFsaWQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgIGlmICgKICAgICAgICAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0Q2hhbmdlVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBDdXN0b21lcklECiAgICBpZiAoICEkU2VsZi0+e1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgQ3VzdG9tZXJJRCEnKSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J1NvcnRCeTo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1BsYW5uZWRTdGFydFRpbWUnOwoKICAgICMgZ2V0IG9yZGVyaW5nIHBhcmFtZXRlcnMKICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdVcCc7CgogICAgbXkgQFNvcnRCeUFycmF5ICA9ICgkU29ydEJ5KTsKICAgIG15IEBPcmRlckJ5QXJyYXkgPSAoJE9yZGVyQnkpOwoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgc3RhcnRpbmcgd2l0aCBwYWdlIC4uLgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICAgICAgVGl0bGUgICA9PiAnJywKICAgICk7CgogICAgIyBidWlsZCBOYXZpZ2F0aW9uQmFyCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhcigpOwoKICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICggc29ydCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmaWx0ZXIgYW5kIHZpZXcgcGFyYW1zCiAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICdBbGwnOwogICAgJFNlbGYtPntWaWV3fSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKICAgICRTZWxmLT57U3RhcnRIaXR9ID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwogICAgJFNlbGYtPntQYWdlU2hvd259ID0gJFNlbGYtPntVc2VyU2hvd1RpY2tldHN9IHx8IDE7CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRTZWxmLT57RmlsdGVyfSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CiAgICBteSBAQ2hhbmdlSURzID0gQHskQ2hhbmdlSURzUmVmfTsKCiAgICBteSAlQ3VzdG9tZXJVc2VyU2VydmljZXM7CiAgICBteSAlQ291bnRCeUNoYW5nZVN0YXRlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGlua09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgIyBpZiBjb25maWd1cmVkLCBnZXQgb25seSBjaGFuZ2VzIHdoaWNoIGhhdmUgd29ya29yZGVycyB0aGF0IGFyZSBsaW5rZWQgd2l0aCBhIHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBzZXJ2aWNlcyB0aGUgY3VzdG9tZXIgdXNlciBpcyBhbGxvd2VkIHRvIHVzZQogICAgICAgICVDdXN0b21lclVzZXJTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVVuaXF1ZUNoYW5nZUlEczsKICAgICAgICBDSEFOR0VJRDoKICAgICAgICBmb3IgbXkgJENoYW5nZUlEIChAQ2hhbmdlSURzKSB7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgICAgICAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGlkcwogICAgICAgICAgICBteSBAV29ya09yZGVySURzID0gQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfTsKCiAgICAgICAgICAgICMgZG9uJ3Qgc2hvdyBjaGFuZ2VzIHdpdGggbm8gd29ya29yZGVycyAoYXMgdGhleSBjYW4gbm90IGJlIGxpbmtlZCB3aXRoIGEgc2VydmljZSkKICAgICAgICAgICAgbmV4dCBDSEFOR0VJRCBpZiAhQFdvcmtPcmRlcklEczsKCiAgICAgICAgICAgIFdPUktPUkRFUklEOgogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEIChAV29ya09yZGVySURzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgbGlua2VkIHNlcnZpY2VzCiAgICAgICAgICAgICAgICBteSAlTGlua0tleUxpc3QgPSAkTGlua09iamVjdC0+TGlua0tleUxpc3QoCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3Jrb3JkZXIgaGFzIG5vIGxpbmtlZCBzZXJ2aWNlCiAgICAgICAgICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICElTGlua0tleUxpc3Q7CgogICAgICAgICAgICAgICAgU0VSVklDRUlEOgogICAgICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJUxpbmtLZXlMaXN0ICkgewoKICAgICAgICAgICAgICAgICAgICAjIG9ubHkgdXNlIHNlcnZpY2VzIHdoZXJlIHRoZSBjdXN0b21lciBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc2VydmljZQogICAgICAgICAgICAgICAgICAgIG5leHQgU0VSVklDRUlEIGlmICEkQ3VzdG9tZXJVc2VyU2VydmljZXN7JFNlcnZpY2VJRH07CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGNoYW5nZSBpZCB0byBsaXN0IG9mIHZpc2libGUgY2hhbmdlcyBmb3IgdGhlIGN1c3RvbWVyCiAgICAgICAgICAgICAgICAgICAgJFVuaXF1ZUNoYW5nZUlEc3skQ2hhbmdlSUR9Kys7CgogICAgICAgICAgICAgICAgICAgICMgY291bnQgdGhlIHZpc2libGUgY2hhbmdlcyBwZXIgc3RhdGUKICAgICAgICAgICAgICAgICAgICAkQ291bnRCeUNoYW5nZVN0YXRleyAkQ2hhbmdlLT57Q2hhbmdlU3RhdGV9IH0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQENoYW5nZUlEcyA9IGtleXMgJVVuaXF1ZUNoYW5nZUlEczsKCiAgICAgICAgIyBhZGQgdGhlIGFsbCBjb3VudAogICAgICAgICRDb3VudEJ5Q2hhbmdlU3RhdGV7QWxsfSA9IHNjYWxhciBAQ2hhbmdlSURzOwogICAgfQoKICAgICMgZGlzcGxheSBhbGwgbmF2YmFyIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBteSAkQ291bnRlcjsKICAgIG15ICRBbGxDaGFuZ2VzOwogICAgbXkgJEFsbENoYW5nZXNUb3RhbDsKCiAgICAjIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsdGVycwogICAgbXkgJE51bWJlck9mRmlsdGVycyA9IGtleXMgJUZpbHRlcnM7CgogICAgIyBhcnJheSB0byBzb3J0IHRoZSBmaWx0ZXJzIGJ5IGl0cyBwcmlvcml0eQogICAgbXkgQE5hdkJhckZpbHRlcnMgPSBzb3J0IHsgJEZpbHRlcnN7JGF9LT57UHJpb30gPD0+ICRGaWx0ZXJzeyRifS0+e1ByaW99IH0ga2V5cyAlRmlsdGVyczsKCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlck5hbWUgKEBOYXZCYXJGaWx0ZXJzKSB7CiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgIyBkdWUgdG8gc2VydmljZSByZXN0cmljdGlvbnMgZm9yIGN1c3RvbWVyIHVzZXJzCiAgICAgICAgIyB3ZSBuZWVkIHRvIGNvdW50IGRpZmZlcmVudGx5IGlmIHRoZSBmZWF0dXJlICJTaG93T25seUNoYW5nZXNXaXRoQWxsb3dlZFNlcnZpY2VzIgogICAgICAgICMgaXMgYWN0aXZhdGVkCiAgICAgICAgbXkgJENvdW50OwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlc30gKSB7CiAgICAgICAgICAgICRDb3VudCA9ICRDb3VudEJ5Q2hhbmdlU3RhdGV7JEZpbHRlck5hbWV9IHx8IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgICAgICRDb3VudCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJOYW1lfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRmlsdGVyTmFtZSBuZSAnQWxsJyAmJiAhJENvdW50ICkgewogICAgICAgICAgICBuZXh0IEZJTFRFUjsKICAgICAgICB9CgogICAgICAgIG15ICRDbGFzc0xJID0gJyc7CiAgICAgICAgbXkgJENsYXNzQSAgPSAnJzsKICAgICAgICBpZiAoICRGaWx0ZXJOYW1lIGVxICRTZWxmLT57RmlsdGVyfSApIHsKICAgICAgICAgICAgJENsYXNzQSA9ICdTZWxlY3RlZCc7CiAgICAgICAgICAgICRBbGxDaGFuZ2VzID0gJENvdW50IHx8IDA7CiAgICAgICAgfQogICAgICAgIGlmICggJE51bWJlck9mRmlsdGVycyA9PSAkQ291bnRlciApIHsKICAgICAgICAgICAgJENsYXNzTEkgPSAnTGFzdCc7CiAgICAgICAgfQogICAgICAgIGlmICggJEZpbHRlck5hbWUgZXEgJ0FsbCcgKSB7CiAgICAgICAgICAgICRBbGxDaGFuZ2VzVG90YWwgPSAkQ291bnQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjb3VudGVyIHN0cmluZyAoZW10eSBzdHJpbmcgaWYgQ291bnQgaXMgdW5kZWZpbmVkKQogICAgICAgIG15ICRDb3VudFN0cmc7CiAgICAgICAgaWYgKCBkZWZpbmVkICRDb3VudCApIHsKICAgICAgICAgICAgJENvdW50U3RyZyA9ICcoJyAuICRDb3VudCAuICcpJzsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJOYW1lfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50U3RyZyA9PiAkQ291bnRTdHJnLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gJEZpbHRlck5hbWUsCiAgICAgICAgICAgIENsYXNzTEkgICA9PiAkQ2xhc3NMSSwKICAgICAgICAgICAgQ2xhc3NBICAgID0+ICRDbGFzc0EsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJOYW1lfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzZXQgbWV0YS1saW5rIGZvciBwYWdpbmF0aW9uCiAgICBteSAkTGluayA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztGaWx0ZXI9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7U3ViYWN0aW9uPScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U3ViYWN0aW9ufSApCiAgICAgICAgLiAnOyc7CgogICAgIyBjcmVhdGUgcGFnaW5hdGlvbgogICAgbXkgJVBhZ2VOYXYgPSAkTGF5b3V0T2JqZWN0LT5QYWdlTmF2QmFyKAogICAgICAgIExpbWl0ICAgICA9PiAxMDAwMCwKICAgICAgICBTdGFydEhpdCAgPT4gJFNlbGYtPntTdGFydEhpdH0sCiAgICAgICAgUGFnZVNob3duID0+ICRTZWxmLT57UGFnZVNob3dufSwKICAgICAgICBBbGxIaXRzICAgPT4gc2NhbGFyKEBDaGFuZ2VJRHMpLCAgICAgICAgICAgICAgICAgICAgIyRBbGxDaGFuZ2VzLAogICAgICAgIEFjdGlvbiAgICA9PiAnQWN0aW9uPUN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlJywKICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgSURQcmVmaXggID0+ICdDdXN0b21lcklUU01DaGFuZ2VTY2hlZHVsZScsCiAgICApOwoKICAgICMgc2hvdyBjaGFuZ2VzIGlzIGRhdGEgaWYgYW55CiAgICBpZiAoIHNjYWxhciBAQ2hhbmdlSURzICkgewoKICAgICAgICAjIHNob3cgaGVhZGVyIGZpbHRlcgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVOYXZCYXJGaWx0ZXIgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRmlsdGVySGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7ICROYXZCYXJGaWx0ZXJ7JEtleX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHNjYWxhciBAU2hvd0NvbHVtbnMgKSB7CgogICAgICAgICAgICAjIHNldCBoZWFkZXJzCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uTmFtZSAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmVlZGVkIHZlcmlhYmxlcwogICAgICAgICAgICAgICAgbXkgJENTUyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJFNldE9yZGVyQnk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgSUQgaWYgbmVjZXNhcnkKICAgICAgICAgICAgICAgIGlmICgkU29ydEJ5KSB7CiAgICAgICAgICAgICAgICAgICAgJFNvcnRCeSA9ICggJFNvcnRCeSBlcSAnUHJpb3JpdHlJRCcgKQogICAgICAgICAgICAgICAgICAgICAgICA/ICdQcmlvcml0eScKICAgICAgICAgICAgICAgICAgICAgICAgOiAoICRTb3J0QnkgZXEgJ0NhdGVnb3J5SUQnICkgICAgICAgPyAnQ2F0ZWdvcnknCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCAkU29ydEJ5IGVxICdDaGFuZ2VCdWlsZGVySUQnICkgID8gJ0NoYW5nZUJ1aWxkZXInCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCAkU29ydEJ5IGVxICdDaGFuZ2VNYW5hZ2VySUQnICkgID8gJ0NoYW5nZU1hbmFnZXInCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCAkU29ydEJ5IGVxICdDaGFuZ2VTdGF0ZUlEJyApICAgID8gJ0NoYW5nZVN0YXRlJwogICAgICAgICAgICAgICAgICAgICAgICA6ICggJFNvcnRCeSBlcSAnSW1wYWN0SUQnICkgICAgICAgICA/ICdJbXBhY3QnCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCAkU29ydEJ5IGVxICdXb3JrT3JkZXJBZ2VudElEJyApID8gJ1dvcmtPcmRlckFnZW50JwogICAgICAgICAgICAgICAgICAgICAgICA6ICggJFNvcnRCeSBlcSAnV29ya09yZGVyU3RhdGVJRCcgKSA/ICdXb3JrT3JkZXJTdGF0ZScKICAgICAgICAgICAgICAgICAgICAgICAgOiAoICRTb3J0QnkgZXEgJ1dvcmtPcmRlclR5cGVJRCcgKSAgPyAnV29ya09yZGVyVHlwZScKICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU29ydEJ5OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBjb3JyZWN0IFNldCBDU1MgY2xhc3MgYW5kIG9yZGVyIGJ5IGxpbmsKICAgICAgICAgICAgICAgIGlmICggJFNvcnRCeSAmJiAoICRTb3J0QnkgZXEgJENvbHVtbk5hbWUgKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRPcmRlckJ5ICYmICggJE9yZGVyQnkgZXEgJ1VwJyApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0T3JkZXJCeSA9ICdEb3duJzsKICAgICAgICAgICAgICAgICAgICAgICAgJENTUyAuPSAnIFNvcnREZXNjZW5kaW5nJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZXRPcmRlckJ5ID0gJ1VwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJENTUyAuPSAnIFNvcnRBc2NlbmRpbmcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTZXRPcmRlckJ5ID0gJ1VwJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbk5hbWUgLiAnSGVhZGVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ1NTICAgICA9PiAkQ1NTLAogICAgICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ID0+ICRTZXRPcmRlckJ5LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBpbmNpZGVudCBzaWduYWxzLCBuZWVkZWQgZm9yIHNlcnZpY2VzCiAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGNoYW5nZXMncwogICAgICAgICRDb3VudGVyID0gMDsKCiAgICAgICAgSUQ6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoQENoYW5nZUlEcykgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkU2VsZi0+e1N0YXJ0SGl0fQogICAgICAgICAgICAgICAgJiYgJENvdW50ZXIgPCAoICRTZWxmLT57UGFnZVNob3dufSArICRTZWxmLT57U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgYWxsIGRhdGEKICAgICAgICAgICAgICAgIG15ICVEYXRhOwoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgZGF0YSBvZiBzdWItZWxlbWVudHMKICAgICAgICAgICAgICAgIG15ICVTdWJFbGVtZW50RGF0YTsKCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRDaGFuZ2U7CgogICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGRhdGEsCiAgICAgICAgICAgICAgICAjICggbGV0IHdvcmtvcmRlciBkYXRhIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgIyBzb21lIGNoYW5nZSBhdHRyaWJ1dGVzLCBpLmUuIFBsYW5uZWRTdGFydFRpbWUsIGV0Yy4uLiApCiAgICAgICAgICAgICAgICAlRGF0YSA9ICggJXskQ2hhbmdlfSwgJURhdGEgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgZm9yIG5lZWRlZCB1c2VyIHR5cGVzCiAgICAgICAgICAgICAgICBVU0VSVFlQRToKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlclR5cGUgKHF3KENoYW5nZUJ1aWxkZXIgQ2hhbmdlTWFuYWdlciBXb3JrT3JkZXJBZ2VudCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBVc2VyVHlwZSBhdHRyaWJ1dGUgZXhpc3RzIGVpdGhlciBpbiBjaGFuZ2Ugb3Igd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoYW5nZS0+eyAkVXNlclR5cGUgLiAnSUQnIH0gJiYgISREYXRheyAkVXNlclR5cGUgLiAnSUQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUlRZUEU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJENoYW5nZS0+eyAkVXNlclR5cGUgLiAnSUQnIH0gfHwgJERhdGF7ICRVc2VyVHlwZSAuICdJRCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyTG9naW4nIH0gICAgID0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXsgJFVzZXJUeXBlIC4gJ1VzZXJGaXJzdG5hbWUnIH0gPSAkVXNlcntVc2VyRmlyc3RuYW1lfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXsgJFVzZXJUeXBlIC4gJ1VzZXJMYXN0bmFtZScgfSAgPSAkVXNlcntVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckZ1bGxuYW1lJyB9ICA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0byBzdG9yZSB0aGUgbGlua2VkIHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSB7fTsKCiAgICAgICAgICAgICAgICBteSBAV29ya09yZGVySURzOwoKICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlIGNvbWJpbmVkIGxpbmtlZCBzZXJ2aWNlcyBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMgb2YgdGhpcyBjaGFuZ2UKICAgICAgICAgICAgICAgIEBXb3JrT3JkZXJJRHMgPSBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlIGNvbWJpbmVkIGxpbmtlZCBzZXJ2aWNlcyBkYXRhCiAgICAgICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEIChAV29ya09yZGVySURzKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzIG9mIHRoaXMgd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXIgPSAkTGlua09iamVjdC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgT0JKRUNUOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCBrZXlzICV7JExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXJ9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHNob3cgbGlua2VkIHNlcnZpY2VzIG9mIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QgbmUgJ1NlcnZpY2UnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIExJTktUWVBFOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RJT046CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21iaW5lIHRoZSBsaW5rZWQgb2JqZWN0IGRhdGEgZnJvbSBhbGwgd29ya29yZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGlua0xpc3RXaXRoRGF0YS0+eyRPYmplY3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JERpcmVjdGlvbn0tPnskSUR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB1bmlxdWUgc2VydmljZSBpZHMKICAgICAgICAgICAgICAgIG15ICVVbmlxdWVTZXJ2aWNlSURzOwogICAgICAgICAgICAgICAgbXkgJFNlcnZpY2VzUmVmID0gJExpbmtMaXN0V2l0aERhdGEtPntTZXJ2aWNlfSB8fCB7fTsKICAgICAgICAgICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXskU2VydmljZXNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICAgICAgICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFNlcnZpY2VzUmVmLT57JExpbmtUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRTZXJ2aWNlc1JlZi0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29sbGVjdCB1bmlxdWUgc2VydmljZSBpZHMKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVW5pcXVlU2VydmljZUlEc3skU2VydmljZUlEfSsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBkYXRhIGZvciBlYWNoIHNlcnZpY2UKICAgICAgICAgICAgICAgIG15IEBTZXJ2aWNlc0RhdGE7CiAgICAgICAgICAgICAgICBTRVJWSUNFSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQga2V5cyAlVW5pcXVlU2VydmljZUlEcyApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93T25seUNoYW5nZXNXaXRoQWxsb3dlZFNlcnZpY2VzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgdGhpcyBzZXJ2aWNlIGlmIGN1c3RvbWVyIGlzIG5vdCBhbGxvd2VkIHRvIHVzZSBpdAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAhJEN1c3RvbWVyVXNlclNlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBjdXJyZW50IGluY2lkZW50IHNpZ25hbAogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU2lnbmFsfSA9ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IHx8ICcnIH0gfHwgJyc7CgogICAgICAgICAgICAgICAgICAgICMgc3RvcmUgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VydmljZXNEYXRhLCBcJVNlcnZpY2VEYXRhOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc29ydCBzZXJ2aWNlcyBkYXRhIGJ5IHNlcnZpY2UgbmFtZQogICAgICAgICAgICAgICAgQFNlcnZpY2VzRGF0YSA9IHNvcnQgeyAkYS0+e05hbWV9IGNtcCAkYi0+e05hbWV9IH0gQFNlcnZpY2VzRGF0YTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBjaGFuZ2UgaWYgaXQgaGFzIG5vIHNlcnZpY2VzCiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICFAU2VydmljZXNEYXRhOwoKICAgICAgICAgICAgICAgICMgc3RvcmUgc2VydmljZXMgZGF0YQogICAgICAgICAgICAgICAgJFN1YkVsZW1lbnREYXRhe1NlcnZpY2VzfSA9IFxAU2VydmljZXNEYXRhOwoKICAgICAgICAgICAgICAgICMgYWRkIGJsb2NrCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmIChAU2hvd0NvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICBDT0xVTU46CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW5OYW1lIChAU2hvd0NvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgY29sdW1uIGNvbnRhaW5zIHN1Yi1lbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3ViRWxlbWVudERhdGF7JENvbHVtbk5hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJFN1YkVsZW1lbnREYXRheyRDb2x1bW5OYW1lfSBlcSAnQVJSQVknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFN1YkVsZW1lbnQgKCBAeyAkU3ViRWxlbWVudERhdGF7JENvbHVtbk5hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyBzdWItZWxlbWVudHMgb2YgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uTmFtZSAuICdTdWJFbGVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFN1YkVsZW1lbnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIUBTZXJ2aWNlc0RhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbk5hbWUgLiAnU3ViRWxlbWVudEVtcHR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBzaG93IG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJJVFNNQ2hhbmdlT3ZlcnZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBwYWdlIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL1JlcXVlc3RDdXN0b21lclRpY2tldE1lc3NhZ2UucG0gLSB0byBoYW5kbGUgY3VzdG9tZXIgbWVzc2FnZXMKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IFJlcXVlc3RDdXN0b21lclRpY2tldE1lc3NhZ2UucG0sdiAxLjEyIDIwMTkvMDYvMjMgMTM6NDE6NDYgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpSZXF1ZXN0Q3VzdG9tZXJUaWNrZXRNZXNzYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0KICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KCBTdWJqZWN0IEJvZHkgUHJpb3JpdHlJRCBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZCBEZXN0IEZyb21DaGF0SUQgUmVxdWVzdElEIFJlcXVlc3RGb3JtSURzIFJlcXVlc3RGb3JtQmxvY2tJRHMgQm9keUFsdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKICAgICRBQ0xDb21wYXRHZXRQYXJhbXtPd25lcklEfSA9ICRHZXRQYXJhbXtOZXdVc2VySUR9OwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEJhY2tlbmRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkVHlwZU9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CiAgICBteSAkUmVxdWVzdE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Jyk7CiAgICBteSAkUmVxdWVzdEZpZWxkc09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0RmllbGRzJyk7CiAgICBteSAkUmVxdWVzdEZvcm1PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Rm9ybScpOwogICAgbXkgJFRpY2tldFJlcXVlc3RPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0UmVxdWVzdCcpOwogICAgbXkgJFRpbWVPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwogICAgbXkgJExpbmtPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwogICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFNlbmRtYWlsT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKTsKICAgIG15ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtQmxvY2snKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkVGVtcGxhdGVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpOwoKICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkR2V0UGFyYW17Qm9keUFsdH07CiAgICB9CgogICAgbXkgJElmTm9WYWxpZCA9IDA7CgogICAgbXkgJVJlcXVlc3QgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdEdldCgKICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICApOwoKICAgIGlmICggJFJlcXVlc3R7U3ViamVjdH0gKSB7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFJlcXVlc3R7U3ViamVjdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAiTm8gc3ViamVjdCB5ZXQiOwogICAgfQoKICAgIGlmICggISRHZXRQYXJhbXtEZXN0fSApIHsKICAgICAgICBpZiAoICRSZXF1ZXN0e1ZhbGlkSUR9ID09IDIgKSB7CiAgICAgICAgICAgICRJZk5vVmFsaWQrKzsKICAgICAgICB9CgogICAgICAgIG15ICRRdWV1ZU5hbWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRSZXF1ZXN0e1F1ZXVlfSwKICAgICAgICApOwogICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICIkUmVxdWVzdHtRdWV1ZX18fCRRdWV1ZU5hbWUiOwogICAgICAgICRQYXJhbXtEZXN0fSAgICA9ICIkUmVxdWVzdHtRdWV1ZX18fCRRdWV1ZU5hbWUiOwogICAgfQoKICAgIGlmICggJElmTm9WYWxpZCA+PSAxICkgewoKICAgICAgICBteSAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAgICAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRTZWxmLT5fTWFza05ld05vVmFsaWQoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICBpZiAoICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKSB7CiAgICAgICAgbXkgQFJlcXVlc3RGb3JtSURBcnJheSA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKTsKICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlcyAoQFJlcXVlc3RGb3JtSURBcnJheSkgewogICAgICAgICAgICBteSBARmVsZENoZWNrID0gc3BsaXQoIC8tLywgJE5ld1ZhbHVlcyApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdCiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgJEZlbGRDaGVja1sxXSAhfiAvW2Etel0vaWcKICAgICAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrWzBdICF+IC9IZWFkbGluZS8KICAgICAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrWzBdICF+IC9EZXNjcmlwdGlvbi8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUdldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRzSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJNdWx0aXNlbGVjdCIgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQE11bHRpQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbU5ldyAoCiAgICAgICAgICAgICAgICAgICAgICAgIHF3KCROZXdWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBNdWx0aUFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJE5ld1ZhbHVlcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlIChATXVsdGlBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLj0gIiROZXdWYWx1ZSwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IiAmJiAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiTmVpbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEdldFBhcmFteyROZXdWYWx1ZXN9ICYmICRHZXRQYXJhbXskTmV3VmFsdWVzfSBuZSAnTmVpbicgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiSmEiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17JE5ld1ZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskTmV3VmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiLSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQFJlcXVlc3RJREFycmF5QmxvY2s7CiAgICBpZiAoICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKSB7CiAgICAgICAgQFJlcXVlc3RJREFycmF5QmxvY2sgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17UmVxdWVzdEZvcm1JRHN9ICk7CiAgICB9CgogICAgbXkgJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrID0gJyc7CiAgICBteSAkTmV3QmxvY2tWYWx1ZXMgICAgICAgICAgPSAnJzsKCiAgICBmb3IgbXkgJE5ld1ZhbHVlc0Jsb2NrIChAUmVxdWVzdElEQXJyYXlCbG9jaykgewoKICAgICAgICBteSBARmVsZENoZWNrQmxvY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzQmxvY2sgKTsKICAgICAgICBteSAlUmVxdWVzdEZpZWxkc0Jsb2NrOwoKICAgICAgICBpZiAoICRGZWxkQ2hlY2tCbG9ja1sxXSAmJiAkRmVsZENoZWNrQmxvY2tbMV0gIX4gL1thLXpdL2lnICkgewogICAgICAgICAgICBteSAlUmVxdWVzdEZvcm1CbG9jayA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1HZXQoCiAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tCbG9ja1sxXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrID0gJFJlcXVlc3RGb3JtQmxvY2t7SUR9OwogICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybUJsb2Nre0ZlbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAlUmVxdWVzdEZpZWxkc0Jsb2NrID0gJFJlcXVlc3RGaWVsZHNPYmplY3QtPlJlcXVlc3RGaWVsZHNHZXQoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkc0lEID0+ICRSZXF1ZXN0Rm9ybUJsb2Nre0ZlbGRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgJEZlbGRDaGVja0Jsb2NrWzFdCiAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICRGZWxkQ2hlY2tCbG9ja1sxXSAhfiAvW2Etel0vaWcKICAgICAgICAgICAgICAgICYmICRGZWxkQ2hlY2tCbG9ja1swXSAhfiAvSGVhZGxpbmUvCiAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrQmxvY2tbMF0gIX4gL0Rlc2NyaXB0aW9uLwogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHNCbG9ja3tUeXB9IGVxICJEcm9wZG93biIgKSB7CgogICAgICAgICAgICAgICAgbXkgJEdvR2V0UGFyYW1OZXcgPSAiUmVxdWVzdEZvcm1CbG9ja0lEcyIgLiAkQ2hlY2tSZXF1ZXN0Rm9ybUlEQmxvY2s7CgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCRHb0dldFBhcmFtTmV3KSB7CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JEtleX0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBteSBAUmVxdWVzdEZvcm1JREFycmF5ID0gc3BsaXQoIC8sLywgJEdldFBhcmFteyRLZXl9ICk7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlcyAoQFJlcXVlc3RGb3JtSURBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEZlbGRDaGVjayA9IHNwbGl0KCAvLS8sICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkcyA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRzSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE11bHRpQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1OZXcgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcoJE5ld1ZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE11bHRpQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICROZXdWYWx1ZSAoQE11bHRpQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSAuPSAiJE5ld1ZhbHVlLCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3QmxvY2tWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkQ2hlY2tSZXF1ZXN0Rm9ybUlEQmxvY2sgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdWYWx1ZXMgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfSAuICcjJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkQ2hlY2tSZXF1ZXN0Rm9ybUlEQmxvY2sgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld1ZhbHVlcyAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJDaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gJ05laW4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3VmFsdWVzIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3VmFsdWVzIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyROZXdWYWx1ZXN9ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3QmxvY2tWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkQ2hlY2tSZXF1ZXN0Rm9ybUlEQmxvY2sgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICROZXdWYWx1ZXMgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfSAuICcjJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3QmxvY2tWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJENoZWNrUmVxdWVzdEZvcm1JREJsb2NrIC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld1ZhbHVlcyAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfSAuICcjJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5ld1ZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICItIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0Jsb2NrVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkQ2hlY2tSZXF1ZXN0Rm9ybUlEQmxvY2sgLiAnPScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld1ZhbHVlcyAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLiAnIyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRHZXRQYXJhbXtCbG9ja1ZhbHVlc30gPSAkTmV3QmxvY2tWYWx1ZXM7CgogICAgaWYgKCAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgaWYgKCAkUmVxdWVzdHtUeXBlfSAmJiAkUmVxdWVzdHtUeXBlfSBuZSAiMCIgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUeXBlSUR9ID0gJFJlcXVlc3R7VHlwZX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VHlwZUlEfSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmcm9tIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0KICAgICAgICAgICAgPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NoYXQgaXMgbm90IGFjdGl2ZS4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgY2hhdCBwYXJ0aWNpcGFudAogICAgICAgIG15ICVDaGF0UGFydGljaXBhbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0UGFydGljaXBhbnRDaGVjaygKICAgICAgICAgICAgQ2hhdElEICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICBDaGF0dGVyVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBDaGF0dGVySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUNoYXRQYXJ0aWNpcGFudCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbi4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAjR2V0IGRlZmF1bHQgUXVldWUgSUQgaWYgbm9uZSBpcyBzZXQKICAgICAgICBteSAkUXVldWVEZWZhdWx0SUQ7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0Rlc3R9ICYmICEkUGFyYW17VG9TZWxlY3RlZH0gKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9IHx8ICcnOwogICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdCkgewogICAgICAgICAgICAgICAgJFF1ZXVlRGVmYXVsdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlRGVmYXVsdCApOwogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZURlZmF1bHRJRCkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb1NlbGVjdGVkfSA9ICRRdWV1ZURlZmF1bHRJRCAuICd8fCcgLiAkUXVldWVEZWZhdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEFDTENvbXBhdEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlRGVmYXVsdElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdhcm4gaWYgdGhlcmUgaXMgbm8gKHZhbGlkKSBkZWZhdWx0IHF1ZXVlIGFuZCB0aGUgY3VzdG9tZXIgY2FuJ3Qgc2VsZWN0IG9uZQogICAgICAgICAgICBlbHNpZiAoICEkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ2hlY2sgU3lzQ29uZmlnIHNldHRpbmcgZm9yICVzOjpRdWV1ZURlZmF1bHQuJywKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntBY3Rpb259CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvcicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtEZXN0fSApIHsKICAgICAgICAgICAgbXkgKCAkUXVldWVJRFBhcmFtLCAkUXVldWVQYXJhbSApID0gc3BsaXQoIC9cfFx8LywgJEdldFBhcmFte0Rlc3R9ICk7CiAgICAgICAgICAgIG15ICRRdWV1ZUlETG9va3VwID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlUGFyYW0gKTsKICAgICAgICAgICAgaWYgKCAkUXVldWVJRExvb2t1cCAmJiAkUXVldWVJRExvb2t1cCBlcSAkUXVldWVJRFBhcmFtICkgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbicpOwogICAgICAgICAgICAgICAgaWYgKCAleyAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb1NlbGVjdGVkfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRRdWV1ZUlEUGFyYW0gLiAnfHwnIC4gJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24tPnskUXVldWVQYXJhbX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG9TZWxlY3RlZH0gPSAkR2V0UGFyYW17RGVzdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQUNMQ29tcGF0R2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRExvb2t1cDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAgICAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFRvU2VsZWN0ZWQgICAgICAgPT4gJFBhcmFte1RvU2VsZWN0ZWR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgRnJvbUNoYXRJRCAgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewoKICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRDb25maWctPntOZXh0U2NyZWVuQWZ0ZXJOZXdUaWNrZXR9OwogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBnZXQgZGVzdGluYXRpb24gcXVldWUKICAgICAgICBteSAkRGVzdCA9ICRHZXRQYXJhbXtEZXN0fSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJFRvICkgewogICAgICAgICAgICAkTmV3UXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdRdWV1ZUlEJyApIHx8ICcnOwogICAgICAgICAgICAkVG8gPSAnU3lzdGVtJzsKICAgICAgICB9CgogICAgICAgICMgZmFsbGJhY2ssIGlmIG5vIGRlc3RpbmF0aW9uIGlzIGdpdmVuCiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdRdWV1ZScgKQogICAgICAgICAgICAgICAgfHwgJENvbmZpZy0+eydRdWV1ZURlZmF1bHQnfQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgICAgIGlmICgkUXVldWUpIHsKICAgICAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlICk7CiAgICAgICAgICAgICAgICAkTmV3UXVldWVJRCA9ICRRdWV1ZUlEOwogICAgICAgICAgICAgICAgJFRvICAgICAgICAgPSAkUXVldWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJElzVXBsb2FkID0gMDsKCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIG15IEBBdHRhY2htZW50SURzID0gbWFwIHsKICAgICAgICAgICAgbXkgKCRJRCkgPSAkXyA9fiBteyBcQSBBdHRhY2htZW50RGVsZXRlIChcZCspIFx6IH14bXM7CiAgICAgICAgICAgICRJRCA/ICRJRCA6ICgpOwogICAgICAgIH0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJc1VwbG9hZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQgb3IgR2V0UGFyYW0gRXhwYW5kCiAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEdldFBhcmFte0V4cGFuZH0gKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3InKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gIHx8ICcnLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5XcmFwUGxhaW5UZXh0KAogICAgICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZXJlIGlzIEZyb21DaGF0SUQsIGdldCByZWxhdGVkIG1lc3NhZ2VzIGFuZCBwcmVwZW5kIHRoZW0gdG8gYm9keQogICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcXVldWUKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCAmJiAhJElzVXBsb2FkICYmICEkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyAgICAgICAgIyBwcmV2ZW50IHRhbXBlciB3aXRoIChRdWV1ZS9EZXN0KSwgc2VlIGJ1ZyM5NDA4CiAgICAgICAgIyAgICAgICAgaWYgKCAkTmV3UXVldWVJRCAmJiAhJElzVXBsb2FkICkgewogICAgICAgICMKICAgICAgICAjICAgICAgICAgICAgIyBnZXQgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgcXVldWVzIHRvIGRpc3BsYXkKICAgICAgICAjICAgICAgICAgICAgbXkgJFRvcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICMgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICMgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICMgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCwKICAgICAgICAjICAgICAgICAgICAgKTsKICAgICAgICAjCiAgICAgICAgIyAgICAgICAgICAgICMgY2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBRdWV1ZUlEIGV4aXN0cyBpbiB0aGUgbGlzdCBvZiBxdWV1ZXMsXAogICAgICAgICMgICAgICAgICAgICAjIG90aGVyd2lzZSByaXNlIGFuIGVycm9yCiAgICAgICAgIyAgICAgICAgICAgIGlmICggISRUb3MtPnskTmV3UXVldWVJRH0gKSB7CiAgICAgICAgIyAgICAgICAgICAgICAgICAkRXJyb3J7UXVldWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgIyAgICAgICAgICAgIH0KICAgICAgICAjCiAgICAgICAgIyAgICAgICAgICAgICMgc2V0IHRoZSBjb3JyZWN0IHF1ZXVlIG5hbWUgaW4gJFRvIGlmIGl0IHdhcyBhbHRlcmVkCiAgICAgICAgIyAgICAgICAgICAgIGlmICggJFRvIG5lICRUb3MtPnskTmV3UXVldWVJRH0gKSB7CiAgICAgICAgIyAgICAgICAgICAgICAgICAkVG8gPSAkVG9zLT57JE5ld1F1ZXVlSUR9OwogICAgICAgICMgICAgICAgICAgICB9CiAgICAgICAgIyAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gJiYgISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgJEVycm9ye1N1YmplY3RJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gJiYgISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgJEVycm9ye0JvZHlJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7RXhwYW5kfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICYmICEkSXNVcGxvYWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSURJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTTEF9CiAgICAgICAgICAgICYmICRDb25maWctPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkSXNVcGxvYWQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTTEFJREludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBteSBAUmVxdWVzdElEQXJyYXlDaGVjayA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKTsKICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlcyAoQFJlcXVlc3RJREFycmF5Q2hlY2spIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5ld1ZhbHVlc30gbmUgIi0iICkgewogICAgICAgICAgICAgICAgbXkgQEZlbGRDaGVjayA9IHNwbGl0KCAvLS8sICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RGb3JtSURzfSA9ICcnOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgICAgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgICAgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFRvU2VsZWN0ZWQgICAgICAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjayggVHlwZSA9PiAnQ3VzdG9tZXInICk7CgogICAgICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHByaW9yaXR5LCBzZXQgaXQgdG8gZGVmYXVsdAogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHl9ICAgPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlcXVlc3RGb3JtTmFtZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVxdWVzdCcpOwoKICAgICAgICBteSAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgPSAnPGI+JyAuICRSZXF1ZXN0Rm9ybU5hbWUgLiAnOiAnIC4gJFJlcXVlc3R7TmFtZX0gLiAnPC9iPjxicj48YnI+PGRpdiBpZD0iUmVxdWVzdCI+JzsKCiAgICAgICAgaWYgKCRUaWNrZXRJRCkgewoKICAgICAgICAgICAgbXkgJFRpY2tldElEU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRJRFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgUmVxdWVzdElEID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlQ2hlY2tSZXF1ZXN0ID0gJFJlcXVlc3RPYmplY3QtPlJlcXVlc3RHZXQoCiAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRDaGVja1JlcXVlc3R7T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3duZXJTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJENoZWNrUmVxdWVzdHtPd25lcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdHtSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZXNwb25zaWJsZVN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkQ2hlY2tSZXF1ZXN0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNob3dDb25maWdJdGVtID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb25maWdJdGVtWm9vbVNlYXJjaCcpOwogICAgICAgICAgICBpZiAoICRTaG93Q29uZmlnSXRlbSAmJiAkU2hvd0NvbmZpZ0l0ZW0gPj0gMSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0e1Nob3dDb25maWdJdGVtfSBlcSAiMSIgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAgICAgICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENsYXNzICggJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2xhc3MgPX4gL15cZCskLyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ2hlY2tDb25maWdJdGVtc0lEID0gJ0NvbmZpZ0l0ZW1JRCcgLiAkQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQ29uZmlnSXRlbUFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkQ2hlY2tDb25maWdJdGVtc0lEICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtQXJyYXkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnUmVsZXZhbnRUbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFJlcXVlc3RJREFycmF5ICAgICA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gKTsKICAgICAgICAgICAgbXkgJERhdGVTdHJpbmcgICAgICAgICA9ICcnOwogICAgICAgICAgICBteSAkRGF0ZUtleSAgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDaGVja1JlcXVlc3RGb3JtSUQgPSAnJzsKCiAgICAgICAgICAgIGZvciBteSAkTmV3VmFsdWVzIChAUmVxdWVzdElEQXJyYXkpIHsKICAgICAgICAgICAgICAgIG15IEBGZWxkQ2hlY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZpZWxkczsKCiAgICAgICAgICAgICAgICBpZiAoICRGZWxkQ2hlY2tbMV0gJiYgJEZlbGRDaGVja1sxXSAhfiAvW2Etel0vaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrUmVxdWVzdEZvcm1JRCA9ICRSZXF1ZXN0Rm9ybXtJRH07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZvcm17RmVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSA9ICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdCiAgICAgICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRmVsZENoZWNrWzBdICF+IC9IZWFkbGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvRGVzY3JpcHRpb24vCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQENoZWNrTXVsdGkgPSBzcGxpdCggLywvLCAkR2V0UGFyYW17JE5ld1ZhbHVlc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE5ld1JlcXVlc3RGaWVsZEluaGFsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld011bHRpIChAQ2hlY2tNdWx0aSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0RmllbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkS2V5ID0+ICROZXdNdWx0aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3UmVxdWVzdEZpZWxkSW5oYWx0IC49ICRSZXF1ZXN0RmllbGRJbmhhbHQgLiAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdSZXF1ZXN0RmllbGRJbmhhbHQgPSBzdWJzdHIoICROZXdSZXF1ZXN0RmllbGRJbmhhbHQsIDAsIC0yICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJzxkaXYgc3R5bGU9IndpZHRoOjE1MHB4O2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPjxzdHJvbmc+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvc3Ryb25nPjo8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTmV3UmVxdWVzdEZpZWxkSW5oYWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8YnI+PC9kaXY+PGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJE5ld1JlcXVlc3RGaWVsZEluaGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEcm9wZG93biIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRSZXF1ZXN0RmllbGRJbmhhbHQgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRLZXkgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxNTBweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij48c3Ryb25nPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8L3N0cm9uZz46IDwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRJbmhhbHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkUmVxdWVzdEZpZWxkSW5oYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkR29HZXRQYXJhbU5ldyA9ICJSZXF1ZXN0Rm9ybUJsb2NrSURzIiAuICRDaGVja1JlcXVlc3RGb3JtSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbU5ldzsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCRHb0dldFBhcmFtTmV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW1OZXd7JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5IC49ICRTZWxmLT5fU2V0QmxvY2tIVE1MKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tSZXF1ZXN0Rm9ybUlEICA9PiAkQ2hlY2tSZXF1ZXN0Rm9ybUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtTmV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1CbG9ja0lEcyA9PiAkR2V0UGFyYW1OZXd7JEdvR2V0UGFyYW1OZXd9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICdUZXh0QXJlYScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KCBTdHJpbmcgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OiA8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRmVsZENoZWNrWzBdID1+IC9IZWFkbGluZS8gKSB7CgogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQm9keQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrOyI+JwogICAgICAgICAgICAgICAgICAgICAgICAuICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAuICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRGZWxkQ2hlY2tbMF0gPX4gL0Rlc2NyaXB0aW9uLyApIHsKCiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAkRGF0ZUtleSA9ICRGZWxkQ2hlY2tbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9EYXkvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nIC49ICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9Nb250aC9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIi4iIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL1llYXIvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nIC49ICIuIiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvSG91ci9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIiAiIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL01pbnV0ZS9pZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgLj0gIjoiIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgICAgICAkRmVsZENoZWNrWzFdID1+IHMvTWludXRlLy9pZzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtT2JqZWN0LT5SZXF1ZXN0Rm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OiA8L2Rpdj4gPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRGF0ZVN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPGJyPjwvZGl2PjxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRSZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRLZXkgICAgICA9PiAkRGF0ZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkRGF0ZVN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVLZXkgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdHtUZW1wbGF0ZUlEfSAmJiAkQ2hlY2tSZXF1ZXN0e1RlbXBsYXRlSUR9ID49IDEgKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgY2hhbmdlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJENoZWNrUmVxdWVzdHtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VBZnRlciA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTZXROZXdUaXRsZSA9ICRDaGFuZ2VBZnRlci0+e0NoYW5nZVRpdGxlfSAuICcgLSAnIC4gJEdldFBhcmFte1N1YmplY3R9OwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkU2V0TmV3VGl0bGUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsaW5rIHRpY2tldCB3aXRoIG5ld2x5IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgICAgICAgICBteSAkTGlua1N1Y2Nlc3MgPSAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEFydGljbGVCb2R5IC49ICc8L2Rpdj4nOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gZXEgIi0iICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQXJ0aWNsZUJvZHk7CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEFydGljbGVCb2R5OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFBsYWluQm9keSA9ICRHZXRQYXJhbXtCb2R5fTsKCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBsYWluQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKCBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBhcnRpY2xlCiAgICAgICAgbXkgJEZ1bGxOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnICk7CgogICAgICAgIG15ICRGcm9tICAgICAgPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKQogICAgICAgICAgICA/ICdhdXRvIHJlcGx5JwogICAgICAgICAgICA6ICcnLAogICAgICAgICAgICBPcmlnSGVhZGVyID0+IHsKICAgICAgICAgICAgICAgIEZyb20gICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBUbyAgICAgID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkUGxhaW5Cb2R5LAogICAgICAgICAgICB9LAogICAgICAgICAgICBRdWV1ZSA9PiAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCBUaXRsZSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSAlQ2hhdCAgICAgICA9ICRDaGF0T2JqZWN0LT5DaGF0R2V0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlTGlzdCA9ICRDaGF0T2JqZWN0LT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ2hhdEFydGljbGVJRDsKCiAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICBteSAkSlNPTkJvZHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQENoYXRNZXNzYWdlTGlzdCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlVHlwZSA9ICdjaGF0LWV4dGVybmFsJzsKCiAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCgogICAgICAgICAgICAgICAgICAgICNOb0FnZW50Tm90aWZ5ID0+ICROb0FnZW50Tm90aWZ5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAkQ2hhdEFydGljbGVUeXBlLAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKCiAgICAgICAgICAgICAgICAgICAgRnJvbSA9PiAkRnJvbSwKCiAgICAgICAgICAgICAgICAgICAgIyBUbyAgICAgICAgICAgICAgID0+ICRUbywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgnQ2hhdCcpLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgID0+ICRKU09OQm9keSwKICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICA9PiAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdHRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKCiAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlQ3VzdG9tZXJDaGVja1JlcXVlc3QgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdEdldCgKICAgICAgICAgICAgUmVxdWVzdElEID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVUaWNrZXROdW1iZXJTZW5kID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJERlc3QgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRvcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICBteSAkTmV3VG9zOwoKICAgICAgICBpZiAoJFRvcykgewogICAgICAgICAgICBUT3M6CiAgICAgICAgICAgIGZvciBteSAkS2V5VG8gKCBzb3J0IGtleXMgJXskVG9zfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVE9zIGlmICggJFRvcy0+eyRLZXlUb30gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAkTmV3VG9zLT57IiRLZXlUb3x8JFRvcy0+eyRLZXlUb30ifSA9ICRUb3MtPnskS2V5VG99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV3VG9zLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU3ViYWN0aW9uIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yJyksCiAgICAgICAgKTsKICAgIH0KCn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSB8fCAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtTZXJ2aWNlc30gJiYgJXsgJFBhcmFte1NlcnZpY2VzfSB9ICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfS0+eyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3MgPSAoICcnLCAnLScgKTsKICAgIG15ICRNb2R1bGUKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbDo6TmV3VGlja2V0UXVldWVTZWxlY3Rpb25Nb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Q3VzdG9tZXJOZXdUaWNrZXQ6OlF1ZXVlU2VsZWN0aW9uR2VuZXJpYyc7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIFN5c3RlbUFkZHJlc3MgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKSwKICAgICAgICAgICAgRGVidWcgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICApOwoKICAgICAgICAjIGxvZyBsb2FkZWQgbW9kdWxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSAmJiAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNb2R1bGU6ICRNb2R1bGUgbG9hZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICVOZXdUb3MgPSAoCiAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIEVudiAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEFDTFBhcmFtcyA9PiBcJVBhcmFtCiAgICAgICAgICAgICksCiAgICAgICAgICAgICggJycsID0+ICctJyApCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkZhdGFsRGllKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgbG9hZCAkTW9kdWxlISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCnN1YiBfTWFza05ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKICAgIG15ICRSZXF1ZXN0T2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3QnKTsKICAgIG15ICRSZXF1ZXN0RmllbGRzT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGaWVsZHMnKTsKICAgIG15ICRSZXF1ZXN0Rm9ybU9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtJyk7CiAgICBteSAkVGlja2V0UmVxdWVzdE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXRSZXF1ZXN0Jyk7CiAgICBteSAkVGltZU9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CiAgICBteSAkTGlua09iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJFVzZXJPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkU2VuZG1haWxPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgbXkgJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVxdWVzdEZvcm1CbG9jaycpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKICAgICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSA9ICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSB8fCAnJzsKCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgY3JlYXRlIGEgc3RyaW5nIHdpdGggdGhlIHF1b3RlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGROYW1lcykgKSB7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JER5bmFtaWNGaWVsZE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZE5hbWVzU3RyZ30gLj0gIiwgJyIgLiAkRmllbGQgLiAiJyI7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAlUmVxdWVzdCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0R2V0KAogICAgICAgIFJlcXVlc3RJRCA9PiAkUGFyYW17UmVxdWVzdElEfSwKICAgICk7CgogICAgJFBhcmFte05vQm9keWRpc3BsYXl9ICAgICAgICAgICA9ICdkaXNwbGF5Om5vbmUnOwogICAgJFBhcmFte05vQm9keUFsdGRpc3BsYXl9ICAgICAgICA9ICdkaXNwbGF5OmlubGluZSc7CiAgICAkUGFyYW17IkJvZHlWYWxpZGF0ZV9SZXF1aXJlZCJ9ID0gJyc7CgogICAgJFBhcmFte1JlcXVlc3ROYW1lfSA9ICRSZXF1ZXN0e05hbWV9OwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdGZWxkZXJMaXN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggISRSZXF1ZXN0e1N1YmplY3RDaGFuZ2VhYmxlfSB8fCAkUmVxdWVzdHtTdWJqZWN0Q2hhbmdlYWJsZX0gPT0gMiApIHsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1YmplY3ROb0NoYW5nZWFibGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdWJqZWN0Q2hhbmdlYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVJlcXVlc3RGb3JtTGlzdCA9ICRSZXF1ZXN0Rm9ybU9iamVjdC0+UmVxdWVzdEZvcm1MaXN0KAogICAgICAgIFJlcXVlc3RJRCA9PiAkUGFyYW17UmVxdWVzdElEfSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgJElmVmFsdWU7CiAgICBmb3IgbXkgJFJlcXVlc3RGb3JtTGlzdElEICgKICAgICAgICBzb3J0IHsgJFJlcXVlc3RGb3JtTGlzdHskYX0gPD0+ICRSZXF1ZXN0Rm9ybUxpc3R7JGJ9IH0KICAgICAgICBrZXlzICVSZXF1ZXN0Rm9ybUxpc3QKICAgICAgICApCiAgICB7CgogICAgICAgICNnZXQgUmVxdWVzdEZvcm0KICAgICAgICBteSAlUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1PYmplY3QtPlJlcXVlc3RGb3JtR2V0KAogICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFJlcXVlc3RGb3Jte0t1bmRlbn0gPSAxOwoKICAgICAgICAkUGFyYW17VG9vbFRpcH0gICAgICAgPSAkUmVxdWVzdEZvcm17VG9vbFRpcH07CiAgICAgICAgJFBhcmFte0ZlbGRBa3R1ZWxsSUR9ID0gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAkUGFyYW17VG9vbFRpcFVuZGVyfSA9ICRSZXF1ZXN0Rm9ybXtUb29sVGlwfTsKICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybXtUb29sVGlwVW5kZXJ9ICkgewogICAgICAgICAgICAkUGFyYW17VG9vbFRpcFVuZGVyfSA9fiBzL1xuLzxicj4vZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUb29sVGlwVW5kZXJ9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkUmVxdWVzdEZvcm17SGVhZGxpbmV9ICYmICEkUmVxdWVzdEZvcm17RGVzY3JpcHRpb259ICkgewoKICAgICAgICAgICAgI2dldCBSZXF1ZXN0RmllbGQKICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICNnZXQgUmVxdWVzdEZpZWxkc1dlcnRlCiAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzV2VydGUgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJFJlcXVlc3RGaWVsZHN7SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgI2dldCBsaXN0CiAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzTGlzdGUgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRlTGlzdCgKICAgICAgICAgICAgICAgIEZlbGRJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVSZXF1ZXN0V2VydGVEcm9wZG93biA9ICgpOwogICAgICAgICAgICBpZiAoJVJlcXVlc3RGaWVsZHNMaXN0ZSkgewogICAgICAgICAgICAgICAgZm9yIG15ICRSZXF1ZXN0RmllbGRzV2VydGVJRCAoIHNvcnQga2V5cyAlUmVxdWVzdEZpZWxkc0xpc3RlICkgewoKICAgICAgICAgICAgICAgICAgICAjZ2V0IFJlcXVlc3RGaWVsZHNXZXJ0ZQogICAgICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0RmllbGRzV2VydGUgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc1dlcnRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBJRCA9PiAkUmVxdWVzdEZpZWxkc1dlcnRlSUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdFdlcnRlRHJvcGRvd257ICRSZXF1ZXN0RmllbGRzV2VydGV7U2NobHVlc3NlbH0gfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRSZXF1ZXN0RmllbGRzV2VydGV7SW5oYWx0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0ZlbGRMYWJlbGluZ30gPSAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ307CiAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX07CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICBteSBARGVmYXVsdHZhbHVlVmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgQERlZmF1bHR2YWx1ZVZhbHVlID0gc3BsaXQoIC8sLywgJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBARGVmYXVsdHZhbHVlVmFsdWUgPSBzcGxpdCggLywvLCAkUGFyYW17JElmVmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gJiYgJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVSZXF1ZXN0V2VydGVEcm9wZG93biwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSwKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+IFxARGVmYXVsdHZhbHVlVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyTXVsdGlzZWxlY3RSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIk11bHRpc2VsZWN0IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICBteSBARGVmYXVsdHZhbHVlVmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgQERlZmF1bHR2YWx1ZVZhbHVlID0gc3BsaXQoIC8sLywgJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBARGVmYXVsdHZhbHVlVmFsdWUgPSBzcGxpdCggLywvLCAkUGFyYW17JElmVmFsdWV9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gJiYgJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVSZXF1ZXN0V2VydGVEcm9wZG93biwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSwKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+IFxARGVmYXVsdHZhbHVlVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyTXVsdGlzZWxlY3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiRHJvcGRvd24iICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ID0gJFBhcmFteyRJZlZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSAmJiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJEcm9wZG93blJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiRHJvcGRvd24iICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ID0gJFBhcmFteyRJZlZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0xlZXJXZXJ0fSAmJiAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkUmVxdWVzdEZpZWxkc3tMZWVyV2VydH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVJlcXVlc3RXZXJ0ZURyb3Bkb3duLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFJlcXVlc3RGaWVsZHN7TGVlcldlcnR9LAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJUZXh0IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRQYXJhbXskSWZWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyVGV4dFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiVGV4dCIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZERlZmF1bHR2YWx1ZX0gPSAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9OwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmVsZERlZmF1bHR2YWx1ZX0gPSAkUGFyYW17JElmVmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlclRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiVGV4dEFyZWEiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAxICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAgICAgI2dlbmVyYXRlIG91dHB1dAogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGREZWZhdWx0dmFsdWV9ID0gJFJlcXVlc3RGaWVsZHN7RGVmYXVsdHZhbHVlfTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZX0gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRSb3dzfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7Um93c307CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZENvbHN9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tDb2xzfTsKCiAgICAgICAgICAgICAgICAkSWZWYWx1ZSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JElmVmFsdWV9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRQYXJhbXskSWZWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyVGV4dEFyZWFSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIlRleHRBcmVhIiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkUm93c30gICAgICAgICA9ICRSZXF1ZXN0RmllbGRze1Jvd3N9OwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRDb2xzfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7Q29sc307CgogICAgICAgICAgICAgICAgJElmVmFsdWUgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRJZlZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmVsZERlZmF1bHR2YWx1ZX0gPSAkUGFyYW17JElmVmFsdWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSA9ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlclRleHRBcmVhJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9IC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIiwiOwoKICAgICAgICAgICAgICAgICNnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkRGVmYXVsdHZhbHVlfSA9ICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX07CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWV9ICAgICAgICAgPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRDsKCiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze0RlZmF1bHR2YWx1ZX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RmVsZENoZWNrZWR9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRDaGVja2VkfSA9ICcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckNoZWNrYm94UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJDaGVja2JveCIgJiYgJFJlcXVlc3RGb3Jte1JlcXVpcmVkRmllbGR9ID09IDIgKSB7CgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKCiAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZERlZmF1bHR2YWx1ZX0gPSAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9OwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lfSAgICAgICAgID0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tEZWZhdWx0dmFsdWV9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZlbGRDaGVja2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkQ2hlY2tlZH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJDaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJEYXRlIiAmJiAkUmVxdWVzdEZvcm17UmVxdWlyZWRGaWVsZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiRGF5LCI7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiTW9udGgsIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJZZWFyLCI7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiSG91ciwiOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIk1pbnV0ZSwiOwoKICAgICAgICAgICAgICAgIG15ICROZXdEaWZmVGltZSAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDA7CiAgICAgICAgICAgICAgICBteSAkUGVyaW9kRnV0dXJlID0gNTsKICAgICAgICAgICAgICAgIG15ICRQZXJpb2RQYXN0ICAgPSAwOwoKICAgICAgICAgICAgICAgICMgZGF0ZSBkYXRhIHN0cmluZwogICAgICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICA9PiAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgID0+ICRQZXJpb2RQYXN0LAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgPT4gJFBlcmlvZEZ1dHVyZSwKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICAgID0+ICROZXdEaWZmVGltZSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybWF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdEZlbGRlckRhdGVSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkRhdGUiICYmICRSZXF1ZXN0Rm9ybXtSZXF1aXJlZEZpZWxkfSA9PSAyICkgewoKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJEYXksIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJNb250aCwiOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfQogICAgICAgICAgICAgICAgICAgIC49ICRSZXF1ZXN0RmllbGRze05hbWV9IC4gJy0nIC4gJFJlcXVlc3RGb3JtTGlzdElEIC4gIlllYXIsIjsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30KICAgICAgICAgICAgICAgICAgICAuPSAkUmVxdWVzdEZpZWxkc3tOYW1lfSAuICctJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICJIb3VyLCI7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdEZvcm1JRHN9CiAgICAgICAgICAgICAgICAgICAgLj0gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiTWludXRlLCI7CgogICAgICAgICAgICAgICAgbXkgJE5ld0RpZmZUaW1lICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMDsKICAgICAgICAgICAgICAgIG15ICRQZXJpb2RGdXR1cmUgPSA1OwogICAgICAgICAgICAgICAgbXkgJFBlcmlvZFBhc3QgICA9IDA7CgogICAgICAgICAgICAgICAgIyBkYXRlIGRhdGEgc3RyaW5nCiAgICAgICAgICAgICAgICAkUGFyYW17RmVsZE5hbWVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgPT4gJFJlcXVlc3RGaWVsZHN7TmFtZX0gLiAnLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQsCiAgICAgICAgICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gJFBlcmlvZFBhc3QsCiAgICAgICAgICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gJFBlcmlvZEZ1dHVyZSwKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkTmV3RGlmZlRpbWUsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJEYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybXtIZWFkbGluZX0gKSB7CgogICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybXtEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkUmVxdWVzdEZvcm17RGVzY3JpcHRpb259ID1+IHMvXG4vPGJyXC8+L2lnOwogICAgICAgICAgICAgICAgJFBhcmFte0Rlc2NyaXB0aW9ufSAgICAgICAgID0gJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgICRQYXJhbXtGZWxkTmFtZURlc2NyaXB0aW9ufSA9ICdEZXNjcmlwdGlvbi0nIC4gJFJlcXVlc3RGb3JtTGlzdElEOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RGb3JtSURzfSAuPSAnRGVzY3JpcHRpb24tJyAuICRSZXF1ZXN0Rm9ybUxpc3RJRCAuICIsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0ZlbGROYW1lSGVhZGxpbmV9ID0gJ0hlYWRsaW5lLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQ7CiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0Rm9ybUlEc30gLj0gJ0hlYWRsaW5lLScgLiAkUmVxdWVzdEZvcm1MaXN0SUQgLiAiLCI7CgogICAgICAgICAgICAkUGFyYW17SGVhZGxpbmV9ID0gJFJlcXVlc3RGb3Jte0hlYWRsaW5lfTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RGZWxkZXJIZWFkbGluZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17RGVzY3JpcHRpb259ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0RmVsZGVyUmVxdWVzdEZvcm1JRHMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFNob3dDb25maWdJdGVtID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb25maWdJdGVtWm9vbVNlYXJjaCcpOwogICAgaWYgKCAkU2hvd0NvbmZpZ0l0ZW0gJiYgJFNob3dDb25maWdJdGVtID49IDEgKSB7CgogICAgICAgIGlmICggJFJlcXVlc3R7U2hvd0NvbmZpZ0l0ZW19IGVxICIxIiApIHsKCiAgICAgICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAgICAgICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkVmVyc2lvbklEOwogICAgICAgICAgICBteSAkQ2hlY2tJdGVtICAgPSAwOwogICAgICAgICAgICBteSAlQ29uZmlnSXRlbXMgPSAoKTsKCiAgICAgICAgICAgIGZvciBteSAkQ2xhc3MgKCAleyRDbGFzc0xpc3R9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkQ2xhc3MgPX4gL15cZCskLyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgQFNob3dDb25maWdJdGVtcyA9IHNwbGl0KCAvLC8sICRSZXF1ZXN0e1Nob3dDb25maWdJdGVtc30gKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDaGVja0lmQ2xhc3MgKEBTaG93Q29uZmlnSXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2tJZkNsYXNzID09ICRDbGFzcyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IHNlYXJjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFJlc3VsdExpc3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzSURzID0+IFskQ2xhc3NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlslXXsnVmVyc2lvbid9WyVdeydPd25lcid9WyVdeydDb250ZW50J30iID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gPSAkeyRDbGFzc0xpc3R9eyRDbGFzc307CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRTZWFyY2hSZXN1bHRMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZlcnNpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRWZXJzaW9uUmVmLT57TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGVja0l0ZW0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1zeyAkVmVyc2lvblJlZi0+e0NvbmZpZ0l0ZW1JRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkVmVyc2lvblJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb25maWdJdGVtSUQnIC4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVja0l0ZW0gPj0gMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlnSXRlbUNsYXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQ2hlY2tJdGVtICAgPSAwOwogICAgICAgICAgICAgICAgJUNvbmZpZ0l0ZW1zID0gKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkQ29uZmlnLT57UXVldWV9ICkgewoKICAgICAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgICAgICBteSAlTmV3VG9zID0gKCAnJywgJy0nICk7CiAgICAgICAgbXkgJE1vZHVsZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbDo6TmV3VGlja2V0UXVldWVTZWxlY3Rpb25Nb2R1bGUnKQogICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkN1c3RvbWVyTmV3VGlja2V0OjpRdWV1ZVNlbGVjdGlvbkdlbmVyaWMnOwogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSAmJiAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNb2R1bGU6ICRNb2R1bGUgbG9hZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICVOZXdUb3MgPSAoCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgICAgIEFDTFBhcmFtcyA9PiBcJVBhcmFtCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgICAgIGlmICglTmV3VG9zKSB7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlTmV3VG9zICkgewogICAgICAgICAgICAgICAgJE5ld1Rvc3siJF98fCROZXdUb3N7JF99In0gPSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17VG9TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV3VG9zLAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtUb1NlbGVjdGVkfSB8fCAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgIFRyZWVWaWV3ICAgPT4gJFRyZWVWaWV3LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUludmFsaWQgPT4gJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJENvbmZpZy0+e1ByaW9yaXR5fSApIHsKICAgICAgICBteSAlUHJpb3JpdGllcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgICAgIG15ICVQcmlvcml0eVNlbGVjdGVkOwogICAgICAgIGlmICggJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZElEfSA9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1ByaW9yaXR5RGVmYXVsdH0gfHwgJzMgbm9ybWFsJzsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgPT4gXCVQcmlvcml0aWVzLAogICAgICAgICAgICBOYW1lICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgIENsYXNzID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57J1RpY2tldFR5cGUnfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9ICYmICEkUGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgbXkgJVJldmVyc2VUeXBlID0gcmV2ZXJzZSAlVHlwZTsKICAgICAgICAgICAgJFBhcmFte1R5cGVJRH0gPSAkUmV2ZXJzZVR5cGV7ICRDb25maWctPnsnVGlja2V0VHlwZURlZmF1bHQnfSB9OwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgPT4gIlZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAiIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZUlESW52YWxpZCA9PiAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRDb25maWctPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZXM7CiAgICAgICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAgICAgJVNlcnZpY2VzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNlcnZpY2VzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgIgogICAgICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2VzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglU2VydmljZXMpIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICEkU2VydmljZXN7ICRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnIH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgfQogICAgICAgIG15ICVTTEE7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICVTTEEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEFNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVTTEEpIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycwogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRQYXJhbXtFcnJvcnN9LT57JF99OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15IEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFJlcXVlc3R7U2hvd0F0dGFjaG1lbnR9ID09IDEgfHwgISRSZXF1ZXN0e1Nob3dBdHRhY2htZW50fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvd0F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgUGVybWlzc2lvbnMgaGF2ZSBiZWVuIGNoZWNrZWQgYmVmb3JlIGluIFJ1bigpCiAgICBpZiAoICRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBteSBAQ2hhdE1lc3NhZ2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICBDaGF0SUQgPT4gJFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXRBcnRpY2xlUHJldmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+IFxAQ2hhdE1lc3NhZ2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdSZXF1ZXN0Q3VzdG9tZXJUaWNrZXRNZXNzYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdyggRGVzdCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCApOwogICAgfQoKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKc3ViIF9TZXRCbG9ja0hUTUwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGb3JtQmxvY2snKTsKICAgIG15ICRSZXF1ZXN0RmllbGRzT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3RGaWVsZHMnKTsKICAgIG15ICRSZXF1ZXN0T2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRSZXF1ZXN0T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldFJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICA9ICV7ICRQYXJhbXtHZXRQYXJhbX0gfTsKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgPSAkUGFyYW17VGlja2V0SUR9OwogICAgbXkgJFRpY2tldFVzZXJJRCAgICAgICA9ICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENoZWNrUmVxdWVzdEZvcm1JRCA9ICRQYXJhbXtDaGVja1JlcXVlc3RGb3JtSUR9OwogICAgJEdldFBhcmFte1JlcXVlc3RJRH0gICAgICAgICAgID0gJFBhcmFte1JlcXVlc3RJRH07CiAgICAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEc30gPSAkUGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEc307CgogICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEc30gKSB7CiAgICAgICAgbXkgQFJlcXVlc3RGb3JtSURBcnJheSA9IHNwbGl0KCAvLC8sICRHZXRQYXJhbXtSZXF1ZXN0Rm9ybUJsb2NrSURzfSApOwogICAgICAgIGZvciBteSAkTmV3VmFsdWVzIChAUmVxdWVzdEZvcm1JREFycmF5KSB7CiAgICAgICAgICAgIG15IEBGZWxkQ2hlY2sgPSBzcGxpdCggLy0vLCAkTmV3VmFsdWVzICk7CiAgICAgICAgICAgIGlmICggJEZlbGRDaGVja1sxXSAmJiAoICRGZWxkQ2hlY2tbMV0gIX4gL1thLXpdL2lnICkgKSB7CiAgICAgICAgICAgICAgICBteSAlUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHMgPSAkUmVxdWVzdEZpZWxkc09iamVjdC0+UmVxdWVzdEZpZWxkc0dldCgKICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRzSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVxdWVzdEZpZWxkc3tUeXB9IGVxICJNdWx0aXNlbGVjdCIgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQE11bHRpQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbU5ldyAoCiAgICAgICAgICAgICAgICAgICAgICAgIHF3KCROZXdWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEBNdWx0aUFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJE5ld1ZhbHVlcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld1ZhbHVlIChATXVsdGlBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gLj0gIiROZXdWYWx1ZSwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkNoZWNrYm94IiAmJiAhJEdldFBhcmFteyROZXdWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiTmVpbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiQ2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEdldFBhcmFteyROZXdWYWx1ZXN9ICYmICRHZXRQYXJhbXskTmV3VmFsdWVzfSBuZSAnTmVpbicgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiSmEiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17JE5ld1ZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskTmV3VmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JE5ld1ZhbHVlc30gPSAiLSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUNoZWNrUmVxdWVzdCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0R2V0KAogICAgICAgIFJlcXVlc3RJRCA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICk7CgogICAgbXkgJEFydGljbGVCb2R5ID0gJyc7CgogICAgaWYgKCAkR2V0UGFyYW17UmVxdWVzdEZvcm1CbG9ja0lEc30gKSB7CgogICAgICAgICRBcnRpY2xlQm9keSAuPSAnPGhyIHN0eWxlPSJiYWNrZ3JvdW5kOiMwMDAwMDA7aGVpZ2h0OjFweDsiIC8+PGJyLz4nOwoKICAgICAgICBteSBAQW50cmFnSURBcnJheUJsb2NrID0gc3BsaXQoIC8sLywgJEdldFBhcmFte1JlcXVlc3RGb3JtQmxvY2tJRHN9ICk7CiAgICAgICAgbXkgJERhdGVTdHJpbmdCbG9jayAgICA9ICcnOwogICAgICAgIG15ICREYXRlS2V5QmxvY2sgICAgICAgPSAnJzsKCiAgICAgICAgZm9yIG15ICROZXdWYWx1ZXMgKEBBbnRyYWdJREFycmF5QmxvY2spIHsKICAgICAgICAgICAgbXkgQEZlbGRDaGVjayA9IHNwbGl0KCAvLS8sICROZXdWYWx1ZXMgKTsKICAgICAgICAgICAgbXkgJVJlcXVlc3RGaWVsZHM7CiAgICAgICAgICAgIGlmICggJEZlbGRDaGVja1sxXSAmJiAkRmVsZENoZWNrWzFdICF+IC9bYS16XS9pZyApIHsKICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrR2V0KAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0Rm9ybXtGZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICVSZXF1ZXN0RmllbGRzID0gJFJlcXVlc3RGaWVsZHNPYmplY3QtPlJlcXVlc3RGaWVsZHNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZHNJRCA9PiAkUmVxdWVzdEZvcm17RmVsZElEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9ID0gJFJlcXVlc3RGb3Jte0Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZlbGRDaGVja1sxXQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRGZWxkQ2hlY2tbMV0gIX4gL1thLXpdL2lnCiAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvSGVhZGxpbmUvCiAgICAgICAgICAgICAgICAgICAgJiYgJEZlbGRDaGVja1swXSAhfiAvRGVzY3JpcHRpb24vCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggJFJlcXVlc3RGaWVsZHN7VHlwfSBlcSAiTXVsdGlzZWxlY3QiICkgewogICAgICAgICAgICAgICAgICAgIG15IEBDaGVja011bHRpID0gc3BsaXQoIC8sLywgJEdldFBhcmFteyROZXdWYWx1ZXN9ICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE5ld0FudHJhZ0ZlbGRJbmhhbHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE5ld011bHRpIChAQ2hlY2tNdWx0aSkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQW50cmFnRmVsZEluaGFsdCA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydExvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGaWVsZEtleSA9PiAkTmV3TXVsdGksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdBbnRyYWdGZWxkSW5oYWx0IC49ICRBbnRyYWdGZWxkSW5oYWx0IC4gJywgJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJUNoZWNrUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2tSZXF1ZXN0Rm9ybUlEID09ICRDaGVja1JlcXVlc3RGb3Jte1JlcXVlc3RGb3JtSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxNTBweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij48c3Ryb25nPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8L3N0cm9uZz46PC9kaXY+IDxkaXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5ld0FudHJhZ0ZlbGRJbmhhbHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxicj48L2Rpdj48ZGl2IHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQgICAgPT4gJEdldFBhcmFte1JlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRWYWx1ZSAgICA9PiAkTmV3QW50cmFnRmVsZEluaGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkUmVxdWVzdEZpZWxkc3tMYWJlbGluZ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFRpY2tldFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgIkRyb3Bkb3duIiApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQW50cmFnRmVsZEluaGFsdCA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzV2VydExvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZpZWxkS2V5ID0+ICRHZXRQYXJhbXskTmV3VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICVDaGVja1JlcXVlc3RGb3JtID0gJFJlcXVlc3RGb3JtQmxvY2tPYmplY3QtPlJlcXVlc3RGb3JtQmxvY2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtSUQgPT4gJEZlbGRDaGVja1sxXSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJENoZWNrUmVxdWVzdEZvcm1JRCA9PSAkQ2hlY2tSZXF1ZXN0Rm9ybXtSZXF1ZXN0Rm9ybUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6MTUwcHg7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3BhZGRpbmc6NXB4OyI+PHN0cm9uZz4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPC9zdHJvbmc+OjwvZGl2PiA8ZGl2IHN0eWxlPSJkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRBbnRyYWdGZWxkSW5oYWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8YnI+PC9kaXY+PGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJEFudHJhZ0ZlbGRJbmhhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRUaWNrZXRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUNoZWNrUmVxdWVzdEZvcm0gPSAkUmVxdWVzdEZvcm1CbG9ja09iamVjdC0+UmVxdWVzdEZvcm1CbG9ja0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA9PiAkRmVsZENoZWNrWzFdLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2tSZXF1ZXN0Rm9ybUlEID09ICRDaGVja1JlcXVlc3RGb3Jte1JlcXVlc3RGb3JtSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXF1ZXN0RmllbGRze1R5cH0gZXEgJ1RleHRBcmVhJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskTmV3VmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoIFN0cmluZyA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxNTBweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij48c3Ryb25nPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8L3N0cm9uZz46PC9kaXY+IDxkaXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8YnI+PC9kaXY+PGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldFJlcXVlc3RPYmplY3QtPlRpY2tldFJlcXVlc3RBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdElEICAgID0+ICRHZXRQYXJhbXtSZXF1ZXN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZEtleSAgICAgID0+ICRGZWxkQ2hlY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZExhYmVsaW5nID0+ICRSZXF1ZXN0RmllbGRze0xhYmVsaW5nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGlja2V0VXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGZWxkQ2hlY2tbMF0gPX4gL0hlYWRsaW5lLyApIHsKCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAuPSAnPGRpdiBzdHlsZT0id2lkdGg6OTclO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo1cHg7Ij4nCiAgICAgICAgICAgICAgICAgICAgLiAkR2V0UGFyYW17JE5ld1ZhbHVlc30KICAgICAgICAgICAgICAgICAgICAuICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UmVxdWVzdE9iamVjdC0+VGlja2V0UmVxdWVzdEFkZCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICBGZWxkS2V5ICAgICAgPT4gJEZlbGRDaGVja1swXSwKICAgICAgICAgICAgICAgICAgICBGZWxkVmFsdWUgICAgPT4gJEdldFBhcmFteyROZXdWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgIEZlbGRMYWJlbGluZyA9PiAkR2V0UGFyYW17JE5ld1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICREYXRlS2V5QmxvY2sgPSAkRmVsZENoZWNrWzBdOwogICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9EYXkvaWcgKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGVTdHJpbmdCbG9jayAuPSAkR2V0UGFyYW17JE5ld1ZhbHVlc307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICROZXdWYWx1ZXMgPX4gL01vbnRoL2lnICkgewogICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nQmxvY2sgLj0gIi4iIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkTmV3VmFsdWVzID1+IC9ZZWFyL2lnICkgewogICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nQmxvY2sgLj0gIi4iIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvSG91ci9pZyApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVN0cmluZ0Jsb2NrIC49ICIgIiAuICRHZXRQYXJhbXskTmV3VmFsdWVzfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJE5ld1ZhbHVlcyA9fiAvTWludXRlL2lnICkgewogICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nQmxvY2sgLj0gIjoiIC4gJEdldFBhcmFteyROZXdWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgICRGZWxkQ2hlY2tbMV0gPX4gcy9NaW51dGUvL2lnOwogICAgICAgICAgICAgICAgICAgIG15ICVSZXF1ZXN0Rm9ybSA9ICRSZXF1ZXN0Rm9ybUJsb2NrT2JqZWN0LT5SZXF1ZXN0Rm9ybUJsb2NrR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Rm9ybUlEID0+ICRGZWxkQ2hlY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAlUmVxdWVzdEZpZWxkcyA9ICRSZXF1ZXN0RmllbGRzT2JqZWN0LT5SZXF1ZXN0RmllbGRzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RmllbGRzSUQgPT4gJFJlcXVlc3RGb3Jte0ZlbGRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVja1JlcXVlc3RGb3JtSUQgPT0gJFJlcXVlc3RGb3Jte1JlcXVlc3RGb3JtSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUJvZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxNTBweDtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzo1cHg7Ij48c3Ryb25nPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICc8L3N0cm9uZz46PC9kaXY+IDxkaXYgc3R5bGU9ImRpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjVweDsiPicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJERhdGVTdHJpbmdCbG9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnPGJyPjwvZGl2PjxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRSZXF1ZXN0T2JqZWN0LT5UaWNrZXRSZXF1ZXN0QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRCAgICA9PiAkR2V0UGFyYW17UmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlbGRLZXkgICAgICA9PiAkRGF0ZUtleUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsZFZhbHVlICAgID0+ICREYXRlU3RyaW5nQmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxkTGFiZWxpbmcgPT4gJFJlcXVlc3RGaWVsZHN7TGFiZWxpbmd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRUaWNrZXRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICREYXRlU3RyaW5nQmxvY2sgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkRGF0ZUtleUJsb2NrICAgID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRBcnRpY2xlQm9keSAuPSAnPGJyLz48aHIgc3R5bGU9ImJhY2tncm91bmQ6IzAwMDAwMDtoZWlnaHQ6MXB4OyIgLz4nOwogICAgfQoKICAgIHJldHVybiAkQXJ0aWNsZUJvZHk7Cn0KCnN1YiBfTWFza05ld05vVmFsaWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUmVxdWVzdEN1c3RvbWVyVGlja2V0TWVzc2FnZU5vVmFsaWQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlL01lbnVDaGFuZ2VEZWxldGUucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTWVudUNoYW5nZURlbGV0ZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6TWVudUNoYW5nZURlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2hhbmdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciB0aGUgcmVsZXZhbnQgYWN0aW9uCiAgICBteSAkRnJvbnRlbmRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlLCAncm8nIG9yICdydycKICAgIG15ICRSZXF1aXJlZFByaXY7CiAgICBpZiAoJEZyb250ZW5kQ29uZmlnKSB7CgogICAgICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2IGZyb20gdGhlIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KICAgICAgICAkUmVxdWlyZWRQcml2ID0gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn07CiAgICB9CgogICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICBpZiAoJFJlcXVpcmVkUHJpdikgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgZ3JvdXAgZm9yIHRoZSBmcm9udGVuZCBtb2R1bGUKICAgICAgICBteSAkR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfQogICAgICAgICAgICAtPntHcm91cFJvfS0+WzBdOwoKICAgICAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgICAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkR3JvdXA7CgogICAgICAgICMgZ2V0IGdyb3VwIG9iamVjdAogICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICAgICAjIGdldCB0aGUgZ3JvdXAgaWQKICAgICAgICBteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICRHcm91cCApOwoKICAgICAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgICAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkR3JvdXBJRDsKCiAgICAgICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICAgICAgbXkgJUdyb3VwcyA9ICRHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFJlcXVpcmVkUHJpdiwKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGdyYW50IGFjY2VzcyBpZiB0aGUgYWdlbnQgaGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgICAgIGlmICggJEdyb3Vwc3skR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgYnVpbGQgYSBsb29rdXAgaGFzaCBmb3IgdGhlIGFsbG93ZWQgY2hhbmdlIHN0YXRlcwogICAgbXkgJUFsbG93ZWRDaGFuZ2VTdGF0ZXMgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJEZyb250ZW5kQ29uZmlnLT57Q2hhbmdlU3RhdGVzfSB9OwoKICAgICMgb25seSBzaG93IHRoZSBkZWxldGUgbGluayBmb3IgY2hhbmdlcyBpbiB0aGUgYWxsb3dlZCBjaGFuZ2Ugc3RhdGVzCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWxsb3dlZENoYW5nZVN0YXRlc3sgJFBhcmFte0NoYW5nZX0tPntDaGFuZ2VTdGF0ZX0gfTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IHNlcGVyYXRvciwgd2hlbiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgbWVudSBpdGVtCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZW51IGl0ZW0KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17Q2hhbmdlfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBkaWFsb2cgaGFzIHRvIGJlIHNob3duCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57RGlhbG9nVGl0bGV9ICkgewogICAgICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwoKICAgICAgICBteSAlSlNEYXRhID0gKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDaGFuZ2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRKU0RhdGF7Q29uZmlnfTsKICAgICAgICBkZWxldGUgJEpTRGF0YXtDaGFuZ2V9OwoKICAgICAgICAkSlNEYXRhe0VsZW1lbnRTZWxlY3Rvcn0gPX4gcy9cWyVccypEYXRhXC5NZW51SURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtNZW51SUR9L2k7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dDb250ZW50UXVlcnlTdHJpbmd9ID1+IHMvXFslXHMqRGF0YVwuQ2hhbmdlSURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtDaGFuZ2VJRH0vaTsKICAgICAgICAkSlNEYXRhe0NvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nfSA9fiBzL1xbJVxzKkRhdGFcLkNoYW5nZUlEXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7Q2hhbmdlSUR9L2k7CgogICAgICAgICRKU0RhdGF7RGlhbG9nVGl0bGV9ID1+IHMvXFslXHMqVHJhbnNsYXRlXCgiKC4qKSJcKVxzKlx8XHMqaHRtbFxzKiVcXS8kTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypDb25maWdcKCIoLiopIlwpXHMqJVxdLyRDb25maWdPYmplY3QtPkdldCgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypEYXRhLkNoYW5nZU51bWJlclxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe0NoYW5nZU51bWJlcn0vZWk7CgogICAgICAgICRKU0RhdGF7TWVudUlEfSA9ICdNZW51JyAuICRKU0RhdGF7TWVudUlEfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnSVRTTVNob3dDb25maXJtRGlhbG9nLicgLiAkUGFyYW17TWVudUlEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVKU0RhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlL01lbnVHZW5lcmljLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE1lbnVHZW5lcmljLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDaGFuZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGFuZ2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gZXEgJ0FnZW50TGlua09iamVjdCcgKSB7CgogICAgICAgICMgdGhlIExpbmstbGluayBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgaXQgaXMgbm90IHNwZWNpZmljIHRvIElUU01DaGFuZ2UKICAgICAgICAkUmVxdWlyZWRQcml2ID0gJ3J3JzsKICAgIH0KCiAgICAjIERpc3BsYXkgdGhlIG1lbnUtbGluaywgd2hlbiBubyBwcml2aWxlZ2UgaXMgcmVxdWlyZWQKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgIGlmICgkUmVxdWlyZWRQcml2KSB7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMsIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBwcml2aWxlZ2UKICAgICAgICAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJFJlcXVpcmVkUHJpdiwKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFBhcmFte0NvbmZpZ30tPntBY3Rpb259LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IHNlcGVyYXRvciwgd2hlbiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgbWVudSBpdGVtCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZW51IGl0ZW0KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17Q2hhbmdlfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgYSBkaWFsb2cgaGFzIHRvIGJlIHNob3duCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57RGlhbG9nVGl0bGV9ICkgewogICAgICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwoKICAgICAgICBteSAlSlNEYXRhID0gKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDaGFuZ2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRKU0RhdGF7Q29uZmlnfTsKICAgICAgICBkZWxldGUgJEpTRGF0YXtDaGFuZ2V9OwoKICAgICAgICAkSlNEYXRhe0VsZW1lbnRTZWxlY3Rvcn0gPX4gcy9cWyVccypEYXRhXC5NZW51SURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtNZW51SUR9L2k7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dDb250ZW50UXVlcnlTdHJpbmd9ID1+IHMvXFslXHMqRGF0YVwuQ2hhbmdlSURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtDaGFuZ2VJRH0vaTsKICAgICAgICAkSlNEYXRhe0NvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nfSA9fiBzL1xbJVxzKkRhdGFcLkNoYW5nZUlEXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7Q2hhbmdlSUR9L2k7CgogICAgICAgICRKU0RhdGF7RGlhbG9nVGl0bGV9ID1+IHMvXFslXHMqVHJhbnNsYXRlXCgiKC4qKSJcKVxzKlx8XHMqaHRtbFxzKiVcXS8kTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypDb25maWdcKCIoLiopIlwpXHMqJVxdLyRDb25maWdPYmplY3QtPkdldCgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypEYXRhLkNoYW5nZU51bWJlclxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe0NoYW5nZU51bWJlcn0vZWk7CgogICAgICAgICRKU0RhdGF7TWVudUlEfSA9ICdNZW51JyAuICRKU0RhdGF7TWVudUlEfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnSVRTTVNob3dDb25maXJtRGlhbG9nLicgLiAkUGFyYW17TWVudUlEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVKU0RhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlL01lbnVUaW1lU2xvdC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBNZW51VGltZVNsb3QucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2U6Ok1lbnVUaW1lU2xvdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDaGFuZ2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGFuZ2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB3b3Jrb3JkZXJzIHlldAogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJFBhcmFte0NoYW5nZX0tPntXb3JrT3JkZXJDb3VudH07CgogICAgIyBUaGUgY2hhbmdlIGNhbiBubyBsb25nZXIgYmUgbW92ZWQsIHdoZW4gdGhlIGNoYW5nZSBoYXMgYWxyZWFkeSBzdGFydGVkLgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAkUGFyYW17Q2hhbmdlfS0+e0FjdHVhbFN0YXJ0VGltZX07CgogICAgIyBnZXQgY29uZmlnIGZvciB0aGUgcmVsZXZhbnQgYWN0aW9uCiAgICBteSAkRnJvbnRlbmRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlLCAncm8nIG9yICdydycKICAgIG15ICRSZXF1aXJlZFByaXY7CiAgICBpZiAoJEZyb250ZW5kQ29uZmlnKSB7CgogICAgICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2IGZyb20gdGhlIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KICAgICAgICAkUmVxdWlyZWRQcml2ID0gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn07CiAgICB9CgogICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICBpZiAoJFJlcXVpcmVkUHJpdikgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zLCBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlCiAgICAgICAgJEFjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRSZXF1aXJlZFByaXYsCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBtZW51IGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IsIHdoZW4gdGhpcyBpcyBub3QgdGhlIGZpcnN0IG1lbnUgaXRlbQogICAgaWYgKCAkUGFyYW17Q291bnRlcn0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0NoYW5nZX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlL01lbnVXb3JrT3JkZXJzTmVlZGVkLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE1lbnVXb3JrT3JkZXJzTmVlZGVkLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlOjpNZW51V29ya09yZGVyc05lZWRlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgQXMgb2YgMjAxMC0wMy0xOSB0aGlzIG1vZHVsZSBpcyB1bnVzZWQuCiMgQnV0IGl0IGlzIGtlcHQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgYXMgaXQgcHJvdmlkZXMgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgZm9yIGZ1dHVyZSB1c2UuCgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2hhbmdlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgd29ya29yZGVycyB5ZXQKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRQYXJhbXtDaGFuZ2V9LT57V29ya09yZGVyQ291bnR9OwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhlIHJlbGV2YW50IGFjdGlvbgogICAgbXkgJEZyb250ZW5kQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFBhcmFte0NvbmZpZ30tPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIHJlcXVpcmVkIHByaXZpbGVnZSwgJ3JvJyBvciAncncnCiAgICBteSAkUmVxdWlyZWRQcml2OwogICAgaWYgKCRGcm9udGVuZENvbmZpZykgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQoKICAgICMgRGlzcGxheSB0aGUgbWVudS1saW5rLCB3aGVuIG5vIHByaXZpbGVnZSBpcyByZXF1aXJlZAogICAgbXkgJEFjY2VzcyA9IDE7CgogICAgaWYgKCRSZXF1aXJlZFByaXYpIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBBY3Rpb24gICA9PiAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2V9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBtZW51IGl0ZW0KICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDaGFuZ2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlL092ZXJ2aWV3U21hbGwucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogT3ZlcnZpZXdTbWFsbC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZTo6T3ZlcnZpZXdTbWFsbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkIENoYW5nZUlEcyBvciBXb3JrT3JkZXJJRHMKICAgIGlmICggISRQYXJhbXtDaGFuZ2VJRHN9ICYmICEkUGFyYW17V29ya09yZGVySURzfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHRoZSBDaGFuZ2VJRHMgb3IgdGhlIFdvcmtPcmRlcklEcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBvbmUgb2YgQ2hhbmdlSURzIG9yIFdvcmtPcmRlcklEcyBjYW4gYmUgdXNlZAogICAgaWYgKCAkUGFyYW17Q2hhbmdlSURzfSAmJiAkUGFyYW17V29ya09yZGVySURzfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciB0aGUgQ2hhbmdlSURzIG9yIHRoZSBXb3JrT3JkZXJJRHMsIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBvYmplY3QKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICAjIGluIHRoZSBjdXN0b21lciBmcm9udGVuZAogICAgbXkgJUN1c3RvbWVyVXNlclNlcnZpY2VzOwogICAgaWYgKCAkUGFyYW17RnJvbnRlbmR9IGVxICdDdXN0b21lcicgJiYgJFNlbGYtPntDb25maWd9LT57U2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBzZXJ2aWNlcyB0aGUgY3VzdG9tZXIgdXNlciBpcyBhbGxvd2VkIHRvIHVzZQogICAgICAgICVDdXN0b21lclVzZXJTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlZmluZSBpbmNpZGVudCBzaWduYWxzLCBuZWVkZWQgZm9yIHNlcnZpY2VzCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyBzdG9yZSBlaXRoZXIgdGhlIENoYW5nZUlEcyBvciB0aGUgV29ya09yZGVySURzCiAgICBteSBASURzOwogICAgaWYgKCAkUGFyYW17Q2hhbmdlSURzfSAmJiByZWYgJFBhcmFte0NoYW5nZUlEc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICBASURzID0gQHsgJFBhcmFte0NoYW5nZUlEc30gfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1dvcmtPcmRlcklEc30gJiYgcmVmICRQYXJhbXtXb3JrT3JkZXJJRHN9IGVxICdBUlJBWScgKSB7CiAgICAgICAgQElEcyA9IEB7ICRQYXJhbXtXb3JrT3JkZXJJRHN9IH07CiAgICB9CgogICAgIyBjaGVjayBTaG93Q29sdW1ucyBwYXJhbWV0ZXIKICAgIG15IEBTaG93Q29sdW1uczsKICAgIG15ICVEeW5hbWljRmllbGRDb2x1bW5zOwogICAgaWYgKCAkUGFyYW17U2hvd0NvbHVtbnN9ICYmIHJlZiAkUGFyYW17U2hvd0NvbHVtbnN9IGVxICdBUlJBWScgKSB7CgogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCBAeyAkUGFyYW17U2hvd0NvbHVtbnN9IH0gKSB7CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSBkeW5hbWljIGZpZWxkIG5hbWUKICAgICAgICAgICAgaWYgKCAkQ29sdW1uID1+IG17IFxBIER5bmFtaWNGaWVsZF8gKC4rKSBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbHVtbnN7JDF9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBub3JtYWwgZmllbGRzCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGQgbGlzdCBvZiBjaGFuZ2UgYW5kIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnSVRTTUNoYW5nZScsICdJVFNNV29ya09yZGVyJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+IFwlRHluYW1pY0ZpZWxkQ29sdW1ucywKICAgICk7CgogICAgIyBhZGQgdGhlIGFscmVhZHkgc29ydGVkIGR5bmFtaWMgZmllbGRzCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX07CiAgICB9CgogICAgIyBidWlsZCBsb29rdXAgaGFzaCBmb3IgU2hvd0NvbHVtbnMKICAgIG15ICVTaG93Q29sdW1uc0xvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAU2hvd0NvbHVtbnM7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGJ1aWxkIGNvbHVtbiBoZWFkZXIgYmxvY2tzCiAgICBpZiAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgIENPTFVNTjoKICAgICAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBuZWVkZWQgdmVyaWFibGVzCiAgICAgICAgICAgIG15ICRDU1MgPSAnT3ZlcnZpZXdIZWFkZXInOwogICAgICAgICAgICBteSAkT3JkZXJCeTsKCiAgICAgICAgICAgICMgcmVtb3ZlIElEIGlmIG5lY2VzYXJ5CiAgICAgICAgICAgIGlmICggJFBhcmFte1NvcnRCeX0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U29ydEJ5fSA9ICggJFBhcmFte1NvcnRCeX0gZXEgJ1ByaW9yaXR5SUQnICkKICAgICAgICAgICAgICAgICAgICA/ICdQcmlvcml0eScKICAgICAgICAgICAgICAgICAgICA6ICggJFBhcmFte1NvcnRCeX0gZXEgJ0NhdGVnb3J5SUQnICkgICAgICAgPyAnQ2F0ZWdvcnknCiAgICAgICAgICAgICAgICAgICAgOiAoICRQYXJhbXtTb3J0Qnl9IGVxICdDaGFuZ2VCdWlsZGVySUQnICkgID8gJ0NoYW5nZUJ1aWxkZXInCiAgICAgICAgICAgICAgICAgICAgOiAoICRQYXJhbXtTb3J0Qnl9IGVxICdDaGFuZ2VNYW5hZ2VySUQnICkgID8gJ0NoYW5nZU1hbmFnZXInCiAgICAgICAgICAgICAgICAgICAgOiAoICRQYXJhbXtTb3J0Qnl9IGVxICdDaGFuZ2VTdGF0ZUlEJyApICAgID8gJ0NoYW5nZVN0YXRlJwogICAgICAgICAgICAgICAgICAgIDogKCAkUGFyYW17U29ydEJ5fSBlcSAnSW1wYWN0SUQnICkgICAgICAgICA/ICdJbXBhY3QnCiAgICAgICAgICAgICAgICAgICAgOiAoICRQYXJhbXtTb3J0Qnl9IGVxICdXb3JrT3JkZXJBZ2VudElEJyApID8gJ1dvcmtPcmRlckFnZW50JwogICAgICAgICAgICAgICAgICAgIDogKCAkUGFyYW17U29ydEJ5fSBlcSAnV29ya09yZGVyU3RhdGVJRCcgKSA/ICdXb3JrT3JkZXJTdGF0ZScKICAgICAgICAgICAgICAgICAgICA6ICggJFBhcmFte1NvcnRCeX0gZXEgJ1dvcmtPcmRlclR5cGVJRCcgKSAgPyAnV29ya09yZGVyVHlwZScKICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U29ydEJ5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgdGhlIGNvcnJlY3QgU2V0IENTUyBjbGFzcyBhbmQgb3JkZXIgYnkgbGluawogICAgICAgICAgICBpZiAoICRQYXJhbXtTb3J0Qnl9ICYmICggJFBhcmFte1NvcnRCeX0gZXEgJENvbHVtbiApICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeX0gJiYgKCAkUGFyYW17T3JkZXJCeX0gZXEgJ1VwJyApICkgewogICAgICAgICAgICAgICAgICAgICRPcmRlckJ5ID0gJ0Rvd24nOwogICAgICAgICAgICAgICAgICAgICRDU1MgLj0gJyBTb3J0RGVzY2VuZGluZ0xhcmdlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRPcmRlckJ5ID0gJ1VwJzsKICAgICAgICAgICAgICAgICAgICAkQ1NTIC49ICcgU29ydEFzY2VuZGluZ0xhcmdlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPcmRlckJ5ID0gJ1VwJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29sdW1uID1+IG17IFxBIER5bmFtaWNGaWVsZF8gKC4rKSBceiB9eG1zICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICQxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmREeW5hbWljRmllbGRIZWFkZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09MVU1OOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSAibm9ybWFsIiBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiAuICdIZWFkZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIENTUyAgICAgPT4gJENTUywKICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0ICA9ICcnOwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICMgc2hvdyBjaGFuZ2VzIGlmIHRoZXJlIGFyZSBzb21lCiAgICBpZiAoQElEcykgewoKICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyB0byBzdG9yZSBhbGwgZGF0YQogICAgICAgICAgICAgICAgbXkgJURhdGE7CgogICAgICAgICAgICAgICAgIyB0byBzdG9yZSBkYXRhIG9mIHN1Yi1lbGVtZW50cwogICAgICAgICAgICAgICAgbXkgJVN1YkVsZW1lbnREYXRhOwoKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VJRDsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0NoYW5nZUlEc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IGNoYW5nZSBpZAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VJRCA9ICRJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte1dvcmtPcmRlcklEc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICggJURhdGEsICV7JFdvcmtPcmRlcn0gKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgY2hhbmdlIGlkIGZyb20gd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlSUQgPSAkV29ya09yZGVyLT57Q2hhbmdlSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRDaGFuZ2U7CgogICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGRhdGEsCiAgICAgICAgICAgICAgICAjICggbGV0IHdvcmtvcmRlciBkYXRhIG92ZXJ3cml0ZQogICAgICAgICAgICAgICAgIyBzb21lIGNoYW5nZSBhdHRyaWJ1dGVzLCBpLmUuIFBsYW5uZWRTdGFydFRpbWUsIGV0Yy4uLiApCiAgICAgICAgICAgICAgICAlRGF0YSA9ICggJXskQ2hhbmdlfSwgJURhdGEgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgZm9yIG5lZWRlZCB1c2VyIHR5cGVzCiAgICAgICAgICAgICAgICBVU0VSVFlQRToKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlclR5cGUgKHF3KENoYW5nZUJ1aWxkZXIgQ2hhbmdlTWFuYWdlciBXb3JrT3JkZXJBZ2VudCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHNob3cgdGhlIGRhdGEgaWYgZW5hYmxlZCBpbiBTaG93Q29sdW1ucyBjb25maWcKICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJUWVBFIGlmICEkU2hvd0NvbHVtbnNMb29rdXB7JFVzZXJUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBVc2VyVHlwZSBhdHRyaWJ1dGUgZXhpc3RzIGVpdGhlciBpbiBjaGFuZ2Ugb3Igd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoYW5nZS0+eyAkVXNlclR5cGUgLiAnSUQnIH0gJiYgISREYXRheyAkVXNlclR5cGUgLiAnSUQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUlRZUEU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgICAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3aGVuIGNhbGxlZCBmcm9tIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlck9iamVjdC0+Y2FuKCdHZXRVc2VyRGF0YScpICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlIHRoZSBVc2VyT2JqZWN0IGlzIGluIGZhY3QgdGhlIEN1c3RvbWVyVXNlck9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAjIHNvIHdlIG5lZWQgdG8gY29ycmVjdCB0aGlzIGhlcmUgYnkgY3JlYXRpbmcgYSBuZXcgVXNlck9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSAkVXNlck9iamVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57ICRVc2VyVHlwZSAuICdJRCcgfSB8fCAkRGF0YXsgJFVzZXJUeXBlIC4gJ0lEJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICAkRGF0YXsgJFVzZXJUeXBlIC4gJ1VzZXJMb2dpbicgfSAgICAgPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckZpcnN0bmFtZScgfSA9ICRVc2Vye1VzZXJGaXJzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckxhc3RuYW1lJyB9ICA9ICRVc2Vye1VzZXJMYXN0bmFtZX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyRnVsbG5hbWUnIH0gID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGlmIHRoZSBzZXJ2aWNlcyBjb2x1bW4gc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgICAgICBpZiAoICRTaG93Q29sdW1uc0xvb2t1cHtTZXJ2aWNlc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgdGhlIGxpbmtlZCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBteSBAV29ya09yZGVySURzOwoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZSBjb21iaW5lZCBsaW5rZWQgc2VydmljZXMgZGF0YSBmcm9tIGFsbCB3b3Jrb3JkZXJzIG9mIHRoaXMgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17Q2hhbmdlSURzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQFdvcmtPcmRlcklEcyA9IEB7ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIG9ubHkgdGhlIGxpbmtlZCBzZXJ2aWNlcyBmb3IgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXb3JrT3JkZXJJRHN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBAV29ya09yZGVySURzID0gKCRJRCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZSBjb21iaW5lZCBsaW5rZWQgc2VydmljZXMgZGF0YQogICAgICAgICAgICAgICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKEBXb3JrT3JkZXJJRHMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzIG9mIHRoaXMgd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCBrZXlzICV7JExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXJ9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzaG93IGxpbmtlZCBzZXJ2aWNlcyBvZiB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJE9iamVjdCBuZSAnU2VydmljZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOS1RZUEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RJT046CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29tYmluZSB0aGUgbGlua2VkIG9iamVjdCBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskSUR9ID0gJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskRGlyZWN0aW9ufS0+eyRJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHVuaXF1ZSBzZXJ2aWNlIGlkcwogICAgICAgICAgICAgICAgICAgIG15ICVVbmlxdWVTZXJ2aWNlSURzOwogICAgICAgICAgICAgICAgICAgIG15ICRTZXJ2aWNlc1JlZiA9ICRMaW5rTGlzdFdpdGhEYXRhLT57U2VydmljZX0gfHwge307CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyRTZXJ2aWNlc1JlZn0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRTZXJ2aWNlc1JlZi0+eyRMaW5rVHlwZX07CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkU2VydmljZXNSZWYtPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xsZWN0IHVuaXF1ZSBzZXJ2aWNlIGlkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVuaXF1ZVNlcnZpY2VJRHN7JFNlcnZpY2VJRH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGRhdGEgZm9yIGVhY2ggc2VydmljZQogICAgICAgICAgICAgICAgICAgIG15IEBTZXJ2aWNlc0RhdGE7CiAgICAgICAgICAgICAgICAgICAgU0VSVklDRUlEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVVbmlxdWVTZXJ2aWNlSURzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgY3VzdG9tZXIgZnJvbnRlbmQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Zyb250ZW5kfSBlcSAnQ3VzdG9tZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTaG93T25seUNoYW5nZXNXaXRoQWxsb3dlZFNlcnZpY2VzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGlzIHNlcnZpY2UgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gdXNlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAhJEN1c3RvbWVyVXNlclNlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU2lnbmFsfSA9ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IH07CgogICAgICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZXJ2aWNlc0RhdGEsIFwlU2VydmljZURhdGE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHNvcnQgc2VydmljZXMgZGF0YSBieSBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgICAgICAgICBAU2VydmljZXNEYXRhID0gc29ydCB7ICRhLT57TmFtZX0gY21wICRiLT57TmFtZX0gfSBAU2VydmljZXNEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBjdXN0b21lciBmcm9udGVuZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Zyb250ZW5kfSBlcSAnQ3VzdG9tZXInCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3dPbmx5Q2hhbmdlc1dpdGhBbGxvd2VkU2VydmljZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBjaGFuZ2UgaWYgaXQgaGFzIG5vIHNlcnZpY2VzCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgIUBTZXJ2aWNlc0RhdGE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIHNlcnZpY2VzIGRhdGEKICAgICAgICAgICAgICAgICAgICAkU3ViRWxlbWVudERhdGF7U2VydmljZXN9ID0gXEBTZXJ2aWNlc0RhdGE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCByZWNvcmQgYmxvY2sKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBidWlsZCBjb2x1bW4gcmVjb3JkIGJsb2NrcwogICAgICAgICAgICAgICAgaWYgKEBTaG93Q29sdW1ucykgewoKICAgICAgICAgICAgICAgICAgICBDT0xVTU46CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKEBTaG93Q29sdW1ucykgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29sdW1uID1+IG17IFxBIER5bmFtaWNGaWVsZF8gKC4rKSBceiB9eG1zICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBmaWVsZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmREeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZER5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBoYW5kbGUgIm5vcm1hbCIgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgY29sdW1uIGNvbnRhaW5zIHN1Yi1lbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTdWJFbGVtZW50RGF0YXskQ29sdW1ufSAmJiByZWYgJFN1YkVsZW1lbnREYXRheyRDb2x1bW59IGVxICdBUlJBWScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTdWJFbGVtZW50ICggQHsgJFN1YkVsZW1lbnREYXRheyRDb2x1bW59IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyBzdWItZWxlbWVudHMgb2YgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ1N1YkVsZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskU3ViRWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1YkVsZW1lbnREYXRhe1NlcnZpY2VzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ1N1YkVsZW1lbnRFbXB0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGRpc3BsYXkgY29sdW1ucyBhcyBsaW5rcyBpbiB0aGUgY3VzdG9tZXIgZnJvbnRlbmQKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBDT0xVTU4gaWYgJFBhcmFte0Zyb250ZW5kfSBlcSAnQ3VzdG9tZXInOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IGxpbmtzIGlmIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ0xpbmtTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ0xpbmtFbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0byBzaG93LCBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRvdGFsQ29sdW1ucyA9PiBzY2FsYXIgQFNob3dDb2x1bW5zLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB1c2UgdGVtcGxhdGUKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e1ZpZXdUeXBlfSwKICAgICAgICAgICAgQ29sdW1uQ291bnQgPT4gc2NhbGFyIEBTaG93Q29sdW1ucywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNVGVtcGxhdGUvT3ZlcnZpZXdTbWFsbC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBPdmVydmlld1NtYWxsLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNVGVtcGxhdGU6Ok92ZXJ2aWV3U21hbGw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbmVlZCBUZW1wbGF0ZUlEcwogICAgaWYgKCAhJFBhcmFte1RlbXBsYXRlSURzfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHRoZSBUZW1wbGF0ZUlEcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc3RvcmUgdGhlIHRlbXBsYXRlIElEcwogICAgbXkgQElEcyA9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEc30gfTsKCiAgICAjIGNoZWNrIFNob3dDb2x1bW5zIHBhcmFtZXRlcgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkUGFyYW17U2hvd0NvbHVtbnN9ICYmIHJlZiAkUGFyYW17U2hvd0NvbHVtbnN9IGVxICdBUlJBWScgKSB7CiAgICAgICAgQFNob3dDb2x1bW5zID0gQHsgJFBhcmFte1Nob3dDb2x1bW5zfSB9OwogICAgfQoKICAgICMgZm9yIHRoZSB0ZW1wbGF0ZSBkZWxldGlvbiBsaW5rIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHBlcm1pc3Npb25zCiAgICBteSAkRGVsZXRlRm91bmQgPSBncmVwIHsgJF8gZXEgJ0RlbGV0ZScgfSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoJERlbGV0ZUZvdW5kKSB7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRNb2R1bGVSZWcgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50SVRTTVRlbXBsYXRlRGVsZXRlfTsKCiAgICAgICAgbXkgJUdyb3VwczsKICAgICAgICAkR3JvdXBze0dyb3VwUm99ID0gewogICAgICAgICAgICByZXZlcnNlICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICApCiAgICAgICAgfTsKICAgICAgICAkR3JvdXBze0dyb3VwfSA9IHsKICAgICAgICAgICAgcmV2ZXJzZSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgICAgIG15ICRBY2Nlc3NPazsKICAgICAgICBmb3IgbXkgJEdyb3VwVHlwZSAocXcoR3JvdXAgR3JvdXBSbykpIHsKCiAgICAgICAgICAgIFBFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkTW9kdWxlUmVnLT57JEdyb3VwVHlwZX0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUEVSTUlTU0lPTiBpZiAhJEdyb3Vwc3skR3JvdXBUeXBlfS0+eyRHcm91cH07CgogICAgICAgICAgICAgICAgJEFjY2Vzc09rID0gMTsKCiAgICAgICAgICAgICAgICBsYXN0IFBFUk1JU1NJT047CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgQFNob3dDb2x1bW5zID0gZ3JlcCB7ICRfIG5lICdEZWxldGUnIH0gQFNob3dDb2x1bW5zOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAQ29sID0gKHF3KE5hbWUgVGVtcGxhdGVUeXBlSUQgVmFsaWRJRCBDcmVhdGVUaW1lIENoYW5nZVRpbWUpKTsKICAgIG15ICVPcmRlcjsKICAgIG15ICVDU1M7CgogICAgZm9yIG15ICRLZXkgKEBDb2wpIHsKICAgICAgICBpZiAoICRQYXJhbXtTb3J0Qnl9ICYmICggJFBhcmFte1NvcnRCeX0gZXEgJEtleSApICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5fSAmJiAoICRQYXJhbXtPcmRlckJ5fSBlcSAnVXAnICkgKSB7CiAgICAgICAgICAgICAgICAkT3JkZXJ7ICdPcmRlckJ5JyAuICRLZXkgfSA9ICdEb3duJzsKICAgICAgICAgICAgICAgICRDU1N7ICdTb3J0JyAuICRLZXkgfSAgICAgID0gJyBTb3J0RGVzY2VuZGluZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3JkZXJ7ICdPcmRlckJ5JyAuICRLZXkgfSA9ICdVcCc7CiAgICAgICAgICAgICAgICAkQ1NTeyAnU29ydCcgLiAkS2V5IH0gICAgICA9ICcgU29ydEFzY2VuZGluZyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGJ1aWxkIGNvbHVtbiBoZWFkZXIgYmxvY2tzCiAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiAuICdIZWFkZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVPcmRlciwKICAgICAgICAgICAgICAgICVDU1MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkT3V0cHV0ICA9ICcnOwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICMgc2hvdyB0ZW1wbGF0ZXMgaWYgdGhlcmUgYXJlIHNvbWUKICAgIGlmIChASURzKSB7CgogICAgICAgIElEOgogICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgIG5leHQgSUQgaWYgJENvdW50ZXIgPCAkUGFyYW17U3RhcnRIaXR9OwogICAgICAgICAgICBsYXN0IElEIGlmICRDb3VudGVyID49ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICk7CgogICAgICAgICAgICAjIGRpc3BsYXkgdGhlIHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgbXkgJFRlbXBsYXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyktPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAleyRUZW1wbGF0ZX07CgogICAgICAgICAgICAjIGh1bWFuIHJlYWRhYmxlIHZhbGlkaXR5CiAgICAgICAgICAgICREYXRhe1ZhbGlkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCggVmFsaWRJRCA9PiAkRGF0YXtWYWxpZElEfSApOwoKICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGZvciBuZWVkZWQgdXNlciB0eXBlcwogICAgICAgICAgICBVU0VSVFlQRToKICAgICAgICAgICAgZm9yIG15ICRVc2VyVHlwZSAocXcoQ3JlYXRlQnkgQ2hhbmdlQnkpKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBVc2VyVHlwZSBhdHRyaWJ1dGUgZXhpc3RzIGluIHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgbmV4dCBVU0VSVFlQRSBpZiAhJERhdGF7JFVzZXJUeXBlfTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICREYXRheyRVc2VyVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyTG9naW4nIH0gICAgID0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckZpcnN0bmFtZScgfSA9ICRVc2Vye1VzZXJGaXJzdG5hbWV9OwogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyTGFzdG5hbWUnIH0gID0gJFVzZXJ7VXNlckxhc3RuYW1lfTsKICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckZ1bGxuYW1lJyB9ICA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgcmVjb3JkIGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGNvbHVtbiByZWNvcmQgYmxvY2tzCiAgICAgICAgICAgIENPTFVNTjoKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKEBTaG93Q29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdFZGl0Q29udGVudCcgJiYgJERhdGF7VHlwZX0gZXEgJ0NBQicgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZEVkaXRDb250ZW50Q0FCJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTFVNTjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ0VkaXRDb250ZW50JyB8fCAkQ29sdW1uIGVxICdEZWxldGUnICkgewogICAgICAgICAgICAgICAgICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpOwoKICAgICAgICAgICAgICAgICAgICBteSAlSlNEYXRhID0gKCk7CgogICAgICAgICAgICAgICAgICAgICRKU0RhdGF7RWxlbWVudElEfSAgICAgICA9ICRDb2x1bW4gLiAnVGVtcGxhdGVJRCcgLiAkRGF0YXtUZW1wbGF0ZUlEfTsKICAgICAgICAgICAgICAgICAgICAkSlNEYXRhe0VsZW1lbnRTZWxlY3Rvcn0gPSAnIycgLiAkSlNEYXRhe0VsZW1lbnRJRH07CgogICAgICAgICAgICAgICAgICAgICRKU0RhdGF7RGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRJVFNNVGVtcGxhdGUlczslc1RlbXBsYXRlSUQ9JXMnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAoICRDb2x1bW4gZXEgJ0VkaXRDb250ZW50JyA/ICdTdWJhY3Rpb249VGVtcGxhdGVFZGl0Q29udGVudFNob3dEaWFsb2c7JyA6ICcnICksCiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRKU0RhdGF7Q29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmd9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZSVzO1N1YmFjdGlvbj1UZW1wbGF0ZSVzO1RlbXBsYXRlSUQ9JXMnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAkQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9ICRDb2x1bW4gZXEgJ0RlbGV0ZScKICAgICAgICAgICAgICAgICAgICAgICAgPyAnRGVsZXRlIFRlbXBsYXRlJwogICAgICAgICAgICAgICAgICAgICAgICA6ICdFZGl0IFRlbXBsYXRlIENvbnRlbnQnOwoKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlVGVtcGxhdGVPdmVydmlld0NvbmZpcm1EaWFsb2cuJyAuICRKU0RhdGF7RWxlbWVudElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXCVKU0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgdG8gc2hvdywgYSBubyBkYXRhIGZvdW5kIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSB0YWJsZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUb3RhbENvbHVtbnMgPT4gc2NhbGFyIEBTaG93Q29sdW1ucywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdXNlIHRlbXBsYXRlCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e1ZpZXdUeXBlfSwKICAgICAgICAgICAgQ29sdW1uQ291bnQgPT4gc2NhbGFyIEBTaG93Q29sdW1ucywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyL01lbnVHZW5lcmljLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE1lbnVHZW5lcmljLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyOjpNZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXb3JrT3JkZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gZXEgJ0FnZW50TGlua09iamVjdCcgKSB7CgogICAgICAgICMgdGhlIExpbmstbGluayBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgaXQgaXMgbm90IHNwZWNpZmljIHRvIElUU01DaGFuZ2UKICAgICAgICAkUmVxdWlyZWRQcml2ID0gJ3J3JzsKICAgIH0KCiAgICBteSAkQWNjZXNzOwogICAgaWYgKCAhJFJlcXVpcmVkUHJpdiApIHsKCiAgICAgICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBBY3Rpb24gICAgICA9PiAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJ9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBtZW51IGl0ZW0KICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtXb3JrT3JkZXJ9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBhIGRpYWxvZyBoYXMgdG8gYmUgc2hvd24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntEaWFsb2dUaXRsZX0gKSB7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgICAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CgogICAgICAgIG15ICVKU0RhdGEgPSAoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1dvcmtPcmRlcn0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJEpTRGF0YXtDb25maWd9OwogICAgICAgIGRlbGV0ZSAkSlNEYXRhe1dvcmtPcmRlcn07CgogICAgICAgICRKU0RhdGF7RWxlbWVudFNlbGVjdG9yfSA9fiBzL1xbJVxzKkRhdGFcLk1lbnVJRFxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe01lbnVJRH0vaTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ0NvbnRlbnRRdWVyeVN0cmluZ30gPX4gcy9cWyVccypEYXRhXC5Xb3JrT3JkZXJJRFxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe1dvcmtPcmRlcklEfS9pOwogICAgICAgICRKU0RhdGF7Q29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmd9ID1+IHMvXFslXHMqRGF0YVwuV29ya09yZGVySURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtXb3JrT3JkZXJJRH0vaTsKCiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypUcmFuc2xhdGVcKCIoLiopIlwpXHMqXHxccypodG1sXHMqJVxdLyRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCQxKS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkNvbmZpZ1woIiguKikiXClccyolXF0vJENvbmZpZ09iamVjdC0+R2V0KCQxKS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkRhdGEuQ2hhbmdlTnVtYmVyXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7Q2hhbmdlTnVtYmVyfS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkRhdGEuV29ya09yZGVyTnVtYmVyXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7V29ya09yZGVyTnVtYmVyfS9laTsKCiAgICAgICAgJEpTRGF0YXtNZW51SUR9ID0gJ01lbnUnIC4gJEpTRGF0YXtNZW51SUR9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNU2hvd0NvbmZpcm1EaWFsb2cuJyAuICRQYXJhbXtNZW51SUR9LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUpTRGF0YSwKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyL01lbnVXaXRoUGVybWlzc2lvbkZyb21DaGFuZ2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlcjo6TWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXb3JrT3JkZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICgkRnJvbnRlbmRDb25maWcpIHsKCiAgICAgICAgIyBnZXQgdGhlIHJlcXVpcmVkIHByaXYgZnJvbSB0aGUgZnJvbnRlbmQgY29uZmlndXJhdGlvbgogICAgICAgICRSZXF1aXJlZFByaXYgPSAkRnJvbnRlbmRDb25maWctPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICBteSAkQWNjZXNzOwogICAgaWYgKCAhJFJlcXVpcmVkUHJpdiApIHsKCiAgICAgICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBBY3Rpb24gICAgICA9PiAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0sCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtXb3JrT3JkZXJ9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVyfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIGdldCB0aGUgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte1dvcmtPcmRlcn0tPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7ICRQYXJhbXtXb3JrT3JkZXJ9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBhIGRpYWxvZyBoYXMgdG8gYmUgc2hvd24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntEaWFsb2dUaXRsZX0gKSB7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgICAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyk7CgogICAgICAgICMgUmVwbGFjZSB0aGUgdGVtcGxhdGUgdG9vbGtpdCBleHByZXNzaW9ucyB3aXRoIHRoZSBmaW5hbCB2YWx1ZS4KICAgICAgICBteSAlSlNEYXRhID0gKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtXb3JrT3JkZXJ9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlICRKU0RhdGF7Q29uZmlnfTsKICAgICAgICBkZWxldGUgJEpTRGF0YXtXb3JrT3JkZXJ9OwoKICAgICAgICAkSlNEYXRhe0VsZW1lbnRTZWxlY3Rvcn0gPX4gcy9cWyVccypEYXRhXC5NZW51SURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtNZW51SUR9L2k7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dDb250ZW50UXVlcnlTdHJpbmd9ID1+IHMvXFslXHMqRGF0YVwuV29ya09yZGVySURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtXb3JrT3JkZXJJRH0vaTsKICAgICAgICAkSlNEYXRhe0NvbmZpcm1lZEFjdGlvblF1ZXJ5U3RyaW5nfSA9fiBzL1xbJVxzKkRhdGFcLldvcmtPcmRlcklEXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7V29ya09yZGVySUR9L2k7CgogICAgICAgICRKU0RhdGF7RGlhbG9nVGl0bGV9ID1+IHMvXFslXHMqVHJhbnNsYXRlXCgiKC4qKSJcKVxzKlx8XHMqaHRtbFxzKiVcXS8kTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypDb25maWdcKCIoLiopIlwpXHMqJVxdLyRDb25maWdPYmplY3QtPkdldCgkMSkvZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypEYXRhLkNoYW5nZU51bWJlclxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe0NoYW5nZU51bWJlcn0vZWk7CiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypEYXRhLldvcmtPcmRlck51bWJlclxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe1dvcmtPcmRlck51bWJlcn0vZWk7CgogICAgICAgICRKU0RhdGF7TWVudUlEfSA9ICdNZW51JyAuICRKU0RhdGF7TWVudUlEfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnSVRTTVNob3dDb25maXJtRGlhbG9nLicgLiAkUGFyYW17TWVudUlEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVKU0RhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyL01lbnVXaXRoVGFrZVBlcm1pc3Npb24ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTWVudVdpdGhUYWtlUGVybWlzc2lvbi5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlcjo6TWVudVdpdGhUYWtlUGVybWlzc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXb3JrT3JkZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQoKICAgIG15ICRBY2Nlc3M7CiAgICBpZiAoICEkUmVxdWlyZWRQcml2ICkgewoKICAgICAgICAjIERpc3BsYXkgdGhlIG1lbnUtbGluaywgd2hlbiBubyBwcml2aWxlZ2UgaXMgcmVxdWlyZWQKICAgICAgICAkQWNjZXNzID0gMTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zLCBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlCiAgICAgICAgIyBxdWVyeSB0aGUgcGVybWlzc2lvbiBtb2R1bGVzIHJlZ2lzdGVyZWQgaW4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uJwogICAgICAgICRBY2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJFJlcXVpcmVkUHJpdiwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgID0+ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSwKICAgICAgICAgICAgUGVybWlzc2lvblJlZ2lzdHJ5ID0+ICdJVFNNV29ya09yZGVyOjpUYWtlUGVybWlzc2lvbicsCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgICAgICA9PiAkUGFyYW17V29ya09yZGVyfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1dvcmtPcmRlcn0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGEgZGlhbG9nIGhhcyB0byBiZSBzaG93bgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0RpYWxvZ1RpdGxlfSApIHsKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgICAgIG15ICRMYW5ndWFnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKTsKCiAgICAgICAgIyBSZXBsYWNlIHRoZSB0ZW1wbGF0ZSB0b29sa2l0IGV4cHJlc3Npb25zIHdpdGggdGhlIGZpbmFsIHZhbHVlLgogICAgICAgIG15ICVKU0RhdGEgPSAoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1dvcmtPcmRlcn0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJEpTRGF0YXtDb25maWd9OwogICAgICAgIGRlbGV0ZSAkSlNEYXRhe1dvcmtPcmRlcn07CgogICAgICAgICRKU0RhdGF7RWxlbWVudFNlbGVjdG9yfSA9fiBzL1xbJVxzKkRhdGFcLk1lbnVJRFxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe01lbnVJRH0vaTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ0NvbnRlbnRRdWVyeVN0cmluZ30gPX4gcy9cWyVccypEYXRhXC5Xb3JrT3JkZXJJRFxzKlx8XHMqaHRtbFxzKiVcXS8kSlNEYXRhe1dvcmtPcmRlcklEfS9pOwogICAgICAgICRKU0RhdGF7Q29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmd9ID1+IHMvXFslXHMqRGF0YVwuV29ya09yZGVySURccypcfFxzKmh0bWxccyolXF0vJEpTRGF0YXtXb3JrT3JkZXJJRH0vaTsKCiAgICAgICAgJEpTRGF0YXtEaWFsb2dUaXRsZX0gPX4gcy9cWyVccypUcmFuc2xhdGVcKCIoLiopIlwpXHMqXHxccypodG1sXHMqJVxdLyRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCQxKS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkNvbmZpZ1woIiguKikiXClccyolXF0vJENvbmZpZ09iamVjdC0+R2V0KCQxKS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkRhdGEuQ2hhbmdlTnVtYmVyXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7Q2hhbmdlTnVtYmVyfS9laTsKICAgICAgICAkSlNEYXRhe0RpYWxvZ1RpdGxlfSA9fiBzL1xbJVxzKkRhdGEuV29ya09yZGVyTnVtYmVyXHMqXHxccypodG1sXHMqJVxdLyRKU0RhdGF7V29ya09yZGVyTnVtYmVyfS9laTsKCiAgICAgICAgJEpTRGF0YXtNZW51SUR9ID0gJ01lbnUnIC4gJEpTRGF0YXtNZW51SUR9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNU2hvd0NvbmZpcm1EaWFsb2cuJyAuICRQYXJhbXtNZW51SUR9LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUpTRGF0YSwKICAgICAgICApOwogICAgfQoKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQvSVRTTUNoYW5nZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuMiAyMDE4LzExLzExIDEyOjU1OjA2IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OklUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQyIElUU01DaGFuZ2VCdWlsZFdvcmtPcmRlckdyYXBoKCkKCnJldHVybnMgYSBvdXRwdXQgc3RyaW5nIGZvciBXb3JrT3JkZXIgZ3JhcGgKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUJ1aWxkV29ya09yZGVyR3JhcGgoCiAgICAgICAgQ2hhbmdlICAgICAgICAgICAgID0+ICRDaGFuZ2VSZWYsCiAgICAgICAgV29ya09yZGVyT2JqZWN0ICAgID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICAgICAgRHluYW1pY0ZpZWxkT2JqZWN0ID0+ICREeW5hbWljRmllbGRPYmplY3QsCiAgICAgICAgQmFja2VuZE9iamVjdCAgICAgID0+ICRCYWNrZW5kT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ2hhbmdlQnVpbGRXb3JrT3JkZXJHcmFwaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBmb3IgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJFBhcmFte0NoYW5nZX07CiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB3b3Jrb3JkZXIgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17V29ya09yZGVyT2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlck9iamVjdCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc3RvcmUgd29ya29yZGVyIG9iamVjdCBsb2NhbGx5CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJFBhcmFte1dvcmtPcmRlck9iamVjdH07CgogICAgIyBjaGVjayBpZiB3b3Jrb3JkZXJzIGFyZSBhdmFpbGFibGUKICAgIHJldHVybiBpZiAhJENoYW5nZS0+e1dvcmtPcmRlckNvdW50fTsKCiAgICAjIGV4dHJhIGNoZWNrIGZvciBBUlJBWS1yZWYKICAgIHJldHVybiBpZiByZWYgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gbmUgJ0FSUkFZJzsKCiAgICAjIGhhc2ggZm9yIHNtYWxsZXN0IHRpbWUKICAgIG15ICVUaW1lOwoKICAgIFRJTUVUWVBFOgogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoU3RhcnQgRW5kKSkgewoKICAgICAgICAjIGFjdHVhbCB0aW1lIG5vdCBzZXQsIHNvIHdlIGNhbiB1c2UgcGxhbm5lZAogICAgICAgIGlmICggISRDaGFuZ2UtPnsiQWN0dWFsJHtUaW1lVHlwZX1UaW1lIn0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRpbWUgaXMgc2V0CiAgICAgICAgICAgIG5leHQgVElNRVRZUEUgaWYgISRDaGFuZ2UtPnsiUGxhbm5lZCR7VGltZVR5cGV9VGltZSJ9OwoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdG8gc3lzdGVtLXRpbWUvZXBvY2gKICAgICAgICAgICAgJFRpbWV7IiR7VGltZVR5cGV9VGltZSJ9ID0gJFNlbGYtPl9UaW1lU3RhbXAyRXBvY2goCiAgICAgICAgICAgICAgICBUaW1lU3RhbXAgPT4gJENoYW5nZS0+eyJQbGFubmVkJHtUaW1lVHlwZX1UaW1lIn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGp1bXAgdG8gbmV4dCB0eXBlCiAgICAgICAgICAgIG5leHQgVElNRVRZUEU7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zbGF0ZSBwbGFubmVkIHRpbWUgdG8gdGltZXN0YW1wIGZvciBlcXVhdGlvbgogICAgICAgICRUaW1leyJQbGFubmVkJHtUaW1lVHlwZX1UaW1lIn0gPSAkU2VsZi0+X1RpbWVTdGFtcDJFcG9jaCgKICAgICAgICAgICAgVGltZVN0YW1wID0+ICRDaGFuZ2UtPnsiUGxhbm5lZCR7VGltZVR5cGV9VGltZSJ9LAogICAgICAgICk7CgogICAgICAgICMgdHJhbnNsYXRlIGFjdHVhbCB0aW1lIHRvIHRpbWVzdGFtcCBmb3IgZXF1YXRpb24KICAgICAgICAkVGltZXsiQWN0dWFsJHtUaW1lVHlwZX1UaW1lIn0gPSAkU2VsZi0+X1RpbWVTdGFtcDJFcG9jaCgKICAgICAgICAgICAgVGltZVN0YW1wID0+ICRDaGFuZ2UtPnsiQWN0dWFsJHtUaW1lVHlwZX1UaW1lIn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aW1lIGF0dHJpYnV0ZXMgdG8gZW1wdHkgc3RyaW5nIGlmIG5vdCBkZWZpbmVkCiAgICBmb3IgbXkgJFRpbWVBdHRyaWJ1dGUgKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CiAgICAgICAgJFRpbWV7JFRpbWVBdHRyaWJ1dGV9IC8vPSAnJzsKICAgIH0KCiAgICAjIGdldCBzbWFsbGVzdCBzdGFydCB0aW1lCiAgICBpZiAoICEkVGltZXtTdGFydFRpbWV9ICkgewogICAgICAgICRUaW1le1N0YXJ0VGltZX0gPSAoICRUaW1le1BsYW5uZWRTdGFydFRpbWV9IGx0ICRUaW1le0FjdHVhbFN0YXJ0VGltZX0gKQogICAgICAgICAgICA/ICRUaW1le1BsYW5uZWRTdGFydFRpbWV9CiAgICAgICAgICAgIDogJFRpbWV7QWN0dWFsU3RhcnRUaW1lfTsKICAgIH0KCiAgICAjIGdldCBoaWdoZXN0IGVuZCB0aW1lCiAgICBpZiAoICEkVGltZXtFbmRUaW1lfSApIHsKICAgICAgICAkVGltZXtFbmRUaW1lfSA9ICggJFRpbWV7UGxhbm5lZEVuZFRpbWV9IGd0ICRUaW1le0FjdHVhbEVuZFRpbWV9ICkKICAgICAgICAgICAgPyAkVGltZXtQbGFubmVkRW5kVGltZX0KICAgICAgICAgICAgOiAkVGltZXtBY3R1YWxFbmRUaW1lfTsKICAgIH0KCiAgICAjIEdldCBjdXJyZW50IHN5c3RlbSB1bml4IHRpbWUgKGVwb2NoKS4KICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwogICAgKS0+VG9FcG9jaCgpOwoKICAgICMgY2hlY2sgZm9yIHJlYWwgZW5kIG9mIGVuZCB0aW1lIGZvciBzY2FsZSBhbmQgZ3JhcGggaXRlbXMKICAgICMgb25seSBpZiBBY3R1YWxTdGFydFRpbWUgaXMgc2V0CiAgICBpZiAoCiAgICAgICAgJFRpbWV7QWN0dWFsU3RhcnRUaW1lfQogICAgICAgICYmICEkVGltZXtBY3R1YWxFbmRUaW1lfQogICAgICAgICYmICggJFRpbWV7RW5kVGltZX0gbHQgJFN5c3RlbVRpbWUgKQogICAgICAgICkKICAgIHsKICAgICAgICAkVGltZXtFbmRUaW1lfSA9ICRTeXN0ZW1UaW1lOwogICAgfQoKICAgICMgY2FsY3VsYXRlIHRpY2tzIGZvciBjaGFuZ2UKICAgIG15ICRDaGFuZ2VUaWNrcyA9ICRTZWxmLT5fSVRTTUNoYW5nZUdldENoYW5nZVRpY2tzKAogICAgICAgIFN0YXJ0ID0+ICRUaW1le1N0YXJ0VGltZX0sCiAgICAgICAgRW5kICAgPT4gJFRpbWV7RW5kVGltZX0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHZhbGlkIHRpY2tzCiAgICBpZiAoICEkQ2hhbmdlVGlja3MgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVW5hYmxlIHRvIGNhbGN1bGF0ZSB0aW1lIHNjYWxlLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXJzIG9mIGNoYW5nZQogICAgbXkgQFdvcmtPcmRlcnM7CiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgcHVzaCBAV29ya09yZGVycywgJFdvcmtPcmRlcjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgc2V0dGluZ3MKICAgIG15ICRDaGFuZ2Vab29tQ29uZmlnCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tJyk7CgogICAgIyBjaGVjayBjb25maWcgc2V0dGluZwogICAgaWYgKCAhJENoYW5nZVpvb21Db25maWcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTeXNDb25maWcgc2V0dGluZ3MgZm9yIElUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBncmFwaCBjb25maWcgc2V0dGluZwogICAgaWYgKCAhJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJHcmFwaH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTeXNDb25maWcgc2V0dGluZ3MgZm9yICcKICAgICAgICAgICAgICAgIC4gJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjV29ya09yZGVyR3JhcGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHZhbGlkaXR5IHNldHRpbmdzIG9mIGdyYXBoIHNldHRpbmdzCiAgICBteSAlV29ya09yZGVyR3JhcGhDaGVjayA9ICgKICAgICAgICBUaW1lTGluZUNvbG9yICAgICAgICAgICA9PiAnI1thLWZBLUZcZF17Nn0nLAogICAgICAgIFRpbWVMaW5lV2lkdGggICAgICAgICAgID0+ICdcZHsxLDJ9JywKICAgICAgICB1bmRlZmluZWRfcGxhbm5lZF9jb2xvciA9PiAnI1thLWZBLUZcZF17Nn0nLAogICAgICAgIHVuZGVmaW5lZF9hY3R1YWxfY29sb3IgID0+ICcjW2EtZkEtRlxkXXs2fScsCiAgICApOwoKICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgZ3JhcGggc2V0dGluZ3MKICAgIG15ICRXb3JrT3JkZXJHcmFwaENvbmZpZyA9ICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyR3JhcGh9OwogICAgZm9yIG15ICRHcmFwaFNldHRpbmcgKCBzb3J0IGtleXMgJVdvcmtPcmRlckdyYXBoQ2hlY2sgKSB7CgogICAgICAgICMgY2hlY2sgZXhpc3RlbnNlIG9mIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgaWYgKCAhJFdvcmtPcmRlckdyYXBoQ29uZmlnLT57JEdyYXBoU2V0dGluZ30gKSB7CgogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3IgYW5kIHJldHVybgogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgU3lzQ29uZmlnIHNldHRpbmcgJyRHcmFwaFNldHRpbmcnIGluICIKICAgICAgICAgICAgICAgICAgICAuICJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjI1dvcmtPcmRlckdyYXBoISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgY29uZmlnIHNldHRpbmcKICAgICAgICBpZiAoCiAgICAgICAgICAgICRXb3JrT3JkZXJHcmFwaENvbmZpZy0+eyRHcmFwaFNldHRpbmd9CiAgICAgICAgICAgICF+IG17IFxBICRXb3JrT3JkZXJHcmFwaENoZWNreyRHcmFwaFNldHRpbmd9IFx6IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvciBhbmQgcmV0dXJuCiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU3lzQ29uZmlnIHNldHRpbmcgJyRHcmFwaFNldHRpbmcnIGlzIGludmFsaWQgaW4gIgogICAgICAgICAgICAgICAgICAgIC4gIklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjV29ya09yZGVyR3JhcGghIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbXB1dGUgZWZmZWNpdmUgbGFiZWwgd2lkdGgKICAgIG15ICRMYWJlbFdpZHRoID0gNjA7CiAgICBpZiAoICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyU3RhdGV9ICYmICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICRMYWJlbFdpZHRoICs9IDE4MDsKICAgIH0KICAgIGVsc2lmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJExhYmVsV2lkdGggKz0gNzA7CiAgICB9CiAgICBlbHNpZiAoICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICRMYWJlbFdpZHRoICs9IDEyNTsKICAgIH0KCiAgICAjIGxvYWQgZ3JhcGggc2tlbGV0b24KICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJHcmFwaCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIExhYmVsV2lkdGggID0+ICRMYWJlbFdpZHRoLAogICAgICAgICAgICBMYWJlbE1hcmdpbiA9PiAkTGFiZWxXaWR0aCArIDIsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjcmVhdGUgY29sb3IgZGVmaW5pdGlvbnMgZm9yIGFsbCBjb25maWd1cmVkIHdvcmtvcmRlciB0eXBlcwogICAgbXkgJFdvcmtPcmRlclR5cGVzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyVHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICkgfHwgW107CgogICAgIyBjcmVhdGUgY3NzIGRlZmluaXRpb25zIGZvciB3b3Jrb3JkZXIgdHlwZXMKICAgIFdPUktPUkRFUlRZUEU6CiAgICBmb3IgbXkgJFdvcmtPcmRlclR5cGUgKCBAeyRXb3JrT3JkZXJUeXBlc30gKSB7CgogICAgICAgICMgY2hlY2sgd29ya29yZGVyIHR5cGUKICAgICAgICBuZXh0IFdPUktPUkRFUlRZUEUgaWYgISRXb3JrT3JkZXJUeXBlOwogICAgICAgIG5leHQgV09SS09SREVSVFlQRSBpZiAhJFdvcmtPcmRlclR5cGUtPntWYWx1ZX07CgogICAgICAgICMgZ2V0IG5hbWUgb2Ygd29ya29yZGVyIHR5cGUKICAgICAgICBteSAkV29ya09yZGVyVHlwZU5hbWUgPSAkV29ya09yZGVyVHlwZS0+e1ZhbHVlfTsKCiAgICAgICAgIyBjaGVjayBjb250ZW50cyBvZiBuYW1lCiAgICAgICAgbmV4dCBXT1JLT1JERVJUWVBFIGlmICEkV29ya09yZGVyVHlwZU5hbWU7CgogICAgICAgIGZvciBteSAkV29ya09yZGVyQ29sb3IgKHF3KCBfcGxhbm5lZCBfYWN0dWFsICkpIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZ3VyZWQgb3IgZmFsbGJhY2sgcGxhbm5lZCBjb2xvciBmb3Igd29ya29yZGVyCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJUeXBlQ29sb3IKICAgICAgICAgICAgICAgID0gJFdvcmtPcmRlckdyYXBoQ29uZmlnLT57IiR7V29ya09yZGVyVHlwZU5hbWV9JHtXb3JrT3JkZXJDb2xvcn1fY29sb3IifTsKCiAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgY29sb3IgaWYgbm8gY29sb3IgaXMgZm91bmQKICAgICAgICAgICAgJFdvcmtPcmRlclR5cGVDb2xvciB8fD0gJFdvcmtPcmRlckdyYXBoQ29uZmlnLT57InVuZGVmaW5lZCR7V29ya09yZGVyQ29sb3J9X2NvbG9yIn07CgogICAgICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHdvcmtvcmRlciBjb2xvcgogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXJUeXBlQ29sb3IgIX4gbXsgXEEgIyBbQS1aYS16XGRdezZ9IFx6IH14bXMgKSB7CiAgICAgICAgICAgICAgICAkV29ya09yZGVyVHlwZUNvbG9yID0gJFdvcmtPcmRlckdyYXBoQ29uZmlnLT57InVuZGVmaW5lZCR7V29ya09yZGVyQ29sb3J9X2NvbG9yIn07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZGlzcGxheSBjc3MgZGVmaW5pdGlvbnMgZm9yIHBsYW5uZWQKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ1NTV29ya09yZGVyVHlwZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlTmFtZSAgPT4gJFdvcmtPcmRlclR5cGVOYW1lIC4gJFdvcmtPcmRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVDb2xvciA9PiAkV29ya09yZGVyVHlwZUNvbG9yLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWxjdWxhdGUgdGltZSBsaW5lIHBhcmFtZXRlcgogICAgbXkgJFRpbWVMaW5lID0gJFNlbGYtPl9JVFNNQ2hhbmdlR2V0VGltZUxpbmUoCiAgICAgICAgU3RhcnRUaW1lID0+ICRUaW1le1N0YXJ0VGltZX0sCiAgICAgICAgRW5kVGltZSAgID0+ICRUaW1le0VuZFRpbWV9LAogICAgICAgIFRpY2tzICAgICA9PiAkQ2hhbmdlVGlja3MsCiAgICApOwoKICAgIGlmICggJFRpbWVMaW5lICYmIGRlZmluZWQgJFRpbWVMaW5lLT57VGltZUxpbmVMZWZ0fSApIHsKCiAgICAgICAgIyBjYWxjdWxhdGUgaGVpZ2h0IG9mIHRpbWUgbGluZQogICAgICAgIG15ICRXb3JrT3JkZXJIZWlnaHQgPSAxNjsKICAgICAgICBteSAkU2NhbGVNYXJnaW4gICAgID0gMTE7CiAgICAgICAgJFRpbWVMaW5lLT57VGltZUxpbmVIZWlnaHR9ID0gKCAoIHNjYWxhciBAV29ya09yZGVycyApICogJFdvcmtPcmRlckhlaWdodCApICsgJFNjYWxlTWFyZ2luOwoKICAgICAgICAjIGRpc3BsYXkgY3NzIG9mIHRpbWVsaW5lCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDU1NUaW1lTGluZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGltZUxpbmV9LAogICAgICAgICAgICAgICAgJXskV29ya09yZGVyR3JhcGhDb25maWd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aW1lbGluZSBjb250YWluZXIKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVMaW5lJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc29ydCB3b3Jrb3JkZXIgYXNjZW5kaW5nIHRvIFdvcmtPcmRlck51bWJlcgogICAgQFdvcmtPcmRlcnMgPSBzb3J0IHsgJGEtPntXb3JrT3JkZXJOdW1iZXJ9IDw9PiAkYi0+e1dvcmtPcmRlck51bWJlcn0gfSBAV29ya09yZGVyczsKCiAgICAjIGJ1aWxkIGdyYXBoIG9mIGVhY2ggd29ya29yZGVyCiAgICBXT1JLT1JERVI6CiAgICBmb3IgbXkgJFdvcmtPcmRlciAoQFdvcmtPcmRlcnMpIHsKICAgICAgICBuZXh0IFdPUktPUkRFUiBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgJFNlbGYtPl9JVFNNQ2hhbmdlR2V0V29ya09yZGVyR3JhcGgoCiAgICAgICAgICAgIFdvcmtPcmRlciAgICAgICAgICA9PiAkV29ya09yZGVyLAogICAgICAgICAgICBEeW5hbWljRmllbGRPYmplY3QgPT4gJFBhcmFte0R5bmFtaWNGaWVsZE9iamVjdH0sCiAgICAgICAgICAgIEJhY2tlbmRPYmplY3QgICAgICA9PiAkUGFyYW17QmFja2VuZE9iamVjdH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAkVGltZXtTdGFydFRpbWV9LAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJFRpbWV7RW5kVGltZX0sCiAgICAgICAgICAgIFRpY2tzICAgICAgICAgICAgICA9PiAkQ2hhbmdlVGlja3MsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNjYWxlIG9mIGdyYXBoCiAgICAkU2VsZi0+X0lUU01DaGFuZ2VHZXRDaGFuZ2VTY2FsZSgKICAgICAgICBTdGFydFRpbWUgICA9PiAkVGltZXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgID0+ICRUaW1le0VuZFRpbWV9LAogICAgICAgIFRpY2tzICAgICAgID0+ICRDaGFuZ2VUaWNrcywKICAgICAgICBMYWJlbE1hcmdpbiA9PiAkTGFiZWxXaWR0aCArIDIsCiAgICApOwoKICAgICMgcmVuZGVyIGdyYXBoIGFuZCByZXR1cm4gSFRNTCB3aXRoIElUU01DaGFuZ2UuZHRsIHRlbXBsYXRlCiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7Cn0KCj1oZWFkMiBJVFNNQ2hhbmdlTGlzdFNob3coKQoKUmV0dXJucyBhIGxpc3Qgb2YgY2hhbmdlcyBhcyBDPHNvcnRhYmxlPiBsaXN0IHdpdGggcGFnaW5hdGlvbi4KClRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBMPEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRUaWNrZXQ6OlRpY2tldExpc3RTaG93KCk+CmluIEY8S2VybmVsL091dHB1dC9IVE1ML0xheW91dFRpY2tldC5wbT4uCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPklUU01DaGFuZ2VMaXN0U2hvdygKICAgICAgICBDaGFuZ2VJRHMgID0+ICRDaGFuZ2VJRHNSZWYsICAgICAgICAgICAgICAgICAgICAgICMgdG90YWwgbGlzdCBvZiBjaGFuZ2UgaWRzLCB0aGF0IGNhbiBiZSBsaXN0ZWQKICAgICAgICBUb3RhbCAgICAgID0+IHNjYWxhciBAeyAkQ2hhbmdlSURzUmVmIH0sICAgICAgICAgICMgdG90YWwgbnVtYmVyIG9mIGxpc3QgaXRlbXMsIGNoYW5nZXMgaW4gdGhpcyBjYXNlCiAgICAgICAgVmlldyAgICAgICA9PiAkU2VsZi0+e1ZpZXd9LCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAnU21hbGwnCiAgICAgICAgRmlsdGVyICAgICA9PiAnQWxsJywKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgVGl0bGVOYW1lICA9PiAnT3ZlcnZpZXc6IENoYW5nZXMnLAogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEVudiAgICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgICA9PiAkTGlua1NvcnQsCiAgICAgICAgRnJvbnRlbmQgICA9PiAnQWdlbnQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKEFnZW50fEN1c3RvbWVyKSwgZGVmYXVsdDogQWdlbnQsIGluZGljYXRlcyBmcm9tIHdoaWNoIGZyb250ZW5kIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZAogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ2hhbmdlTGlzdFNob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2Ugb2JqZWN0IHJlZiB0byBsb2NhbCwgcmVtb3ZlIGl0IGZyb20gJVBhcmFtIChwcmV2ZW50IG1lbW9yeSBsZWFrKQogICAgbXkgJEVudiA9IGRlbGV0ZSAkUGFyYW17RW52fTsKCiAgICAjIGxvb2t1cCBsYXRlc3QgdXNlZCB2aWV3IG1vZGUKICAgIGlmICggISRQYXJhbXtWaWV3fSAmJiAkU2VsZi0+eyAnVXNlcklUU01DaGFuZ2VPdmVydmlldycgLiAkRW52LT57QWN0aW9ufSB9ICkgewogICAgICAgICRQYXJhbXtWaWV3fSA9ICRTZWxmLT57ICdVc2VySVRTTUNoYW5nZU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259IH07CiAgICB9CgogICAgIyBzZXQgZnJvbnRlbmQKICAgIG15ICRGcm9udGVuZCA9ICRQYXJhbXtGcm9udGVuZH0gfHwgJ0FnZW50JzsKCiAgICAjIHNldCBkZWZhdXQgdmlldyBtb2RlIHRvICdzbWFsbCcKICAgIG15ICRWaWV3ID0gJFBhcmFte1ZpZXd9IHx8ICdTbWFsbCc7CgogICAgIyBzdG9yZSBsYXRlc3QgdmlldyBtb2RlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdVc2VySVRTTUNoYW5nZU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259LAogICAgICAgIFZhbHVlICAgICA9PiAkVmlldywKICAgICk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IGJhY2tlbmQgZnJvbSBjb25maWcKICAgIG15ICRCYWNrZW5kcyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3Jyk7CiAgICBpZiAoICEkQmFja2VuZHMgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ05lZWQgY29uZmlnIG9wdGlvbiAlcyEnLAogICAgICAgICAgICAgICAgJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpPdmVydmlldycsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGhhc2gtcmVmCiAgICBpZiAoIHJlZiAkQmFja2VuZHMgbmUgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdDb25maWcgb3B0aW9uICVzIG5lZWRzIHRvIGJlIGEgSEFTSCByZWYhJywKICAgICAgICAgICAgICAgICdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6T3ZlcnZpZXcnLAogICAgICAgICAgICApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjb25maWcga2V5CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdObyBjb25maWcgb3B0aW9uIGZvdW5kIGZvciB0aGUgdmlldyAiJXMiIScsICRWaWV3ICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgbmF2IGJhcgogICAgbXkgJFN0YXJ0SGl0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAnU3RhcnRIaXQnLAogICAgKSB8fCAxOwoKICAgICMgZ2V0IHBlcnNvbmFsIHBhZ2Ugc2hvd24gY291bnQKICAgIG15ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleSA9ICdVc2VyQ2hhbmdlT3ZlcnZpZXcnIC4gJFZpZXcgLiAnUGFnZVNob3duJzsKICAgIG15ICRQYWdlU2hvd24gICAgICAgICAgICAgICA9ICRTZWxmLT57JFBhZ2VTaG93blByZWZlcmVuY2VzS2V5fSB8fCAxMDsKICAgIG15ICRHcm91cCAgICAgICAgICAgICAgICAgICA9ICdDaGFuZ2VPdmVydmlldycgLiAkVmlldyAuICdQYWdlU2hvd24nOwoKICAgICMgY2hlY2sgc3RhcnQgb3B0aW9uLCBpZiBoaWdoZXIgdGhlbiBlbGVtZW50cyBhdmFpbGFibGUsIHNldAogICAgIyBpdCB0byB0aGUgbGFzdCBvdmVydmlldyBwYWdlIChUaGFua3MgdG8gU3RlZmFuIFNjaG1pZHQhKQogICAgaWYgKCAkU3RhcnRIaXQgPiAkUGFyYW17VG90YWx9ICkgewogICAgICAgIG15ICRQYWdlcyA9IGludCggKCAkUGFyYW17VG90YWx9IC8gJFBhZ2VTaG93biApICsgMC45OTk5OSApOwogICAgICAgICRTdGFydEhpdCA9ICggKCAkUGFnZXMgLSAxICkgKiAkUGFnZVNob3duICkgKyAxOwogICAgfQoKICAgICMgZ2V0IGRhdGEgc2VsZWN0aW9uCiAgICBteSAlRGF0YTsKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ByZWZlcmVuY2VzR3JvdXBzJyk7CiAgICBpZiAoICRDb25maWcgJiYgJENvbmZpZy0+eyRHcm91cH0gJiYgJENvbmZpZy0+eyRHcm91cH0tPntEYXRhfSApIHsKICAgICAgICAlRGF0YSA9ICV7ICRDb25maWctPnskR3JvdXB9LT57RGF0YX0gfTsKICAgIH0KCiAgICAjIHNldCBwYWdlIGxpbWl0IGFuZCBidWlsZCBwYWdlIG5hdgogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAyMF8wMDA7CiAgICBteSAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkUGFyYW17VG90YWx9IHx8IDAsCiAgICAgICAgQWN0aW9uICAgID0+ICdBY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICA9PiAkUGFyYW17TGlua1BhZ2V9LAogICAgKTsKCiAgICAjIGJ1aWxkIHNob3duIHRpY2tldCBhIHBhZ2UKICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICAgID0gJFBhcmFte1JlcXVlc3RlZFVSTH0gfHwgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iOwogICAgJFBhcmFte0dyb3VwfSAgICAgICAgICAgPSAkR3JvdXA7CiAgICAkUGFyYW17UHJlZmVyZW5jZXNLZXl9ICA9ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleTsKICAgICRQYXJhbXtQYWdlU2hvd25TdHJpbmd9ID0gJFNlbGYtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICRQYWdlU2hvd25QcmVmZXJlbmNlc0tleSwKICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFnZVNob3duLAogICAgICAgIERhdGEgICAgICAgID0+IFwlRGF0YSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgIFNvcnQgICAgICAgID0+ICdOdW1lcmljVmFsdWUnLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGJ1aWxkIG5hdmJhciBjb250ZW50CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGJhY2sgbGluawogICAgaWYgKCAkUGFyYW17TGlua0JhY2t9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclBhZ2VCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2VNZ210Q2hhbmdlU2VhcmNoJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgUHJvZmlsZSA9PiAkUGFyYW17UHJvZmlsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBmaWx0ZXJzCiAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfSApIHsKCiAgICAgICAgIyBnZXQgZ2l2ZW4gZmlsdGVycwogICAgICAgIG15IEBOYXZCYXJGaWx0ZXJzOwogICAgICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAleyAkUGFyYW17RmlsdGVyc30gfSApIHsKICAgICAgICAgICAgcHVzaCBATmF2QmFyRmlsdGVycywgJFBhcmFte0ZpbHRlcnN9LT57JFByaW99OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBmaWx0ZXIgY29udGVudAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgbG9vcCBvdmVyIGZpbHRlcnMKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgIGZvciBteSAkRmlsdGVyIChATmF2QmFyRmlsdGVycykgewoKICAgICAgICAgICAgIyBpbmNyZW1lbnQgZmlsdGVyIGNvdW50IGFuZCBidWlsZCBmaWx0ZXIgaXRlbQogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmaWx0ZXIgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAkRmlsdGVyLT57RmlsdGVyfSBlcSAkUGFyYW17RmlsdGVyfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb3Agb3ZlciBjb25maWd1cmVkIGJhY2tlbmRzCiAgICBmb3IgbXkgJEJhY2tlbmQgKCBzb3J0IGtleXMgJXskQmFja2VuZHN9ICkgewoKICAgICAgICAjIGJ1aWxkIG5hdmJhciB2aWV3IG1vZGUKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjdXJyZW50IHZpZXcgaXMgY29uZmlndXJlZCBpbiBiYWNrZW5kCiAgICAgICAgaWYgKCAkVmlldyBlcSAkQmFja2VuZCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHBhZ2UgbmF2IGlzIGF2YWlsYWJsZQogICAgaWYgKCVQYWdlTmF2KSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYWdlTmF2LAogICAgICAgICk7CgogICAgICAgICMgZG9uJ3Qgc2hvdyBjb250ZXh0IHNldHRpbmdzIGluIEFKQVggY2FzZSAoZS4gZy4gaW4gY3VzdG9tZXIgdGlja2V0IGhpc3RvcnkpLAogICAgICAgICMgICBiZWNhdXNlIHRoZSBzdWJtaXQgd2l0aCBwYWdlIHJlbG9hZCB3aWxsIG5vdCB3b3JrIHRoZXJlCiAgICAgICAgaWYgKCAhJFBhcmFte0FKQVh9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRleHRTZXR0aW5ncycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFnZU5hdiwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGh0bWwgY29udGVudAogICAgbXkgJE91dHB1dE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dFJhdyA9ICcnOwogICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dE5hdkJhciwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TmF2QmFyOwogICAgfQoKICAgICMgbG9hZCBtb2R1bGUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRCYWNrZW5kcy0+eyRWaWV3fS0+e01vZHVsZX0gKSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkT2JqZWN0ID0gJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfS0+bmV3KCAleyRFbnZ9ICk7CiAgICByZXR1cm4gaWYgISRPYmplY3Q7CgogICAgIyBydW4gbW9kdWxlCiAgICBteSAkT3V0cHV0ID0gJE9iamVjdC0+UnVuKAogICAgICAgICVQYXJhbSwKICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgQWxsSGl0cyAgID0+ICRQYXJhbXtUb3RhbH0gfHwgMCwKICAgICAgICBGcm9udGVuZCAgPT4gJEZyb250ZW5kLAogICAgKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KAogICAgICAgICAgICBPdXRwdXQgPT4gXCRPdXRwdXQsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dDsKICAgIH0KCiAgICAjIGNyZWF0ZSBvdmVydmlldyBuYXYgYmFyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyByZXR1cm4gY29udGVudCBpZiBhdmFpbGFibGUKICAgIHJldHVybiAkT3V0cHV0UmF3Owp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfSVRTTUNoYW5nZUdldENoYW5nZVRpY2tzKCkKCmEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIEM8d29ya29yZGVyPiBncmFwaCBvZiBhIGNoYW5nZQoKPWN1dAoKc3ViIF9JVFNNQ2hhbmdlR2V0Q2hhbmdlVGlja3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBzdGFydCBhbmQgZW5kCiAgICByZXR1cm4gaWYgISRQYXJhbXtTdGFydH0gfHwgISRQYXJhbXtFbmR9OwoKICAgICMgbWFrZSBzdXJlIHdlIGdvdCBpbnRlZ2VycwogICAgcmV0dXJuIGlmICRQYXJhbXtTdGFydH0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CiAgICByZXR1cm4gaWYgJFBhcmFte0VuZH0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyBjYWxjdWxhdGUgdGltZSBzcGFuIGluIHNlYwogICAgbXkgJFRpY2tzID0gJFBhcmFte0VuZH0gLSAkUGFyYW17U3RhcnR9OwoKICAgICMgY2hlY2sgZm9yIGNvbXB1dGluZyBlcnJvcgogICAgcmV0dXJuIGlmICRUaWNrcyA8PSAwOwoKICAgICMgZ2V0IHNlY29uZHMgcGVyIHBlcmNlbnQgYW5kIHJvdW5kIGRvd24KICAgICRUaWNrcyA9IHNwcmludGYoICIlLmYiLCAkVGlja3MgLyAxMDAgKTsKCiAgICByZXR1cm4gJFRpY2tzOwp9Cgo9aGVhZDIgX0lUU01DaGFuZ2VHZXRDaGFuZ2VTY2FsZSgpCgphIGhlbHBlciBtZXRob2QgZm9yIHRoZSBDPHdvcmtvcmRlcj4gZ3JhcGggb2YgYSBjaGFuZ2UKCj1jdXQKCnN1YiBfSVRTTUNoYW5nZUdldENoYW5nZVNjYWxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3Igc3RhcnQgdGltZQogICAgcmV0dXJuIGlmICEkUGFyYW17U3RhcnRUaW1lfTsKCiAgICAjIGNoZWNrIGZvciBzdGFydCB0aW1lIGlzIGFuIGludGVnZXIgdmFsdWUKICAgIHJldHVybiBpZiAkUGFyYW17U3RhcnRUaW1lfSAhfiBteyBcQSBcZCsgXHogfXhtczsKCiAgICAjIGFkZCBzdGFydCBhbmQgZW5kIHRpbWUgYW5kIGNhbGN1bGF0ZSBzY2FsZSBuYW1pbmcKICAgIG15ICVTY2FsZU5hbWUgPSAoCiAgICAgICAgU3RhcnRUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgU2NhbGUxNSAgID0+ICggJFBhcmFte1N0YXJ0VGltZX0gKyAyMCAqICRQYXJhbXtUaWNrc30gKSwKICAgICAgICBTY2FsZTM1ICAgPT4gKCAkUGFyYW17U3RhcnRUaW1lfSArIDQwICogJFBhcmFte1RpY2tzfSApLAogICAgICAgIFNjYWxlNTUgICA9PiAoICRQYXJhbXtTdGFydFRpbWV9ICsgNjAgKiAkUGFyYW17VGlja3N9ICksCiAgICAgICAgU2NhbGU3NSAgID0+ICggJFBhcmFte1N0YXJ0VGltZX0gKyA4MCAqICRQYXJhbXtUaWNrc30gKSwKICAgICk7CgogICAgIyB0cmFuc2xhdGUgdGltZXN0YW1wcyBpbiBkYXRlIGZvcm1hdAogICAgbWFwIHsKICAgICAgICAkU2NhbGVOYW1leyRffSA9ICRTZWxmLT5fRXBvY2gyVGltZVN0YW1wKAogICAgICAgICAgICBFcG9jaCA9PiAkU2NhbGVOYW1leyRffSwKICAgICAgICAgICAgKQogICAgfSBrZXlzICVTY2FsZU5hbWU7CgogICAgIyBjcmVhdGUgc2NhbGUgYmxvY2sKICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTY2FsZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVTY2FsZU5hbWUsCiAgICAgICAgICAgIExhYmVsTWFyZ2luID0+ICRQYXJhbXtMYWJlbE1hcmdpbn0sCiAgICAgICAgfSwKICAgICk7CgogICAgSU5URVJWQUw6CiAgICBmb3IgbXkgJEludGVydmFsICggc29ydCBrZXlzICVTY2FsZU5hbWUgKSB7CgogICAgICAgICMgZG8gbm90IGRpc3BsYXkgc2NhbGUgaWYgdHJhbnNsYXRpbmcgZmFpbGVkCiAgICAgICAgbmV4dCBJTlRFUlZBTCBpZiAhJFNjYWxlTmFtZXskSW50ZXJ2YWx9OwoKICAgICAgICAjIGRvIG5vdCBkaXNwbGF5IHN0YXJ0IG9yIGVuZAogICAgICAgIG5leHQgSU5URVJWQUwgaWYgJEludGVydmFsID1+IG17IFxBICggU3RhcnQgfCBFbmQgKSBUaW1lIFx6IH14bXM7CgogICAgICAgICMgYnVpbGQgc2NhbGUgbGFiZWwgYmxvY2sKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NjYWxlTGFiZWwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNjYWxlTGFiZWwgPT4gJFNjYWxlTmFtZXskSW50ZXJ2YWx9LAogICAgICAgICAgICAgICAgU2NhbGVDbGFzcyA9PiAkSW50ZXJ2YWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9JVFNNQ2hhbmdlR2V0V29ya09yZGVyR3JhcGgoKQoKYSBoZWxwZXIgbWV0aG9kIGZvciB0aGUgQzx3b3Jrb3JkZXI+IGdyYXBoIG9mIGEgY2hhbmdlCgo9Y3V0CgpzdWIgX0lUU01DaGFuZ2VHZXRXb3JrT3JkZXJHcmFwaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkUGFyYW17V29ya09yZGVyfTsKCiAgICAjIGV4dHJhY3Qgd29ya29yZGVyCiAgICBteSAkV29ya09yZGVyID0gJFBhcmFte1dvcmtPcmRlcn07CgogICAgIyBzYXZlIG9yaWcgd29ya29yZGVyIGZvciB3b3Jrb3JkZXIgaW5mb3JtYXRpb24KICAgIG15ICVXb3JrT3JkZXJJbmZvcm1hdGlvbiA9ICV7JFdvcmtPcmRlcn07CgogICAgIyB0cmFuc2xhdGUgd29ya29yZGVyIHR5cGUKICAgICRXb3JrT3JkZXItPntUcmFuc2xhdGVkV29ya09yZGVyVHlwZX0KICAgICAgICA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRXb3JrT3JkZXItPntXb3JrT3JkZXJUeXBlfSApOwoKICAgICMgYnVpbGQgbGFiZWwgZm9yIGxpbmsgaW4gZ3JhcGgKICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJMYWJlbH0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICdUaXRsZTogJXMgfCBUeXBlOiAlcycsCiAgICAgICAgJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSwKICAgICAgICAkV29ya09yZGVyLT57VHJhbnNsYXRlZFdvcmtPcmRlclR5cGV9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB3b3Jrb3JkZXIgaXRlbQogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgbXkgJENoYW5nZVpvb21Db25maWcKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20nKTsKCiAgICAjIGFkZCB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJdGVtU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCB3b3Jrb3JkZXIgdGl0bGUKICAgIGlmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJdGVtVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRpY2tzIGFyZSBjYWxjdWxhdGVkCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrc307CgogICAgIyBzZXQgcGxhbm5lZCBpZiBubyBhY3R1YWwgdGltZSBpcyBzZXQKICAgIGlmICggISRXb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9ICkgewogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9ID0gJFdvcmtPcmRlci0+e1BsYW5uZWRTdGFydFRpbWV9OwogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxFbmRUaW1lfSAgID0gJFdvcmtPcmRlci0+e1BsYW5uZWRFbmRUaW1lfTsKICAgIH0KCiAgICAjIHNldCBjdXJyZW50IHRpbWUgaWYgbm8gYWN0dWFsIGVuZCB0aW1lIGlzIHNldAogICAgaWYgKCAkV29ya09yZGVyLT57QWN0dWFsU3RhcnRUaW1lfSAmJiAhJFdvcmtPcmRlci0+e0FjdHVhbEVuZFRpbWV9ICkgewogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxFbmRUaW1lfSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICktPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIyBzZXQgbmljZSBkaXNwbGF5IG9mIHVuZGVmIGFjdHVhbCB0aW1lcwogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFdvcmtPcmRlckluZm9ybWF0aW9ueyRUaW1lVHlwZX0gKSB7CiAgICAgICAgICAgICRXb3JrT3JkZXJJbmZvcm1hdGlvbnsiRW1wdHkke1RpbWVUeXBlfSJ9ID0gJy0nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhc2ggZm9yIHRpbWUgdmFsdWVzCiAgICBteSAlVGltZTsKCiAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lIEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewoKICAgICAgICAjIHRyYW5zbGF0ZSB0aW1lCiAgICAgICAgJFRpbWV7JFRpbWVUeXBlfSA9ICRTZWxmLT5fVGltZVN0YW1wMkVwb2NoKAogICAgICAgICAgICBUaW1lU3RhbXAgPT4gJFdvcmtPcmRlci0+eyRUaW1lVHlwZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRldGVybWluZSBsZW5ndGggb2Ygd29ya29yZGVyCiAgICBteSAlVGlja1ZhbHVlOwoKICAgIGZvciBteSAkVGltZVR5cGUgKHF3KCBQbGFubmVkIEFjdHVhbCApKSB7CgogICAgICAgICMgZ2V0IHZhbHVlcyBmb3IgcGFkZGluZyBzcGFuCiAgICAgICAgbXkgJFN0YXJ0UGFkZGluZyA9IHNwcmludGYoCiAgICAgICAgICAgICIlLjFmIiwKICAgICAgICAgICAgKCAkVGltZXsiJHtUaW1lVHlwZX1TdGFydFRpbWUifSAtICRQYXJhbXtTdGFydFRpbWV9ICkgLyAkUGFyYW17VGlja3N9CiAgICAgICAgKTsKICAgICAgICAkU3RhcnRQYWRkaW5nID0gKCAkU3RhcnRQYWRkaW5nIDw9IDAgKSAgID8gMCAgICA6ICRTdGFydFBhZGRpbmc7CiAgICAgICAgJFN0YXJ0UGFkZGluZyA9ICggJFN0YXJ0UGFkZGluZyA+PSAxMDAgKSA/IDk5LjkgOiAkU3RhcnRQYWRkaW5nOwogICAgICAgICRUaWNrVmFsdWV7IiR7VGltZVR5cGV9UGFkZGluZyJ9ID0gJFN0YXJ0UGFkZGluZzsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGZvciB0cmFpbGluZyBzcGFuCiAgICAgICAgbXkgJEVuZFRyYWlsaW5nCiAgICAgICAgICAgID0gc3ByaW50ZiggIiUuMWYiLCAoICRQYXJhbXtFbmRUaW1lfSAtICRUaW1leyIke1RpbWVUeXBlfUVuZFRpbWUifSApIC8gJFBhcmFte1RpY2tzfSApOwogICAgICAgICRFbmRUcmFpbGluZyA9ICggJEVuZFRyYWlsaW5nIDw9IDAgKSAgID8gMCAgICA6ICRFbmRUcmFpbGluZzsKICAgICAgICAkRW5kVHJhaWxpbmcgPSAoICRFbmRUcmFpbGluZyA+PSAxMDAgKSA/IDk5LjkgOiAkRW5kVHJhaWxpbmc7CiAgICAgICAgJFRpY2tWYWx1ZXsiJHtUaW1lVHlwZX1UcmFpbGluZyJ9ID0gJEVuZFRyYWlsaW5nOwoKICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIGRpc3BsYXkgc3BhbgogICAgICAgIG15ICRUaW1lVGlja3MKICAgICAgICAgICAgPSAxMDAgLSAoICRUaWNrVmFsdWV7IiR7VGltZVR5cGV9UGFkZGluZyJ9ICsgJFRpY2tWYWx1ZXsiJHtUaW1lVHlwZX1UcmFpbGluZyJ9ICk7CiAgICAgICAgJFRpbWVUaWNrcyA9ICggJFRpbWVUaWNrcyA8PSAwICkgICA/IDAuMSAgOiAkVGltZVRpY2tzOwogICAgICAgICRUaW1lVGlja3MgPSAoICRUaW1lVGlja3MgPj0gMTAwICkgPyA5OS45IDogJFRpbWVUaWNrczsKICAgICAgICAkVGlja1ZhbHVleyIke1RpbWVUeXBlfVRpY2tzIn0gPSBzcHJpbnRmKCAiJS4xZiIsICRUaW1lVGlja3MgKTsKICAgIH0KCiAgICAjIHNldCB3b3Jrb3JkZXIgYXMgaW5hY3RpdmUgaWYgaXQgaXMgbm90IHN0YXJ0ZWQgamV0CiAgICBpZiAoICEkV29ya09yZGVySW5mb3JtYXRpb257QWN0dWFsU3RhcnRUaW1lfSApIHsKICAgICAgICAkV29ya09yZGVySW5mb3JtYXRpb257V29ya09yZGVyT3BhY2l0eX0gPSAnV29ya29yZGVySW5hY3RpdmUnOwogICAgfQoKICAgICMgc2V0IHdvcmtvcmRlciBhZ2VudAogICAgaWYgKCAkV29ya09yZGVySW5mb3JtYXRpb257V29ya09yZGVyQWdlbnRJRH0gKSB7CiAgICAgICAgbXkgJVdvcmtPcmRlckFnZW50RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlckluZm9ybWF0aW9ue1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJVdvcmtPcmRlckFnZW50RGF0YSkgewoKICAgICAgICAgICAgIyBnZXQgV29ya09yZGVyQWdlbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZ1bGxuYW1lKSkgewogICAgICAgICAgICAgICAgJFdvcmtPcmRlckluZm9ybWF0aW9ueyJXb3JrT3JkZXJBZ2VudCRQb3N0Zml4In0gPSAkV29ya09yZGVyQWdlbnREYXRheyRQb3N0Zml4fQogICAgICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSBncmFwaCBkaXJlY3Rpb24gKExUUjogbGVmdCwgUlRMOiByaWdodCkKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRXb3JrT3JkZXJJbmZvcm1hdGlvbnsiR3JhcGhEaXJlY3Rpb24ifSA9ICdyaWdodCc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV29ya09yZGVySW5mb3JtYXRpb257IkdyYXBoRGlyZWN0aW9uIn0gPSAnbGVmdCc7CiAgICB9CgogICAgIyBjcmVhdGUgZ3JhcGggb2Ygd29ya29yZGVyIGl0ZW0KICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJdGVtR3JhcGgnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlV29ya09yZGVySW5mb3JtYXRpb24sCiAgICAgICAgICAgICVUaWNrVmFsdWUsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHRvb2x0aXAKICAgIG15ICVUb29sdGlwQXR0cmlidXRlcyA9ICV7ICRDaGFuZ2Vab29tQ29uZmlnLT57J1Rvb2x0aXA6OldvcmtPcmRlckF0dHJpYnV0ZXMnfSB9OwogICAgbXkgQFNob3dBdHRyaWJ1dGVzID0gZ3JlcCB7ICRUb29sdGlwQXR0cmlidXRlc3skX30gfSBrZXlzICVUb29sdGlwQXR0cmlidXRlczsKCiAgICAjIGJ1aWxkIGF0dHJpYnV0IGJsb2NrcwogICAgaWYgKEBTaG93QXR0cmlidXRlcykgewoKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IEBTaG93QXR0cmlidXRlcyApIHsKCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3Igd29ya29yZGVyIGFnZW50CiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnV29ya09yZGVyQWdlbnQnICkgewoKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJBZ2VudEJsb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckluZm9ybWF0aW9uLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGhlIGxhc3QgdGhpbmc6IFVzZXJMb2dpbgogICAgICAgICAgICAgICAgaWYgKCAkV29ya09yZGVySW5mb3JtYXRpb257V29ya09yZGVyQWdlbnRVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyQWdlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVXb3JrT3JkZXJJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdFbXB0eVdvcmtPcmRlckFnZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVySW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSA9fiBteyBcQSBEeW5hbWljRmllbGRfICguKykgfXhtcyApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwoKICAgICAgICAgICAgICAgICMgb25seSBpZiB0aGUgd29ya29yZGVyIGR5bmFtaWMgZmllbGQgY29udGFpbnMgc29tZXRoaW5nCiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFdvcmtPcmRlckluZm9ybWF0aW9ueyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9OwoKICAgICAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFBhcmFte0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJER5bmFtaWNGaWVsZENvbmZpZzsKCiAgICAgICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRQYXJhbXtCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFdvcmtPcmRlckluZm9ybWF0aW9ueyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZSB9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWxsIG90aGVyIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQXR0cmlidXRlLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVySW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfSVRTTUNoYW5nZUdldFRpbWVMaW5lKCkKCmEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIEM8d29ya29yZGVyPiBncmFwaCBvZiBhIGNoYW5nZQoKPWN1dAoKc3ViIF9JVFNNQ2hhbmdlR2V0VGltZUxpbmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBzdGFydCB0aW1lCiAgICByZXR1cm4gaWYgISRQYXJhbXtTdGFydFRpbWV9OwoKICAgICMgY2hlY2sgZm9yIHN0YXJ0IHRpbWUgaXMgYW4gaW50ZWdlciB2YWx1ZQogICAgcmV0dXJuIGlmICRQYXJhbXtTdGFydFRpbWV9ICF+IG17IFxBIFxkKyBceiB9eG1zOwoKICAgICMgY2hlY2sgZm9yIGVuZCB0aW1lCiAgICByZXR1cm4gaWYgISRQYXJhbXtFbmRUaW1lfTsKCiAgICAjIGNoZWNrIGZvciBlbmQgdGltZSBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgICByZXR1cm4gaWYgJFBhcmFte0VuZFRpbWV9ICF+IG17IFxBIFxkKyBceiB9eG1zOwoKICAgICMgY2hlY2sgZm9yIHRpY2tzCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrc307CgogICAgIyBjaGVjayBmb3IgdGlja3MgaXMgYW4gaW50ZWdlciB2YWx1ZQogICAgcmV0dXJuIGlmICRQYXJhbXtUaWNrc30gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgbXkgJEN1cnJlbnRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKTsKCiAgICAjIGNoZWNrIGZvciBzeXN0ZW0gdGltZQogICAgcmV0dXJuIGlmICEkQ3VycmVudFRpbWU7CgogICAgIyBjaGVjayBpZiBjdXJyZW50IHRpbWUgaXMgaW4gY2hhbmdlIHRpbWUgaW50ZXJ2YWwKICAgIHJldHVybiBpZiAkQ3VycmVudFRpbWUgPCAkUGFyYW17U3RhcnRUaW1lfTsKICAgIHJldHVybiBpZiAkQ3VycmVudFRpbWUgPiAkUGFyYW17RW5kVGltZX07CgogICAgIyB0aW1lIGxpbmUgZGF0YQogICAgbXkgJVRpbWVMaW5lOwoKICAgICMgY2FsY3VsYXRlIHBlcmNlbnQgb2YgdGltZWxpbmUKICAgIG15ICRSZWxhdGl2ZUVuZCAgID0gJFBhcmFte0VuZFRpbWV9IC0gJFBhcmFte1N0YXJ0VGltZX07CiAgICBteSAkUmVsYXRpdmVTdGFydCA9ICRDdXJyZW50VGltZSAtICRQYXJhbXtTdGFydFRpbWV9OwoKICAgICMgZ2V0IHRpbWVsaW5lIGluZGVudCB3aXRoIDEgZGlnaXQgYWZ0ZXIgZGVjaW1hbCBwb2ludAogICAgJFRpbWVMaW5le1RpbWVMaW5lTGVmdH0gPSBzcHJpbnRmKCAiJS4xZiIsICggJFJlbGF0aXZlU3RhcnQgLyAkUmVsYXRpdmVFbmQgKSAqIDEwMCApOwoKICAgICMgdmVyaWZ5IHBlcmNlbnQgdmFsdWVzCiAgICBpZiAoICRUaW1lTGluZXtUaW1lTGluZUxlZnR9IDw9IDAgKSB7CiAgICAgICAgJFRpbWVMaW5le1RpbWVMaW5lTGVmdH0gPSAwOwogICAgfQogICAgaWYgKCAkVGltZUxpbmV7VGltZUxpbmVMZWZ0fSA+PSAxMDAgKSB7CiAgICAgICAgJFRpbWVMaW5le1RpbWVMaW5lTGVmdH0gPSA5OS45OwogICAgfQoKICAgIHJldHVybiBcJVRpbWVMaW5lOwp9Cgo9aGVhZDIgX1RpbWVTdGFtcDJFcG9jaCgpCgpDb252ZXJ0IGEgdGltZXN0YW1wIHRvIGEgZXBvY2ggKHVuaXggdGltZSkuCgo9Y3V0CgpzdWIgX1RpbWVTdGFtcDJFcG9jaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtUaW1lU3RhbXB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSBpZiAkRGF0ZVRpbWVPYmplY3Q7CiAgICByZXR1cm47Cn0KCj1oZWFkMiBfRXBvY2gyVGltZVN0YW1wKCkKCkNvbnZlcnQgYSBlcG9jaCAodW5peCB0aW1lKSB0byBhIHRpbWVzdGFtcCAoQzx5eXl5LW1tLWRkIGhoOm1tOnNzPikuCgo9Y3V0CgpzdWIgX0Vwb2NoMlRpbWVTdGFtcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgRXBvY2ggPT4gJFBhcmFte0Vwb2NofSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpIGlmICREYXRlVGltZU9iamVjdDsKICAgIHJldHVybjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQvSVRTTVRlbXBsYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01UZW1wbGF0ZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjpJVFNNVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgUE9TSVggcXcoY2VpbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDIgSVRTTVRlbXBsYXRlTGlzdFNob3coKQoKUmV0dXJucyBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIEM8c29ydGFibGU+IGxpc3Qgd2l0aCBwYWdpbmF0aW9uLgoKVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEw8S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6SVRTTUNoYW5nZTo6SVRNQ2hhbmdlTGlzdFNob3coKT4KaW4gRjxLZXJuZWwvT3V0cHV0L0hUTUwvTGF5b3V0SVRTTUNoYW5nZS5wbT4uCgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPklUU01UZW1wbGF0ZUxpc3RTaG93KAogICAgICAgIFRlbXBsYXRlSURzICA9PiAkVGVtcGxhdGVJRHNSZWYsICAgICAgICAgICAgICAgICAgIyB0b3RhbCBsaXN0IG9mIHRlbXBsYXRlIGlkcywgdGhhdCBjYW4gYmUgbGlzdGVkCiAgICAgICAgVG90YWwgICAgICA9PiBzY2FsYXIgQHsgJFRlbXBsYXRlSURzUmVmIH0sICAgICAgICAjIHRvdGFsIG51bWJlciBvZiBsaXN0IGl0ZW1zLCB0ZW1wbGF0ZXMgaW4gdGhpcyBjYXNlCiAgICAgICAgRmlsdGVyICAgICA9PiAnQWxsJywKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgVGl0bGVOYW1lICA9PiAnT3ZlcnZpZXc6IFRlbXBsYXRlJywKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBFbnYgICAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlICAgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ICAgPT4gJExpbmtTb3J0LAogICAgKTsKCj1jdXQKCnN1YiBJVFNNVGVtcGxhdGVMaXN0U2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGFrZSBvYmplY3QgcmVmIHRvIGxvY2FsLCByZW1vdmUgaXQgZnJvbSAlUGFyYW0gKHByZXZlbnQgbWVtb3J5IGxlYWspCiAgICBteSAkRW52ID0gZGVsZXRlICRQYXJhbXtFbnZ9OwoKICAgICMgZm9yIG5vdyB0aGVyZSBpcyBvbmx5IHRoZSAnU21hbGwnIHZpZXcKICAgIG15ICRWaWV3ID0gJ1NtYWxsJzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IGJhY2tlbmQgZnJvbSBjb25maWcKICAgIG15ICRCYWNrZW5kcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlRlbXBsYXRlT3ZlcnZpZXcnKTsKICAgIGlmICggISRCYWNrZW5kcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnTmVlZCBjb25maWcgb3B0aW9uICVzIScsCiAgICAgICAgICAgICAgICAnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlRlbXBsYXRlT3ZlcnZpZXcnLAogICAgICAgICAgICApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBoYXNoLXJlZgogICAgaWYgKCByZWYgJEJhY2tlbmRzIG5lICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ29uZmlnIG9wdGlvbiAlcyBuZWVkcyB0byBiZSBhIEhBU0ggcmVmIScsCiAgICAgICAgICAgICAgICAnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlRlbXBsYXRlT3ZlcnZpZXcnLAogICAgICAgICAgICApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjb25maWcga2V5CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnTm8gY29uZmlnIG9wdGlvbiBmb3VuZCBmb3IgdGhlIHZpZXcgIiVzIiEnLCAkVmlldyApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5hdiBiYXIKICAgIG15ICRTdGFydEhpdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxOwoKICAgICMgY2hlY2sgc3RhcnQgb3B0aW9uLCBpZiBoaWdoZXIgdGhlbiBlbGVtZW50cyBhdmFpbGFibGUsIHNldAogICAgIyBpdCB0byB0aGUgbGFzdCBvdmVydmlldyBwYWdlIChUaGFua3MgdG8gU3RlZmFuIFNjaG1pZHQhKQogICAgbXkgJFBhZ2VTaG93biA9ICRCYWNrZW5kcy0+eyRWaWV3fS0+e1BhZ2VTaG93bn07CiAgICBpZiAoICRTdGFydEhpdCA+ICRQYXJhbXtUb3RhbH0gKSB7CiAgICAgICAgbXkgJFBhZ2VzID0gaW50KCAoICRQYXJhbXtUb3RhbH0gLyAkUGFnZVNob3duICkgKyAwLjk5OTk5ICk7CiAgICAgICAgJFN0YXJ0SGl0ID0gKCAoICRQYWdlcyAtIDEgKSAqICRQYWdlU2hvd24gKSArIDE7CiAgICB9CgogICAgIyBzZXQgcGFnZSBsaW1pdCBhbmQgYnVpbGQgcGFnZSBuYXYKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gfHwgMjBfMDAwOwogICAgbXkgJVBhZ2VOYXYgPSAkTGF5b3V0T2JqZWN0LT5QYWdlTmF2QmFyKAogICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICBBbGxIaXRzICAgPT4gJFBhcmFte1RvdGFsfSB8fCAwLAogICAgICAgIEFjdGlvbiAgICA9PiAnQWN0aW9uPScgLiAkTGF5b3V0T2JqZWN0LT57QWN0aW9ufSwKICAgICAgICBMaW5rICAgICAgPT4gJFBhcmFte0xpbmtQYWdlfSwKICAgICk7CgogICAgIyBidWlsZCBuYXZiYXIgY29udGVudAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBiYWNrIGxpbmsKICAgIGlmICggJFBhcmFte0xpbmtCYWNrfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGZpbHRlcnMKICAgIGlmICggJFBhcmFte0ZpbHRlcnN9ICkgewoKICAgICAgICAjIGdldCBnaXZlbiBmaWx0ZXJzCiAgICAgICAgbXkgQE5hdkJhckZpbHRlcnM7CiAgICAgICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICV7ICRQYXJhbXtGaWx0ZXJzfSB9ICkgewogICAgICAgICAgICBwdXNoIEBOYXZCYXJGaWx0ZXJzLCAkUGFyYW17RmlsdGVyc30tPnskUHJpb307CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIGZpbHRlciBjb250ZW50CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIG92ZXIgZmlsdGVycwogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBOYXZCYXJGaWx0ZXJzKSB7CgogICAgICAgICAgICAjIGluY3JlbWVudCBmaWx0ZXIgY291bnQgYW5kIGJ1aWxkIGZpbHRlciBpdGVtCiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbHRlciBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb3Agb3ZlciBjb25maWd1cmVkIGJhY2tlbmRzLCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSBiYWNrZW5kCiAgICBmb3IgbXkgJEJhY2tlbmQgKCBzb3J0IGtleXMgJXskQmFja2VuZHN9ICkgewoKICAgICAgICAjIGJ1aWxkIG5hdmJhciB2aWV3IG1vZGUKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjdXJyZW50IHZpZXcgaXMgY29uZmlndXJlZCBpbiBiYWNrZW5kCiAgICAgICAgaWYgKCAkVmlldyBlcSAkQmFja2VuZCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7ICRCYWNrZW5kcy0+eyRCYWNrZW5kfSB9LAogICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHBhZ2UgbmF2IGlzIGF2YWlsYWJsZQogICAgaWYgKCVQYWdlTmF2KSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYWdlTmF2LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBuYXYgYmFyIGlzIGF2YWlsYWJsZQogICAgaWYgKCAkUGFyYW17TmF2QmFyfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtOYXZCYXJ9LT57TWFpbk5hbWV9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyTWFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtOYXZCYXJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGh0bWwgY29udGVudAogICAgbXkgJE91dHB1dE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0UmF3ID0gJyc7CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5QcmludCgKICAgICAgICAgICAgT3V0cHV0ID0+IFwkT3V0cHV0TmF2QmFyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXROYXZCYXI7CiAgICB9CgogICAgIyBsb2FkIG1vZHVsZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfSApICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgYmFja2VuZCBvYmplY3QKICAgIG15ICRPYmplY3QgPSAkQmFja2VuZHMtPnskVmlld30tPntNb2R1bGV9LT5uZXcoICV7JEVudn0gKTsKICAgIHJldHVybiBpZiAhJE9iamVjdDsKCiAgICAjIHJ1biBtb2R1bGUKICAgIG15ICRPdXRwdXQgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgJVBhcmFtLAogICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICBBbGxIaXRzICAgPT4gJFBhcmFte1RvdGFsfSB8fCAwLAogICAgKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KAogICAgICAgICAgICBPdXRwdXQgPT4gXCRPdXRwdXQsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dDsKICAgIH0KCiAgICAjIGNyZWF0ZSBvdmVydmlldyBuYXYgYmFyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyByZXR1cm4gY29udGVudCBpZiBhdmFpbGFibGUKICAgIHJldHVybiAkT3V0cHV0UmF3Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0L0lUU01DaGFuZ2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTUNoYW5nZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoY2hhbmdlKQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJMYW5ndWFnZSBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBXZSBuZWVkIG91ciBvd24gTGF5b3V0T2JqZWN0IGluc3RhbmNlIHRvIGF2b2lkIGJsb2NrZGF0YSBjb2xsaXNpb25zCiAgICAjICAgd2l0aCB0aGUgbWFpbiBwYWdlLgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgUmVhbG5hbWUgICA9PiAnQ2hhbmdlJywKICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICB9OwoKICAgICMgZ2V0IGNvbmZpZwogICAgJFNlbGYtPntDaGFuZ2VIb29rfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6SG9vaycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRhYmxlQ3JlYXRlQ29tcGxleCgpCgpyZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgYmxvY2sgZGF0YQoKUmV0dXJuCgogICAgQEJsb2NrRGF0YSA9ICgKCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ0NoYW5nZUlEJywKICAgICAgICBPYmplY3RJRCAgICA9PiAnMTIzJywKCiAgICAgICAgT2JqZWN0ICAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBCbG9ja25hbWUgPT4gJ0NoYW5nZScsCiAgICAgICAgSGVhZGxpbmUgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZSMnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZSBUaXRsZScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlIFN0YXRlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ0NoYW5nZVN0YXRlU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ2dyYXlsZWQnLAogICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA5MTAwMTEyMzQ1Nzc4JywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0xMjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMS0wMSAxMjoxMjowMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ0NoYW5nZVN0YXRlU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICA9PiA0NTYsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAnY2xvc2VkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOTEwMDExMjM0NTc3NCcsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9NDU2JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0NoYW5nZSBUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnY2xvc2VkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgKTsKCiAgICBAQmxvY2tEYXRhID0gJExpbmtPYmplY3QtPlRhYmxlQ3JlYXRlQ29tcGxleCgKICAgICAgICBPYmplY3RMaW5rTGlzdFdpdGhEYXRhID0+ICRPYmplY3RMaW5rTGlzdFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgVGFibGVDcmVhdGVDb21wbGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY29udmVydCB0aGUgbGlzdAogICAgbXkgJUxpbmtMaXN0OwogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBmb3IgbXkgJENoYW5nZUlEICggc29ydCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRMaW5rTGlzdHskQ2hhbmdlSUR9LT57RGF0YX0gPSAkRGlyZWN0aW9uTGlzdC0+eyRDaGFuZ2VJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJENvbXBsZXhUYWJsZURhdGEgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSIpOwogICAgbXkgJERlZmF1bHRDb2x1bW5zOwogICAgaWYgKAogICAgICAgICRDb21wbGV4VGFibGVEYXRhCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJENvbXBsZXhUYWJsZURhdGEpCiAgICAgICAgJiYgJENvbXBsZXhUYWJsZURhdGEtPntJVFNNQ2hhbmdlfQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ29tcGxleFRhYmxlRGF0YS0+e0lUU01DaGFuZ2V9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJERlZmF1bHRDb2x1bW5zID0gJENvbXBsZXhUYWJsZURhdGEtPnsiSVRTTUNoYW5nZSJ9LT57IkRlZmF1bHRDb2x1bW5zIn07CiAgICB9CgogICAgbXkgQFRpbWVMb25nVHlwZXMgPSAoCiAgICAgICAgJ0NyZWF0ZVRpbWUnLAogICAgICAgICdDaGFuZ2VUaW1lJywKICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJywKICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJywKICAgICAgICAnQWN0dWFsRW5kVGltZScsCiAgICAgICAgJ1JlcXVlc3RlZFRpbWUnLAogICAgKTsKCiAgICBteSBAVHJhbnNsYXRlVHlwZXMgPSAoCiAgICAgICAgJ0NhdGVnb3J5JywKICAgICAgICAnSW1wYWN0JywKICAgICAgICAnUHJpb3JpdHknLAogICAgKTsKCiAgICAjIGFsd2F5cyBzaG93IHRoZSBjaGFuZ2Ugc3RhdGUgZmxhZyBhbmQgdGhlIGNoYW5nZSBudW1iZXIKICAgIG15IEBIZWFkbGluZSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ29udGVudCA9PiAkU2VsZi0+e0NoYW5nZUhvb2t9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIExvYWQgdXNlciBwcmVmZXJlbmNlcy4KICAgIG15ICVQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRGVmYXVsdENvbHVtbnMgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCREZWZhdWx0Q29sdW1ucykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNaXNzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIExpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSMjI0lUU01DaGFuZ2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCBkZWZhdWx0IGNvbHVtbiBwcmlvcml0eSBmcm9tIFN5c0NvbmZpZy4KICAgICMgRWFjaCBjb2x1bW4gaW4gdGFibGUgKFRpdGxlLCBTdGF0ZSwuLi4pIGhhcyBkZWZpbmVkIFByaW9yaXR5IGluIFN5c0NvbmZpZy4gU3lzdGVtIHVzZSB0aGlzCiAgICAjICAgcHJpb3JpdHkgdG8gc29ydCBjb2x1bW5zLCBpZiB1c2VyIGRvZXNuJ3QgaGF2ZSBvd24gc2V0dGluZ3MuCiAgICBteSAlU29ydE9yZGVyOwogICAgaWYgKAogICAgICAgICRDb21wbGV4VGFibGVEYXRhLT57IklUU01DaGFuZ2UifS0+eyJQcmlvcml0eSJ9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDb21wbGV4VGFibGVEYXRhLT57IklUU01DaGFuZ2UifS0+eyJQcmlvcml0eSJ9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJVNvcnRPcmRlciA9ICV7ICRDb21wbGV4VGFibGVEYXRhLT57IklUU01DaGFuZ2UifS0+eyJQcmlvcml0eSJ9IH07CiAgICB9CgogICAgbXkgJVVzZXJDb2x1bW5zID0gJXskRGVmYXVsdENvbHVtbnN9OwoKICAgIGlmICggJFByZWZlcmVuY2VzeydMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUtSVRTTUNoYW5nZSd9ICkgewoKICAgICAgICBteSAkQ29sdW1uc0VuYWJsZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFByZWZlcmVuY2VzeydMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUtSVRTTUNoYW5nZSd9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbHVtbnNFbmFibGVkCiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCRDb2x1bW5zRW5hYmxlZCkKICAgICAgICAgICAgJiYgJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9CiAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBDbGVhciBzb3J0IG9yZGVyLgogICAgICAgICAgICAlU29ydE9yZGVyID0gKCk7CgogICAgICAgICAgICBERUZBVUxUQ09MVU1OOgogICAgICAgICAgICBmb3IgbXkgJERlZmF1bHRDb2x1bW4gKCBzb3J0IGtleXMgJVVzZXJDb2x1bW5zICkgewogICAgICAgICAgICAgICAgbXkgJEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJTZXR0aW5nICggQHsgJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGVmYXVsdENvbHVtbiBlcSAkVXNlclNldHRpbmcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSAgID0gJEluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBERUZBVUxUQ09MVU1OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIE5vdCBmb3VuZCwgbWVhbnMgdXNlciBjaG9zZSB0byBoaWRlIHRoaXMgaXRlbS4KICAgICAgICAgICAgICAgIGlmICggJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ICkgewogICAgICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ID0gMDsgICAgIyBTZXQgMCwgaXQgc3lzdGVtIHdpbGwgaGlkZSB0aGlzIGl0ZW0gYW55d2F5cwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgVXNlciBoYXMgbm8gb3duIHNldHRpbmdzLgogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCBrZXlzICVVc2VyQ29sdW1ucyApIHsKICAgICAgICAgICAgaWYgKCAhJFNvcnRPcmRlcnskQ29sdW1ufSApIHsKICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JENvbHVtbn0gPSAwOyAgICAgICAgICAgICAgICMgU2V0IDAsIGl0IHN5c3RlbSB3aWxsIGhpZGUgdGhpcyBpdGVtIGFueXdheXMKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIERlZmluZSBIZWFkbGluZSBjb2x1bW5zLgogICAgbXkgQEFsbENvbHVtbnM7CiAgICBDT0xVTU46CiAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQgeyAkU29ydE9yZGVyeyRhfSA8PT4gJFNvcnRPcmRlcnskYn0gfSBrZXlzICVVc2VyQ29sdW1ucyApIHsKCiAgICAgICAgbXkgJENvbHVtblRyYW5zbGF0ZSA9ICRDb2x1bW47CiAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdDcmVhdGVUaW1lJyApIHsKICAgICAgICAgICAgJENvbHVtblRyYW5zbGF0ZSA9IFRyYW5zbGF0YWJsZSgnQ3JlYXRlZCcpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NoYW5nZVRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdDaGFuZ2VkJyk7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBBbGxDb2x1bW5zLCB7CiAgICAgICAgICAgIENvbHVtbk5hbWUgICAgICA9PiAkQ29sdW1uLAogICAgICAgICAgICBDb2x1bW5UcmFuc2xhdGUgPT4gJENvbHVtblRyYW5zbGF0ZSwKICAgICAgICB9OwoKICAgICAgICAjIGlmIGVuYWJsZWQgYnkgZGVmYXVsdC4KICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewogICAgICAgICAgICBwdXNoIEBIZWFkbGluZSwgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uVHJhbnNsYXRlLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0LCBzb3J0IGJ5IENoYW5nZUlEIERvd24KICAgIG15IEBJdGVtTGlzdDsKICAgIGZvciBteSAkQ2hhbmdlSUQgKAogICAgICAgIHNvcnQgewogICAgICAgICAgICAkTGlua0xpc3R7JGJ9e0RhdGF9LT57Q2hhbmdlSUR9IDw9PiAkTGlua0xpc3R7JGF9e0RhdGF9LT57Q2hhbmdlSUR9CiAgICAgICAgfSBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBleHRyYWN0IGNoYW5nZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZSA9ICRMaW5rTGlzdHskQ2hhbmdlSUR9LT57RGF0YX07CgogICAgICAgIG15IEBJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ0NoYW5nZVN0YXRlU2lnbmFsJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZVNpZ25hbH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlLT57Q2hhbmdlU3RhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICBMaW5rICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPScKICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICJDaGFuZ2UjICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9OiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9IiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBDT0xVTU46CiAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IHsgJFNvcnRPcmRlcnskYX0gPD0+ICRTb3J0T3JkZXJ7JGJ9IH0ga2V5cyAlVXNlckNvbHVtbnMgKSB7CgogICAgICAgICAgICAjIGlmIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skQ29sdW1ufSA9PSAyICkgewoKICAgICAgICAgICAgICAgIG15ICVIYXNoOwogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJENvbHVtbiB9IEBUaW1lTG9uZ1R5cGVzICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGltZUxvbmcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J1R5cGUnfSA9ICdUZXh0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkQ29sdW1uIH0gQFRyYW5zbGF0ZVR5cGVzICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUcmFuc2xhdGUnfSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRDaGFuZ2UtPnskQ29sdW1ufTsKCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtQ29sdW1ucywgXCVIYXNoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXEBJdGVtQ29sdW1uczsKICAgIH0KCiAgICByZXR1cm4gaWYgIUBJdGVtTGlzdDsKCiAgICAjIERlZmluZSB0aGUgYmxvY2sgZGF0YS4KICAgIG15ICVCbG9jayA9ICgKICAgICAgICBPYmplY3QgICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgIEJsb2NrbmFtZSAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgT2JqZWN0TmFtZSA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0TmFtZX0sCiAgICAgICAgT2JqZWN0SUQgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIEhlYWRsaW5lICAgPT4gXEBIZWFkbGluZSwKICAgICAgICBJdGVtTGlzdCAgID0+IFxASXRlbUxpc3QsCiAgICAgICAgQWxsQ29sdW1ucyA9PiBcQEFsbENvbHVtbnMsCiAgICApOwoKICAgIHJldHVybiAoIFwlQmxvY2sgKTsKCn0KCj1oZWFkMiBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01DaGFuZ2UgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NIOjIwMDkxMDAxMTIzNTQzMjEtMScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ2hhbmdlIyAyMDA5MTAxNjEwMDA1NDAyOiBUaGUgQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBDc3MgICAgID0+ICdzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2giJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0g6MjAwOTEwMDExMjM1NDMyMS02JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDaGFuZ2UjIDIwMDkxMDE2MTAwMDc2MzQ6IFRoZSBDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNQ2hhbmdlID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSDoyMDA5MTAwMTEyMzU0MzIxLTMnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NoYW5nZSMgMjAwOTEwMTYxMDAwNDQzMzE6IFRoZSBDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdCwgc29ydCBieSBDaGFuZ2VJRCBEb3duCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uTGlzdC0+eyRifS0+e0NoYW5nZUlEfSA8PT4gJERpcmVjdGlvbkxpc3QtPnskYX0tPntDaGFuZ2VJRH0KICAgICAgICAgICAgICAgIH0ga2V5cyAleyREaXJlY3Rpb25MaXN0fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlID0gJERpcmVjdGlvbkxpc3QtPnskQ2hhbmdlSUR9OwoKICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJUl0ZW0gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0g6JyAuICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e0NoYW5nZUhvb2t9ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9OiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9IiwKICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFwlSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaXRlbSBsaXN0IHRvIGxpbmsgb3V0cHV0IGRhdGEKICAgICAgICAgICAgJExpbmtPdXRwdXREYXRheyAkTGlua1R5cGUgLiAnOjonIC4gJERpcmVjdGlvbiB9LT57SVRTTUNoYW5nZX0gPSBcQEl0ZW1MaXN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUxpbmtPdXRwdXREYXRhOwp9Cgo9aGVhZDIgQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29udGVudERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4dHJhY3QgY29udGVudAogICAgbXkgJENvbnRlbnQgPSAkUGFyYW17Q29udGVudERhdGF9OwoKICAgIHJldHVybiBpZiAkQ29udGVudC0+e1R5cGV9IG5lICdDaGFuZ2VTdGF0ZVNpZ25hbCc7CgogICAgIyBidWlsZCBodG1sIGZvciBzaWduYWwgTEVECiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJzxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkNoYW5nZVN0YXRlIHwgaHRtbCAlXSI+ICcKICAgICAgICAgICAgLiAnPHNwYW4gY2xhc3M9IlslIERhdGEuQ2hhbmdlU3RhdGVTaWduYWwgfCBodG1sICVdIj48L3NwYW4+IDwvZGl2PicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlU2lnbmFsID0+ICRDb250ZW50LT57Q29udGVudH0sCiAgICAgICAgICAgIENoYW5nZVN0YXRlICAgICAgID0+ICRDb250ZW50LT57Q2hhbmdlU3RhdGV9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aGVhZDIgU2VsZWN0YWJsZU9iamVjdExpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBDPHNlbGVjdGFibGU+IG9iamVjdHMKClJldHVybgoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NoYW5nZScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gJExpbmtPYmplY3QtPlNlbGVjdGFibGVPYmplY3RMaXN0KAogICAgICAgIFNlbGVjdGVkID0+ICRJZGVudGlmaWVyLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlbGVjdGFibGVPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdGVkOwogICAgaWYgKCAkUGFyYW17U2VsZWN0ZWR9ICYmICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgIH0KCiAgICAjIG9iamVjdCBzZWxlY3QgbGlzdAogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCgogICAgICAgICAgICAjIGFsc28gdXNlIHRoZSBvYmplY3QgaGVyZSBhbmQgbm90IHRoZSByZWFsIG5hbWUsIGZvciB0cmFuc2xhdGlvbiBpc3N1ZXMKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCgogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aGVhZDIgU2VhcmNoT3B0aW9uTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlYXJjaCBvcHRpb25zCgpSZXR1cm4KCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ2hhbmdlTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDaGFuZ2UjJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ01haWxTZXJ2ZXIgbmVlZHMgdXBkYXRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnV29ya29yZGVyIFRpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ1NodXRkb3duIG9sZCBtYWlsIHNlcnZlcicsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAkTGlua09iamVjdC0+U2VhcmNoT3B0aW9uTGlzdCgpOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNlYXJjaCBvcHRpb24gbGlzdAogICAgbXkgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57Q2hhbmdlSG9va30sCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb3Jta2V5CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKICAgICAgICAkUm93LT57Rm9ybUtleX0gPSAnU0VBUkNIOjonIC4gJFJvdy0+e0tleX07CiAgICB9CgogICAgIyBhZGQgZm9ybSBkYXRhIGFuZCBpbnB1dCBzdHJpbmcKICAgIFJPVzoKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewoKICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICAgICAgUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICk7CgogICAgICAgICMgcGFyc2UgdGhlIGlucHV0IHRleHQgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbnB1dFRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTGlua09iamVjdCcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBST1c7CiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hPcHRpb25MaXN0Owp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0L0lUU01Xb3JrT3JkZXIucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlci5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTVdvcmtPcmRlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTVdvcmtPcmRlciAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoQzx3b3Jrb3JkZXI+KQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6SVRTTVdvcmtPcmRlci0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAnZW4nLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJMYW5ndWFnZSBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskTmVlZGVkfSA9ICRQYXJhbXskTmVlZGVkfSB8fCBkaWUgIkdvdCBubyAkTmVlZGVkISI7CiAgICB9CgogICAgIyBXZSBuZWVkIG91ciBvd24gTGF5b3V0T2JqZWN0IGluc3RhbmNlIHRvIGF2b2lkIGJsb2NrZGF0YSBjb2xsaXNpb25zCiAgICAjICAgd2l0aCB0aGUgbWFpbiBwYWdlLgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgUmVhbG5hbWUgICA9PiAnV29ya29yZGVyJywKICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICB9OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZwogICAgJFNlbGYtPntDaGFuZ2VIb29rfSAgICA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6SG9vaycpOwogICAgJFNlbGYtPntXb3JrT3JkZXJIb29rfSA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVdvcmtPcmRlcjo6SG9vaycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRhYmxlQ3JlYXRlQ29tcGxleCgpCgpyZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgYmxvY2sgZGF0YQoKUmV0dXJuCgogICAgQEJsb2NrRGF0YSA9ICgKICAgICAgICBPYmplY3QgICAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIEJsb2NrbmFtZSA9PiAnV29ya09yZGVyJywKICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV29ya29yZGVyIycsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV29ya29yZGVyIFRpdGxlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1dvcmtvcmRlciBTdGF0ZScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDE1MCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIEl0ZW1MaXN0ID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdXb3JrT3JkZXJTdGF0ZVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdyZWFkeScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDkxMDAxMTIzNDU3NzgtMycsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdXb3Jrb3JkZXIgVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0NoYW5nZSBUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdyZWFkeScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA5LTAxLTAxIDEyOjEyOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnV29ya09yZGVyU3RhdGVTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgID0+IDQsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2NhbmNlbGQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA5MTAwMTEyMzQ1Nzc4LTQnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPTQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnV29ya29yZGVyIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnYWNjZXB0ZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOS0wMi0wMiAxMzoxMzowMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRXb3JrT3JkZXJJRH0tPntEYXRhfSA9ICREaXJlY3Rpb25MaXN0LT57JFdvcmtPcmRlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ29tcGxleFRhYmxlRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCgiTGlua09iamVjdDo6Q29tcGxleFRhYmxlIik7CiAgICBteSAkRGVmYXVsdENvbHVtbnM7CiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29tcGxleFRhYmxlRGF0YSkKICAgICAgICAmJiAkQ29tcGxleFRhYmxlRGF0YS0+e0lUU01Xb3JrT3JkZXJ9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDb21wbGV4VGFibGVEYXRhLT57SVRTTVdvcmtPcmRlcn0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkRGVmYXVsdENvbHVtbnMgPSAkQ29tcGxleFRhYmxlRGF0YS0+eyJJVFNNV29ya09yZGVyIn0tPnsiRGVmYXVsdENvbHVtbnMifTsKICAgIH0KCiAgICBteSBAVGltZUxvbmdUeXBlcyA9ICgKICAgICAgICAnQ3JlYXRlVGltZScsCiAgICAgICAgJ0NoYW5nZVRpbWUnLAogICAgICAgICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAnUGxhbm5lZEVuZFRpbWUnLAogICAgICAgICdBY3R1YWxTdGFydFRpbWUnLAogICAgICAgICdBY3R1YWxFbmRUaW1lJywKICAgICk7CgogICAgbXkgQFRyYW5zbGF0ZVR5cGVzID0gKCk7CgogICAgIyBhbHdheXMgc2hvdyB0aGUgY2hhbmdlIHN0YXRlIGZsYWcgYW5kIHRoZSBjaGFuZ2UgbnVtYmVyCiAgICBteSBASGVhZGxpbmUgPSAoCiAgICAgICAgewogICAgICAgICAgICBDb250ZW50ID0+ICdXb3JrT3JkZXJTdGF0ZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIENvbnRlbnQgPT4gJFNlbGYtPntXb3JrT3JkZXJIb29rfSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBMb2FkIHVzZXIgcHJlZmVyZW5jZXMuCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJERlZmF1bHRDb2x1bW5zIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkRGVmYXVsdENvbHVtbnMpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWlzc2luZyBjb25maWd1cmF0aW9uIGZvciBMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUjIyNJVFNNV29ya09yZGVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBHZXQgZGVmYXVsdCBjb2x1bW4gcHJpb3JpdHkgZnJvbSBTeXNDb25maWcuCiAgICAjIEVhY2ggY29sdW1uIGluIHRhYmxlIChUaXRsZSwgU3RhdGUsLi4uKSBoYXMgZGVmaW5lZCBQcmlvcml0eSBpbiBTeXNDb25maWcuIFN5c3RlbSB1c2UgdGhpcwogICAgIyAgIHByaW9yaXR5IHRvIHNvcnQgY29sdW1ucywgaWYgdXNlciBkb2Vzbid0IGhhdmUgb3duIHNldHRpbmdzLgogICAgbXkgJVNvcnRPcmRlcjsKICAgIGlmICgKICAgICAgICAkQ29tcGxleFRhYmxlRGF0YS0+eyJJVFNNV29ya09yZGVyIn0tPnsiUHJpb3JpdHkifQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ29tcGxleFRhYmxlRGF0YS0+eyJJVFNNV29ya09yZGVyIn0tPnsiUHJpb3JpdHkifSApCiAgICAgICAgKQogICAgewogICAgICAgICVTb3J0T3JkZXIgPSAleyAkQ29tcGxleFRhYmxlRGF0YS0+eyJJVFNNV29ya09yZGVyIn0tPnsiUHJpb3JpdHkifSB9OwogICAgfQoKICAgIG15ICVVc2VyQ29sdW1ucyA9ICV7JERlZmF1bHRDb2x1bW5zfTsKCiAgICBpZiAoICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUlUU01Xb3JrT3JkZXInfSApIHsKCiAgICAgICAgbXkgJENvbHVtbnNFbmFibGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICBEYXRhID0+ICRQcmVmZXJlbmNlc3snTGlua09iamVjdDo6Q29tcGxleFRhYmxlLUlUU01Xb3JrT3JkZXInfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb2x1bW5zRW5hYmxlZAogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29sdW1uc0VuYWJsZWQpCiAgICAgICAgICAgICYmICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfQogICAgICAgICAgICAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgQ2xlYXIgc29ydCBvcmRlci4KICAgICAgICAgICAgJVNvcnRPcmRlciA9ICgpOwoKICAgICAgICAgICAgREVGQVVMVENPTFVNTjoKICAgICAgICAgICAgZm9yIG15ICREZWZhdWx0Q29sdW1uICggc29ydCBrZXlzICVVc2VyQ29sdW1ucyApIHsKICAgICAgICAgICAgICAgIG15ICRJbmRleCA9IDA7CgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyU2V0dGluZyAoIEB7ICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDb2x1bW4gZXEgJFVzZXJTZXR0aW5nICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gICA9ICRJbmRleDsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgREVGQVVMVENPTFVNTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBOb3QgZm91bmQsIG1lYW5zIHVzZXIgY2hvc2UgdG8gaGlkZSB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSApIHsKICAgICAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSA9IDA7ICAgICMgU2V0IDAsIGl0IHN5c3RlbSB3aWxsIGhpZGUgdGhpcyBpdGVtIGFueXdheXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFVzZXIgaGFzIG5vIG93biBzZXR0aW5ncy4KICAgICAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQga2V5cyAlVXNlckNvbHVtbnMgKSB7CiAgICAgICAgICAgIGlmICggISRTb3J0T3JkZXJ7JENvbHVtbn0gKSB7CiAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyRDb2x1bW59ID0gMDsgICAgICAgICAgICAgICAjIFNldCAwLCBpdCBzeXN0ZW0gd2lsbCBoaWRlIHRoaXMgaXRlbSBhbnl3YXlzCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBEZWZpbmUgSGVhZGxpbmUgY29sdW1ucy4KICAgIG15IEBBbGxDb2x1bW5zOwogICAgQ09MVU1OOgogICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IHsgJFNvcnRPcmRlcnskYX0gPD0+ICRTb3J0T3JkZXJ7JGJ9IH0ga2V5cyAlVXNlckNvbHVtbnMgKSB7CgogICAgICAgIG15ICRDb2x1bW5UcmFuc2xhdGUgPSAkQ29sdW1uOwogICAgICAgIGlmICggJENvbHVtbiBlcSAnQ3JlYXRlVGltZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ0NyZWF0ZWQnKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDaGFuZ2VUaW1lJyApIHsKICAgICAgICAgICAgJENvbHVtblRyYW5zbGF0ZSA9IFRyYW5zbGF0YWJsZSgnQ2hhbmdlZCcpOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQWxsQ29sdW1ucywgewogICAgICAgICAgICBDb2x1bW5OYW1lICAgICAgPT4gJENvbHVtbiwKICAgICAgICAgICAgQ29sdW1uVHJhbnNsYXRlID0+ICRDb2x1bW5UcmFuc2xhdGUsCiAgICAgICAgfTsKCiAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGxpbmUsIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtblRyYW5zbGF0ZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdCwgc29ydCBieSBDaGFuZ2VJRCBEb3duLCB0aGVuIGJ5IFdvcmtPcmRlcklEIFVwCiAgICBteSBASXRlbUxpc3Q7CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICgKICAgICAgICBzb3J0IHsKICAgICAgICAgICAgJExpbmtMaXN0eyRifXtEYXRhfS0+e0NoYW5nZUlEfSA8PT4gJExpbmtMaXN0eyRhfXtEYXRhfS0+e0NoYW5nZUlEfQogICAgICAgICAgICAgICAgfHwgJGEgPD0+ICRiCiAgICAgICAgfSBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBleHRyYWN0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRMaW5rTGlzdHskV29ya09yZGVySUR9LT57RGF0YX07CgogICAgICAgIG15IEBJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1dvcmtPcmRlclN0YXRlU2lnbmFsJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZVNpZ25hbH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZURhdGF9LT57Q2hhbmdlTnVtYmVyfQogICAgICAgICAgICAgICAgICAgIC4gJy0nIC4gJFdvcmtPcmRlci0+e1dvcmtPcmRlck51bWJlcn0sCiAgICAgICAgICAgICAgICBMaW5rID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPScKICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRTZWxmLT57Q2hhbmdlSG9va30gLiAkV29ya09yZGVyLT57Q2hhbmdlRGF0YX0tPntDaGFuZ2VOdW1iZXJ9IC4gJy0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e1dvcmtPcmRlckhvb2t9CiAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSAuICc6ICcKICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgQ09MVU1OOgogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICBteSAlSGFzaDsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRDb2x1bW4gfSBAVGltZUxvbmdUeXBlcyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHlwZSd9ID0gJ1RpbWVMb25nJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGV4dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJENvbHVtbiB9IEBUcmFuc2xhdGVUeXBlcyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHJhbnNsYXRlJ30gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkV29ya09yZGVyLT57JENvbHVtbn07CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUNvbHVtbnMsIFwlSGFzaDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBASXRlbUxpc3QsIFxASXRlbUNvbHVtbnM7CiAgICB9CgogICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgIyBEZWZpbmUgdGhlIGJsb2NrIGRhdGEuCiAgICBteSAlQmxvY2sgPSAoCiAgICAgICAgT2JqZWN0ICAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICBCbG9ja25hbWUgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgIE9iamVjdE5hbWUgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdE5hbWV9LAogICAgICAgIE9iamVjdElEICAgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBIZWFkbGluZSAgID0+IFxASGVhZGxpbmUsCiAgICAgICAgSXRlbUxpc3QgICA9PiBcQEl0ZW1MaXN0LAogICAgICAgIEFsbENvbHVtbnMgPT4gXEBBbGxDb2x1bW5zLAogICAgKTsKCiAgICByZXR1cm4gKCBcJUJsb2NrICk7Cgp9Cgo9aGVhZDIgVGFibGVDcmVhdGVTaW1wbGUoKQoKcmV0dXJuIGEgaGFzaCB3aXRoIHRoZSBsaW5rIG91dHB1dCBkYXRhCgpSZXR1cm4KCiAgICAlTGlua091dHB1dERhdGEgPSAoCiAgICAgICAgTm9ybWFsOjpTb3VyY2UgPT4gewogICAgICAgICAgICBJVFNNV29ya09yZGVyID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdXTzoyMDA5MTAwMTEyMzU0MzIxLTEnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NoYW5nZSMgMjAwOTEwMTYxMDAwNTQwMiAtIFdvcmtvcmRlciMgMTogVGhlIFdvcmtPcmRlciBUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgQ3NzICAgICA9PiAnc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1dPOjIwMDkxMDAxMTIzNTQzMjEtNicsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ2hhbmdlIyAyMDA5MTAxNjEwMDA3NjM0IC0gV29ya29yZGVyIyA2OiBUaGUgV29ya09yZGVyIFRpdGxlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBQYXJlbnRDaGlsZDo6VGFyZ2V0ID0+IHsKICAgICAgICAgICAgSVRTTVdvcmtPcmRlciA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV086MjAwOTEwMDExMjM1NDMyMS0zJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDaGFuZ2UjIDIwMDkxMDE2MTAwMDQ0MzMxIC0gV29ya29yZGVyIyAzOiBUaGUgV29ya09yZGVyIFRpdGxlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgJUxpbmtPdXRwdXREYXRhID0gJExpbmtPYmplY3QtPlRhYmxlQ3JlYXRlU2ltcGxlKAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZVNpbXBsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTGlua091dHB1dERhdGE7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QsIHNvcnQgYnkgQ2hhbmdlSUQgRG93biwgdGhlbiBieSBXb3JrT3JkZXJOdW1iZXIgVXAKICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICgKICAgICAgICAgICAgICAgIHNvcnQgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb25MaXN0LT57JGJ9LT57Q2hhbmdlSUR9IDw9PiAkRGlyZWN0aW9uTGlzdC0+eyRhfS0+e0NoYW5nZUlEfQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkYSA8PT4gJGIKICAgICAgICAgICAgICAgIH0ga2V5cyAleyREaXJlY3Rpb25MaXN0fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICBteSAkV29ya09yZGVyID0gJERpcmVjdGlvbkxpc3QtPnskV29ya09yZGVySUR9OwoKICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJUl0ZW0gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV086JyAuICRXb3JrT3JkZXItPntDaGFuZ2VEYXRhfS0+e0NoYW5nZU51bWJlcn0gLiAnLScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkU2VsZi0+e0NoYW5nZUhvb2t9IC4gJFdvcmtPcmRlci0+e0NoYW5nZURhdGF9LT57Q2hhbmdlTnVtYmVyfSAuICctJwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57V29ya09yZGVySG9va30KICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSAuICc6ICcKICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDIwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXCVJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBpdGVtIGxpc3QgdG8gbGluayBvdXRwdXQgZGF0YQogICAgICAgICAgICAkTGlua091dHB1dERhdGF7ICRMaW5rVHlwZSAuICc6OicgLiAkRGlyZWN0aW9uIH0tPntJVFNNV29ya09yZGVyfSA9IFxASXRlbUxpc3Q7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlTGlua091dHB1dERhdGE7Cn0KCj1oZWFkMiBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybiBhIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+Q29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDb250ZW50RGF0YSA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ29udGVudFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29udGVudERhdGF9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb250ZW50RGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgcmV0dXJuIGlmICRDb250ZW50LT57VHlwZX0gbmUgJ1dvcmtPcmRlclN0YXRlU2lnbmFsJzsKCiAgICAjIGJ1aWxkIGh0bWwgZm9yIHNpZ25hbCBMRUQKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuV29ya09yZGVyU3RhdGUgfCBodG1sICVdIj4gJwogICAgICAgICAgICAuICc8c3BhbiBjbGFzcz0iWyUgRGF0YS5Xb3JrT3JkZXJTdGF0ZVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4gPC9kaXY+JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVTaWduYWwgPT4gJENvbnRlbnQtPntDb250ZW50fSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgICAgICAgPT4gJENvbnRlbnQtPntXb3JrT3JkZXJTdGF0ZX0gfHwgJycsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1oZWFkMiBTZWxlY3RhYmxlT2JqZWN0TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIEM8c2VsZWN0YWJsZT4gb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAnV29ya09yZGVyJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAkTGlua09iamVjdC0+U2VsZWN0YWJsZU9iamVjdExpc3QoCiAgICAgICAgU2VsZWN0ZWQgPT4gJElkZW50aWZpZXIsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgU2VsZWN0YWJsZU9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZWN0ZWQ7CiAgICBpZiAoICRQYXJhbXtTZWxlY3RlZH0gJiYgJFBhcmFte1NlbGVjdGVkfSBlcSAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZWN0ZWQgPSAxOwogICAgfQoKICAgICMgb2JqZWN0IHNlbGVjdCBsaXN0CiAgICBteSBAT2JqZWN0U2VsZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgICAgICBWYWx1ZSAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9LAogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aGVhZDIgU2VhcmNoT3B0aW9uTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlYXJjaCBvcHRpb25zCgpSZXR1cm4KCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ2hhbmdlTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDaGFuZ2UjJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzIwMDkxMDAxMTIzNTQzMjEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnTWFpbCBzZXJ2ZXIgbmVlZHMgdXBkYXRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdXb3JrT3JkZXJOdW1iZXInLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1dvcmtvcmRlciMnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnMTInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdXb3JrT3JkZXIgVGl0bGUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnU2h1dGRvd24gb2xkIG1haWwgc2VydmVyJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KCk7Cgo9Y3V0CgpzdWIgU2VhcmNoT3B0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2VhcmNoIG9wdGlvbiBsaXN0CiAgICBteSBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0NoYW5nZU51bWJlcicsCiAgICAgICAgICAgIE5hbWUgPT4gJFNlbGYtPntDaGFuZ2VIb29rfSwKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnV29ya09yZGVyTnVtYmVyJywKICAgICAgICAgICAgTmFtZSA9PiAkU2VsZi0+e1dvcmtPcmRlckhvb2t9LAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvcm1rZXkKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewogICAgICAgICRSb3ctPntGb3JtS2V5fSA9ICdTRUFSQ0g6OicgLiAkUm93LT57S2V5fTsKICAgIH0KCiAgICAjIGFkZCBmb3JtIGRhdGEgYW5kIGlucHV0IHN0cmluZwogICAgUk9XOgogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CgogICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lucHV0VGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFJvdy0+e0Zvcm1EYXRhfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgJFJvdy0+e0lucHV0U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICApOwoKICAgICAgICBuZXh0IFJPVzsKICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51L0lUU01DaGFuZ2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgVXNlcklEIHBhcmFtCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAkUGFyYW17VXNlcklEfSB8fCBkaWUgIkdvdCBubyBVc2VySUQhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1RpY2tldH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgaWYgYW4gYWN0aW9uIHBhcmFtZXRlciB3YXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntBY3Rpb259ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGZyb250ZW5kIG1vZHVsZSBpcyByZWdpc3RlcmVkLCBpZiBub3QsIGRvIG5vdCBzaG93IGFjdGlvbgogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfTsKICAgICAgICByZXR1cm4gaWYgISRNb2R1bGU7CgogICAgICAgICMgY2hlY2sgaWYgY3VycmVudCB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIGFjdGlvbgogICAgICAgIGlmICggJE1vZHVsZS0+e0dyb3VwUm99ICYmIHJlZiAkTW9kdWxlLT57R3JvdXBSb30gZXEgJ0FSUkFZJyAmJiBAeyAkTW9kdWxlLT57R3JvdXBSb30gfSApIHsKCiAgICAgICAgICAgIG15ICRBY2Nlc3M7CgogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRNb2R1bGUtPntHcm91cFJvfSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGdyb3VwIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICAgICAgICAgIyBsb29rdXAgdGhlIGdyb3VwIGlkCiAgICAgICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgJ3JvJyBwcml2aWxlZ2UKICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgYWNjZXNzCiAgICAgICAgICAgICAgICBpZiAoICRHcm91cHN7JEdyb3VwSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgJ3JvJyByaWdodHMgaW4gdGhlIGdyb3VwCiAgICAgICAgICAgIHJldHVybiBpZiAhJEFjY2VzczsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgbGluayBpcyBzaG93biBvbmx5IGZvciB0aGUgY29uZmlndXJlZCB0aWNrZXQgdHlwZXMsCiAgICAjIHNvIHRoZSB0aWNrZXQgbmVlZHMgdG8gaGF2ZSBhIHR5cGUuCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrZXR9LT57VHlwZX07CgogICAgIyBnZXQgYW5kIGNoZWNrIHRoZSBsaXN0IG9mIHJlbGV2YW50IHRpY2tldCB0eXBlcwogICAgbXkgJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlcyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyk7CgogICAgcmV0dXJuIGlmICEkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzOwogICAgcmV0dXJuIGlmIHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgIUB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc307CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSB0aWNrZXQncyB0eXBlIGlzIHJlbGV2YW50CiAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgIHJldHVybiBpZiAhJElzUmVsZXZhbnR7ICRQYXJhbXtUaWNrZXR9LT57VHlwZX0gfTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgID0+ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBBY3Rpb24gPT4gJFBhcmFte0NvbmZpZ30tPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRBY2Nlc3M7CiAgICB9CgogICAgcmV0dXJuIHsgJXsgJFBhcmFte0NvbmZpZ30gfSwgJXsgJFBhcmFte1RpY2tldH0gfSwgJVBhcmFtLCB9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL0NoYW5nZU1hbmFnZXIucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ2hhbmdlTWFuYWdlci5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VG9vbEJhcjo6Q2hhbmdlTWFuYWdlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFjdGlvbiwgZ3JvdXAsIGxhYmVsLCBpbWFnZSBhbmQgcHJpbwogICAgbXkgJEFjdGlvbiA9ICdBZ2VudElUU01DaGFuZ2VNYW5hZ2VyJzsKICAgIG15ICRHcm91cCAgPSAnaXRzbS1jaGFuZ2UtbWFuYWdlcic7CiAgICBteSAkSWNvbiAgID0gJFBhcmFte0NvbmZpZ30tPntJY29ufTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdCBzaG93IGljb24gaWYgZnJvbnRlbmQgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkCiAgICByZXR1cm4gaWYgISRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57JEFjdGlvbn07CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRBY3Rpb24iKTsKCiAgICAjIGdldCBncm91cCBvYmplY3QKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKCBHcm91cCA9PiAkR3JvdXAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBnZXQgdGhlIG51bWJlciBvZiB2aWV3YWJsZSBjaGFuZ2VzCiAgICBteSAkQ291bnQgPSAwOwogICAgaWYgKCAkQ29uZmlnLT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gJiYgQHsgJENvbmZpZy0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9IH0gKSB7CgogICAgICAgICMgcmVtb3ZlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICBteSBAQ2hhbmdlU3RhdGVzOwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwogICAgICAgICAgICBwdXNoIEBDaGFuZ2VTdGF0ZXMsICRDaGFuZ2VTdGF0ZTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjYWNoZSB0eXBlIGFuZCBUVEwgKGluIHNlY29uZHMpCiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50VG9vbEJhckNoYW5nZU1hbmFnZXInIC4gJFNlbGYtPntVc2VySUR9OwogICAgICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6VG9vbEJhcjo6Q2FjaGVUVEwnKSAqIDYwOwoKICAgICAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9IGpvaW4gJywnLCBzb3J0IENoYW5nZVN0YXRlczsKICAgICAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGUgKSB7CiAgICAgICAgICAgICRDb3VudCA9ICRDYWNoZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2Ygdmlld2FibGUgY2hhbmdlcwogICAgICAgICAgICAkQ291bnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFxAQ2hhbmdlU3RhdGVzLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICAgICAgTWlycm9yREIgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IFRvb2xCYXIgb2JqZWN0IHBhcmFtZXRlcnMKICAgIG15ICRDbGFzcyA9ICRQYXJhbXtDb25maWd9LT57Q3NzQ2xhc3N9OwogICAgbXkgJFRleHQgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDaGFuZ2UgTWFuYWdlcicpOwoKICAgICMgc2V0IFRvb2xCYXIgb2JqZWN0CiAgICBteSAkVVJMICAgICAgPSAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9OwogICAgbXkgJFByaW9yaXR5ID0gJFBhcmFte0NvbmZpZ30tPntQcmlvcml0eX07CiAgICBteSAlUmV0dXJuOwogICAgaWYgKCRDb3VudCkgewogICAgICAgICRSZXR1cm57JFByaW9yaXR5fSA9IHsKICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJ1Rvb2xCYXJJdGVtJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFRleHQsCiAgICAgICAgICAgIENvdW50ICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICBJY29uICAgICAgICA9PiAkSWNvbiwKICAgICAgICAgICAgTGluayAgICAgICAgPT4gJFVSTCAuICdBY3Rpb249JyAuICRBY3Rpb24sCiAgICAgICAgICAgIEFjY2Vzc0tleSAgID0+ICcnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuICVSZXR1cm47Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL015Q0FCLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE15Q0FCLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUb29sQmFyOjpNeUNBQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFjdGlvbiwgZ3JvdXAsIGxhYmVsLCBpbWFnZSBhbmQgcHJpbwogICAgbXkgJEFjdGlvbiA9ICdBZ2VudElUU01DaGFuZ2VNeUNBQic7CiAgICBteSAkR3JvdXAgID0gJ2l0c20tY2hhbmdlJzsKICAgIG15ICRJY29uICAgPSAkUGFyYW17Q29uZmlnfS0+e0ljb259OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZG8gbm90IHNob3cgaWNvbiBpZiBmcm9udGVuZCBtb2R1bGUgaXMgbm90IHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JEFjdGlvbiIpOwoKICAgICMgZ2V0IGdyb3VwIG9iamVjdAogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgIyBnZXQgdGhlIGdyb3VwIGlkCiAgICBteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICRHcm91cCApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgIG15ICRDb3VudCA9IDA7CiAgICBpZiAoICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSAmJiBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgIyByZW1vdmUgZW1wdHkgY2hhbmdlIHN0YXRlcwogICAgICAgIG15IEBDaGFuZ2VTdGF0ZXM7CiAgICAgICAgQ0hBTkdFU1RBVEU6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CiAgICAgICAgICAgIHB1c2ggQENoYW5nZVN0YXRlcywgJENoYW5nZVN0YXRlOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGNhY2hlIHR5cGUgYW5kIFRUTCAoaW4gc2Vjb25kcykKICAgICAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnSVRTTUNoYW5nZU1hbmFnZW1lbnRUb29sQmFyTXlDQUInIC4gJFNlbGYtPntVc2VySUR9OwogICAgICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6VG9vbEJhcjo6Q2FjaGVUVEwnKSAqIDYwOwoKICAgICAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9IGpvaW4gJywnLCBzb3J0IEBDaGFuZ2VTdGF0ZXM7CiAgICAgICAgbXkgJENhY2hlID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhY2hlICkgewogICAgICAgICAgICAkQ291bnQgPSAkQ2FjaGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgICAgICAgICAgJENvdW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgPT4gXEBDaGFuZ2VTdGF0ZXMsCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICAgICAgTWlycm9yREIgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQ291bnQgfHwgMCwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2V0IFRvb2xCYXIgb2JqZWN0IHBhcmFtZXRlcnMKICAgIG15ICRDbGFzcyA9ICRQYXJhbXtDb25maWd9LT57Q3NzQ2xhc3N9OwogICAgbXkgJFRleHQgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNeSBDQUJzJyk7CgogICAgIyBzZXQgVG9vbEJhciBvYmplY3QKICAgIG15ICRVUkwgICAgICA9ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua307CiAgICBteSAkUHJpb3JpdHkgPSAkUGFyYW17Q29uZmlnfS0+e1ByaW9yaXR5fTsKICAgIG15ICVSZXR1cm47CiAgICBpZiAoJENvdW50KSB7CiAgICAgICAgJFJldHVybnskUHJpb3JpdHl9ID0gewogICAgICAgICAgICBCbG9jayAgICAgICA9PiAnVG9vbEJhckl0ZW0nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkVGV4dCwKICAgICAgICAgICAgQ291bnQgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgIEljb24gICAgICAgID0+ICRJY29uLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkVVJMIC4gJ0FjdGlvbj0nIC4gJEFjdGlvbiwKICAgICAgICAgICAgQWNjZXNzS2V5ICAgPT4gJycsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gJVJldHVybjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL015Q2hhbmdlcy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBNeUNoYW5nZXMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRvb2xCYXI6Ok15Q2hhbmdlczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFjdGlvbiwgZ3JvdXAsIGxhYmVsLCBpbWFnZSBhbmQgcHJpbwogICAgbXkgJEFjdGlvbiA9ICdBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMnOwogICAgbXkgJEdyb3VwICA9ICdpdHNtLWNoYW5nZS1idWlsZGVyJzsKICAgIG15ICRJY29uICAgPSAkUGFyYW17Q29uZmlnfS0+e0ljb259OwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZG8gbm90IHNob3cgaWNvbiBpZiBmcm9udGVuZCBtb2R1bGUgaXMgbm90IHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JEFjdGlvbiIpOwoKICAgICMgZ2V0IGdyb3VwIG9iamVjdAogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgIyBnZXQgdGhlIGdyb3VwIGlkCiAgICBteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICRHcm91cCApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgIG15ICRDb3VudCA9IDA7CiAgICBpZiAoICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSAmJiBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgIyByZW1vdmUgZW1wdHkgY2hhbmdlIHN0YXRlcwogICAgICAgIG15IEBDaGFuZ2VTdGF0ZXM7CiAgICAgICAgQ0hBTkdFU1RBVEU6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CiAgICAgICAgICAgIHB1c2ggQENoYW5nZVN0YXRlcywgJENoYW5nZVN0YXRlOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGNhY2hlIHR5cGUgYW5kIFRUTCAoaW4gc2Vjb25kcykKICAgICAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnSVRTTUNoYW5nZU1hbmFnZW1lbnRUb29sQmFyTXlDaGFuZ2VzJyAuICRTZWxmLT57VXNlcklEfTsKICAgICAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OlRvb2xCYXI6OkNhY2hlVFRMJykgKiA2MDsKCiAgICAgICAgIyBnZXQgY2FjaGUgb2JqZWN0CiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSBqb2luICcsJywgc29ydCBAQ2hhbmdlU3RhdGVzOwogICAgICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZSApIHsKICAgICAgICAgICAgJENvdW50ID0gJENhY2hlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiB2aWV3YWJsZSBjaGFuZ2VzCiAgICAgICAgICAgICRDb3VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gXEBDaGFuZ2VTdGF0ZXMsCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgICAgICBNaXJyb3JEQiAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBnZXQgVG9vbEJhciBvYmplY3QgcGFyYW1ldGVycwogICAgbXkgJENsYXNzID0gJFBhcmFte0NvbmZpZ30tPntDc3NDbGFzc307CiAgICBteSAkVGV4dCAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ015IENoYW5nZXMnKTsKCiAgICAjIHNldCBUb29sQmFyIG9iamVjdAogICAgbXkgJFVSTCAgICAgID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfTsKICAgIG15ICRQcmlvcml0eSA9ICRQYXJhbXtDb25maWd9LT57UHJpb3JpdHl9OwogICAgbXkgJVJldHVybjsKICAgIGlmICgkQ291bnQpIHsKICAgICAgICAkUmV0dXJueyRQcmlvcml0eX0gPSB7CiAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICdUb29sQmFySXRlbScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRUZXh0LAogICAgICAgICAgICBDb3VudCAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgSWNvbiAgICAgICAgPT4gJEljb24sCiAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRVUkwgLiAnQWN0aW9uPScgLiAkQWN0aW9uLAogICAgICAgICAgICBBY2Nlc3NLZXkgICA9PiAnJywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiAlUmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ub29sQmFyL015V29ya09yZGVycy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBNeVdvcmtPcmRlcnMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRvb2xCYXI6Ok15V29ya09yZGVyczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFjdGlvbgogICAgbXkgJEFjdGlvbiA9ICdBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMnOwogICAgbXkgJEdyb3VwICA9ICdpdHNtLWNoYW5nZSc7CiAgICBteSAkSWNvbiAgID0gJFBhcmFte0NvbmZpZ30tPntJY29ufTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGRvIG5vdCBzaG93IGljb24gaWYgZnJvbnRlbmQgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkCiAgICByZXR1cm4gaWYgISRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57JEFjdGlvbn07CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRBY3Rpb24iKTsKCiAgICAjIGdldCBncm91cCBvYmplY3QKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKCBHcm91cCA9PiAkR3JvdXAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBnZXQgdGhlIG51bWJlciBvZiB2aWV3YWJsZSBjaGFuZ2VzCiAgICBteSAkQ291bnQgPSAwOwogICAgaWYgKCAkQ29uZmlnLT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gJiYgQHsgJENvbmZpZy0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9IH0gKSB7CgogICAgICAgICMgcmVtb3ZlIGVtcHR5IHdvcmtvcmRlciBzdGF0ZXMKICAgICAgICBteSBAV29ya09yZGVyU3RhdGVzOwogICAgICAgIFdPUktPUkRFUlNUQVRFOgogICAgICAgIGZvciBteSAkV29ya09yZGVyU3RhdGUgKCBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gfSApIHsKICAgICAgICAgICAgbmV4dCBXT1JLT1JERVJTVEFURSBpZiAhJFdvcmtPcmRlclN0YXRlOwogICAgICAgICAgICBwdXNoIEBXb3JrT3JkZXJTdGF0ZXMsICRXb3JrT3JkZXJTdGF0ZTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjYWNoZSB0eXBlIGFuZCBUVEwgKGluIHNlY29uZHMpCiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50VG9vbEJhck15V29ya09yZGVycycgLiAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpUb29sQmFyOjpDYWNoZVRUTCcpICogNjA7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSBqb2luICcsJywgc29ydCBAV29ya09yZGVyU3RhdGVzOwoKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZSApIHsKICAgICAgICAgICAgJENvdW50ID0gJENhY2hlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiB2aWV3YWJsZSB3b3Jrb3JkZXJzCiAgICAgICAgICAgICRDb3VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgICA9PiBcQFdvcmtPcmRlclN0YXRlcywKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICAgICAgTWlycm9yREIgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBUb29sQmFyIG9iamVjdCBwYXJhbWV0ZXJzCiAgICBteSAkQ2xhc3MgPSAkUGFyYW17Q29uZmlnfS0+e0Nzc0NsYXNzfTsKICAgIG15ICRUZXh0ICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTXkgV29yayBPcmRlcnMnKTsKCiAgICAjIHNldCBUb29sQmFyIG9iamVjdAogICAgbXkgJFVSTCAgICAgID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfTsKICAgIG15ICRQcmlvcml0eSA9ICRQYXJhbXtDb25maWd9LT57UHJpb3JpdHl9OwogICAgbXkgJVJldHVybjsKICAgIGlmICgkQ291bnQpIHsKICAgICAgICAkUmV0dXJueyRQcmlvcml0eX0gPSB7CiAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICdUb29sQmFySXRlbScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRUZXh0LAogICAgICAgICAgICBDb3VudCAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgSWNvbiAgICAgICAgPT4gJEljb24sCiAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRVUkwgLiAnQWN0aW9uPScgLiAkQWN0aW9uLAogICAgICAgICAgICBBY2Nlc3NLZXkgICA9PiAnJywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiAlUmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkNhdGVnb3J5IOKGlCBJbXBhY3Qg4oaUIFByaW9yaXR5IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPjxoMj5bJSBUcmFuc2xhdGUoIk5vdGUiKSB8IGh0bWwgJV08L2gyPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1hbmFnZSB0aGUgcHJpb3JpdHkgcmVzdWx0IG9mIGNvbWJpbmF0aW5nIENhdGVnb3J5IOKGlCBJbXBhY3QuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IGFsbG9jYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDSVBBbGxvY2F0ZSIvPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIERhdGFUYWJsZU5vSGlnaGxpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJDb2x1bW5EZXNjcmlwdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5PYmplY3RUeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQ29sdW1uRGVzY3JpcHRpb24iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJDZWxsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk9iamVjdE9wdGlvbikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckNlbGwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRGVzY3JpcHRpb25DZWxsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk9iamVjdE9wdGlvbikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRlc2NyaXB0aW9uQ2VsbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRDZWxsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50Q2VsbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJTdWJtaXRBbmRDb250aW51ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb24udHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyNDozMyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDEgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiSVRTTSBDaGFuZ2VNYW5hZ2VtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KClslLQogICAgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0ZSgnSVRTTSBDaGFuZ2VNYW5hZ2VtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50JyksCiAgICAgICAgICAgIExpbmsgPT4gRW52KCJBY3Rpb24iKSwKICAgICAgICB9CiAgICBdOwoKICAgIElGIERhdGEuQWN0aW9uID09ICdBZGQnOwogICAgICAgIEJyZWFkY3J1bWJQYXRoLnB1c2goewogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0ZSgnQWRkIE5vdGlmaWNhdGlvbiBSdWxlJyksCiAgICAgICAgfSk7CiAgICBFTFNJRiBEYXRhLkFjdGlvbiA9PSAnQ2hhbmdlJzsKICAgICAgICBCcmVhZGNydW1iUGF0aC5wdXNoKHsKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGUoJ0VkaXQgTm90aWZpY2F0aW9uIFJ1bGUnKSwKICAgICAgICB9KTsKICAgIEVORDsKCiVdCgpbJSBJTkNMVURFICJCcmVhZGNydW1iLnR0IiBQYXRoID0gQnJlYWRjcnVtYlBhdGggJV0KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkxpc3QiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIHRvIG92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uT3ZlcnZpZXciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25BZGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUFkZCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBOb3RpZmljYXRpb24gUnVsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRXZlbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQXR0cmlidXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlJ1bGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiUmVjaXBpZW50cyIpIHwgaHRtbCAlXTwvdGg+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIFcxMHBjIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFslIElGIERhdGEuVmFsaWRJRCAhPSAxJV1jbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1DaGFuZ2U7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLkV2ZW50KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQXR0cmlidXRlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5SdWxlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5SZWNpcGllbnRzIHwgaHRtbCAlXTwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDIwKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Ob3RpZmljYXRpb25Db3B5O0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY29weSI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVHJhc2hDYW4gTm90aWZpY2F0aW9uRGVsZXRlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RGVsZXRlO0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgdGhpcyBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSZXN1bHQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdVcGRhdGUiKSAlXQogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyIgbmFtZT0iQ2hhbmdlTm90aWZpY2F0aW9uIiBpZD0iQ2hhbmdlTm90aWZpY2F0aW9uIj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5BY3Rpb25MYWJlbCkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJbJSBEYXRhLkFjdGlvbiB8IHVyaSAlXUFjdGlvbiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb250aW51ZUFmdGVyU2F2ZSIgaWQ9IkNvbnRpbnVlQWZ0ZXJTYXZlIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOYW1lIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTmFtZSIgbmFtZT0iTmFtZSIgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIFc1MHBjIFslIERhdGEuTmFtZUludmFsaWQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJBIG5vdGlmaWNhdGlvbiBzaG91bGQgaGF2ZSBhIG5hbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJOYW1lIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkV2ZW50SUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRXZlbnQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkV2ZW50T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBdHRyaWJ1dGUiPlslIFRyYW5zbGF0ZSgiQXR0cmlidXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQXR0cmlidXRlIiBuYW1lPSJBdHRyaWJ1dGUiIHZhbHVlPSJbJSBEYXRhLkF0dHJpYnV0ZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUnVsZSI+WyUgVHJhbnNsYXRlKCJSdWxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUnVsZSIgbmFtZT0iUnVsZSIgdmFsdWU9IlslIERhdGEuUnVsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50SURzIj5bJSBUcmFuc2xhdGUoIlJlY2lwaWVudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWNpcGllbnRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWxpZE9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ29tbWVudCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIxNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIFRlbXBsYXRlIE5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlRlbXBsYXRlX0xhbmd1YWdlX1JlbW92ZSIgaHJlZj0iIiBuYW1lPSJUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiBjbGFzcz0iTGFuZ3VhZ2VJRCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX0xhYmVsX1N1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX1N1YmplY3QiIHZhbHVlPSIiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZV9TdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlbXBsYXRlX0JvZHkiIGlkPSJUZW1wbGF0ZV9MYWJlbF9Cb2R5IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlRlbXBsYXRlX0JvZHkiIGNsYXNzPSIiIG5hbWU9IlRlbXBsYXRlX0JvZHkiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVfQm9keUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb3RpZmljYXRpb25UeXBlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIHRoaXMgd2lkZ2V0IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZShEYXRhLlR5cGUpIHwgaHRtbCAlXSk8L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTm90aWZpY2F0aW9uTGFuZ3VhZ2VDb250YWluZXIiIGlkPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdTm90aWZpY2F0aW9uTGFuZ3VhZ2VDb250YWluZXIiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJOb3RpZmljYXRpb25MYW5ndWFnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJUaXRsZSI+WyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlUmVtb3ZlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbEluZm9ybWF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHZhbHVlPSJSZW1vdmUgTGFuZ3VhZ2UiIGNsYXNzPSJSZW1vdmVCdXR0b24gTGFuZ3VhZ2VSZW1vdmUgWyUgRGF0YS5UeXBlIHwgaHRtbCAlXUxhbmd1YWdlUmVtb3ZlIiBpZD0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXV9bJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0xhbmd1YWdlX1JlbW92ZSIgaHJlZj0iIiBuYW1lPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fTGFuZ3VhZ2VfUmVtb3ZlIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgTm90aWZpY2F0aW9uIExhbmd1YWdlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOb3RpZmljYXRpb25MYW5ndWFnZVJlbW92ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uT0ZPUksiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV1fTGFuZ3VhZ2VJRCIgY2xhc3M9Ikxhbmd1YWdlSUQiIHZhbHVlPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXV9bJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX1N1YmplY3QiIGlkPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fTGFiZWxfU3ViamVjdCIgY2xhc3M9Ik1hbmRhdG9yeSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fU3ViamVjdCIgaWQ9IlslIERhdGEuVHlwZSB8IGh0bWwgJV1fWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdFNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXV9bJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX1N1YmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuVHlwZSB8IGh0bWwgJV1fWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9Cb2R5IiBpZD0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXV9bJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0xhYmVsX0JvZHkiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0NzBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgaWQ9IlslIERhdGEuVHlwZSB8IGh0bWwgJV1fWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9Cb2R5IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWRSaWNoVGV4dCBbJSBEYXRhLkJvZHlTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdX1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXV9bJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2UiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlQWRkIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikxhbmd1YWdlIj5bJSBUcmFuc2xhdGUoIkFkZCBuZXcgbm90aWZpY2F0aW9uIGxhbmd1YWdlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFuZ3VhZ2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhbmd1YWdlT3JpZ1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlQWRkIikgJV0KCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOb3RpZmljYXRpb25UeXBlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTYXZlIENoYW5nZXMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AgU2F2ZUJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0QW5kQ29udGludWUiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSBhbmQgZmluaXNoIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICA8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1VwZGF0ZSIpICVdCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5JVFNNU3RhdGVNYWNoaW5lLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSVRTTVN0YXRlTWFjaGluZS50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDEgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQWRtaW4gU3RhdGUgTWFjaGluZSIpIHwgaHRtbCAlXTwvaDE+ClslLQogICAgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0ZSgnQWRtaW4gU3RhdGUgTWFjaGluZScpLAogICAgICAgICAgICBMaW5rID0+IEVudigiQWN0aW9uIiksCiAgICAgICAgfSwKICAgIF07CgogICAgSUYgRGF0YS5BY3Rpb24gPT0gJ1N0YXRlVHJhbnNpdGlvbkFkZCc7CiAgICAgICAgQnJlYWRjcnVtYlBhdGgucHVzaCh7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FkZCBTdGF0ZSBUcmFuc2l0aW9uJywKICAgICAgICB9KTsKICAgIEVMU0lGIERhdGEuQWN0aW9uID09ICdTdGF0ZVRyYW5zaXRpb25VcGRhdGUnOwogICAgICAgIEJyZWFkY3J1bWJQYXRoLnB1c2goewogICAgICAgICAgICBOYW1lID0+ICdFZGl0IFN0YXRlIFRyYW5zaXRpb24nLAogICAgICAgIH0pOwogICAgRUxTSUYgRGF0YS5DbGFzczsKICAgICAgICBCcmVhZGNydW1iUGF0aC5wdXNoKHsKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUgVHJhbnNpdGlvbnMgZm9yICcgXyBEYXRhLkNsYXNzLAogICAgICAgIH0pOwogICAgRU5EOwoKJV0KClslIElOQ0xVREUgIkJyZWFkY3J1bWIudHQiIFBhdGggPSBCcmVhZGNydW1iUGF0aCAlXQoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uQWRkU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9ImdldCIgY2xhc3M9IlZhbGlkYXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RhdGVUcmFuc2l0aW9uQWRkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5DbGFzc1NlbGVjdGlvblN0cmluZyAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VsZWN0IGEgY2F0YWxvZyBjbGFzcyEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDbGFzc1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJBIGNhdGFsb2cgY2xhc3MgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZCBhIHN0YXRlIHRyYW5zaXRpb24iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25BZGRTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3Q2xhc3NlcyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaXN0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ2F0YWxvZyBDbGFzcyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJPYmplY3QgTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3Q2xhc3Nlc1JvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2xhc3M9WyUgRGF0YS5DbGFzcyB8IHVyaSAlXSI+WyUgRGF0YS5DbGFzcyB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2xhc3NTaG9ydE5hbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3Q2xhc3Nlc1JvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3Q2xhc3NlcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1N0YXRlVHJhbnNpdGlvbnMiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiT3ZlcnZpZXcgb3ZlciBzdGF0ZSB0cmFuc2l0aW9ucyBmb3IiKSB8IGh0bWwgJV0gWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJOZXh0IHN0YXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXRlVHJhbnNpdGlvblJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVN0YXRlVHJhbnNpdGlvblVwZGF0ZTtDbGFzcz1bJSBEYXRhLkNsYXNzIHwgdXJpICVdO1N0YXRlSUQ9WyUgRGF0YS5TdGF0ZUlEIHwgdXJpICVdO05leHRTdGF0ZUlEPVslIERhdGEuTmV4dFN0YXRlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZU5hbWUpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgVHJhbnNsYXRlKERhdGEuTmV4dFN0YXRlTmFtZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIExhc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGF0ZVRyYW5zaXRpb25EZWxldGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1TdGF0ZVRyYW5zaXRpb25EZWxldGU7Q2xhc3M9WyUgRGF0YS5DbGFzcyB8IHVyaSAlXTtTdGF0ZUlEPVslIERhdGEuU3RhdGVJRCB8IHVyaSAlXTtOZXh0U3RhdGVJRD1bJSBEYXRhLk5leHRTdGF0ZUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIHRoaXMgc3RhdGUgdHJhbnNpdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlVHJhbnNpdGlvbkRlbGV0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhdGVUcmFuc2l0aW9uUm93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1N0YXRlVHJhbnNpdGlvbnMiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGF0ZVRyYW5zaXRpb25BZGQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWRkIGEgbmV3IHN0YXRlIHRyYW5zaXRpb24gZm9yIikgfCBodG1sICVdIFslIERhdGEuQ2xhc3MgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9IklUU01TdGF0ZU1hY2hpbmVBZGQiIGNsYXNzPSJWYWxpZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXUFjdGlvbiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiAgICAgdmFsdWU9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29udGludWVBZnRlclNhdmUiIGlkPSJDb250aW51ZUFmdGVyU2F2ZSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXRlSUQiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0ZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3RhdGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2VsZWN0IGEgc3RhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3RhdGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2VsZWN0IGEgc3RhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmV4dCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5leHRTdGF0ZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV4dFN0YXRlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNlbGVjdCBhIG5leHQgc3RhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV4dFN0YXRlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNlbGVjdCBhIG5leHQgc3RhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCBTYXZlQnV0dG9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJTdWJtaXRBbmRDb250aW51ZSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJTdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIGFuZCBmaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlVHJhbnNpdGlvbkFkZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXRlVHJhbnNpdGlvblVwZGF0ZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IGEgc3RhdGUgdHJhbnNpdGlvbiBmb3IiKSB8IGh0bWwgJV0gWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iSVRTTVN0YXRlTWFjaGluZVVwZGF0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgIHZhbHVlPSJbJSBEYXRhLkFjdGlvbiB8IGh0bWwgJV1BY3Rpb24iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzcyIgICAgICAgdmFsdWU9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3RhdGVJRCIgICAgIHZhbHVlPSJbJSBEYXRhLlN0YXRlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmV4dFN0YXRlSUQiIHZhbHVlPSJbJSBEYXRhLk5leHRTdGF0ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNvbnRpbnVlQWZ0ZXJTYXZlIiBpZD0iQ29udGludWVBZnRlclNhdmUiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZU5hbWUpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmV4dCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5leHRTdGF0ZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIFNhdmVCdXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdEFuZENvbnRpbnVlIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUgYW5kIGZpbmlzaCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhdGVUcmFuc2l0aW9uVXBkYXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGVUcmFuc2l0aW9uRGVsZXRlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgc3RhdGUgdHJhbnNpdGlvbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlTmFtZSkgfCBodG1sICVdPC9zdHJvbmc+ICYjODU5NDsKICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIFRyYW5zbGF0ZShEYXRhLk5leHRTdGF0ZU5hbWUpIHwgaHRtbCAlXTwvc3Ryb25nPj8KICAgICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07Q2xhc3M9WyUgRGF0YS5DbGFzcyB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249WyUgRGF0YS5BY3Rpb24gfCB1cmkgJV1BY3Rpb247Q2xhc3M9WyUgRGF0YS5DbGFzcyB8IHVyaSAlXTtTdGF0ZUlEPVslIERhdGEuU3RhdGVJRCB8IHVyaSAlXTtOZXh0U3RhdGVJRD1bJSBEYXRhLk5leHRTdGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiWWVzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdGF0ZVRyYW5zaXRpb25EZWxldGUiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQo=
IyAtLQ0KIyBBZG1pblJlcXVlc3RGb3JtLnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pblNMQQ0KIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0NCiMgJElkOiBBZG1pblJlcXVlc3RGb3JtLnR0LHYgMS45IDIwMTkvMDkvMDEgMTI6MjM6NDEgdWQgRXhwICQNCiMgLS0NCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUNCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQ0KIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Lg0KIyAtLQ0KDQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4NCiAgICA8aDEgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVxdWVzdCBGaWVsZCBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4NCg0KICAgIFslIEJyZWFkY3J1bWJQYXRoID0gWw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRlKCdSZXF1ZXN0IEZvcm0gTWFuYWdlbWVudCcpLA0KICAgICAgICAgICAgICAgIExpbmsgPT4gRW52KCJBY3Rpb24iKSwNCiAgICAgICAgICAgIH0sDQogICAgICAgIF0NCiAgICAlXQ0KDQogICAgWyUgU1dJVENIIERhdGEuQWN0aW9uICVdDQogICAgICAgIFslIENBU0UgJ0FkZCcgJV0NCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IFRyYW5zbGF0ZSgiQWRkIEdyb3VwIiksfSkgJV0NCiAgICAgICAgWyUgQ0FTRSAnQ2hhbmdlJyAlXQ0KICAgICAgICAgICAgWyUgVVNFIEVkaXRUaXRsZSA9IFN0cmluZyhUcmFuc2xhdGUoIkVkaXQgR3JvdXAiKSkgJV0NCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IEVkaXRUaXRsZS5hcHBlbmQoICc6ICcsIERhdGEuTmFtZSApIH0pICVdDQogICAgWyUgRU5EICVdDQoNCiAgICBbJSBJTkNMVURFICJCcmVhZGNydW1iLnR0IiBQYXRoID0gQnJlYWRjcnVtYlBhdGggJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQ0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+DQogICAgPGgxPlslIFRyYW5zbGF0ZSgiTWFuYWdlIHJlcXVlc3RzLiIpIHwgaHRtbCAlXTwvaDE+DQoNCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdDQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4NCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdDQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJHbyB0byBvdmVydmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uT3ZlcnZpZXciKSAlXQ0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25BZGQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249UmVxdWVzdEVkaXQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0IGFkZCIpIHwgaHRtbCAlXTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC9saT4NClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25BZGQiKSAlXQ0KDQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25MaXN0IikgJV0NCg0KICAgIDwvZGl2Pg0KDQogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+DQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+DQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3QiKSAlXQ0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4NCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaXN0IikgfCBodG1sICVdPC9oMj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+DQoNCiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+DQogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0IikgfCBodG1sICVdPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJWYWxpZCIpIHwgaHRtbCAlXTwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ2hhbmdlZCIpIHwgaHRtbCAlXTwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPg0KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+DQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQ0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0Um93IikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5DaGFuZ2VUaW1lIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0NCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0IikgJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVxdWVzdEVkaXQiKSAlXQ0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4NClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFkZCIpICVdDQogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTmV3IFJlcXVlc3QiKSB8IGh0bWwgJV08L2gyPg0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFkZCIpICVdDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJFZGl0IikgJV0NCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0IGVkaXQiKSB8IGh0bWwgJV08L2gyPg0KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckVkaXQiKSAlXQ0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4NCg0KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUiPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlJlcXVlc3RTYXZlIi8+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RJRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0IikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuTmFtZUludmFsaWQgfCBodG1sICVdIiBtYXhsZW5ndGg9IjIwMCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0Ij5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgaWQ9IlN1YmplY3QiIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iMjAwIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3ViamVjdENoYW5nZWFibGUiPlslIFRyYW5zbGF0ZSgiU3ViamVjdCBjaGFuZ2VhYmxlIikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdWJqZWN0Q2hhbmdlYWJsZVN0cmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJRdWV1ZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVTdHJnICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmVsZElERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZlbGRJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXF1ZXN0R3JvdXAiPlslIFRyYW5zbGF0ZSgiUmVxdWVzdCBncm91cCIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWVzdEdyb3VwU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHlwZSI+WyUgVHJhbnNsYXRlKCJUaWNrZXQgdHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQ0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTaG93QXR0YWNobWVudCI+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TaG93QXR0YWNobWVudFN0cmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSZXF1ZXN0Q2F0ZWdvcmllc0lEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlJlcXVlc3QgY2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlcXVlc3RDYXRlZ29yaWVzU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZlbGRJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGZWxkSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93Q29uZmlnSXRlbSIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTaG93Q29uZmlnSXRlbSI+WyUgVHJhbnNsYXRlKCJTaG93IENvbmZpZ0l0ZW0iKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNob3dDb25maWdJdGVtU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd0NvbmZpZ0l0ZW0iKSAlXQ0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPd25lciI+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3duZXJTdHJnICVdDQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVzcG9uc2libGUiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc3BvbnNpYmxlU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWQiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkT3B0aW9uU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiBpZD0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIxNTAiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYXRlZ29yeUljb25zIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhdGVnb3J5SWNvbnNSYWhtZW5fWyUgRGF0YS5JRCAlXSIgc3R5bGU9ImZsb2F0OmxlZnQ7Ym9yZGVyOiBbJSBEYXRhLkNvbG9ySW1hZ2VJRCAlXTtwYWRkaW5nOjRweDttYXJnaW46NHB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2F0ZWdvcnlJY29uc19bJSBEYXRhLklEICVdIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxbJSBEYXRhLkNvbnRlbnQgfCBodG1sICVdIiB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJJbWFnZUlEIiBuYW1lPSJJbWFnZUlEIiB2YWx1ZT0iWyUgRGF0YS5JRCAlXSIgWyUgRGF0YS5DaGVja2VkSW1hZ2VJRCAlXS8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJDYXRlZ29yeUljb25zIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0Pg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEFkZCIpICVdDQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGZWxkSGVhZGVyQWRkIikgJV0NCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJGaWVsZCBhc3NpZ24iKSB8IGh0bWwgJV08L2gyPg0KWyUgUmVuZGVyQmxvY2tFbmQoIkZlbGRIZWFkZXJBZGQiKSAlXQ0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEhlYWRlckVkaXQiKSAlXQ0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkZpZWxzIGVkaXQiKSB8IGh0bWwgJV0gPGEgdGl0bGU9Inp1csO8Y2tzZXR6ZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdIj56dXLDvGNrc2V0emVuPC9hPjwvaDI+DQpbJSBSZW5kZXJCbG9ja0VuZCgiRmVsZEhlYWRlckVkaXQiKSAlXQ0KICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPg0KDQogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9Im5ld2ZpZWxkIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRmllbGRzU2F2ZSIvPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXF1ZXN0SUQiIGlkPSJSZXF1ZXN0SUQiIHZhbHVlPSJbJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV0iLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVxdWVzdEZvcm1JRCIgaWQ9IlJlcXVlc3RGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLlJlcXVlc3RGb3JtSUQgfCBodG1sICVdIi8+DQoNCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJGZWxkSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJOZXcgRmllbGQiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5ldWVzRmVsZFN0cmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGZWxkSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmVsZElEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik9yZGVyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiT3JkZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3JkZXIiIGlkPSJPcmRlciIgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIiB2YWx1ZT0iWyUgRGF0YS5PcmRlciB8IGh0bWwgJV0iIGNsYXNzPSJXNXBjIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iT3JkZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iT3JkZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVmFsaWQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJWYWxpZCIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb25TdHJnICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVmFsaWRJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJWYWxpZElEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJlcXVpcmVkRmllbGQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJSZXF1aXJlZCBmaWVsZCIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWlyZWRGaWVsZFN0cmcgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZXF1aXJlZEZpZWxkRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlcXVpcmVkRmllbGRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTW92ZU92ZXIiPlslIFRyYW5zbGF0ZSgiVG9vbC1UaXAgLyBNb3ZlLU92ZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9Ik1vdmVPdmVyIiBjbGFzcz0iVzUwcGMiIHJvd3M9IjMiIGNvbHM9IjYwIiBuYW1lPSJNb3ZlT3ZlciI+WyUgRGF0YS5Nb3ZlT3ZlciB8IGh0bWwgJV08L3RleHRhcmVhPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRvb2xUaXBVbmRlciI+WyUgVHJhbnNsYXRlKCJUb29sLVRpcCBkaXJlY3QgdW5kZXIgZmllbGRuYW1lIikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iVG9vbFRpcFVuZGVyIiBuYW1lPSJUb29sVGlwVW5kZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvb2xUaXBVbmRlciIpIHwgaHRtbCAlXSIgWyUgRGF0YS5Ub29sVGlwVW5kZXJDaGVja2VkIHwgaHRtbCAlXSB2YWx1ZT0iMSIgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+DQoNCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkQWRkIikgJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEhlYWRsaW5lQWRkIikgJV0NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEhlYWRsaW5lSGVhZGVyQWRkIikgJV0NCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSGVhZGxpbmUgYXNzaWduIikgfCBodG1sICVdPC9oMj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkSGVhZGxpbmVIZWFkZXJBZGQiKSAlXQ0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEhlYWRsaW5lSGVhZGVyRWRpdCIpICVdDQogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkhlYWRsaW5lIGVkaXQiKSB8IGh0bWwgJV0gPGEgdGl0bGU9Inp1csO8Y2tzZXR6ZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdIj56dXLDvGNrc2V0emVuPC9hPjwvaDI+DQpbJSBSZW5kZXJCbG9ja0VuZCgiRmVsZEhlYWRsaW5lSGVhZGVyRWRpdCIpICVdDQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4NCg0KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iaGVhZGxpbmUiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkhlYWRsaW5lU2F2ZSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVxdWVzdElEIiBpZD0iUmVxdWVzdElEIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXF1ZXN0Rm9ybUlEIiBpZD0iUmVxdWVzdEZvcm1JRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdEZvcm1JRCB8IGh0bWwgJV0iLz4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT3JkZXIiPlslIFRyYW5zbGF0ZSgiT3JkZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPcmRlciIgaWQ9Ik9yZGVyIiB2YWx1ZT0iWyUgRGF0YS5PcmRlciB8IGh0bWwgJV0iIGNsYXNzPSJXNXBjIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmljaFRleHQiPlslIFRyYW5zbGF0ZSgiSGVhZGxpbmUiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IiByb3dzPSIxMCIgY29scz0iNjAiIG5hbWU9IkhlYWRsaW5lIj5bJSBEYXRhLkhlYWRsaW5lIHwgaHRtbCAlXTwvdGV4dGFyZWE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4NCg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgPC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiRmVsZEhlYWRsaW5lQWRkIikgJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmVsZEFkZEJsb2NrIikgJV0NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNGOUUyRTIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGZWxkSGVhZGVyQWRkQmxvY2siKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiWnUgRHJvcGRvd246ICIpIHwgaHRtbCAlXVslIERhdGEuUmVxdWVzdEZvcm1MYWJlbCAlXVslIFRyYW5zbGF0ZSgiIFdlcnQ6ICIpIHwgaHRtbCAlXVslIERhdGEuUmVxdWVzdEZvcm1WYWx1ZVRleHQgJV1bJSBUcmFuc2xhdGUoIiAtIEZlbGQgenVvcmRuZW4iKSB8IGh0bWwgJV0gPGEgdGl0bGU9Inp1csO8Y2tzZXR6ZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdIj56dXLDvGNrc2V0emVuPC9hPjwvaDI+DQpbJSBSZW5kZXJCbG9ja0VuZCgiRmVsZEhlYWRlckFkZEJsb2NrIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIkZlbGRIZWFkZXJFZGl0QmxvY2siKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiWnUgRHJvcGRvd246ICIpIHwgaHRtbCAlXVslIERhdGEuUmVxdWVzdEZvcm1MYWJlbCAlXVslIFRyYW5zbGF0ZSgiIFdlcnQ6ICIpIHwgaHRtbCAlXVslIERhdGEuUmVxdWVzdEZvcm1WYWx1ZVRleHQgJV1bJSBUcmFuc2xhdGUoIiAtIEZlbGQgYmVhcmJlaXRlbiIpIHwgaHRtbCAlXSA8YSB0aXRsZT0ienVyw7xja3NldHplbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV0iPnp1csO8Y2tzZXR6ZW48L2E+PC9oMj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkSGVhZGVyRWRpdEJsb2NrIikgJV0NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0Y5RTJFMiI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJuZXdmaWVsZGJsb2NrIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkZpZWxkc1NhdmVCbG9jayIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RJRCIgaWQ9IlJlcXVlc3RJRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RGb3JtQmxvY2tJRCIgaWQ9IlJlcXVlc3RGb3JtQmxvY2tJRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdEZvcm1CbG9ja0lEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RGb3JtSUQiIGlkPSJSZXF1ZXN0Rm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0Rm9ybUlEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RGb3JtVmFsdWVJRCIgaWQ9IlJlcXVlc3RGb3JtVmFsdWVJRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdEZvcm1WYWx1ZUlEIHwgaHRtbCAlXSIvPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgQWRtaW5SZXF1ZXN0SW50ZXJuYWxMaXN0QWRkT0ZPUksiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkZlbGRJREJsb2NrIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiTmV3IEZpZWxkIikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmV1ZXNGZWxkU3RyZyAlXTxiciAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmVsZElEQmxvY2tFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGZWxkSURCbG9ja1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik9yZGVyQmxvY2siPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJPcmRlciIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3JkZXJCbG9jayIgaWQ9Ik9yZGVyQmxvY2siIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCIgdmFsdWU9IlslIERhdGEuT3JkZXJCbG9jayB8IGh0bWwgJV0iIGNsYXNzPSJXNXBjIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPcmRlckJsb2NrRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iT3JkZXJCbG9ja1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJWYWxpZElEQmxvY2siPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJWYWxpZCIpIHwgaHRtbCAlXTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkT3B0aW9uU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVmFsaWRJREJsb2NrRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVmFsaWRJREJsb2NrU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJlcXVpcmVkRmllbGRCbG9jayI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlJlcXVpcmVkIGZpZWxkIikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWlyZWRGaWVsZEJsb2NrU3RyZyAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmVxdWlyZWRGaWVsZEJsb2NrRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmVxdWlyZWRGaWVsZEJsb2NrU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik1vdmVPdmVyQmxvY2siPlslIFRyYW5zbGF0ZSgiVG9vbC1UaXAgLyBNb3ZlLU92ZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJNb3ZlT3ZlckJsb2NrIiBjbGFzcz0iVzUwcGMiIHJvd3M9IjMiIGNvbHM9IjYwIiBuYW1lPSJNb3ZlT3ZlckJsb2NrIj5bJSBEYXRhLk1vdmVPdmVyQmxvY2sgfCBodG1sICVdPC90ZXh0YXJlYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkQWRkQmxvY2siKSAlXQ0KDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIkZlbGRIZWFkbGluZUJsb2NrQWRkIikgJV0NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRjlFMkUyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+DQoNClslIFJlbmRlckJsb2NrU3RhcnQoIkZlbGRIZWFkbGluZUhlYWRlckJsb2NrQWRkIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJIZWFkbGluZSBhc3NpZ24iKSB8IGh0bWwgJV08L2gyPg0KWyUgUmVuZGVyQmxvY2tFbmQoIkZlbGRIZWFkbGluZUhlYWRlckJsb2NrQWRkIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIkZlbGRIZWFkbGluZUhlYWRlckJsb2NrRWRpdCIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSGVhZGxpbmUgZWRpdCIpIHwgaHRtbCAlXSA8YSB0aXRsZT0ienVyw7xja3NldHplbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV0iPnp1csO8Y2tzZXR6ZW48L2E+PC9oMj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkSGVhZGxpbmVIZWFkZXJCbG9ja0VkaXQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNGOUUyRTIiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImhlYWRsaW5lYmxvY2siIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJIZWFkbGluZVNhdmVCbG9jayIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXF1ZXN0SUQiIGlkPSJSZXF1ZXN0SUQiIHZhbHVlPSJbJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV0iLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVxdWVzdEZvcm1CbG9ja0lEIiBpZD0iUmVxdWVzdEZvcm1CbG9ja0lEIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0Rm9ybUJsb2NrSUQgfCBodG1sICVdIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RGb3JtSUQiIGlkPSJSZXF1ZXN0Rm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0Rm9ybUlEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXF1ZXN0Rm9ybVZhbHVlSUQiIGlkPSJSZXF1ZXN0Rm9ybVZhbHVlSUQiIHZhbHVlPSJbJSBEYXRhLlJlcXVlc3RGb3JtVmFsdWVJRCB8IGh0bWwgJV0iLz4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBBZG1pblJlcXVlc3RJbnRlcm5hbExpc3RIZWFkbGluZUFkZE9GT1JLIj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT3JkZXIiPlslIFRyYW5zbGF0ZSgiT3JkZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3JkZXJCbG9jayIgaWQ9Ik9yZGVyQmxvY2siIHZhbHVlPSJbJSBEYXRhLk9yZGVyQmxvY2sgfCBodG1sICVdIiBjbGFzcz0iVzVwYyIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0Ij5bJSBUcmFuc2xhdGUoIkhlYWRsaW5lIikgfCBodG1sICVdOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0QmxvY2siIGNsYXNzPSJSaWNoVGV4dCIgcm93cz0iMTAiIGNvbHM9IjYwIiBuYW1lPSJIZWFkbGluZUJsb2NrIj5bJSBEYXRhLkhlYWRsaW5lQmxvY2sgfCBodG1sICVdPC90ZXh0YXJlYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJGZWxkSGVhZGxpbmVCbG9ja0FkZCIpICVdDQoNClslIFJlbmRlckJsb2NrRW5kKCJSZXF1ZXN0RWRpdCIpICVdDQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0NCg0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0ZpZWxkc0xpc3QiKSAlXQ0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0OiAiKSB8IGh0bWwgJV1bJSBEYXRhLlJlcXVlc3ROYW1lIHwgaHRtbCAlXTwvaDI+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iT3JkZXJFZGl0Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcXVlc3RJRCIgaWQ9IlJlcXVlc3RJRCIgdmFsdWU9IlslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXNzaW9uTmFtZSIgaWQ9IlNlc3Npb25OYW1lIiB2YWx1ZT0iWyUgRW52KCJTZXNzaW9uTmFtZSIpIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXNzaW9uSUQiIGlkPSJTZXNzaW9uSUQiIHZhbHVlPSJbJSBFbnYoIlNlc3Npb25JRCIpIHwgaHRtbCAlXSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBUYWJsZUxpa2VSZXF1ZXN0T0ZPUksgQWRtaW5SZXF1ZXN0Rm9ybVJlc3VsdGluZ09GT1JLIj4NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0RmllbGRzUm93IikgJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0RmllbGRzTXVsdGlzZWxlY3RSZXF1aXJlZCIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlslIERhdGEudW5ndWVsdGlnIHwgaHRtbCAlXTwvc3Bhbj4gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVG9vbFRpcCB8IGh0bWwgJV0iPlslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV06PC9zcGFuPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZE5hbWVTdHJnICVdPGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNNdWx0aXNlbGVjdFJlcXVpcmVkIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc011bHRpc2VsZWN0IikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+WyUgRGF0YS51bmd1ZWx0aWcgfCBodG1sICVdPC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Ub29sVGlwIHwgaHRtbCAlXSI+WyUgRGF0YS5GaWVsZExhYmVsaW5nIHwgaHRtbCAlXTo8L3NwYW4+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkTmFtZVN0cmcgJV08YSBjbGFzcz0iZmEgZmEtcmVmcmVzaCIgdGl0bGU9ImJlYXJiZWl0ZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3JkZXJbJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdIiBpZD0iT3JkZXJbJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5PcmRlciB8IGh0bWwgJV0iIHNpemU9IjEiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iSWNvbk5vdFJlYWR5IiB0aXRsZT0ibMO2c2NoZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RmllbGREZWxldGU7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNNdWx0aXNlbGVjdCIpICVdDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc0Ryb3Bkb3duUmVxdWlyZWQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5bJSBEYXRhLnVuZ3VlbHRpZyB8IGh0bWwgJV08L3NwYW4+IDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRvb2xUaXAgfCBodG1sICVdIj5bJSBEYXRhLkZpZWxkTGFiZWxpbmcgfCBodG1sICVdOjwvc3Bhbj48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGROYW1lU3RyZyAlXTxhIGNsYXNzPSJmYSBmYS1yZWZyZXNoIiB0aXRsZT0iYmVhcmJlaXRlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIGlkPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLk9yZGVyIHwgaHRtbCAlXSIgc2l6ZT0iMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJJY29uTm90UmVhZHkiIHRpdGxlPSJsw7ZzY2hlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RGaWVsZERlbGV0ZTtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdTmV3TGluayI+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWw0KICAgICQoJyNbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBTZWxlY3RlZElEICAgPSAkKCIjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIikudmFsKCk7DQogICAgICAgIHZhciBTZWxlY3RlZFRleHQgPSAkKCIjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIG9wdGlvbjpzZWxlY3RlZCIpLnRleHQoKTsNCiAgICAgICAgdmFyIE5ld0xpbms7DQogICAgICAgIGlmICggU2VsZWN0ZWRJRCApIHsNCiAgICAgICAgICAgIE5ld0xpbmsgPSAnPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdO1JlcXVlc3RGb3JtVmFsdWVJRD0nK1NlbGVjdGVkSUQrJztSZXF1ZXN0Rm9ybVZhbHVlVGV4dD0nK1NlbGVjdGVkVGV4dCsnO1JlcXVlc3RGb3JtQmVzY2hyaWZ0dW5nPVslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV0iPlp3aXNjaGVubGlzdGUgZGF6dTwvYT4nOw0KDQogICAgICAgIHZhciBTZXNzaW9uTmFtZSA9ICQoJ2lucHV0I1Nlc3Npb25OYW1lJykudmFsKCk7DQogICAgICAgIHZhciBTZXNzaW9uSUQgPSAkKCdpbnB1dCNTZXNzaW9uSUQnKS52YWwoKTsNCiAgICAgICAgdmFyIG5ld19uYW1lcyA9IFNlc3Npb25OYW1lICsgIj0iICsgU2Vzc2lvbklEOw0KDQogICAgICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgICAgIHR5cGU6ICAgICAnUG9zdCcsDQogICAgICAgICAgICAgICAgdXJsOiAgICAgICdpbmRleC5wbD8nICsgbmV3X25hbWVzLA0KICAgICAgICAgICAgICAgIGRhdGE6DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICAgICdBZG1pblJlcXVlc3RGb3JtQmxvY2snLA0KICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdTaG93QmxvY2snLA0KICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQ6IFslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXSwNCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA6IFslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0sDQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtVmFsdWVJRCA6IFNlbGVjdGVkSUQsDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdodG1sJywNCiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihSZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICAkKCcjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdQmxvY2tIVE1MJykuaHRtbChSZXNwb25zZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBOZXdMaW5rID0gJyc7DQogICAgICAgICAgICAkKCcjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdQmxvY2tIVE1MJykuaHRtbCgnJyk7DQogICAgICAgIH0NCiAgICAgICAgJCgic3BhbiNbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1OZXdMaW5rIikuaHRtbChOZXdMaW5rKTsNCiAgICB9KTsNCi8vXV0+PC9zY3JpcHQ+DQpbJSBFTkQgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdQmxvY2tIVE1MIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MzAwcHg7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweDsiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0RmllbGRzRHJvcGRvd25SZXF1aXJlZCIpICVdDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RGaWVsZHNEcm9wZG93biIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlslIERhdGEudW5ndWVsdGlnIHwgaHRtbCAlXTwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVG9vbFRpcCB8IGh0bWwgJV0iPlslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV06PC9zcGFuPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZE5hbWVTdHJnICVdPGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1OZXdMaW5rIj48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWw0KICAgICQoJyNbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBTZWxlY3RlZElEICAgPSAkKCIjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIikudmFsKCk7DQogICAgICAgIHZhciBTZWxlY3RlZFRleHQgPSAkKCIjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIG9wdGlvbjpzZWxlY3RlZCIpLnRleHQoKTsNCiAgICAgICAgdmFyIE5ld0xpbms7DQogICAgICAgIGlmICggU2VsZWN0ZWRJRCApIHsNCiAgICAgICAgICAgIE5ld0xpbmsgPSAnPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdO1JlcXVlc3RGb3JtVmFsdWVJRD0nK1NlbGVjdGVkSUQrJztSZXF1ZXN0Rm9ybVZhbHVlVGV4dD0nK1NlbGVjdGVkVGV4dCsnO1JlcXVlc3RGb3JtQmVzY2hyaWZ0dW5nPVslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV0iPlp3aXNjaGVubGlzdGUgZGF6dTwvYT4nOw0KDQogICAgICAgIHZhciBTZXNzaW9uTmFtZSA9ICQoJ2lucHV0I1Nlc3Npb25OYW1lJykudmFsKCk7DQogICAgICAgIHZhciBTZXNzaW9uSUQgPSAkKCdpbnB1dCNTZXNzaW9uSUQnKS52YWwoKTsNCiAgICAgICAgdmFyIG5ld19uYW1lcyA9IFNlc3Npb25OYW1lICsgIj0iICsgU2Vzc2lvbklEOw0KDQogICAgICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgICAgIHR5cGU6ICAgICAnUG9zdCcsDQogICAgICAgICAgICAgICAgdXJsOiAgICAgICdpbmRleC5wbD8nICsgbmV3X25hbWVzLA0KICAgICAgICAgICAgICAgIGRhdGE6DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICAgICdBZG1pblJlcXVlc3RGb3JtQmxvY2snLA0KICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdTaG93QmxvY2snLA0KICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUQ6IFslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXSwNCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEZvcm1JRCA6IFslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0sDQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RGb3JtVmFsdWVJRCA6IFNlbGVjdGVkSUQsDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdodG1sJywNCiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihSZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICAkKCcjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdQmxvY2tIVE1MJykuaHRtbChSZXNwb25zZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBOZXdMaW5rID0gJyc7DQogICAgICAgICAgICAkKCcjWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdQmxvY2tIVE1MJykuaHRtbCgpOw0KICAgICAgICB9DQogICAgICAgICQoInNwYW4jWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdTmV3TGluayIpLmh0bWwoTmV3TGluayk7DQogICAgfSk7DQovL11dPjwvc2NyaXB0Pg0KWyUgRU5EICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXUJsb2NrSFRNTCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjMwMHB4O21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNEcm9wZG93biIpICVdDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3RmllbGRzRHJvcCIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiIGlkPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3RmllbGRzRHJvcCIpICVdDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc1RleHRSZXF1aXJlZCIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlslIERhdGEudW5ndWVsdGlnIHwgaHRtbCAlXTwvc3Bhbj4gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVG9vbFRpcCB8IGh0bWwgJV0iPlslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV06PC9zcGFuPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuRmVsZFN0YW5kYXJkd2VydCB8IGh0bWwgJV0iPjxhIGNsYXNzPSJmYSBmYS1yZWZyZXNoIiB0aXRsZT0iYmVhcmJlaXRlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIGlkPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLk9yZGVyIHwgaHRtbCAlXSIgc2l6ZT0iMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJJY29uTm90UmVhZHkiIHRpdGxlPSJsw7ZzY2hlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RGaWVsZERlbGV0ZTtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0RmllbGRzVGV4dFJlcXVpcmVkIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc1RleHQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5bJSBEYXRhLnVuZ3VlbHRpZyB8IGh0bWwgJV08L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRvb2xUaXAgfCBodG1sICVdIj5bJSBEYXRhLkZpZWxkTGFiZWxpbmcgfCBodG1sICVdOjwvc3Bhbj48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLkZlbGRTdGFuZGFyZHdlcnQgfCBodG1sICVdIi8+PGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0RmllbGRzVGV4dCIpICVdDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc1RleHRBcmVhUmVxdWlyZWQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5bJSBEYXRhLnVuZ3VlbHRpZyB8IGh0bWwgJV08L3NwYW4+IDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRvb2xUaXAgfCBodG1sICVdIj5bJSBEYXRhLkZpZWxkTGFiZWxpbmcgfCBodG1sICVdOjwvc3Bhbj48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIiByb3dzPSJbJSBEYXRhLkZlbGRSb3dzIHwgaHRtbCAlXSIgY29scz0iWyUgRGF0YS5GZWxkQ29scyB8IGh0bWwgJV0iIG5hbWU9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSI+WyUgRGF0YS5GZWxkU3RhbmRhcmR3ZXJ0IHwgaHRtbCAlXTwvdGV4dGFyZWE+PGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNUZXh0QXJlYVJlcXVpcmVkIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc1RleHRBcmVhIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+WyUgRGF0YS51bmd1ZWx0aWcgfCBodG1sICVdPC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Ub29sVGlwIHwgaHRtbCAlXSI+WyUgRGF0YS5GaWVsZExhYmVsaW5nIHwgaHRtbCAlXTo8L3NwYW4+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSIgcm93cz0iWyUgRGF0YS5GZWxkUm93cyB8IGh0bWwgJV0iIGNvbHM9IlslIERhdGEuRmVsZENvbHMgfCBodG1sICVdIiBuYW1lPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuRmVsZFN0YW5kYXJkd2VydCB8IGh0bWwgJV08L3RleHRhcmVhPjxhIGNsYXNzPSJmYSBmYS1yZWZyZXNoIiB0aXRsZT0iYmVhcmJlaXRlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIGlkPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLk9yZGVyIHwgaHRtbCAlXSIgc2l6ZT0iMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJJY29uTm90UmVhZHkiIHRpdGxlPSJsw7ZzY2hlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RGaWVsZERlbGV0ZTtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TGlzdEZpZWxkc1RleHRBcmVhIikgJV0NCg0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0RmllbGRzQ2hlY2tib3hSZXF1aXJlZCIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPlslIERhdGEudW5ndWVsdGlnIHwgaHRtbCAlXTwvc3Bhbj4gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuVG9vbFRpcCB8IGh0bWwgJV0iPlslIERhdGEuRmllbGRMYWJlbGluZyB8IGh0bWwgJV06PC9zcGFuPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLkZlbGRTdGFuZGFyZHdlcnQgfCBodG1sICVdIiBbJSBEYXRhLkZlbGRDaGVja2VkIHwgaHRtbCAlXS8+PGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkZpZWxkTmFtZSB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNDaGVja2JveFJlcXVpcmVkIikgJV0NClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc0NoZWNrYm94IikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+WyUgRGF0YS51bmd1ZWx0aWcgfCBodG1sICVdPC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Ub29sVGlwIHwgaHRtbCAlXSI+WyUgRGF0YS5GaWVsZExhYmVsaW5nIHwgaHRtbCAlXTo8L3NwYW4+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuRmVsZFN0YW5kYXJkd2VydCB8IGh0bWwgJV0iIFslIERhdGEuRmVsZENoZWNrZWQgfCBodG1sICVdLz48YSBjbGFzcz0iZmEgZmEtcmVmcmVzaCIgdGl0bGU9ImJlYXJiZWl0ZW4iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblJlcXVlc3RGb3JtO1N1YmFjdGlvbj1SZXF1ZXN0RWRpdDtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IlJlcXVlc3RGaWVsZE9yZGVyT0ZPUksiIHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0RmllbGRzQ2hlY2tib3giKSAlXQ0KDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RGaWVsZHNEYXRlUmVxdWlyZWQiKSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdIj48c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5bJSBEYXRhLnVuZ3VlbHRpZyB8IGh0bWwgJV08L3NwYW4+IDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRvb2xUaXAgfCBodG1sICVdIj5bJSBEYXRhLkZpZWxkTGFiZWxpbmcgfCBodG1sICVdOjwvc3Bhbj48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGROYW1lU3RyaW5nICVdPGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgaWQ9Ik9yZGVyWyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuT3JkZXIgfCBodG1sICVdIiBzaXplPSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ikljb25Ob3RSZWFkeSIgdGl0bGU9ImzDtnNjaGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEZpZWxkRGVsZXRlO1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9hPiBbJSBEYXRhLlN0YXJ0RGF0dW1DaGVja2VkIHwgaHRtbCAlXVslIERhdGEuV3ZsRGF0dW1DaGVja2VkIHwgaHRtbCAlXVslIERhdGEuT25lWWVhckNoZWNrZWQgfCBodG1sICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5GaWVsZE5hbWUgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TGlzdEZpZWxkc0RhdGVSZXF1aXJlZCIpICVdDQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RGaWVsZHNEYXRlIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuRmllbGROYW1lIHwgaHRtbCAlXSI+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+WyUgRGF0YS51bmd1ZWx0aWcgfCBodG1sICVdPC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Ub29sVGlwIHwgaHRtbCAlXSI+WyUgRGF0YS5GaWVsZExhYmVsaW5nIHwgaHRtbCAlXTo8L3NwYW4+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkTmFtZVN0cmluZyAlXTxhIGNsYXNzPSJmYSBmYS1yZWZyZXNoIiB0aXRsZT0iYmVhcmJlaXRlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RFZGl0O1JlcXVlc3RJRD1bJSBEYXRhLlJlcXVlc3RJRCB8IGh0bWwgJV07UmVxdWVzdEZvcm1JRD1bJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdOyI+Jm5ic3A7Jm5ic3A7PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIGlkPSJPcmRlclslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLk9yZGVyIHwgaHRtbCAlXSIgc2l6ZT0iMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJJY29uTm90UmVhZHkiIHRpdGxlPSJsw7ZzY2hlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RGaWVsZERlbGV0ZTtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4gWyUgRGF0YS5TdGFydERhdHVtQ2hlY2tlZCB8IGh0bWwgJV1bJSBEYXRhLld2bERhdHVtQ2hlY2tlZCB8IGh0bWwgJV1bJSBEYXRhLk9uZVllYXJDaGVja2VkIHwgaHRtbCAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+DQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0RmllbGRzRGF0ZSIpICVdDQoNClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc0hlYWRsaW5lIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxpZ2h0Um93IEhlYWRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5IZWFkbGluZSAlXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRGVzY3JpcHRpb24gJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImZhIGZhLXJlZnJlc2giIHRpdGxlPSJiZWFyYmVpdGVuIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWRtaW5SZXF1ZXN0Rm9ybTtTdWJhY3Rpb249UmVxdWVzdEVkaXQ7UmVxdWVzdElEPVslIERhdGEuUmVxdWVzdElEIHwgaHRtbCAlXTtSZXF1ZXN0Rm9ybUlEPVslIERhdGEuRmVsZEFrdHVlbGxJRCB8IGh0bWwgJV07Ij4mbmJzcDsmbmJzcDs8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3JkZXJbJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdIiBpZD0iT3JkZXJbJSBEYXRhLkZlbGRBa3R1ZWxsSUQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5PcmRlciB8IGh0bWwgJV0iIHNpemU9IjEiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJJY29uTm90UmVhZHkiIHRpdGxlPSJsw7ZzY2hlbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluUmVxdWVzdEZvcm07U3ViYWN0aW9uPVJlcXVlc3RGaWVsZERlbGV0ZTtSZXF1ZXN0SUQ9WyUgRGF0YS5SZXF1ZXN0SUQgfCBodG1sICVdO1JlcXVlc3RGb3JtSUQ9WyUgRGF0YS5GZWxkQWt0dWVsbElEIHwgaHRtbCAlXTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNIZWFkbGluZSIpICVdDQoNClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNSb3ciKSAlXQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4NClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdEZpZWxkc1JlcXVlc3RGb3JtSURzIikgJV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXF1ZXN0Rm9ybUlEcyIgaWQ9IlJlcXVlc3RGb3JtSURzIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0Rm9ybUlEcyB8IGh0bWwgJV0iLz4NClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RGaWVsZHNSZXF1ZXN0Rm9ybUlEcyIpICVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJPcmRlciBlZGl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIk9yZGVyIGVkaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3RmllbGRzTGlzdCIpICVdDQo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlQWRkLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VBZGQudHQsdiAxLjMgMjAxOS8wNy8zMSAwOToyMTo1MiB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJBZGQgQ2hhbmdlIikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIklUU00gQ2hhbmdlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBpZD0iQ2hhbmdlRm9ybSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiICB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiICAgIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iQ2hhbmdlVGl0bGUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNoYW5nZVRpdGxlIiBpZD0iQ2hhbmdlVGl0bGUiIHZhbHVlPSJbJSBEYXRhLkNoYW5nZVRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuQ2hhbmdlVGl0bGVUaXRsZVNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNoYW5nZVRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2hhbmdlVGl0bGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0MSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQxIiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5EZXNjcmlwdGlvbkludmFsaWQgJV0iIG5hbWU9IkRlc2NyaXB0aW9uIiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHQxRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHQxU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkp1c3RpZmljYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCBGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0MiIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuSnVzdGlmaWNhdGlvbkludmFsaWQgJV0iIG5hbWU9Ikp1c3RpZmljYXRpb24iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkp1c3RpZmljYXRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0MkVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0MlNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhdGVnb3J5SUQiPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYXRlZ29yeVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2F0ZWdvcnlJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnB1dCBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW1wYWN0SUQiPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW1wYWN0U2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJbXBhY3RJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnB1dCBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQcmlvcml0eUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIklucHV0IGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVxdWVzdGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJlcXVlc3RlZCBEYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWVzdGVkVGltZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmVxdWVzdGVkVGltZURheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmVxdWVzdGVkVGltZUhvdXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVxdWVzdGVkVGltZUdlbmVyaWNTZXJ2ZXJFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZXF1ZXN0ZWRUaW1lRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZXF1ZXN0ZWRUaW1lSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVxdWVzdGVkVGltZUdlbmVyaWNTZXJ2ZXJFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSZXF1ZXN0ZWRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50cyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZG1pbklUU01Db25maWdJdGVtQWRkU29mdHdhcmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0F0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudFVwbG9hZCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdENoYW5nZUFkZCIgbmFtZT0iQ2hhbmdlQWRkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyNTozMCB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJBZGQgQ2hhbmdlIikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlNlbGVjdCBDaGFuZ2UgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9InRlbXBsYXRlIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNyZWF0ZUZyb21UZW1wbGF0ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNoYW5nZUlEIiAgdmFsdWU9IlslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiICB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZU9GT1JLIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRlbXBsYXRlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UZW1wbGF0ZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJNb3ZlVGltZVR5cGUiPlslIFRyYW5zbGF0ZSgiVGltZSB0eXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJNb3ZlVGltZVR5cGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lIHR5cGUuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmV3IHRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Nb3ZlVGltZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdEFkZFRlbXBsYXRlIiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgbmFtZT0iQWRkVGVtcGxhdGUiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgICAgdmFsdWU9IkFkZFRlbXBsYXRlIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICAgICB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV0iIC8+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICA8aDEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2F2ZSBDaGFuZ2UgQ0FCIGFzIHRlbXBsYXRlIikgfCBodG1sICVdIDogWyUgQ29uZmlnKCJJVFNNQ2hhbmdlOjpIb29rIikgJV06IFslIERhdGEuQ2hhbmdlTnVtYmVyICVdIFslIERhdGEuQ2hhbmdlVGl0bGUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2F2ZSBDaGFuZ2UgQ0FCIGFzIHRlbXBsYXRlIikgfCBodG1sICVdIDogWyUgQ29uZmlnKCJJVFNNQ2hhbmdlOjpIb29rIikgJV06IFslIERhdGEuQ2hhbmdlTnVtYmVyICVdIFslIERhdGEuQ2hhbmdlVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgIDwvaDE+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiZ28gdG8gaW52b2x2ZWQgcGVyc29ucyBzY3JlZW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgU3BhY2luZ0JvdHRvbSI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGVtcGxhdGVOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRlbXBsYXRlIE5hbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJUZW1wbGF0ZU5hbWUiIHR5cGU9InRleHQiIG5hbWU9IlRlbXBsYXRlTmFtZSIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVOYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuVGVtcGxhdGVOYW1lU2VydmVyRXJyb3IgJV0iLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZU5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBOYW1lIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+IFslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNvbW1lbnQiIHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPiBbJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBpZD0iU3VibWl0QWRkVGVtcGxhdGUiIG5hbWU9IkFkZFRlbXBsYXRlIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZm9ybT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiIHZhbHVlPSJbJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZGl0aW9uSUQiIHZhbHVlPSJbJSBEYXRhLkNvbmRpdGlvbklEIHwgaHRtbCAlXSIvPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPdmVydmlldyIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKCJDb25kaXRpb25zIGFuZCBBY3Rpb25zIikgfCBodG1sICVdIDogWyUgQ29uZmlnKCJJVFNNQ2hhbmdlOjpIb29rIikgJV06IFslIERhdGEuQ2hhbmdlTnVtYmVyIHwgaHRtbCAlXSBbJSBEYXRhLkNoYW5nZVRpdGxlIHwgdHJ1bmNhdGUoNzApIHwgaHRtbCAlXQogICAgICAgICAgICA8L2gxPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNvbmRpdGlvbnMgYW5kIEFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ilc1MHBjIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1JvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgWyUgSUYgRGF0YS5WYWxpZElEICE9IDElXWNsYXNzPSJJbnZhbGlkIlslIEVORCAlXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV07Q29uZGl0aW9uSUQ9WyUgRGF0YS5Db25kaXRpb25JRCB8IHVyaSAlXSIgY2xhc3M9IkFzQmxvY2siPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgVHJhbnNsYXRlKERhdGEuQ29tbWVudCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+WyUgVHJhbnNsYXRlKERhdGEuVmFsaWQpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV07Q29uZGl0aW9uSUQ9WyUgRGF0YS5Db25kaXRpb25JRCB8IHVyaSAlXTtEZWxldGVDb25kaXRpb25JRDo6WyUgRGF0YS5Db25kaXRpb25JRCB8IHVyaSAlXT1EZWxldGUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IkRlbGV0ZUNvbmRpdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIENvbmRpdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGF5b3V0R3JpZCBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXMTAwcGMgUmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBuZXcgY29uZGl0aW9uIikgfCBodG1sICVdIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV0iIG5hbWU9IkFkZENvbmRpdGlvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyI+PHNwYW4+WyUgVHJhbnNsYXRlKCJBZGQgbmV3IGNvbmRpdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC50dCx2IDEuMyAyMDE5LzA3LzMxIDA5OjIyOjA4IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGlkPSJOZXdDb25kaXRpb24iIG5hbWU9Ik5ld0NvbmRpdGlvbiIgY2xhc3M9IlZhbGlkYXRlIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNoYW5nZUlEIiB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNvbmRpdGlvbklEIiB2YWx1ZT0iWyUgRGF0YS5Db25kaXRpb25JRCB8IGh0bWwgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkRlbGV0ZUV4cHJlc3Npb25JRCIgaWQ9IkRlbGV0ZUV4cHJlc3Npb25JRCIgdmFsdWU9IiIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRGVsZXRlQWN0aW9uSUQiIGlkPSJEZWxldGVBY3Rpb25JRCIgdmFsdWU9IiIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWRkRXhwcmVzc2lvbiIgYXV0b2NvbXBsZXRlPSJvZmYiIGlkPSJBZGRFeHByZXNzaW9uIiB2YWx1ZT0iIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBZGRBY3Rpb24iIGF1dG9jb21wbGV0ZT0ib2ZmIiBpZD0iQWRkQWN0aW9uIiB2YWx1ZT0iIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTYXZlIiBhdXRvY29tcGxldGU9Im9mZiIgaWQ9IlNhdmUiIHZhbHVlPSIiLz4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRWRpdCBDb25kaXRpb24iKSB8IGh0bWwgJV06IFslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdOiBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0gWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9oMT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDb25kaXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwgQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdE9GT1JLIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTmFtZSIgbmFtZT0iTmFtZSIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLkludmFsaWROYW1lIHwgaHRtbCAlXSBbJSBEYXRhLkR1cGxpY2F0ZU5hbWUgfCBodG1sICVdIiBtYXhsZW5ndGg9IjI1MCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIk5lZWQgYSB2YWxpZCBuYW1lLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE5hbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJBIHZhbGlkIG5hbWUgaXMgbmVlZGVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWROYW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHVwbGljYXRlTmFtZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkR1cGxpY2F0ZSBuYW1lOiIpIHwgaHRtbCAlXSAnWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScuIFslIFRyYW5zbGF0ZSgiVGhpcyBuYW1lIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNvbmRpdGlvbi4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEdXBsaWNhdGVOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk1hdGNoaW5nIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkV4cHJlc3Npb25Db25qdW5jdGlvbiIgdHlwZT0icmFkaW8iIHZhbHVlPSJhbnkiIFslIERhdGEuYW55c2VsZWN0ZWQgJV0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiQW55IGV4cHJlc3Npb24gKE9SKSIpIHwgaHRtbCAlXSIvPiBbJSBUcmFuc2xhdGUoIkFueSBleHByZXNzaW9uIChPUikiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJFeHByZXNzaW9uQ29uanVuY3Rpb24iIHR5cGU9InJhZGlvIiB2YWx1ZT0iYWxsIiBbJSBEYXRhLmFsbHNlbGVjdGVkICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFsbCBleHByZXNzaW9ucyAoQU5EKSIpIHwgaHRtbCAlXSIvPiBbJSBUcmFuc2xhdGUoIkFsbCBleHByZXNzaW9ucyAoQU5EKSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNvbW1lbnQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iMjUwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkV4cHJlc3Npb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIERhdGFUYWJsZU5vSGlnaGxpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzE1cGMiPlslIFRyYW5zbGF0ZSgiT2JqZWN0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIlNlbGVjdG9yIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIkF0dHJpYnV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+WyUgVHJhbnNsYXRlKCJPcGVyYXRvciIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+WyUgVHJhbnNsYXRlKCJWYWx1ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNXBjIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cHJlc3Npb25PdmVydmlld1JvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRPYmplY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLk9iamVjdE9wdGlvblN0cmluZyAlXTwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50T2JqZWN0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRTZWxlY3RvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuU2VsZWN0b3JPcHRpb25TdHJpbmcgJV08L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudFNlbGVjdG9yIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRBdHRyaWJ1dGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkF0dHJpYnV0ZU9wdGlvblN0cmluZyAlXTwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50QXR0cmlidXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5PcGVyYXRvck9wdGlvblN0cmluZyAlXTwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50T3BlcmF0b3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXhwcmVzc2lvbklELVslIERhdGEuRXhwcmVzc2lvbklEIHwgaHRtbCAlXS1Db21wYXJlVmFsdWUtRGl2Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVRleHQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJFeHByZXNzaW9uSUQtWyUgRGF0YS5FeHByZXNzaW9uSUQgfCBodG1sICVdLUNvbXBhcmVWYWx1ZSIgbmFtZT0iRXhwcmVzc2lvbklELVslIERhdGEuRXhwcmVzc2lvbklEIHwgaHRtbCAlXS1Db21wYXJlVmFsdWUiIHZhbHVlPSJbJSBEYXRhLkNvbXBhcmVWYWx1ZSB8IGh0bWwgJV0iIGNsYXNzPSJXMTAwcGMiIG1heGxlbmd0aD0iMjUwIiAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVRleHQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50Q29tcGFyZVZhbHVlU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWVPcHRpb25TdHJpbmcgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRDb21wYXJlVmFsdWVTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkRlbGV0ZUV4cHJlc3Npb24iIGlkPSJEZWxldGVFeHByZXNzaW9uSUQtWyUgRGF0YS5FeHByZXNzaW9uSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSBFeHByZXNzaW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUgRXhwcmVzc2lvbiIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cHJlc3Npb25PdmVydmlld1Jvd05vRGF0YSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIEV4cHJlc3Npb25zIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwcmVzc2lvbk92ZXJ2aWV3Um93Tm9EYXRhIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVzEwMHBjIFJpZ2h0IFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgbmV3IGV4cHJlc3Npb24iKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkFkZCBuZXcgZXhwcmVzc2lvbiIpIHwgaHRtbCAlXSIgbmFtZT0iQWRkRXhwcmVzc2lvbkJ1dHRvbiIgaWQ9IkFkZEV4cHJlc3Npb25CdXR0b24iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiPjxzcGFuPlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBleHByZXNzaW9uIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIERhdGFUYWJsZU5vSGlnaGxpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzE1cGMiPlslIFRyYW5zbGF0ZSgiT2JqZWN0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIlNlbGVjdG9yIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcyMHBjIj5bJSBUcmFuc2xhdGUoIkF0dHJpYnV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+WyUgVHJhbnNsYXRlKCJPcGVyYXRvciIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMjBwYyI+WyUgVHJhbnNsYXRlKCJWYWx1ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNXBjIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50T2JqZWN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5PYmplY3RPcHRpb25TdHJpbmcgJV08L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50T2JqZWN0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLlNlbGVjdG9yT3B0aW9uU3RyaW5nICVdPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudFNlbGVjdG9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QXR0cmlidXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5BdHRyaWJ1dGVPcHRpb25TdHJpbmcgJV08L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QXR0cmlidXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50T3BlcmF0b3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLk9wZXJhdG9yT3B0aW9uU3RyaW5nICVdPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdGlvbklELVslIERhdGEuQWN0aW9uSUQgfCBodG1sICVdLUFjdGlvblZhbHVlLURpdiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlVGV4dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkFjdGlvbklELVslIERhdGEuQWN0aW9uSUQgfCBodG1sICVdLUFjdGlvblZhbHVlIiBuYW1lPSJBY3Rpb25JRC1bJSBEYXRhLkFjdGlvbklEIHwgaHRtbCAlXS1BY3Rpb25WYWx1ZSIgdmFsdWU9IlslIERhdGEuQWN0aW9uVmFsdWUgfCBodG1sICVdIiBjbGFzcz0iVzEwMHBjIiBtYXhsZW5ndGg9IjI1MCIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlVGV4dCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWVPcHRpb25TdHJpbmcgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJEZWxldGVBY3Rpb24iIGlkPSJEZWxldGVBY3Rpb25JRC1bJSBEYXRhLkFjdGlvbklEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgQWN0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUgQWN0aW9uIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlld1JvdyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlld1Jvd05vRGF0YSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIEFjdGlvbnMgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlld1Jvd05vRGF0YSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlcxMDBwYyBSaWdodCBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBhY3Rpb24iKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkFkZCBuZXcgYWN0aW9uIikgfCBodG1sICVdIiBuYW1lPSJBZGRBY3Rpb25CdXR0b24iIGlkPSJBZGRBY3Rpb25CdXR0b24iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiPjxzcGFuPlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBhY3Rpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlNhdmVCdXR0b24iIGlkPSJTYXZlQnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Zvcm0+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlRGVsZXRlLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZURlbGV0ZS50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFczMDBweCI+CiAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBEYXRhLkNoYW5nZVRpdGxlIHwgaHRtbCAlXQogICAgPC9wPgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2ZpZWxkc2V0Pgo8cCBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIiPgogICAgWyUgVHJhbnNsYXRlKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgY2hhbmdlPyIpIHwgaHRtbCAlXQo8L3A+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlRWRpdC50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlRWRpdC50dCx2IDEuMiAyMDE5LzA1LzE5IDE0OjI2OjQyIHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KCiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQgJXMlcyIsIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlcikgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IGh0bWwgJV08L2gxPgogICAgICAgIDxwPgogICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBpZD0iQ2hhbmdlRm9ybSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgICAgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJBZGRJbmZvcm1hdGlvbk9GT1JLIEFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLIj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iQ2hhbmdlVGl0bGUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPiogPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDaGFuZ2VUaXRsZSIgaWQ9IkNoYW5nZVRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLkNoYW5nZVRpdGxlVGl0bGVTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNoYW5nZVRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDaGFuZ2VUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQxIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCBGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQxIiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5EZXNjcmlwdGlvbkludmFsaWQgJV0iIG5hbWU9IkRlc2NyaXB0aW9uIiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dDFFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0MVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0MiI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJKdXN0aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCBGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQyIiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5KdXN0aWZpY2F0aW9uSW52YWxpZCAlXSIgbmFtZT0iSnVzdGlmaWNhdGlvbiIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuSnVzdGlmaWNhdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dDJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0MlNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhdGVnb3J5SUQiPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2F0ZWdvcnlTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYXRlZ29yeUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIklucHV0IGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW1wYWN0SUQiPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkltcGFjdFNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkltcGFjdElEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIklucHV0IGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlByaW9yaXR5SURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW5wdXQgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGFuZ2VTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2hhbmdlU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0ZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNoYW5nZVN0YXRlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW5wdXQgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlU3RhdGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVxdWVzdGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmVxdWVzdGVkIERhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVxdWVzdGVkVGltZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZXF1ZXN0ZWRUaW1lRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlcXVlc3RlZFRpbWVIb3VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlcXVlc3RlZFRpbWVHZW5lcmljU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZXF1ZXN0ZWRUaW1lRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlcXVlc3RlZFRpbWVIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSZXF1ZXN0ZWRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSZXF1ZXN0ZWRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIElOQ0xVREUgIkZvcm1FbGVtZW50cy9BdHRhY2htZW50TGlzdC50dCIgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50VXBsb2FkIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdENoYW5nZUVkaXQiIGFjY2Vzc2tleT0iZyIgbmFtZT0iQ2hhbmdlRWRpdCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VIaXN0b3J5LnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KCiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxoMT4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJIaXN0b3J5IG9mICVzJXMiLCBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIpIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQ2hhbmdlVGl0bGUgfCB0cnVuY2F0ZSg2MCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhpc3RvcnkgQ29udGVudCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQWN0aW9uIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRGV0YWlscyIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVXNlciIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDcmVhdGV0aW1lIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkhpc3RvcnlUeXBlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgRGF0YS5Db250ZW50IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50IHwgdHJ1bmNhdGUoMTAwKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vSGlzdG9yeVpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KWyUgUmVuZGVyQmxvY2tFbmQoIk5vSGlzdG9yeVpvb20iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93SGlzdG9yeVpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNWyUgRGF0YS5ab29tVHlwZSAlXUhpc3Rvcnlab29tO0hpc3RvcnlFbnRyeUlEPVslIERhdGEuSGlzdG9yeUVudHJ5SUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiU2hvdyBkZXRhaWxzIikgfCBodG1sICVdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd0hpc3Rvcnlab29tIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vV29ya09yZGVyWm9vbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQpbJSBSZW5kZXJCbG9ja0VuZCgiTm9Xb3JrT3JkZXJab29tIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2hvd1dvcmtPcmRlclpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlNob3cgd29ya29yZGVyIikgfCBodG1sICVdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd1dvcmtPcmRlclpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSb3ciKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20udHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20udHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgoKICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPgogICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhpc3Rvcnkgb2YgJXMlcyIsIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlcikgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IHRydW5jYXRlKDYwKSB8IGh0bWwgJV0KICAgICAgICA8L2gxPgogICAgICAgIDxwPgogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeTtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgPGEgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRGV0YWlsZWQgaGlzdG9yeSBpbmZvcm1hdGlvbiBvZiAlcyIsIERhdGEuSGlzdG9yeVR5cGUpIHwgaHRtbCAlXTwvaDI+CgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgoKICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTW9kaWZpZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPbGQgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50T2xkICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOZXcgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50TmV3ICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIFslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICA8L2ZpZWxkc2V0PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnMudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyNjo1NyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBjbGFzcz0iVmFsaWRhdGUiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgdmFsdWU9IlslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0IiB2YWx1ZT0iIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWRkQ0FCVGVtcGxhdGUiIHZhbHVlPSIiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJOZXdUZW1wbGF0ZSIgdmFsdWU9IiIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFkZENBQk1lbWJlciIgdmFsdWU9IiIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkRlbGV0ZUNBQk1lbWJlciIgdmFsdWU9IiIgLz4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJFZGl0IEludm9sdmVkIFBlcnNvbnMgb2YgJXMlcyIsIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlcikgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFZGl0IEludm9sdmVkIFBlcnNvbnMgb2YgJXMlcyIsIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlcikgfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9oMT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiSW52b2x2ZWQgUGVyc29ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwgQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDaGFuZ2VNYW5hZ2VyIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkNoYW5nZU1hbmFnZXIiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ2hhbmdlTWFuYWdlciIgbmFtZT0iQ2hhbmdlTWFuYWdlciIgdHlwZT0idGV4dCIgdmFsdWU9IlslIERhdGEuQ2hhbmdlTWFuYWdlciB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLkNoYW5nZU1hbmFnZXJFcnJvciAlXSBVc2VyU2VhcmNoIiBkYXRhLWF1dG9jb21wbGV0ZWdyb3Vwcz0iaXRzbS1jaGFuZ2UtbWFuYWdlciIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ2hhbmdlTWFuYWdlclNlbGVjdGVkIiBuYW1lPSJDaGFuZ2VNYW5hZ2VyU2VsZWN0ZWQiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ2hhbmdlTWFuYWdlcklEIHwgaHRtbCAlXSIgLz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDaGFuZ2VNYW5hZ2VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2hhbmdlTWFuYWdlclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJVc2VyIGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iQ2hhbmdlQnVpbGRlciI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJDaGFuZ2VCdWlsZGVyIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNoYW5nZUJ1aWxkZXIiIG5hbWU9IkNoYW5nZUJ1aWxkZXIiIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkNoYW5nZUJ1aWxkZXIgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5DaGFuZ2VCdWlsZGVyRXJyb3IgJV0gVXNlclNlYXJjaCIgZGF0YS1hdXRvY29tcGxldGVncm91cHM9Iml0c20tY2hhbmdlLWJ1aWxkZXIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNoYW5nZUJ1aWxkZXJTZWxlY3RlZCIgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VCdWlsZGVyU2VsZWN0ZWQiIHZhbHVlPSJbJSBEYXRhLkNoYW5nZUJ1aWxkZXJJRCB8IGh0bWwgJV0iIC8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2hhbmdlQnVpbGRlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNoYW5nZUJ1aWxkZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVXNlciBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgYWNjZXNza2V5PSJnIiBuYW1lPSJTdWJtaXRCdXR0b24iIGlkPSJTdWJtaXRCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgQWR2aXNvcnkgQm9hcmQiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29uc09GT1JLIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNBQlRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVJRCI+IFslIFRyYW5zbGF0ZSgiQ0FCIFRlbXBsYXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNBQlRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBZGRDQUJUZW1wbGF0ZUJ1dHRvbiIgaWQ9IkFkZENBQlRlbXBsYXRlQnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBcHBseSBUZW1wbGF0ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJBcHBseSBUZW1wbGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV3VGVtcGxhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJOZXdUZW1wbGF0ZUJ1dHRvbiIgaWQ9Ik5ld1RlbXBsYXRlQnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJOZXdUZW1wbGF0ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIHRoaXMgQ0FCIGFzIHRlbXBsYXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiTmV3VGVtcGxhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgClslIFJlbmRlckJsb2NrRW5kKCJDQUJUZW1wbGF0ZSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdDQUJNZW1iZXIiPiBbJSBUcmFuc2xhdGUoIkFkZCB0byBDQUIiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iTmV3Q0FCTWVtYmVyIiBuYW1lPSJOZXdDQUJNZW1iZXIiIHR5cGU9InRleHQiICAgdmFsdWU9IlslIERhdGEuTmV3Q0FCTWVtYmVyIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIENBQk1lbWJlclNlYXJjaCBbJSBEYXRhLk5ld0NBQk1lbWJlckVycm9yICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJOZXdDQUJNZW1iZXJTZWxlY3RlZCIgbmFtZT0iTmV3Q0FCTWVtYmVyU2VsZWN0ZWQiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuTmV3Q0FCTWVtYmVySUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJOZXdDQUJNZW1iZXJUeXBlIiBuYW1lPSJOZXdDQUJNZW1iZXJUeXBlIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkNBQk1lbWJlclR5cGUgfCBodG1sICVdIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5ld0NBQk1lbWJlclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJVc2VyIGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgaWQ9IkFkZENBQk1lbWJlckJ1dHRvbiIgbmFtZT0iQWRkQ0FCTWVtYmVyQnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVXNlclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgVXNlciIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgQ0FCIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDQUJNZW1iZXJUYWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJMb2dpbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ0FCTWVtYmVyUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLlVzZXJUeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciBMYXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlslIERhdGEuSW50ZXJuYWxVc2VyVHlwZSAlXS1bJSBEYXRhLlVzZXJJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlRyYXNoQ2FuIERlbGV0ZUNBQk1lbWJlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDQUJNZW1iZXJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJDQUJNZW1iZXJUYWJsZSIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj48L2Rpdj4KICAgIDwvZGl2Pgo8L2Zvcm0+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdOYXZCYXIudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyLnR0LHYgMS4yIDIwMTkvMDYvMDIgMDg6NDc6MjEgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhciIpICVdCjxkaXYgY2xhc3M9Ik92ZXJ2aWV3Qm94IEFSSUFSb2xlTWFpbiBbJSBEYXRhLlZpZXcgfCBodG1sICVdIj4KICAgIDxoMT5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZU5hbWUpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKERhdGEuVGl0bGVWYWx1ZSkgfCBodG1sICVdPC9oMT4KCiAgICBbJSBEYXRhLkRhdGFJblRoZU1pZGRsZSAlXQoKICAgIDxkaXYgY2xhc3M9Ik92ZXJ2aWV3Q29udHJvbCIgaWQ9Ik92ZXJ2aWV3Q29udHJvbCI+CiAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udHJvbFJvdyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVyIikgJV0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFicyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkZpbHRlckxpbmsgJV1GaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTxzcGFuPlslIERhdGEuQ291bnQgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkZpbHRlckxpbmsgJV1GaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTxzcGFuPlslIERhdGEuQ291bnQgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TcGxpdCIpICVdCiAgICAgICAgICAgICAgICAgICAgLQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU3BsaXQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyUGFnZUJhY2siKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJDaGFuZ2VTZWFyY2giIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua0JhY2sgJV0iPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJQYWdlQmFjayIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZXh0U2V0dGluZ3MiKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJDb250ZXh0RnVuY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkNvbnRleHRTZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJTaG93Q29udGV4dFNldHRpbmdzRGlhbG9nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb250ZXh0IFNldHRpbmdzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQ29udGV4dCBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNvbnRleHRTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJDb250ZXh0U2V0dGluZ3NEaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFByZWZlcmVuY2VzIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwZGF0ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJHcm91cCIgdmFsdWU9IlslIERhdGEuR3JvdXAgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlZGlyZWN0VVJMIiB2YWx1ZT0iWyUgRGF0YS5SZXF1ZXN0ZWRVUkwgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5QcmVmZXJlbmNlc0tleSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiQ2hhbmdlcyBwZXIgcGFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGFnZVNob3duU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRleHRTZXR0aW5ncyIpICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik92ZXJ2aWV3QWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5BY3Rpb25Sb3cgJV0KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Ik92ZXJ2aWV3Wm9vbSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkFjdGl2ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07Vmlldz1bJSBEYXRhLlZpZXcgfCB1cmkgJV07WyUgRGF0YS5MaW5rRmlsdGVyICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5OYW1lU2hvcnQpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1ZpZXc9WyUgRGF0YS5WaWV3IHwgdXJpICVdO1slIERhdGEuTGlua0ZpbHRlciAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZVNob3J0KSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhclZpZXdNb2RlIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJQYWdpbmF0aW9uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXN1bHRMb25nICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2l0ZU5hdkJhckxvbmcgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KIyBzb3J0IG9yZGVyIGJhciBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIFslIERhdGEuU29ydE9yZGVyQmFyICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXIiKSAlXQo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdTbWFsbC50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VPdmVydmlld1NtYWxsLnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBpZD0iT3ZlcnZpZXdCb2R5IiBjbGFzcz0iT3ZlcnZpZXcgVGlja2V0TGlzdCI+CiAgICA8dGFibGUgY2xhc3M9IlRhYmxlU21hbGwiIHN1bW1hcnk9IkEgZ2VuZXJpYyBJVFNNIENoYW5nZSB0YWJsZSI+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVN0YXRlU2lnbmFsSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVN0YXRlU2lnbmFsSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VOdW1iZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDaGFuZ2VOdW1iZXIgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DaGFuZ2VOdW1iZXI7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZU51bWJlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlck51bWJlckhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IldvcmtPcmRlck51bWJlciBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PVdvcmtPcmRlck51bWJlcjtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgQ29uZmlnKCJJVFNNV29ya09yZGVyOjpIb29rIikgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyTnVtYmVySGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyVGl0bGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXb3JrT3JkZXJUaXRsZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PVdvcmtPcmRlclRpdGxlO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBUaXRsZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUaXRsZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVRpdGxlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2hhbmdlVGl0bGUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DaGFuZ2VUaXRsZTtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgVGl0bGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGl0bGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJBZ2VudEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IldvcmtPcmRlckFnZW50SUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Xb3JrT3JkZXJBZ2VudElEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBBZ2VudCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJBZ2VudEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZUJ1aWxkZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDaGFuZ2VCdWlsZGVySUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DaGFuZ2VCdWlsZGVySUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEJ1aWxkZXIiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlQnVpbGRlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZU1hbmFnZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDaGFuZ2VCdWlsZGVySUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DaGFuZ2VNYW5hZ2VySUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIE1hbmFnZXIiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlTWFuYWdlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlckNvdW50SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD48c3Bhbj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlcnMiKSB8IGh0bWwgJV08L3NwYW4+PC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlckNvdW50SGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlU3RhdGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDaGFuZ2VTdGF0ZUlEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9Q2hhbmdlU3RhdGVJRDtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgU3RhdGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlU3RhdGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJTdGF0ZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IldvcmtPcmRlclN0YXRlSUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Xb3JrT3JkZXJTdGF0ZUlEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBTdGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJTdGF0ZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlclR5cGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXb3JrT3JkZXJUeXBlSUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Xb3JrT3JkZXJUeXBlSUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIFR5cGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyVHlwZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENhdGVnb3J5SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2F0ZWdvcnlJRCBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNhdGVnb3J5SUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2F0ZWdvcnlIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRJbXBhY3RIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJJbXBhY3RJRCBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUltcGFjdElEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRJbXBhY3RIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRQcmlvcml0eUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlByaW9yaXR5SUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Qcmlvcml0eUlEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFByaW9yaXR5SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFNlcnZpY2VzSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aD48c3Bhbj5bJSBUcmFuc2xhdGUoIlNlcnZpY2VzIikgfCBodG1sICVdPC9zcGFuPjwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRTZXJ2aWNlc0hlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmREeW5hbWljRmllbGRIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIERhdGEuTGFiZWwgfCBUcmFuc2xhdGUgfCBodG1sICVdPC9zcGFuPjwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmREeW5hbWljRmllbGRIZWFkZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUmVxdWVzdGVkVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlJlcXVlc3RlZFRpbWUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1SZXF1ZXN0ZWRUaW1lO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlJlcXVlc3RlZCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFJlcXVlc3RlZFRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRQbGFubmVkU3RhcnRUaW1lSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iUGxhbm5lZFN0YXJ0VGltZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PVBsYW5uZWRTdGFydFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBTdGFydCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFBsYW5uZWRTdGFydFRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRQbGFubmVkRW5kVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlBsYW5uZWRFbmRUaW1lIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9UGxhbm5lZEVuZFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRQbGFubmVkRW5kVGltZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEFjdHVhbFN0YXJ0VGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkFjdHVhbFN0YXJ0VGltZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUFjdHVhbFN0YXJ0VGltZTtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJBY3R1YWwgU3RhcnQgVGltZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRBY3R1YWxTdGFydFRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRBY3R1YWxFbmRUaW1lSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQWN0dWFsRW5kVGltZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUFjdHVhbEVuZFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQWN0dWFsIEVuZCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEFjdHVhbEVuZFRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDcmVhdGVUaW1lSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ3JlYXRlVGltZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNyZWF0ZVRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDcmVhdGVUaW1lSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNoYW5nZVRpbWUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1DaGFuZ2VUaW1lO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IlslIERhdGEuVG90YWxDb2x1bW5zIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkIikgJV0KICAgICAgICAgICAgPHRyIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNoYW5nZVN0YXRlU2lnbmFsIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuQ2hhbmdlU3RhdGUgfCBodG1sICVdIj5bJSBEYXRhLkNoYW5nZVN0YXRlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlclN0YXRlU2lnbmFsIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuV29ya09yZGVyU3RhdGVTaWduYWwgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5Xb3JrT3JkZXJTdGF0ZSB8IGh0bWwgJV0iPlslIERhdGEuV29ya09yZGVyU3RhdGUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlclN0YXRlU2lnbmFsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlTnVtYmVyTGlua1N0YXJ0IikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD1bJSBEYXRhLkNoYW5nZUlEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VOdW1iZXJMaW5rU3RhcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlTnVtYmVyTGlua0VuZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlTnVtYmVyTGlua0VuZCIpICVdCiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlTnVtYmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyTnVtYmVyTGlua1N0YXJ0IikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJOdW1iZXJMaW5rU3RhcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0tWyUgRGF0YS5Xb3JrT3JkZXJOdW1iZXIgfCBodG1sICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlck51bWJlckxpbmtFbmQiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlck51bWJlckxpbmtFbmQiKSAlXQogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlck51bWJlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlclRpdGxlIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IHRydW5jYXRlKDQwKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUaXRsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVRpdGxlIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlVGl0bGVMaW5rU3RhcnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLkNoYW5nZVRpdGxlIHwgaHRtbCAlXSI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VUaXRsZUxpbmtTdGFydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlVGl0bGUgfCB0cnVuY2F0ZSg0MCkgfCBodG1sICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVRpdGxlTGlua0VuZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGl0bGVMaW5rRW5kIikgJV0KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VUaXRsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlckFnZW50IikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLldvcmtPcmRlckFnZW50VXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyQWdlbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VCdWlsZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZUJ1aWxkZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VCdWlsZGVyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZUJ1aWxkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VNYW5hZ2VyIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZU1hbmFnZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VNYW5hZ2VyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZU1hbmFnZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJDb3VudCIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2VudGVyIj5bJSBEYXRhLldvcmtPcmRlckNvdW50IHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlckNvdW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgVHJhbnNsYXRlKERhdGEuQ2hhbmdlU3RhdGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgVHJhbnNsYXRlKERhdGEuV29ya09yZGVyU3RhdGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlclN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyVHlwZSIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJUeXBlKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUeXBlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2F0ZWdvcnkiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgVHJhbnNsYXRlKERhdGEuQ2F0ZWdvcnkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENhdGVnb3J5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkSW1wYWN0IikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkSW1wYWN0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFByaW9yaXR5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkU2VydmljZXMiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iSVRTTUZsYWciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRTZXJ2aWNlc1N1YkVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSI+IlslIERhdGEuQ3VyckluY2lTdGF0ZSB8IGh0bWwgJV0iPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFNlcnZpY2VzU3ViRWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFNlcnZpY2VzU3ViRWxlbWVudEVtcHR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPiZuYnNwOzwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRTZXJ2aWNlc1N1YkVsZW1lbnRFbXB0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRTZXJ2aWNlcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmREeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWx1ZSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZER5bmFtaWNGaWVsZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRSZXF1ZXN0ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuUmVxdWVzdGVkVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkUmVxdWVzdGVkVGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFBsYW5uZWRTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5QbGFubmVkU3RhcnRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRQbGFubmVkU3RhcnRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUGxhbm5lZEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5QbGFubmVkRW5kVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkUGxhbm5lZEVuZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRBY3R1YWxTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5BY3R1YWxTdGFydFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEFjdHVhbFN0YXJ0VGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEFjdHVhbEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5BY3R1YWxFbmRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRBY3R1YWxFbmRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3JlYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENyZWF0ZVRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VUaW1lIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGltZSIpICVdCiAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmQiKSAlXQogICAgICAgIDwvdGJvZHk+CiAgICA8L3RhYmxlPgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlUmVzZXQudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlUmVzZXQudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBXMzAwcHgiPgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9maWVsZHNldD4KPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIHJlc2V0IHRoaXMgY2hhbmdlPyIpIHwgaHRtbCAlXQo8L3A+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VTZWFyY2gudHQsdiAxLjMgMjAxOS8wNy8zMSAwOToyMjoyNCB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlYXJjaEFKQVgiKSAlXQo8ZGl2IGNsYXNzPSJJbm5lckNvbnRlbnQiPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJTZWFyY2hGb3JtIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiBpZD0iU2VhcmNoQWN0aW9uIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VhcmNoIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRW1wdHlTZWFyY2giIHZhbHVlPSJbJSBEYXRhLkVtcHR5U2VhcmNoIHwgaHRtbCAlXSIgaWQ9IkVtcHR5U2VhcmNoIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2hvd25BdHRyaWJ1dGVzIiB2YWx1ZT0iIiBpZD0iU2hvd25BdHRyaWJ1dGVzIj4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSAiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGVzIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQcm9maWxlIj5bJSBUcmFuc2xhdGUoIlNlYXJjaCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlByb2ZpbGVzU3RyZyAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VhcmNoUHJvZmlsZUFkZEJsb2NrIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgaWQ9IlNlYXJjaFByb2ZpbGVBZGROYW1lIi8+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUgVGVtcGxhdGUiKSB8IGh0bWwgJV0iIGlkPSJTZWFyY2hQcm9maWxlQWRkQWN0aW9uIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iU2VhcmNoUHJvZmlsZU5ldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSBOZXciKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIE5ldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlYXJjaFByb2ZpbGVEZWxldGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEhpZGRlbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IlNlYXJjaFByb2ZpbGVBc0xpbmsiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEhpZGRlbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiUHJvZmlsZSBsaW5rIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlByb2ZpbGUgbGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2F2ZSBjaGFuZ2VzIGluIHRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iU2F2ZVByb2ZpbGUiIGlkPSJTYXZlUHJvZmlsZSIgdmFsdWU9IjEiLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSAiIGlkPSJTZWFyY2hJbnNlcnQiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiRmlsdGVycyBpbiB1c2UiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSAiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQWRkaXRpb25hbCBmaWx0ZXJzIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBZGQgYW5vdGhlciBhdHRyaWJ1dGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BdHRyaWJ1dGVzU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPdXRwdXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZXN1bHRGb3JtU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgPC9mb3JtPgoKICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEhpZGRlbiAiIGlkPSJTZWFyY2hBdHRyaWJ1dGVzSGlkZGVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iRnVsbHRleHQiIGlkPSJMYWJlbEZ1bGx0ZXh0Ij5bJSBUcmFuc2xhdGUoIkZ1bGx0ZXh0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRnVsbHRleHQiIHZhbHVlPSJbJSBEYXRhLkZ1bGx0ZXh0IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiAvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IkNoYW5nZU51bWJlciIgaWQ9IkxhYmVsQ2hhbmdlTnVtYmVyIj5bJSBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSAlXSBbJSBUcmFuc2xhdGUoIihlLmcuIDEwKjUxNTUgb3IgMTA1NjU4KikiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDaGFuZ2VOdW1iZXIiIHZhbHVlPSJbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iQ2hhbmdlVGl0bGUiIGlkPSJMYWJlbENoYW5nZVRpdGxlIj5bJSBUcmFuc2xhdGUoIkNoYW5nZSBUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNoYW5nZVRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iV29ya09yZGVyVGl0bGUiIGlkPSJMYWJlbFdvcmtPcmRlclRpdGxlIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlclRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iQ0FCQWdlbnQiIGlkPSJMYWJlbENBQkFnZW50Ij5bJSBUcmFuc2xhdGUoIkNBQiBBZ2VudCIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCJlLmcuIikgfCBodG1sICVdIDIzNDIzMSk6PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJDQUJBZ2VudFNlbGVjdGVkIiB2YWx1ZT0iWyUgRGF0YS5DQUJBZ2VudCB8IGh0bWwgJV0iIG5hbWU9IkNBQkFnZW50Ij4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNBQkFnZW50U2VhcmNoIiB2YWx1ZT0iWyUgRGF0YS5DQUJBZ2VudFNlYXJjaCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBJVFNNVXNlclNlYXJjaCIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iQ0FCQ3VzdG9tZXIiIGlkPSJMYWJlbENBQkN1c3RvbWVyIj5bJSBUcmFuc2xhdGUoIkNBQiBDdXN0b21lciIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCJlLmcuIikgfCBodG1sICVdIFVTNDIzMSk6PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJDQUJDdXN0b21lclNlbGVjdGVkIiB2YWx1ZT0iWyUgRGF0YS5DQUJDdXN0b21lciB8IGh0bWwgJV0iIG5hbWU9IkNBQkN1c3RvbWVyIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNBQkN1c3RvbWVyU2VhcmNoIiB2YWx1ZT0iWyUgRGF0YS5DQUJDdXN0b21lclNlYXJjaCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBJVFNNQ3VzdG9tZXJTZWFyY2giLz4KICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIiBpZD0iTGFiZWxEZXNjcmlwdGlvbiI+WyUgVHJhbnNsYXRlKCJJVFNNIENoYW5nZSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoImUuZy4iKSB8IGh0bWwgJV0gIk1hcippbiIgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXSAiQmF1ZSoiKTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRlc2NyaXB0aW9uIiB2YWx1ZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iSnVzdGlmaWNhdGlvbiIgaWQ9IkxhYmVsSnVzdGlmaWNhdGlvbiI+WyUgVHJhbnNsYXRlKCJJVFNNIENoYW5nZSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIkp1c3RpZmljYXRpb24iKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZSgiZS5nLiIpIHwgaHRtbCAlXSAiTWFyKmluIiBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdICJCYXVlKiIpOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iSnVzdGlmaWNhdGlvbiIgdmFsdWU9IlslIERhdGEuSnVzdGlmaWNhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iV29ya09yZGVySW5zdHJ1Y3Rpb24iIGlkPSJMYWJlbFdvcmtPcmRlckluc3RydWN0aW9uIj5bJSBUcmFuc2xhdGUoIklUU00gV29ya29yZGVyIEluc3RydWN0aW9uIikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoImUuZy4iKSB8IGh0bWwgJV0gIk1hcippbiIgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXSAiQmF1ZSoiKTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlckluc3RydWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Xb3JrT3JkZXJJbnN0cnVjdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iV29ya09yZGVyUmVwb3J0IiBpZD0iTGFiZWxXb3JrT3JkZXJSZXBvcnQiPlslIFRyYW5zbGF0ZSgiSVRTTSBXb3Jrb3JkZXIgUmVwb3J0IikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoImUuZy4iKSB8IGh0bWwgJV0gIk1hcippbiIgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXSAiQmF1ZSoiKTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlclJlcG9ydCIgdmFsdWU9IlslIERhdGEuV29ya09yZGVyUmVwb3J0IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRHMiIGlkPSJMYWJlbFByaW9yaXR5SURzIj5bJSBUcmFuc2xhdGUoIklUU00gQ2hhbmdlIFByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICBbJSBEYXRhLkNoYW5nZVByaW9yaXR5U2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8bGFiZWwgZm9yPSJJbXBhY3RJRHMiIGlkPSJMYWJlbEltcGFjdElEcyI+WyUgVHJhbnNsYXRlKCJJVFNNIENoYW5nZSBJbXBhY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlSW1wYWN0U2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8bGFiZWwgZm9yPSJDYXRlZ29yeUlEcyIgaWQ9IkxhYmVsQ2F0ZWdvcnlJRHMiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIENhdGVnb3J5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICBbJSBEYXRhLkNoYW5nZUNhdGVnb3J5U2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8bGFiZWwgZm9yPSJDaGFuZ2VTdGF0ZUlEcyIgaWQ9IkxhYmVsQ2hhbmdlU3RhdGVJRHMiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICBbJSBEYXRhLkNoYW5nZVN0YXRlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8bGFiZWwgZm9yPSJDaGFuZ2VNYW5hZ2VySURzIiBpZD0iTGFiZWxDaGFuZ2VNYW5hZ2VySURzIj5bJSBUcmFuc2xhdGUoIkNoYW5nZSBNYW5hZ2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICBbJSBEYXRhLkNoYW5nZU1hbmFnZXJTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IkNoYW5nZUJ1aWxkZXJJRHMiIGlkPSJMYWJlbENoYW5nZUJ1aWxkZXJJRHMiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEJ1aWxkZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlQnVpbGRlclNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iQ3JlYXRlQnkiIGlkPSJMYWJlbENyZWF0ZUJ5Ij5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIFslIERhdGEuQ3JlYXRlQnlTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IldvcmtPcmRlclN0YXRlSURzIiBpZD0iTGFiZWxXb3JrT3JkZXJTdGF0ZUlEcyI+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyU3RhdGVTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IldvcmtPcmRlclR5cGVJRHMiIGlkPSJMYWJlbFdvcmtPcmRlclR5cGVJRHMiPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIFR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyVHlwZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPGxhYmVsIGZvcj0iV29ya09yZGVyQWdlbnRJRHMiIGlkPSJMYWJlbFdvcmtPcmRlckFnZW50SURzIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgWyUgRGF0YS5Xb3JrT3JkZXJBZ2VudElEU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVNlbGVjdGlvbiIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuUHJlZml4ICVdVGltZVBvaW50RmllbGQiIGlkPSJMYWJlbFslIERhdGEuUHJlZml4ICVdVGltZVBvaW50RmllbGQiPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCIoYmVmb3JlL2FmdGVyKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWyUgRGF0YS5QcmVmaXggJV1UaW1lU2VhcmNoVHlwZSIgdmFsdWU9IlRpbWVQb2ludCIgWyUgRGF0YS5pdGVtKCJUaW1lU2VhcmNoVHlwZTo6VGltZVBvaW50IikgJV0vPgogICAgICAgICAgICBbJSBEYXRhLlRpbWVQb2ludFN0YXJ0ICVdIFslIERhdGEuVGltZVBvaW50ICVdIFslIERhdGEuVGltZVBvaW50Rm9ybWF0ICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLlByZWZpeCAlXVRpbWVTbG90RmllbGQiIGlkPSJMYWJlbFslIERhdGEuUHJlZml4ICVdVGltZVNsb3RGaWVsZCI+WyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIihiZXR3ZWVuKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWyUgRGF0YS5QcmVmaXggJV1UaW1lU2VhcmNoVHlwZSIgdmFsdWU9IlRpbWVTbG90IiBbJSBEYXRhLml0ZW0oIlRpbWVTZWFyY2hUeXBlOjpUaW1lU2xvdCIpICVdLz4KICAgICAgICAgICAgWyUgRGF0YS5UaW1lU3RhcnQgJV0gWyUgVHJhbnNsYXRlKCJhbmQiKSB8IGh0bWwgJV0gWyUgRGF0YS5UaW1lU3RvcCAlXQogICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVTZWxlY3Rpb24iKSAlXQoKICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgWyUgRGF0YS5BdHRyaWJ1dGVzT3JpZ1N0cmcgJV0KICAgIDwvZmllbGRzZXQ+CjwvZGl2PgoKPGRpdiBjbGFzcz0iQ29udGVudEZvb3RlciBDZW50ZXIiPgogICAgPGJ1dHRvbiBpZD0iU2VhcmNoRm9ybVN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdmFsdWU9IlJ1biBzZWFyY2giPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1zZWFyY2giPjwvaT4gWyUgVHJhbnNsYXRlKCJSdW4gc2VhcmNoIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgo8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJTZWFyY2hBSkFYIikgJV0K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRlbXBsYXRlLnR0LHYgMS4yIDIwMTkvMDUvMTkgMTQ6Mjc6MjcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSIgaWQ9IkNvbXBvc2UiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgICAgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgICB2YWx1ZT0iQWRkVGVtcGxhdGUiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICAgICB2YWx1ZT0iWyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV0iPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiU2F2ZSBDaGFuZ2UgYXMgVGVtcGxhdGUiKSB8IGh0bWwgJV06IFslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdIFslIERhdGEuQ2hhbmdlTnVtYmVyICVdOiBbJSBEYXRhLkNoYW5nZVRpdGxlIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwgQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGVPRk9SSyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUZW1wbGF0ZU5hbWUiPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGUgTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGVtcGxhdGVOYW1lIiBuYW1lPSJUZW1wbGF0ZU5hbWUiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLlRlbXBsYXRlTmFtZUludmFsaWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiQSB0ZW1wbGF0ZSBzaG91bGQgaGF2ZSBhIG5hbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgdGVtcGxhdGUgbmFtZSBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNvbW1lbnQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0ZVJlc2V0Ij5bJSBUcmFuc2xhdGUoIlJlc2V0IFN0YXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVSZXNldFNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVyd3JpdGVUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVUZW1wbGF0ZSI+WyUgVHJhbnNsYXRlKCJPdmVyd3JpdGUgb3JpZ2luYWwgdGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk92ZXJ3cml0ZVRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ3cml0ZVRlbXBsYXRlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRlbGV0ZUNoYW5nZSIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZWxldGVDaGFuZ2UiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIG9yaWdpbmFsIGNoYW5nZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRGVsZXRlQ2hhbmdlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRlbGV0ZUNoYW5nZSIpICVdCgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJTdWJtaXRBZGRUZW1wbGF0ZSIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkFkZFRlbXBsYXRlIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Zvcm0+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3QudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRpbWVTbG90LnR0LHYgMS4yIDIwMTkvMDUvMTkgMTQ6Mjc6NDIgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik1vdmVUaW1lU2xvdEZvcm0iIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJNb3ZlVGltZVNsb3QiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgIHZhbHVlPSJbJSBEYXRhLkNoYW5nZUlEIHwgaHRtbCAlXSIgLz4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIk1vdmUgVGltZSBTbG90IikgfCBodG1sICVdIFslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdIFslIERhdGEuQ2hhbmdlTnVtYmVyICVdPC9oMT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIEFnZW50SVRTTUNoYW5nZVRpbWVTbG90T0ZPUksiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTW92ZVRpbWVUeXBlIj5bJSBUcmFuc2xhdGUoIlRpbWUgdHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOZXcgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJNb3ZlVGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik1vdmVUaW1lSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0TW92ZVRpbWVTbG90IiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIk1vdmUiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiTW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNQ2hhbmdlWm9vbS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlWm9vbS50dCx2IDEuNSAyMDE5LzA2LzIzIDEzOjQyOjE1IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ2hhbmdlU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNoYW5nZVN0YXRlU2lnbmFsIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ2hhbmdlU3RhdGUpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDEgdGl0bGU9IlslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdOiBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLkNoYW5nZVRpdGxlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIFslIENvbmZpZygiSVRTTUNoYW5nZTo6SG9vayIpICVdOiBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0gPHNwYW4+Jm1kYXNoOzwvc3Bhbj4gWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IHRydW5jYXRlKDEzMCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJZkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgojIHNob3cgY3VzdG9tZXIgaW5mbyB0YWJsZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkN1c3RvbWVyVGFibGUgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSWZDdXN0b21lcklEIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIklmVGlja2V0SUQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJUaWNrZXQgSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93IEFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIEZpeGVkVmFsdWVTbWFsbCIgdGl0bGU9IlslIERhdGEuVHlwZSB8IGh0bWwgJV0iPlslIERhdGEuVHlwZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLkFnZSAlXSI+WyUgRGF0YS5BZ2UgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdIj5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCB8IHJlcGxhY2UoJzo6JywgJzx3YnI+Ojo8d2JyPicpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NrZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuU2VydmljZSB8IGh0bWwgJV0iPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlNMQSB8IGh0bWwgJV0iPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIChbJSBEYXRhLlVzZXJMb2dpbiB8IGh0bWwgJV0pIj5bJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk93bmVyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIklmVGlja2V0SUQiKSAlXQoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ2hhbmdlU3RhdGVTaWduYWwgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5DaGFuZ2VTdGF0ZSkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5DaGFuZ2VTdGF0ZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBTdGFydCBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5UGxhbm5lZFN0YXJ0VGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eVBsYW5uZWRTdGFydFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlBsYW5uZWRTdGFydFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQbGFubmVkIEVuZCBUaW1lIikgfCBodG1sICVdOiA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVBsYW5uZWRFbmRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iLSI+LTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVtcHR5UGxhbm5lZEVuZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5QbGFubmVkRW5kVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3R1YWwgU3RhcnQgVGltZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRW1wdHlBY3R1YWxTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlBY3R1YWxTdGFydFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3R1YWxTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQWN0dWFsU3RhcnRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3R1YWwgRW5kIFRpbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5QWN0dWFsRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eUFjdHVhbEVuZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3R1YWxFbmRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkFjdHVhbEVuZFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdHVhbEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dSZXF1ZXN0ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0ZWQgRGF0ZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRW1wdHlSZXF1ZXN0ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iLSI+LTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVtcHR5UmVxdWVzdGVkVGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlcXVlc3RlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuUmVxdWVzdGVkVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVxdWVzdGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd1JlcXVlc3RlZFRpbWUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93UGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBsYW5uZWQgRWZmb3J0IikgfCBodG1sICVdOiA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVBsYW5uZWRFZmZvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlQbGFubmVkRWZmb3J0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5QbGFubmVkRWZmb3J0IHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFZmZvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTaG93UGxhbm5lZEVmZm9ydCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93QWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFjY291bnRlZCBUaW1lIikgfCBodG1sICVdOiA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eUFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlBY2NvdW50ZWRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5BY2NvdW50ZWRUaW1lIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTaG93QWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01DaGFuZ2Vab29tSW5mb3JtYXRpb25PRk9SSyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhdGVnb3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5DYXRlZ29yeSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDYXRlZ29yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJJbXBhY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5JbXBhY3QpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW1wYWN0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQcmlvcml0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiMgc2hvdyBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3cgQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiMgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9MaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyX1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEluaXRpYXRvcihzKSIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eUNoYW5nZUluaXRpYXRvcnMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlDaGFuZ2VJbml0aWF0b3JzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hhbmdlSW5pdGlhdG9yRXhpc3RzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hhbmdlSW5pdGlhdG9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDaGFuZ2VJbml0aWF0b3IiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlSW5pdGlhdG9yRXhpc3RzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01DaGFuZ2Vab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNoYW5nZSBNYW5hZ2VyIikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5Q2hhbmdlTWFuYWdlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eUNoYW5nZU1hbmFnZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGFuZ2VNYW5hZ2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DaGFuZ2VNYW5hZ2VyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZU1hbmFnZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoYW5nZU1hbmFnZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEJ1aWxkZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DaGFuZ2VCdWlsZGVyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZUJ1aWxkZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01DaGFuZ2Vab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNBQiIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eUNBQiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eUNBQiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNBQiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNBQkFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DQUJBZ2VudFVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DQUJBZ2VudFVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ0FCQWdlbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDQUJDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ0FCQ3VzdG9tZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ0FCQ3VzdG9tZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNBQkN1c3RvbWVyIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNBQiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV0iPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ3JlYXRlVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZVVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBjaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ2hhbmdlVGltZSB8IGh0bWwgJV0iPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DaGFuZ2VVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1lbnUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgaWQ9Ik1lbnVbJSBEYXRhLk1lbnVJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLk1lbnVDbGFzcyB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnUiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJHcmFwaCIpICVdCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLldvcmtPcmRlckdyYXBoICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVyR3JhcGgiKSAlXQoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AgRXhwYW5kZWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQuIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJVFNNIENoYW5nZSIpIHwgaHRtbCAlXSAtIFslIERhdGEuQ2hhbmdlVGl0bGUgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTUNoYW5nZVpvb21PRk9SSyI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQojIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIHRvIG9wZW4gdGhlIGxpbmtzIGluIGEgbmV3IHdpbmRvdyB3aXRob3V0IHRoZSBzZWN1cml0eSBwZXJtaXNzaW9ucyBnaXZlbiB0byB0aGUgaWZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IklUU01NZXNzYWdlQnJvd3NlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIG9wZW4gbGlua3MgaW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBibG9ja3MsIHlvdSBtaWdodCBuZWVkIHRvIHByZXNzIEN0cmwgb3IgQ21kIG9yIFNoaWZ0IGtleSB3aGlsZSBjbGlja2luZyB0aGUgbGluayAoZGVwZW5kaW5nIG9uIHlvdXIgYnJvd3NlciBhbmQgT1MpLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSVRTTUNvbnRlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCBEYXRhLkZpZWxkICkgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgVXNlIElFJ3MgKG5vbi1zdGFuZGFyZCkgc2VjdXJpdHkgYXR0cmlidXRlIHRvIGFjaGlldmUgc29tZXRoaW5nIHNpbWlsYXIgaW4gb2xkZXIgSUUgYnJvd3NlcnMuIEFwcGVuZCBzZXNzaW9uIGluZm8gdG8gVVJMIGJlY2F1c2UgSUUgd2lsbCBub3Qgc2VuZCBjb29raWVzLgojIFNldCAnYWxsb3ctcG9wdXBzJyB0byBhbGxvdyBJRTEwKyB0byBvcGVuIGxpbmtzLiByZWY6IGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvd2lraS9DaGFuZ2VQcm9wb3NhbHMvc2FuZGJveF9hbGxvd19wb3B1cHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCIgWyUgRGF0YS5NU1NlY3VyaXR5UmVzdHJpY3RlZCAlXSBjbGFzcz0iRmllbGQiIGlkPSJJZnJhbWVJVFNNWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0iIG9ubG9hZD0iaWYgKHR5cGVvZiBJVFNNID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgSVRTTS5BZ2VudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5ab29tID09PSAnb2JqZWN0JykgeyBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuWm9vbS5JZnJhbWVBdXRvSGVpZ2h0KCQoJyNJZnJhbWVJVFNNWyUgRGF0YS5GaWVsZCB8IGh0bWwgJV0nKSk7IH07IiBzcmM9IiMiIGRhdGEtc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtTdWJhY3Rpb249SFRNTFZpZXc7Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IGh0bWwgJV07RmllbGQ9WyUgRGF0YS5GaWVsZCB8IGh0bWwgJV07WyUgRW52KCJTZXNzaW9uTmFtZSIpIHwgaHRtbCAlXT1bJSBFbnYoIlNlc3Npb25JRCIpIHwgaHRtbCAlXSI+PC9pZnJhbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJVFNNQ29udGVudCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRG93bmxvYWRBdHRhY2htZW50IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEb3dubG9hZCBBdHRhY2htZW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0ZpbGVuYW1lPVslIERhdGEuRmlsZW5hbWUgfCB1cmkgJV07Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbJSBEYXRhLkZpbGVzaXplIHwgTG9jYWxpemUoJ0ZpbGVzaXplJykgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBXMzAwcHgiPgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICA8L3A+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5UeXBlKSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgIFslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDQwKSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9maWVsZHNldD4KPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIHRlbXBsYXRlPyIpIHwgaHRtbCAlXQo8L3A+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVFZGl0LnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZUVkaXQudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyODoxMyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBpZD0iQ29tcG9zZSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iICAgIHZhbHVlPSJVcGRhdGVUZW1wbGF0ZSI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiAgIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIj4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKERhdGEuVHlwZSkgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiVGVtcGxhdGUiKSB8IGh0bWwgJV06IFslIERhdGEuTmFtZSB8IGh0bWwgJV08L2gxPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIEFnZW50SVRTTVRlbXBsYXRlRWRpdE9GT1JLIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlbXBsYXRlTmFtZSI+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSBOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUZW1wbGF0ZU5hbWUiIG5hbWU9IlRlbXBsYXRlTmFtZSIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVOYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuVGVtcGxhdGVOYW1lSW52YWxpZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJBIHRlbXBsYXRlIHNob3VsZCBoYXZlIGEgbmFtZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoZSB0ZW1wbGF0ZSBuYW1lIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ29tbWVudCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyIgLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQcmltYXJ5IiBpZD0ic3VibWl0RWRpdFRlbXBsYXRlIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iRWRpdFRlbXBsYXRlIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q0FCLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVRlbXBsYXRlRWRpdENBQi50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBjbGFzcz0iVmFsaWRhdGUiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgICAgICAgIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgICAgICAgIHZhbHVlPSJTYXZlIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgICAgICAgIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiAvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVDb250ZW50IiAgIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlQ29udGVudCB8IGh0bWwgJV0iIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEZWxldGVDQUJNZW1iZXIiICAgdmFsdWU9IiIgLz4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJFZGl0IENBQiBUZW1wbGF0ZSIpIHwgaHRtbCAlXSAtIFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFZGl0IENBQiBUZW1wbGF0ZSIpIHwgaHRtbCAlXSAtIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9oMT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIEFkdmlzb3J5IEJvYXJkIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdDQUJNZW1iZXIiPiBbJSBUcmFuc2xhdGUoIkFkZCB0byBDQUIiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iTmV3Q0FCTWVtYmVyIiBuYW1lPSJOZXdDQUJNZW1iZXIiIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLk5ld0NBQk1lbWJlciB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBDQUJNZW1iZXJTZWFyY2ggWyUgRGF0YS5OZXdDQUJNZW1iZXJFcnJvciAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iTmV3Q0FCTWVtYmVyU2VsZWN0ZWQiIG5hbWU9Ik5ld0NBQk1lbWJlclNlbGVjdGVkIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLk5ld0NBQk1lbWJlcklEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iTmV3Q0FCTWVtYmVyVHlwZSIgbmFtZT0iTmV3Q0FCTWVtYmVyVHlwZSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DQUJNZW1iZXJUeXBlIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQWRkQ0FCTWVtYmVyIiBuYW1lPSJBZGRDQUJNZW1iZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIgLz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdDQUJNZW1iZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVXNlciBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIGlkPSJCdG5BZGRDQUJNZW1iZXIiIG5hbWU9ImJ0bkFkZENBQk1lbWJlciIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJVc2VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBVc2VyIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgQ0FCIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDQUJNZW1iZXJUYWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJMb2dpbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNBQk1lbWJlclJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5Vc2VyVHlwZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJbJSBEYXRhLkludGVybmFsVXNlclR5cGUgJV1bJSBEYXRhLlVzZXJJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlRyYXNoQ2FuIERlbGV0ZUNBQk1lbWJlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDQUJNZW1iZXJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJDQUJNZW1iZXJUYWJsZSIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AgU3BhY2luZ0JvdHRvbSBTcGFjaW5nTGVmdCI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIE5hbWU9IlN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+PC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q29udGVudC50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZUVkaXRDb250ZW50LnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdENvbnRlbnREaWFsb2ciKSAlXQo8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBXMzAwcHgiPgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICA8L3A+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5UeXBlKSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgIFslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDQwKSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9maWVsZHNldD4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZVRlbXBsYXRlIikgJV0KPHAgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgWyUgVHJhbnNsYXRlKCJUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGNoYW5nZSBmcm9tIHRoaXMgdGVtcGxhdGUsIHNvIHlvdSBjYW4gZWRpdCBhbmQgc2F2ZSBpdC4iKSB8IGh0bWwgJV08YnIvPgogICAgWyUgVHJhbnNsYXRlKCJUaGUgbmV3IGNoYW5nZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZCBhcyB0ZW1wbGF0ZS4iKSB8IGh0bWwgJV0KPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlVGVtcGxhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJUZW1wbGF0ZSIpICVdCjxwIGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgIFslIFRyYW5zbGF0ZSgiVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3b3Jrb3JkZXIgZnJvbSB0aGlzIHRlbXBsYXRlLCBzbyB5b3UgY2FuIGVkaXQgYW5kIHNhdmUgaXQuIikgfCBodG1sICVdPGJyLz4KICAgIFslIFRyYW5zbGF0ZSgiQSB0ZW1wb3JhcnkgY2hhbmdlIHdpbGwgYmUgY3JlYXRlZCB3aGljaCBjb250YWlucyB0aGUgd29ya29yZGVyLiIpIHwgaHRtbCAlXTxici8+CiAgICBbJSBUcmFuc2xhdGUoIlRoZSB0ZW1wb3JhcnkgY2hhbmdlIGFuZCBuZXcgd29ya29yZGVyIHdpbGwgYmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSB3b3Jrb3JkZXIgaGFzIGJlZW4gc2F2ZWQgYXMgdGVtcGxhdGUuIikgfCBodG1sICVdPGJyLz4KPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVyVGVtcGxhdGUiKSAlXQoKPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHdhbnQgdG8gcHJvY2VlZD8iKSB8IGh0bWwgJV0KPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdENvbnRlbnREaWFsb2ciKSAlXQo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld05hdkJhci50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3TmF2QmFyLnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE3IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXIiKSAlXQo8ZGl2IGNsYXNzPSJPdmVydmlld0JveCBBUklBUm9sZU1haW4iPgogICAgPGgxPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlTmFtZSkgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5UaXRsZVZhbHVlKSB8IGh0bWwgJV08L2gxPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJNYWluIikgJV0KCiAgICA8aDE+WyUgVHJhbnNsYXRlKERhdGEuTWFpbk5hbWUpIHwgaHRtbCAlXTogWyUgRGF0YS5NYWluQ29udGVudCAlXTwvaDE+CgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJNYWluIikgJV0KCiAgICA8ZGl2IGNsYXNzPSJPdmVydmlld0NvbnRyb2wiIGlkPSJPdmVydmlld0NvbnRyb2wiPgogICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRyb2xSb3ciPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRmlsdGVyIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJPdmVydmlld0FjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkFjdGlvbkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5GaWx0ZXJMaW5rICVdRmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0gKFslIERhdGEuQ291bnQgfCBodG1sICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQWN0aW9uRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkZpbHRlckxpbmsgJV1GaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSAoWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlckl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhckZpbHRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJPdmVydmlld1pvb20iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhclZpZXdNb2RlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJBY3RpdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1ZpZXc9WyUgRGF0YS5WaWV3IHwgdXJpICVdO1slIERhdGEuTGlua0ZpbHRlciAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZVNob3J0KSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtWaWV3PVslIERhdGEuVmlldyB8IHVyaSAlXTtbJSBEYXRhLkxpbmtGaWx0ZXIgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLk5hbWVTaG9ydCkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUGFnaW5hdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzdWx0TG9uZyAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNpdGVOYXZCYXJMb25nICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld05hdkJhclBhZ2VOYXZCYXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXIiKSAlXQo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdTbWFsbC50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxNyB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgaWQ9Ik92ZXJ2aWV3Qm9keSIgY2xhc3M9Ik92ZXJ2aWV3IFRpY2tldExpc3QiPgogICAgPHRhYmxlIGNsYXNzPSJUYWJsZVNtYWxsIj4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkVGVtcGxhdGVJREhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGg+PHNwYW4+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSBJRCIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVGVtcGxhdGVJREhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZE5hbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJOYW1lIFslIERhdGEuU29ydE5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PU5hbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnlOYW1lIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkTmFtZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFR5cGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJUeXBlIFslIERhdGEuU29ydFRlbXBsYXRlVHlwZUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1UZW1wbGF0ZVR5cGVJRDtPcmRlckJ5PVslIERhdGEuT3JkZXJCeVRlbXBsYXRlVHlwZUlEIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVHlwZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENvbW1lbnRIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ29tbWVudEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFZhbGlkSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVmFsaWRJRCBbJSBEYXRhLlNvcnRWYWxpZElEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1WYWxpZElEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5VmFsaWRJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRWYWxpZEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEVkaXRDb250ZW50SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIExhc3QiPjxzcGFuPlslIFRyYW5zbGF0ZSgiRWRpdCBDb250ZW50IikgfCBodG1sICVdPC9zcGFuPjwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRFZGl0Q29udGVudEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZERlbGV0ZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBMYXN0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRGVsZXRlSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3JlYXRlQnlIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIGJ5IikgfCBodG1sICVdPC9zcGFuPjwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDcmVhdGVCeUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENyZWF0ZVRpbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDcmVhdGVUaW1lIFslIERhdGEuU29ydENyZWF0ZVRpbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNyZWF0ZVRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnlDcmVhdGVUaW1lIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNyZWF0ZSBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENyZWF0ZVRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VCeUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGg+PHNwYW4+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgYnkiKSB8IGh0bWwgJV08L3NwYW4+PC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZUJ5SGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNoYW5nZVRpbWUgWyUgRGF0YS5Tb3J0Q2hhbmdlVGltZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9Q2hhbmdlVGltZTtPcmRlckJ5PVslIERhdGEuT3JkZXJCeUNoYW5nZVRpbWUgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIFRpbWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IlslIERhdGEuVG90YWxDb2x1bW5zIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkIikgJV0KICAgICAgICAgICAgPHRyIFslIElGIERhdGEuVmFsaWRJRCAhPSAxICVdY2xhc3M9IkludmFsaWQiWyUgRU5EICVdIGlkPSJUZW1wbGF0ZUlEX1slIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRUZW1wbGF0ZUlEIikgJV0KICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5UZW1wbGF0ZUlEKSB8IGh0bWwgJV08L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVGVtcGxhdGVJRCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZE5hbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZUVkaXQ7VGVtcGxhdGVJRD1bJSBEYXRhLlRlbXBsYXRlSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIChJRD1bJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdKSIgY2xhc3M9IkFzQmxvY2sgQXNQb3B1cCI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmROYW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkVHlwZSIpICVdCiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVHlwZSkgfCBodG1sICVdIChJRD1bJSBEYXRhLlR5cGVJRCB8IGh0bWwgJV0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuVHlwZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkVHlwZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENvbW1lbnQiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ29tbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFZhbGlkIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuVmFsaWQpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFZhbGlkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEVkaXRDb250ZW50IikgJV0KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIExhc3QiPgogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSIiIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkVkaXQgQ29udGVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGlkPSJFZGl0Q29udGVudFRlbXBsYXRlSURbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiBjbGFzcz0iZmEgZmEtcGVuY2lsIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkVkaXQgQ29udGVudCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRWRpdENvbnRlbnQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkRWRpdENvbnRlbnRDQUIiKSAlXQogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZUVkaXRDQUI7VGVtcGxhdGVJRD1bJSBEYXRhLlRlbXBsYXRlSUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkVkaXQgQ29udGVudCIpIHwgaHRtbCAlXSIgY2xhc3M9IkFzQmxvY2sgQXNQb3B1cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wZW5jaWwiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiRWRpdCBDb250ZW50IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRFZGl0Q29udGVudENBQiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmREZWxldGUiKSAlXQogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgaWQ9IkRlbGV0ZVRlbXBsYXRlSURbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkRGVsZXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3JlYXRlQnkiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3JlYXRlQnlVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVCeVVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDcmVhdGVCeSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENyZWF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZVRpbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3JlYXRlVGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZUJ5IikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZUJ5VXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlQnlVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlQnkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VUaW1lIikgJV0KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZVRpbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VUaW1lIHwgdHJ1bmNhdGUoNDApIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVRpbWUiKSAlXQogICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkIikgJV0KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyQWRkLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJBZGQudHQsdiAxLjMgMjAxOS8wNS8xOSAxNDoyODoyOCB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJBZGQgV29ya29yZGVyIHRvICVzJXMiLCBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIpIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQ2hhbmdlVGl0bGUgfCBodG1sICVdPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNoYW5nZUlEIiAgdmFsdWU9IlslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiAgICB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJBZGRJbmZvcm1hdGlvbk9GT1JLIEFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IldvcmtPcmRlclRpdGxlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qIDwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXb3JrT3JkZXJUaXRsZSIgaWQ9IldvcmtPcmRlclRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLldvcmtPcmRlclRpdGxlU2VydmVyRXJyb3IgfCBodG1sICVdIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iV29ya09yZGVyVGl0bGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJXb3JrT3JkZXJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiSW5zdHJ1Y3Rpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCBGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5JbnN0cnVjdGlvbkludmFsaWQgJV0iIG5hbWU9Ikluc3RydWN0aW9uIiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5JbnN0cnVjdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IldvcmtPcmRlclR5cGVJRCI+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLldvcmtPcmRlclR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJXb3JrT3JkZXJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB3b3Jrb3JkZXIgdHlwZS4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikdyb3VwSUQiPlslIFRyYW5zbGF0ZSgiR3JvdXAiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Hcm91cE9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQbGFubmVkIFN0YXJ0IFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QbGFubmVkU3RhcnRUaW1lU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkU3RhcnRUaW1lRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkU3RhcnRUaW1lSG91ckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkU3RhcnRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQbGFubmVkU3RhcnRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZFN0YXJ0VGltZUJlZm9yZVRoYW5FbmRUaW1lU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZFN0YXJ0VGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgcGxhbm5lZCBzdGFydCB0aW1lIG11c3QgYmUgYmVmb3JlIHRoZSBwbGFubmVkIGVuZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoZSBwbGFubmVkIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZFN0YXJ0VGltZUJlZm9yZVRoYW5FbmRUaW1lU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlBsYW5uZWRFbmRUaW1lU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZURheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZEVuZFRpbWVIb3VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIlBsYW5uZWRFbmRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRFbmRUaW1lRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZUhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFbmRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVuZFRpbWVCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRFbmRUaW1lRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoZSBwbGFubmVkIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZEVuZFRpbWVIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoZSBwbGFubmVkIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZEVuZFRpbWVCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dQbGFubmVkRWZmb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUGxhbm5lZEVmZm9ydCI+WyUgVHJhbnNsYXRlKCJQbGFubmVkIEVmZm9ydCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUGxhbm5lZEVmZm9ydCIgaWQ9IlBsYW5uZWRFZmZvcnQiIHZhbHVlPSJbJSBEYXRhLlBsYW5uZWRFZmZvcnQgfCBodG1sICVdIiBjbGFzcz0iVzEwcGMgVmFsaWRhdGUgWyUgRGF0YS5QbGFubmVkRWZmb3J0SW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRFZmZvcnRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBmb3JtYXQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZEVmZm9ydFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGZvcm1hdC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTaG93UGxhbm5lZEVmZm9ydCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50VXBsb2FkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJTkNMVURFICJGb3JtRWxlbWVudHMvQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50VXBsb2FkIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0V29ya09yZGVyQWRkIiBuYW1lPSJXb3JrT3JkZXJBZGQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyQWRkRnJvbVRlbXBsYXRlLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyODo0MiB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJBZGQgV29ya29yZGVyIHRvICVzJXMiLCBDb25maWcoIklUU01DaGFuZ2U6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIpIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQ2hhbmdlVGl0bGUgfCBodG1sICVdPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTZWxlY3QgV29ya29yZGVyIFRlbXBsYXRlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9InRlbXBsYXRlIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNyZWF0ZUZyb21UZW1wbGF0ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNoYW5nZUlEIiAgdmFsdWU9IlslIERhdGEuQ2hhbmdlSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJBZGRGcm9tVGVtcGxhdGVPRk9SSyI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUZW1wbGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qIDwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTW92ZVRpbWVUeXBlIj5bJSBUcmFuc2xhdGUoIlRpbWUgdHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTW92ZVRpbWVUeXBlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgdGltZSB0eXBlLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5ldyB0aW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0VGVtcGxhdGUiIG5hbWU9IlN1Ym1pdFRlbXBsYXRlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyQWdlbnQudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckFnZW50LnR0LHYgMS4yIDIwMTkvMDUvMTkgMTQ6Mjg6NTcgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXb3JrT3JkZXJJRCIgdmFsdWU9IlslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdIiAvPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkVkaXQgV29ya29yZGVyIEFnZW50IG9mICVzJXMiLCBDb25maWcoIklUU01Xb3JrT3JkZXI6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIpIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuV29ya09yZGVyTnVtYmVyIHwgaHRtbCAlXTogWyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFZGl0IFdvcmtvcmRlciBBZ2VudCBvZiAlcyVzIiwgQ29uZmlnKCJJVFNNV29ya09yZGVyOjpIb29rIiksIERhdGEuQ2hhbmdlTnVtYmVyKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLldvcmtPcmRlck51bWJlciB8IGh0bWwgJV06IFslIERhdGEuV29ya09yZGVyVGl0bGUgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdCiAgICAgICAgICAgIDwvaDE+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBBZ2VudElUU01Xb3JrT3JkZXJBZ2VudE9GT1JLIj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJVc2VyIj4gWyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIgQWdlbnQiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJVc2VyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJVc2VyIiB2YWx1ZT0iWyUgRGF0YS5Vc2VyIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFslIERhdGEuVXNlclNlcnZlckVycm9yICVdIFVzZXJTZWFyY2giIGRhdGEtYXV0b2NvbXBsZXRlZ3JvdXBzPSJpdHNtLWNoYW5nZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iVXNlclNlbGVjdGVkIiB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJTZWxlY3RlZCIgdmFsdWU9IlslIERhdGEuVXNlcklEIHwgaHRtbCAlXSIgY2xhc3M9IlVzZXJTZWFyY2hTZWxlY3RlZCIvPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBpZD0iVXNlclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIFVzZXIiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyRGVsZXRlLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDoyOToxMiB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vV29ya09yZGVySW5Db25kaXRpb24iKSAlXQo8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBXMzAwcHggQWdlbnRJVFNNV29ya09yZGVyRGVsZXRlT0ZPUksiPgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgWyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IGh0bWwgJV0KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9maWVsZHNldD4KPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIHdvcmtvcmRlcj8iKSB8IGh0bWwgJV0KPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9Xb3JrT3JkZXJJbkNvbmRpdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJJbkNvbmRpdGlvbiIpICVdCjxwPgogICAgWyUgVHJhbnNsYXRlKCJZb3UgY2FuIG5vdCBkZWxldGUgdGhpcyBXb3Jrb3JkZXIuIEl0IGlzIHVzZWQgaW4gYXQgbGVhc3Qgb25lIENvbmRpdGlvbiEiKSB8IGh0bWwgJV0KPC9wPgo8cCBjbGFzcz0iU3BhY2luZ1RvcCBTcGFjaW5nQm90dG9tIj4KICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBXb3Jrb3JkZXIgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIENvbmRpdGlvbihzKSIpIHwgaHRtbCAlXToKPC9wPgoKPHVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJJbkNvbmRpdGlvblJvdyIpICVdCiAgICA8bGkgY2xhc3M9IkluZGVudCBTcGFjaW5nQm90dG9tU21hbGwiPgogICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPVslIERhdGEuQ2hhbmdlSUQgfCB1cmkgJV07Q29uZGl0aW9uSUQ9WyUgRGF0YS5Db25kaXRpb25JRCB8IHVyaSAlXSIgY2xhc3M9IkFzUG9wdXBEaWFsb2ciPgogICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgPC9hPgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckluQ29uZGl0aW9uUm93IikgJV0KPC91bD4KClslIFJlbmRlckJsb2NrRW5kKCJXb3JrT3JkZXJJbkNvbmRpdGlvbiIpICVdCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyRWRpdC50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyRWRpdC50dCx2IDEuMyAyMDE5LzA1LzE5IDE0OjI5OjI2IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KCiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQgJXMlcy0lcyIsIENvbmZpZygiSVRTTVdvcmtPcmRlcjo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlciwgRGF0YS5Xb3JrT3JkZXJOdW1iZXIpIHwgaHRtbCAlXSAmbWRhc2g7IFslIERhdGEuV29ya09yZGVyVGl0bGUgfCBodG1sICVdPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgPC9wPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV29ya09yZGVySUQiIHZhbHVlPSJbJSBEYXRhLldvcmtPcmRlcklEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlT0ZPUksiPgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJXb3JrT3JkZXJUaXRsZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+KiA8L3NwYW4+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlclRpdGxlIiBpZD0iV29ya09yZGVyVGl0bGUiIHZhbHVlPSJbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuV29ya09yZGVyVGl0bGVTZXJ2ZXJFcnJvciB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IldvcmtPcmRlclRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJXb3JrT3JkZXJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiSW5zdHJ1Y3Rpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIEZpZWxkIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEyMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLkluc3RydWN0aW9uSW52YWxpZCAlXSIgbmFtZT0iSW5zdHJ1Y3Rpb24iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkluc3RydWN0aW9uIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJUeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikdyb3VwSUQiPlslIFRyYW5zbGF0ZSgiR3JvdXAiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuR3JvdXBPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBsYW5uZWQgU3RhcnQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QbGFubmVkU3RhcnRUaW1lU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVEYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZFN0YXJ0VGltZUhvdXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZFN0YXJ0VGltZUdlbmVyaWNTZXJ2ZXJFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZFN0YXJ0VGltZUhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRTdGFydFRpbWVHZW5lcmljU2VydmVyRXJyb3IiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkU3RhcnRUaW1lQmVmb3JlVGhhbkVuZFRpbWVTZXJ2ZXJFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBtdXN0IGJlIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRTdGFydFRpbWVIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoZSBwbGFubmVkIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZFN0YXJ0VGltZUJlZm9yZVRoYW5FbmRUaW1lU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QbGFubmVkRW5kVGltZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZURheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZUhvdXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVuZFRpbWVHZW5lcmljU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRW5kVGltZUhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFbmRUaW1lR2VuZXJpY1NlcnZlckVycm9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVuZFRpbWVCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUGxhbm5lZEVuZFRpbWVEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBtdXN0IGJlIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRFbmRUaW1lSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgcGxhbm5lZCBzdGFydCB0aW1lIG11c3QgYmUgYmVmb3JlIHRoZSBwbGFubmVkIGVuZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFbmRUaW1lQmVmb3JlVGhhbkVuZFRpbWVTZXJ2ZXJFcnJvciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTW92ZUZvbGxvd2luZ1dvcmtPcmRlcnMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik1vdmVGb2xsb3dpbmdXb3JrT3JkZXJzIj5bJSBUcmFuc2xhdGUoIk1vdmUgZm9sbG93aW5nIHdvcmtvcmRlcnMgYWNjb3JkaW5nbHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSWYgdGhlIHBsYW5uZWQgZW5kIHRpbWUgb2YgdGhpcyB3b3Jrb3JkZXIgaXMgY2hhbmdlZCwgdGhlIHBsYW5uZWQgc3RhcnQgdGltZXMgb2YgYWxsIGZvbGxvd2luZyB3b3Jrb3JkZXJzIHdpbGwgYmUgY2hhbmdlZCBhY2NvcmRpbmdseSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Ik1vdmVGb2xsb3dpbmdXb3JrT3JkZXJzIiBuYW1lPSJNb3ZlRm9sbG93aW5nV29ya09yZGVycyIgdmFsdWU9IjEiIFslIERhdGEuTW92ZUZvbGxvd2luZ1dvcmtPcmRlcnMgfCBodG1sICVdLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNb3ZlRm9sbG93aW5nV29ya09yZGVycyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93UGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUGxhbm5lZEVmZm9ydCI+WyUgVHJhbnNsYXRlKCJQbGFubmVkIEVmZm9ydCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBsYW5uZWRFZmZvcnQiIGlkPSJQbGFubmVkRWZmb3J0IiB2YWx1ZT0iWyUgRGF0YS5QbGFubmVkRWZmb3J0IHwgaHRtbCAlXSIgY2xhc3M9IlcxMHBjIFZhbGlkYXRlIFslIERhdGEuUGxhbm5lZEVmZm9ydEludmFsaWQgfCBodG1sICVdIiBtYXhsZW5ndGg9IjEwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlBsYW5uZWRFZmZvcnRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBmb3JtYXQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbGFubmVkRWZmb3J0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZm9ybWF0LiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTaG93UGxhbm5lZEVmZm9ydCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50VXBsb2FkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIHN0eWxlPSJtYXJnaW4tbGVmdDogMTIwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0F0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0V29ya09yZGVyRWRpdCIgYWNjZXNza2V5PSJnIiBuYW1lPSJXb3JrT3JkZXJFZGl0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5LnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KCiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxoMT4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJIaXN0b3J5IG9mICVzJXMtJXMiLCBDb25maWcoIklUU01Xb3JrT3JkZXI6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIsIERhdGEuV29ya09yZGVyTnVtYmVyKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgdHJ1bmNhdGUoNjApIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgIDwvcD4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJIaXN0b3J5IENvbnRlbnQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkFjdGlvbiIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkRldGFpbHMiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlVzZXIiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRldGltZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5IaXN0b3J5VHlwZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50IHwgdHJ1bmNhdGUoMTAwKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vSGlzdG9yeVpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KWyUgUmVuZGVyQmxvY2tFbmQoIk5vSGlzdG9yeVpvb20iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93SGlzdG9yeVpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb207SGlzdG9yeUVudHJ5SUQ9WyUgRGF0YS5IaXN0b3J5RW50cnlJRCAlXSI+WyUgVHJhbnNsYXRlKCJTaG93IGRldGFpbHMiKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJTaG93SGlzdG9yeVpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2hvd1dvcmtPcmRlclpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEICVdIj5bJSBUcmFuc2xhdGUoIlNob3cgd29ya29yZGVyIikgfCBodG1sICVdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd1dvcmtPcmRlclpvb20iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSb3ciKSAlXQoKICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20udHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20udHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgoKICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPgogICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhpc3Rvcnkgb2YgJXMlcy0lcyIsIENvbmZpZygiSVRTTVdvcmtPcmRlcjo6SG9vayIpLCBEYXRhLkNoYW5nZU51bWJlciwgRGF0YS5Xb3JrT3JkZXJOdW1iZXIpIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuV29ya09yZGVyVGl0bGUgfCB0cnVuY2F0ZSg2MCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgICAgICA8cD4KICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnk7V29ya09yZGVySUQ9WyUgRGF0YS5Xb3JrT3JkZXJJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJCYWNrIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIikgfCBodG1sICVdPC9hPgogICAgICAgIDwvcD4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkRldGFpbGVkIGhpc3RvcnkgaW5mb3JtYXRpb24gb2YgJXMiLCBEYXRhLkhpc3RvcnlUeXBlKSB8IGh0bWwgJV08L2gyPgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgoKICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTW9kaWZpZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPbGQgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50T2xkICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOZXcgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Db250ZW50TmV3ICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIChbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgIDwvZmllbGRzZXQ+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICA8L2Rpdj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0LnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQudHQsdiAxLjMgMjAxOS8wNy8zMSAwOToyMjozOSB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgVE9ETy4gQWRkIHZhbGlkYXRpb24gZm9yIHRoZSBhY3R1YWwgc3RhcnQgYW5kIGVuZCB0aW1lcyBpbiB0aGUgY2xpZW50IHNpZGUuCjxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXb3JrT3JkZXJJRCIgdmFsdWU9IlslIERhdGEuV29ya09yZGVySUQgfCBodG1sICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQgUmVwb3J0IG9mICVzJXMtJXMiLCBDb25maWcoIklUU01Xb3JrT3JkZXI6Okhvb2siKSwgRGF0YS5DaGFuZ2VOdW1iZXIsIERhdGEuV29ya09yZGVyTnVtYmVyKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgdHJ1bmNhdGUoNjApIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnRPRk9SSyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJSZXBvcnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQgRmllbGQiIHN0eWxlPSJtYXJnaW4tbGVmdDogMTgzcHg7Ij4KCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuUmVwb3J0SW52YWxpZCAlXSIgbmFtZT0iUmVwb3J0IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5SZXBvcnQgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iV29ya09yZGVyU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlU2VsZWN0ICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQiPgojICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0dWFsU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFjdHVhbCBTdGFydCBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQWN0dWFsU3RhcnRUaW1lU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQWN0dWFsU3RhcnRUaW1lRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQWN0dWFsU3RhcnRUaW1lSG91ckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3R1YWxTdGFydFRpbWVHZW5lcmljU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbFN0YXJ0VGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbFN0YXJ0VGltZUhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdHVhbFN0YXJ0VGltZUdlbmVyaWNTZXJ2ZXJFcnJvciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdHVhbFN0YXJ0VGltZUJlZm9yZVRoYW5FbmRUaW1lU2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbFN0YXJ0VGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgYWN0dWFsIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIGFjdHVhbCBlbmQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQWN0dWFsU3RhcnRUaW1lSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgYWN0dWFsIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIGFjdHVhbCBlbmQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxTdGFydFRpbWVCZWZvcmVUaGFuRW5kVGltZVNlcnZlckVycm9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0dWFsU3RhcnRUaW1lU2V0U2VydmVyRXJyb3IiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbFN0YXJ0VGltZURheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgYWN0dWFsIHN0YXJ0IHRpbWUgbXVzdCBiZSBzZXQsIHdoZW4gdGhlIGFjdHVhbCBlbmQgdGltZSBpcyBzZXQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbFN0YXJ0VGltZUhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhlIGFjdHVhbCBzdGFydCB0aW1lIG11c3QgYmUgc2V0LCB3aGVuIHRoZSBhY3R1YWwgZW5kIHRpbWUgaXMgc2V0ISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdHVhbFN0YXJ0VGltZVNldFNlcnZlckVycm9yIikgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0dWFsU3RhcnRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdHVhbEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0dWFsIEVuZCBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQWN0dWFsRW5kVGltZVNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbEVuZFRpbWVEYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJBY3R1YWxFbmRUaW1lSG91ckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdHVhbEVuZFRpbWVEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJBY3R1YWxFbmRUaW1lSG91clNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxFbmRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dBY2NvdW50ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFjY291bnRlZFRpbWUiPlslIFRyYW5zbGF0ZSgiQWNjb3VudGVkIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJBY2NvdW50ZWRUaW1lIiBuYW1lPSJBY2NvdW50ZWRUaW1lIiB2YWx1ZT0iWyUgRGF0YS5BY2NvdW50ZWRUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IjI1cGMgVmFsaWRhdGUgWyUgRGF0YS5BY2NvdW50ZWRUaW1lSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMTEiLz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJBY2NvdW50ZWRUaW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGZvcm1hdC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQWNjb3VudGVkVGltZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGZvcm1hdC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNob3dBY2NvdW50ZWRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQogICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIHN0eWxlPSJtYXJnaW4tbGVmdDogMTgzcHg7Ij4KICAgICAgICAgICAgICAgICAgICBbJSBJTkNMVURFICJGb3JtRWxlbWVudHMvQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRVcGxvYWQiKSAlXQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgaWQ9IlN1Ym1pdFdvcmtPcmRlckVkaXRSZXBvcnQiIGFjY2Vzc2tleT0iZyIgbmFtZT0iV29ya09yZGVyRWRpdCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyVGFrZS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJUYWtlLnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgVzMwMHB4Ij4KICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgIFslIERhdGEuV29ya09yZGVyVGl0bGUgfCBodG1sICVdCiAgICA8L3A+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VycmVudCBBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICBbJSBEYXRhLldvcmtPcmRlckFnZW50IHwgaHRtbCAlXQogICAgPC9wPgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPC9maWVsZHNldD4KPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgIFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIHRha2UgdGhpcyB3b3Jrb3JkZXI/IikgfCBodG1sICVdCjwvcD4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLnR0LHYgMS4zIDIwMTkvMDcvMzEgMDk6MjI6NTQgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSIgaWQ9IkNvbXBvc2UiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgICAgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgICB2YWx1ZT0iQWRkVGVtcGxhdGUiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV29ya09yZGVySUQiICB2YWx1ZT0iWyUgRGF0YS5Xb3JrT3JkZXJJRCB8IGh0bWwgJV0iPgoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiU2F2ZSBXb3Jrb3JkZXIgYXMgVGVtcGxhdGUiKSB8IGh0bWwgJV06IFslIENvbmZpZygiSVRTTVdvcmtPcmRlcjo6SG9vayIpICVdIFslIERhdGEuQ2hhbmdlTnVtYmVyICVdIC0gWyUgRGF0YS5Xb3JrT3JkZXJOdW1iZXIgfCBodG1sICVdOiBbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkNhbmNlbENsb3NlUG9wdXAiPlslIFRyYW5zbGF0ZSgiQ2FuY2VsICYgY2xvc2UiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwgQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGVPRk9SSyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUZW1wbGF0ZU5hbWUiPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGUgTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGVtcGxhdGVOYW1lIiBuYW1lPSJUZW1wbGF0ZU5hbWUiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLlRlbXBsYXRlTmFtZUludmFsaWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiQSB0ZW1wbGF0ZSBzaG91bGQgaGF2ZSBhIG5hbWUhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRlbXBsYXRlTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGUgdGVtcGxhdGUgbmFtZSBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNvbW1lbnQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0ZVJlc2V0Ij5bJSBUcmFuc2xhdGUoIlJlc2V0IFN0YXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhdGVSZXNldFNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVyd3JpdGVUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVUZW1wbGF0ZSI+WyUgVHJhbnNsYXRlKCJPdmVyd3JpdGUgb3JpZ2luYWwgdGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk92ZXJ3cml0ZVRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ3cml0ZVRlbXBsYXRlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRlbGV0ZVdvcmtPcmRlciIpICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZWxldGVXb3JrT3JkZXIiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIG9yaWdpbmFsIHdvcmtvcmRlciAoYW5kIHN1cnJvdW5kaW5nIGNoYW5nZSkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkRlbGV0ZVdvcmtPcmRlclNlbGVjdGlvblN0cmluZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEZWxldGVXb3JrT3JkZXIiKSAlXQoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkU2VsZWN0aW9uU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0QWRkVGVtcGxhdGUiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiBuYW1lPSJBZGRUZW1wbGF0ZSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNV29ya09yZGVyWm9vbS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyWm9vbS50dCx2IDEuMyAyMDE5LzA1LzE5IDE0OjM4OjIxIHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iQ2xlYXJMZWZ0Ij48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuV29ya09yZGVyU3RhdGVTaWduYWwgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxoMSB0aXRsZT0iWyUgQ29uZmlnKCJJVFNNV29ya09yZGVyOjpIb29rIikgJV06IFslIERhdGEuQ2hhbmdlTnVtYmVyIHwgaHRtbCAlXS1bJSBEYXRhLldvcmtPcmRlck51bWJlciB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIFslIENvbmZpZygiSVRTTVdvcmtPcmRlcjo6SG9vayIpICVdOiBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0tWyUgRGF0YS5Xb3JrT3JkZXJOdW1iZXIgfCBodG1sICVdIDxzcGFuPiZtZGFzaDs8L3NwYW4+IFslIERhdGEuV29ya09yZGVyVGl0bGUgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNV29ya29yZGVyWm9vbUluZm9ybWF0aW9uT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuV29ya09yZGVyU3RhdGVTaWduYWwgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXIgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVdvcmtPcmRlclR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlXb3JrT3JkZXJUeXBlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya09yZGVyVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5Xb3JrT3JkZXJUeXBlIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlclR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTVdvcmtvcmRlclpvb21JbmZvcm1hdGlvbk9GT1JLIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBTdGFydCBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5UGxhbm5lZFN0YXJ0VGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eVBsYW5uZWRTdGFydFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlBsYW5uZWRTdGFydFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRW1wdHlQbGFubmVkRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eVBsYW5uZWRFbmRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuUGxhbm5lZEVuZFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFbmRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0dWFsIFN0YXJ0IFRpbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5QWN0dWFsU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iLSI+LTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVtcHR5QWN0dWFsU3RhcnRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0dWFsU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkFjdHVhbFN0YXJ0VGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0dWFsU3RhcnRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0dWFsIEVuZCBUaW1lIikgfCBodG1sICVdOiA8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eUFjdHVhbEVuZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlBY3R1YWxFbmRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0dWFsRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5BY3R1YWxFbmRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxFbmRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dQbGFubmVkRWZmb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFZmZvcnQiKSB8IGh0bWwgJV06IDwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5UGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eVBsYW5uZWRFZmZvcnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkRWZmb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlBsYW5uZWRFZmZvcnQgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNob3dQbGFubmVkRWZmb3J0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNob3dBY2NvdW50ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWNjb3VudGVkIFRpbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVtcHR5QWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9Ii0iPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eUFjY291bnRlZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY2NvdW50ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkFjY291bnRlZFRpbWUgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNob3dBY2NvdW50ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKIyBzaG93IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiMgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3cgQWdlbnRJVFNNV29ya29yZGVyWm9vbUluZm9ybWF0aW9uT0ZPUksiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgQWdlbnRJVFNNV29ya29yZGVyWm9vbUluZm9ybWF0aW9uT0ZPUksiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgQnVpbGRlciIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eUNoYW5nZUJ1aWxkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSItIj4tPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRW1wdHlDaGFuZ2VCdWlsZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hhbmdlQnVpbGRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuQ2hhbmdlQnVpbGRlclVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VCdWlsZGVyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDaGFuZ2VCdWlsZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVdvcmtPcmRlckFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iLSI+LTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVtcHR5V29ya09yZGVyQWdlbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJBZ2VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBHcm91cCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVdvcmtPcmRlckdyb3VwIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iLSI+LTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVtcHR5V29ya09yZGVyR3JvdXAiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJHcm91cCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuV29ya09yZGVyR3JvdXAgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyR3JvdXAgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckdyb3VwIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLkNyZWF0ZVVzZXJGdWxsbmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBBZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgY2hhbmdlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DaGFuZ2VVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlVXNlckZ1bGxuYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNZXRhIikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1lbnUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgaWQ9Ik1lbnVbJSBEYXRhLk1lbnVJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLk1lbnVDbGFzcyB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnUiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPjxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudC4iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciIpIHwgaHRtbCAlXSAtIFslIERhdGEuV29ya09yZGVyVGl0bGUgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIEFnZW50SVRTTVdvcmtvcmRlclpvb21PRk9SSyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48c3Ryb25nPlslIFRyYW5zbGF0ZSgiSVRTTSBDaGFuZ2UiKSB8IGh0bWwgJV08L3N0cm9uZz48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DaGFuZ2VTdGF0ZVNpZ25hbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNoYW5nZVN0YXRlKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlTnVtYmVyIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9WyUgRGF0YS5DaGFuZ2VJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VUaXRsZSB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48c3Ryb25nPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIikgfCBodG1sICVdPC9zdHJvbmc+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuV29ya09yZGVyU3RhdGVTaWduYWwgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZU51bWJlciB8IGh0bWwgJV0gLSBbJSBEYXRhLldvcmtPcmRlck51bWJlciB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+WyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV08L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMgU2hvdyBpbmZvLCB0aGF0IGxpbmtzIHdpdGhpbiB0aGUgaWZyYW1lIG11c3QgYmUgY2xpY2tlZCB3aXRoIHN0cmcvY21kL3NoaWZ0IChkZXBlbmRpbmcgb24gdGhlIHVzZWQgYnJvd3NlciBhbmQgb3MpCiMgdG8gb3BlbiB0aGUgbGlua3MgaW4gYSBuZXcgd2luZG93IHdpdGhvdXQgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdpdmVuIHRvIHRoZSBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSVRTTU1lc3NhZ2VCcm93c2VyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8gb3BlbiBsaW5rcyBpbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGJsb2NrcywgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2xvc2UiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNsb3NlIHRoaXMgbWVzc2FnZSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJVFNNQ29udGVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIERhdGEuRmllbGQgKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiMgVXNlIHRoZSBIVE1MNSBzYW5kYm94IGF0dHJpYnV0ZSB0byBwcmV2ZW50IHBsdWdpbnMgYW5kIHNjcmlwdHMgZnJvbSBiZWluZyBleGVjdXRlZCBpbiB0aGUgYnJvd3Nlci4KIyBVc2UgSUUncyAobm9uLXN0YW5kYXJkKSBzZWN1cml0eSBhdHRyaWJ1dGUgdG8gYWNoaWV2ZSBzb21ldGhpbmcgc2ltaWxhciBpbiBvbGRlciBJRSBicm93c2Vycy4gQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBbJSBEYXRhLk1TU2VjdXJpdHlSZXN0cmljdGVkICVdIGNsYXNzPSJGaWVsZCIgaWQ9IklmcmFtZUlUU01bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXSIgb25sb2FkPSJpZiAodHlwZW9mIElUU00gPT09ICdvYmplY3QnICYmIHR5cGVvZiBJVFNNLkFnZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Llpvb20gPT09ICdvYmplY3QnKSB7IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5ab29tLklmcmFtZUF1dG9IZWlnaHQoJCgnI0lmcmFtZUlUU01bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXScpKTsgfTsiIHNyYz0iIyIgZGF0YS1zcmM9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1N1YmFjdGlvbj1IVE1MVmlldztXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgaHRtbCAlXTtGaWVsZD1bJSBEYXRhLkZpZWxkIHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIklUU01Db250ZW50IikgJV0KCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoIldvcmtvcmRlciIpIHwgaHRtbCAlXSk6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEb3dubG9hZEF0dGFjaG1lbnQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRvd25sb2FkIEF0dGFjaG1lbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZW5hbWU9WyUgRGF0YS5GaWxlbmFtZSB8IHVyaSAlXTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFslIERhdGEuRmlsZXNpemUgfCBMb2NhbGl6ZSgnRmlsZXNpemUnKSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXR0YWNobWVudFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdIChbJSBUcmFuc2xhdGUoIlJlcG9ydCIpIHwgaHRtbCAlXSk6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXBvcnRBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEb3dubG9hZEF0dGFjaG1lbnQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRvd25sb2FkIEF0dGFjaG1lbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZW5hbWU9WyUgRGF0YS5GaWxlbmFtZSB8IHVyaSAlXTtUeXBlPVdvcmtPcmRlclJlcG9ydDtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlcG9ydEF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQ3VzdG9tZXJJVFNNQ2hhbmdlT3ZlcnZpZXcudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ3VzdG9tZXJJVFNNQ2hhbmdlT3ZlcnZpZXcudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGlkPSJNYWluQm94IiBjbGFzcz0iVGlja2V0VmlldyBBUklBUm9sZU1haW4gU29ydGFibGUiPgogICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICA8dWwgY2xhc3M9IkZpbHRlciBUYWJzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlsdGVySGVhZGVyIikgJV0KICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzTEkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzQSB8IGh0bWwgJV0iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1bJSBFbnYoIlN1YmFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTb3J0Qnk9WyUgRGF0YS5Tb3J0QnkgfCB1cmkgJV07T3JkZXI9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdOyI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIFslIERhdGEuQ291bnRTdHJnIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVySGVhZGVyIikgJV0KICAgICAgICAgICAgPGxpIGNsYXNzPSJDbGVhciI+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxkaXYgY2xhc3M9IlRhYnMgUGFnaW5hdGlvbiI+CiAgICAgICAgICAgIFslIERhdGEuU2l0ZU5hdkJhciAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPHRhYmxlIGNsYXNzPSJJVFNNT3ZlcnZpZXciPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVN0YXRlU2lnbmFsSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVN0YXRlU2lnbmFsSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlcyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VOdW1iZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2hhbmdlTnVtYmVyIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNoYW5nZU51bWJlcjtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgQ29uZmlnKCJJVFNNQ2hhbmdlOjpIb29rIikgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZU51bWJlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlck51bWJlckhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXb3JrT3JkZXJOdW1iZXIgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9V29ya09yZGVyTnVtYmVyO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBDb25maWcoIklUU01Xb3JrT3JkZXI6Okhvb2siKSAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyTnVtYmVySGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyVGl0bGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iV29ya09yZGVyVGl0bGUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9V29ya09yZGVyVGl0bGU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIFRpdGxlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUaXRsZUhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVRpdGxlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNoYW5nZVRpdGxlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNoYW5nZVRpdGxlO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkNoYW5nZSBUaXRsZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlVGl0bGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJBZ2VudEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXb3JrT3JkZXJBZ2VudElEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PVdvcmtPcmRlckFnZW50SUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIEFnZW50IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJBZ2VudEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZUJ1aWxkZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2hhbmdlQnVpbGRlcklEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNoYW5nZUJ1aWxkZXJJRDtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgQnVpbGRlciIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlQnVpbGRlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZU1hbmFnZXJIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2hhbmdlQnVpbGRlcklEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNoYW5nZU1hbmFnZXJJRDtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgTWFuYWdlciIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ2hhbmdlTWFuYWdlckhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlckNvdW50SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGg+PHNwYW4+WyUgVHJhbnNsYXRlKCJXb3Jrb3JkZXJzIikgfCBodG1sICVdPC9zcGFuPjwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJDb3VudEhlYWRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVN0YXRlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNoYW5nZVN0YXRlSUQgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9Q2hhbmdlU3RhdGVJRDtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJDaGFuZ2UgU3RhdGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVN0YXRlSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyU3RhdGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iV29ya09yZGVyU3RhdGVJRCBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Xb3JrT3JkZXJTdGF0ZUlEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBTdGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyU3RhdGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJUeXBlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IldvcmtPcmRlclR5cGVJRCBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Xb3JrT3JkZXJUeXBlSUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiV29ya29yZGVyIFR5cGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlclR5cGVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDYXRlZ29yeUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDYXRlZ29yeUlEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNhdGVnb3J5SUQ7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ2F0ZWdvcnkiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENhdGVnb3J5SGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkSW1wYWN0SGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkltcGFjdElEIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUltcGFjdElEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkSW1wYWN0SGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUHJpb3JpdHlIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iUHJpb3JpdHlJRCBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1Qcmlvcml0eUlEO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRQcmlvcml0eUhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRTZXJ2aWNlc0hlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2VydmljZXMiKSB8IGh0bWwgJV08L3NwYW4+PC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFNlcnZpY2VzSGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFJlcXVlc3RlZFRpbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iUmVxdWVzdGVkVGltZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtbJSBEYXRhLkxpbmtTb3J0ICVdO1NvcnRCeT1SZXF1ZXN0ZWRUaW1lO09yZGVyQnk9WyUgRGF0YS5PcmRlckJ5IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIlJlcXVlc3RlZCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRSZXF1ZXN0ZWRUaW1lSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUGxhbm5lZFN0YXJ0VGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJQbGFubmVkU3RhcnRUaW1lIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PVBsYW5uZWRTdGFydFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBTdGFydCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRQbGFubmVkU3RhcnRUaW1lSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUGxhbm5lZEVuZFRpbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iUGxhbm5lZEVuZFRpbWUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07WyUgRGF0YS5MaW5rU29ydCAlXTtTb3J0Qnk9UGxhbm5lZEVuZFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkUGxhbm5lZEVuZFRpbWVIZWFkZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRBY3R1YWxTdGFydFRpbWVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQWN0dWFsU3RhcnRUaW1lIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUFjdHVhbFN0YXJ0VGltZTtPcmRlckJ5PVslIERhdGEuT3JkZXJCeSB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJBY3R1YWwgU3RhcnQgVGltZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQWN0dWFsU3RhcnRUaW1lSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQWN0dWFsRW5kVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJBY3R1YWxFbmRUaW1lIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUFjdHVhbEVuZFRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQWN0dWFsIEVuZCBUaW1lIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRBY3R1YWxFbmRUaW1lSGVhZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ3JlYXRlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDcmVhdGVUaW1lIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1slIERhdGEuTGlua1NvcnQgJV07U29ydEJ5PUNyZWF0ZVRpbWU7T3JkZXJCeT1bJSBEYXRhLk9yZGVyQnkgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3JlYXRlVGltZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Ub3RhbENvbHVtbnMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmQiKSAlXQogICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DaGFuZ2VTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DaGFuZ2VTdGF0ZVNpZ25hbCB8IGh0bWwgJV0iPiJbJSBEYXRhLkNoYW5nZVN0YXRlIHwgaHRtbCAlXSI8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlclN0YXRlU2lnbmFsIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLldvcmtPcmRlclN0YXRlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLldvcmtPcmRlclN0YXRlU2lnbmFsIHwgaHRtbCAlXSI+IlslIERhdGEuV29ya09yZGVyU3RhdGUgfCBodG1sICVdIjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlclN0YXRlU2lnbmFsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5DaGFuZ2VOdW1iZXIgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZU51bWJlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlck51bWJlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuQ2hhbmdlTnVtYmVyIHwgaHRtbCAlXS1bJSBEYXRhLldvcmtPcmRlck51bWJlciB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkV29ya09yZGVyTnVtYmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyVGl0bGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgdHJ1bmNhdGUoNDApIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUaXRsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZVRpdGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ2hhbmdlVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLkNoYW5nZVRpdGxlIHwgdHJ1bmNhdGUoNDApIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VUaXRsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFdvcmtPcmRlckFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJBZ2VudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZENoYW5nZUJ1aWxkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DaGFuZ2VCdWlsZGVyVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZUJ1aWxkZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRDaGFuZ2VCdWlsZGVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlTWFuYWdlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNoYW5nZU1hbmFnZXJVc2VyRnVsbG5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlTWFuYWdlclVzZXJGdWxsbmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZU1hbmFnZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRXb3JrT3JkZXJDb3VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDZW50ZXIiPlslIERhdGEuV29ya09yZGVyQ291bnQgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlckNvdW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2hhbmdlU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5DaGFuZ2VTdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENoYW5nZVN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFdvcmtPcmRlclN0YXRlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkV29ya09yZGVyVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIFRyYW5zbGF0ZShEYXRhLldvcmtPcmRlclR5cGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRXb3JrT3JkZXJUeXBlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQ2F0ZWdvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5DYXRlZ29yeSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZENhdGVnb3J5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkSW1wYWN0IikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgVHJhbnNsYXRlKERhdGEuSW1wYWN0KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkSW1wYWN0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFByaW9yaXR5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkU2VydmljZXMiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJJVFNNRmxhZyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFNlcnZpY2VzU3ViRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPiJbJSBEYXRhLkN1cnJJbmNpU3RhdGUgfCBodG1sICVdIjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFNlcnZpY2VzU3ViRWxlbWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFNlcnZpY2VzU3ViRWxlbWVudEVtcHR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4mbmJzcDs8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkU2VydmljZXNTdWJFbGVtZW50RW1wdHkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRTZXJ2aWNlcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZFJlcXVlc3RlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBEYXRhLlJlcXVlc3RlZFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRSZXF1ZXN0ZWRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkUGxhbm5lZFN0YXJ0VGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuUGxhbm5lZFN0YXJ0VGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZFBsYW5uZWRTdGFydFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRQbGFubmVkRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuUGxhbm5lZEVuZFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJSZWNvcmRQbGFubmVkRW5kVGltZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlY29yZEFjdHVhbFN0YXJ0VGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuQWN0dWFsU3RhcnRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQWN0dWFsU3RhcnRUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVjb3JkQWN0dWFsRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlslIERhdGEuQWN0dWFsRW5kVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlY29yZEFjdHVhbEVuZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZWNvcmRDcmVhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+WyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkQ3JlYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVjb3JkIikgJV0KICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICA8L3RhYmxlPgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvSVRTTUNoYW5nZS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS50dCx2IDEuMiAyMDE5LzA1LzE5IDE0OjM4OjM1IHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya09yZGVyR3JhcGgiKSAlXQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgogICAgLkxhYmVsTWFyZ2luIHsKICAgICAgICBtYXJnaW4tbGVmdDogWyUgRGF0YS5MYWJlbE1hcmdpbiB8IGh0bWwgJV1weDsKICAgIH0KCiAgICAuUlRMIC5MYWJlbE1hcmdpbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiBbJSBEYXRhLkxhYmVsTWFyZ2luIHwgaHRtbCAlXXB4OwogICAgfQoKICAgIGRpdi5Xb3Jrb3JkZXJMYWJlbCB7CiAgICAgICAgd2lkdGg6IFslIERhdGEuTGFiZWxXaWR0aCB8IGh0bWwgJV1weDsKICAgIH0KCi8qIFslIFJlbmRlckJsb2NrU3RhcnQoIkNTU1dvcmtPcmRlclR5cGUiKSAlXSAqLwogICAgc3Bhbi5bJSBEYXRhLldvcmtPcmRlclR5cGVOYW1lIHwgaHRtbCAlXSB7IGJhY2tncm91bmQtY29sb3I6IFslIERhdGEuV29ya09yZGVyVHlwZUNvbG9yIHwgaHRtbCAlXTsgfQovKiBbJSBSZW5kZXJCbG9ja0VuZCgiQ1NTV29ya09yZGVyVHlwZSIpICVdICovCgovKiBbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDU1NUaW1lTGluZSIpICVdICovCiAgICBkaXYuVGltZWxpbmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IFslIERhdGEuVGltZUxpbmVDb2xvciB8IGh0bWwgJV07CiAgICAgICAgbGVmdDogWyUgRGF0YS5UaW1lTGluZUxlZnQgfCBodG1sICVdJTsKICAgICAgICB3aWR0aDogWyUgRGF0YS5UaW1lTGluZVdpZHRoIHwgaHRtbCAlXXB4OwogICAgfQoKICAgIC5SVEwgZGl2LlRpbWVsaW5lIHsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICAgIHJpZ2h0OiBbJSBEYXRhLlRpbWVMaW5lTGVmdCB8IGh0bWwgJV0lOwogICAgfQovKiBbJSBSZW5kZXJCbG9ja0VuZCgiQ1NTVGltZUxpbmUiKSAlXSAqLwo8L3N0eWxlPgoKPGRpdiBjbGFzcz0iV29ya29yZGVyR3JhcGhCb3giPgogICAgPGRpdiBjbGFzcz0iV29ya29yZGVyR3JhcGgiPgogICAgICAgIDxkaXYgY2xhc3M9IkxpbmVzU2NhbGVCb3giPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJMaW5lc1NjYWxlIExhYmVsTWFyZ2luIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZUxpbmUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVGltZWxpbmUiPiZuYnNwOzwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZUxpbmUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2NhbGVWZXJ0aWNhbExpbmUgU2NhbGUwIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNjYWxlVmVydGljYWxMaW5lIFNjYWxlMjAiPiZuYnNwOzwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2NhbGVWZXJ0aWNhbExpbmUgU2NhbGU0MCI+Jm5ic3A7PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY2FsZVZlcnRpY2FsTGluZSBTY2FsZTYwIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNjYWxlVmVydGljYWxMaW5lIFNjYWxlODAiPiZuYnNwOzwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2NhbGVWZXJ0aWNhbExpbmUgU2NhbGUxMDAiPiZuYnNwOzwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtPcmRlckl0ZW0iKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldvcmtvcmRlckxhYmVsIiB0aXRsZT0iWyUgRGF0YS5Xb3JrT3JkZXJMYWJlbCB8IGh0bWwgJV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLldvcmtPcmRlclN0YXRlU2lnbmFsIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuV29ya09yZGVyU3RhdGUpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPVslIERhdGEuV29ya09yZGVySUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5Xb3JrT3JkZXJOdW1iZXIgfCBodG1sICVdLgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJJdGVtU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgLSBbJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJXb3JrT3JkZXJJdGVtU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JrT3JkZXJJdGVtVGl0bGUiKSAlXQogICAgICAgICAgICAgICAgLSBbJSBEYXRhLldvcmtPcmRlclRpdGxlIHwgdHJ1bmNhdGUoMjApIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVySXRlbVRpdGxlIikgJV0KICAgICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya09yZGVySXRlbUdyYXBoIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXb3Jrb3JkZXIgTGFiZWxNYXJnaW4iPgogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD1bJSBEYXRhLldvcmtPcmRlcklEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLldvcmtPcmRlclR5cGUgfCBodG1sICVdX3BsYW5uZWQgWyUgRGF0YS5Xb3JrT3JkZXJPcGFjaXR5ICVdIiBzdHlsZT0iWyUgRGF0YS5HcmFwaERpcmVjdGlvbiB8IGh0bWwgJV06IFslIERhdGEuUGxhbm5lZFBhZGRpbmcgfCBodG1sICVdJTsgd2lkdGg6IFslIERhdGEuUGxhbm5lZFRpY2tzIHwgaHRtbCAlXSUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLldvcmtPcmRlclR5cGUgfCBodG1sICVdX2FjdHVhbCBbJSBEYXRhLldvcmtPcmRlck9wYWNpdHkgJV0iIHN0eWxlPSJbJSBEYXRhLkdyYXBoRGlyZWN0aW9uIHwgaHRtbCAlXTogWyUgRGF0YS5BY3R1YWxQYWRkaW5nIHwgaHRtbCAlXSU7IHdpZHRoOiBbJSBEYXRhLkFjdHVhbFRpY2tzIHwgaHRtbCAlXSUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXb3Jrb3JkZXJEZXRhaWxzIj4KICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBBZ2VudElUU01Xb3Jrb3JkZXJJbmZvcm1hdGlvbkJveE9GT1JLIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtPcmRlclRpdGxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5Xb3JrT3JkZXJUaXRsZSB8IHRydW5jYXRlKDQwKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVyVGl0bGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya09yZGVyU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Xb3JrT3JkZXJTdGF0ZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlclN0YXRlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtPcmRlclR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLldvcmtPcmRlclR5cGUpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJXb3JrT3JkZXJUeXBlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuVmFsdWUgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIldvcmtPcmRlckFnZW50QmxvY2siKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIldvcmtvcmRlciBBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFbXB0eVdvcmtPcmRlckFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPi08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJFbXB0eVdvcmtPcmRlckFnZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya09yZGVyQWdlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuV29ya09yZGVyQWdlbnRVc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVyQWdlbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckFnZW50QmxvY2siKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5zdHJ1Y3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkluc3RydWN0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkluc3RydWN0aW9uUGxhaW4gfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkluc3RydWN0aW9uIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlJlcG9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmVwb3J0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlJlcG9ydFBsYWluIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSZXBvcnQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUGxhbm5lZEVmZm9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFZmZvcnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuUGxhbm5lZEVmZm9ydCB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZEVmZm9ydCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY2NvdW50ZWRUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY2NvdW50ZWQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5BY2NvdW50ZWRUaW1lIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY2NvdW50ZWRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlBsYW5uZWRTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBsYW5uZWQgU3RhcnQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5QbGFubmVkU3RhcnRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUGxhbm5lZFN0YXJ0VGltZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQbGFubmVkRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGxhbm5lZCBFbmQgVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5QbGFubmVkRW5kVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBsYW5uZWRFbmRUaW1lIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdHVhbFN0YXJ0VGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0dWFsIFN0YXJ0IFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQWN0dWFsU3RhcnRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV1bJSBEYXRhLkVtcHR5QWN0dWFsU3RhcnRUaW1lIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxTdGFydFRpbWUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0dWFsRW5kVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWN0dWFsIEVuZCBUaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkFjdHVhbEVuZFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXVslIERhdGEuRW1wdHlBY3R1YWxFbmRUaW1lIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3R1YWxFbmRUaW1lIikgJV0KCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckl0ZW1HcmFwaCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV29ya09yZGVySXRlbSIpICVdCiAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlNjYWxlIikgJV0KICAgIDxkaXYgY2xhc3M9IkxhYmVsTWFyZ2luIj4KICAgICAgICA8ZGl2IGNsYXNzPSJTY2FsZUhvcml6b250YWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY2FsZUVudHJ5IFNjYWxlMCBTY2FsZUVudHJ5VGFpbCI+WyUgRGF0YS5TdGFydFRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTY2FsZUxhYmVsIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2NhbGVFbnRyeSBbJSBEYXRhLlNjYWxlQ2xhc3MgJV0iPlslIERhdGEuU2NhbGVMYWJlbCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTY2FsZUxhYmVsIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2NhbGVFbnRyeSBTY2FsZTkwIFNjYWxlRW50cnlUcmFpbCI+WyUgRGF0YS5FbmRUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2NhbGUiKSAlXQo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtPcmRlckdyYXBoIikgJV0K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSB2YXJzIHF3KEBJU0EpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UgLSBjaGFuZ2UgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBmdW5jdGlvbnMgZm9yIGNoYW5nZXMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZ2V0IHRoZSBjYWNoZSB0eXBlIGFuZCBUVEwgKGluIHNlY29uZHMpCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpDYWNoZVRUTCcpICogNjA7CgogICAgQElTQSA9ICgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcicsCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0lUU01DaGFuZ2U6OkV2ZW50TW9kdWxlJywKICAgICk7CgogICAgIyBsb2FkIGNoYW5nZSBudW1iZXIgZ2VuZXJhdG9yCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3InKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6TnVtYmVyOjpEYXRlQ2hlY2tzdW0nOwogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZUJhc2VDbGFzcygkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICBkaWUgIkNhbid0IGxvYWQgY2hhbmdlIG51bWJlciBnZW5lcmF0b3IgYmFja2VuZCBtb2R1bGUgJEdlbmVyYXRvck1vZHVsZSEgJEAiOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIHR5cGUKICAgICRTZWxmLT57REJUeXBlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT57J0RCOjpUeXBlJ30gfHwgJyc7CiAgICAkU2VsZi0+e0RCVHlwZX0gPSBsYyAkU2VsZi0+e0RCVHlwZX07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQ2hhbmdlQWRkKCkKCkFkZCBhIG5ldyBjaGFuZ2UuIFRoZSBVc2VySUQgaXMgdGhlIG9ubHkgcmVxdWlyZWQgcGFyYW1ldGVyLgpJbnRlcm5hbGx5IGZpcnN0IGEgbWluaW1hbCBjaGFuZ2UgaXMgY3JlYXRlZCwgdGhlbiBDaGFuZ2VVcGRhdGUoKSBpcyBjYWxsZWQuCgogICAgbXkgJENoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCm9yCgogICAgbXkgJENoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnUmVwbGFjZW1lbnQgb2YgbWFpbCBzZXJ2ZXInLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ05ldyBtYWlsIHNlcnZlciBpcyBmYXN0ZXInLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICdPbGQgbWFpbCBzZXJ2ZXIgdG9vIHNsb3cnLCAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZVN0YXRlSUQgICA9PiA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgQ2hhbmdlU3RhdGUgPT4gJ2FjY2VwdGVkJwogICAgICAgIENoYW5nZVN0YXRlICAgICA9PiAnYWNjZXB0ZWQnLCAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgQ2hhbmdlU3RhdGVJRCA9PiA0CiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENhdGVnb3J5ID0+ICczIG5vcm1hbCcKICAgICAgICBDYXRlZ29yeSAgICAgICAgPT4gJzMgbm9ybWFsJywgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENhdGVnb3J5SUQgPT4gNAogICAgICAgIEltcGFjdElEICAgICAgICA9PiA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgSW1wYWN0ID0+ICc0IGhpZ2gnCiAgICAgICAgSW1wYWN0ICAgICAgICAgID0+ICc0IGhpZ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBJbXBhY3RJRCA9PiA1CiAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+IDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBQcmlvcml0eSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgUHJpb3JpdHkgICAgICAgID0+ICc1IHZlcnkgaGlnaCcsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBQcmlvcml0eUlEID0+IDYKICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWyAxLCAyLCA0IF0sICAgICAjIFVzZXJJRHMgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ0FCQ3VzdG9tZXJzICAgID0+IFsgJ3R0JywgJ21tJyBdLCAgIyBDdXN0b21lclVzZXJJRHMgICMgKG9wdGlvbmFsKQogICAgICAgIFJlcXVlc3RlZFRpbWUgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEeW5hbWljRmllbGRfWCAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRHluYW1pY0ZpZWxkX1kgID0+ICdFYXJ0aCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGEgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGFyZ3VtZW50cyB3aGljaCBtaWdodCBjb250YWluIEhUTUwgbWFya3VwCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24pKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyIke0FyZ3VtZW50fVBsYWluIn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICApOwogICAgICAgIHV0Zjg6OnVwZ3JhZGUoICRQYXJhbXsiJHtBcmd1bWVudH1QbGFpbiJ9ICk7CiAgICB9CgogICAgIyBjaGVjayB0aGUgcGFyYW1ldGVycwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrQ2hhbmdlUGFyYW1zKCVQYXJhbSk7CgogICAgIyB0cmlnZ2VyIENoYW5nZUFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQWRkUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjcmVhdGUgYSBuZXcgY2hhbmdlIG51bWJlcgogICAgbXkgJENoYW5nZU51bWJlciA9ICRTZWxmLT5DaGFuZ2VDcmVhdGVOdW1iZXIoKTsKCiAgICAjIGdldCBpbml0aWFsIGNoYW5nZSBzdGF0ZSBpZAogICAgbXkgJENoYW5nZVN0YXRlSUQgPSBkZWxldGUgJFBhcmFte0NoYW5nZVN0YXRlSUR9OwogICAgaWYgKCAhJENoYW5nZVN0YXRlSUQgKSB7CiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyktPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAwLAogICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICApOwogICAgICAgICRDaGFuZ2VTdGF0ZUlEID0gJE5leHRTdGF0ZUlEcy0+WzBdOwogICAgfQoKICAgICMgZ2V0IGRlZmF1bHQgQ2F0ZWdvcnkgaWYgbm90IGRlZmluZWQKICAgIG15ICRDYXRlZ29yeUlEID0gZGVsZXRlICRQYXJhbXtDYXRlZ29yeUlEfTsKICAgIGlmICggISRDYXRlZ29yeUlEICkgewogICAgICAgIG15ICREZWZhdWx0Q2F0ZWdvcnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01DaGFuZ2U6OkNhdGVnb3J5OjpEZWZhdWx0Jyk7CiAgICAgICAgJENhdGVnb3J5SUQgPSAkU2VsZi0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICBDSVAgID0+ICREZWZhdWx0Q2F0ZWdvcnksCiAgICAgICAgICAgIFR5cGUgPT4gJ0NhdGVnb3J5JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGRlZmF1bHQgSW1wYWN0IGlmIG5vdCBkZWZpbmVkCiAgICBteSAkSW1wYWN0SUQgPSBkZWxldGUgJFBhcmFte0ltcGFjdElEfTsKICAgIGlmICggISRJbXBhY3RJRCApIHsKICAgICAgICBteSAkRGVmYXVsdEltcGFjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6SW1wYWN0OjpEZWZhdWx0Jyk7CiAgICAgICAgJEltcGFjdElEID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgQ0lQICA9PiAkRGVmYXVsdEltcGFjdCwKICAgICAgICAgICAgVHlwZSA9PiAnSW1wYWN0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGRlZmF1bHQgUHJpb3JpdHkgaWYgbm90IGRlZmluZWQKICAgIG15ICRQcmlvcml0eUlEID0gZGVsZXRlICRQYXJhbXtQcmlvcml0eUlEfTsKICAgIGlmICggISRQcmlvcml0eUlEICkgewogICAgICAgICRQcmlvcml0eUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZScpLT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEltcGFjdElEICAgPT4gJEltcGFjdElELAogICAgICAgICk7CiAgICB9CgogICAgIyBpZiBubyBjaGFuZ2UgYnVpbGRlciBpZCB3YXMgZ2l2ZW4sIHRha2UgdGhlIHVzZXIgaWQKICAgIG15ICRDaGFuZ2VCdWlsZGVySUQgPSAkUGFyYW17Q2hhbmdlQnVpbGRlcklEfSB8fCAkUGFyYW17VXNlcklEfTsKCiAgICAjIGFkZCBjaGFuZ2UgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX2l0ZW0gJwogICAgICAgICAgICAuICcoY2hhbmdlX251bWJlciwgY2hhbmdlX3N0YXRlX2lkLCBjaGFuZ2VfYnVpbGRlcl9pZCwgJwogICAgICAgICAgICAuICdjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCwgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkQ2hhbmdlTnVtYmVyLCBcJENoYW5nZVN0YXRlSUQsIFwkQ2hhbmdlQnVpbGRlcklELAogICAgICAgICAgICBcJENhdGVnb3J5SUQsICAgXCRJbXBhY3RJRCwgICAgICBcJFByaW9yaXR5SUQsCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSBpZAogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJENoYW5nZU51bWJlciwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hhbmdlSUQ7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQ2hhbmdlR2V0OjpJRDo6JyAuICRDaGFuZ2VJRCwKICAgICAgICAnQ2hhbmdlTGlzdCcsCiAgICAgICAgJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlSUQ6OicgLiAkQ2hhbmdlSUQsCiAgICAgICAgJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlTnVtYmVyOjonIC4gJENoYW5nZU51bWJlciwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ2hhbmdlQWRkUG9zdC1FdmVudAogICAgIyAoeWVzLCB3ZSB3YW50IGRvIGRvIHRoaXMgYmVmb3JlIHRoZSBDaGFuZ2VVcGRhdGUhKQogICAgIyBvdmVycmlkZSB0aGUgYWN0dWFsbHkgcGFzc2VkIGNoYW5nZSBzdGF0ZSB3aXRoIHRoZSBpbml0aWFsIGNoYW5nZSBzdGF0ZQogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQWRkUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBDYXRlZ29yeUlEICAgID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBJbXBhY3RJRCAgICAgID0+ICRJbXBhY3RJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVJRCwKICAgICAgICAgICAgQ2hhbmdlTnVtYmVyICA9PiAkQ2hhbmdlTnVtYmVyLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHVwZGF0ZSBjaGFuZ2Ugd2l0aCByZW1haW5pbmcgcGFyYW1ldGVycwogICAgIyB0aGUgYWxyZWFkeSBoYW5kbGVzIHBhcmFtcyBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tICVQYXJhbQogICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+Q2hhbmdlVXBkYXRlKAogICAgICAgICVQYXJhbSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICApOwoKICAgICMgY2hlY2sgdXBkYXRlIGVycm9yCiAgICBpZiAoICEkVXBkYXRlU3VjY2VzcyApIHsKCiAgICAgICAgIyBkZWxldGUgY2hhbmdlIGlmIGl0IGNvdWxkIG5vdCBiZSB1cGRhdGVkCiAgICAgICAgJFNlbGYtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRDaGFuZ2VJRDsKfQoKPWhlYWQyIENoYW5nZVVwZGF0ZSgpCgpVcGRhdGUgYSBjaGFuZ2UuCkxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBmcm9tIEM8Q2hhbmdlVGl0bGU+LgpQYXNzaW5nIHVuZGVmaW5lZCB2YWx1ZXMgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkLgpBbiBleGNlcHRpb24gaXMgdGhlIHBhcmFtZXRlciBDPFJlcXVlc3RlZFRpbWU+LCB3aGVyZSB0aGUgdW5kZWZpbmVkIHZhbHVlCmluZGljYXRlcyB0aGF0IHJlcXVlc3RlZCB0aW1lIG9mIHRoZSBjaGFuZ2Ugc2hvdWxkIGJlIGNsZWFyZWQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgID0+IDEyMywKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgPT4gJ1JlcGxhY2VtZW50IG9mIHNsb3cgbWFpbCBzZXJ2ZXInLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICdOZXcgbWFpbCBzZXJ2ZXIgaXMgZmFzdGVyJywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnT2xkIG1haWwgc2VydmVyIHRvbyBzbG93JywgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgICAgPT4gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENoYW5nZVN0YXRlID0+ICdhY2NlcHRlZCcKICAgICAgICBDaGFuZ2VTdGF0ZSAgICAgICAgPT4gJ2FjY2VwdGVkJywgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENoYW5nZVN0YXRlSUQgPT4gNAogICAgICAgIENoYW5nZU1hbmFnZXJJRCAgICA9PiA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgPT4gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgICAgID0+IDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDYXRlZ29yeSA9PiAnMyBub3JtYWwnCiAgICAgICAgQ2F0ZWdvcnkgICAgICAgICAgID0+ICczIG5vcm1hbCcsICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDYXRlZ29yeUlEID0+IDQKICAgICAgICBJbXBhY3RJRCAgICAgICAgICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIEltcGFjdCA9PiAnNCBoaWdoJwogICAgICAgIEltcGFjdCAgICAgICAgICAgICA9PiAnNCBoaWdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgSW1wYWN0SUQgPT4gNQogICAgICAgIFByaW9yaXR5SUQgICAgICAgICA9PiA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgUHJpb3JpdHkgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgIFByaW9yaXR5ICAgICAgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgUHJpb3JpdHlJRCA9PiA2CiAgICAgICAgQ0FCQWdlbnRzICAgICAgICAgID0+IFsgMSwgMiwgNCBdLCAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBVc2VySURzCiAgICAgICAgQ0FCQ3VzdG9tZXJzICAgICAgID0+IFsgJ3R0JywgJ21tJyBdLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBDdXN0b21lclVzZXJJRHMKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yICd1bmRlZicsIHdoaWNoIGNsZWFycyB0aGUgdGltZQogICAgICAgIER5bmFtaWNGaWVsZF9YICAgICA9PiAnU3VuJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEeW5hbWljRmllbGRfWSAgICAgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQnlwYXNzU3RhdGVNYWNoaW5lID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAsIGlmIDEgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBiZSBieXBhc3NlZAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgVXNlcklEICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIENoYW5nZVN0YXRlIGFuZCBDaGFuZ2VTdGF0ZUlEIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17Q2hhbmdlU3RhdGV9ICYmICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIENoYW5nZVN0YXRlIE9SIENoYW5nZVN0YXRlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd2hlbiB0aGUgU3RhdGUgaXMgZ2l2ZW4sIHRoZW4gbG9vayB1cCB0aGUgSUQKICAgIGlmICggJFBhcmFte0NoYW5nZVN0YXRlfSApIHsKICAgICAgICAkUGFyYW17Q2hhbmdlU3RhdGVJRH0gPSAkU2VsZi0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRQYXJhbXtDaGFuZ2VTdGF0ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHdoZW4gQ0lQIGlzIGdpdmVuLCB0aGVuIGxvb2sgdXAgdGhlIElELAogICAgIyBvdGhlcndpc2UgbG9vayB1cCB0aGUgbmFtZXMsIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgbm90aWZpY2F0aW9uIHJ1bGVzCiAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICBpZiAoICRQYXJhbXskVHlwZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXsiJHtUeXBlfUlEIn0gPSAkU2VsZi0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgQ0lQICA9PiAkUGFyYW17JFR5cGV9LAogICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17IiR7VHlwZX1JRCJ9ICkgewogICAgICAgICAgICAkUGFyYW17JFR5cGV9ID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgIElEICAgPT4gJFBhcmFteyIke1R5cGV9SUQifSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbm9ybWFsaXplIHRoZSBUaXRsZSwgd2hlbiBpdCBpcyBnaXZlbgogICAgaWYgKCAkUGFyYW17Q2hhbmdlVGl0bGV9ICYmICFyZWYgJFBhcmFte0NoYW5nZVRpdGxlfSApIHsKCiAgICAgICAgIyByZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgJFBhcmFte0NoYW5nZVRpdGxlfSA9fiBzeyBcQSBccysgfXt9eG1zOwoKICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgICAgJFBhcmFte0NoYW5nZVRpdGxlfSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgfQoKICAgICMgZ2V0IGEgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGFyZ3VtZW50cyB3aGljaCBtaWdodCBjb250YWluIEhUTUwgbWFya3VwCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24pKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyIke0FyZ3VtZW50fVBsYWluIn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICApOwogICAgICAgIHV0Zjg6OnVwZ3JhZGUoICRQYXJhbXsiJHtBcmd1bWVudH1QbGFpbiJ9ICk7CiAgICB9CgogICAgIyBjaGVjayB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrQ2hhbmdlUGFyYW1zKCVQYXJhbSk7CgogICAgIyBjaGVjayBzYW5pdHkgb2YgdGhlIG5ldyBzdGF0ZSB3aXRoIHRoZSBzdGF0ZSBtYWNoaW5lCiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSApIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGlkCiAgICAgICAgbXkgJENoYW5nZUlEID0gJFBhcmFte0NoYW5nZUlEfTsKCiAgICAgICAgIyBkbyBub3QgZ2l2ZSBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIHRoZSBDaGFuZ2VJRAogICAgICAgICMgaWYgdGhlIHN0YXRlbWFjaGluZSBzaG91bGQgYmUgYnlwYXNzZWQuCiAgICAgICAgIyBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIHdpbGwgdGhlbiByZXR1cm4gYWxsIGNoYW5nZSBzdGF0ZXMuCiAgICAgICAgaWYgKCAkUGFyYW17QnlwYXNzU3RhdGVNYWNoaW5lfSApIHsKICAgICAgICAgICAgJENoYW5nZUlEID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiBwb3NzaWJsZSBuZXh0IHN0YXRlcwogICAgICAgIG15ICRTdGF0ZUxpc3QgPSAkU2VsZi0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICFncmVwIHsgJF8tPntLZXl9ID09ICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSB9IEB7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc3RhdGUgJFBhcmFte0NoYW5nZVN0YXRlSUR9IGlzIG5vdCBhIHBvc3NpYmxlIG5leHQgc3RhdGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgQ2hhbmdlVXBkYXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VVcGRhdGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvbGQgZGF0YSB0byBiZSBnaXZlbiB0byBwb3N0IGV2ZW50IGhhbmRsZXIKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHVwZGF0ZSBDQUIKICAgIGlmICggZXhpc3RzICRQYXJhbXtDQUJBZ2VudHN9IHx8IGV4aXN0cyAkUGFyYW17Q0FCQ3VzdG9tZXJzfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5DaGFuZ2VDQUJVcGRhdGUoJVBhcmFtKTsKICAgIH0KCiAgICAjIHNldCB0aGUgY2hhbmdlIGR5bmFtaWMgZmllbGRzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgIG5leHQgS0VZIGlmICRLZXkgIX4gbXsgXEEgRHluYW1pY0ZpZWxkXyguKikgXHogfXhtczsKCiAgICAgICAgIyBzYXZlIHRoZSByZWFsIG5hbWUgb2YgdGhlIGR5bmFtaWMgZmllbGQgKHdpdGhvdXQgcHJlZml4KQogICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIGNvbmZpZwogICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHdyaXRlIHZhbHVlIHRvIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXskS2V5fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAndGl0bGUnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnZGVzY3JpcHRpb24nLAogICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnanVzdGlmaWNhdGlvbicsCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICAgID0+ICdjaGFuZ2Vfc3RhdGVfaWQnLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCAgICA9PiAnY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgICA9PiAnY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICAgICA9PiAnY2F0ZWdvcnlfaWQnLAogICAgICAgIEltcGFjdElEICAgICAgICAgICA9PiAnaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEICAgICAgICAgPT4gJ3ByaW9yaXR5X2lkJywKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgICAgPT4gJ3JlcXVlc3RlZF90aW1lJywKICAgICAgICBEZXNjcmlwdGlvblBsYWluICAgPT4gJ2Rlc2NyaXB0aW9uX3BsYWluJywKICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4gPT4gJ2p1c3RpZmljYXRpb25fcGxhaW4nLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgY2hhbmdlCiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfaXRlbSBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgJFNRTCAuPSAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtVc2VySUR9OwogICAgJFNRTCAuPSAnV0hFUkUgaWQgPSA/JzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2hhbmdlSUR9OwoKICAgICMgdXBkYXRlIGNoYW5nZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdDaGFuZ2VHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlTGlzdCcsCiAgICAgICAgJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZU51bWJlcjo6JyAuICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ2hhbmdlVXBkYXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlVXBkYXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBPbGRDaGFuZ2VEYXRhID0+ICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ2hhbmdlR2V0KCkKClJldHVybiBhIGNoYW5nZSBhcyBhIGhhc2ggcmVmZXJlbmNlLgpXaGVuIHRoZSBDPHdvcmtvcmRlcj4gZG9lcyBub3QgZXhpc3QsIGEgZmFsc2UgdmFsdWUgaXMgcmV0dXJuZWQuClRoZSBvcHRpb25hbCBvcHRpb24gQzxMb2dObz4gdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiB0aGUgY2hhbmdlIGRvZXMgbm90IGV4aXN0LgoKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgTG9nTm8gICAgPT4gMSwgICAgICAjIG9wdGlvbmFsLCB0dXJucyBvZmYgbG9nZ2luZyB3aGVuIHRoZSBjaGFuZ2UgZG9lcyBub3QgZXhpc3QKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ2hhbmdle0NoYW5nZUlEfQogICAgJENoYW5nZXtDaGFuZ2VOdW1iZXJ9CiAgICAkQ2hhbmdle0NoYW5nZVN0YXRlSUR9CiAgICAkQ2hhbmdle0NoYW5nZVN0YXRlfSAgICAgICAgICAgICMgZmV0Y2hlZCBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgICRDaGFuZ2V7Q2hhbmdlU3RhdGVTaWduYWx9ICAgICAgIyBmZXRjaGVkIGZyb20gU3lzQ29uZmlnCiAgICAkQ2hhbmdle0NoYW5nZVRpdGxlfQogICAgJENoYW5nZXtEZXNjcmlwdGlvbn0KICAgICRDaGFuZ2V7RGVzY3JpcHRpb25QbGFpbn0KICAgICRDaGFuZ2V7SnVzdGlmaWNhdGlvbn0KICAgICRDaGFuZ2V7SnVzdGlmaWNhdGlvblBsYWlufQogICAgJENoYW5nZXtDaGFuZ2VNYW5hZ2VySUR9CiAgICAkQ2hhbmdle0NoYW5nZUJ1aWxkZXJJRH0KICAgICRDaGFuZ2V7Q2F0ZWdvcnlJRH0KICAgICRDaGFuZ2V7Q2F0ZWdvcnl9CiAgICAkQ2hhbmdle0ltcGFjdElEfQogICAgJENoYW5nZXtJbXBhY3R9CiAgICAkQ2hhbmdle1ByaW9yaXR5SUR9CiAgICAkQ2hhbmdle1ByaW9yaXR5fQogICAgJENoYW5nZXtXb3JrT3JkZXJJRHN9ICAgICAgICAgICAjIGFycmF5IHJlZmVyZW5jZSB3aXRoIFdvcmtPcmRlcklEcywgc29ydGVkIGJ5IFdvcmtPcmRlck51bWJlcgogICAgJENoYW5nZXtXb3JrT3JkZXJDb3VudH0gICAgICAgICAjIG51bWJlciBvZiB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle0NBQkFnZW50c30gICAgICAgICAgICAgICMgYXJyYXkgcmVmZXJlbmNlIHdpdGggQ0FCIEFnZW50IFVzZXJJRHMKICAgICRDaGFuZ2V7Q0FCQ3VzdG9tZXJzfSAgICAgICAgICAgIyBhcnJheSByZWZlcmVuY2Ugd2l0aCBDQUIgQ3VzdG9tZXJVc2VySURzCiAgICAkQ2hhbmdle1BsYW5uZWRTdGFydFRpbWV9ICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle1BsYW5uZWRFbmRUaW1lfSAgICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle0FjdHVhbFN0YXJ0VGltZX0gICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle0FjdHVhbEVuZFRpbWV9ICAgICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle1BsYW5uZWRFZmZvcnR9ICAgICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle0FjY291bnRlZFRpbWV9ICAgICAgICAgICMgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3b3Jrb3JkZXJzCiAgICAkQ2hhbmdle1JlcXVlc3RlZFRpbWV9CiAgICAkQ2hhbmdle0R5bmFtaWNGaWVsZF9YfQogICAgJENoYW5nZXtEeW5hbWljRmllbGRfWX0KICAgICRDaGFuZ2V7Q3JlYXRlVGltZX0KICAgICRDaGFuZ2V7Q3JlYXRlQnl9CiAgICAkQ2hhbmdle0NoYW5nZVRpbWV9CiAgICAkQ2hhbmdle0NoYW5nZUJ5fQoKPWN1dAoKc3ViIENoYW5nZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdDaGFuZ2VHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIG15ICVDaGFuZ2VEYXRhOwoKICAgIGlmICgkQ2FjaGUpIHsKICAgICAgICAlQ2hhbmdlRGF0YSA9ICV7JENhY2hlfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBkYXRhIGZyb20gZGF0YWJhc2UKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY2hhbmdlX251bWJlciwgdGl0bGUsICcKICAgICAgICAgICAgICAgIC4gJ2Rlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbl9wbGFpbiwgJwogICAgICAgICAgICAgICAgLiAnanVzdGlmaWNhdGlvbiwganVzdGlmaWNhdGlvbl9wbGFpbiwgJwogICAgICAgICAgICAgICAgLiAnY2hhbmdlX3N0YXRlX2lkLCBjaGFuZ2VfbWFuYWdlcl9pZCwgY2hhbmdlX2J1aWxkZXJfaWQsICcKICAgICAgICAgICAgICAgIC4gJ2NhdGVnb3J5X2lkLCBpbXBhY3RfaWQsIHByaW9yaXR5X2lkLCAnCiAgICAgICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5LCAnCiAgICAgICAgICAgICAgICAuICdyZXF1ZXN0ZWRfdGltZSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9pdGVtICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPyAnLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlSUR9ICAgICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZU51bWJlcn0gICAgICAgPSAkUm93WzFdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDaGFuZ2VUaXRsZX0gICAgICAgID0gZGVmaW5lZCggJFJvd1syXSApID8gJFJvd1syXSA6ICcnOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtEZXNjcmlwdGlvbn0gICAgICAgID0gZGVmaW5lZCggJFJvd1szXSApID8gJFJvd1szXSA6ICcnOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtEZXNjcmlwdGlvblBsYWlufSAgID0gZGVmaW5lZCggJFJvd1s0XSApID8gJFJvd1s0XSA6ICcnOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtKdXN0aWZpY2F0aW9ufSAgICAgID0gZGVmaW5lZCggJFJvd1s1XSApID8gJFJvd1s1XSA6ICcnOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtKdXN0aWZpY2F0aW9uUGxhaW59ID0gZGVmaW5lZCggJFJvd1s2XSApID8gJFJvd1s2XSA6ICcnOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDaGFuZ2VTdGF0ZUlEfSAgICAgID0gJFJvd1s3XTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlTWFuYWdlcklEfSAgICA9ICRSb3dbOF07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZUJ1aWxkZXJJRH0gICAgPSAkUm93WzldOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDYXRlZ29yeUlEfSAgICAgICAgID0gJFJvd1sxMF07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0ltcGFjdElEfSAgICAgICAgICAgPSAkUm93WzExXTsKICAgICAgICAgICAgJENoYW5nZURhdGF7UHJpb3JpdHlJRH0gICAgICAgICA9ICRSb3dbMTJdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDcmVhdGVUaW1lfSAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NyZWF0ZUJ5fSAgICAgICAgICAgPSAkUm93WzE0XTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlVGltZX0gICAgICAgICA9ICRSb3dbMTVdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDaGFuZ2VCeX0gICAgICAgICAgID0gJFJvd1sxNl07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe1JlcXVlc3RlZFRpbWV9ICAgICAgPSAkUm93WzE3XTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICElQ2hhbmdlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNoYW5nZSB3aXRoIElEICRQYXJhbXtDaGFuZ2VJRH0gZG9lcyBub3QgZXhpc3QuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICAgICAgVElNRUZJRUxEOgogICAgICAgIGZvciBteSAkVGltZWZpZWxkICggJ0NyZWF0ZVRpbWUnLCAnQ2hhbmdlVGltZScsICdSZXF1ZXN0ZWRUaW1lJyApIHsKICAgICAgICAgICAgbmV4dCBUSU1FRklFTEQgaWYgISRDaGFuZ2VEYXRheyRUaW1lZmllbGR9OwogICAgICAgICAgICAkQ2hhbmdlRGF0YXskVGltZWZpZWxkfQogICAgICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzIGZvciB0aGUgb2JqZWN0IHR5cGUgSVRTTUNoYW5nZQogICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICApOwoKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgICAgICMgdmFsaWRhdGUgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB0aGUgZHluYW1pYyBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbnRvIHRoZSBjaGFuZ2UgZGF0YSBoYXNoCiAgICAgICAgICAgICRDaGFuZ2VEYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlIChjaGFuZ2UgZGF0YSBleGlzdHMgYXQgdGhpcyBwb2ludCwgaXQgd2FzIGNoZWNrZWQgYmVmb3JlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNoYW5nZURhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmFtZSBvZiBjaGFuZ2Ugc3RhdGUKICAgIGlmICggJENoYW5nZURhdGF7Q2hhbmdlU3RhdGVJRH0gKSB7CiAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlU3RhdGV9ID0gJFNlbGYtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmFtZXMgZm9yIENJUAogICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgaWYgKCAkQ2hhbmdlRGF0YXsiJHtUeXBlfUlEIn0gKSB7CiAgICAgICAgICAgICRDaGFuZ2VEYXRheyRUeXBlfSA9ICRTZWxmLT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgICAgICAgICBJRCAgID0+ICRDaGFuZ2VEYXRheyIke1R5cGV9SUQifSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSBjaGFuZ2Ugc3RhdGUgc2lnbmFsCiAgICBpZiAoICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIGNoYW5nZSBzdGF0ZSBzaWduYWxzCiAgICAgICAgbXkgJFN0YXRlU2lnbmFsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpTdGF0ZTo6U2lnbmFsJyk7CgogICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlU2lnbmFsfSA9ICRTdGF0ZVNpZ25hbC0+eyAkQ2hhbmdlRGF0YXtDaGFuZ2VTdGF0ZX0gfTsKICAgIH0KCiAgICAjIGdldCBDQUIgZGF0YQogICAgbXkgJENBQiA9ICRTZWxmLT5DaGFuZ2VDQUJHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICkgfHwge307CgogICAgIyBhZGQgcmVzdWx0IHRvIGNoYW5nZSBkYXRhCiAgICAlQ2hhbmdlRGF0YSA9ICggJUNoYW5nZURhdGEsICV7JENBQn0gKTsKCiAgICAjIGdldCBhbGwgd29ya29yZGVyIGlkcyBmb3IgdGhpcyBjaGFuZ2UKICAgIG15ICRXb3JrT3JkZXJJRHNSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJMaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIHJlc3VsdCB0byBjaGFuZ2UgZGF0YQogICAgJENoYW5nZURhdGF7V29ya09yZGVySURzfSA9ICRXb3JrT3JkZXJJRHNSZWYgfHwgW107CiAgICAkQ2hhbmdlRGF0YXtXb3JrT3JkZXJDb3VudH0gPSBzY2FsYXIgQHsgJENoYW5nZURhdGF7V29ya09yZGVySURzfSB9OwoKICAgICMgZ2V0IHBsYW5uZWQgZWZmb3J0IGFuZCBhY2NvdW50ZWQgdGltZSBmb3IgdGhlIGNoYW5nZQogICAgbXkgJENoYW5nZUVmZm9ydHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWVyZ2UgZWZmb3J0IGhhc2ggd2l0aCBjaGFuZ2UgaGFzaAogICAgaWYgKAogICAgICAgICRDaGFuZ2VFZmZvcnRzCiAgICAgICAgJiYgcmVmICRDaGFuZ2VFZmZvcnRzIGVxICdIQVNIJwogICAgICAgICYmICV7JENoYW5nZUVmZm9ydHN9CiAgICAgICAgKQogICAgewogICAgICAgICVDaGFuZ2VEYXRhID0gKCAlQ2hhbmdlRGF0YSwgJXskQ2hhbmdlRWZmb3J0c30gKTsKICAgIH0KCiAgICAjIGdldCB0aW1lc3RhbXBzIGZvciB0aGUgY2hhbmdlCiAgICBteSAkQ2hhbmdlVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckNoYW5nZVRpbWVHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBtZXJnZSB0aW1lIGhhc2ggd2l0aCBjaGFuZ2UgaGFzaAogICAgaWYgKAogICAgICAgICRDaGFuZ2VUaW1lCiAgICAgICAgJiYgcmVmICRDaGFuZ2VUaW1lIGVxICdIQVNIJwogICAgICAgICYmICV7JENoYW5nZVRpbWV9CiAgICAgICAgKQogICAgewogICAgICAgICVDaGFuZ2VEYXRhID0gKCAlQ2hhbmdlRGF0YSwgJXskQ2hhbmdlVGltZX0gKTsKICAgIH0KCiAgICByZXR1cm4gXCVDaGFuZ2VEYXRhOwp9Cgo9aGVhZDIgQ2hhbmdlQ0FCVXBkYXRlKCkKCkFkZCBvciB1cGRhdGUgdGhlIENBQiBvZiBhIGNoYW5nZS4KT25lIG9yIGJvdGggb2YgQ0FCQWdlbnRzIGFuZCBDQUJDdXN0b21lcnMgbXVzdCBiZSBwYXNzZWQuClBhc3NpbmcgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgZGVsZXRlcyB0aGUgcGFydCBvZiB0aGUgQ0FCIChDQUJBZ2VudHMgb3IgQ0FCQ3VzdG9tZXJzKQpXaGVuIGFnZW50cyBvciBjdXN0b21lcnMgYXJlIHBhc3NlZCBtdWx0aXBsZSB0aW1lcywgdGhleSB3aWxsIGJlIGluc2VydGVkIG9ubHkgb25jZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNBQlVwZGF0ZSgKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gMTIzLAogICAgICAgIENBQkFnZW50cyAgICA9PiBbIDEsIDIsIDQgXSwgICAgICMgVXNlcklEcyAgICAgICAgICAob3B0aW9uYWwpCiAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsgJ3R0JywgJ21tJyBdLCAgIyBDdXN0b21lclVzZXJJRHMgIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlQ0FCVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBlaXRoZXIgQ0FCQWdlbnRzIG9mIENBQkN1c3RvbWVycyBvciBib3RoIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17Q0FCQWdlbnRzfSAmJiAhJFBhcmFte0NBQkN1c3RvbWVyc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHBhcmFtZXRlciBDQUJBZ2VudHMgb3IgQ0FCQ3VzdG9tZXJzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDQUJBZ2VudHMgYW5kIENBQkN1c3RvbWVycyBtdXN0IGJlIGFycmF5IHJlZmVyZW5jZXMKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDQUJBZ2VudHMgQ0FCQ3VzdG9tZXJzKSkgewogICAgICAgIGlmICggJFBhcmFteyRBdHRyaWJ1dGV9ICYmIHJlZiAkUGFyYW17JEF0dHJpYnV0ZX0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJEF0dHJpYnV0ZSBpcyBub3QgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBDQUJBZ2VudHMgYW5kIENBQkN1c3RvbWVycyBleGlzdCBpbiB0aGUgYWdlbnRzIGFuZCBjdXN0b21lciBkYXRhYmFzZXMKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVBhcmFtcyglUGFyYW0pOwoKICAgICMgdHJpZ2dlciBDaGFuZ2VDQUJVcGRhdGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUNBQlVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IG9sZCBDQUIgZGF0YSB0byBiZSBnaXZlbiB0byBwb3N0IGV2ZW50IGhhbmRsZXIKICAgIG15ICRDaGFuZ2VDQUJEYXRhID0gJFNlbGYtPkNoYW5nZUNBQkdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGVudGVyIHRoZSBDQUIgQWdlbnRzCiAgICBpZiAoICRQYXJhbXtDQUJBZ2VudHN9ICkgewoKICAgICAgICAjIHJlbW92ZSBhbGwgY3VycmVudCB1c2VycyBmcm9tIGNhYiB0YWJsZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9jYWIgJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyAnCiAgICAgICAgICAgICAgICAuICdBTkQgdXNlcl9pZCBJUyBOT1QgTlVMTCcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICk7CgogICAgICAgICMgZmlsdGVyIG91dCB1bmlxdWUgdXNlcnMKICAgICAgICBteSAlVW5pcXVlVXNlcnMgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJFBhcmFte0NBQkFnZW50c30gfTsKCiAgICAgICAgIyBhZGQgdXNlciB0byBjYWIgdGFibGUKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVW5pcXVlVXNlcnMgKSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX2NhYiAoIGNoYW5nZV9pZCwgdXNlcl9pZCApIFZBTFVFUyAoID8sID8gKScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkVXNlcklEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZW50ZXIgdGhlIENBQiBDdXN0b21lcnMKICAgIGlmICggJFBhcmFte0NBQkN1c3RvbWVyc30gKSB7CgogICAgICAgICMgcmVtb3ZlIGFsbCBjdXJyZW50IGN1c3RvbWVyIHVzZXJzIGZyb20gY2FiIHRhYmxlCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NhYiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ0FORCBjdXN0b21lcl91c2VyX2lkIElTIE5PVCBOVUxMJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWx0ZXIgb3V0IHVuaXF1ZSBjdXN0b21lciB1c2VycwogICAgICAgIG15ICVVbmlxdWVDdXN0b21lclVzZXJzID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRQYXJhbXtDQUJDdXN0b21lcnN9IH07CgogICAgICAgICMgYWRkIHVzZXIgdG8gY2FiIHRhYmxlCiAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlVW5pcXVlQ3VzdG9tZXJVc2VycyApIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfY2FiICggY2hhbmdlX2lkLCBjdXN0b21lcl91c2VyX2lkICkgVkFMVUVTICggPywgPyApJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSwgXCRDdXN0b21lclVzZXJJRCBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdDaGFuZ2VDQUJHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgIyB0cmlnZ2VyIENoYW5nZUNBQlVwZGF0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUNBQlVwZGF0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgT2xkQ2hhbmdlQ0FCRGF0YSA9PiAkQ2hhbmdlQ0FCRGF0YSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENoYW5nZUNBQkdldCgpCgpSZXR1cm4gdGhlIENBQiBvZiBhIGNoYW5nZSBhcyBhIGhhc2hyZWYsIHdoZXJlIHRoZSB2YWx1ZXMgYXJlIGFycmF5cmVmcy4KVGhlIHJldHVybmVkIGFycmF5IHJlZmVyZW5jZXMgYXJlIHNvcnRlZC4KCiAgICBteSAkQ2hhbmdlQ0FCID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0FCR2V0KAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJENoYW5nZUNBQiA9IHsKICAgICAgICBDQUJBZ2VudHMgICAgPT4gWyAxLCAyLCA0IF0sCiAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsgJ2FhJywgJ2JiJyBdLAogICAgfQoKPWN1dAoKc3ViIENoYW5nZUNBQkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FiIGRhdGEKICAgIG15ICVDQUIgPSAoCiAgICAgICAgQ0FCQWdlbnRzICAgID0+IFtdLAogICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICk7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0NoYW5nZUNBQkdldDo6SUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAjIGdldCBkYXRhIGZyb20gY2FjaGUKICAgICAgICAlQ0FCID0gJXskQ2FjaGV9OwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBkYXRhCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNoYW5nZV9pZCwgdXNlcl9pZCwgY3VzdG9tZXJfdXNlcl9pZCAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9jYWIgV0hFUkUgY2hhbmdlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICk7CgogICAgICAgIG15ICRFcnJvckNBQklEOwoKICAgICAgICBST1c6CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgbXkgJENBQklEICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAgICAgbXkgJENoYW5nZUlEICAgICAgID0gJFJvd1sxXTsKICAgICAgICAgICAgbXkgJFVzZXJJRCAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFJvd1szXTsKCiAgICAgICAgICAgICMgZXJyb3IgY2hlY2sgaWYgYm90aCBjb2x1bW5zIGFyZSBmaWxsZWQKICAgICAgICAgICAgaWYgKCAkVXNlcklEICYmICRDdXN0b21lclVzZXJJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvckNBQklEID0gJENBQklEOwogICAgICAgICAgICAgICAgbmV4dCBST1c7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGRhdGEgdG8gQ0FCCiAgICAgICAgICAgIGlmICgkVXNlcklEKSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRDQUJ7Q0FCQWdlbnRzfSB9LCAkVXNlcklEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgICAgIHB1c2ggQHsgJENBQntDQUJDdXN0b21lcnN9IH0sICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBlcnJvciBjaGVjayBpZiBib3RoIGNvbHVtbnMgYXJlIGZpbGxlZAogICAgICAgIGlmICgkRXJyb3JDQUJJRCkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDQUIgdGFibGUgZW50cnkgd2l0aCBJRCAkRXJyb3JDQUJJRCBjb250YWlucyBVc2VySUQgYW5kIEN1c3RvbWVyVXNlcklEISAiCiAgICAgICAgICAgICAgICAgICAgLiAnT25seSBvbmUgYXQgYSB0aW1lIGlzIGFsbG93ZWQhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzb3J0IHRoZSByZXN1bHRzCiAgICAgICAgQHsgJENBQntDQUJBZ2VudHN9IH0gICAgPSBzb3J0IEB7ICRDQUJ7Q0FCQWdlbnRzfSB9OwogICAgICAgIEB7ICRDQUJ7Q0FCQ3VzdG9tZXJzfSB9ID0gc29ydCBAeyAkQ0FCe0NBQkN1c3RvbWVyc30gfTsKCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVDQUIsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlQ0FCOwp9Cgo9aGVhZDIgQ2hhbmdlQ0FCRGVsZXRlKCkKCkRlbGV0ZSB0aGUgQ0FCIG9mIGEgY2hhbmdlLgoKICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0FCRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VDQUJEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgQ2hhbmdlQ0FCRGVsZXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VDQUJEZWxldGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvbGQgQ0FCIGRhdGEgdG8gYmUgZ2l2ZW4gdG8gcG9zdCBldmVudCBoYW5kbGVyCiAgICBteSAkQ2hhbmdlQ0FCRGF0YSA9ICRTZWxmLT5DaGFuZ2VDQUJHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgQ0FCCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2VfY2FiIFdIRVJFIGNoYW5nZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdDaGFuZ2VDQUJHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgIyB0cmlnZ2VyIENoYW5nZUNBQkRlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUNBQkRlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgT2xkQ2hhbmdlQ0FCRGF0YSA9PiAkQ2hhbmdlQ0FCRGF0YSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENoYW5nZUxvb2t1cCgpCgpSZXR1cm4gdGhlIGNoYW5nZSBpZCB3aGVuIHRoZSBjaGFuZ2UgbnVtYmVyIGlzIHBhc3NlZC4KUmV0dXJuIHRoZSBjaGFuZ2UgbnVtYmVyIHdoZW4gdGhlIGNoYW5nZSBpZCBpcyBwYXNzZWQuCldoZW4gbm8gY2hhbmdlIGlkIG9yIGNoYW5nZSBudW1iZXIgaXMgZm91bmQsIHRoZW4gdGhlIHVuZGVmaW5lZCB2YWx1ZSBpcyByZXR1cm5lZC4KCiAgICBteSAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VMb29rdXAoCiAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICcyMDA5MDkxNzQyMDAwNDY1JywKICAgICk7CgogICAgb3IKCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlTG9va3VwKAogICAgICAgIENoYW5nZUlEID0+IDQyLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRoZSBjaGFuZ2UgaWQgb3IgdGhlIGNoYW5nZSBudW1iZXIgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtDaGFuZ2VJRH0gJiYgISRQYXJhbXtDaGFuZ2VOdW1iZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB0aGUgQ2hhbmdlSUQgb3IgdGhlIENoYW5nZU51bWJlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBvbmUgb2YgY2hhbmdlIGlkIGFuZCBjaGFuZ2UgbnVtYmVyIGNhbiBiZSBwYXNzZWQKICAgIGlmICggJFBhcmFte0NoYW5nZUlEfSAmJiAkUGFyYW17Q2hhbmdlTnVtYmVyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIHRoZSBDaGFuZ2VJRCBvciB0aGUgQ2hhbmdlTnVtYmVyLCBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBpZAogICAgaWYgKCAkUGFyYW17Q2hhbmdlTnVtYmVyfSApIHsKCiAgICAgICAgbXkgJENoYW5nZUlEOwoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlTnVtYmVyOjonIC4gJFBhcmFte0NoYW5nZU51bWJlcn07CiAgICAgICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICAgICAkQ2hhbmdlSUQgPSAkQ2FjaGU7CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfaXRlbSBXSEVSRSBjaGFuZ2VfbnVtYmVyID0gPycsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlTnVtYmVyfSBdLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlSUQgPSAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjYWNoZSBvbmx5IGlmIGNoYW5nZSBpZCBleGlzdHMKICAgICAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRDaGFuZ2VJRDsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgbnVtYmVyCiAgICBlbHNpZiAoICRQYXJhbXtDaGFuZ2VJRH0gKSB7CgogICAgICAgIG15ICRDaGFuZ2VOdW1iZXI7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ2hhbmdlTG9va3VwOjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH07CiAgICAgICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICAgICAkQ2hhbmdlTnVtYmVyID0gJENhY2hlOwogICAgICAgIH0KCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGNoYW5nZV9udW1iZXIgRlJPTSBjaGFuZ2VfaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlTnVtYmVyID0gJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgY2FjaGUgb25seSBpZiBjaGFuZ2UgbnVtYmVyIGV4aXN0cwogICAgICAgICAgICBpZiAoJENoYW5nZU51bWJlcikgewoKICAgICAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENoYW5nZU51bWJlciwKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkQ2hhbmdlTnVtYmVyOwogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIENoYW5nZUxpc3QoKQoKUmV0dXJuIGEgY2hhbmdlIGlkIGxpc3Qgb2YgYWxsIGNoYW5nZXMgYXMgYW4gYXJyYXkgcmVmZXJlbmNlLgoKICAgIG15ICRDaGFuZ2VJRHNSZWYgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15IEBDaGFuZ2VJRHM7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0NoYW5nZUxpc3QnOwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAjIGdldCBjaGFuZ2UgaWRzIGZyb20gY2FjaGUKICAgICAgICBAQ2hhbmdlSURzID0gQHskQ2FjaGV9OwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjaGFuZ2UgaWRzCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfaXRlbScsCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQ2hhbmdlSURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDaGFuZ2VJRHMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFxAQ2hhbmdlSURzOwp9Cgo9aGVhZDIgQ2hhbmdlU2VhcmNoKCkKClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY2hhbmdlIGlkcy4KVGhlIGNvdW50IG9mIHJlc3VsdHMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcGFyYW1ldGVyIEM8UmVzdWx0ID0gJ0NPVU5UJz4gaXMgcGFzc2VkLgoKVGhlIHNlYXJjaCBjcml0ZXJpYSBhcmUgbG9naWNhbGx5IEFORCBjb25uZWN0ZWQuCldoZW4gYSBsaXN0IGlzIHBhc3NlZCBhcyBDPGNyaXRlcml1bT4sIHRoZSBpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIE9SIGNvbm5lY3RlZC4KV2hlbiBhbiB1bmRlZiBvciBhIHJlZmVyZW5jZSB0byBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIHNlYXJjaCBDPGNyaXRlcml1bT4KaXMgaWdub3JlZC4KCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZU51bWJlciAgICAgICA9PiAnMjAwOTEwMDExMjM0NTc3OCcsICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICdSZXBsYWNlbWVudCBvZiBzbG93IG1haWwgc2VydmVyJywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnTmV3IG1haWwgc2VydmVyIGlzIGZhc3RlcicsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBKdXN0aWZpY2F0aW9uICAgICAgPT4gJ09sZCBtYWlsIHNlcnZlciB0b28gc2xvdycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IKICAgICAgICBDaGFuZ2VTdGF0ZUlEcyAgICAgPT4gWyAxMSwgMTIsIDEzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlU3RhdGVzICAgICAgID0+IFsgJ3JlcXVlc3RlZCcsICdmYWlsZWQnIF0sICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZU1hbmFnZXJJRHMgICA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCdWlsZGVySURzICAgPT4gWyA1LCA3LCA0IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgID0+IFsgNSwgMiwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICA9PiBbIDMsIDIsIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyAgPT4gWyA2LCAyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ0FCQWdlbnRzICAgICAgICAgID0+IFsgOSwgMTMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbICd0dCcsICd4eCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDYXRlZ29yaWVzICAgICAgICAgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2F0ZWdvcnlJRHMgICAgICAgID0+IFsgMTM1LCAxNzMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEltcGFjdHMgICAgICAgICAgICA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JyBdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbXBhY3RJRHMgICAgICAgICAgPT4gWyAxMzYsIDE3NCBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUHJpb3JpdGllcyAgICAgICAgID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnIF0sICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFByaW9yaXR5SURzICAgICAgICA9PiBbIDEzNywgMTc1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBEeW5hbWljRmllbGRzIChib3RoIGNoYW5nZSBhbmQgQzx3b3Jrb3JkZXI+IGR5bmFtaWMgZmllbGRzIGFyZSBwb3NzaWJsZSkKICAgICAgICAjICAgQXQgbGVhc3Qgb25lIG9wZXJhdG9yIG11c3QgYmUgc3BlY2lmaWVkLiBPcGVyYXRvcnMgd2lsbCBiZSBjb25uZWN0ZWQgd2l0aCBBTkQsCiAgICAgICAgIyAgICAgICB2YWx1ZXMgaW4gYW4gb3BlcmF0b3Igd2l0aCBPUi4KICAgICAgICAjICAgWW91IGNhbiBhbHNvIHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byBhbiBvcGVyYXRvcjogWyd2YWx1ZTEnLCAndmFsdWUyJ10KICAgICAgICBEeW5hbWljRmllbGRfRmllbGROYW1lWCA9PiB7CiAgICAgICAgICAgIEVxdWFscyAgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgTGlrZSAgICAgICAgICAgICAgPT4gJ3ZhbHVlKicsICAgICAgICAgICAgICAgICMgImVxdWFscyIgb3BlcmF0b3Igd2l0aCB3aWxkY2FyZCBzdXBwb3J0CiAgICAgICAgICAgIEdyZWF0ZXJUaGFuICAgICAgID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgR3JlYXRlclRoYW5FcXVhbHMgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBTbWFsbGVyVGhhbiAgICAgICA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuRXF1YWxzID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICB9CgogICAgICAgICMgc2VhcmNoIGluIHRleHQgZmllbGRzIG9mIEM8d29ya29yZGVyPiBvYmplY3QKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICAgICAgICAgID0+ICdCb290IE1haWxzZXJ2ZXInLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJJbnN0cnVjdGlvbiAgICAgID0+ICdQcmVzcyB0aGUgYnV0dG9uLicsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJSZXBvcnQgICAgICAgICAgID0+ICdNYWlsc2VydmVyIGhhcyBib290ZWQuJywgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBzZWFyY2ggaW4gQzx3b3Jrb3JkZXI+IChhcnJheSBwYXJhbXMpCiAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gWyAnYWNjZXB0ZWQnLCAncmVhZHknIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWyAxLCAyLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyVHlwZXMgICAgPT4gWyAnd29ya29yZGVyJywgJ2JhY2tvdXQnLCAnYXBwcm92YWwnIF0sICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyVHlwZUlEcyAgPT4gWyA1LCA2LCA3IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIHBsYW5uZWQgc3RhcnQgdGltZSBhZnRlciAuLi4KICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGNoYW5nZXMgd2l0aCBwbGFubmVkIHN0YXJ0IHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNoYW5nZXMgd2l0aCBwbGFubmVkIGVuZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIHBsYW5uZWQgZW5kIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNoYW5nZXMgd2l0aCBhY3R1YWwgc3RhcnQgdGltZSBhZnRlciAuLi4KICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGNoYW5nZXMgd2l0aCBhY3R1YWwgc3RhcnQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIGFjdHVhbCBlbmQgdGltZSBhZnRlciAuLi4KICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGNoYW5nZXMgd2l0aCBhY3R1YWwgZW5kIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNoYW5nZXMgd2l0aCBjcmVhdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ3JlYXRlVGltZU5ld2VyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggY2hhbmdlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENoYW5nZVRpbWVOZXdlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ2hhbmdlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIHJlcXVlc3RlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIFJlcXVlc3RlZFRpbWVOZXdlckRhdGUgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIHJlcXVlc3RlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgT3JkZXJCeSA9PiBbICdDaGFuZ2VJRCcsICdDaGFuZ2VNYW5hZ2VySUQnIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0NoYW5nZUlEJyBdCiAgICAgICAgIyAoQ2hhbmdlSUQsIENoYW5nZU51bWJlciwgQ2hhbmdlVGl0bGUsIENoYW5nZVN0YXRlSUQsCiAgICAgICAgIyBDaGFuZ2VNYW5hZ2VySUQsIENoYW5nZUJ1aWxkZXJJRCwKICAgICAgICAjIENhdGVnb3J5SUQsIEltcGFjdElELCBQcmlvcml0eUlECiAgICAgICAgIyBQbGFubmVkU3RhcnRUaW1lLCBQbGFubmVkRW5kVGltZSwKICAgICAgICAjIEFjdHVhbFN0YXJ0VGltZSwgQWN0dWFsRW5kVGltZSwgUmVxdWVzdGVkVGltZSwKICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgIyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBPcmRlckJ5OgogICAgICAgICMgVGhlIE9yZGVyQnlEaXJlY3Rpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBPcmRlckJ5IGF0dHJpYnV0ZS4KICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnRG93bicsICdVcCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdEb3duJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjICgwIHwgMSkgZGVmYXVsdCAxCgogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdDT1VOVCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwoKICAgICAgICBNaXJyb3JEQiA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjICgwIHwgMSkgZGVmYXVsdCAwCiAgICAgICAgIyBpZiBzZXQgdG8gMSBhbmQgSVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoOjpNaXJyb3JEQgogICAgICAgICMgaXMgYWN0aXZhdGVkIGFuZCBhIG1pcnJvciBkYiBpcyBjb25maWd1cmVkIGluCiAgICAgICAgIyBDb3JlOjpNaXJyb3JEQjo6RFNOIHRoZSBjaGFuZ2Ugc2VhcmNoIHdpbGwgdGhlbiB1c2UKICAgICAgICAjIHRoZSBtaXJyb3IgZGIKCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB2ZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBPcmRlckJ5CiAgICAgICAgT3JkZXJCeURpcmVjdGlvbgogICAgICAgIENoYW5nZVN0YXRlSURzCiAgICAgICAgQ2hhbmdlU3RhdGVzCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEcwogICAgICAgIENoYW5nZUJ1aWxkZXJJRHMKICAgICAgICBDQUJBZ2VudHMKICAgICAgICBDQUJDdXN0b21lcnMKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcwogICAgICAgIFdvcmtPcmRlclN0YXRlcwogICAgICAgIFdvcmtPcmRlclN0YXRlSURzCiAgICAgICAgV29ya09yZGVyVHlwZXMKICAgICAgICBXb3JrT3JkZXJUeXBlSURzCiAgICAgICAgQ3JlYXRlQnkKICAgICAgICBDaGFuZ2VCeQogICAgICAgIENhdGVnb3JpZXMKICAgICAgICBDYXRlZ29yeUlEcwogICAgICAgIEltcGFjdHMKICAgICAgICBJbXBhY3RJRHMKICAgICAgICBQcmlvcml0aWVzCiAgICAgICAgUHJpb3JpdHlJRHMKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFyZ3VtZW50fSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgYSBsb2NhbCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgaWYgd2UgbmVlZCB0byBkbyBhIGNoYW5nZSBzZWFyY2ggb24gYW4gZXh0ZXJuYWwgbWlycm9yIGRhdGFiYXNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte01pcnJvckRCfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoOjpNaXJyb3JEQicpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6RFNOJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpVc2VyJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNyZWF0ZSBhbiBleHRyYSBkYXRhYmFzZSBvYmplY3QgZm9yIHRoZSBtaXJyb3IgZGIKICAgICAgICBteSAkRXh0cmFEYXRhYmFzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICBEYXRhYmFzZURTTiAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6RFNOJyksCiAgICAgICAgICAgIERhdGFiYXNlVXNlciA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpVc2VyJyksCiAgICAgICAgICAgIERhdGFiYXNlUHcgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkRXh0cmFEYXRhYmFzZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBjcmVhdGUgZGF0YWJhc2Ugb2JqZWN0IGZvciBNaXJyb3JEQiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICREQk9iamVjdCA9ICRFeHRyYURhdGFiYXNlT2JqZWN0OwogICAgfQoKICAgICMgZGVmaW5lIG9yZGVyIHRhYmxlCiAgICBteSAlT3JkZXJCeVRhYmxlID0gKAogICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJ2MuaWQnLAogICAgICAgIENoYW5nZU51bWJlciAgICAgPT4gJ2MuY2hhbmdlX251bWJlcicsCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnYy50aXRsZScsCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICA9PiAnYy5jaGFuZ2Vfc3RhdGVfaWQnLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCAgPT4gJ2MuY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgPT4gJ2MuY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICAgPT4gJ2MuY2F0ZWdvcnlfaWQnLAogICAgICAgIEltcGFjdElEICAgICAgICAgPT4gJ2MuaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEICAgICAgID0+ICdjLnByaW9yaXR5X2lkJywKICAgICAgICBDcmVhdGVUaW1lICAgICAgID0+ICdjLmNyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICdjLmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICA9PiAnYy5jaGFuZ2VfdGltZScsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAnYy5jaGFuZ2VfYnknLAogICAgICAgIFJlcXVlc3RlZFRpbWUgICAgPT4gJ2MucmVxdWVzdGVkX3RpbWUnLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJ01JTih3bzEucGxhbm5lZF9zdGFydF90aW1lKScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnTUFYKHdvMS5wbGFubmVkX2VuZF90aW1lKScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnTUlOKHdvMS5hY3R1YWxfc3RhcnRfdGltZSknLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJ01BWCh3bzEuYWN0dWFsX2VuZF90aW1lKScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicKICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgb25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBnaXZlbiBDaGFuZ2VTdGF0ZUlEcyBhcmUgdmFsaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVN0YXRlSURzKCBDaGFuZ2VTdGF0ZUlEcyA9PiAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9ICk7CgogICAgIyBjaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgZ2l2ZW4gQ2F0ZWdvcnlJRHMsIEltcGFjdElEcyBhbmQgUHJpb3JpdHlJRHMgYXJlIHZhbGlkCiAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tDaGFuZ2VDSVBJRHMoCiAgICAgICAgICAgIElEcyAgPT4gJFBhcmFteyIke1R5cGV9SURzIn0sCiAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2sgdXAgYW5kIHRodXMgY2hlY2sgdGhlIFN0YXRlcwogICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRQYXJhbXtDaGFuZ2VTdGF0ZXN9IH0gKSB7CgogICAgICAgICMgbG9vayB1cCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkU2VsZi0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkQ2hhbmdlU3RhdGVJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBjaGFuZ2Ugc3RhdGUgJENoYW5nZVN0YXRlIGlzIG5vdCBrbm93biEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9IH0sICRDaGFuZ2VTdGF0ZUlEOwogICAgfQoKICAgICMgbG9vayB1cCBhbmQgdGh1cyBjaGVjayB0aGUgQ0lQcwogICAgbXkgJUNJUFNpbmd1bGFyMlBsdXJhbCA9ICgKICAgICAgICBDYXRlZ29yeSA9PiAnQ2F0ZWdvcmllcycsCiAgICAgICAgSW1wYWN0ICAgPT4gJ0ltcGFjdHMnLAogICAgICAgIFByaW9yaXR5ID0+ICdQcmlvcml0aWVzJywKICAgICk7CgogICAgZm9yIG15ICRDSVBTaW5ndWxhciAoIHNvcnQga2V5cyAlQ0lQU2luZ3VsYXIyUGx1cmFsICkgewogICAgICAgIGZvciBteSAkQ0lQICggQHsgJFBhcmFteyAkQ0lQU2luZ3VsYXIyUGx1cmFseyRDSVBTaW5ndWxhcn0gfSB9ICkgewoKICAgICAgICAgICAgIyBsb29rIHVwIHRoZSBJRCBmb3IgdGhlIG5hbWUKICAgICAgICAgICAgbXkgJENJUElEID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgIENJUCAgPT4gJENJUCwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENJUFNpbmd1bGFyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBJRCB3YXMgZm91bmQsIHdoZXRoZXIgdGhlIG5hbWUgZXhpc3RzCiAgICAgICAgICAgIGlmICggISRDSVBJRCApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSAkQ0lQU2luZ3VsYXIgJENJUCBpcyBub3Qga25vd24hIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXsiJHtDSVBTaW5ndWxhcn1JRHMifSB9LCAkQ0lQSUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgd29ya29yZGVyIHN0YXRlcyAtIGlmIGdpdmVuCiAgICByZXR1cm4KICAgICAgICBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyU3RhdGVJRHNDaGVjaygKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEcyA9PiAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9LAogICAgICAgICk7CgogICAgIyBsb29rIHVwIGFuZCB0aHVzIGNoZWNrIHRoZSB3b3Jrb3JkZXIgc3RhdGVzCiAgICBmb3IgbXkgJFdvcmtPcmRlclN0YXRlICggQHsgJFBhcmFte1dvcmtPcmRlclN0YXRlc30gfSApIHsKCiAgICAgICAgIyBsb29rIHVwIHRoZSBJRCBmb3IgdGhlIG5hbWUKICAgICAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBJRCB3YXMgZm91bmQsIHdoZXRoZXIgdGhlIG5hbWUgZXhpc3RzCiAgICAgICAgaWYgKCAhJFdvcmtPcmRlclN0YXRlSUQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgd29ya29yZGVyIHN0YXRlICRXb3JrT3JkZXJTdGF0ZSBpcyBub3Qga25vd24hIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1dvcmtPcmRlclN0YXRlSURzfSB9LCAkV29ya09yZGVyU3RhdGVJRDsKICAgIH0KCiAgICAjIGxvb2sgdXAgYW5kIHRodXMgY2hlY2sgdGhlIHdvcmtvcmRlciB0eXBlcwogICAgZm9yIG15ICRXb3JrT3JkZXJUeXBlICggQHsgJFBhcmFte1dvcmtPcmRlclR5cGVzfSB9ICkgewoKICAgICAgICAjIGxvb2sgdXAgdGhlIElEIGZvciB0aGUgbmFtZQogICAgICAgIG15ICRXb3JrT3JkZXJUeXBlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICRXb3JrT3JkZXJUeXBlLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgSUQgd2FzIGZvdW5kLCB3aGV0aGVyIHRoZSBuYW1lIGV4aXN0cwogICAgICAgIGlmICggISRXb3JrT3JkZXJUeXBlSUQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgd29ya29yZGVyIHR5cGUgJFdvcmtPcmRlclR5cGUgaXMgbm90IGtub3duISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtXb3JrT3JkZXJUeXBlSURzfSB9LCAkV29ya09yZGVyVHlwZUlEOwogICAgfQoKICAgIG15IEBTUUxXaGVyZTsgICAgICAgICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBAU1FMSGF2aW5nOyAgICAgICAgICAjIGFzc2VtYmxlIHRoZSBjb25kaXRpb25zIHVzZWQgaW4gdGhlIEhBVklORyBjbGF1c2UKICAgIG15IEBJbm5lckpvaW5UYWJsZXM7ICAgICMga2VlcCB0cmFjayBvZiB0aGUgdGFibGVzIHRoYXQgbmVlZCB0byBiZSBpbm5lciBqb2luZWQKICAgIG15IEBPdXRlckpvaW5UYWJsZXM7ICAgICMga2VlcCB0cmFjayBvZiB0aGUgdGFibGVzIHRoYXQgbmVlZCB0byBiZSBvdXRlciBqb2luZWQKCiAgICAjIGNoZWNrIGFsbCBjb25maWd1cmVkIGNoYW5nZSBkeW5hbWljIGZpZWxkcywgYnVpbGQgbG9va3VwIGhhc2ggYnkgbmFtZQogICAgbXkgJUNoYW5nZUR5bmFtaWNGaWVsZE5hbWUyQ29uZmlnOwogICAgbXkgJENoYW5nZUR5bmFtaWNGaWVsZHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICApOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDaGFuZ2VEeW5hbWljRmllbGRzfSApIHsKICAgICAgICAkQ2hhbmdlRHluYW1pY0ZpZWxkTmFtZTJDb25maWd7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICAjIGNoZWNrIGFsbCBjb25maWd1cmVkIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcywgYnVpbGQgbG9va3VwIGhhc2ggYnkgbmFtZQogICAgbXkgJVdvcmtPcmRlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlnOwogICAgbXkgJFdvcmtPcmRlckR5bmFtaWNGaWVsZHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICApOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRXb3JrT3JkZXJEeW5hbWljRmllbGRzfSApIHsKICAgICAgICAkV29ya09yZGVyRHluYW1pY0ZpZWxkTmFtZTJDb25maWd7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZDsKICAgIH0KCiAgICAjIGFkZCBzdHJpbmcgcGFyYW1zIHRvIHRoZSBXSEVSRSBjbGF1c2UKICAgIG15ICVTdHJpbmdQYXJhbXMgPSAoCgogICAgICAgICMgc3RyaW5ncyBpbiBjaGFuZ2VfaXRlbQogICAgICAgIENoYW5nZU51bWJlciAgPT4gJ2MuY2hhbmdlX251bWJlcicsCiAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnYy50aXRsZScsCiAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnYy5kZXNjcmlwdGlvbl9wbGFpbicsCiAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnYy5qdXN0aWZpY2F0aW9uX3BsYWluJywKCiAgICAgICAgIyBzdHJpbmdzIGluIGNoYW5nZV93b3Jrb3JkZXIKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICAgICA9PiAnd28yLnRpdGxlJywKICAgICAgICBXb3JrT3JkZXJJbnN0cnVjdGlvbiA9PiAnd28yLmluc3RydWN0aW9uX3BsYWluJywKICAgICAgICBXb3JrT3JkZXJSZXBvcnQgICAgICA9PiAnd28yLnJlcG9ydF9wbGFpbicsCiAgICApOwoKICAgICMgYWRkIHN0cmluZyBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBTVFJJTkdQQVJBTToKICAgIGZvciBteSAkU3RyaW5nUGFyYW0gKCBzb3J0IGtleXMgJVN0cmluZ1BhcmFtcyApIHsKCiAgICAgICAgIyBjaGVjayBzdHJpbmcgcGFyYW1zIGZvciB1c2VmdWwgdmFsdWVzLCB0aGUgc3RyaW5nICcwJyBpcyBhbGxvd2VkCiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAhZXhpc3RzICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWRlZmluZWQgJFBhcmFteyRTdHJpbmdQYXJhbX07CiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSBlcSAnJzsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0gKTsKCiAgICAgICAgIyBjaGVjayBpZiBhIENMT0IgZmllbGQgaXMgdXNlZCBpbiBvcmFjbGUKICAgICAgICAjIEZpeC9Xb3JrYXJvdW5kIGZvciBPUkEtMDA5MzI6IGluY29uc2lzdGVudCBkYXRhdHlwZXM6IGV4cGVjdGVkIC0gZ290IENMT0IKICAgICAgICBteSAkRm9yY2VMaWtlU2VhcmNoRm9yU3BlY2lhbEZpZWxkczsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57REJUeXBlfSBlcSAnb3JhY2xlJwogICAgICAgICAgICAmJiAoICRTdHJpbmdQYXJhbSBlcSAnRGVzY3JpcHRpb24nIHx8ICRTdHJpbmdQYXJhbSBlcSAnSnVzdGlmaWNhdGlvbicgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRm9yY2VMaWtlU2VhcmNoRm9yU3BlY2lhbEZpZWxkcyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZCAob3IgTElLRSBzZWFyY2ggaXMgZm9yY2VkIGZvciBzb21lIHNwZWNpYWwgZmllbGRzIG9uIG9yYWNsZSkKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gfHwgJEZvcmNlTGlrZVNlYXJjaEZvclNwZWNpYWxGaWVsZHMgKSB7CgogICAgICAgICAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAjIFF1b3RlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0sICdMaWtlJyApOwoKICAgICAgICAgICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBzdHJpbmcgcGFyYW1zIHdoaWNoIGNvbnRhaW4gb25seSAlCiAgICAgICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gPX4gbXsgXEEgJSogXHogfXhtczsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgIkxPV0VSKCRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSkgTElLRSBMT1dFUignJFBhcmFteyRTdHJpbmdQYXJhbX0nKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQoKICAgICAgICAjIG5vIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pID0gTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0gPX4gbXsgd28yIH14bXMgKSB7CgogICAgICAgICAgICAjIHRoZSBjaGFuZ2Vfd29ya29yZGVyIHRhYmxlIG5lZWRzIHRvIGJlIGpvaW5lZCwgd2hlbiBpdCBvY2N1cnMgaW4gdGhlIFdIRVJFIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICd3bzInOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHNxbCBmb3IgZHluYW1pYyBmaWVsZHMKICAgIG15ICRTUUxEeW5hbWljRmllbGRJbm5lckpvaW5zID0gJyc7ICAgICMgam9pbi1zdGF0ZW1lbnRzCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgICAgICA9ICcnOyAgICAjIHdoZXJlLWNsYXVzZQogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyICAgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ2hhbmdlRHluYW1pY0ZpZWxkc30sIEB7JFdvcmtPcmRlckR5bmFtaWNGaWVsZHN9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAqCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgIyB2YWxpZGF0ZSBkYXRhIHR5cGUKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0ZVN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnIE9SICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIKICAgICAgICAgICAgICAgICAgICAuPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBUYWJsZUFsaWFzICAgICAgICAgPT4gImRmdiREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICAgICBTZWFyY2hUZXJtICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwogICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZSAuPSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWI7CiAgICAgICAgICAgICAgICAkTmVlZEpvaW4gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJE5lZWRKb2luKSB7CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnSVRTTUNoYW5nZScgKSB7CgogICAgICAgICAgICAgICAgIyBqb2luIHRoZSB0YWJsZSBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkSW5uZXJKb2lucwogICAgICAgICAgICAgICAgICAgIC49ICJJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGMuaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiIC4KICAgICAgICAgICAgICAgICAgICAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpICI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKCiAgICAgICAgICAgICAgICAjIGFsd2F5cyBqb2luIHRoZSB3b3Jrb3JkZXIgdGFibGUgZm9yIGlubmVyIGpvaW5zIHdpdGggdGhlIGNoYW5nZSB0YWJsZQogICAgICAgICAgICAgICAgIyBpdCBkb2VzIG5vdCBtYXR0ZXIgaWYgYWxyZWFkeSBjb250YWluZWQgaW4gQElubmVySm9pblRhYmxlcwogICAgICAgICAgICAgICAgIyBhcyBkb3VibGUgZW50cmllcyBhcmUgZmlsdGVyZWQgb3V0IGxhdGVyCiAgICAgICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICd3bzInOwoKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRJbm5lckpvaW5zCiAgICAgICAgICAgICAgICAgICAgLj0gIklOTkVSIEpPSU4gZHluYW1pY19maWVsZF92YWx1ZSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIKICAgICAgICAgICAgICAgICAgICBPTiAod28yLmlkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIiAuCiAgICAgICAgICAgICAgICAgICAgJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKSAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2hhbmdlU3RhdGVJRHMgICA9PiAnYy5jaGFuZ2Vfc3RhdGVfaWQnLAogICAgICAgIENoYW5nZU1hbmFnZXJJRHMgPT4gJ2MuY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gJ2MuY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SURzICAgICAgPT4gJ2MuY2F0ZWdvcnlfaWQnLAogICAgICAgIEltcGFjdElEcyAgICAgICAgPT4gJ2MuaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEcyAgICAgID0+ICdjLnByaW9yaXR5X2lkJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICdjLmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAnYy5jaGFuZ2VfYnknLAogICAgKTsKCiAgICAjIGFkZCBhcnJheSBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBBUlJBWVBBUkFNOgogICAgZm9yIG15ICRBcnJheVBhcmFtICggc29ydCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgIyBpZ25vcmUgZW1wdHkgbGlzdHMKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICREQk9iamVjdC0+UXVvdGUoICRPbmVQYXJhbSwgJ0ludGVnZXInICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBzdHJpbmcKICAgICAgICBteSAkSW5TdHJpbmcgPSBqb2luICcsICcsIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkQXJyYXlQYXJhbXN7JEFycmF5UGFyYW19IElOICgkSW5TdHJpbmcpIjsKICAgIH0KCiAgICAjIHNldCB0aW1lIHBhcmFtcwogICAgbXkgJVRpbWVQYXJhbXMgPSAoCgogICAgICAgICMgdGltZXMgaW4gY2hhbmdlX2l0ZW0KICAgICAgICBDcmVhdGVUaW1lTmV3ZXJEYXRlICAgID0+ICdjLmNyZWF0ZV90aW1lID49JywKICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlICAgID0+ICdjLmNyZWF0ZV90aW1lIDw9JywKICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlICAgID0+ICdjLmNoYW5nZV90aW1lID49JywKICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlICAgID0+ICdjLmNoYW5nZV90aW1lIDw9JywKICAgICAgICBSZXF1ZXN0ZWRUaW1lTmV3ZXJEYXRlID0+ICdjLnJlcXVlc3RlZF90aW1lID49JywKICAgICAgICBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlID0+ICdjLnJlcXVlc3RlZF90aW1lIDw9JywKCiAgICAgICAgIyB0aW1lcyBpbiBjaGFuZ2Vfd29ya29yZGVyCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnbWluKHdvMS5wbGFubmVkX3N0YXJ0X3RpbWUpID49JywKICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICdtaW4od28xLnBsYW5uZWRfc3RhcnRfdGltZSkgPD0nLAogICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlICAgPT4gJ21heCh3bzEucGxhbm5lZF9lbmRfdGltZSkgPj0nLAogICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlICAgPT4gJ21heCh3bzEucGxhbm5lZF9lbmRfdGltZSkgPD0nLAogICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSAgPT4gJ21pbih3bzEuYWN0dWFsX3N0YXJ0X3RpbWUpID49JywKICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgID0+ICdtaW4od28xLmFjdHVhbF9zdGFydF90aW1lKSA8PScsCiAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSAgICA9PiAnbWF4KHdvMS5hY3R1YWxfZW5kX3RpbWUpID49JywKICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlICAgID0+ICdtYXgod28xLmFjdHVhbF9lbmRfdGltZSkgPD0nLAogICAgKTsKCiAgICAjIGNoZWNrIGFuZCBhZGQgdGltZSBwYXJhbXMgdG8gV0hFUkUgb3IgSEFWSU5HIGNsYXVzZQogICAgVElNRVBBUkFNOgogICAgZm9yIG15ICRUaW1lUGFyYW0gKCBzb3J0IGtleXMgJVRpbWVQYXJhbXMgKSB7CgogICAgICAgIG5leHQgVElNRVBBUkFNIGlmICEkUGFyYW17JFRpbWVQYXJhbX07CgogICAgICAgIGlmICggJFBhcmFteyRUaW1lUGFyYW19ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAkVGltZVBhcmFtIGhhcyBhbiBpbnZhbGlkIGRhdGUgZm9ybWF0ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17JFRpbWVQYXJhbX0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17JFRpbWVQYXJhbX0gKTsKCiAgICAgICAgaWYgKCAkVGltZVBhcmFtc3skVGltZVBhcmFtfSA9fiBteyB3bzEgfXhtcyApIHsKCiAgICAgICAgICAgICMgdGhlIGNoYW5nZV93b3Jrb3JkZXIgdGFibGUgbmVlZHMgdG8gYmUgam9pbmVkLCB3aGVuIGl0IG9jY3VycyBpbiB0aGUgSEFWSU5HIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBTUUxIYXZpbmcsICAgICAgICIkVGltZVBhcmFtc3skVGltZVBhcmFtfSAnJFBhcmFteyRUaW1lUGFyYW19JyI7CiAgICAgICAgICAgIHB1c2ggQE91dGVySm9pblRhYmxlcywgJ3dvMSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyB0aGUgdGltZSBhdHRyaWJ1dGVzIG9mIGNoYW5nZV9pdGVtIHNob3cgdXAgaW4gdGhlIFdIRVJFIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRUaW1lUGFyYW1zeyRUaW1lUGFyYW19ICckUGFyYW17JFRpbWVQYXJhbX0nIjsKICAgICAgICB9CiAgICB9CgogICAgIyBjb25kaXRpb25zIGZvciBDQUIgc2VhcmNoZXMKICAgIG15ICVDQUJQYXJhbXMgPSAoCiAgICAgICAgQ0FCQWdlbnRzICAgID0+ICdjYWIxLnVzZXJfaWQnLAogICAgICAgIENBQkN1c3RvbWVycyA9PiAnY2FiMi5jdXN0b21lcl91c2VyX2lkJywKICAgICk7CgogICAgIyBhZGQgY2FiIHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIENBQlBBUkFNOgogICAgZm9yIG15ICRDQUJQYXJhbSAoIHNvcnQga2V5cyAlQ0FCUGFyYW1zICkgewogICAgICAgIG5leHQgQ0FCUEFSQU0gaWYgIUB7ICRQYXJhbXskQ0FCUGFyYW19IH07CgogICAgICAgICMgcXVvdGUKICAgICAgICBmb3IgbXkgJE9uZVBhcmFtICggQHsgJFBhcmFteyRDQUJQYXJhbX0gfSApIHsKICAgICAgICAgICAgJE9uZVBhcmFtID0gJERCT2JqZWN0LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ0FCUGFyYW0gZXEgJ0NBQkFnZW50cycgKSB7CgogICAgICAgICAgICAjIENBQkFnZW50IGlzIGEgaW50ZWdlciwgc28gbm8gcXVvdGVzIGFyZSBuZWVkZWQKICAgICAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JENBQlBhcmFtfSB9OwogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgICAgICAgICIkQ0FCUGFyYW1zeyRDQUJQYXJhbX0gSU4gKCRJblN0cmluZykiOwogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICdjYWIxJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ0FCUGFyYW0gZXEgJ0NBQkN1c3RvbWVycycgKSB7CgogICAgICAgICAgICAjIENBQkN1c3RvbWVyIGlzIGEgc3RyaW5nLCBzbyB0aGUgc2luZ2xlIHF1b3RlcyBhcmUgbmVlZGVkCiAgICAgICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gJywgJywgbWFwIHsiJyRfJyJ9IEB7ICRQYXJhbXskQ0FCUGFyYW19IH07CiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLCAgICAgICAgIiRDQUJQYXJhbXN7JENBQlBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICAgICAgICAgIHB1c2ggQElubmVySm9pblRhYmxlcywgJ2NhYjInOwogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtvcmRlciBhcnJheSBwYXJhbXMKICAgIG15ICVXb3JrT3JkZXJBcnJheVBhcmFtcyA9ICgKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiAnd29ya29yZGVyX2FnZW50X2lkJywKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEcyA9PiAnd29ya29yZGVyX3N0YXRlX2lkJywKICAgICAgICBXb3JrT3JkZXJUeXBlSURzICA9PiAnd29ya29yZGVyX3R5cGVfaWQnLAogICAgKTsKCiAgICAjIGFkZCB3b3Jrb3JkZXIgcGFyYW1zIHRvIHNxbC13aGVyZS1hcnJheQogICAgV09SS09SREVSUEFSQU06CiAgICBmb3IgbXkgJFdvcmtPcmRlclBhcmFtICggc29ydCBrZXlzICVXb3JrT3JkZXJBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBXT1JLT1JERVJQQVJBTSBpZiAhQHsgJFBhcmFteyRXb3JrT3JkZXJQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZSBhcyBpbnRlZ2VyCiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXskV29ya09yZGVyUGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICREQk9iamVjdC0+UXVvdGUoICRPbmVQYXJhbSwgJ0ludGVnZXInICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBzdHJpbmcKICAgICAgICBteSAkSW5TdHJpbmcgPSBqb2luICcsICcsIEB7ICRQYXJhbXskV29ya09yZGVyUGFyYW19IH07CiAgICAgICAgbXkgJENvbHVtbk5hbWUgPSAkV29ya09yZGVyQXJyYXlQYXJhbXN7JFdvcmtPcmRlclBhcmFtfTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICAgICAgICAid28yLiRDb2x1bW5OYW1lIElOICggJEluU3RyaW5nICkiOwogICAgICAgIHB1c2ggQElubmVySm9pblRhYmxlcywgJ3dvMic7CiAgICB9CgogICAgIyBkZWZpbmUgd2hpY2ggcGFyYW1ldGVyIHJlcXVpcmUgYSBqb2luIHdpdGggd29ya29yZGVyIHRhYmxlCiAgICBteSAlVGFibGVSZXF1aXJlc0pvaW4gPSAoCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAxLAogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gMSwKICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+IDEsCiAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAxLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICBteSBAU1FMT3JkZXJCeTsKICAgIG15IEBTUUxBbGlhc2VzOyAgICAjIG9yZGVyIGJ5IGFsaWFzZXMsIGJlIG9uIHRoZSBzYXZlIHNpZGUgd2l0aCBNeVNRTAogICAgbXkgJENvdW50ID0gMDsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICAjIHNldCB0aGUgZGVmYXVsdCBvcmRlciBkaXJlY3Rpb24KICAgICAgICBteSAkRGlyZWN0aW9uID0gJ0RFU0MnOwoKICAgICAgICAjIGFkZCB0aGUgZ2l2ZW4gb3JkZXIgZGlyZWN0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ0Rvd24nICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgU1FMCiAgICAgICAgaWYgKCAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSA9fiBteyB3bzEgfXhtcyApIHsKICAgICAgICAgICAgcHVzaCBAU1FMQWxpYXNlcywgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9IGFzIGFsaWFzXyRPcmRlckJ5IjsKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgImFsaWFzXyRPcmRlckJ5ICREaXJlY3Rpb24iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwogICAgICAgIH0KCiAgICAgICAgIyBmb3Igc29tZSBvcmRlciBmaWVsZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlLCB0aGF0IHRoZSB3bzEgdGFibGUgaXMgam9pbmVkCiAgICAgICAgaWYgKCAkVGFibGVSZXF1aXJlc0pvaW57JE9yZGVyQnl9ICkgewogICAgICAgICAgICBwdXNoIEBPdXRlckpvaW5UYWJsZXMsICd3bzEnOwogICAgICAgIH0KICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnQrKzsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgb3JkZXJpbmcgaXMgbm90IGRldGVybWluZWQKICAgICMgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQKICAgIGlmICggIWdyZXAgeyAkXyBlcSAnQ2hhbmdlSUQnIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxle0NoYW5nZUlEfSBERVNDIjsKICAgIH0KCiAgICAjIGFzc2VtYmxlIHRoZSBTUUwgcXVlcnkKICAgIG15ICRTUUwgPSAnU0VMRUNUICcgLiBqb2luKCAnLCAnLCAoICdjLmlkJywgQFNRTEFsaWFzZXMgKSApIC4gJyBGUk9NIGNoYW5nZV9pdGVtIGMgJzsKCiAgICAjIG1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJywgYW5kIHdoZW4gdGhlcmUgYXJlIG5vIGpvaW5zCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyAmJiAhQElubmVySm9pblRhYmxlcyAmJiAhQE91dGVySm9pblRhYmxlcyApIHsKICAgICAgICAkU1FMICAgICAgICA9ICdTRUxFQ1QgQ09VTlQoYy5pZCkgRlJPTSBjaGFuZ2VfaXRlbSBjICc7CiAgICAgICAgQFNRTE9yZGVyQnkgPSAoKTsKICAgIH0KCiAgICAjIGFkZCB0aGUgam9pbnMKICAgIG15ICVMb25nVGFibGVOYW1lID0gKAogICAgICAgIHdvMSAgPT4gJ2NoYW5nZV93b3Jrb3JkZXInLAogICAgICAgIHdvMiAgPT4gJ2NoYW5nZV93b3Jrb3JkZXInLAogICAgICAgIGNhYjEgPT4gJ2NoYW5nZV9jYWInLAogICAgICAgIGNhYjIgPT4gJ2NoYW5nZV9jYWInLAogICAgKTsKICAgIG15ICVUYWJsZVNlZW47CgogICAgSU5ORVJfSk9JTl9UQUJMRToKICAgIGZvciBteSAkVGFibGUgKEBJbm5lckpvaW5UYWJsZXMpIHsKCiAgICAgICAgIyBkbyBub3Qgam9pbiBhIHRhYmxlIHR3aWNlCiAgICAgICAgbmV4dCBJTk5FUl9KT0lOX1RBQkxFIGlmICRUYWJsZVNlZW57JFRhYmxlfTsKCiAgICAgICAgJFRhYmxlU2VlbnskVGFibGV9ID0gMTsKCiAgICAgICAgaWYgKCAhJExvbmdUYWJsZU5hbWV7JFRhYmxlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuY291bnRlcmVkIGludmFsaWQgaW5uZXIgam9pbiB0YWJsZSAnJFRhYmxlJyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkU1FMIC49ICJJTk5FUiBKT0lOICRMb25nVGFibGVOYW1leyRUYWJsZX0gJFRhYmxlIE9OICRUYWJsZS5jaGFuZ2VfaWQgPSBjLmlkICI7CiAgICB9CgogICAgIyBhZGQgdGhlIGR5bmFtaWMgZmllbGQgaW5uZXIgam9pbiBzdGF0ZW1lbnRzCiAgICAkU1FMIC49ICRTUUxEeW5hbWljRmllbGRJbm5lckpvaW5zOwoKICAgIE9VVEVSX0pPSU5fVEFCTEU6CiAgICBmb3IgbXkgJFRhYmxlIChAT3V0ZXJKb2luVGFibGVzKSB7CgogICAgICAgICMgZG8gbm90IGpvaW4gYSB0YWJsZSB0d2ljZSwgd2hlbiBhIHRhYmxlIGhhcyBiZWVuIGlubmVyIGpvaW5lZCwgbm8gb3V0ZXIgam9pbiBpcyBuZWNlc3NhcnkKICAgICAgICBuZXh0IE9VVEVSX0pPSU5fVEFCTEUgaWYgJFRhYmxlU2VlbnskVGFibGV9OwoKICAgICAgICAjIHJlbWVtYmVyIHRoYXQgdGhpcyB0YWJsZSBpcyBqb2luZWQgYWxyZWFkeQogICAgICAgICRUYWJsZVNlZW57JFRhYmxlfSA9IDE7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5jb3VudGVyZWQgaW52YWxpZCBvdXRlciBqb2luIHRhYmxlICckVGFibGUnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRTUUwgLj0gIkxFRlQgT1VURVIgSk9JTiAkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICRUYWJsZSBPTiAkVGFibGUuY2hhbmdlX2lkID0gYy5pZCAiOwogICAgfQoKICAgICMgYWRkIHRoZSBXSEVSRSBjbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAkU1FMIC49ICcgQU5EICcgLiAkU1FMRHluYW1pY0ZpZWxkV2hlcmU7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAkU1FMIC49ICcgV0hFUkUgJyAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKICAgICAgICB9CiAgICB9CgogICAgIyB3ZSBuZWVkIHRvIGdyb3VwIHdoZW5ldmVyIHRoZXJlIGlzIGEgam9pbgogICAgaWYgKAogICAgICAgIHNjYWxhciBASW5uZXJKb2luVGFibGVzCiAgICAgICAgfHwgJFNRTER5bmFtaWNGaWVsZFdoZXJlCiAgICAgICAgfHwgc2NhbGFyIEBPdXRlckpvaW5UYWJsZXMKICAgICAgICApCiAgICB7CiAgICAgICAgJFNRTCAuPSAnR1JPVVAgQlkgYy5pZCAnOwoKICAgICAgICBpZiAoQFNRTE9yZGVyQnkpIHsKCiAgICAgICAgICAgIE9SREVSQlk6CiAgICAgICAgICAgIGZvciBteSAkT3JkZXJCeSAoQFNRTE9yZGVyQnkpIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgY29sdW1uIGZyb20gYSBzdHJpbmcgdGhhdCBsb29rcyBsaWtlOiBjLmNoYW5nZV9udW1iZXIgQVNDCiAgICAgICAgICAgICAgICBpZiAoICRPcmRlckJ5ID1+IG17IFxBIChcUyspIH14bXMgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gcGFydCBvZiB0aGUgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbHVtbiA9ICQxOwoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIHRoZSBjLmlkIGNvbHVtbiBhZ2FpbiwgYXMgdGhpcyBpcyBhbHJlYWR5IGRvbmUgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRDb2x1bW4gZXEgJ2MuaWQnOwoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGFsaWFzZXMgb2YgYWdncmVnYXRlIGZ1bmN0aW9ucyAobWluL21heCkKICAgICAgICAgICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgJENvbHVtbiA9fiBteyBcQSBhbGlhc18gfXhtczsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIGNvbHVtbiB0byB0aGUgZ3JvdXAgYnkgY2xhdXNlCiAgICAgICAgICAgICAgICAgICAgJFNRTCAuPSAiLCAkQ29sdW1uICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdGhlIEhBVklORyBjbGF1c2UKICAgIGlmIChAU1FMSGF2aW5nKSB7CiAgICAgICAgJFNRTCAuPSAnSEFWSU5HICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxIYXZpbmc7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBpZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtMaW1pdH07CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgIGlmICgKICAgICAgICAkUmVzdWx0IGVxICdDT1VOVCcKICAgICAgICAmJiAhQElubmVySm9pblRhYmxlcwogICAgICAgICYmICEkU1FMRHluYW1pY0ZpZWxkV2hlcmUKICAgICAgICAmJiAhQE91dGVySm9pblRhYmxlcwogICAgICAgICkKICAgIHsKCiAgICAgICAgIyByZXR1cm4gdGhlIENPVU5UKGMuaWQpIGF0dHJpYnV0ZQogICAgICAgIHJldHVybiAkSURzWzBdIHx8IDA7CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgIyByZXR1cm4gdGhlIGNvdW50IGFzIHRoZSBudW1iZXIgb2YgSURzCiAgICAgICAgcmV0dXJuIHNjYWxhciBASURzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9Cgo9aGVhZDIgQ2hhbmdlRGVsZXRlKCkKCkRlbGV0ZSBhIGNoYW5nZS4KClRoaXMgZnVuY3Rpb24gZmlyc3QgcmVtb3ZlcyBhbGwgbGlua3MgYW5kIGF0dGFjaG1lbnRzIHRvIHRoZSBnaXZlbiBjaGFuZ2UuClRoZW4gaXQgZ2V0cyBhIGxpc3Qgb2YgYWxsIEM8d29ya29yZGVycz4gb2YgdGhlIGNoYW5nZSBhbmQKY2FsbHMgQzxXb3Jrb3JkZXJEZWxldGUoKT4gZm9yIGVhY2ggQzx3b3Jrb3JkZXI+LCB3aGljaCB3aWxsIGRlbGV0ZQphbGwgbGlua3MgYW5kIGFsbCBhdHRhY2htZW50cyB0byB0aGUgQzx3b3Jrb3JkZXJzPi4KVGhlbiBpdCBkZWxldGVzIHRoZSBDQUIuCkFmdGVyIHRoYXQgdGhlIGNoYW5nZSBpcyByZW1vdmVkLgpUaGUgaGlzdG9yeSBvZiB0aGlzIGNoYW5nZSB3aWxsIGJlIGRlbGV0ZWQgZHVyaW5nIHRoZSBoYW5kbGluZyBvZiB0aGUKdHJpZ2dlcmVkIENoYW5nZURlbGV0ZVBvc3QtZXZlbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBDaGFuZ2VEZWxldGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZURlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdGhlIGNoYW5nZSBkb2VzIG5vdCBleGlzdCwgd2hlbiBpdCBjYW4ndCBiZSBsb29rZWQgdXAKICAgIHJldHVybiBpZiAhJFNlbGYtPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgbGlua3MgdG8gdGhpcyBjaGFuZ2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEtleSAgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBhdHRhY2htZW50cyBhbmQgZGVsZXRlIHRoZW0KICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKICAgIGZvciBteSAkRmlsZW5hbWUgKEBBdHRhY2htZW50cykgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPkNoYW5nZUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YSB0byBnZXQgdGhlIHdvcmtvcmRlciBpZHMKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNoYW5nZSBjb250YWlucyB3b3Jrb3JkZXJzCiAgICBpZiAoCiAgICAgICAgJENoYW5nZURhdGEKICAgICAgICAmJiByZWYgJENoYW5nZURhdGEgZXEgJ0hBU0gnCiAgICAgICAgJiYgJENoYW5nZURhdGEtPntXb3JrT3JkZXJJRHN9CiAgICAgICAgJiYgcmVmICRDaGFuZ2VEYXRhLT57V29ya09yZGVySURzfSBlcSAnQVJSQVknCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSB0aGUgd29ya29yZGVycwogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlRGF0YS0+e1dvcmtPcmRlcklEc30gfSApIHsKCiAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIE5vTnVtYmVyQ2FsYyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkRGVsZXRlU3VjY2VzczsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgdGhlIENBQgogICAgcmV0dXJuIGlmICEkU2VsZi0+Q2hhbmdlQ0FCRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgdGhlIG9iamVjdCB0eXBlIElUU01DaGFuZ2UKICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFZhbGlkICAgICAgPT4gMCwKICAgICk7CgogICAgIyBkZWxldGUgZHluYW1pY2ZpZWxkIHZhbHVlcyBmb3IgdGhpcyBjaGFuZ2UKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZURlbGV0ZSgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdDaGFuZ2VHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlTGlzdCcsCiAgICAgICAgJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZU51bWJlcjo6JyAuICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ2hhbmdlRGVsZXRlUG9zdC1FdmVudAogICAgIyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZGVsZXRpbmcgdGhlIGNoYW5nZSBmcm9tIHRoZSBkYXRhYmFzZSwKICAgICMgYmVjYXVzZSBvZiBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgaW4gdGhlIGNoYW5nZV9oaXN0b3J5IHRhYmxlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VEZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZENoYW5nZURhdGEgPT4gJENoYW5nZURhdGEsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIGNoYW5nZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDaGFuZ2VTdGF0ZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNoYW5nZSBzdGF0ZS4gSWYgYSBjaGFuZ2Ugc3RhdGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZSBzdGF0ZS4gSWYgYSBjaGFuZ2Ugc3RhdGUgbmFtZSBpcyBnaXZlbiwKdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRDaGFuZ2VTdGF0ZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgIENoYW5nZVN0YXRlSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAnYWNjZXB0ZWQnLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VTdGF0ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZWl0aGVyIENoYW5nZVN0YXRlSUQgb3IgU3RhdGUgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSAmJiAhJFBhcmFte0NoYW5nZVN0YXRlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlU3RhdGVJRCBvciBDaGFuZ2VTdGF0ZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0NoYW5nZVN0YXRlSUR9ICYmICRQYXJhbXtDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZVN0YXRlSUQgT1IgQ2hhbmdlU3RhdGUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBjaGFuZ2Ugc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgbXkgJFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwoKICAgICMgY29udmVydCBzdGF0ZSBsaXN0IGludG8gYSBsb29rdXAgaGFzaAogICAgbXkgJVN0YXRlSUQyTmFtZTsKICAgIGlmICggJFN0YXRlTGlzdCAmJiByZWYgJFN0YXRlTGlzdCBlcSAnSEFTSCcgJiYgJXskU3RhdGVMaXN0fSApIHsKICAgICAgICAlU3RhdGVJRDJOYW1lID0gJXskU3RhdGVMaXN0fTsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBzdGF0ZSBoYXNoCiAgICBpZiAoICElU3RhdGVJRDJOYW1lICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IHJldHJpZXZlIGNoYW5nZSBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gJFN0YXRlSUQyTmFtZXsgJFBhcmFte0NoYW5nZVN0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXZlcnNlIGtleSAtIHZhbHVlIHBhaXJzIHRvIGhhdmUgdGhlIG5hbWUgYXMga2V5cwogICAgICAgIG15ICVTdGF0ZU5hbWUySUQgPSByZXZlcnNlICVTdGF0ZUlEMk5hbWU7CgogICAgICAgIHJldHVybiAkU3RhdGVOYW1lMklEeyAkUGFyYW17Q2hhbmdlU3RhdGV9IH07CiAgICB9Cn0KCj1oZWFkMiBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBwb3NzaWJsZSBjaGFuZ2Ugc3RhdGVzLgpJZiBDaGFuZ2VJRCBpcyBvbWl0dGVkLCB0aGUgY29tcGxldGUgbGlzdCBvZiBjaGFuZ2Ugc3RhdGVzIGlzIHJldHVybmVkLgpJZiBDaGFuZ2VJRCBpcyBnaXZlbiwgdGhlIGxpc3Qgb2YgcG9zc2libGUgY2hhbmdlIHN0YXRlcyBmb3IgdGhpcwpjaGFuZ2UgaXMgcmV0dXJuZWQuCgogICAgbXkgJENoYW5nZVN0YXRlTGlzdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIENoYW5nZUlEID0+IDEyMywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIGhhc2hyZWZzLiBUaGUgZWxlbWVudCAnS2V5JyBpcyB0aGVuCnRoZSBDaGFuZ2VTdGF0ZUlEIGFuZCB0aGUgZWxlbWVudCAnVmFsdWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBzdGF0ZS4gVGhlIGFycmF5IGVsZW1lbnRzCmFyZSBzb3J0ZWQgYnkgc3RhdGUgaWQuCgogICAgbXkgJENoYW5nZVN0YXRlTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE1NiwKICAgICAgICAgICAgVmFsdWUgPT4gJ2FwcHJvdmVkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU3LAogICAgICAgICAgICBWYWx1ZSA9PiAnaW4gcHJvZ3Jlc3MnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApIHx8IHt9OwoKICAgICMgdG8gc3RvcmUgYW4gYXJyYXkgb2YgaGFzaCByZWZzCiAgICBteSBAQXJyYXlIYXNoUmVmOwoKICAgICMgaWYgQ2hhbmdlSUQgaXMgZ2l2ZW4sIG9ubHkgdXNlIHBvc3NpYmxlIG5leHQgc3RhdGVzIGFzIGRlZmluZWQgaW4gc3RhdGUgbWFjaGluZQogICAgaWYgKCAkUGFyYW17Q2hhbmdlSUR9ICkgewoKICAgICAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBzdGF0ZSBsb2NrCiAgICAgICAgbXkgJFN0YXRlTG9jazsKICAgICAgICAkU3RhdGVMb2NrID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+Q29uZGl0aW9uTWF0Y2hTdGF0ZUxvY2soCiAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICBTZWxlY3RvciAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgPT4gJENoYW5nZS0+e0NoYW5nZVN0YXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGFzIGRlZmF1bHQgc3RhdGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICBteSBATmV4dFN0YXRlSURzID0gKCAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH0gKTsKCiAgICAgICAgIyBjaGVjayBpZiByZWFjaGFibGUgY2hhbmdlIGVuZCBzdGF0ZXMgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGxvY2tlZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgbXkgJENoYW5nZUVuZFN0YXRlc0FsbG93ZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01DaGFuZ2U6OlN0YXRlTG9jazo6QWxsb3dFbmRTdGF0ZXMnKTsKCiAgICAgICAgaWYgKCRDaGFuZ2VFbmRTdGF0ZXNBbGxvd2VkKSB7CgogICAgICAgICAgICAjIHNldCBhcyBkZWZhdWx0IHN0YXRlIGN1cnJlbnQgc3RhdGUgYW5kIGFsbCBwb3NzaWJsZSBlbmQgc3RhdGVzCiAgICAgICAgICAgIG15ICRFbmRTdGF0ZUlEc1JlZgogICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpLT5TdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoCiAgICAgICAgICAgICAgICBTdGF0ZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICAgICAgKSB8fCBbXTsKICAgICAgICAgICAgQE5leHRTdGF0ZUlEcyA9IHNvcnQgKCBAeyRFbmRTdGF0ZUlEc1JlZn0sICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbmV4dCBzdGF0ZXMgaWYgbm8gc3RhdGUgbG9jawogICAgICAgIGlmICggISRTdGF0ZUxvY2sgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgcG9zc2libGUgbmV4dCBzdGF0ZSBpZHMKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyktPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJENoYW5nZS0+e0NoYW5nZVN0YXRlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgICkgfHwgW107CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGNoYW5nZSBzdGF0ZSBpZCB0byBsaXN0CiAgICAgICAgICAgIEBOZXh0U3RhdGVJRHMgPSBzb3J0ICggQHskTmV4dFN0YXRlSURzUmVmfSwgJENoYW5nZS0+e0NoYW5nZVN0YXRlSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGFzc2VtYmxlIHRoZSBhcnJheSBvZiBoYXNoIHJlZnMgd2l0aCBvbmx5IHBvc3NpYmxlIG5leHQgc3RhdGVzCiAgICAgICAgU1RBVEVJRDoKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBOZXh0U3RhdGVJRHMpIHsKCiAgICAgICAgICAgIG5leHQgU1RBVEVJRCBpZiAhJFN0YXRlSUQ7CgogICAgICAgICAgICBwdXNoIEBBcnJheUhhc2hSZWYsIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFN0YXRlTGlzdC0+eyRTdGF0ZUlEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQEFycmF5SGFzaFJlZjsKICAgIH0KCiAgICAjIGFzc2VtYmxlIHRoZSBhcnJheSBvZiBoYXNoIHJlZnMgd2l0aCBhbGwgbmV4dCBzdGF0ZXMKICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAleyRTdGF0ZUxpc3R9ICkgewogICAgICAgIHB1c2ggQEFycmF5SGFzaFJlZiwgewogICAgICAgICAgICBLZXkgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJFN0YXRlTGlzdC0+eyRTdGF0ZUlEfSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBcQEFycmF5SGFzaFJlZjsKfQoKPWhlYWQyIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHBvc3NpYmxlIGNhdGVnb3JpZXMsIGltcGFjdHMgb3IgcHJpb3JpdGllcy4KCiAgICBteSAkQ0lQTGlzdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLCAgIyBDYXRlZ29yeXxJbXBhY3R8UHJpb3JpdHkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIGhhc2hyZWZzLiBUaGUgRWxlbWVudCAnS2V5JyBpcyB0aGVuCnRoZSBJRCBhbmQgdGhlIGVsZW1lbnQgJ1ZhbHVlJyBpcyB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnksIGltcGFjdCBvciBwcmlvcml0eS4KVGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzb3J0ZWQgYnkgaWQgaW4gYXNjZW5kaW5nIG9yZGVyLgoKICAgIG15ICRDSVBMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU2LAogICAgICAgICAgICBWYWx1ZSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE1NywKICAgICAgICAgICAgVmFsdWUgPT4gJzIgbG93JywKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBDaGFuZ2VQb3NzaWJsZUNJUEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBUeXBlIHBhcmFtIGZvciB2YWxpZCB2YWx1ZXMKICAgIGlmICgKICAgICAgICAhJFBhcmFte1R5cGV9CiAgICAgICAgfHwgKCAkUGFyYW17VHlwZX0gbmUgJ0NhdGVnb3J5JyAmJiAkUGFyYW17VHlwZX0gbmUgJ0ltcGFjdCcgJiYgJFBhcmFte1R5cGV9IG5lICdQcmlvcml0eScgKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbSBUeXBlIG11c3QgYmUgZWl0aGVyICJDYXRlZ29yeSIgb3IgIkltcGFjdCIgb3IgIlByaW9yaXR5IiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGl0ZW0gbGlzdCBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlCiAgICBteSAkQ0lQTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6JyAuICRQYXJhbXtUeXBlfSwKICAgICkgfHwge307CgogICAgIyBhc3NlbWJsZSBhbiBhcnJheSBvZiBoYXNoIHJlZnMKICAgIG15IEBBcnJheUhhc2hSZWY7CiAgICBmb3IgbXkgJElEICggc29ydCB7ICRDSVBMaXN0LT57JGF9IGNtcCAkQ0lQTGlzdC0+eyRifSB9IGtleXMgJXskQ0lQTGlzdH0gKSB7CiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJENJUExpc3QtPnskSUR9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9Cgo9aGVhZDIgQ2hhbmdlQ0lQTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgY2hhbmdlIGNhdGVnb3J5LCBpbXBhY3Qgb3IgcHJpb3JpdHkuCklmIGEgY2hhbmdlIEM8Q0lQLUlEPiBpcyBnaXZlbiwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgQzxDSVA+LgpJZiBhIGNoYW5nZSBDPENJUD4gbmFtZSBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlIElEIGlzIHJldHVybmVkLgoKICAgIG15ICROYW1lID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgIElEICAgPT4gMTIzNCwKICAgICAgICBUeXBlID0+ICdQcmlvcml0eScsCiAgICApOwoKICAgIG15ICRJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICBDSVAgID0+ICcxIHZlcnkgbG93JywKICAgICAgICBUeXBlID0+ICdDYXRlZ29yeScsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUNJUExvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZWl0aGVyIElEIG9yIENJUCBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte0lEfSAmJiAhJFBhcmFte0NJUH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIG9yIENJUCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBJRCBhbmQgQ0lQIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17SUR9ICYmICRQYXJhbXtDSVB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgSUQgT1IgQ0lQIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFR5cGUgcGFyYW0gZm9yIHZhbGlkIHZhbHVlcwogICAgaWYgKAogICAgICAgICEkUGFyYW17VHlwZX0KICAgICAgICB8fCAoICRQYXJhbXtUeXBlfSBuZSAnQ2F0ZWdvcnknICYmICRQYXJhbXtUeXBlfSBuZSAnSW1wYWN0JyAmJiAkUGFyYW17VHlwZX0gbmUgJ1ByaW9yaXR5JyApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIFR5cGUgbXVzdCBiZSBlaXRoZXIgIkNhdGVnb3J5IiBvciAiSW1wYWN0IiBvciAiUHJpb3JpdHkiIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIENJUCBmcm9tIGdlbmVyYWwgY2F0YWxvZwogICAgIyBtYXBwaW5nIG9mIHRoZSBpZCB0byB0aGUgbmFtZQogICAgbXkgJUNoYW5nZUNJUCA9ICV7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6JyAuICRQYXJhbXtUeXBlfSwKICAgICAgICApIHx8IHt9CiAgICB9OwoKICAgIGlmICggJFBhcmFte0lEfSApIHsKICAgICAgICByZXR1cm4gJENoYW5nZUNJUHsgJFBhcmFte0lEfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmV2ZXJzZSBrZXkgLSB2YWx1ZSBwYWlycyB0byBoYXZlIHRoZSBuYW1lIGFzIGtleXMKICAgICAgICBteSAlUmV2ZXJzZWRDaGFuZ2VDSVAgPSByZXZlcnNlICVDaGFuZ2VDSVA7CgogICAgICAgIHJldHVybiAkUmV2ZXJzZWRDaGFuZ2VDSVB7ICRQYXJhbXtDSVB9IH07CiAgICB9Cn0KCj1oZWFkMiBQZXJtaXNzaW9uKCkKClJldHVybnMgd2hldGhlciB0aGUgYWdlbnQgQzxVc2VySUQ+IGhhcyBwZXJtaXNzaW9ucyBvZiB0aGUgdHlwZSBDPFR5cGU+Cm9uIHRoZSBjaGFuZ2UgQzxDaGFuZ2VJRD4uIFRoZSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgb24gdG8KdGhlIHBlcm1pc3Npb24gbW9kdWxlcyB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcGVybWlzc2lvbiByZWdpc3RyeS4KVGhlIHN0YW5kYXJkIHBlcm1pc3Npb24gcmVnaXN0cnkgaXMgQjxJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uPiwgYnV0CnRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgcGFyYW1ldGVyIEM8UGVybWlzc2lvblJlZ2lzdHJ5Pi4KClRoZSBvcHRpb25hbCBvcHRpb24gQzxMb2dObz4gdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiBhY2Nlc3Mgd2FzIGRlbmllZC4KVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBsaW5rIG9yIGFuIGFjdGlvbiBzaG91bGQgYmUgc2hvd24uCgogICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJ3JvJywgICAgICAgICAgICAgICAgICAgICAgICAgIyAncm8nIGFuZCAncncnIGFyZSBzdXBwb3J0ZWQKICAgICAgICBBY3Rpb24gICAgICAgICAgICAgPT4gJ0FnZW50SVRTTUNoYW5nZUVkaXQnLCAgICAgICAgIyBvcHRpb25hbAogICAgICAgIENoYW5nZUlEICAgICAgICAgICA9PiAzMzMzLCAgICMgb3B0aW9uYWwsIGRvIG5vdCBwYXNzIGZvciAnQ2hhbmdlQWRkJwogICAgICAgIFBlcm1pc3Npb25SZWdpc3RyeSA9PiAnSVRTTUNoYW5nZTo6UGVybWlzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB3aXRoIGRlZmF1bHQgJ0lUU01DaGFuZ2U6OlBlcm1pc3Npb24nCiAgICAgICAgTG9nTm8gICAgICAgICAgICAgID0+IDEsICAgICAgIyBvcHRpb25hbCwgdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiBhY2Nlc3MgaXMgZGVuaWVkCiAgICApOwoKPWN1dAoKc3ViIFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVGhlcmUgYXJlIHZhbGlkIGNhc2VzIHdoZW4gbm8gQ2hhbmdlSUQgaXMgcGFzc2VkLgogICAgIyBFLmcuIGZvciBDaGFuZ2VBZGQoKSBvciBDaGFuZ2VTZWFyY2goKS4KICAgICRQYXJhbXtDaGFuZ2VJRH0gfHw9ICcnOwoKICAgICMgdGhlIHBsYWNlIHdoZXJlIHRoZSBwZXJtaXNzaW9uIG1vZHVsZXMgYXJlIHJlZ2lzdGVyZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHBhcmFtZXRlcgogICAgbXkgJFJlZ2lzdHJ5ID0gJFBhcmFte1Blcm1pc3Npb25SZWdpc3RyeX0gfHwgJ0lUU01DaGFuZ2U6OlBlcm1pc3Npb24nOwoKICAgICMgcnVuIHRoZSByZWxldmFudCBwZXJtaXNzaW9uIG1vZHVsZXMKICAgIGlmICggcmVmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgkUmVnaXN0cnkpIGVxICdIQVNIJyApIHsKCiAgICAgICAgbXkgJU1vZHVsZXMgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJFJlZ2lzdHJ5KSB9OwoKICAgICAgICBNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CgogICAgICAgICAgICAjIGxvZyB0cnkgb2YgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUcnkgdG8gbG9hZCBtb2R1bGU6ICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRQogICAgICAgICAgICAgICAgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgIyBjcmVhdGUgb2JqZWN0CiAgICAgICAgICAgIG15ICRNb2R1bGVPYmplY3QgPSAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0tPm5ldygpOwoKICAgICAgICAgICAgIyBhc2sgZm9yIHRoZSBvcGluaW9uIG9mIHRoZSBQZXJtaXNzaW9uIG1vZHVsZQogICAgICAgICAgICBteSAkQWNjZXNzID0gJE1vZHVsZU9iamVjdC0+UnVuKCVQYXJhbSk7CgogICAgICAgICAgICAjIEdyYW50IG92ZXJhbGwgcGVybWlzc2lvbiwKICAgICAgICAgICAgIyB3aGVuIHRoZSBtb2R1bGUgZ3JhbnRlZCBhIHN1ZmZpY2llbnQgcGVybWlzc2lvbi4KICAgICAgICAgICAgaWYgKCAkQWNjZXNzICYmICRNb2R1bGVzeyRNb2R1bGV9LT57R3JhbnRlZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdyYW50ZWQgJyRQYXJhbXtUeXBlfScgYWNjZXNzIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJVc2VySUQ6ICRQYXJhbXtVc2VySUR9IG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNoYW5nZUlEICckUGFyYW17Q2hhbmdlSUR9JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJ0aHJvdWdoICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSAobm8gbW9yZSBjaGVja3MpISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdyYW50IHBlcm1pc3Npb24KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERlbnkgb3ZlcmFsbCBwZXJtaXNzaW9uLAogICAgICAgICAgICAjIHdoZW4gdGhlIG1vZHVsZSBkZW5pZWQgYSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICYmICRNb2R1bGVzeyRNb2R1bGV9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEZW5pZWQgJyRQYXJhbXtUeXBlfScgYWNjZXNzIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJVc2VySUQ6ICRQYXJhbXtVc2VySUR9IG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNoYW5nZUlEICckUGFyYW17Q2hhbmdlSUR9JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJiZWNhdXNlICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSBpcyByZXF1aXJlZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBkZW55IHBlcm1pc3Npb24KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIERlbnkgYWNjZXNzIHdoZW4gbmVpdGhlciBhICdHcmFudGVkJy1DaGVjayBub3IgYSAnUmVxdWlyZWQnLUNoZWNrIGhhcyByZWFjaGVkIGEgY29uY2x1c2lvbi4KICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVybWlzc2lvbiBkZW5pZWQgKFVzZXJJRDogJFBhcmFte1VzZXJJRH0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgICAgICAgICAgLiAib24gQ2hhbmdlSUQ6ICRQYXJhbXtDaGFuZ2VJRH0pISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBDaGFuZ2VBdHRhY2htZW50QWRkKCkKCkFkZCBhbiBhdHRhY2htZW50IHRvIHRoZSBnaXZlbiBjaGFuZ2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50QWRkKAogICAgICAgIENoYW5nZUlEICAgID0+IDEyMywgICAgICAgICAgICAgICAjIHRoZSBDaGFuZ2VJRCBiZWNvbWVzIHBhcnQgb2YgdGhlIGZpbGUgcGF0aAogICAgICAgIEZpbGVuYW1lICAgID0+ICdmaWxlbmFtZScsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ2NvbnRlbnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2VJRCBGaWxlbmFtZSBDb250ZW50IENvbnRlbnRUeXBlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB3cml0ZSB0byB2aXJ0dWFsIGZzCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+V3JpdGUoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gIkNoYW5nZS8kUGFyYW17Q2hhbmdlSUR9LyRQYXJhbXtGaWxlbmFtZX0iLAogICAgICAgIE1vZGUgICAgICAgID0+ICdiaW5hcnknLAogICAgICAgIENvbnRlbnQgICAgID0+IFwkUGFyYW17Q29udGVudH0sCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDb250ZW50SUQgICA9PiAkUGFyYW17Q29udGVudElEfSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJFBhcmFte0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgZXJyb3IKICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAjIHRyaWdnZXIgQXR0YWNobWVudEFkZC1FdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VBdHRhY2htZW50QWRkUG9zdCcsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCBhZGQgYXR0YWNobWVudCBmb3IgY2hhbmdlICRQYXJhbXtDaGFuZ2VJRH0iLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENoYW5nZUF0dGFjaG1lbnREZWxldGUoKQoKRGVsZXRlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLCAgICAgICMgdXNlZCBpbiBldmVudCBoYW5kbGluZywgZS5nLiBmb3IgbG9nZ2luZyB0aGUgaGlzdG9yeQogICAgICAgIEZpbGVuYW1lID0+ICdQcm9qZWN0cGxhbi5wZGYnLCAgICAgIyBpZGVudGlmaWVzIHRoZSBhdHRhY2htZW50ICh0b2dldGhlciB3aXRoIHRoZSBDaGFuZ2VJRCkKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBdHRhY2htZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2VJRCBGaWxlbmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gJ0NoYW5nZS8nIC4gJFBhcmFte0NoYW5nZUlEfSAuICcvJyAuICRQYXJhbXtGaWxlbmFtZX07CgogICAgIyBkZWxldGUgZmlsZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkRlbGV0ZSgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnREZWxldGVQb3N0LUV2ZW50CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUF0dGFjaG1lbnREZWxldGVQb3N0JywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2Fubm90IGRlbGV0ZSBhdHRhY2htZW50ICRGaWxlbmFtZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBDaGFuZ2VBdHRhY2htZW50R2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgb25lIHNwZWNpZmljIGF0dGFjaG1lbnQuCgogICAgbXkgJEF0dGFjaG1lbnQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50R2V0KAogICAgICAgIENoYW5nZUlEID0+IDQsCiAgICAgICAgRmlsZW5hbWUgPT4gJ3Rlc3QudHh0JywKICAgICk7CgpyZXR1cm5zCgogICAgewogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQWxsUHJlZmVyZW5jZXMgPT4gJ3Rlc3QnLAogICAgICAgIH0sCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3Rlc3QudHh0JywKICAgICAgICBDb250ZW50ICAgICA9PiAnaGFsbG8nLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBGaWxlc2l6ZSAgICA9PiAnMTIzIEtCeXRlcycsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgfQoKPWN1dAoKc3ViIENoYW5nZUF0dGFjaG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgRmlsZW5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gJ0NoYW5nZS8nIC4gJFBhcmFte0NoYW5nZUlEfSAuICcvJyAuICRQYXJhbXtGaWxlbmFtZX07CgogICAgIyBmaW5kIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIGNoYW5nZQogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5GaW5kKAogICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhQEF0dGFjaG1lbnRzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICBteSAlQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPlJlYWQoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgICAgIE1vZGUgICAgID0+ICdiaW5hcnknLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEluZm8gPSB7CiAgICAgICAgJUF0dGFjaG1lbnREYXRhLAogICAgICAgIEZpbGVuYW1lICAgID0+ICRQYXJhbXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJEF0dGFjaG1lbnREYXRhe0NvbnRlbnR9IH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0NvbnRlbnRUeXBlfSwKICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgRmlsZXNpemUgICAgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVzaXplUmF3fSwKICAgIH07CgogICAgcmV0dXJuICRBdHRhY2htZW50SW5mbzsKfQoKPWhlYWQyIENoYW5nZUF0dGFjaG1lbnRMaXN0KCkKClJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgYXR0YWNobWVudHMgb2YgdGhlIGdpdmVuIGNoYW5nZS4KCiAgICBteSBAQXR0YWNobWVudHMgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIEBBdHRhY2htZW50cyA9ICgKICAgICAgICAnZmlsZW5hbWUudHh0JywKICAgICAgICAnb3RoZXJfZmlsZS5wZGYnLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBdHRhY2htZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2hhbmdlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGFuZ2VJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgY2hhbmdlCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkRmlsZW5hbWUgKEBBdHRhY2htZW50cykgewoKICAgICAgICAjIHJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lCiAgICAgICAgJEZpbGVuYW1lID1+IHN7IFxBIENoYW5nZSAvIFxkKyAvIH17fXhtczsKICAgIH0KCiAgICByZXR1cm4gQEF0dGFjaG1lbnRzOwp9Cgo9aGVhZDIgQ2hhbmdlQXR0YWNobWVudEV4aXN0cygpCgpDaGVja3MgaWYgYSBmaWxlIHdpdGggYSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuCgogICAgbXkgJEV4aXN0cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgRmlsZW5hbWUgPT4gJ3Rlc3QudHh0JywKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlQXR0YWNobWVudEV4aXN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmlsZW5hbWUgQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RmluZCgKICAgICAgICBGaWxlbmFtZSA9PiAnQ2hhbmdlLycgLiAkUGFyYW17Q2hhbmdlSUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfQ2hlY2tDaGFuZ2VTdGF0ZUlEcygpCgpDaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgZ2l2ZW4gY2hhbmdlIHN0YXRlIGlkcyBhcmUgdmFsaWQuCgogICAgbXkgJE9rID0gJENoYW5nZU9iamVjdC0+X0NoZWNrQ2hhbmdlU3RhdGVJRHMoCiAgICAgICAgQ2hhbmdlU3RhdGVJRHMgPT4gWyAyNSwgMjYgXSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NoZWNrQ2hhbmdlU3RhdGVJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NoYW5nZVN0YXRlSURzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlU3RhdGVJRHMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gQ2hhbmdlU3RhdGVJRHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIENoYW5nZVN0YXRlSURzIGJlbG9uZyB0byBjb3JyZWN0IGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgZm9yIG15ICRTdGF0ZUlEICggQHsgJFBhcmFte0NoYW5nZVN0YXRlSURzfSB9ICkgewogICAgICAgIG15ICRTdGF0ZSA9ICRTZWxmLT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkU3RhdGVJRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3RhdGUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc3RhdGUgaWQgJFN0YXRlSUQgaXMgbm90IHZhbGlkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0NoZWNrQ2hhbmdlQ0lQSURzKCkKCkNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBnaXZlbiBpZHMgb2YgY2F0ZWdvcnksIGltcGFjdCBvciBwcmlvcml0eSBhcmUgdmFsaWQuCgogICAgbXkgJE9rID0gJENoYW5nZU9iamVjdC0+X0NoZWNrQ2hhbmdlQ0lQSURzKAogICAgICAgIElEcyAgPT4gWyAyNSwgMjYgXSwgIyBtYW5kYXRvcnkKICAgICAgICBUeXBlID0+ICdQcmlvcml0eScsICMgbWFuZGF0b3J5IChDYXRlZ29yeXxJbXBhY3R8UHJpb3JpdHkpCiAgICApOwoKPWN1dAoKc3ViIF9DaGVja0NoYW5nZUNJUElEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSURzIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBJRHMgaXMgYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17SURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIElEcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgVHlwZSBwYXJhbSBmb3IgdmFsaWQgdmFsdWVzCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtUeXBlfQogICAgICAgIHx8ICggJFBhcmFte1R5cGV9IG5lICdDYXRlZ29yeScgJiYgJFBhcmFte1R5cGV9IG5lICdJbXBhY3QnICYmICRQYXJhbXtUeXBlfSBuZSAnUHJpb3JpdHknICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gVHlwZSBtdXN0IGJlIGVpdGhlciAiQ2F0ZWdvcnkiIG9yICJJbXBhY3QiIG9yICJQcmlvcml0eSIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIElEcyBiZWxvbmdzIHRvIGNvcnJlY3QgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBmb3IgbXkgJElEICggQHsgJFBhcmFte0lEc30gfSApIHsKICAgICAgICBteSAkQ0lQID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgSUQgICA9PiAkSUQsCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRDSVAgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgJFBhcmFte1R5cGV9IGlkICRJRCBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfQ2hlY2tDaGFuZ2VQYXJhbXMoKQoKQ2hlY2tzIHRoZSBwYXJhbXMgdG8gQ2hhbmdlQWRkKCkgYW5kIENoYW5nZVVwZGF0ZSgpLgpUaGVyZSBhcmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycy4KCiAgICBteSAkT2sgPSAkQ2hhbmdlT2JqZWN0LT5fQ2hlY2tDaGFuZ2VQYXJhbXMoCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgPT4gJ1JlcGxhY2VtZW50IG9mIG1haWwgc2VydmVyJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ05ldyBtYWlsIHNlcnZlciA8Yj5pczwvYj4gZmFzdGVyJywgIyAob3B0aW9uYWwpCiAgICAgICAgRGVzY3JpcHRpb25QbGFpbiAgICAgPT4gJ05ldyBtYWlsIHNlcnZlciBpcyBmYXN0ZXInLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgICAgPT4gJ09sZCBtYWlsIHNlcnZlcjxiPnRvbzwvYj4gc2xvdycsICAgIyAob3B0aW9uYWwpCiAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluICAgPT4gJ09sZCBtYWlsIHNlcnZlciB0b28gc2xvdycsICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICAgICAgPT4gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEICAgICAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgICAgPT4gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgICAgICAgPT4gNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW1wYWN0SUQgICAgICAgICAgICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgICAgPT4gOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVxdWVzdGVkVGltZSAgICAgICAgPT4gJzIwMDktMTAtMjMgMDg6NTc6MTInLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ0FCQWdlbnRzICAgICAgICAgICAgPT4gWyAxLCAyLCA0IF0sICAgICAjIFVzZXJJRHMgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ0FCQ3VzdG9tZXJzICAgICAgICAgPT4gWyAndHQnLCAnbW0nIF0sICAjIEN1c3RvbWVyVXNlcklEcyAgIyAob3B0aW9uYWwpCiAgICAgICAgRHluYW1pY0ZpZWxkX1ggICAgICAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRHluYW1pY0ZpZWxkX1kgICAgICAgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKVGhlIENoYW5nZVN0YXRlSUQgaXMgY2hlY2tlZCBmb3IgZXhpc3RlbmNlIGluIHRoZSBnZW5lcmFsIGNhdGFsb2cuClRoZXNlIHN0cmluZyBwYXJhbWV0ZXJzIGhhdmUgbGVuZ3RoIGNvbnN0cmFpbnRzOgoKICAgIFBhcmFtZXRlciAgICAgICAgICAgfCBtYXguIGxlbmd0aAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoYW5nZVRpdGxlICAgICAgICAgfCAgMjUwIGNoYXJhY3RlcnMKICAgIERlc2NyaXB0aW9uICAgICAgICAgfCAxODAwMDAwIGNoYXJhY3RlcnMKICAgIERlc2NyaXB0aW9uUGxhaW4gICAgfCAxODAwMDAwIGNoYXJhY3RlcnMKICAgIEp1c3RpZmljYXRpb24gICAgICAgfCAxODAwMDAwIGNoYXJhY3RlcnMKICAgIEp1c3RpZmljYXRpb25QbGFpbiAgfCAxODAwMDAwIGNoYXJhY3RlcnMKICAgIER5bmFtaWNGaWVsZF9YICAgICAgfCAzODAwIGNoYXJhY3RlcnMKICAgIER5bmFtaWNGaWVsZF9ZICAgICAgfCAzODAwIGNoYXJhY3RlcnMKCj1jdXQKCnN1YiBfQ2hlY2tDaGFuZ2VQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHRoZSBzdHJpbmcgYW5kIGlkIHBhcmFtZXRlcnMKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoCiAgICAgICAgcXcoCiAgICAgICAgQ2hhbmdlVGl0bGUKICAgICAgICBEZXNjcmlwdGlvbgogICAgICAgIERlc2NyaXB0aW9uUGxhaW4KICAgICAgICBKdXN0aWZpY2F0aW9uCiAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluCiAgICAgICAgQ2hhbmdlTWFuYWdlcklECiAgICAgICAgQ2hhbmdlQnVpbGRlcklECiAgICAgICAgQ2hhbmdlU3RhdGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgcGFyYW1zIGFyZSBub3QgcmVxdWlyZWQKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICMgY2hlY2sgaWYgcGFyYW0gaXMgbm90IGRlZmluZWQKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0IGJlIGRlZmluZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgYSByZWZlcmVuY2UKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFyZ3VtZW50fSBuZSAnJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJyRBcmd1bWVudCcgbXVzdG4ndCBiZSBhIHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aXRsZQogICAgICAgIGlmICggJEFyZ3VtZW50IGVxICdDaGFuZ2VUaXRsZScgJiYgbGVuZ3RoKCAkUGFyYW17JEFyZ3VtZW50fSApID4gMjUwICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTAgY2hhcmFjdGVycyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBkZXNjcmlwdGlvbiBhbmQganVzdGlmaWNhdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgJEFyZ3VtZW50IGVxICdEZXNjcmlwdGlvbicKICAgICAgICAgICAgfHwgJEFyZ3VtZW50IGVxICdEZXNjcmlwdGlvblBsYWluJwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ0p1c3RpZmljYXRpb24nCiAgICAgICAgICAgIHx8ICRBcmd1bWVudCBlcSAnSnVzdGlmaWNhdGlvblBsYWluJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGxlbmd0aCggJFBhcmFteyRBcmd1bWVudH0gKSA+IDE4MDAwMDAgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDE4MDAwMDAgY2hhcmFjdGVycyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjaGFuZ2UgZHluYW1pYyBmaWVsZHMKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKCiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSAhfiBteyBcQSBEeW5hbWljRmllbGRfKC4qKSBceiB9eG1zOwoKICAgICAgICAjIHBhcmFtcyBhcmUgbm90IHJlcXVpcmVkCiAgICAgICAgbmV4dCBLRVkgaWYgIWV4aXN0cyAkUGFyYW17JEtleX07CgogICAgICAgICMgY2hlY2sgaWYgcGFyYW0gaXMgbm90IGRlZmluZWQKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJyRLZXknIG11c3QgYmUgZGVmaW5lZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggbGVuZ3RoKCAkUGFyYW17JEtleX0gKSA+IDM4MDAgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckS2V5JyBtdXN0IGJlIHNob3J0ZXIgdGhhbiAzODAwIGNoYXJhY3RlcnMhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlcXVlc3RlZF90aW1lIGhhcyBjb3JyZWN0IGZvcm1hdAogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte1JlcXVlc3RlZFRpbWV9CiAgICAgICAgJiYgJFBhcmFte1JlcXVlc3RlZFRpbWV9ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBmb3JtYXQgZm9yIFJlcXVlc3RlZFRpbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGdpdmVuIENoYW5nZVN0YXRlSUQgaXMgdmFsaWQKICAgIGlmICggJFBhcmFte0NoYW5nZVN0YXRlSUR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVN0YXRlSURzKAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEcyA9PiBbICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBnaXZlbiBjYXRlZ29yeSwgaW1wYWN0IG9yIHByaW9yaXR5IElEIGlzIHZhbGlkCiAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFteyIke1R5cGV9SUQifSApIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrQ2hhbmdlQ0lQSURzKAogICAgICAgICAgICAgICAgSURzICA9PiBbICRQYXJhbXsiJHtUeXBlfUlEIn0gXSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFteyRUeXBlfSApIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgQ0lQICA9PiAkUGFyYW17JFR5cGV9LAogICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGFuZ2UgbWFuYWdlciBhbmQgY2hhbmdlIGJ1aWxkZXIgbXVzdCBiZSBhZ2VudHMKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlTWFuYWdlcklEIENoYW5nZUJ1aWxkZXJJRCkpIHsKCiAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgJEFyZ3VtZW50ICRQYXJhbXskQXJndW1lbnR9IGlzIG5vdCBhIHZhbGlkIHVzZXIgaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIENBQiBhZ2VudHMgbXVzdCBiZSBhZ2VudHMKICAgIGlmICggZXhpc3RzICRQYXJhbXtDQUJBZ2VudHN9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtDQUJBZ2VudHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW1ldGVyIENBQkFnZW50cyBpcyBub3QgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdXNlcnMKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRQYXJhbXtDQUJBZ2VudHN9IH0gKSB7CgogICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ0FCQWdlbnQgJFVzZXJJRCBpcyBub3QgYSB2YWxpZCB1c2VyIGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgQ0FCIGN1c3RvbWVycyBtdXN0IGJlIGN1c3RvbWVycwogICAgaWYgKCBleGlzdHMgJFBhcmFte0NBQkN1c3RvbWVyc30gKSB7CiAgICAgICAgaWYgKCByZWYgJFBhcmFte0NBQkN1c3RvbWVyc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbWV0ZXIgQ0FCQ3VzdG9tZXJzIGlzIG5vdCBhbiBBUlJBWSByZWZlcmVuY2UhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHZhbGlkIGlkIGZvciAidmFsaWQiCiAgICAgICAgbXkgJFZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBjdXN0b21lciB1c2VycwogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyICggQHsgJFBhcmFte0NBQkN1c3RvbWVyc30gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgZGF0YQogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtWYWxpZElEfSBuZSAkVmFsaWRJRCApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBDQUJDdXN0b21lciAkQ3VzdG9tZXJVc2VyIGlzIG5vdCBhIHZhbGlkIGN1c3RvbWVyISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL0V2ZW50L1VwZGF0ZUlUU01DaGFuZ2VDb25kaXRpb25zLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFVwZGF0ZUlUU01DaGFuZ2VDb25kaXRpb25zLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkV2ZW50OjpVcGRhdGVJVFNNQ2hhbmdlQ29uZGl0aW9uczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhEYXRhIEV2ZW50IENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5IGZvciBkeW5hbWljIGZpZWxkcyBvZiB0aGUgdHlwZSBJVFNNQ2hhbmdlIG9yIElUU01Xb3JrT3JkZXIKICAgIHJldHVybiBpZiAhJFBhcmFte0RhdGF9LT57TmV3RGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e05ld0RhdGF9LT57T2JqZWN0VHlwZX07CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57TmV3RGF0YX0tPntPYmplY3RUeXBlfSBuZSAnSVRTTUNoYW5nZScKICAgICAgICAmJiAkUGFyYW17RGF0YX0tPntOZXdEYXRhfS0+e09iamVjdFR5cGV9IG5lICdJVFNNV29ya09yZGVyJwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkeW5hbWljIGZpZWxkIGhhcyBiZWVuIGFkZGVkCiAgICBpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0R5bmFtaWNGaWVsZEFkZCcgKSB7CgogICAgICAgICMgYWRkIG5ldyBhdHRyaWJ1dGUgdG8gY29uZGl0aW9uIGF0dHJpYnV0ZSB0YWJsZQogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+QXR0cmlidXRlQWRkKAogICAgICAgICAgICBOYW1lICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0RhdGF9LT57TmV3RGF0YX0tPntOYW1lfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWRkIGF0dHJpYnV0ZSAnJFBhcmFte0RhdGF9LT57TmV3RGF0YX0tPntOYW1lfScgdG8gY29uZGl0aW9uIGF0dHJpYnV0ZSB0YWJsZSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFzIGJlZW4gdXBkYXRlZAogICAgZWxzaWYgKCAkUGFyYW17RXZlbnR9IGVxICdEeW5hbWljRmllbGRVcGRhdGUnICkgewoKICAgICAgICAjIGxvb2t1cCB0aGUgSUQgb2YgdGhlIG9sZCBhdHRyaWJ1dGUKICAgICAgICBteSAkQXR0cmlidXRlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0RhdGF9LT57T2xkRGF0YX0tPntOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSB0aGUgYXR0cmlidXRlIG5hbWUKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkF0dHJpYnV0ZVVwZGF0ZSgKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJEF0dHJpYnV0ZUlELAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkUGFyYW17RGF0YX0tPntOZXdEYXRhfS0+e05hbWV9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgdXBkYXRlIGF0dHJpYnV0ZSBuYW1lIGZyb20gJyRQYXJhbXtEYXRhfS0+e09sZERhdGF9LT57TmFtZX0nIHRvICckUGFyYW17RGF0YX0tPntOZXdEYXRhfS0+e05hbWV9JyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFzIGJlZW4gZGVsZXRlZAogICAgZWxzaWYgKCAkUGFyYW17RXZlbnR9IGVxICdEeW5hbWljRmllbGREZWxldGUnICkgewoKICAgICAgICAjIGdldCBhbGwgY29uZGl0aW9uIGF0dHJpYnV0ZXMKICAgICAgICBteSAkQ29uZGl0aW9uQXR0cmlidXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkF0dHJpYnV0ZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBsb29rdXAgYXR0cmlidXRlIG5hbWVzCiAgICAgICAgbXkgJUF0dHJpYnV0ZTJJRCA9IHJldmVyc2UgJXskQ29uZGl0aW9uQXR0cmlidXRlc307CgogICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBpZAogICAgICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRBdHRyaWJ1dGUySUR7ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtEYXRhfS0+e05ld0RhdGF9LT57TmFtZX0gfSB8fCAnJzsKCiAgICAgICAgIyBkbyBub3RoaW5nIGlmIG5vIGF0dHJpYnV0ZSB3aXRoIHRoaXMgbmFtZSBleHNpc3RzCiAgICAgICAgcmV0dXJuIGlmICEkQXR0cmlidXRlSUQ7CgogICAgICAgICMgZGVsZXRlIHRoaXMgYXR0cmlidXRlIGZyb20gZXhwcmVzc2lvbiB0YWJsZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIFdIRVJFIGF0dHJpYnV0ZV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkQXR0cmlidXRlSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhpcyBhdHRyaWJ1dGUgZnJvbSBhY3Rpb24gdGFibGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2FjdGlvbgogICAgICAgICAgICAgICAgICAgIFdIRVJFIGF0dHJpYnV0ZV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkQXR0cmlidXRlSUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhpcyBhdHRyaWJ1dGUgZnJvbSBhdHRyaWJ1dGUgdGFibGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2F0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRBdHRyaWJ1dGVJRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL09iamVjdFR5cGUvSVRTTUNoYW5nZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6Ok9iamVjdFR5cGU6OklUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgU2NhbGFyOjpVdGlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6T2JqZWN0VHlwZTo6SVRTTUNoYW5nZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpJVFNNQ2hhbmdlIG9iamVjdCBoYW5kbGVyIGZvciBEeW5hbWljRmllbGRzCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpVc3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpPYmplY3RUeXBlOjpJVFNNQ2hhbmdlLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUG9zdFZhbHVlU2V0KCkKClBlcmZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zIGFmdGVyIHRoZSBWYWx1ZSBzZXQgZm9yIHRoaXMgb2JqZWN0IHR5cGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkSVRTTUNoYW5nZUhhbmRsZXJPYmplY3QtPlBvc3RWYWx1ZVNldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBvZiB0aGUgRHluYW1pY0ZpZWxkCiAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwgICAgICAgICAgICAgICAgIyBJRCBvZiB0aGUgY3VycmVudCBvYmplY3QgdGhhdCB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgbGlua2VkIHRvLCBlLiBnLiBJVFNNQ2hhbmdlSUQKICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLCAgICAgICAgICAgICAgICAgICAjIFZhbHVlIHRvIHN0b3JlLCBkZXBlbmRzIG9uIGJhY2tlbmQgdHlwZQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFBvc3RWYWx1ZVNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRHluYW1pY0ZpZWxkQ29uZmlnIE9iamVjdElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIER5bmFtaWNGaWVsZENvbmZpZyAoZ2VuZXJhbCkKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIGZpZWxkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBEeW5hbWljRmllbGRDb25maWcgKGludGVybmFsbHkpCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgRmllbGRUeXBlIE9iamVjdFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCBpbiBEeW5hbWljRmllbGRDb25maWchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vdGhpbmcgdG8gZG8KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE9iamVjdERhdGFHZXQoKQoKcmV0cmlldmVzIHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KCiAgICBteSAlT2JqZWN0RGF0YSA9ICREeW5hbWljRmllbGRJVFNNQ2hhbmdlSGFuZGxlck9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBvZiB0aGUgRHluYW1pY0ZpZWxkCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICk7CgpyZXR1cm5zOgoKICAgICVPYmplY3REYXRhID0gKAogICAgICAgIE9iamVjdElEID0+IDEyMywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAnMjAxMDEwMjcwMDAwMDEnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ3NvbWUgdGl0bGUnLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gMTIzLAogICAgICAgICAgICAjIC4uLgogICAgICAgIH0KICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQ2hlY2sgbmVlZGVkIHN0dWZmLgogICAgZm9yIG15ICROZWVkZWQgKHF3KER5bmFtaWNGaWVsZENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayBEeW5hbWljRmllbGRDb25maWcgKGdlbmVyYWwpLgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgZmllbGQgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIER5bmFtaWNGaWVsZENvbmZpZyAoaW50ZXJuYWxseSkuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgRmllbGRUeXBlIE9iamVjdFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCBpbiBEeW5hbWljRmllbGRDb25maWchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2hhbmdlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdDaGFuZ2VJRCcsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENoYW5nZUlEOwoKICAgIG15ICVDaGFuZ2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICgKICAgICAgICBPYmplY3RJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgRGF0YSAgICAgPT4gXCVDaGFuZ2VEYXRhLAogICAgKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRHluYW1pY0ZpZWxkL09iamVjdFR5cGUvSVRTTVdvcmtPcmRlci5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNV29ya09yZGVyLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6Ok9iamVjdFR5cGU6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgU2NhbGFyOjpVdGlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6T2JqZWN0VHlwZTo6SVRTTVdvcmtPcmRlcgoKPWhlYWQxIERFU0NSSVBUSU9OCgpJVFNNV29ya09yZGVyIG9iamVjdCBoYW5kbGVyIGZvciBEeW5hbWljRmllbGRzCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpVc3VhbGx5LCB5b3Ugd2FudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcwpieSB1c2luZyBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpPYmplY3RUeXBlOjpJVFNNV29ya09yZGVyLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUG9zdFZhbHVlU2V0KCkKClBlcmZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zIGFmdGVyIHRoZSBWYWx1ZSBzZXQgZm9yIHRoaXMgb2JqZWN0IHR5cGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkSVRTTVdvcmtPcmRlckhhbmRsZXJPYmplY3QtPlBvc3RWYWx1ZVNldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBvZiB0aGUgRHluYW1pY0ZpZWxkCiAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwgICAgICAgICAgICAgICAgIyBJRCBvZiB0aGUgY3VycmVudCBvYmplY3QgdGhhdCB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgbGlua2VkIHRvLCBlLiBnLiBJVFNNV29ya09yZGVySUQKICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLCAgICAgICAgICAgICAgICAgICAjIFZhbHVlIHRvIHN0b3JlLCBkZXBlbmRzIG9uIGJhY2tlbmQgdHlwZQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFBvc3RWYWx1ZVNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRHluYW1pY0ZpZWxkQ29uZmlnIE9iamVjdElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIER5bmFtaWNGaWVsZENvbmZpZyAoZ2VuZXJhbCkKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RHluYW1pY0ZpZWxkQ29uZmlnfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIGZpZWxkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBEeW5hbWljRmllbGRDb25maWcgKGludGVybmFsbHkpCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgRmllbGRUeXBlIE9iamVjdFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCBpbiBEeW5hbWljRmllbGRDb25maWchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vdGhpbmcgdG8gZG8KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE9iamVjdERhdGFHZXQoKQoKcmV0cmlldmVzIHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KCiAgICBteSAlT2JqZWN0RGF0YSA9ICREeW5hbWljRmllbGRJVFNNV29ya09yZGVySGFuZGxlck9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywgICAgICAjIGNvbXBsZXRlIGNvbmZpZyBvZiB0aGUgRHluYW1pY0ZpZWxkCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICk7CgpyZXR1cm5zOgoKICAgICVPYmplY3REYXRhID0gKAogICAgICAgIE9iamVjdElEID0+IDEyMywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlck51bWJlciA9PiAnMjAxMDEwMjcwMDAwMDEnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ3NvbWUgdGl0bGUnLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgPT4gMTIzLAogICAgICAgICAgICAjIC4uLgogICAgICAgIH0KICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQ2hlY2sgbmVlZGVkIHN0dWZmLgogICAgZm9yIG15ICROZWVkZWQgKHF3KER5bmFtaWNGaWVsZENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayBEeW5hbWljRmllbGRDb25maWcgKGdlbmVyYWwpLgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEeW5hbWljRmllbGRDb25maWd9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgZmllbGQgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIER5bmFtaWNGaWVsZENvbmZpZyAoaW50ZXJuYWxseSkuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgRmllbGRUeXBlIE9iamVjdFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0R5bmFtaWNGaWVsZENvbmZpZ30tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCBpbiBEeW5hbWljRmllbGRDb25maWchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkV29ya09yZGVySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcsCiAgICApOwoKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcklEOwoKICAgIG15ICVXb3JrT3JkZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICgKICAgICAgICBPYmplY3RJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgRGF0YSAgICAgPT4gXCVXb3JrT3JkZXJEYXRhLAogICAgKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZUNJUEFsbG9jYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUgLSBjYXRlZ29yeSwgaW1wYWN0IGFuZCBwcmlvcml0eSBhbGxvY2F0aW9uIGxpYgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQWxsb2NhdGVMaXN0KCkKClJldHVybiBhIEM8MmQ+IGhhc2ggcmVmZXJlbmNlIG9mIGFsbG9jYXRpb25zLgoKICAgIG15ICRMaXN0UmVmID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKQzwkTGlzdFJlZj4gaXMgc29tZXRoaW5nIGxpa2U6CgogICAgJExpc3RSZXQgPSB7CiAgICAgICAgJzYnID0+IHsKICAgICAgICAgICAgJzQnID0+IDIsCiAgICAgICAgICAgICcxJyA9PiAxLAogICAgICAgICAgICAnMycgPT4gMiwKICAgICAgICB9LAogICAgICAgICc4JyA9PiB7CiAgICAgICAgICAgICc0JyA9PiA0LAogICAgICAgICAgICAnMScgPT4gMiwKICAgICAgICAgICAgJzMnID0+IDMsCiAgICAgICAgfSwKICAgIH07CgptZWFuaW5nIHRoYXQgdGhlIENyaXRpY2FsaXR5SUQgJzYnIGFuZCB0aGUgSW5jaWRlbnRJRCAnNCcgc3VnZ2VzdCB0aGUgUHJpb3JpdHlJRCAnMicuCgo9Y3V0CgpzdWIgQWxsb2NhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCBGUk9NIGNoYW5nZV9jaXBfYWxsb2NhdGUnLAogICAgKTsKCiAgICAjIHJlc3VsdCBsaXN0CiAgICBteSAlQWxsb2NhdGVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxsb2NhdGVEYXRheyAkUm93WzFdIH17ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgcmV0dXJuIFwlQWxsb2NhdGVEYXRhOwp9Cgo9aGVhZDIgQWxsb2NhdGVVcGRhdGUoKQoKVXBkYXRlIHRoZSBhbGxvY2F0aW9uIG9mIGNhdGVnb3J5LCBpbXBhY3QgYW5kIHByaW9yaXR5LgoKICAgIG15ICRUcnVlID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJERhdGFSZWYsICAjIDJEIGhhc2ggcmVmZXJlbmNlCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFsbG9jYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEFsbG9jYXRlRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWxsb2NhdGUgZGF0YSBpcyBhIGhhc2ggcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17QWxsb2NhdGVEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBbGxvY2F0ZURhdGEgbXVzdCBiZSBhIDJEIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBhbGxvY2F0ZSBkYXRhIGlzIGEgMkQgaGFzaCByZWZlcmVuY2UKICAgIElNUEFDVElEOgogICAgZm9yIG15ICRJbXBhY3RJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17QWxsb2NhdGVEYXRhfSB9ICkgewoKICAgICAgICBuZXh0IElNUEFDVElEIGlmIHJlZiAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0gZXEgJ0hBU0gnOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FsbG9jYXRlRGF0YSBtdXN0IGJlIGEgMkQgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBvbGQgYWxsb2NhdGlvbnMKICAgIHJldHVybgogICAgICAgIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oIFNRTCA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NpcF9hbGxvY2F0ZScgKTsKCiAgICAjIGluc2VydCBuZXcgYWxsb2NhdGlvbnMKICAgIGZvciBteSAkSW1wYWN0SUQgKCBzb3J0IGtleXMgJXsgJFBhcmFte0FsbG9jYXRlRGF0YX0gfSApIHsKCiAgICAgICAgZm9yIG15ICRDYXRlZ29yeUlEICggc29ydCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdElEfSB9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHByaW9yaXR5CiAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJFBhcmFte0FsbG9jYXRlRGF0YX0tPnskSW1wYWN0SUR9LT57JENhdGVnb3J5SUR9OwoKICAgICAgICAgICAgIyBpbnNlcnQgbmV3IGFsbG9jYXRpb24KICAgICAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9jaXBfYWxsb2NhdGUgJwogICAgICAgICAgICAgICAgICAgIC4gJyhjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCwgJwogICAgICAgICAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgICAgICAgICAgLiAnKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgXCRDYXRlZ29yeUlELCBcJEltcGFjdElELCBcJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFByaW9yaXR5QWxsb2NhdGlvbkdldCgpCgpSZXR1cm4gdGhlIHByaW9yaXR5IGlkIGZvciBnaXZlbiBjYXRlZ29yeSBhbmQgaW1wYWN0LgoKICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAzMjEsCiAgICAgICAgSW1wYWN0SUQgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFByaW9yaXR5QWxsb2NhdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDYXRlZ29yeUlEIEltcGFjdElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eSBpZCBmcm9tIGRiCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHByaW9yaXR5X2lkIEZST00gY2hhbmdlX2NpcF9hbGxvY2F0ZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNhdGVnb3J5X2lkID0gPyBBTkQgaW1wYWN0X2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NhdGVnb3J5SUR9LCBcJFBhcmFte0ltcGFjdElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggcmVzdWx0CiAgICBteSAkUHJpb3JpdHlJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFByaW9yaXR5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUHJpb3JpdHlJRDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Db25kaXRpb24ucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QXR0cmlidXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkV4cHJlc3Npb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOwoKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTVdvcmtPcmRlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24gLSBjb25kaXRpb24gbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBmdW5jdGlvbnMgZm9yIGNvbmRpdGlvbnMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZ2V0IHRoZSBjYWNoZSB0eXBlIGFuZCBUVEwgKGluIHNlY29uZHMpCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpDYWNoZVRUTCcpICogNjA7CgogICAgIyBnZXQgdGhlIGRhdGFiYXNlIHR5cGUKICAgICRTZWxmLT57REJUeXBlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT57J0RCOjpUeXBlJ30gfHwgJyc7CiAgICAkU2VsZi0+e0RCVHlwZX0gPSBsYyAkU2VsZi0+e0RCVHlwZX07CgogICAgQElTQSA9IHF3KAogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0CiAgICAgICAgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkF0dHJpYnV0ZQogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvcgogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uCiAgICAgICAgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkFjdGlvbgogICAgKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdJVFNNQ29uZGl0aW9uOjpFdmVudE1vZHVsZScsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvbmRpdGlvbkFkZCgpCgpBZGQgYSBuZXcgY29uZGl0aW9uLgoKICAgIG15ICRDb25kaXRpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkFkZCgKICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnVGhlIGNvbmRpdGlvbiBuYW1lJywKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FueScsICAgICAgICAgICAgICAgICAjIChhbnl8YWxsKQogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAnQSBjb21tZW50JywgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25kaXRpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgTmFtZSBFeHByZXNzaW9uQ29uanVuY3Rpb24gVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYSBjb25kaXRpb24gd2l0aCB0aGlzIG5hbWUgYW5kIGNoYW5nZSBpZCBleGlzdCBhbHJlYWR5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX2NvbmRpdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb25kaXRpb25JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmRpdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGEgY29uZGl0aW9uIHdpdGggdGhpcyBuYW1lIGFuZCBjaGFuZ2UgaWQgZXhpc3RzIGFscmVhZHkKICAgIGlmICgkQ29uZGl0aW9uSUQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgY29uZGl0aW9uIHdpdGggdGhlIG5hbWUgJFBhcmFte05hbWV9ICIKICAgICAgICAgICAgICAgIC4gImV4aXN0cyBhbHJlYWR5IGZvciBDaGFuZ2VJRCAkUGFyYW17Q2hhbmdlSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIENvbmRpdGlvbkFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uQWRkUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgbmV3IGNvbmRpdGlvbiB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfY29uZGl0aW9uICcKICAgICAgICAgICAgLiAnKGNoYW5nZV9pZCwgbmFtZSwgZXhwcmVzc2lvbl9jb25qdW5jdGlvbiwgY29tbWVudHMsIHZhbGlkX2lkLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfY29uZGl0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NoYW5nZUlEfSwgXCRQYXJhbXtOYW1lfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZGl0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgaWYgY29uZGl0aW9uIGNvdWxkIGJlIGFkZGVkCiAgICBpZiAoICEkQ29uZGl0aW9uSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb25kaXRpb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdDb25kaXRpb25MaXN0OjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0gLiAnOjpWYWxpZDo6MCcsCiAgICAgICAgJ0NvbmRpdGlvbkxpc3Q6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSAuICc6OlZhbGlkOjoxJywKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDb25kaXRpb25BZGRQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25BZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJENvbmRpdGlvbklEOwp9Cgo9aGVhZDIgQ29uZGl0aW9uVXBkYXRlKCkKClVwZGF0ZSBhIGNvbmRpdGlvbi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvblVwZGF0ZSgKICAgICAgICBDb25kaXRpb25JRCAgICAgICAgICAgPT4gMTIzNCwKICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1RoZSBjb25kaXRpb24gbmFtZScsICAjIChvcHRpb25hbCkKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FueScsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgKGFueXxhbGwpCiAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgID0+ICdBIGNvbW1lbnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvblVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1cnJlbnQgY29uZGl0aW9uIGRhdGEgZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uRGF0YTsKCiAgICAjIHRyaWdnZXIgQ29uZGl0aW9uVXBkYXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25VcGRhdGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIG1hcCB1cGRhdGUgYXR0cmlidXRlcyB0byBjb2x1bW4gbmFtZXMKICAgIG15ICVBdHRyaWJ1dGUgPSAoCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICduYW1lJywKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2V4cHJlc3Npb25fY29uanVuY3Rpb24nLAogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAnY29tbWVudHMnLAogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAndmFsaWRfaWQnLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgY29uZGl0aW9uCiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfY29uZGl0aW9uIFNFVCAnOwogICAgbXkgQEJpbmQ7CgogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJUF0dHJpYnV0ZSApIHsKCiAgICAgICAgIyBwcmVzZXJ2ZSB0aGUgb2xkIHZhbHVlLCB3aGVuIHRoZSBjb2x1bW4gaXNuJ3QgaW4gZnVuY3Rpb24gcGFyYW1ldGVycwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFleGlzdHMgJFBhcmFteyRBdHRyaWJ1dGV9OwoKICAgICAgICAjIHBhcmFtIGNoZWNraW5nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc28gdGhpcyBpcyBzYWZlCiAgICAgICAgJFNRTCAuPSAiJEF0dHJpYnV0ZXskQXR0cmlidXRlfSA9ID8sICI7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIGFkZCBjaGFuZ2UgdGltZSBhbmQgY2hhbmdlIHVzZXIKICAgICRTUUwgLj0gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKCiAgICAjIHNldCBtYXRjaGluZyBvZiBTUUwgc3RhdGVtZW50CiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8nOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDb25kaXRpb25JRH07CgogICAgIyB1cGRhdGUgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ0NvbmRpdGlvbkxpc3Q6OkNoYW5nZUlEOjonIC4gJENvbmRpdGlvbkRhdGEtPntDaGFuZ2VJRH0gLiAnOjpWYWxpZDo6MCcsCiAgICAgICAgJ0NvbmRpdGlvbkxpc3Q6OkNoYW5nZUlEOjonIC4gJENvbmRpdGlvbkRhdGEtPntDaGFuZ2VJRH0gLiAnOjpWYWxpZDo6MScsCiAgICAgICAgJ0NvbmRpdGlvbkdldDo6Q29uZGl0aW9uSUQ6OicgLiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIENvbmRpdGlvblVwZGF0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmRpdGlvblVwZGF0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBPbGRDb25kaXRpb25EYXRhID0+ICRDb25kaXRpb25EYXRhLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvbmRpdGlvbkxvb2t1cCgpCgpSZXR1cm4gdGhlIGNvbmRpdGlvbiBpZCB3aGVuIHRoZSBjb25kaXRpb24gbmFtZSBpcyBwYXNzZWQuClJldHVybiB0aGUgY29uZGl0aW9uIG5hbWUgd2hlbiB0aGUgY29uZGl0aW9uIGlkIGlzIHBhc3NlZC4KV2hlbiBubyBjb25kaXRpb24gaWQgb3IgY29uZGl0aW9uIG5hbWUgaXMgZm91bmQsIHRoZW4gdGhlIHVuZGVmaW5lZCB2YWx1ZSBpcyByZXR1cm5lZC4KVGhlIENoYW5nZUlEIGlzIGFsd2F5cyByZXF1aXJlZCBhcyBjb25kaXRpb24gbmFtZXMgYXJlIG9ubHkgdW5pcXVlIHdpdGhpbiB0aGUgc2FtZSBjaGFuZ2UuCgogICAgbXkgJENvbmRpdGlvbklEID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTG9va3VwKAogICAgICAgIE5hbWUgICAgID0+ICdBQkMnLAogICAgICAgIENoYW5nZUlEID0+IDIsCiAgICApOwoKICAgIG15ICROYW1lID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTG9va3VwKAogICAgICAgIENvbmRpdGlvbklEID0+IDQyLAogICAgICAgIENoYW5nZUlEICAgID0+IDIsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbkxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGhlIGNoYW5nZSBpZCBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdGhlIENoYW5nZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0aGUgY29uZGl0aW9uIGlkIG9yIHRoZSBjb25kaXRpb24gbmFtZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte0NvbmRpdGlvbklEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB0aGUgQ29uZGl0aW9uSUQgb3IgdGhlIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9ubHkgb25lIG9mIGNvbmRpdGlvbiBpZCBhbmQgY29uZGl0aW9uIG5hbWUgY2FuIGJlIHBhc3NlZAogICAgaWYgKCAkUGFyYW17Q29uZGl0aW9uSUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIHRoZSBDb25kaXRpb25JRCBvciB0aGUgTmFtZSwgbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIENvbmRpdGlvbklEIGlzIGEgbnVtYmVyCiAgICBpZiAoICRQYXJhbXtDb25kaXRpb25JRH0gJiYgJFBhcmFte0NvbmRpdGlvbklEfSAhfiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbklEIG11c3QgYmUgYSBudW1iZXIhIChDb25kaXRpb25JRDogJFBhcmFte0NvbmRpdGlvbklEfSkiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBpZAogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgIG15ICRDb25kaXRpb25JRDsKCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFNFTEVDVCBpZAogICAgICAgICAgICAgICAgRlJPTSBjaGFuZ2VfY29uZGl0aW9uCiAgICAgICAgICAgICAgICBXSEVSRSBjaGFuZ2VfaWQgPSA/CiAgICAgICAgICAgICAgICBBTkQgbmFtZSA9ID8KICAgICAgICAgICAgJywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJENvbmRpdGlvbklEID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkQ29uZGl0aW9uSUQ7CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIG5hbWUKICAgIGVsc2lmICggJFBhcmFte0NvbmRpdGlvbklEfSApIHsKCiAgICAgICAgbXkgJE5hbWU7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgbmFtZQogICAgICAgICAgICAgICAgRlJPTSBjaGFuZ2VfY29uZGl0aW9uCiAgICAgICAgICAgICAgICBXSEVSRSBjaGFuZ2VfaWQgPSA/CiAgICAgICAgICAgICAgICBBTkQgaWQgPSA/CiAgICAgICAgICAgICcsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBcJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE5hbWU7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ29uZGl0aW9uR2V0KCkKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgY29uZGl0aW9uIGRhdGEgZm9yIGEgZ2l2ZW4gQ29uZGl0aW9uSUQuCgogICAgbXkgJENvbmRpdGlvbkRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0KICAgICRDb25kaXRpb25EYXRhe0NoYW5nZUlEfQogICAgJENvbmRpdGlvbkRhdGF7TmFtZX0KICAgICRDb25kaXRpb25EYXRhe0V4cHJlc3Npb25Db25qdW5jdGlvbn0KICAgICRDb25kaXRpb25EYXRhe0NvbW1lbnR9CiAgICAkQ29uZGl0aW9uRGF0YXtWYWxpZElEfQogICAgJENvbmRpdGlvbkRhdGF7Q3JlYXRlVGltZX0KICAgICRDb25kaXRpb25EYXRhe0NyZWF0ZUJ5fQogICAgJENvbmRpdGlvbkRhdGF7Q2hhbmdlVGltZX0KICAgICRDb25kaXRpb25EYXRhe0NoYW5nZUJ5fQoKPWN1dAoKc3ViIENvbmRpdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdDb25kaXRpb25HZXQ6OkNvbmRpdGlvbklEOjonIC4gJFBhcmFte0NvbmRpdGlvbklEfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNoYW5nZV9pZCwgbmFtZSwgZXhwcmVzc2lvbl9jb25qdW5jdGlvbiwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAndmFsaWRfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9jb25kaXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25kaXRpb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVDb25kaXRpb25EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0gICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VJRH0gICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtOYW1lfSAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtFeHByZXNzaW9uQ29uanVuY3Rpb259ID0gJFJvd1szXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDb21tZW50fSAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtWYWxpZElEfSAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDcmVhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDcmVhdGVCeX0gICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VUaW1lfSAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VCeX0gICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElQ29uZGl0aW9uRGF0YSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbklEICRQYXJhbXtDb25kaXRpb25JRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNsZWFudXAgdGltZSBzdGFtcHMgKHNvbWUgZGF0YWJhc2VzIGFyZSB1c2luZyBlLiBnLiAyMDA4LTAyLTI1IDIyOjAzOjAwLjAwMDAwMCkKICAgIFRJTUVGSUVMRDoKICAgIGZvciBteSAkVGltZWZpZWxkICggJ0NyZWF0ZVRpbWUnLCAnQ2hhbmdlVGltZScsICkgewogICAgICAgIG5leHQgVElNRUZJRUxEIGlmICEkQ29uZGl0aW9uRGF0YXskVGltZWZpZWxkfTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXskVGltZWZpZWxkfQogICAgICAgICAgICA9fiBzeyBcQSAoIFxkXGRcZFxkIC0gXGRcZCAtIFxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgKSBcLiAuKz8gXHogfXskMX14bXM7CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJUNvbmRpdGlvbkRhdGEsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcJUNvbmRpdGlvbkRhdGE7Cn0KCj1oZWFkMiBDb25kaXRpb25MaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgYWxsIGNvbmRpdGlvbiBpZHMgb2YgYSBnaXZlbiBjaGFuZ2UgaWQgYXMgYXJyYXkgcmVmZXJlbmNlLgpUaGUgaWRzIGFyZSBzb3J0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGNvbmRpdGlvbi4KCiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiA1LAogICAgICAgIFZhbGlkICAgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0NvbmRpdGlvbkxpc3Q6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSAuICc6OlZhbGlkOjonIC4gJFBhcmFte1ZhbGlkfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBkZWZpbmUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgJwogICAgICAgIC4gJ0ZST00gY2hhbmdlX2NvbmRpdGlvbiAnCiAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyAnOwoKICAgICMgZ2V0IG9ubHkgdmFsaWQgY29uZGl0aW9uIGlkcwogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICBteSAkVmFsaWRJRFN0cmluZyA9IGpvaW4gJywgJywgQFZhbGlkSURzOwoKICAgICAgICAkU1FMIC49ICJBTkQgdmFsaWRfaWQgSU4gKCAkVmFsaWRJRFN0cmluZyApICI7CiAgICB9CgogICAgIyBnZXQgc29ydGVkIGxpc3QKICAgICRTUUwgLj0gJ09SREVSIEJZIG5hbWUgQVNDICc7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25kaXRpb25JRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmRpdGlvbklEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAQ29uZGl0aW9uSURzLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXEBDb25kaXRpb25JRHM7Cn0KCj1oZWFkMiBDb25kaXRpb25EZWxldGUoKQoKRGVsZXRlIGEgY29uZGl0aW9uLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uRGVsZXRlKAogICAgICAgIENvbmRpdGlvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25kaXRpb25EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZGl0aW9uRGVsZXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25EZWxldGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBjb25kaXRpb24gZGF0YSBmb3IgZXZlbnQgaGFuZGxlcgogICAgbXkgJENvbmRpdGlvbkRhdGEgPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBleHByZXNzaW9ucyBmb3IgdGhpcyBjb25kaXRpb24gaWQKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkV4cHJlc3Npb25EZWxldGVBbGwoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAjIGRlbGV0ZSBhbGwgYWN0aW9ucyBmb3IgdGhpcyBjb25kaXRpb24gaWQKICAgICRTdWNjZXNzID0gJFNlbGYtPkFjdGlvbkRlbGV0ZUFsbCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9jb25kaXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdDb25kaXRpb25MaXN0OjpDaGFuZ2VJRDo6JyAuICRDb25kaXRpb25EYXRhLT57Q2hhbmdlSUR9IC4gJzo6VmFsaWQ6OjAnLAogICAgICAgICdDb25kaXRpb25MaXN0OjpDaGFuZ2VJRDo6JyAuICRDb25kaXRpb25EYXRhLT57Q2hhbmdlSUR9IC4gJzo6VmFsaWQ6OjEnLAogICAgICAgICdDb25kaXRpb25HZXQ6OkNvbmRpdGlvbklEOjonIC4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDb25kaXRpb25EZWxldGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25EZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgT2xkQ29uZGl0aW9uRGF0YSA9PiAkQ29uZGl0aW9uRGF0YSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb25kaXRpb25EZWxldGVBbGwoKQoKRGVsZXRlIGFsbCBjb25kaXRpb25zIGZvciBhIGdpdmVuIENoYW5nZUlELgpBbGwgcmVsYXRlZCBleHByZXNzaW9ucyBhbmQgYWN0aW9ucyB3aWxsIGJlIGRlbGV0ZWQgZmlyc3QuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25EZWxldGVBbGwoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbkRlbGV0ZUFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFsbCBjb25kaXRpb24gaWRzIChpbmNsdWRpbmcgaW52YWxpZCkgZm9yIHRoZSBnaXZlbiBjaGFuZ2UgaWQKICAgIG15ICRDb25kaXRpb25JRHNSZWYgPSAkU2VsZi0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFZhbGlkICAgID0+IDAsCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdHJpZ2dlciBDb25kaXRpb25EZWxldGVBbGxQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmRpdGlvbkRlbGV0ZUFsbFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBAeyRDb25kaXRpb25JRHNSZWZ9ICkgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhwcmVzc2lvbnMgZm9yIHRoaXMgY29uZGl0aW9uIGlkCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+RXhwcmVzc2lvbkRlbGV0ZUFsbCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICAgICAjIGRlbGV0ZSBhbGwgYWN0aW9ucyBmb3IgdGhpcyBjb25kaXRpb24gaWQKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5BY3Rpb25EZWxldGVBbGwoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICAgICAgIyBkZWxldGUgY2FjaGUgZm9yIENvbmRpdGlvbkdldAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDb25kaXRpb25HZXQ6OkNvbmRpdGlvbklEOjonIC4gJENvbmRpdGlvbklELAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgY29uZGl0aW9ucyBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9jb25kaXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQ29uZGl0aW9uTGlzdDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9IC4gJzo6VmFsaWQ6OjAnLAogICAgICAgICdDb25kaXRpb25MaXN0OjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0gLiAnOjpWYWxpZDo6MScsCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZGl0aW9uRGVsZXRlQWxsUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uRGVsZXRlQWxsUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29uZGl0aW9uTWF0Y2hFeGVjdXRlQWxsKCkKClRoaXMgZnVuY3Rpb25zIGZpbmRzIHRoZSB2YWxpZCBjb25kaXRpb25zIGZvciBhIGdpdmVuIENoYW5nZUlELiBUaGUgZm91bmQgY29uZGl0aW9ucwphcmUgaGFuZGxlZCBieSBleGVjdXRpbmcgdGhlIGFzc29jaWF0ZWQgYWN0aW9ucyB3aGVuIGEgY29uZGl0aW9uIG1hdGNoZXMuClRoZSBjb25kaXRpb25zIGFyZSBoYW5kbGVkIGluIHRoZSBvcmRlciBkZWZpbmVkIGJ5IHRoZWlyIG5hbWVzLgoKSW50ZXJuYWxseSwgdGhlIG1ldGhvZCBDb25kaXRpb25NYXRjaEV4ZWN1dGUoKSBpcyBjYWxsZWQgZm9yIGVhY2ggb2YgdGhlIGZvdW5kIGNvbmRpdGlvbnMuClRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgJ0F0dHJpYnV0ZXNDaGFuZ2VkJyBpcyBwYXNzZWQgb24gdG8gQ29uZGl0aW9uTWF0Y2hFeGVjdXRlKCkuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25NYXRjaEV4ZWN1dGVBbGwoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgPT4gMTIzLAogICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgSVRTTUNoYW5nZSA9PiBbIENoYW5nZVRpdGxlLCBDaGFuZ2VEZXNjcmlwdGlvbl0gfSwgICMgKG9wdGlvbmFsKQogICAgICAgIEV2ZW50ICAgICAgICAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbk1hdGNoRXhlY3V0ZUFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFsbCBjb25kaXRpb24gaWRzIGZvciB0aGUgZ2l2ZW4gY2hhbmdlIGlkCiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJFNlbGYtPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBWYWxpZCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9ycwogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uSURzUmVmOwogICAgcmV0dXJuIGlmIHJlZiAkQ29uZGl0aW9uSURzUmVmIG5lICdBUlJBWSc7CgogICAgIyBubyBlcnJvciBpZiBqdXN0IG5vIHZhbGlkIGNvbmRpdGlvbnMgd2VyZSBmb3VuZAogICAgcmV0dXJuIDEgaWYgIUB7JENvbmRpdGlvbklEc1JlZn07CgogICAgIyBtYXRjaCBhbmQgZXhlY3V0ZSBhbGwgY29uZGl0aW9ucwogICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JENvbmRpdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgbWF0Y2ggYW5kIGV4ZWN1dGUgZWFjaCBjb25kaXRpb24KICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5Db25kaXRpb25NYXRjaEV4ZWN1dGUoCiAgICAgICAgICAgIENvbmRpdGlvbklEICAgICAgID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4gJFBhcmFte0F0dHJpYnV0ZXNDaGFuZ2VkfSwKICAgICAgICAgICAgRXZlbnQgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB3cml0ZSBsb2cgZW50cnkgYnV0IGRvIG5vdCByZXR1cm4KICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbk1hdGNoRXhlY3V0ZSBmb3IgQ29uZGl0aW9uSUQgJyRDb25kaXRpb25JRCcgZmFpbGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29uZGl0aW9uTWF0Y2hFeGVjdXRlKCkKClRoaXMgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gY29uZGl0aW9uLiBXaGVuIGl0IG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgYWN0aW9ucyBhcmUKZXhlY3V0ZWQuCgpUaGUgb3B0aW9uYWwgcGFyYW1ldGVyICdBdHRyaWJ1dGVzQ2hhbmdlZCcgZGVmaW5lcyBhIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHdlcmUgY2hhbmdlZApkdXJpbmcgZS5nLiBhIENoYW5nZVVwZGF0ZS1FdmVudC4gV2hlbiAnQXR0cmlidXRlc0NoYW5nZWQnIGlzIHBhc3NlZCwgaXQgaXMgdXNlZCB0byBzaG9ydGN1dCB0aGUKZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBPbmx5IHRoZSBjaGFuZ2VkIGF0dHJpYnV0ZXMgbXVzdCBiZSBjaGVja2VkLgpXaGVuIHRoZSBleHByZXNzaW9uIGNvbmp1bmN0aW9uIGlzICdhbnknIGFuZCBtb3JlIHRoYW4gYSBzaW5nbGUgZXhwcmVzc2lvbiBpcyBzZXQgdXAsCnRoZW4sIGZvciBvYnZpb3VzIHJlYXNvbnMsIHRoZSBzaG9ydGN1dCBpcyBub3QgdXNlZC4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbk1hdGNoRXhlY3V0ZSgKICAgICAgICBDb25kaXRpb25JRCAgICAgICA9PiAxMjMsCiAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4geyBJVFNNQ2hhbmdlID0+IFsgQ2hhbmdlVGl0bGUsIENoYW5nZURlc2NyaXB0aW9uXSB9LCAgIyAob3B0aW9uYWwpCiAgICAgICAgRXZlbnQgICAgICAgICAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZGl0aW9uTWF0Y2hFeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIGRhdGEKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICByZXR1cm4gaWYgISRDb25kaXRpb25EYXRhOwoKICAgICMgZ2V0IGFsbCBleHByZXNzaW9ucyBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBpZAogICAgbXkgJEV4cHJlc3Npb25JRHNSZWYgPSAkU2VsZi0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcnMKICAgIHJldHVybiBpZiAhJEV4cHJlc3Npb25JRHNSZWY7CiAgICByZXR1cm4gaWYgcmVmICRFeHByZXNzaW9uSURzUmVmIG5lICdBUlJBWSc7CgogICAgIyBubyBlcnJvciBpZiBqdXN0IG5vIGV4cHJlc3Npb25zIHdlcmUgZm91bmQKICAgIHJldHVybiAxIGlmICFAeyRFeHByZXNzaW9uSURzUmVmfTsKCiAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbiBpZHMKICAgIG15ICRFeHByZXNzaW9uSURDb3VudCA9IHNjYWxhciBAeyRFeHByZXNzaW9uSURzUmVmfTsKCiAgICAjIGdldCBhbGwgYWN0aW9ucyBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBpZAogICAgbXkgJEFjdGlvbklEc1JlZiA9ICRTZWxmLT5BY3Rpb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3JzCiAgICByZXR1cm4gaWYgISRBY3Rpb25JRHNSZWY7CiAgICByZXR1cm4gaWYgcmVmICRBY3Rpb25JRHNSZWYgbmUgJ0FSUkFZJzsKCiAgICAjIG5vIGVycm9yIGlmIGp1c3Qgbm8gYWN0aW9ucyB3ZXJlIGZvdW5kCiAgICByZXR1cm4gMSBpZiAhQHskQWN0aW9uSURzUmVmfTsKCiAgICAjIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcG9zaXRpdmUgKHRydWUpIGV4cHJlc3Npb25zCiAgICBteSBARXhwcmVzc2lvbk1hdGNoUmVzdWx0OwoKICAgICMgdG8gc3RvcmUgaWYgdGhlIGNvbmRpdGlvbiBtYXRjaGVzCiAgICBteSAkQ29uZGl0aW9uTWF0Y2g7CgogICAgIyBub3JtYWxseSBnaXZlIHRoZSBsaXN0IG9mIGNoYW5nZWQgYXR0cmlidXRlcyB0byBFeHByZXNzaW9uTWF0Y2goKSBmdW5jdGlvbgogICAgbXkgJEF0dHJpYnV0ZXNDaGFuZ2VkID0gJFBhcmFte0F0dHJpYnV0ZXNDaGFuZ2VkfTsKCiAgICAjIGV4cHJlc3Npb24gY29uanVuY3Rpb24gaXMgJ2FsbCcgYW5kIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZXhwcmVzaW9uCiAgICBpZiAoICRDb25kaXRpb25EYXRhLT57RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSBlcSAnYWxsJyAmJiAkRXhwcmVzc2lvbklEQ291bnQgPiAxICkgewoKICAgICAgICAjIGRvIG5vdCBnaXZlIHRoZSBsaXN0IG9mIGNoYW5nZWQgYXR0cmlidXRlcyB0byBFeHByZXNzaW9uTWF0Y2goKQogICAgICAgICRBdHRyaWJ1dGVzQ2hhbmdlZCA9IHVuZGVmOwogICAgfQoKICAgICMgdHJ5IHRvIG1hdGNoIGVhY2ggZXhwcmVzc2lvbgogICAgRVhQUkVTU0lPTklEOgogICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uSURzUmVmfSApIHsKCiAgICAgICAgIyBtYXRjaCBleHByZXNzaW9uCiAgICAgICAgbXkgJEV4cHJlc3Npb25NYXRjaCA9ICRTZWxmLT5FeHByZXNzaW9uTWF0Y2goCiAgICAgICAgICAgIEV4cHJlc3Npb25JRCAgICAgID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+ICRBdHRyaWJ1dGVzQ2hhbmdlZCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKSB8fCAwOwoKICAgICAgICAjIHNldCBDb25kaXRpb25NYXRjaCB0cnVlIGlmIEV4cHJlc3Npb25NYXRjaCBpcyB0cnVlIGFuZCAnYW55JyBpcyByZXF1ZXN0ZWQKICAgICAgICBpZiAoICRDb25kaXRpb25EYXRhLT57RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSBlcSAnYW55JyAmJiAkRXhwcmVzc2lvbk1hdGNoICkgewogICAgICAgICAgICAkQ29uZGl0aW9uTWF0Y2ggPSAxOwogICAgICAgICAgICBsYXN0IEVYUFJFU1NJT05JRDsKICAgICAgICB9CgogICAgICAgICMgY29uZGl0aW9uIGlzIGZhbHNlIGF0IGFsbCwgbm8gYWN0aW9uIHdpbGwgYmUgZXhlY3RlZCwgd2UganVzdCByZXR1cm4gdHJ1ZQogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbGwnICYmICEkRXhwcmVzc2lvbk1hdGNoICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBjdXJyZW50IGV4cHJlc3Npb24gbWF0Y2ggcmVzdWx0IGZvciBsYXRlciBjaGVja3MKICAgICAgICBwdXNoIEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQsICRFeHByZXNzaW9uTWF0Y2g7CiAgICB9CgogICAgIyBjb3VudCBhbGwgcmVzdWx0cyB3aGljaCBoYXZlIGEgdHJ1ZSB2YWx1ZQogICAgbXkgJFRydWVDb3VudCA9IHNjYWxhciBncmVwIHsgJF8gPT0gMSB9IEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQ7CgogICAgIyBpZiB0aGUgY29uZGl0aW9uIGRpZCBub3QgbWF0Y2ggYWxyZWFkeSwgYW5kIG5vdCBhbGwgZXhwcmVzc2lvbnMgYXJlIHRydWUKICAgIGlmICggISRDb25kaXRpb25NYXRjaCAmJiAkVHJ1ZUNvdW50ICE9ICRFeHByZXNzaW9uSURDb3VudCApIHsKCiAgICAgICAgIyBubyBlcnJvcjogaWYganVzdCB0aGUgY29uZGl0aW9uIGRpZCBub3QgbWF0Y2gsCiAgICAgICAgIyB0aGVyZSBpcyBubyBuZWVkIHRvIGV4ZWN1dGUgYW55IGFjdGlvbnMKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGV4ZWN1dGUgYWxsIGFjdGlvbnMgb2YgdGhpcyBjb25kaXRpb24KICAgIEFDVElPTklEOgogICAgZm9yIG15ICRBY3Rpb25JRCAoIEB7JEFjdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgZXhlY3V0ZSBlYWNoIGFjdGlvbgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFjdGlvbkV4ZWN1dGUoCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcjogaWYgQWN0aW9uRXhlY3V0ZSgpIHJldHVybnMgdW5kZWZpbmVkIGl0IGlzIGFuIGVycm9yLAogICAgICAgICMgMSBtZWFucyBhbiBhY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgYW5kIDAgbWVhbnMgaXQgd2FzIGEgIkxvY2siLUFjdGlvbiwKICAgICAgICAjIHdoaWNoIGlzIG5vIGVycm9yLCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3QgYmUgbG9nZ2VkLgogICAgICAgIGlmICggIWRlZmluZWQgJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBY3Rpb25JRCAnJEFjdGlvbklEJyBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5ICIKICAgICAgICAgICAgICAgICAgICAuICJmb3IgQ29uZGl0aW9uSUQgJyRQYXJhbXtDb25kaXRpb25JRH0nIChDb25kaXRpb24gbmFtZTogJyRDb25kaXRpb25EYXRhLT57TmFtZX0nKSAiCiAgICAgICAgICAgICAgICAgICAgLiAib24gQ2hhbmdlSUQgJyRDb25kaXRpb25EYXRhLT57Q2hhbmdlSUR9JyBmb3IgZXZlbnQgJyRQYXJhbXtFdmVudH0nLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29uZGl0aW9uTWF0Y2hTdGF0ZUxvY2soKQoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTWF0Y2hTdGF0ZUxvY2soCiAgICAgICAgT2JqZWN0TmFtZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU2VsZWN0b3IgICA9PiAyMzQsCiAgICAgICAgU3RhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25kaXRpb25NYXRjaFN0YXRlTG9jayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3ROYW1lIFNlbGVjdG9yIFN0YXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBpZCBvZiBvYmplY3QKICAgIG15ICRPYmplY3RJRCA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICRQYXJhbXtPYmplY3ROYW1lfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJE9iamVjdElEOwoKICAgICMgZ2V0IGlkIG9mIG9wZXJhdG9yOwogICAgbXkgJE9wZXJhdG9yTmFtZSA9ICdsb2NrJzsKICAgIG15ICRPcGVyYXRvcklEICAgPSAkU2VsZi0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICRPcGVyYXRvck5hbWUsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICByZXR1cm4gaWYgISRPcGVyYXRvcklEOwoKICAgICMgZ2V0IGNvbmRpdGlvbnMKICAgIG15ICRDb25kaXRpb25zID0gJFNlbGYtPl9Db25kaXRpb25MaXN0QnlPYmplY3QoCiAgICAgICAgT2JqZWN0TmFtZSA9PiAkUGFyYW17T2JqZWN0TmFtZX0sCiAgICAgICAgU2VsZWN0b3IgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhQHskQ29uZGl0aW9uc307CgogICAgIyBnZXQgYWxsIGFjdGlvbnMgYWZmZWN0aW5nIHRoaXMgb2JqZWN0CiAgICBteSBAQWZmZWN0ZWRDb25kaXRpb25JRHM7CiAgICBDT05ESVRJT05JRDoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBAeyRDb25kaXRpb25zfSApIHsKCiAgICAgICAgIyBnZXQgYWN0aW9ucyBmb3IgdGhpcyBjb25kaXRpb24KICAgICAgICBteSAkQWN0aW9uSURzUmVmID0gJFNlbGYtPkFjdGlvbkxpc3QoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgIyBjaGVjayBhY3Rpb25zCiAgICAgICAgbmV4dCBDT05ESVRJT05JRCBpZiAhQHskQWN0aW9uSURzUmVmfTsKCiAgICAgICAgIyBjaGVjayBmb3IgYWN0aW9ucwogICAgICAgIEFDVElPTklEOgogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBAeyRBY3Rpb25JRHNSZWZ9ICkgewoKICAgICAgICAgICAgIyBnZXQgYWN0aW9uCiAgICAgICAgICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgICAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGFjdGlvbgogICAgICAgICAgICBuZXh0IEFDVElPTklEIGlmICEkQWN0aW9uOwoKICAgICAgICAgICAgIyBzdG9yZSBvbmx5IGFmZmVjdGVkIGFjdGlvbnMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFjdGlvbi0+e09iamVjdElEfSBlcSAkT2JqZWN0SUQKICAgICAgICAgICAgICAgICYmICRBY3Rpb24tPntPcGVyYXRvcklEfSBlcSAkT3BlcmF0b3JJRAogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICRBY3Rpb24tPntTZWxlY3Rvcn0gZXEgJFBhcmFte1NlbGVjdG9yfQogICAgICAgICAgICAgICAgICAgIHx8ICRBY3Rpb24tPntTZWxlY3Rvcn0gZXEgJ2FsbCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICYmICRBY3Rpb24tPntBY3Rpb25WYWx1ZX0gZXEgJFBhcmFte1N0YXRlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFmZmVjdGVkQ29uZGl0aW9uSURzLCAkQWN0aW9uLT57Q29uZGl0aW9uSUR9OwoKICAgICAgICAgICAgICAgICMgZm91bmQgYSBjb25kaXRpb24gd2l0aCBhbiBhZmZlY3RlZCBhY3Rpb24KICAgICAgICAgICAgICAgICMgc28gd2UgY2FuIG1vdmUgb24gdG8gdGhlIG5leHQgY29uZGl0aW9uCiAgICAgICAgICAgICAgICBuZXh0IENPTkRJVElPTklEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIGFmZmVjdGVkIGNvbmRpdGlvbnMKICAgIHJldHVybiBpZiAhQEFmZmVjdGVkQ29uZGl0aW9uSURzOwoKICAgICMgY2hlY2sgZm9yIHBvc2l0aXZlIGNvbmRpdGlvbiBtYXRjaGVzCiAgICBBRkZFQ1RFRENPTkRJVElPTklEOgogICAgZm9yIG15ICRBZmZlY3RlZENvbmRpdGlvbklEIChAQWZmZWN0ZWRDb25kaXRpb25JRHMpIHsKCiAgICAgICAgIyBnZXQgY29uZGl0aW9uIG1hdGNoCiAgICAgICAgbXkgJENvbmRpdGlvbk1hdGNoID0gJFNlbGYtPl9Db25kaXRpb25NYXRjaCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJEFmZmVjdGVkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQUZGRUNURURDT05ESVRJT05JRCBpZiAhJENvbmRpdGlvbk1hdGNoOwoKICAgICAgICAjIGNvbmRpdGlvbiBtYXRjaGVkIHN1Y2Nlc3NmdWxseQogICAgICAgIHJldHVybiAxIGlmICRDb25kaXRpb25NYXRjaDsKICAgIH0KCiAgICAjIG5vIGNvbmRpdGlvbiBtYXRjaGVkCiAgICByZXR1cm47Cn0KCj1oZWFkMiBDb25kaXRpb25Db21wYXJlVmFsdWVGaWVsZFR5cGUoKQoKUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY29tcGFyZSB2YWx1ZSBmaWVsZCBhcyBzdHJpbmcsIGJhc2VkIG9uIHRoZSBnaXZlbiBvYmplY3QgaWQgYW5kIGF0dHJpYnV0ZSBpZC4KCiAgICBteSAkRmllbGRUeXBlID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uQ29tcGFyZVZhbHVlRmllbGRUeXBlKAogICAgICAgIE9iamVjdElEICAgID0+IDEyMzQsCiAgICAgICAgQXR0cmlidXRlSUQgPT4gNSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgJ1RleHQnIG9yICdTZWxlY3Rpb24nIG9yICdEYXRlJy4KCkM8VE9ETz46IEFkZCAnQXV0b2NvbXBsZXRlJyB0eXBlIGZvciBDaGFuZ2VCdWlsZGVyLCBDaGFuZ2VNYW5hZ2VyLCBXb3JrT3JkZXJBZ2VudCwgZXRjLi4uCgo9Y3V0CgpzdWIgQ29uZGl0aW9uQ29tcGFyZVZhbHVlRmllbGRUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdElEIEF0dHJpYnV0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb29rdXAgb2JqZWN0IG5hbWUKICAgIG15ICRPYmplY3ROYW1lID0gJFNlbGYtPk9iamVjdExvb2t1cCgKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkT2JqZWN0TmFtZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9iamVjdElEICRQYXJhbXtPYmplY3RJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBhdHRyaWJ1dGUgbmFtZQogICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkU2VsZi0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRBdHRyaWJ1dGVOYW1lICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXR0cmlidXRlSUQgJFBhcmFte0F0dHJpYnV0ZUlEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBmaWVsZCB0eXBlIGNvbmZpZyBmb3IgdGhlIGdpdmVuIG9iamVjdAogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCggJE9iamVjdE5hbWUgLiAnOjpBdHRyaWJ1dGU6OkNvbXBhcmVWYWx1ZTo6RmllbGRUeXBlJyApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJENvbmZpZzsKCiAgICAjIHJlbW92ZSB0aGUgbmFtZSBwYXJ0IG9mIHRoZSBkeW5hbWljIGZpZWxkIGFuZCByZXBsYWNlIG9ubHkgd2l0aCB0aGUgc3RyaW5nICJEeW5hbWljRmllbGQiCiAgICAkQXR0cmlidXRlTmFtZSA9fiBzeyBcQSBEeW5hbWljRmllbGRfIChcdyspIH17RHluYW1pY0ZpZWxkfXhtczsKCiAgICAjIGdldCB0aGUgZmllbGQgdHlwZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBvciByZXR1cm4gdGhlIGRlZmF1bHQgZmllbGQgdHlwZSAnU2VsZWN0aW9uJwogICAgbXkgJEZpZWxkVHlwZSA9ICRDb25maWctPnskQXR0cmlidXRlTmFtZX0gfHwgJ1NlbGVjdGlvbic7CgogICAgcmV0dXJuICRGaWVsZFR5cGU7Cn0KCj1oZWFkMiBDb25kaXRpb25MaXN0QnlPYmplY3RUeXBlKCkKClJldHVybiBhIGxpc3Qgb2YgYWxsIGNvbmRpdGlvbnMgaWRzIG9mIGEgZ2l2ZW4gY2hhbmdlIGlkIGFzIGFycmF5IHJlZmVyZW5jZS4KT25seSB0aGUgaWRzIG9mIGEgY29uZGl0aW9uIGFyZSByZXR1cm5lZCB3aGVyZSBvYmplY3QgdHlwZSBhbmQgaWRlbnRpZmllciBhcmUgbWF0Y2hpbmcuCgogICAgbXkgJENvbmRpdGlvbklEc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkxpc3RCeU9iamVjdFR5cGUoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicKICAgICAgICBTZWxlY3RvciAgID0+IDEyMzQsCiAgICAgICAgQ2hhbmdlSUQgICA9PiA1LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZGl0aW9uTGlzdEJ5T2JqZWN0VHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RUeXBlIFNlbGVjdG9yIENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9ucyBvZiBjaGFuZ2UKICAgIG15ICRDaGFuZ2VDb25kaXRpb25zID0gJFNlbGYtPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBWYWxpZCAgICA9PiAwLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbnMKICAgIHJldHVybiBpZiAhJENoYW5nZUNvbmRpdGlvbnM7CgogICAgIyBnZXQgZXhwcmVzc2lvbnMgb2YgY29uZGl0aW9ucwogICAgbXkgJUNvbmRpdGlvbkV4cHJlc3Npb24gPSBtYXAgewogICAgICAgICRfID0+ICRTZWxmLT5FeHByZXNzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJF8sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICkgfHwgW10KICAgIH0gQHskQ2hhbmdlQ29uZGl0aW9uc307CgogICAgIyBnZXQgYWN0aW9ucyBvZiBjb25kaXRpb25zCiAgICBteSAlQ29uZGl0aW9uQWN0aW9uID0gbWFwIHsKICAgICAgICAkXyA9PiAkU2VsZi0+QWN0aW9uTGlzdCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJF8sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICkgfHwgW10KICAgIH0gQHskQ2hhbmdlQ29uZGl0aW9uc307CgogICAgIyBnZXQgb2JqZWN0IGlkIG9mIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0SUQgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgICA9PiAkUGFyYW17T2JqZWN0VHlwZX0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBpZAogICAgcmV0dXJuIGlmICEkT2JqZWN0SUQ7CgogICAgIyBnZXQgb25seSBhZmZlY3RlZCB1bmlxdWUgY29uZGl0aW9uIGlkCiAgICBteSBAQWZmZWN0ZWRDb25kaXRpb25JRHM7CiAgICBDT05ESVRJT05JRDoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBzb3J0IGtleXMgJUNvbmRpdGlvbkV4cHJlc3Npb24gKSB7CgogICAgICAgICMgY2hlY2sgZXhwcmVzc2lvbiBmb3IgdGhpcyB3b3Jrb3JkZXIKICAgICAgICBFWFBSRVNTSU9OSUQ6CiAgICAgICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyAkQ29uZGl0aW9uRXhwcmVzc2lvbnskQ29uZGl0aW9uSUR9IH0gKSB7CgogICAgICAgICAgICAjIGdldCBleHByZXNzaW9uCiAgICAgICAgICAgIG15ICRFeHByZXNzaW9uID0gJFNlbGYtPkV4cHJlc3Npb25HZXQoCiAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXhwcmVzc2lvbgogICAgICAgICAgICBuZXh0IEVYUFJFU1NJT05JRCBpZiAhJEV4cHJlc3Npb247CgogICAgICAgICAgICAjIGNoZWNrIGZvciBzZWxlY3RvcgogICAgICAgICAgICBuZXh0IEVYUFJFU1NJT05JRCBpZiAkRXhwcmVzc2lvbi0+e1NlbGVjdG9yfSBuZSAkUGFyYW17U2VsZWN0b3J9OwoKICAgICAgICAgICAgIyBjaGVjayBmb3Igb2JqZWN0IHR5cGUKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9OSUQgaWYgJEV4cHJlc3Npb24tPntPYmplY3RJRH0gbmUgJE9iamVjdElEOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGNvbmRpdGlvbnMgaXMgYWxyZWFkeSBvbiBzdGFjawogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJENvbmRpdGlvbklEIH0gQEFmZmVjdGVkQ29uZGl0aW9uSURzICkgewoKICAgICAgICAgICAgICAgICMgdGhpcyBleHByZXNzaW9uIGlzIHZhbGlkCiAgICAgICAgICAgICAgICBwdXNoIEBBZmZlY3RlZENvbmRpdGlvbklEcywgJENvbmRpdGlvbklEOwoKICAgICAgICAgICAgICAgICMganVtcCB0byBuZXh0IGNvbmRpdGlvbgogICAgICAgICAgICAgICAgbmV4dCBDT05ESVRJT05JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBDT05ESVRJT05JRDoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBzb3J0IGtleXMgJUNvbmRpdGlvbkFjdGlvbiApIHsKCiAgICAgICAgIyBjaGVjayBhY3Rpb24gZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgQUNUSU9OSUQ6CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIEB7ICRDb25kaXRpb25BY3Rpb257JENvbmRpdGlvbklEfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgYWN0aW9uCiAgICAgICAgICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgICAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGV4cHJlc3Npb24KICAgICAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAhJEFjdGlvbjsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHNlbGVjdG9yCiAgICAgICAgICAgIG5leHQgQUNUSU9OSUQgaWYgJEFjdGlvbi0+e1NlbGVjdG9yfSBuZSAkUGFyYW17U2VsZWN0b3J9OwoKICAgICAgICAgICAgIyBjaGVjayBmb3Igb2JqZWN0IHR5cGUKICAgICAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAkQWN0aW9uLT57T2JqZWN0SUR9IG5lICRPYmplY3RJRDsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBjb25kaXRpb25zIGlzIGFscmVhZHkgb24gc3RhY2sKICAgICAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICRDb25kaXRpb25JRCB9IEBBZmZlY3RlZENvbmRpdGlvbklEcyApIHsKCiAgICAgICAgICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBpcyB2YWxpZAogICAgICAgICAgICAgICAgcHVzaCBAQWZmZWN0ZWRDb25kaXRpb25JRHMsICRDb25kaXRpb25JRDsKCiAgICAgICAgICAgICAgICAjIGp1bXAgdG8gbmV4dCBjb25kaXRpb24KICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxAQWZmZWN0ZWRDb25kaXRpb25JRHM7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9Db25kaXRpb25NYXRjaCgpCgpUaGlzIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIGNvbmRpdGlvbiBhbmQgZXhlY3V0ZXMgJ25vJyBhY3Rpb25zLgpUaGUgb3B0aW9uYWwgcGFyYW1ldGVyICdBdHRyaWJ1dGVzQ2hhbmdlZCcgZGVmaW5lcyBhIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHdlcmUgY2hhbmdlZApkdXJpbmcgZS5nLiBhIENoYW5nZVVwZGF0ZS1FdmVudC4gSWYgYSBjb25kaXRpb24gbWF0Y2hlcyBhbiBleHByZXNzaW9uLCB0aGUgYXR0cmlidXRlIG9mIHRoZSBleHByZXNzaW9uCm11c3QgYmUgbGlzdGVkIGluICdBdHRyaWJ1dGVzQ2hhbmdlZCcuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5fQ29uZGl0aW9uTWF0Y2goCiAgICAgICAgQ29uZGl0aW9uSUQgICAgICAgPT4gMTIzLAogICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgSVRTTUNoYW5nZSA9PiBbIENoYW5nZVRpdGxlLCBDaGFuZ2VEZXNjcmlwdGlvbl0gfSwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9Db25kaXRpb25NYXRjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBkYXRhCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uRGF0YTsKCiAgICAjIGdldCBhbGwgZXhwcmVzc2lvbnMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgIG15ICRFeHByZXNzaW9uSURzUmVmID0gJFNlbGYtPkV4cHJlc3Npb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3JzCiAgICByZXR1cm4gaWYgISRFeHByZXNzaW9uSURzUmVmOwogICAgcmV0dXJuIGlmIHJlZiAkRXhwcmVzc2lvbklEc1JlZiBuZSAnQVJSQVknOwoKICAgICMgbm8gZXJyb3IgaWYganVzdCBubyBleHByZXNzaW9ucyB3ZXJlIGZvdW5kCiAgICByZXR1cm4gMCBpZiAhQHskRXhwcmVzc2lvbklEc1JlZn07CgogICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb24gaWRzCiAgICBteSAkRXhwcmVzc2lvbklEQ291bnQgPSBzY2FsYXIgQHskRXhwcmVzc2lvbklEc1JlZn07CgogICAgIyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHBvc2l0aXZlICh0cnVlKSBleHByZXNzaW9ucwogICAgbXkgQEV4cHJlc3Npb25NYXRjaFJlc3VsdDsKCiAgICAjIHRvIHN0b3JlIGlmIHRoZSBjb25kaXRpb24gbWF0Y2hlcwogICAgbXkgJENvbmRpdGlvbk1hdGNoOwoKICAgICMgdHJ5IHRvIG1hdGNoIGVhY2ggZXhwcmVzc2lvbgogICAgRVhQUkVTU0lPTklEOgogICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uSURzUmVmfSApIHsKCiAgICAgICAgIyBub3JtYWxseSBnaXZlIHRoZSBsaXN0IG9mIGNoYW5nZWQgYXR0cmlidXRlcyB0byBFeHByZXNzaW9uTWF0Y2goKSBmdW5jdGlvbgogICAgICAgIG15ICRBdHRyaWJ1dGVzQ2hhbmdlZCA9ICRQYXJhbXtBdHRyaWJ1dGVzQ2hhbmdlZH07CgogICAgICAgICMgZXhwcmVzc2lvbiBjb25qdW5jdGlvbiBpcyAnYWxsJyBhbmQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBleHByZXNpb24KICAgICAgICBpZiAoICRDb25kaXRpb25EYXRhLT57RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSBlcSAnYWxsJyAmJiAkRXhwcmVzc2lvbklEQ291bnQgPiAxICkgewoKICAgICAgICAgICAgIyBkbyBub3QgZ2l2ZSB0aGUgbGlzdCBvZiBjaGFuZ2VkIGF0dHJpYnV0ZXMgdG8gRXhwcmVzc2lvbk1hdGNoKCkKICAgICAgICAgICAgJEF0dHJpYnV0ZXNDaGFuZ2VkID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIG1hdGNoIGV4cHJlc3Npb24KICAgICAgICBteSAkRXhwcmVzc2lvbk1hdGNoID0gJFNlbGYtPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4gJEF0dHJpYnV0ZXNDaGFuZ2VkLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApIHx8IDA7CgogICAgICAgICMgc2V0IENvbmRpdGlvbk1hdGNoIHRydWUgaWYgRXhwcmVzc2lvbk1hdGNoIGlzIHRydWUgYW5kICdhbnknIGlzIHJlcXVlc3RlZAogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbnknICYmICRFeHByZXNzaW9uTWF0Y2ggKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgIyBjb25kaXRpb24gaXMgZmFsc2UgYXQgYWxsLCBzbyByZXR1cm4gdHJ1ZQogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbGwnICYmICEkRXhwcmVzc2lvbk1hdGNoICkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBjdXJyZW50IGV4cHJlc3Npb24gbWF0Y2ggcmVzdWx0IGZvciBsYXRlciBjaGVja3MKICAgICAgICBwdXNoIEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQsICRFeHByZXNzaW9uTWF0Y2g7CiAgICB9CgogICAgIyBjb3VudCBhbGwgcmVzdWx0cyB3aGljaCBoYXZlIGEgdHJ1ZSB2YWx1ZQogICAgbXkgJFRydWVDb3VudCA9IHNjYWxhciBncmVwIHsgJF8gPT0gMSB9IEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQ7CgogICAgIyBpZiB0aGUgY29uZGl0aW9uIGRpZCBub3QgbWF0Y2ggYWxyZWFkeSwgYW5kIG5vdCBhbGwgZXhwcmVzc2lvbnMgYXJlIHRydWUKICAgIGlmICggISRDb25kaXRpb25NYXRjaCAmJiAkVHJ1ZUNvdW50ICE9ICRFeHByZXNzaW9uSURDb3VudCApIHsKCiAgICAgICAgIyBub3QgYWxsIGV4cHJlc3Npb25zIGhhdmUgbWF0Y2hlZAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0NvbmRpdGlvbkxpc3RCeU9iamVjdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGFsbCBjb25kaXRpb25zIGlkcyBvZiBhIGdpdmVuIG9iamVjdC4KCiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+X0NvbmRpdGlvbkxpc3RCeU9iamVjdCgKICAgICAgICBPYmplY3ROYW1lID0+ICdJVFNNQ2hhbmdlJwogICAgICAgIFNlbGVjdG9yICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NvbmRpdGlvbkxpc3RCeU9iamVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3ROYW1lIFNlbGVjdG9yIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGlkCiAgICBteSAkQ2hhbmdlSUQ7CgogICAgaWYgKCAkUGFyYW17T2JqZWN0TmFtZX0gZXEgJ0lUU01DaGFuZ2UnICkgewoKICAgICAgICAjIHNlbGVjdG9yIGlzIG5lZWRlZCBjaGFuZ2UgaWQKICAgICAgICAkQ2hhbmdlSUQgPSAkUGFyYW17U2VsZWN0b3J9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17T2JqZWN0TmFtZX0gZXEgJ0lUU01Xb3JrT3JkZXInICkgewoKICAgICAgICAjIGdldCBvYmplY3QgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgICAgICMgZGVmaW5lIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBiYWNrZW5kCiAgICAgICAgbXkgJFN1YiA9ICdEYXRhR2V0JzsKCiAgICAgICAgIyBjaGVjayBmb3IgYXZhaWxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKCAhJEJhY2tlbmRPYmplY3QtPmNhbigkU3ViKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZ1bmN0aW9uICckU3ViJyBhdmFpbGFibGUgZm9yIGJhY2tlbmQgJyRQYXJhbXtPYmplY3ROYW1lfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBleGVjdXRlIHRoZSBzdWJyb3V0aW5lCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRCYWNrZW5kT2JqZWN0LT4kU3ViKAogICAgICAgICAgICBTZWxlY3RvciA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApIHx8IHt9OwoKICAgICAgICByZXR1cm4gaWYgISRXb3JrT3JkZXI7CgogICAgICAgICMgZ2V0IGNoYW5nZSBpZAogICAgICAgICRDaGFuZ2VJRCA9ICRXb3JrT3JkZXItPlswXS0+e0NoYW5nZUlEfTsKICAgIH0KCiAgICAjIGNoZWNrIGNoYW5nZSBpZAogICAgcmV0dXJuIGlmICEkQ2hhbmdlSUQ7CgogICAgIyBnZXQgY29uZGl0aW9ucyBmb3IgdGhpcyBjaGFuZ2UKICAgIG15ICRDb25kaXRpb25zID0gJFNlbGYtPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJENvbmRpdGlvbnM7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9IaXN0b3J5LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEhpc3RvcnkucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnkgLSBhbGwgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgaGlzdG9yeSBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRIaXN0b3J5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgdGhlIGNhY2hlIHR5cGUgYW5kIFRUTCAoaW4gc2Vjb25kcykKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01DaGFuZ2U6OkNhY2hlVFRMJykgKiA2MDsKCiAgICAjIHNldCBkZWZhdWx0IGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9IHx8PSAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEhpc3RvcnlBZGQoKQoKQWRkcyBhIHNpbmdsZSBoaXN0b3J5IGVudHJ5IHRvIHRoZSBoaXN0b3J5LiBSZXR1cm5zIDEgb24gc3VjY2VzcywgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAxMjM0LCAgICAgICAgICAgICAgICAgICAgICMgZWl0aGVyIENoYW5nZUlEIG9yIFdvcmtPcmRlcklEIGlzIG5lZWRlZAogICAgICAgIFdvcmtPcmRlcklEICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAjIGVpdGhlciBDaGFuZ2VJRCBvciBXb3JrT3JkZXJJRCBpcyBuZWVkZWQKICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdXb3JrT3JkZXJBZGQnLCAgICAgICAgICAgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgICAgICBGaWVsZG5hbWUgICAgID0+ICdKdXN0aWZpY2F0aW9uJywgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIENvbnRlbnROZXcgICAgPT4gJ0FueSB1c2VmdWwgaW5mb3JtYXRpb24nLCAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudE9sZCAgICA9PiAnT2xkIHZhbHVlIG9mIGZpZWxkJywgICAgICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgIyBDaGFuZ2VJRCBpcyBhbHdheXMgbmVlZGVkLCB3b3Jrb3JkZXIgaWQgaXMgb25seSBuZWVkZWQgZm9yIHdvcmtvcmRlciBldmVudHMKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQgQ2hhbmdlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgIGlmICggISggJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAkUGFyYW17SGlzdG9yeVR5cGVJRH0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgdHlwZSBpZCBmcm9tIGhpc3RvcnkgdHlwZSBpZiBoaXN0b3J5IHR5cGUgaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte0hpc3RvcnlUeXBlfSApIHsKCiAgICAgICAgIyBsb29rdXAgdGhlIGhpc3RvcnkgdHlwZSBpZAogICAgICAgIG15ICRJRCA9ICRTZWxmLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJFBhcmFte0hpc3RvcnlUeXBlfSwKICAgICAgICApOwoKICAgICAgICAjIG5vIHZhbGlkIGhpc3RvcnkgdHlwZSBnaXZlbgogICAgICAgIGlmICggISRJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgaGlzdG9yeSB0eXBlICckUGFyYW17SGlzdG9yeVR5cGV9JyBnaXZlbiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17SGlzdG9yeVR5cGVJRH0gPSAkSUQ7CiAgICB9CgogICAgIyBjb252ZXJ0IGFycmF5IHBhcmFtcwogICAgQ09OVEVOVDoKICAgIGZvciBteSAkQ29udGVudCAocXcoQ29udGVudE5ldyBDb250ZW50T2xkKSkgewogICAgICAgIG5leHQgQ09OVEVOVCBpZiByZWYgJFBhcmFteyRDb250ZW50fSBuZSAnQVJSQVknOwogICAgICAgICRQYXJhbXskQ29udGVudH0gPSBqb2luICcsICcsIEB7ICRQYXJhbXskQ29udGVudH0gfTsKICAgIH0KCiAgICAjIGluc2VydCBoaXN0b3J5IGVudHJ5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9oaXN0b3J5ICggY2hhbmdlX2lkLCB3b3Jrb3JkZXJfaWQsIGNvbnRlbnRfbmV3LCAnCiAgICAgICAgICAgIC4gJ2NvbnRlbnRfb2xkLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB0eXBlX2lkLCBmaWVsZG5hbWUgKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCA/ICknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29udGVudE5ld30sCiAgICAgICAgICAgIFwkUGFyYW17Q29udGVudE9sZH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtIaXN0b3J5VHlwZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtGaWVsZG5hbWV9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgSGlzdG9yeUFkZE11bHRpcGxlKCkKCkFkZHMgbXVsdGlwbGUgaGlzdG9yeSBlbnRyaWVzIHRvIHRoZSBoaXN0b3J5LiBSZXR1cm5zIDEgb24gc3VjY2VzcywgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlBZGRNdWx0aXBsZSgKICAgICAgICBEYXRhID0+IFxASGlzdG9yeUFkZERhdGEsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlBZGRNdWx0aXBsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIERhdGEhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEYXRhIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggIUB7ICRQYXJhbXtEYXRhfSB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRGF0YSBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVmaW5lIGRhdGFiYXNlIHNwZWNpZmljIFNRTCBmb3IgdGhlIG11bHRpbGluZSBpbnNlcnRzCiAgICBteSAlRGF0YWJhc2VTUUw7CgogICAgIyBteXNxbAogICAgJERhdGFiYXNlU1FMe215c3FsfSA9IHsKICAgICAgICBTdGFydCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX2hpc3RvcnkgKCBjaGFuZ2VfaWQsIHdvcmtvcmRlcl9pZCwgY29udGVudF9uZXcsICcKICAgICAgICAgICAgLiAnY29udGVudF9vbGQsIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHR5cGVfaWQsIGZpZWxkbmFtZSApICcsCiAgICAgICAgRmlyc3RMaW5lID0+ICdWQUxVRVMgKCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPyApJywKICAgICAgICBOZXh0TGluZSAgPT4gJywgKCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPyApICcsCiAgICAgICAgRW5kICAgICAgID0+ICcnLAogICAgfTsKCiAgICAjIHBvc3RncmVzIDguMiBhbmQgbmV3ZXIgKHNhbWUgU1FMIGNvZGUgYXMgZm9yIG15c3FsKQogICAgJERhdGFiYXNlU1FMe3Bvc3RncmVzfSA9ICREYXRhYmFzZVNRTHtteXNxbH07CgogICAgIyBvcmFjbGUKICAgICREYXRhYmFzZVNRTHtvcmFjbGV9ID0gewogICAgICAgIFN0YXJ0ICAgICA9PiAnSU5TRVJUIEFMTCAnLAogICAgICAgIEZpcnN0TGluZSA9PiAnSU5UTyBjaGFuZ2VfaGlzdG9yeSAoIGNoYW5nZV9pZCwgd29ya29yZGVyX2lkLCBjb250ZW50X25ldywgJwogICAgICAgICAgICAuICdjb250ZW50X29sZCwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdHlwZV9pZCwgZmllbGRuYW1lICkgICcKICAgICAgICAgICAgLiAnVkFMVUVTICggPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8gKSAnLAogICAgICAgIE5leHRMaW5lID0+ICdJTlRPIGNoYW5nZV9oaXN0b3J5ICggY2hhbmdlX2lkLCB3b3Jrb3JkZXJfaWQsIGNvbnRlbnRfbmV3LCAnCiAgICAgICAgICAgIC4gJ2NvbnRlbnRfb2xkLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB0eXBlX2lkLCBmaWVsZG5hbWUgKSAgJwogICAgICAgICAgICAuICdWQUxVRVMgKCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPyApICcsCiAgICAgICAgRW5kID0+ICdTRUxFQ1QgKiBGUk9NIERVQUwnLAogICAgfTsKCiAgICAjIGdldCB0aGUgZGF0YWJhc2UgdHlwZQogICAgbXkgJERCVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdUeXBlJyk7CgogICAgIyBtYWtlIG11bHRpbGluZSBpbnNlcnRzIGZvciBkZWZpbmVkIGRhdGFiYXNlcwogICAgaWYgKCAkRGF0YWJhc2VTUUx7JERCVHlwZX0gKSB7CgogICAgICAgIG15ICRTUUwgPSAnJzsKICAgICAgICBteSBAQmluZDsKCiAgICAgICAgSElTVE9SWUVOVFJZOgogICAgICAgIGZvciBteSAkSGlzdG9yeUVudHJ5ICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAjIENoYW5nZUlEIGlzIGFsd2F5cyBuZWVkZWQsIHdvcmtvcmRlciBpZCBpcyBvbmx5IG5lZWRlZCBmb3Igd29ya29yZGVyIGV2ZW50cwogICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIENoYW5nZUlEKSkgewogICAgICAgICAgICAgICAgaWYgKCAhJEhpc3RvcnlFbnRyeS0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEhJU1RPUllFTlRSWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhKCAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9IHx8ICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZUlEfSApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBIaXN0b3J5VHlwZSBvciBIaXN0b3J5VHlwZUlEIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBISVNUT1JZRU5UUlk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGhpc3RvcnkgdHlwZSBpZCBmcm9tIGhpc3RvcnkgdHlwZSBpZiBoaXN0b3J5IHR5cGUgaXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9ICkgewoKICAgICAgICAgICAgICAgICMgbG9va3VwIHRoZSBoaXN0b3J5IHR5cGUgaWQKICAgICAgICAgICAgICAgIG15ICRJRCA9ICRTZWxmLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG5vIHZhbGlkIGhpc3RvcnkgdHlwZSBnaXZlbgogICAgICAgICAgICAgICAgaWYgKCAhJElEICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBoaXN0b3J5IHR5cGUgJyRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX0nIGdpdmVuISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEhJU1RPUllFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGVJRH0gPSAkSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbm93IHRoZSBoaXN0b3J5IGVudHJ5IGlzIHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFkZGVkIHRvIHNxbAogICAgICAgICAgICBpZiAoICEkU1FMICkgewogICAgICAgICAgICAgICAgJFNRTCA9ICREYXRhYmFzZVNRTHskREJUeXBlfS0+e1N0YXJ0fSAuICREYXRhYmFzZVNRTHskREJUeXBlfS0+e0ZpcnN0TGluZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMIC49ICREYXRhYmFzZVNRTHskREJUeXBlfS0+e05leHRMaW5lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IGFycmF5IHBhcmFtcwogICAgICAgICAgICBDT05URU5UOgogICAgICAgICAgICBmb3IgbXkgJENvbnRlbnQgKHF3KENvbnRlbnROZXcgQ29udGVudE9sZCkpIHsKICAgICAgICAgICAgICAgIG5leHQgQ09OVEVOVCBpZiByZWYgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50fSBuZSAnQVJSQVknOwogICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50fSA9IGpvaW4gJywgJywgQHsgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50fSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBCaW5kLCAoCiAgICAgICAgICAgICAgICBcJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIFwkSGlzdG9yeUVudHJ5LT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgXCRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSwKICAgICAgICAgICAgICAgIFwkSGlzdG9yeUVudHJ5LT57Q29udGVudE9sZH0sCiAgICAgICAgICAgICAgICBcJEhpc3RvcnlFbnRyeS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBcJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlSUR9LAogICAgICAgICAgICAgICAgXCRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBTUUwgc3RyaW5nCiAgICAgICAgICAgICMgKHNvbWUgZGF0YWJhc2VzIG9ubHkgYWNjZXB0IFNRTCBzdHJpbmdzIHVwIHRvIDRrLAogICAgICAgICAgICAjIHNvIHdlIHdhbnQgdG8gc3RheSBzYWZlIGhlcmUgd2l0aCBqdXN0IDM1MDAgYnl0ZXMpCiAgICAgICAgICAgIGlmICggbGVuZ3RoICRTUUwgPiAzNTAwICkgewoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBlbmQgbGluZSB0byBzcWwgc3RyaW5nCiAgICAgICAgICAgICAgICAkU1FMIC49ICREYXRhYmFzZVNRTHskREJUeXBlfS0+e0VuZH07CgogICAgICAgICAgICAgICAgIyBpbnNlcnQgbXVsdGlwbGUgaGlzdG9yeSBlbnRyaWVzCiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVzZXQgdGhlIFNRTCBzdHJpbmcgYW5kIHRoZSBCaW5kIGFycmF5CiAgICAgICAgICAgICAgICAkU1FMICA9ICcnOwogICAgICAgICAgICAgICAgQEJpbmQgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBpcyBzb21lIFNRTCBsZWZ0IHRvIGV4ZWN1dGUKICAgICAgICBpZiAoJFNRTCkgewoKICAgICAgICAgICAgIyBhZGQgdGhlIGVuZCBsaW5lIHRvIHNxbCBzdHJpbmcKICAgICAgICAgICAgJFNRTCAuPSAkRGF0YWJhc2VTUUx7JERCVHlwZX0tPntFbmR9OwoKICAgICAgICAgICAgIyBpbnNlcnQgbXVsdGlwbGUgaGlzdG9yeSBlbnRyaWVzCiAgICAgICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGF0YWJhc2Ugc3VwcG9ydHMgbm8gbXVsdGlsaW5lIGluc2VydHMsIHNvIHdlIGRvIGl0IGxpbmUgYnkgbGluZQogICAgZWxzZSB7CgogICAgICAgIG15ICRFcnJvcjsKICAgICAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoIEB7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgaGlzdG9yeSBlbnRyaWVzIG9uZSBieSBvbmUgd2l0aCB0aGUgSGlzdG9yeUFkZCBmdW5jdGlvbgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgJXskSGlzdG9yeUVudHJ5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgJEVycm9yOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgV29ya09yZGVySGlzdG9yeUdldCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgaGlzdG9yeSBlbnRyaWVzIHRoYXQgYmVsb25nIHRvIHRoZSBnaXZlbiBXb3JrT3JkZXJJRC4gVGhlCmxpc3QgY29udGFpbnMgaGFzaCByZWZlcmVuY2VzIHdpdGggdGhlc2UgaW5mb3JtYXRpb246CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDaGFuZ2VJRH0KICAgICRJbmZve1dvcmtPcmRlcklEfQogICAgJEluZm97SGlzdG9yeVR5cGV9CiAgICAkSW5mb3tIaXN0b3J5VHlwZUlEfQogICAgJEluZm97RmllbGRuYW1lfQogICAgJEluZm97Q29udGVudE5ld30KICAgICRJbmZve0NvbnRlbnRPbGR9CiAgICAkSW5mb3tDcmVhdGVCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRIaXN0b3J5RW50cmllcyA9ICRIaXN0b3J5T2JqZWN0LT5Xb3JrT3JkZXJIaXN0b3J5R2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJIaXN0b3J5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoV29ya09yZGVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIHRoZSBzcWwgc3RhdGVtZW50IHRvIGdldCBoaXN0b3J5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoLmlkLCBjaGFuZ2VfaWQsIHdvcmtvcmRlcl9pZCwgY29udGVudF9uZXcsIGNvbnRlbnRfb2xkLCAnCiAgICAgICAgICAgIC4gJ2NoLmNyZWF0ZV9ieSwgY2guY3JlYXRlX3RpbWUsIHR5cGVfaWQsIGNodC5uYW1lLCBmaWVsZG5hbWUgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9oaXN0b3J5IGNoLCBjaGFuZ2VfaGlzdG9yeV90eXBlIGNodCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoLnR5cGVfaWQgPSBjaHQuaWQgJwogICAgICAgICAgICAuICdBTkQgd29ya29yZGVyX2lkID0gPyBPUkRFUiBCWSBjaC5jcmVhdGVfdGltZSwgY2guaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1dvcmtPcmRlcklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSBlbnRyaWVzIGFuZCBzYXZlIGluZm9ybWF0aW9uIGluIGFycmF5CiAgICBteSBASGlzdG9yeUVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVIaXN0b3J5RW50cnkgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIENvbnRlbnROZXcgICAgID0+IGRlZmluZWQoICRSb3dbM10gKSA/ICRSb3dbM10gOiAnJywKICAgICAgICAgICAgQ29udGVudE9sZCAgICAgPT4gZGVmaW5lZCggJFJvd1s0XSApID8gJFJvd1s0XSA6ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBIaXN0b3J5VHlwZUlEICA9PiAkUm93WzddLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBGaWVsZG5hbWUgICAgICA9PiAkUm93WzldLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEhpc3RvcnlFbnRyaWVzLCBcJUhpc3RvcnlFbnRyeTsKICAgIH0KCiAgICAjIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzZXIgd2hvIGNyZWF0ZWQgZW50cnkKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5IChASGlzdG9yeUVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBuYW1lCiAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRIaXN0b3J5RW50cnktPntDcmVhdGVCeX0sCiAgICAgICAgICAgIENhY2hlICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB1c2VyIGluZm8gaW4gaGlzdG9yeSBlbnRyeQogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlcklEfSAgICAgICAgPSAkVXNlcntVc2VySUR9OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckZpcnN0bmFtZX0gPSAkVXNlcntVc2VyRmlyc3RuYW1lfTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJMYXN0bmFtZX0gID0gJFVzZXJ7VXNlckxhc3RuYW1lfTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJGdWxsbmFtZX0gID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASGlzdG9yeUVudHJpZXM7Cn0KCj1oZWFkMiBDaGFuZ2VIaXN0b3J5R2V0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBoaXN0b3J5IGVudHJpZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGdpdmVuIENoYW5nZUlEIC0gaW5jbHVkaW5nCmhpc3RvcnkgZW50cmllcyBmb3IgQzx3b3Jrb3JkZXJzPi4gVGhlIGxpc3QgY29udGFpbnMgaGFzaCByZWZlcmVuY2VzIHdpdGggdGhlc2UgaW5mb3JtYXRpb246CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDaGFuZ2VJRH0KICAgICRJbmZve1dvcmtPcmRlcklEfQogICAgJEluZm97SGlzdG9yeVR5cGV9CiAgICAkSW5mb3tIaXN0b3J5VHlwZUlEfQogICAgJEluZm97RmllbGRuYW1lfQogICAgJEluZm97Q29udGVudE5ld30KICAgICRJbmZve0NvbnRlbnRPbGR9CiAgICAkSW5mb3tDcmVhdGVCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRIaXN0b3J5RW50cmllcyA9ICRIaXN0b3J5T2JqZWN0LT5DaGFuZ2VIaXN0b3J5R2V0KAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VIaXN0b3J5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIHRoZSBzcWwgc3RhdGVtZW50IHRvIGdldCBoaXN0b3J5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoLmlkLCBjaGFuZ2VfaWQsIHdvcmtvcmRlcl9pZCwgY29udGVudF9uZXcsIGNvbnRlbnRfb2xkLCAnCiAgICAgICAgICAgIC4gJ2NoLmNyZWF0ZV9ieSwgY2guY3JlYXRlX3RpbWUsIHR5cGVfaWQsIGNodC5uYW1lLCBmaWVsZG5hbWUgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9oaXN0b3J5IGNoLCBjaGFuZ2VfaGlzdG9yeV90eXBlIGNodCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoLnR5cGVfaWQgPSBjaHQuaWQgJwogICAgICAgICAgICAuICdBTkQgY2hhbmdlX2lkID0gPyBPUkRFUiBCWSBjaC5jcmVhdGVfdGltZSwgY2guaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSBlbnRyaWVzIGFuZCBzYXZlIGluZm9ybWF0aW9uIGluIGFycmF5CiAgICBteSBASGlzdG9yeUVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVIaXN0b3J5RW50cnkgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIENvbnRlbnROZXcgICAgID0+IGRlZmluZWQoICRSb3dbM10gKSA/ICRSb3dbM10gOiAnJywKICAgICAgICAgICAgQ29udGVudE9sZCAgICAgPT4gZGVmaW5lZCggJFJvd1s0XSApID8gJFJvd1s0XSA6ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBIaXN0b3J5VHlwZUlEICA9PiAkUm93WzddLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBGaWVsZG5hbWUgICAgICA9PiAkUm93WzldLAogICAgICAgICk7CgogICAgICAgICMgY2xlYW51cCB0aW1lIHN0YW1wcyAoc29tZSBkYXRhYmFzZXMgYXJlIHVzaW5nIGUuIGcuIDIwMDgtMDItMjUgMjI6MDM6MDAuMDAwMDAwKQogICAgICAgICRIaXN0b3J5RW50cnl7Q3JlYXRlVGltZX0KICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwoKICAgICAgICBwdXNoIEBIaXN0b3J5RW50cmllcywgXCVIaXN0b3J5RW50cnk7CiAgICB9CgogICAgIyBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2VyIHdobyBjcmVhdGVkIGVudHJ5CiAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoQEhpc3RvcnlFbnRyaWVzKSB7CgogICAgICAgICMgZ2V0IHVzZXIgbmFtZQogICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSGlzdG9yeUVudHJ5LT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdXNlciBpbmZvIGluIGhpc3RvcnkgZW50cnkKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJJRH0gICAgICAgID0gJFVzZXJ7VXNlcklEfTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJMb2dpbn0gICAgID0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJGaXJzdG5hbWV9ID0gJFVzZXJ7VXNlckZpcnN0bmFtZX07CiAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntVc2VyTGFzdG5hbWV9ICA9ICRVc2Vye1VzZXJMYXN0bmFtZX07CiAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntVc2VyRnVsbG5hbWV9ICA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcQEhpc3RvcnlFbnRyaWVzOwp9Cgo9aGVhZDIgSGlzdG9yeUVudHJ5R2V0KCkKClJldHVybnMgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeS4gVGhlIGhhc2ggcmVmZXJlbmNlIGhhcyB0aGVzZSBpbmZvcm1hdGlvbjoKCiAgICAkSW5mb3tIaXN0b3J5RW50cnlJRH0KICAgICRJbmZve0NoYW5nZUlEfQogICAgJEluZm97V29ya09yZGVySUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tGaWVsZG5hbWV9CiAgICAkSW5mb3tDb250ZW50TmV3fQogICAgJEluZm97Q29udGVudE9sZH0KICAgICRJbmZve0NyZWF0ZUJ5fQogICAgJEluZm97Q3JlYXRlVGltZX0KICAgICRJbmZve1VzZXJJRH0KICAgICRJbmZve1VzZXJMb2dpbn0KICAgICRJbmZve1VzZXJMYXN0bmFtZX0KICAgICRJbmZve1VzZXJGaXJzdG5hbWV9CiAgICAkSW5mb3tVc2VyRnVsbG5hbWV9CgogICAgbXkgJEhpc3RvcnlFbnRyeSA9ICRIaXN0b3J5T2JqZWN0LT5IaXN0b3J5RW50cnlHZXQoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlFbnRyeUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KEhpc3RvcnlFbnRyeUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biB0aGUgc3FsIHN0YXRlbWVudCB0byBnZXQgaGlzdG9yeQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjaC5pZCwgY2hhbmdlX2lkLCB3b3Jrb3JkZXJfaWQsIGNvbnRlbnRfbmV3LCBjb250ZW50X29sZCwgJwogICAgICAgICAgICAuICdjaC5jcmVhdGVfYnksIGNoLmNyZWF0ZV90aW1lLCB0eXBlX2lkLCBjaHQubmFtZSwgZmllbGRuYW1lICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2VfaGlzdG9yeSBjaCwgY2hhbmdlX2hpc3RvcnlfdHlwZSBjaHQgJwogICAgICAgICAgICAuICdXSEVSRSBjaC50eXBlX2lkID0gY2h0LmlkICcKICAgICAgICAgICAgLiAnQU5EIGNoLmlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SGlzdG9yeUVudHJ5SUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIGVudHJpZXMgYW5kIHNhdmUgaW5mb3JtYXRpb24gaW4gYXJyYXkKICAgIG15ICVIaXN0b3J5RW50cnk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVIaXN0b3J5RW50cnkgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIENvbnRlbnROZXcgICAgID0+ICRSb3dbM10sCiAgICAgICAgICAgIENvbnRlbnRPbGQgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgID0+ICRSb3dbN10sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIEZpZWxkbmFtZSAgICAgID0+ICRSb3dbOV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICAgICAgJEhpc3RvcnlFbnRyeXtDcmVhdGVUaW1lfQogICAgICAgICAgICA9fiBzeyBcQSAoIFxkXGRcZFxkIC0gXGRcZCAtIFxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgKSBcLiAuKz8gXHogfXskMX14bXM7CiAgICB9CgogICAgIyBnZXQgdXNlciBuYW1lCiAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSGlzdG9yeUVudHJ5e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZSAgPT4gMSwKICAgICk7CgogICAgIyBzYXZlIHVzZXIgaW5mbyBpbiBoaXN0b3J5IGVudHJ5CiAgICBpZiAoJVVzZXIpIHsKICAgICAgICAkSGlzdG9yeUVudHJ5e1VzZXJJRH0gICAgICAgID0gJFVzZXJ7VXNlcklEfTsKICAgICAgICAkSGlzdG9yeUVudHJ5e1VzZXJMb2dpbn0gICAgID0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAkSGlzdG9yeUVudHJ5e1VzZXJGaXJzdG5hbWV9ID0gJFVzZXJ7VXNlckZpcnN0bmFtZX07CiAgICAgICAgJEhpc3RvcnlFbnRyeXtVc2VyTGFzdG5hbWV9ICA9ICRVc2Vye1VzZXJMYXN0bmFtZX07CiAgICAgICAgJEhpc3RvcnlFbnRyeXtVc2VyRnVsbG5hbWV9ICA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICB9CgogICAgcmV0dXJuIFwlSGlzdG9yeUVudHJ5Owp9Cgo9aGVhZDIgV29ya09yZGVySGlzdG9yeURlbGV0ZSgpCgpEZWxldGVzIGFsbCBlbnRyaWVzIGluIGhpc3RvcnkgdGFibGUgdGhhdCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBXb3JrT3JkZXJJRC4KVGhlIG1ldGhvZCByZXR1cm5zIDEgb24gc3VjY2VzcyBhbmQgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEhpc3RvcnlPYmplY3QtPldvcmtPcmRlckhpc3RvcnlEZWxldGUoCiAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckhpc3RvcnlEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZW50cmllcyBmb3IgdGhlIGdpdmVuIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX2hpc3RvcnkgV0hFUkUgd29ya29yZGVyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9IF0sCiAgICApOwoKICAgICMgc3VjY2VzcwogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDaGFuZ2VIaXN0b3J5RGVsZXRlKCkKCkRlbGV0ZXMgYWxsIGVudHJpZXMgaW4gaGlzdG9yeSB0YWJsZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIENoYW5nZUlELgpUaGUgbWV0aG9kIHJldHVybnMgMSBvbiBzdWNjZXNzIGFuZCBDPHVuZGVmPiBvdGhlcndpc2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkSGlzdG9yeU9iamVjdC0+Q2hhbmdlSGlzdG9yeURlbGV0ZSgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBlbnRyaWVzIGZvciB0aGUgZ2l2ZW4gY2hhbmdlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2VfaGlzdG9yeSBXSEVSRSBjaGFuZ2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICk7CgogICAgIyBzdWNjZXNzCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEhpc3RvcnlVcGRhdGUoKQoKVGhpcyBtZXRob2QgdXBkYXRlcyBhIGhpc3RvcnkgZW50cnkuIEl0IHJldHVybnMgMSBvbiBzdWNjZXNzLCBhbmQgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlVcGRhdGUoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gMTIzLAogICAgICAgIFdvcmtPcmRlcklEICAgID0+IDM0NTEsICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIENoYW5nZUlEICAgICAgID0+IDEyMzUsICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIENvbnRlbnROZXcgICAgID0+ICduZXcgdmFsdWUnLCAgIyBvcHRpb25hbAogICAgICAgIENvbnRlbnRPbGQgICAgID0+ICdvbGQgdmFsdWUnLCAgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhIaXN0b3J5RW50cnlJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSBlbnRyeSBpZCBhbmQgdXNlciBpZAogICAgbXkgJEhpc3RvcnlFbnRyeUlEID0gZGVsZXRlICRQYXJhbXtIaXN0b3J5RW50cnlJRH07CiAgICBteSAkVXNlcklEICAgICAgICAgPSBkZWxldGUgJFBhcmFte1VzZXJJRH07CgogICAgIyB3ZSBoYXZlIHRvIHVwZGF0ZSBhdCBsZWFzdCBvbmUgY29sdW1uCiAgICBpZiAoICFrZXlzICVQYXJhbSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgYXQgbGVhc3Qgb25lIGNvbHVtbiB0byB1cGRhdGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdoYXQgY29sdW1ucyBzaG91bGQgYmUgdXBkYXRlZAogICAgbXkgQENvbHVtbnMgPSBrZXlzICVQYXJhbTsKICAgIG15IEBCaW5kOwoKICAgICMgZ2V0IGJpbmQgdmFyaWFibGVzCiAgICBmb3IgbXkgJENvbHVtbiAoQENvbHVtbnMpIHsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFteyRDb2x1bW59OwogICAgfQoKICAgICMgZ2V0IGJpbmQgc3RyaW5nCiAgICBteSAlUGFyYW1LZXkyQ29sdW1uTmFtZSA9ICgKICAgICAgICBDaGFuZ2VJRCAgICAgID0+ICdjaGFuZ2VfaWQnLAogICAgICAgIFdvcmtPcmRlcklEICAgPT4gJ3dvcmtvcmRlcl9pZCcsCiAgICAgICAgQ29udGVudE5ldyAgICA9PiAnY29udGVudF9uZXcnLAogICAgICAgIENvbnRlbnRPbGQgICAgPT4gJ2NvbnRlbnRfb2xkJywKICAgICAgICBIaXN0b3J5VHlwZUlEID0+ICd0eXBlX2lkJywKICAgICAgICBGaWVsZG5hbWUgICAgID0+ICdmaWVsZG5hbWUnLAogICAgKTsKICAgIG15ICRCaW5kcyA9IGpvaW4gJywgJywgbWFwIHsgJFBhcmFtS2V5MkNvbHVtbk5hbWV7JF99IC4gJyA9ID8gJyB9IEBDb2x1bW5zOwoKICAgICMgZG8gdGhlIHVwZGF0ZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgY2hhbmdlX2hpc3RvcnkgU0VUICcgLiAkQmluZHMgLiAnICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgQEJpbmQsIFwkSGlzdG9yeUVudHJ5SUQgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBIaXN0b3J5U2VhcmNoKCkKClNlYXJjaGVzIGZvciBjaGFuZ2VzL0M8d29ya29yZGVycz4gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzZWFyY2ggY3JpdGVyaWEuIEl0IHJldHVybnMKYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggY2hhbmdlIG9yIEM8d29ya29yZGVyPiBJRHMuIElmICJSZXN1bHQgPT4gJ0NPVU5UJyIgdGhlbiB0aGUKbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMgaXMgcmV0dXJuZWQuCgogICAgbXkgJElEcyA9ICRIaXN0b3J5T2JqZWN0LT5IaXN0b3J5U2VhcmNoKAogICAgICAgIFR5cGUgICAgICAgICAgICAgICAgPT4gJ0NoYW5nZScsICAgICAgICMgQ2hhbmdlfFdvcmtvcmRlciB3aGljaCBJRHMgc2hvdWxkIGJlIHJldHVybmVkCiAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgIE9sZFZhbHVlcyAgICAgICAgICAgPT4gWyAncmVqZWN0ZWQnIF0sICMgb3B0aW9uYWwgLSBPbGRWYWx1ZXMgT1IgTmV3VmFsdWVzIGlzIG5lZWRlZAogICAgICAgIE5ld1ZhbHVlcyAgICAgICAgICAgPT4gWyAnYXBwcm92ZWQnIF0sICMgb3B0aW9uYWwgLSBPbGRWYWx1ZXMgT1IgTmV3VmFsdWVzIGlzIG5lZWRlZAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gWyAxLCAyLCAzIF0sICAgICMgb3B0aW9uYWwKICAgICAgICBDaGFuZ2VEYXRlTmV3ZXJEYXRlID0+ICcyMDA5LTAxLTEzIDAwOjAwOjAxJywgI29wdGlvbmFsCiAgICAgICAgQ2hhbmdlRGF0ZU9sZGVyRGF0ZSA9PiAnMjAwOS0wMS0xMyAwMDowMDowMScsICNvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2luZ1dpbGRjYXJkcyAgICAgID0+IDAsICAgICAgICAgICAgICAjIDB8MSAtIGRlZmF1bHQgMQogICAgICAgIFJlc3VsdCAgICAgICAgICAgICAgPT4gJ0FSUkFZJywgICAgICAgICMgQVJSQVl8Q09VTlQgLSBkZWZhdWx0IEFSUkFZCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhUeXBlIEF0dHJpYnV0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB2ZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBPbGRWYWx1ZXMKICAgICAgICBOZXdWYWx1ZXMKICAgICAgICBDaGFuZ2VCeQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSAlU3RyaW5nUGFyYW1zID0gKAoKICAgICAgICAjIHN0cmluZ3MgaW4gY2hhbmdlX2hpc3RvcnkKICAgICAgICBBdHRyaWJ1dGUgPT4gJ2NoLmZpZWxkbmFtZScsCiAgICApOwoKICAgICMgYWRkIHN0cmluZyBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBTVFJJTkdQQVJBTToKICAgIGZvciBteSAkU3RyaW5nUGFyYW0gKCBzb3J0IGtleXMgJVN0cmluZ1BhcmFtcyApIHsKCiAgICAgICAgIyBjaGVjayBzdHJpbmcgcGFyYW1zIGZvciB1c2VmdWwgdmFsdWVzLCB0aGUgc3RyaW5nICcwJyBpcyBhbGxvd2VkCiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAhZXhpc3RzICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWRlZmluZWQgJFBhcmFteyRTdHJpbmdQYXJhbX07CiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSBlcSAnJzsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17JFN0cmluZ1BhcmFtfSApOwoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgICAgICAgICAgbXkgJExpa2VFc2NhcGVTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+R2V0RGF0YWJhc2VGdW5jdGlvbignTGlrZUVzY2FwZVN0cmluZycpOwoKICAgICAgICAgICAgIyBRdW90ZQogICAgICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0sICdMaWtlJyApOwoKICAgICAgICAgICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBzdHJpbmcgcGFyYW1zIHdoaWNoIGNvbnRhaW4gb25seSAlCiAgICAgICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gPX4gbXsgXEEgJSogXHogfXhtczsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgIkxPV0VSKCRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSkgTElLRSBMT1dFUignJFBhcmFteyRTdHJpbmdQYXJhbX0nKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQoKICAgICAgICAjIG5vIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pID0gTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBhcnJheSBwYXJhbXMKICAgIG15ICVBcnJheVBhcmFtcyA9ICgKICAgICAgICBPbGRWYWx1ZXMgPT4gJ2NoLmNvbnRlbnRfb2xkJywKICAgICAgICBOZXdWYWx1ZXMgPT4gJ2NoLmNvbnRlbnRfbmV3JywKICAgICAgICBDaGFuZ2VCeSAgPT4gJ2NoLmNyZWF0ZV9ieScsCiAgICApOwoKICAgICMgYWRkIGFycmF5IHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBzb3J0IGtleXMgJUFycmF5UGFyYW1zICkgewoKICAgICAgICAjIGlnbm9yZSBlbXB0eSBsaXN0cwogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfSApIHsKICAgICAgICAgICAgJE9uZVBhcmFtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCRPbmVQYXJhbSk7CgogICAgICAgICAgICAjIGZvciBzdHJpbmdzIHdlIG5lZWQgc2luZ2xlIHF1b3RlcwogICAgICAgICAgICBpZiAoICRPbmVQYXJhbSAhfiBteyBcQSBbKy1dPyBcZCsgKD86XC5cZCspPyBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJE9uZVBhcmFtID0gIickT25lUGFyYW0nIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyRBcnJheVBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBzZXQgdGltZSBwYXJhbXMKICAgIG15ICVUaW1lUGFyYW1zID0gKAoKICAgICAgICAjIHRpbWVzIGluIGNoYW5nZV9oaXN0b3J5CiAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnY2guY3JlYXRlX3RpbWUgPj0nLAogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgPT4gJ2NoLmNyZWF0ZV90aW1lIDw9JywKICAgICk7CgogICAgIyBjaGVjayBhbmQgYWRkIHRpbWUgcGFyYW1zIHRvIFdIRVJFCiAgICBUSU1FUEFSQU06CiAgICBmb3IgbXkgJFRpbWVQYXJhbSAoIHNvcnQga2V5cyAlVGltZVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBUSU1FUEFSQU0gaWYgISRQYXJhbXskVGltZVBhcmFtfTsKCiAgICAgICAgaWYgKCAkUGFyYW17JFRpbWVQYXJhbX0gIX4gbXsgXEEgXGRcZFxkXGQtXGRcZC1cZFxkIFxzIFxkXGQ6XGRcZDpcZFxkIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICRUaW1lUGFyYW0gaGFzIGFuIGludmFsaWQgZGF0ZSBmb3JtYXQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRQYXJhbXskVGltZVBhcmFtfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJFBhcmFteyRUaW1lUGFyYW19ICk7CgogICAgICAgICMgdGhlIHRpbWUgYXR0cmlidXRlcyBvZiBjaGFuZ2VfaGlzdG9yeSBzaG93IHVwIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRUaW1lUGFyYW1zeyRUaW1lUGFyYW19ICckUGFyYW17JFRpbWVQYXJhbX0nIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkVHlwZSA9IGxjICRQYXJhbXtUeXBlfTsKICAgIG15ICRTUUwgID0gIlNFTEVDVCBESVNUSU5DVCBjaC4ke1R5cGV9X2lkIEZST00gY2hhbmdlX2hpc3RvcnkgY2ggIjsKCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICAkU1FMID0gIlNFTEVDVCBDT1VOVCggRElTVElOQ1QoIGNoLiR7VHlwZX1faWQgKSApIEZST00gY2hhbmdlX2hpc3RvcnkgY2ggIjsKICAgIH0KCiAgICAjIGFkZCB0aGUgV0hFUkUgY2xhdXNlCiAgICBpZiAoQFNRTFdoZXJlKSB7CiAgICAgICAgJFNRTCAuPSAnV0hFUkUgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgICMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgIGRlbGV0ZSAkUGFyYW17TGltaXR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBJRHMsICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgcmV0dXJuIHRoZSBDT1VOVChjLmlkKSBhdHRyaWJ1dGUKICAgICAgICByZXR1cm4gJElEc1swXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEhpc3RvcnlUeXBlTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlCmlkIGlzIHJldHVybmVkLgoKICAgIG15ICROYW1lID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJElEID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlID0+ICdXb3JrT3JkZXJBZGQnLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5VHlwZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0hpc3RvcnlUeXBlSUR9ICYmICEkUGFyYW17SGlzdG9yeVR5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBIaXN0b3J5VHlwZUlEIG9yIEhpc3RvcnlUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBib3RoIHZhbGlkIGtleXMgYXJlIGdpdmVuLCByZXR1cm4KICAgIGlmICggJFBhcmFte0hpc3RvcnlUeXBlSUR9ICYmICRQYXJhbXtIaXN0b3J5VHlwZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBIaXN0b3J5VHlwZUlEIE9SIEhpc3RvcnlUeXBlIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgb3V0IHdoYXQgdGhlIHVzZWQga2V5IGlzCiAgICBteSAkS2V5ID0gJ0hpc3RvcnlUeXBlJzsKCiAgICBpZiAoICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApIHsKICAgICAgICAkS2V5ID0gJ0hpc3RvcnlUeXBlSUQnOwogICAgfQoKICAgICMgY2hlY2sgdGhlIGNhY2hlCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJ0hpc3RvcnlUeXBlTG9va3VwOjonIC4gJEtleSAuICc6OicgLiAkUGFyYW17JEtleX0sCiAgICApOwoKICAgICMgaWYgcmVzdWx0IGlzIGNhY2hlZCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgc2V0IHRoZSBhcHByb3ByaWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gJ1NFTEVDVCBuYW1lIEZST00gY2hhbmdlX2hpc3RvcnlfdHlwZSBXSEVSRSBpZCA9ID8nOwoKICAgIGlmICggJEtleSBlcSAnSGlzdG9yeVR5cGUnICkgewogICAgICAgICRTUUwgPSAnU0VMRUNUIGlkIEZST00gY2hhbmdlX2hpc3RvcnlfdHlwZSBXSEVSRSBuYW1lID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZSBpbiBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJ0hpc3RvcnlUeXBlTG9va3VwOjonIC4gJEtleSAuICc6OicgLiAkUGFyYW17JEtleX0sCiAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aGVhZDIgSGlzdG9yeVR5cGVMaXN0KCkKCnJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggaGFzaCByZWZlcmVuY2VzLiBUaGUga2V5IG9mIHRoZSBoYXNoIHJlZmVyZW5jZSBpcyB0aGUgaWQKb2YgYW4gcmVjaXBpZW50IGFuZCB0aGUgbmFtZSBpcyB0aGUgdmFsdWUuCgo9Y3V0CgpzdWIgSGlzdG9yeVR5cGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0aGUgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnSGlzdG9yeVR5cGVMaXN0JywKICAgICk7CgogICAgIyBpZiByZXN1bHQgaXMgY2FjaGVkIHJldHVybiB0aGF0IHJlc3VsdAogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBwcmVwYXJlIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gY2hhbmdlX2hpc3RvcnlfdHlwZSBPUkRFUiBCWSBuYW1lJywKICAgICk7CgogICAgIyByZXRyaWV2ZSBkYXRhCiAgICBteSBASGlzdG9yeVR5cGVzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAkRW50cnkgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFZhbHVlID0+ICRSb3dbMV0sCiAgICAgICAgfTsKICAgICAgICBwdXNoIEBIaXN0b3J5VHlwZXMsICRFbnRyeTsKICAgIH0KCiAgICAjIHNhdmUgdmFsdWVzIGluIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAnSGlzdG9yeVR5cGVMaXN0JywKICAgICAgICBWYWx1ZSA9PiBcQEhpc3RvcnlUeXBlcywKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFxASGlzdG9yeVR5cGVzOwp9Cgo9aGVhZDIgSGlzdG9yeVN0cmluZ3NMaXN0KCkKClJldHVybnMgYSBoYXNoIG9mIGFsbCB0cmFuc2xhdGFibGUgaGlzdG9yeSBzdHJpbmdzLgoKPWN1dAoKc3ViIEhpc3RvcnlTdHJpbmdzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgRGVmaW5lIHRyYW5zbGF0YWJsZSBoaXN0b3J5IHN0cmluZ3MuCiAgICBteSAlSGlzdG9yeVN0cmluZ3MgPSAoCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkFkZCcgICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzOiAlcycpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpBY3Rpb25BZGRJRCcgICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOZXcgQWN0aW9uIChJRD0lcyknKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6QWN0aW9uRGVsZXRlJyAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWN0aW9uIChJRD0lcykgZGVsZXRlZCcpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpBY3Rpb25EZWxldGVBbGwnICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBbGwgQWN0aW9ucyBvZiBDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkV4ZWN1dGUnICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0FjdGlvbiAoSUQ9JXMpIGV4ZWN1dGVkOiAlcycpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpBY3Rpb25VcGRhdGUnICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCclcyAoQWN0aW9uIElEPSVzKTogKG5ldz0lcywgb2xkPSVzKScpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZCcgICAgPT4gVHJhbnNsYXRhYmxlKCdDaGFuZ2UgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBlbmQgdGltZS4nKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgc3RhcnQgdGltZS4nKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQWRkJyAgICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTmV3IENoYW5nZSAoSUQ9JXMpJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUF0dGFjaG1lbnRBZGQnICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05ldyBBdHRhY2htZW50OiAlcycpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBdHRhY2htZW50RGVsZXRlJyAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdEZWxldGVkIEF0dGFjaG1lbnQgJXMnKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCRGVsZXRlJyAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ0FCIERlbGV0ZWQgJXMnKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCVXBkYXRlJyAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnJXM6IChuZXc9JXMsIG9sZD0lcyknKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0FkZCcgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTGluayB0byAlcyAoSUQ9JXMpIGFkZGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUxpbmtEZWxldGUnICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0xpbmsgdG8gJXMgKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZU5vdGlmaWNhdGlvblNlbnQnICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbiBzZW50IHRvICVzIChFdmVudDogJXMpJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZCcgICA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSAoSUQ9JXMpIHJlYWNoZWQgcGxhbm5lZCBlbmQgdGltZS4nKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIHN0YXJ0IHRpbWUuJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJyAgICA9PiBUcmFuc2xhdGFibGUoJ0NoYW5nZSAoSUQ9JXMpIHJlYWNoZWQgcmVxdWVzdGVkIHRpbWUuJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVVwZGF0ZScgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzOiAobmV3PSVzLCBvbGQ9JXMpJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNvbmRpdGlvbkFkZCcgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzOiAlcycpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25BZGRJRCcgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOZXcgQ29uZGl0aW9uIChJRD0lcyknKSwKICAgICAgICAnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uRGVsZXRlJyAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ29uZGl0aW9uIChJRD0lcykgZGVsZXRlZCcpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25EZWxldGVBbGwnICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBbGwgQ29uZGl0aW9ucyBvZiBDaGFuZ2UgKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkNvbmRpdGlvblVwZGF0ZScgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzIChDb25kaXRpb24gSUQ9JXMpOiAobmV3PSVzLCBvbGQ9JXMpJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25BZGQnICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzOiAlcycpLAogICAgICAgICdDaGFuZ2VIaXN0b3J5OjpFeHByZXNzaW9uQWRkSUQnICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOZXcgRXhwcmVzc2lvbiAoSUQ9JXMpJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25EZWxldGUnICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0V4cHJlc3Npb24gKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25EZWxldGVBbGwnICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0FsbCBFeHByZXNzaW9ucyBvZiBDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25VcGRhdGUnICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJyVzIChFeHByZXNzaW9uIElEPSVzKTogKG5ldz0lcywgb2xkPSVzKScpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZCcgPT4gVHJhbnNsYXRhYmxlKCdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBlbmQgdGltZS4nKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnID0+CiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgZW5kIHRpbWUuJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnID0+CiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgc3RhcnQgdGltZS4nKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZFdpdGhXb3JrT3JkZXJJRCcgPT4KICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBzdGFydCB0aW1lLicpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBZGQnICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTmV3IFdvcmtvcmRlciAoSUQ9JXMpJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFkZFdpdGhXb3JrT3JkZXJJRCcgPT4gVHJhbnNsYXRhYmxlKCdOZXcgV29ya29yZGVyIChJRD0lcyknKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudEFkZCcgICAgICA9PiBUcmFuc2xhdGFibGUoJ05ldyBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnRBZGRXaXRoV29ya09yZGVySUQnID0+CiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnKElEPSVzKSBOZXcgQXR0YWNobWVudCBmb3IgV29ya09yZGVyOiAlcycpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlJyA9PiBUcmFuc2xhdGFibGUoJ0RlbGV0ZWQgQXR0YWNobWVudCBmcm9tIFdvcmtPcmRlcjogJXMnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudERlbGV0ZVdpdGhXb3JrT3JkZXJJRCcgPT4KICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCcoSUQ9JXMpIERlbGV0ZWQgQXR0YWNobWVudCBmcm9tIFdvcmtPcmRlcjogJXMnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUmVwb3J0QXR0YWNobWVudEFkZCcgPT4gVHJhbnNsYXRhYmxlKCdOZXcgUmVwb3J0IEF0dGFjaG1lbnQgZm9yIFdvcmtPcmRlcjogJXMnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUmVwb3J0QXR0YWNobWVudEFkZFdpdGhXb3JrT3JkZXJJRCcgPT4KICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCcoSUQ9JXMpIE5ldyBSZXBvcnQgQXR0YWNobWVudCBmb3IgV29ya09yZGVyOiAlcycpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50RGVsZXRlJyA9PgogICAgICAgICAgICBUcmFuc2xhdGFibGUoJ0RlbGV0ZWQgUmVwb3J0IEF0dGFjaG1lbnQgZnJvbSBXb3JrT3JkZXI6ICVzJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclJlcG9ydEF0dGFjaG1lbnREZWxldGVXaXRoV29ya09yZGVySUQnID0+CiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnKElEPSVzKSBEZWxldGVkIFJlcG9ydCBBdHRhY2htZW50IGZyb20gV29ya09yZGVyOiAlcycpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJEZWxldGUnICAgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciAoSUQ9JXMpIGRlbGV0ZWQnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyRGVsZXRlV2l0aFdvcmtPcmRlcklEJyAgICAgPT4gVHJhbnNsYXRhYmxlKCdXb3Jrb3JkZXIgKElEPSVzKSBkZWxldGVkJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckxpbmtBZGQnICAgICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnTGluayB0byAlcyAoSUQ9JXMpIGFkZGVkJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckxpbmtBZGRXaXRoV29ya09yZGVySUQnICAgID0+IFRyYW5zbGF0YWJsZSgnKElEPSVzKSBMaW5rIHRvICVzIChJRD0lcykgYWRkZWQnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0RlbGV0ZScgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdMaW5rIHRvICVzIChJRD0lcykgZGVsZXRlZCcpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJMaW5rRGVsZXRlV2l0aFdvcmtPcmRlcklEJyA9PiBUcmFuc2xhdGFibGUoJyhJRD0lcykgTGluayB0byAlcyAoSUQ9JXMpIGRlbGV0ZWQnKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTm90aWZpY2F0aW9uU2VudCcgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gc2VudCB0byAlcyAoRXZlbnQ6ICVzKScpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJOb3RpZmljYXRpb25TZW50V2l0aFdvcmtPcmRlcklEJyA9PgogICAgICAgICAgICBUcmFuc2xhdGFibGUoJyhJRD0lcykgTm90aWZpY2F0aW9uIHNlbnQgdG8gJXMgKEV2ZW50OiAlcyknKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkJyA9PgogICAgICAgICAgICBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciAoSUQ9JXMpIHJlYWNoZWQgcGxhbm5lZCBlbmQgdGltZS4nKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkV2l0aFdvcmtPcmRlcklEJyA9PgogICAgICAgICAgICBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciAoSUQ9JXMpIHJlYWNoZWQgcGxhbm5lZCBlbmQgdGltZS4nKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnID0+CiAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIHN0YXJ0IHRpbWUuJyksCiAgICAgICAgJ1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkV2l0aFdvcmtPcmRlcklEJyA9PgogICAgICAgICAgICBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciAoSUQ9JXMpIHJlYWNoZWQgcGxhbm5lZCBzdGFydCB0aW1lLicpLAogICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJVcGRhdGUnICAgICAgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnJXM6IChuZXc9JXMsIG9sZD0lcyknKSwKICAgICAgICAnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyVXBkYXRlV2l0aFdvcmtPcmRlcklEJyA9PiBUcmFuc2xhdGFibGUoJyhJRD0lcykgJXM6IChuZXc9JXMsIG9sZD0lcyknKSwKICAgICk7CgogICAgcmV0dXJuICVIaXN0b3J5U3RyaW5nczsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNU3RhdGVNYWNoaW5lLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01TdGF0ZU1hY2hpbmUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUgLSBzdGF0ZSBtYWNoaW5lIGxpYgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRTdGF0ZU1hY2hpbmVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCB0aGUgZGVidWcgZmxhZwogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBnZXQgdGhlIGNhY2hlIHR5cGUgYW5kIFRUTCAoaW4gc2Vjb25kcykKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdJVFNNU3RhdGVNYWNoaW5lJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6Q2FjaGVUVEwnKSAqIDYwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFN0YXRlVHJhbnNpdGlvbkFkZCgpCgpBZGQgYSBuZXcgc3RhdGUgdHJhbnNpdGlvbi4gUmV0dXJucyB0aGUgdHJhbnNpdGlvbiBpZCBvbiBzdWNjZXNzLgoKICAgIG15ICRUcmFuc2l0aW9uSUQgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IHN0YXRlCiAgICAgICAgTmV4dFN0YXRlSUQgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgYW4gZW5kIHN0YXRlCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHJhbnNpdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCBhbmQgTmV4dFN0YXRlSUQgYXJlIGdpdmVuICh0aGV5IGNhbiBiZSAwKQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU3RhdGVJRCBOZXh0U3RhdGVJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgY2xhc3MgaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGFyZSB6ZXJvCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtOZXh0U3RhdGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBjYW4ndCBib3RoIGJlIHplcm8hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlZmluZSBsb29rdXAgaGFzaCBmb3Igc3RhdGUgbmFtZQogICAgbXkgJVN0YXRlSUQyU3RhdGU7CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNsYXNzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQgTmV4dFN0YXRlSUQpKSB7CgogICAgICAgICRTdGF0ZUlEMlN0YXRleyAkUGFyYW17JEFyZ3VtZW50fSB9ID0gJFNlbGYtPlN0YXRlTG9va3VwKAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb250IGNoZWNrIHplcm8gdmFsdWVzCiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgbXkgJERhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaWQgYmVsb25ncyB0byBnaXZlbiBjbGFzcwogICAgICAgIGlmICggISREYXRhUmVmIHx8ICEleyREYXRhUmVmfSB8fCAkRGF0YVJlZi0+e0NsYXNzfSBuZSAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50ICRQYXJhbXskQXJndW1lbnR9IGlzIG5vdCBpbiB0aGUgY2xhc3MgJFBhcmFte0NsYXNzfSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYSBzdGF0ZSB0cmFuc2l0aW9uIHdpdGggdGhlIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGV4aXN0cyBhbHJlYWR5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgJwogICAgICAgICAgICAuICdXSEVSRSBzdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbmV4dF9zdGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtOZXh0U3RhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRUcmFuc2l0aW9uSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUcmFuc2l0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgZG8gbm90IGluc2VydCB0aGlzIHRyYW5zaXRpb24gdHdpY2UKICAgIHJldHVybiAkVHJhbnNpdGlvbklEIGlmICRUcmFuc2l0aW9uSUQ7CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGlzIGEgc3RhcnQgc3RhdGUgKD0wKSBhbmQgYW5vdGhlciBzdGFydCBzdGF0ZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCAhJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgZXhzdGluZyBzdGFydCBzdGF0ZXMgaW4gdGhlIGdpdmVuIGNsYXNzCiAgICAgICAgIyAoIHRoZSBzdGF0ZV9pZCAwIGluZGljYXRlcyB0aGF0IHRoZSBuZXh0X3N0YXRlX2lkIGlzIGEgc3RhcnQgc3RhdGUgKQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGNvdW50KHMuaWQpICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgcywgZ2VuZXJhbF9jYXRhbG9nIGcgJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgZy5nZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ0FORCBzLm5leHRfc3RhdGVfaWQgPSBnLmlkICcKICAgICAgICAgICAgICAgIC4gJ0FORCBzLnN0YXRlX2lkID0gMCcsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc30gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkQ291bnQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJENvdW50ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHN0YXJ0IHN0YXRlCiAgICAgICAgaWYgKCRDb3VudCkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBhZGQgc3RhdGUgJyRTdGF0ZUlEMlN0YXRleyRQYXJhbXtOZXh0U3RhdGVJRH19JyAiCiAgICAgICAgICAgICAgICAgICAgLiAiKElEOiAkUGFyYW17TmV4dFN0YXRlSUR9KSBhcyBzdGFydCBzdGF0ZS4gIgogICAgICAgICAgICAgICAgICAgIC4gIlRoZXJlIGlzIGFscmVhZHkgYSBzdGFydCBzdGF0ZSBkZWZpbmVkIGZvciBjbGFzcyAnJFBhcmFte0NsYXNzfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXZlbnQgc2V0dGluZyBhbiBlbmQgc3RhdGUgdHJhbnNpdGlvbiwgaWYgb3RoZXIgc3RhdGUgdHJhbnNpc3Rpb25zIGV4aXN0IGFscmVhZHkKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICYmICEkUGFyYW17TmV4dFN0YXRlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG90aGVyIHN0YXRlIHRyYW5zaXN0aW9ucyBleGlzdCBmb3IgdGhlIGdpdmVuIFN0YXRlSUQKICAgICAgICBteSAkTmV4dFN0YXRlSURzID0gJFNlbGYtPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGFueSBuZXh0IHN0YXRlcyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBzdGFydCBzdGF0ZQogICAgICAgIGlmICggJE5leHRTdGF0ZUlEcyAmJiBAeyROZXh0U3RhdGVJRHN9ICYmIHNjYWxhciBAeyROZXh0U3RhdGVJRHN9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBzZXQgc3RhdGUgIgogICAgICAgICAgICAgICAgICAgIC4gIickU3RhdGVJRDJTdGF0ZXskUGFyYW17U3RhdGVJRH19JyAoSUQ6ICRQYXJhbXtTdGF0ZUlEfSkgYXMgZW5kIHN0YXRlLCAiCiAgICAgICAgICAgICAgICAgICAgLiAiYmVjYXVzZSBvdGhlciBmb2xsb3dpbmcgc3RhdGVzIGV4aXN0LCB3aGljaCBtdXN0IGJlIGRlbGV0ZWQgZmlyc3QhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXZlbnQgdGhlIGFkZGluZyBvZiBvdGhlciBuZXh0IHN0YXRlcyBpZiBhbiBlbmQgc3RhdGUgaXMgYWxyZWFkeSBkZWZpbmVkCiAgICAjIGZvciB0aGlzIHN0YXJ0IHN0YXRlCiAgICBlbHNpZiAoICRQYXJhbXtTdGF0ZUlEfSAmJiAkUGFyYW17TmV4dFN0YXRlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG90aGVyIHN0YXRlIHRyYW5zaXN0aW9ucyBleGlzdCBmb3IgdGhlIGdpdmVuIFN0YXRlSUQKICAgICAgICBteSAkTmV4dFN0YXRlSURzID0gJFNlbGYtPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGVuZCBzdGF0ZSAoPTApIGRlZmluZWQgZm9yIHRoaXMgc3RhcnQgc3RhdGUKICAgICAgICBpZiAoICROZXh0U3RhdGVJRHMgJiYgQHskTmV4dFN0YXRlSURzfSAmJiAhJE5leHRTdGF0ZUlEcy0+WzBdICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhdGUgJyRTdGF0ZUlEMlN0YXRleyRQYXJhbXtTdGF0ZUlEfX0nICIKICAgICAgICAgICAgICAgICAgICAuICIoSUQ6ICRQYXJhbXtTdGF0ZUlEfSkgaXMgZGVmaW5lZCBhcyBhbiBlbmQgc3RhdGUsICIKICAgICAgICAgICAgICAgICAgICAuICJpdCBtdXN0IGJlIGRlbGV0ZWQgZmlyc3QsIGJlZm9yZSBuZXcgZm9sbG93aW5nIHN0YXRlcyBjYW4gYmUgYWRkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9zdGF0ZV9tYWNoaW5lICcKICAgICAgICAgICAgLiAnKHN0YXRlX2lkLCBuZXh0X3N0YXRlX2lkKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBUcmFuc2l0aW9uSUQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHN0YXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBuZXh0X3N0YXRlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte05leHRTdGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVHJhbnNpdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHN0YXRlIHRyYW5zaXRpb24gY291bGQgYmUgYWRkZWQKICAgIGlmICggISRUcmFuc2l0aW9uSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZVRyYW5zaXRpb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNsZWFudXAgc3RhdGVtYWNoaW5lIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICRUcmFuc2l0aW9uSUQ7Cn0KCj1oZWFkMiBTdGF0ZVRyYW5zaXRpb25EZWxldGUoKQoKRGVsZXRlIGEgc3RhdGUgdHJhbnNpdGlvbi4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCgogICAgbXkgJFN1Y2Nlc3MgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25EZWxldGUoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gMSwgICMgaWQgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgc3RhdGUKICAgICAgICBOZXh0U3RhdGVJRCA9PiAyLCAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIGFuIGVuZCBzdGF0ZQogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZVRyYW5zaXRpb25EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGFyZSBnaXZlbiAodGhleSBjYW4gYmUgMCkKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQgTmV4dFN0YXRlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgc3RhdGUgdHJhbnNpdGlvbiBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9zdGF0ZV9tYWNoaW5lICcKICAgICAgICAgICAgLiAnV0hFUkUgc3RhdGVfaWQgPSA/IEFORCBuZXh0X3N0YXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17U3RhdGVJRH0sIFwkUGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgY2xlYW51cCBzdGF0ZW1hY2hpbmUgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFN0YXRlVHJhbnNpdGlvbkRlbGV0ZUFsbCgpCgpEZWxldGUgYWxsIHN0YXRlIHRyYW5zaXRpb25zIG9mIGEgY2xhc3MuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoKICAgIG15ICRTdWNjZXNzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uRGVsZXRlQWxsKAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywgIyB0aGUgbmFtZSBvZiBhIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZVRyYW5zaXRpb25EZWxldGVBbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXIKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGFsbCBzdGF0ZSBpZHMgYW5kIG5leHRfc3RhdGUgaWRzIHdoaWNoIGJlbG9uZyB0byB0aGUgZ2l2ZW4gY2xhc3MKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgJwogICAgICAgICAgICAuICdGUk9NIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSBdLAogICAgKTsKCiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyByZXR1cm4gaWYgbm8gc3RhdGUgdHJhbnNpdGlvbnMgZXhpc3QgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgcmV0dXJuIDEgaWYgIUBJRHM7CgogICAgIyBidWlsZCBpZCBzdHJpbmcKICAgIG15ICRJRFN0cmluZyA9IGpvaW4gJywgJywgQElEczsKCiAgICAjIGRlbGV0ZSBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgIgogICAgICAgICAgICAuICJXSEVSRSBzdGF0ZV9pZCBJTiAoICRJRFN0cmluZyApICIKICAgICAgICAgICAgLiAiT1IgbmV4dF9zdGF0ZV9pZCBJTiAoICRJRFN0cmluZyApIiwKICAgICk7CgogICAgIyBjbGVhbnVwIHN0YXRlbWFjaGluZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAxOwoKfQoKPWhlYWQyIFN0YXRlVHJhbnNpdGlvbkdldCgpCgpHZXQgYSBzdGF0ZSB0cmFuc2l0aW9uIGZvciBhIGdpdmVuIHN0YXRlIGlkLgpSZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSBvZiB0aGUgbmV4dCBzdGF0ZSBpZHMuCgogICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIHRoZSBzdGFydCBzdGF0ZQogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHJhbnNpdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCBhcmUgZ2l2ZW4gKHRoZXkgY2FuIGJlIDApCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdGF0ZUlEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBjbGFzcyBpcyBnaXZlbgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1N0YXRlVHJhbnNpdGlvbkdldDo6U3RhdGVJRDo6JyAuICRQYXJhbXtTdGF0ZUlEfSAuICc6OkNsYXNzOjonIC4gJFBhcmFte0NsYXNzfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGNsYXNzLCBidXQgb25seSBpZiBzdGF0ZSBpZCBpcyBub3QgYSBzdGFydCBzdGF0ZSAoPTApCiAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSApIHsKCiAgICAgICAgIyBnZXQgY2xhc3Mgb2YgZ2l2ZW4gU3RhdGVJRAogICAgICAgIG15ICREYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBTdGF0ZUlEIGJlbG9uZ3MgdG8gZ2l2ZW4gY2xhc3MKICAgICAgICBpZiAoICEkRGF0YVJlZiB8fCAhJXskRGF0YVJlZn0gfHwgJERhdGFSZWYtPntDbGFzc30gbmUgJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRlSUQgJFBhcmFte1N0YXRlSUR9IGlzIG5vdCBpbiB0aGUgY2xhc3MgJyRQYXJhbXtDbGFzc30nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBmaW5kIGFsbCBzdGF0ZSBpZHMgYW5kIG5leHRfc3RhdGUgaWRzIHdoaWNoIGJlbG9uZyB0byB0aGUgZ2l2ZW4gY2xhc3MKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1Qgcy5uZXh0X3N0YXRlX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSBzICcKICAgICAgICAgICAgLiAnTEVGVCBPVVRFUiBKT0lOIGdlbmVyYWxfY2F0YWxvZyBnICcKICAgICAgICAgICAgLiAnT04gKCAocy5zdGF0ZV9pZCA9IGcuaWQgKSBPUiAocy5uZXh0X3N0YXRlX2lkID0gZy5pZCkgKSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHMuc3RhdGVfaWQgPSA/IEFORCBnLmdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte0NsYXNzfSBdLAogICAgKTsKCiAgICBteSBATmV4dFN0YXRlSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBOZXh0U3RhdGVJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyBpZiB0aGUgc3RhcnQgc3RhdGUgd2FzIHJlcXVlc3RlZCBhbmQgbW9yZSB0aGFuIG9uZSBzdGFydCBzdGF0ZSB3YXMgZm91bmQKICAgIGlmICggISRQYXJhbXtTdGF0ZUlEfSApIHsKCiAgICAgICAgaWYgKCAhQE5leHRTdGF0ZUlEcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3QgZ2V0IGluaXRpYWwgc3RhdGUgZm9yICckUGFyYW17Q2xhc3N9JyAiCiAgICAgICAgICAgICAgICAgICAgLiAiTm8gaW5pdGlhbCBzdGF0ZSB3YXMgZm91bmQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIHNjYWxhciBATmV4dFN0YXRlSURzID4gMSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3QgZ2V0IGluaXRpYWwgc3RhdGUgZm9yICckUGFyYW17Q2xhc3N9JyAiCiAgICAgICAgICAgICAgICAgICAgLiAiTW9yZSB0aGFuIG9uZSBpbml0aWFsIHN0YXRlIHdhcyBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2F2ZSB2YWx1ZXMgaW4gY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQE5leHRTdGF0ZUlEcywKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFxATmV4dFN0YXRlSURzOwp9Cgo9aGVhZDIgU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKCkKCkdldCBhIHN0YXRlIHRyYW5zaXRpb24gZm9yIGEgZ2l2ZW4gc3RhdGUgaWQsIGJ1dCBvbmx5IHNob3cgdGhlIHBvc3NpYmxlIG5leHQgZW5kIHN0YXRlcy4KUmV0dXJucyBhbiBhcnJheSByZWZlcmVuY2Ugb2YgdGhlIG5leHQgZW5kIHN0YXRlIGlkcy4KCiAgICBteSAkTmV4dFN0YXRlSURzUmVmID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgIFN0YXRlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IHN0YXRlCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsICMgdGhlIG5hbWUgb2YgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGFyZSBnaXZlbiAodGhleSBjYW4gYmUgMCkKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGF0IGNsYXNzIGlzIGdpdmVuCiAgICBpZiAoICEkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdGhlIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzOjpTdGF0ZUlEOjonIC4gJFBhcmFte1N0YXRlSUR9IC4gJzo6Q2xhc3M6OicgLiAkUGFyYW17Q2xhc3N9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQgYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3MsIGJ1dCBvbmx5IGlmIHN0YXRlIGlkIGlzIG5vdCBhIHN0YXJ0IHN0YXRlICg9MCkKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBvZiBnaXZlbiBTdGF0ZUlECiAgICAgICAgbXkgJERhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIFN0YXRlSUQgYmVsb25ncyB0byBnaXZlbiBjbGFzcwogICAgICAgIGlmICggISREYXRhUmVmIHx8ICEleyREYXRhUmVmfSB8fCAkRGF0YVJlZi0+e0NsYXNzfSBuZSAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhdGVJRCAkUGFyYW17U3RhdGVJRH0gaXMgbm90IGluIHRoZSBjbGFzcyAnJFBhcmFte0NsYXNzfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbmQgYWxsIHN0YXRlIGlkcyBhbmQgbmV4dF9zdGF0ZSBpZHMgd2hpY2ggYmVsb25nIHRvIHRoZSBnaXZlbiBjbGFzcwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzLm5leHRfc3RhdGVfaWQgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9zdGF0ZV9tYWNoaW5lIHMgJwogICAgICAgICAgICAuICdMRUZUIE9VVEVSIEpPSU4gZ2VuZXJhbF9jYXRhbG9nIGcgJwogICAgICAgICAgICAuICdPTiAoIChzLnN0YXRlX2lkID0gZy5pZCApIE9SIChzLm5leHRfc3RhdGVfaWQgPSBnLmlkKSApICcKICAgICAgICAgICAgLiAnV0hFUkUgcy5zdGF0ZV9pZCA9ID8gQU5EIGcuZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U3RhdGVJRH0sIFwkUGFyYW17Q2xhc3N9IF0sCiAgICApOwoKICAgIG15IEBOZXh0U3RhdGVJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQE5leHRTdGF0ZUlEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIGlmIHRoZSBzdGFydCBzdGF0ZSB3YXMgcmVxdWVzdGVkIGFuZCBtb3JlIHRoYW4gb25lIHN0YXJ0IHN0YXRlIHdhcyBmb3VuZAogICAgaWYgKCAhJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICBpZiAoICFATmV4dFN0YXRlSURzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBnZXQgaW5pdGlhbCBzdGF0ZSBmb3IgJyRQYXJhbXtDbGFzc30nICIKICAgICAgICAgICAgICAgICAgICAuICJObyBpbml0aWFsIHN0YXRlIHdhcyBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICggc2NhbGFyIEBOZXh0U3RhdGVJRHMgPiAxICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBnZXQgaW5pdGlhbCBzdGF0ZSBmb3IgJyRQYXJhbXtDbGFzc30nICIKICAgICAgICAgICAgICAgICAgICAuICJNb3JlIHRoYW4gb25lIGluaXRpYWwgc3RhdGUgd2FzIGZvdW5kISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBuZXh0IHN0YXRlIGlkcyBzdHJpbmcKICAgIG15ICROZXh0U3RhdGVJRHNTdHJpbmcgPSBqb2luICcsICcsIEBOZXh0U3RhdGVJRHM7CgogICAgIyBmaW5kIGFsbCBuZXh0IHN0YXRlIGlkcyB3aGljaCBhcmUgZW5kIHN0YXRlcwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzLnN0YXRlX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSBzICcKICAgICAgICAgICAgLiAiV0hFUkUgcy5zdGF0ZV9pZCBJTiAoICROZXh0U3RhdGVJRHNTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gJ0FORCBzLm5leHRfc3RhdGVfaWQgPSAwJywKICAgICk7CgogICAgbXkgQE5leHRFbmRTdGF0ZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATmV4dEVuZFN0YXRlSURzLCAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZXMgaW4gY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQE5leHRFbmRTdGF0ZUlEcywKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFxATmV4dEVuZFN0YXRlSURzOwp9Cgo9aGVhZDIgU3RhdGVUcmFuc2l0aW9uTGlzdCgpCgpSZXR1cm4gYSBzdGF0ZSB0cmFuc2l0aW9uIGxpc3QgaGFzaC1hcnJheSByZWZlcmVuY2UuClRoZSBoYXNoIGtleSBpcyB0aGUgU3RhdGVJRCwgdGhlIGhhc2ggdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIE5leHRTdGF0ZUlEcy4KCiAgICBteSAkU3RhdGVUcmFuc2l0aW9uc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKUmV0dXJuIGV4YW1wbGU6CgogICAgJFN0YXRlVHJhbnNpdGlvbnNSZWYgPSB7CiAgICAgICAgMCA9PiBbIDEgXSwKICAgICAgICAxID0+IFsgMiwgMywgNCBdLAogICAgICAgIDIgPT4gWyA1IF0sCiAgICAgICAgMyA9PiBbIDYsIDcgXSwKICAgICAgICA0ID0+IFsgMCBdLAogICAgICAgIDUgPT4gWyAwIF0sCiAgICAgICAgNiA9PiBbIDAgXSwKICAgICAgICA3ID0+IFsgMCBdLAogICAgfTsKCj1jdXQKCnN1YiBTdGF0ZVRyYW5zaXRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGUgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdTdGF0ZVRyYW5zaXRpb25MaXN0OjpDbGFzczo6JyAuICRQYXJhbXtDbGFzc307CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgZ2V0IHN0YXRlIHRyYW5zaXRpb25zCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIHMuaWQgLCBzLnN0YXRlX2lkICwgcy5uZXh0X3N0YXRlX2lkICwgZy5nZW5lcmFsX2NhdGFsb2dfY2xhc3MgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9zdGF0ZV9tYWNoaW5lIHMgJwogICAgICAgICAgICAuICdMRUZUIE9VVEVSIEpPSU4gZ2VuZXJhbF9jYXRhbG9nIGcgJwogICAgICAgICAgICAuICdPTiAoIChzLnN0YXRlX2lkID0gZy5pZCApIE9SIChzLm5leHRfc3RhdGVfaWQgPSBnLmlkKSApICcKICAgICAgICAgICAgLiAnV0hFUkUgZy5nZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30gXSwKICAgICk7CgogICAgbXkgJVN0YXRlVHJhbnNpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAeyAkU3RhdGVUcmFuc2l0aW9ueyAkUm93WzFdIH0gfSwgJFJvd1syXTsKICAgIH0KCiAgICAjIHNhdmUgdmFsdWVzIGluIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVTdGF0ZVRyYW5zaXRpb24sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcJVN0YXRlVHJhbnNpdGlvbjsKfQoKPWhlYWQyIFN0YXRlVHJhbnNpdGlvblVwZGF0ZSgpCgpVcGRhdGUgdGhlIG5leHQgc3RhdGUgb2YgYW4gZXhpc3RpbmcgbmV3IHN0YXRlIHRyYW5zaXRpb24uClJldHVybnMgdGhlIHRyYW5zaXRpb24gaWQgb24gc3VjY2Vzcy4KCiAgICBteSAkVXBkYXRlU3VjY2VzcyA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWQgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgc3RhdGUKICAgICAgICBOZXh0U3RhdGVJRCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWQgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgb3IgMCB0byBpbmRpY2F0ZSBhbiBlbmQgc3RhdGUKICAgICAgICBOZXdOZXh0U3RhdGVJRCA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWQgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgb3IgMCB0byBpbmRpY2F0ZSBhbiBlbmQgc3RhdGUKICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsICMgdGhlIG5hbWUgb2YgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVUcmFuc2l0aW9uVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBTdGF0ZUlELCBOZXh0U3RhdGVJRCBhbmQgTmV3TmV4dFN0YXRlSUQgYXJlIGdpdmVuICh0aGV5IGNhbiBiZSAwKQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU3RhdGVJRCBOZXh0U3RhdGVJRCBOZXdOZXh0U3RhdGVJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgY2xhc3MgaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGFyZSB6ZXJvCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtOZXh0U3RhdGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBjYW4ndCBib3RoIGJlIHplcm8hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgbm90IGJvdGggU3RhdGVJRCBhbmQgTmV3TmV4dFN0YXRlSUQgYXJlIHplcm8KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEfSAmJiAhJFBhcmFte05ld05leHRTdGF0ZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRlSUQgYW5kIE5ld05leHRTdGF0ZUlEIGNhbid0IGJvdGggYmUgemVybyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVmaW5lIGxvb2t1cCBoYXNoIGZvciBzdGF0ZSBuYW1lCiAgICBteSAlU3RhdGVJRDJTdGF0ZTsKCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQsIE5leHRTdGF0ZUlEIGFuZCBOZXdOZXh0U3RhdGVJRCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNsYXNzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQgTmV4dFN0YXRlSUQgTmV3TmV4dFN0YXRlSUQpKSB7CgogICAgICAgICRTdGF0ZUlEMlN0YXRleyAkUGFyYW17JEFyZ3VtZW50fSB9ID0gJFNlbGYtPlN0YXRlTG9va3VwKAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb250IGNoZWNrIHplcm8gdmFsdWVzCiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgbXkgJERhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaWQgYmVsb25ncyB0byBnaXZlbiBjbGFzcwogICAgICAgIGlmICggISREYXRhUmVmIHx8ICEleyREYXRhUmVmfSB8fCAkRGF0YVJlZi0+e0NsYXNzfSBuZSAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50ICRQYXJhbXskQXJndW1lbnR9IGlzIG5vdCBpbiB0aGUgY2xhc3MgJyRQYXJhbXtDbGFzc30nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdXBkYXRlIGlmIHRoZSBuZXcgbmV4dCBzdGF0ZSBpcyB0aGUgc2FtZQogICAgcmV0dXJuIDEgaWYgJFBhcmFte05leHRTdGF0ZUlEfSA9PSAkUGFyYW17TmV3TmV4dFN0YXRlSUR9OwoKICAgICMgZ2V0IHRoZSBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIGlkIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1Qgcy5pZCAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgcyAnCiAgICAgICAgICAgIC4gJ0xFRlQgT1VURVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZyAnCiAgICAgICAgICAgIC4gJ09OICggKHMuc3RhdGVfaWQgPSBnLmlkICkgT1IgKHMubmV4dF9zdGF0ZV9pZCA9IGcuaWQpICkgJwogICAgICAgICAgICAuICdXSEVSRSBzLnN0YXRlX2lkID0gPyBBTkQgcy5uZXh0X3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBnLmdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtOZXh0U3RhdGVJRH0sIFwkUGFyYW17Q2xhc3N9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFRyYW5zaXRpb25JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRyYW5zaXRpb25JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjaGVjayB0aGF0IHRoZSBzdGF0ZSB0cmFuc2l0aW9uIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQgZXhpc3RzCiAgICBpZiAoICEkVHJhbnNpdGlvbklEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCB1cGRhdGUgc3RhdGUgdHJhbnNpdGlvbiEgQSBzdGF0ZSB0cmFuc2l0aW9uIHdpdGggIgogICAgICAgICAgICAgICAgLiAiU3RhdGVJRCAkUGFyYW17U3RhdGVJRH0gYW5kIE5leHRTdGF0ZUlEICRQYXJhbXtOZXh0U3RhdGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXZlbnQgc2V0dGluZyBhbiBlbmQgc3RhdGUgdHJhbnNpdGlvbiwgaWYgb3RoZXIgc3RhdGUgdHJhbnNpc3Rpb25zIGV4aXN0IGFscmVhZHkKICAgIGlmICggISRQYXJhbXtOZXdOZXh0U3RhdGVJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgb3RoZXIgc3RhdGUgdHJhbnNpc3Rpb25zIGV4aXN0IGZvciB0aGUgZ2l2ZW4gU3RhdGVJRAogICAgICAgIG15ICROZXh0U3RhdGVJRHMgPSAkU2VsZi0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgICk7CgogICAgICAgICMgVGhlIG9sZCBzdGF0ZSB0cmFuc2l0aW9uLCB3aGljaCBpcyB2ZXJpZmllZCB0byBleGlzdCwgZG9lcyBub3QgY291bnQgaW4gdGhpcyBjaGVjawogICAgICAgIGlmICggJE5leHRTdGF0ZUlEcyAmJiBzY2FsYXIgQHskTmV4dFN0YXRlSURzfSA+IDEgKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBzZXQgc3RhdGUgIgogICAgICAgICAgICAgICAgICAgIC4gIickU3RhdGVJRDJTdGF0ZXskUGFyYW17U3RhdGVJRH19JyAoSUQ6ICRQYXJhbXtTdGF0ZUlEfSkgYXMgZW5kIHN0YXRlLCAiCiAgICAgICAgICAgICAgICAgICAgLiAiYmVjYXVzZSBvdGhlciBmb2xsb3dpbmcgc3RhdGVzIGV4aXN0LCB3aGljaCBtdXN0IGJlIGRlbGV0ZWQgZmlyc3QhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHVwZGF0ZSBzdGF0ZSB0cmFuc2l0aW9uCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSAnCiAgICAgICAgICAgIC4gJ1NFVCBuZXh0X3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmV3TmV4dFN0YXRlSUR9LCBcJFRyYW5zaXRpb25JRCBdLAogICAgKTsKCiAgICAjIGNsZWFudXAgc3RhdGVtYWNoaW5lIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTdGF0ZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIHN0YXRlLiBJZiBhIHN0YXRlIGlkIGlzIGdpdmVuLAppdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdGF0ZS4gSWYgYSBzdGF0ZSBuYW1lIGlzIGdpdmVuLAp0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJFN0YXRlID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGVJRCA9PiAxMjM0LAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKCiAgICBteSAkU3RhdGVJRCA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgIFN0YXRlICAgPT4gJ2FjY2VwdGVkJywKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIENsYXNzIHBhcmFtZXRlcgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFRoZSBTdGF0ZUlEICcwJyBpcyBhIHNwZWNpYWwgY2FzZS4gRGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0CiAgICAjIGNhbiBpbmRpY2F0ZSAnKlNUQVJUKicgb3IgJypFTkQqJy4gU28gcmV0dXJuICcwJyBpbiB0aGF0IGNhc2UsCiAgICAjIGFuZCBkbyBub3QgZmxvb2QgdGhlIGVycm9yIGxvZy4KICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtTdGF0ZUlEfQogICAgICAgICYmICRQYXJhbXtTdGF0ZUlEfSBlcSAnMCcKICAgICAgICAmJiAhZGVmaW5lZCAkUGFyYW17U3RhdGV9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAnMCc7CiAgICB9CgogICAgIyBUaGUgU3RhdGUgJzAnIGlzIGEgc3BlY2lhbCBjYXNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXQKICAgICMgY2FuIGluZGljYXRlICcqU1RBUlQqJyBvciAnKkVORConLiBTbyByZXR1cm4gJzAnIGluIHRoYXQgY2FzZSwKICAgICMgYW5kIGRvIG5vdCBmbG9vZCB0aGUgZXJyb3IgbG9nLgogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte1N0YXRlfQogICAgICAgICYmICRQYXJhbXtTdGF0ZX0gZXEgJzAnCiAgICAgICAgJiYgIWRlZmluZWQgJFBhcmFte1N0YXRlSUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAnMCc7CiAgICB9CgogICAgIyBlaXRoZXIgU3RhdGVJRCBvciBTdGF0ZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1N0YXRlSUR9ICYmICEkUGFyYW17U3RhdGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTdGF0ZUlEIG9yIFN0YXRlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBvbmx5IG9uZSBwYXJhbWV0ZXIgU3RhdGUgb3IgU3RhdGVJRCBpcyBhbGxvd2VkCiAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSAmJiAkUGFyYW17U3RhdGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTdGF0ZUlEIE9SIFN0YXRlIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY2hhbmdlIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgIG15ICRTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CgogICAgIyBjb252ZXJ0IHN0YXRlIGxpc3QgaW50byBhIGxvb2t1cCBoYXNoCiAgICBteSAlU3RhdGVJRDJOYW1lOwogICAgaWYgKCAkU3RhdGVMaXN0ICYmIHJlZiAkU3RhdGVMaXN0IGVxICdIQVNIJyAmJiAleyRTdGF0ZUxpc3R9ICkgewogICAgICAgICVTdGF0ZUlEMk5hbWUgPSAleyRTdGF0ZUxpc3R9OwogICAgfQoKICAgICMgY2hlY2sgdGhlIHN0YXRlIGhhc2gKICAgIGlmICggISVTdGF0ZUlEMk5hbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgcmV0cmlldmUgY2hhbmdlIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cuJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgIHJldHVybiAkU3RhdGVJRDJOYW1leyAkUGFyYW17U3RhdGVJRH0gfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHJldmVyc2Uga2V5IC0gdmFsdWUgcGFpcnMgdG8gaGF2ZSB0aGUgbmFtZSBhcyBrZXlzCiAgICAgICAgbXkgJVN0YXRlTmFtZTJJRCA9IHJldmVyc2UgJVN0YXRlSUQyTmFtZTsKCiAgICAgICAgcmV0dXJuICRTdGF0ZU5hbWUySUR7ICRQYXJhbXtTdGF0ZX0gfTsKICAgIH0KfQoKPWhlYWQyIFN0YXRlTGlzdCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBzdGF0ZXMgZm9yIGEgY2F0YWxvZyBjbGFzcy4KCiAgICBteSAkU3RhdGVMaXN0ID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgIENsYXNzICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNocmVmcy4gVGhlIGVsZW1lbnQgJ0tleScgaXMgdGhlbgp0aGUgc3RhdGUgaWQgYW5kIHRoZSBlbGVtZW50ICdWYWx1ZScgaXMgdGhlIG5hbWUgb2YgdGhlIHN0YXRlLiBUaGUgYXJyYXkgZWxlbWVudHMKYXJlIHNvcnRlZCBieSBzdGF0ZSBpZC4KCiAgICBteSAkU3RhdGVMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU2LAogICAgICAgICAgICBWYWx1ZSA9PiAnYXBwcm92ZWQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNTcsCiAgICAgICAgICAgIFZhbHVlID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3RhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDbGFzcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHN0YXRlIGxpc3QKICAgIG15ICRTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICkgfHwge307CgogICAgIyB0byBzdG9yZSBhbiBhcnJheSBvZiBoYXNoIHJlZnMKICAgIG15IEBBcnJheUhhc2hSZWY7CgogICAgIyBhc3NlbWJsZSB0aGUgYXJyYXkgb2YgaGFzaCByZWZzIHdpdGggYWxsIHN0YXRlcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICV7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBJVFNNV29ya09yZGVyLnBtLHYgMS4zIDIwMTgvMTAvMTggMTY6MTU6MDUgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlciAtIHdvcmtvcmRlciBsaWIKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCB0aGUgZGVidWcgZmxhZwogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBnZXQgdGhlIGNhY2hlIHR5cGUgYW5kIFRUTCAoaW4gc2Vjb25kcykKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01DaGFuZ2U6OkNhY2hlVFRMJykgKiA2MDsKCiAgICBASVNBID0gKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyJywKICAgICk7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnSVRTTVdvcmtPcmRlcjo6RXZlbnRNb2R1bGUnLAogICAgKTsKCiAgICAjIGdldCBkYXRhYmFzZSB0eXBlCiAgICAkU2VsZi0+e0RCVHlwZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+eydEQjo6VHlwZSd9IHx8ICcnOwogICAgJFNlbGYtPntEQlR5cGV9ID0gbGMgJFNlbGYtPntEQlR5cGV9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFdvcmtPcmRlckFkZCgpCgpBZGQgYSBuZXcgQzx3b3Jrb3JkZXI+LgpJbnRlcm5hbGx5IGZpcnN0IGEgbWluaW1hbCBDPHdvcmtvcmRlcj4gaXMgY3JlYXRlZCwKdGhlbiBXb3JrT3JkZXJVcGRhdGUoKSBpcyBjYWxsZWQgZm9yIHNldHRpbmcgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCgogICAgbXkgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCm9yCgogICAgbXkgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgIENoYW5nZUlEICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgV29ya09yZGVyVGl0bGUgICAgID0+ICdSZXBsYWNlbWVudCBvZiBtYWlsIHNlcnZlcicsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbnN0cnVjdGlvbiAgICAgICAgPT4gJ0luc3RhbGwgdGhlIHRoZSBuZXcgc2VydmVyJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlcG9ydCAgICAgICAgICAgICA9PiAnSW5zdGFsbGVkIG5ldyBzZXJ2ZXIgd2l0aG91dCBwcm9ibGVtcycsICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyU3RhdGVJRCAgID0+IDE1NywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGUgPT4gJ3JlYWR5JwogICAgICAgIFdvcmtPcmRlclN0YXRlICAgICA9PiAncmVhZHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFdvcmtPcmRlclN0YXRlSUQgPT4gMTU3CiAgICAgICAgV29ya09yZGVyVHlwZUlEICAgID0+IDE2MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyVHlwZSA9PiAncGlyJwogICAgICAgIFdvcmtPcmRlclR5cGUgICAgICA9PiAncmVhZHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFdvcmtPcmRlclR5cGVJRCA9PiAxNjEKICAgICAgICBXb3JrT3JkZXJBZ2VudElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlckdyb3VwSUQgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSAgID0+ICcyMDA5LTEwLTEyIDAwOjAwOjAxJywgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQbGFubmVkRW5kVGltZSAgICAgPT4gJzIwMDktMTAtMTUgMTU6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgICA9PiAnMjAwOS0xMC0xNCAwMDowMDowMScsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWN0dWFsRW5kVGltZSAgICAgID0+ICcyMDA5LTAxLTIwIDAwOjAwOjAxJywgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQbGFubmVkRWZmb3J0ICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIER5bmFtaWNGaWVsZF9YICAgICA9PiAnU3VuJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRHluYW1pY0ZpZWxkX1kgICAgID0+ICdFYXJ0aCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFdvcmtPcmRlclN0YXRlIGFuZCBXb3JrT3JkZXJTdGF0ZUlEIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17V29ya09yZGVyU3RhdGV9ICYmICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFdvcmtPcmRlclN0YXRlIE9SIFdvcmtPcmRlclN0YXRlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgYSBTdGF0ZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17V29ya09yZGVyU3RhdGV9ICkgewogICAgICAgICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSA9ICRTZWxmLT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJFBhcmFte1dvcmtPcmRlclN0YXRlfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgd29ya29yZGVyIHN0YXRlIG90aGVyd2lzZSB0aGUgdXBkYXRlIGZhaWxzCiAgICAgICAgIyBhcyBib3RoIFdvcmtPcmRlclN0YXRlIGFuZCBXb3JrT3JkZXJTdGF0ZUlEIGV4aXN0cyB0aGVuCiAgICAgICAgZGVsZXRlICRQYXJhbXtXb3JrT3JkZXJTdGF0ZX07CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFdvcmtPcmRlclR5cGUgYW5kIFdvcmtPcmRlclR5cGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGV9ICYmICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgV29ya09yZGVyVHlwZSBPUiBXb3JrT3JkZXJUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgVHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17V29ya09yZGVyVHlwZX0gKSB7CiAgICAgICAgJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZSA9PiAkUGFyYW17V29ya09yZGVyVHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlciB0eXBlIG90aGVyd2lzZSB0aGUgdXBkYXRlIGZhaWxzCiAgICAgICAgIyBhcyBib3RoIFdvcmtPcmRlclR5cGUgYW5kIFdvcmtPcmRlclR5cGVJRCBleGlzdHMgdGhlbgogICAgICAgIGRlbGV0ZSAkUGFyYW17V29ya09yZGVyVHlwZX07CiAgICB9CgogICAgIyBnZXQgYSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgYXJndW1lbnRzIHdoaWNoIG1pZ2h0IGNvbnRhaW4gSFRNTCBtYXJrdXAKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSW5zdHJ1Y3Rpb24gUmVwb3J0KSkgewoKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICRQYXJhbXsiJHtBcmd1bWVudH1QbGFpbiJ9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgKTsKICAgICAgICB1dGY4Ojp1cGdyYWRlKCAkUGFyYW17IiR7QXJndW1lbnR9UGxhaW4ifSApOwogICAgfQoKICAgICMgY2hlY2sgdGhlIHBhcmFtZXRlcnMKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja1dvcmtPcmRlclBhcmFtcyglUGFyYW0pOwoKICAgICMgdHJpZ2dlciBXb3JrT3JkZXJBZGRQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgc2V0IGluaXRpYWwgV29ya09yZGVyU3RhdGVJRCwgdXNlIGRlZmF1bHQgaWYgbm90IHBhc3NlZAogICAgbXkgJFdvcmtPcmRlclN0YXRlSUQgPSBkZWxldGUgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9OwogICAgaWYgKCAhJFdvcmtPcmRlclN0YXRlSUQgKSB7CgogICAgICAgICMgZ2V0IGluaXRpYWwgd29ya29yZGVyIHN0YXRlIGlkCiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcwogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyktPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAwLAogICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgKTsKICAgICAgICAkV29ya09yZGVyU3RhdGVJRCA9ICROZXh0U3RhdGVJRHMtPlswXTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IFdvcmtPcmRlclR5cGVJRCwgdXNlIGRlZmF1bHQgaWYgbm90IHBhc3NlZAogICAgbXkgJFdvcmtPcmRlclR5cGVJRCA9IGRlbGV0ZSAkUGFyYW17V29ya09yZGVyVHlwZUlEfTsKICAgIGlmICggISRXb3JrT3JkZXJUeXBlSUQgKSB7CgogICAgICAgICMgc2V0IGNvbmZpZyBvcHRpb24KICAgICAgICBteSAkQ29uZmlnT3B0aW9uID0gJ0lUU01Xb3JrT3JkZXI6OlR5cGU6OkRlZmF1bHQnOwoKICAgICAgICAjIGdldCBkZWZhdWx0IHdvcmtvcmRlciB0eXBlIGZyb20gY29uZmlnCiAgICAgICAgbXkgJERlZmF1bHRUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCRDb25maWdPcHRpb24pOwoKICAgICAgICAjIGNoZWNrIGlmIGRlZmF1bHQgdHlwZSBleGlzdHMgaW4gZ2VuZXJhbCBjYXRhbG9nCiAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgICAgICAgICBOYW1lICA9PiAkRGVmYXVsdFR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBoYW5kbGluZyBiZWNhdXNlIG9mIGludmFsaWQgY29uZmlnIHNldHRpbmcKICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgfHwgcmVmICRJdGVtRGF0YVJlZiBuZSAnSEFTSCcgfHwgISV7JEl0ZW1EYXRhUmVmfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBkZWZhdWx0IFdvcmtPcmRlclR5cGUgJyREZWZhdWx0VHlwZScgIgogICAgICAgICAgICAgICAgICAgIC4gImluIHN5c2NvbmZpZyBvcHRpb24gJyRDb25maWdPcHRpb24nIGlzIGludmFsaWQhIENoZWNrIHRoZSBnZW5lcmFsIGNhdGFsb2chIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdAogICAgICAgICRXb3JrT3JkZXJUeXBlSUQgPSAkSXRlbURhdGFSZWYtPntJdGVtSUR9OwogICAgfQoKICAgICMgZ2V0IGEgdW5pcXVlIHdvcmtvcmRlciBudW1iZXIKICAgIG15ICRXb3JrT3JkZXJOdW1iZXIgPSAkU2VsZi0+X0dldFdvcmtPcmRlck51bWJlciglUGFyYW0pOwoKICAgIGlmICggJFBhcmFte1dvcmtPcmRlckdyb3VwSUR9ICkgewoKICAgICAgICAjIGFkZCBXb3JrT3JkZXIgdG8gZGF0YWJhc2Ugd2l0aCBncm91cAogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV93b3Jrb3JkZXIgJwogICAgICAgICAgICAgICAgLiAnKGNoYW5nZV9pZCwgd29ya29yZGVyX251bWJlciwgd29ya29yZGVyX3N0YXRlX2lkLCB3b3Jrb3JkZXJfdHlwZV9pZCwgd29ya29yZGVyX2dyb3VwX2lkLCAnCiAgICAgICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17Q2hhbmdlSUR9LCBcJFdvcmtPcmRlck51bWJlciwgXCRXb3JrT3JkZXJTdGF0ZUlELCBcJFdvcmtPcmRlclR5cGVJRCwKICAgICAgICAgICAgICAgIFwkUGFyYW17V29ya09yZGVyR3JvdXBJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgV29ya09yZGVyIHRvIGRhdGFiYXNlCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgICAgICAuICcoY2hhbmdlX2lkLCB3b3Jrb3JkZXJfbnVtYmVyLCB3b3Jrb3JkZXJfc3RhdGVfaWQsIHdvcmtvcmRlcl90eXBlX2lkLCAnCiAgICAgICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17Q2hhbmdlSUR9LCBcJFdvcmtPcmRlck51bWJlciwgXCRXb3JrT3JkZXJTdGF0ZUlELCBcJFdvcmtPcmRlclR5cGVJRCwKICAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgV29ya09yZGVySUQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV93b3Jrb3JkZXIgV0hFUkUgY2hhbmdlX2lkID0gPyBBTkQgd29ya29yZGVyX251bWJlciA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkV29ya09yZGVyTnVtYmVyIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkV29ya09yZGVySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya09yZGVyQWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRXb3JrT3JkZXJJRCwKICAgICAgICAnV29ya09yZGVyTGlzdDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICdXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0OjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZVRpbWVHZXQ6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlR2V0OjpJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlckFkZFBvc3QtRXZlbnQKICAgICMgKHllcywgd2Ugd2FudCBkbyBkbyB0aGlzIGJlZm9yZSB0aGUgV29ya09yZGVyVXBkYXRlISkKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckFkZFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgV29ya09yZGVyTnVtYmVyICA9PiAkV29ya09yZGVyTnVtYmVyLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZUlELAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRXb3JrT3JkZXJUeXBlSUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIFdvcmtPcmRlciB3aXRoIHJlbWFpbmluZyBwYXJhbWV0ZXJzLAogICAgIyB0aGUgYWxyZWFkeSBoYW5kbGVzIHBhcmFtcyBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tICVQYXJhbQogICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICVQYXJhbSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICApOwoKICAgICMgY2hlY2sgdXBkYXRlIGVycm9yCiAgICBpZiAoICEkVXBkYXRlU3VjY2VzcyApIHsKCiAgICAgICAgIyBkZWxldGUgd29ya29yZGVyIGlmIGl0IGNvdWxkIG5vdCBiZSB1cGRhdGVkCiAgICAgICAgJFNlbGYtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRXb3JrT3JkZXJJRDsKfQoKPWhlYWQyIFdvcmtPcmRlclVwZGF0ZSgpCgpVcGRhdGUgYSBDPHdvcmtvcmRlcj4uCkxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBmcm9tIEM8V29ya09yZGVyVGl0bGU+LgpQYXNzaW5nIHVuZGVmaW5lZCB2YWx1ZXMgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkLiBBbiBleGNlcHRpb24KYXJlIHRoZSBwYXJhbWV0ZXJzIEM8UGxhbm5lZFN0YXJ0VGltZT4sIEM8UGxhbm5lZEVuZFRpbWU+LCBDPEFjdHVhbFN0YXJ0VGltZT4sIGFuZCBDPEFjdHVhbEVuZFRpbWU+LgpUaGVyZSBwYXNzaW5nIEM8dW5kZWY+IGluZGljYXRlcyB0aGF0IHRoZSBDPHdvcmtvcmRlcj4gdGltZSBzaG91bGQgYmUgY2xlYXJlZC4KQW5vdGhlciBleGNlcHRpb24gaXMgdGhlIFdvcmtPcmRlckFnZW50SUQuIFBhc3MgdW5kZWYgZm9yIHJlbW92aW5nIHRoZSBDPHdvcmtvcmRlcj4gYWdlbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgV29ya09yZGVySUQgICAgICAgID0+IDQsCiAgICAgICAgV29ya09yZGVyTnVtYmVyICAgID0+IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICAgPT4gJ1JlcGxhY2VtZW50IG9mIG1haWwgc2VydmVyJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluc3RydWN0aW9uICAgICAgICA9PiAnSW5zdGFsbCB0aGUgdGhlIG5ldyBzZXJ2ZXInLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVwb3J0ICAgICAgICAgICAgID0+ICdJbnN0YWxsZWQgbmV3IHNlcnZlciB3aXRob3V0IHByb2JsZW1zJywgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEICAgPT4gMTU3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBXb3JrT3JkZXJTdGF0ZSA9PiAncmVhZHknCiAgICAgICAgV29ya09yZGVyU3RhdGUgICAgID0+ICdyZWFkeScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGVJRCA9PiAxNTcKICAgICAgICBXb3JrT3JkZXJUeXBlSUQgICAgPT4gMTYxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBXb3JrT3JkZXJUeXBlID0+ICdwaXInCiAgICAgICAgV29ya09yZGVyVHlwZSAgICAgID0+ICdwaXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGVJRCA9PiAxNjEKICAgICAgICBXb3JrT3JkZXJBZ2VudElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBjYW4gYmUgdW5kZWYgZm9yIHJlbW92aW5nIHRoZSB3b3Jrb3JkZXIgYWdlbnQKICAgICAgICBXb3JrT3JkZXJHcm91cElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBjYW4gYmUgdW5kZWYgZm9yIHJlbW92aW5nIHRoZSB3b3Jrb3JkZXIgZ3JvdXAKICAgICAgICBQbGFubmVkU3RhcnRUaW1lICAgPT4gJzIwMDktMTAtMTIgMDA6MDA6MDEnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSAndW5kZWYnIGluZGljYXRlcyBjbGVhcmluZwogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgICA9PiAnMjAwOS0xMC0xNSAxNTowMDowMCcsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpICd1bmRlZicgaW5kaWNhdGVzIGNsZWFyaW5nCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICAgID0+ICcyMDA5LTEwLTE0IDAwOjAwOjAxJywgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgJ3VuZGVmJyBpbmRpY2F0ZXMgY2xlYXJpbmcKICAgICAgICBBY3R1YWxFbmRUaW1lICAgICAgPT4gJzIwMDktMDEtMjAgMDA6MDA6MDEnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSAndW5kZWYnIGluZGljYXRlcyBjbGVhcmluZwogICAgICAgIFBsYW5uZWRFZmZvcnQgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWNjb3VudGVkVGltZSAgICAgID0+IDEzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdGhlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBpbiB0aGUgZGF0YWJhc2UKICAgICAgICBEeW5hbWljRmllbGRfWCAgICAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIER5bmFtaWNGaWVsZF9ZICAgICA9PiAnRWFydGgnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTm9OdW1iZXJDYWxjICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwLCBpZiAxIGl0IHByZXZlbnRzIGEgcmVjYWxjdWxhdGlvbiBvZiB0aGUgd29ya29yZGVyIG51bWJlcnMKICAgICAgICBCeXBhc3NTdGF0ZU1hY2hpbmUgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAsIGlmIDEgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBiZSBieXBhc3NlZAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCkNvbnN0cmFpbnRzOgoKQzx4eHhTdGFydFRpbWU+IGhhcyB0byBiZSBiZWZvcmUgQzx4eHhFbmRUaW1lPi4gSWYganVzdCBvbmUgb2YgdGhlIHBhcmFtZXRlciBwYWlyIGlzIHBhc3NlZAp0aGUgb3RoZXIgdGltZSBpcyByZXRyaWV2ZWQgZnJvbSBkYXRhYmFzZS4KVGhlIEM8V29ya09yZGVyU3RhdGVJRD4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzdGF0ZSBtYWNoaW5lLgoKPWN1dAoKc3ViIFdvcmtPcmRlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBXb3JrT3JkZXJTdGF0ZSBhbmQgV29ya09yZGVyU3RhdGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclN0YXRlfSAmJiAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBXb3JrT3JkZXJTdGF0ZSBPUiBXb3JrT3JkZXJTdGF0ZUlEIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdoZW4gdGhlIFN0YXRlIGlzIGdpdmVuLCB0aGVuIGxvb2sgdXAgdGhlIElECiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ID0gJFNlbGYtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkUGFyYW17V29ya09yZGVyU3RhdGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFR5cGUgYW5kIFR5cGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGV9ICYmICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgV29ya09yZGVyVHlwZSBPUiBXb3JrT3JkZXJUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgVHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17V29ya09yZGVyVHlwZX0gKSB7CiAgICAgICAgJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZSA9PiAkUGFyYW17V29ya09yZGVyVHlwZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5vcm1hbGl6ZSB0aGUgVGl0bGUsIHdoZW4gaXQgaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclRpdGxlfSAmJiAhcmVmICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gKSB7CgogICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgICAgICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gPX4gc3sgXEEgXHMrIH17fXhtczsKCiAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gPX4gc3sgXHMrIFx6IH17fXhtczsKICAgIH0KCiAgICAjIGdldCBhIHBsYWluIHRleHQgdmVyc2lvbiBvZiBhcmd1bWVudHMgd2hpY2ggbWlnaHQgY29udGFpbiBIVE1MIG1hcmt1cAogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJbnN0cnVjdGlvbiBSZXBvcnQpKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyIke0FyZ3VtZW50fVBsYWluIn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICApOwogICAgICAgIHV0Zjg6OnVwZ3JhZGUoICRQYXJhbXsiJHtBcmd1bWVudH1QbGFpbiJ9ICk7CiAgICB9CgogICAgIyBkZWZhdWx0IHZhbHVlcyBmb3IgcGxhbm5lZCBlZmZvcnQgYW5kIGFjY291bnRlZCB0aW1lCiAgICAjIHRoaXMgYXZvaWRzIHN1cGVyZmxvdXMgaGlzdG9yeSBlbnRyaWVzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBsYW5uZWRFZmZvcnQgQWNjb3VudGVkVGltZSkpIHsKCiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9OwoKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gMDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tXb3JrT3JkZXJQYXJhbXMoJVBhcmFtKTsKCiAgICAjIGNoZWNrIHNhbml0eSBvZiB0aGUgbmV3IHN0YXRlIHdpdGggdGhlIHN0YXRlIG1hY2hpbmUKICAgIGlmICggJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ICkgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaWQKICAgICAgICBteSAkV29ya09yZGVySUQgPSAkUGFyYW17V29ya09yZGVySUR9OwoKICAgICAgICAjIGRvIG5vdCBnaXZlIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkgdGhlIFdvcmtPcmRlcklECiAgICAgICAgIyBpZiB0aGUgc3RhdGVtYWNoaW5lIHNob3VsZCBiZSBieXBhc3NlZC4KICAgICAgICAjIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkgd2lsbCB0aGVuIHJldHVybiBhbGwgd29ya29yZGVyIHN0YXRlcwogICAgICAgIGlmICggJFBhcmFte0J5cGFzc1N0YXRlTWFjaGluZX0gKSB7CiAgICAgICAgICAgICRXb3JrT3JkZXJJRCA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgcG9zc2libGUgbmV4dCBzdGF0ZXMKICAgICAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhZ3JlcCB7ICRfLT57S2V5fSA9PSAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gfSBAeyRTdGF0ZUxpc3R9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHN0YXRlICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSBpcyBub3QgYSBwb3NzaWJsZSBuZXh0IHN0YXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2xkIGRhdGEgdG8gYmUgZ2l2ZW4gdG8gX0NoZWNrV29ya09yZGVyUGFyYW1zKCkgYW5kIHRoZSBwb3N0IGV2ZW50IGhhbmRsZXIKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHRoZSB0aW1lc3RhbXBzIGFyZSBjb3JyZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tUaW1lc3RhbXBzKAogICAgICAgICVQYXJhbSwKICAgICAgICBXb3JrT3JkZXJEYXRhID0+ICRXb3JrT3JkZXJEYXRhLAogICAgKTsKCiAgICAjIHRyaWdnZXIgV29ya09yZGVyVXBkYXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJVcGRhdGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHNldCB0aGUgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgIG5leHQgS0VZIGlmICRLZXkgIX4gbXsgXEEgRHluYW1pY0ZpZWxkXyguKikgXHogfXhtczsKCiAgICAgICAgIyBzYXZlIHRoZSByZWFsIG5hbWUgb2YgdGhlIGR5bmFtaWMgZmllbGQgKHdpdGhvdXQgcHJlZml4KQogICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIGNvbmZpZwogICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICApOwoKICAgICAgICAjIHdyaXRlIHZhbHVlIHRvIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXskS2V5fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ3RpdGxlJywKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgID0+ICd3b3Jrb3JkZXJfbnVtYmVyJywKICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICdpbnN0cnVjdGlvbicsCiAgICAgICAgUmVwb3J0ICAgICAgICAgICA9PiAncmVwb3J0JywKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICd3b3Jrb3JkZXJfc3RhdGVfaWQnLAogICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJ3dvcmtvcmRlcl90eXBlX2lkJywKICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+ICd3b3Jrb3JkZXJfYWdlbnRfaWQnLAogICAgICAgIFdvcmtPcmRlckdyb3VwSUQgPT4gJ3dvcmtvcmRlcl9ncm91cF9pZCcsCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAncGxhbm5lZF9zdGFydF90aW1lJywKICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICdwbGFubmVkX2VuZF90aW1lJywKICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICdhY3R1YWxfc3RhcnRfdGltZScsCiAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnYWN0dWFsX2VuZF90aW1lJywKICAgICAgICBJbnN0cnVjdGlvblBsYWluID0+ICdpbnN0cnVjdGlvbl9wbGFpbicsCiAgICAgICAgUmVwb3J0UGxhaW4gICAgICA9PiAncmVwb3J0X3BsYWluJywKICAgICk7CgogICAgIyBidWlsZCBTUUwgdG8gdXBkYXRlIHdvcmtvcmRlcgogICAgbXkgJFNRTCA9ICdVUERBVEUgY2hhbmdlX3dvcmtvcmRlciBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgICMgZGVmaW5lIHRoZSBEZWZhdWx0VGltZVN0YW1wCiAgICBteSAkRGVmYXVsdFRpbWVTdGFtcCA9ICc5OTk5LTAxLTAxIDAwOjAwOjAwJzsKCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQXR0cmlidXRlICkgewoKICAgICAgICAjIHByZXNlcnZlIHRoZSBvbGQgdmFsdWUsIHdoZW4gdGhlIGNvbHVtbiBpc24ndCBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWV4aXN0cyAkUGFyYW17JEF0dHJpYnV0ZX07CgogICAgICAgICMgYXR0cmlidXRlIGlzIGRlZmluZWQKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU1FMIC49ICIkQXR0cmlidXRleyRBdHRyaWJ1dGV9ID0gPywgIjsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXskQXR0cmlidXRlfTsKICAgICAgICB9CgogICAgICAgICMgaXQncyBvayBpZiB0aGUgV29ya09yZGVyQWdlbnRJRCBpcyBub3QgZGVmaW5lZAogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnV29ya09yZGVyQWdlbnRJRCcgKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSBOVUxMLCAiOwogICAgICAgIH0KCiAgICAgICAgIyBpdCdzIG9rIGlmIHRoZSBXb3JrT3JkZXJHcm91cElEIGlzIG5vdCBkZWZpbmVkCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdXb3JrT3JkZXJHcm91cElEJyApIHsKICAgICAgICAgICAgJFNRTCAuPSAiJEF0dHJpYnV0ZXskQXR0cmlidXRlfSA9IE5VTEwsICI7CiAgICAgICAgfQoKICAgICAgICAjIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCBhbmQgaXMgb25lIG9mIHRoZSB0aW1lIHBhcmFtZXRlcnMKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgPX4gbXsgXEEgKCBBY3R1YWwgfCBQbGFubmVkICkgKCBTdGFydCB8IEVuZCApIFRpbWUgXHogfXhtcyApIHsKICAgICAgICAgICAgJFNRTCAuPSAiJEF0dHJpYnV0ZXskQXR0cmlidXRlfSA9ID8sICI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkRGVmYXVsdFRpbWVTdGFtcDsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGRpdGlvbiBvZiBhY2NvdW50ZWQgdGltZQogICAgaWYgKCAkUGFyYW17QWNjb3VudGVkVGltZX0gKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgYWNjb3VudGVkIHRpbWUKICAgICAgICBteSAkQ3VycmVudEFjY291bnRlZFRpbWUgPSAkV29ya09yZGVyRGF0YS0+e0FjY291bnRlZFRpbWV9IHx8IDA7CgogICAgICAgICMgYWRkIG5ldyBhY2NvdXRlZCB0aW1lIHRvIGN1cnJlbnQgYWNjb3VudGVkIHRpbWUKICAgICAgICBteSAkQWNjb3VudGVkVGltZSA9ICRDdXJyZW50QWNjb3VudGVkVGltZSArICRQYXJhbXtBY2NvdW50ZWRUaW1lfTsKCiAgICAgICAgIyBkYiBxdW90ZQogICAgICAgICRBY2NvdW50ZWRUaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkQWNjb3VudGVkVGltZSwgJ051bWJlcicgKTsKCiAgICAgICAgIyBidWlsZCBTUUwgKHdpdGhvdXQgYmluZHMpCiAgICAgICAgJFNRTCAuPSAiYWNjb3VudGVkX3RpbWUgPSAkQWNjb3VudGVkVGltZSwgIjsKICAgIH0KCiAgICAjIHNldHRpbmcgb2YgcGxhbm5lZCBlZmZvcnQKICAgIGlmICggJFBhcmFte1BsYW5uZWRFZmZvcnR9ICkgewoKICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgJFBhcmFte1BsYW5uZWRFZmZvcnR9CiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17UGxhbm5lZEVmZm9ydH0sICdOdW1iZXInICk7CgogICAgICAgICMgYnVpbGQgU1FMICh3aXRob3V0IGJpbmRzKQogICAgICAgICRTUUwgLj0gInBsYW5uZWRfZWZmb3J0ID0gJFBhcmFte1BsYW5uZWRFZmZvcnR9LCAiOwogICAgfQoKICAgICRTUUwgLj0gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgICRTUUwgLj0gJ1dIRVJFIGlkID0gPyc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1dvcmtPcmRlcklEfTsKCiAgICAjIHVwZGF0ZSB3b3Jrb3JkZXIKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgJ1dvcmtPcmRlckxpc3Q6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZVRpbWVHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ0NoYW5nZUdldDo6SUQ6OicgLiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgV29ya09yZGVyVXBkYXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyVXBkYXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBPbGRXb3JrT3JkZXJEYXRhID0+ICRXb3JrT3JkZXJEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgV29ya09yZGVyR2V0KCkKClJldHVybiBhIEM8V29ya09yZGVyPiBhcyBoYXNoIHJlZmVyZW5jZS4KV2hlbiB0aGUgQzx3b3Jrb3JkZXI+IGRvZXMgbm90IGV4aXN0LCBhIGZhbHNlIHZhbHVlIGlzIHJldHVybmVkLgpUaGUgb3B0aW9uYWwgb3B0aW9uIEM8TG9nTm8+IHR1cm5zIG9mZiBsb2dnaW5nIHdoZW4gdGhlIEM8d29ya29yZGVyPiBkb2VzIG5vdCBleGlzdC4KCiAgICBteSAkV29ya09yZGVyUmVmID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIExvZ05vICAgICAgID0+IDEsICAgICAgIyBvcHRpb25hbCwgdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiB0aGUgd29ya29yZGVyIGRvZXMgbm90IGV4aXN0CiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkV29ya09yZGVye1dvcmtPcmRlcklEfQogICAgJFdvcmtPcmRlcntDaGFuZ2VJRH0KICAgICRXb3JrT3JkZXJ7V29ya09yZGVyTnVtYmVyfQogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJUaXRsZX0KICAgICRXb3JrT3JkZXJ7SW5zdHJ1Y3Rpb259CiAgICAkV29ya09yZGVye0luc3RydWN0aW9uUGxhaW59CiAgICAkV29ya09yZGVye1JlcG9ydH0KICAgICRXb3JrT3JkZXJ7UmVwb3J0UGxhaW59CiAgICAkV29ya09yZGVye1dvcmtPcmRlclN0YXRlSUR9CiAgICAkV29ya09yZGVye1dvcmtPcmRlclN0YXRlfSAgICAgICAgICAgICAgIyBmZXRjaGVkIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJTdGF0ZVNpZ25hbH0gICAgICAgICMgZmV0Y2hlZCBmcm9tIFN5c0NvbmZpZwogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJUeXBlSUR9CiAgICAkV29ya09yZGVye1dvcmtPcmRlclR5cGV9ICAgICAgICAgICAgICAgIyBmZXRjaGVkIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJBZ2VudElEfQogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJHcm91cElEfQogICAgJFdvcmtPcmRlcntQbGFubmVkU3RhcnRUaW1lfQogICAgJFdvcmtPcmRlcntQbGFubmVkRW5kVGltZX0KICAgICRXb3JrT3JkZXJ7QWN0dWFsU3RhcnRUaW1lfQogICAgJFdvcmtPcmRlcntBY3R1YWxFbmRUaW1lfQogICAgJFdvcmtPcmRlcntBY2NvdW50ZWRUaW1lfQogICAgJFdvcmtPcmRlcntQbGFubmVkRWZmb3J0fQogICAgJFdvcmtPcmRlcntEeW5hbWljRmllbGRfWH0KICAgICRXb3JrT3JkZXJ7RHluYW1pY0ZpZWxkX1l9CiAgICAkV29ya09yZGVye0NyZWF0ZVRpbWV9CiAgICAkV29ya09yZGVye0NyZWF0ZUJ5fQogICAgJFdvcmtPcmRlcntDaGFuZ2VUaW1lfQogICAgJFdvcmtPcmRlcntDaGFuZ2VCeX0KCj1jdXQKCnN1YiBXb3JrT3JkZXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFdvcmtPcmRlcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlV29ya09yZGVyRGF0YTsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRQYXJhbXtXb3JrT3JkZXJJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoJENhY2hlKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICVXb3JrT3JkZXJEYXRhID0gJXskQ2FjaGV9OwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBkYXRhIGZyb20gZGF0YWJhc2UKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY2hhbmdlX2lkLCB3b3Jrb3JkZXJfbnVtYmVyLCB0aXRsZSwgJwogICAgICAgICAgICAgICAgLiAnaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uX3BsYWluLCAnCiAgICAgICAgICAgICAgICAuICdyZXBvcnQsIHJlcG9ydF9wbGFpbiwgJwogICAgICAgICAgICAgICAgLiAnd29ya29yZGVyX3N0YXRlX2lkLCB3b3Jrb3JkZXJfdHlwZV9pZCwgd29ya29yZGVyX2FnZW50X2lkLCB3b3Jrb3JkZXJfZ3JvdXBfaWQsICcKICAgICAgICAgICAgICAgIC4gJ3BsYW5uZWRfc3RhcnRfdGltZSwgcGxhbm5lZF9lbmRfdGltZSwgYWN0dWFsX3N0YXJ0X3RpbWUsIGFjdHVhbF9lbmRfdGltZSwgJwogICAgICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgJwogICAgICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgJwogICAgICAgICAgICAgICAgLiAncGxhbm5lZF9lZmZvcnQsIGFjY291bnRlZF90aW1lICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVySUR9ICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtDaGFuZ2VJRH0gICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlck51bWJlcn0gID0gJFJvd1syXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyVGl0bGV9ICAgPSBkZWZpbmVkICRSb3dbM10gPyAkUm93WzNdIDogJyc7CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe0luc3RydWN0aW9ufSAgICAgID0gZGVmaW5lZCAkUm93WzRdID8gJFJvd1s0XSA6ICcnOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtJbnN0cnVjdGlvblBsYWlufSA9IGRlZmluZWQgJFJvd1s1XSA/ICRSb3dbNV0gOiAnJzsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UmVwb3J0fSAgICAgICAgICAgPSBkZWZpbmVkICRSb3dbNl0gPyAkUm93WzZdIDogJyc7CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1JlcG9ydFBsYWlufSAgICAgID0gZGVmaW5lZCAkUm93WzddID8gJFJvd1s3XSA6ICcnOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZUlEfSA9ICRSb3dbOF07CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0gID0gJFJvd1s5XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyQWdlbnRJRH0gPSAkUm93WzEwXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyR3JvdXBJRH0gPSAkUm93WzExXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZFN0YXJ0VGltZX0gPSAkUm93WzEyXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZEVuZFRpbWV9ICAgPSAkUm93WzEzXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7QWN0dWFsU3RhcnRUaW1lfSAgPSAkUm93WzE0XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7QWN0dWFsRW5kVGltZX0gICAgPSAkUm93WzE1XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q3JlYXRlVGltZX0gICAgICAgPSAkUm93WzE2XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q3JlYXRlQnl9ICAgICAgICAgPSAkUm93WzE3XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q2hhbmdlVGltZX0gICAgICAgPSAkUm93WzE4XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q2hhbmdlQnl9ICAgICAgICAgPSAkUm93WzE5XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZEVmZm9ydH0gICAgPSAkUm93WzIwXSAvLyAnMC4wMCc7CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe0FjY291bnRlZFRpbWV9ICAgID0gJFJvd1syMV0gLy8gJzAuMDAnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIGlmICggISVXb3JrT3JkZXJEYXRhICkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya09yZGVySUQgJFBhcmFte1dvcmtPcmRlcklEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBUSU1FRklFTEQ6CiAgICAgICAgZm9yIG15ICRUaW1lIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lIEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewoKICAgICAgICAgICAgbmV4dCBUSU1FRklFTEQgaWYgISRXb3JrT3JkZXJEYXRheyRUaW1lfTsKCiAgICAgICAgICAgICMgY2xlYW51cCB0aW1lIHN0YW1wcyAoc29tZSBkYXRhYmFzZXMgYXJlIHVzaW5nIGUuIGcuIDIwMDgtMDItMjUgMjI6MDM6MDAuMDAwMDAwKQogICAgICAgICAgICAkV29ya09yZGVyRGF0YXskVGltZX0KICAgICAgICAgICAgICAgID1+IHN7IFxBICggXGRcZFxkXGQgLSBcZFxkIC0gXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCApIFwuIC4rPyBceiB9eyQxfXhtczsKCiAgICAgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0IHRpbWUgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nCiAgICAgICAgICAgIGlmICggJFdvcmtPcmRlckRhdGF7JFRpbWV9IGVxICc5OTk5LTAxLTAxIDAwOjAwOjAwJyApIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJEYXRheyRUaW1lfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFBsYW5uZWRFZmZvcnQgQWNjb3VudGVkVGltZSkpIHsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkV29ya09yZGVyRGF0YXskQXR0cmlidXRlfTsKCiAgICAgICAgICAgICMgZG8gbm90IHNob3cgemVybyB2YWx1ZXMKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyRGF0YXskQXR0cmlidXRlfSBlcSAwICkgewogICAgICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX0gPSAnJzsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbnZlcnQgZGVjaW1hbCBjaGFyYWN0ZXIgZnJvbSAnLCcgdG8gJy4nIGlmIG5lY2Nlc3NhcnkKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX0gPX4gc3ssfXsufXhtc2c7CgogICAgICAgICAgICAjIGZvcm1hdCBhcyBkZWNpbWFsIG51bWJlcgogICAgICAgICAgICAkV29ya09yZGVyRGF0YXskQXR0cmlidXRlfSA9IHNwcmludGYgJyUuMmYnLCAkV29ya09yZGVyRGF0YXskQXR0cmlidXRlfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgdGhlIG9iamVjdCB0eXBlIElUU01Xb3JrT3JkZXIKICAgICAgICBteSAkRHluYW1pY0ZpZWxkTGlzdAogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICk7CgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewoKICAgICAgICAgICAgIyB2YWxpZGF0ZSBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBkeW5hbWljIGZpZWxkIG5hbWUgYW5kIHZhbHVlIGludG8gdGhlIHdvcmtvcmRlciBkYXRhIGhhc2gKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlIC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgKHdvcmtvcmRlciBkYXRhIGV4aXN0cyBhdCB0aGlzIHBvaW50LCBpdCB3YXMgY2hlY2tlZCBiZWZvcmUpCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJVdvcmtPcmRlckRhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgdGhlIG5hbWUgb2YgdGhlIHdvcmtvcmRlciBzdGF0ZQogICAgaWYgKCAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZUlEfSApIHsKICAgICAgICAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZX0gPSAkU2VsZi0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCB0aGUgd29ya29yZGVyIHN0YXRlIHNpZ25hbAogICAgaWYgKCAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZX0gKSB7CgogICAgICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgc3RhdGUgc2lnbmFscwogICAgICAgIG15ICRTdGF0ZVNpZ25hbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTVdvcmtPcmRlcjo6U3RhdGU6OlNpZ25hbCcpOwoKICAgICAgICAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZVNpZ25hbH0gPSAkU3RhdGVTaWduYWwtPnsgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGV9IH07CiAgICB9CgogICAgIyBhZGQgdGhlIG5hbWUgb2YgdGhlIHdvcmtvcmRlciB0eXBlCiAgICBpZiAoICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyVHlwZX0gPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVXb3JrT3JkZXJEYXRhOwp9Cgo9aGVhZDIgV29ya09yZGVyTGlzdCgpCgpSZXR1cm4gYSBsaXN0IG9mIGFsbCBDPHdvcmtvcmRlcj4gaWRzIG9mIHRoZSBnaXZlbiBjaGFuZ2UgYXMgYXJyYXkgcmVmZXJlbmNlLgpUaGUgQzx3b3Jrb3JkZXI+IGlkcyBhcmUgb3JkZXJlZCBieSBDPHdvcmtvcmRlcj4gbnVtYmVyLgoKICAgIG15ICRXb3JrT3JkZXJJRHNSZWYgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJMaXN0KAogICAgICAgIENoYW5nZUlEID0+IDUsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBXb3JrT3JkZXJJRHM7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1dvcmtPcmRlckxpc3Q6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGNhY2hlCiAgICAgICAgQFdvcmtPcmRlcklEcyA9IEB7JENhY2hlfTsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZyb20gZGF0YWJhc2UKICAgIGVsc2UgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaWRzCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIGlkIEZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ09SREVSIEJZIHdvcmtvcmRlcl9udW1iZXIsIGlkJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSAoJElEKSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlcklEcywgJElEOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAV29ya09yZGVySURzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcQFdvcmtPcmRlcklEczsKfQoKPWhlYWQyIFdvcmtPcmRlclNlYXJjaCgpCgpSZXR1cm5zIGVpdGhlciBhIGxpc3QsIGFzIGFuIGFycmF5cmVmLCBvciBhIGNvdW50IG9mIGZvdW5kIEM8d29ya29yZGVyPiBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9PiAnQ09VTlQnPiBpcyBwYXNzZWQuCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIEM8Y3JpdGVyaXVtPiwgdGhlIGluZGl2aWR1YWwgbWVtYmVycyBhcmUgT1IgY29ubmVjdGVkLgpXaGVuIGFuIHVuZGVmIG9yIGEgcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGFycmF5IGlzIHBhc3NlZCwgdGhlbiB0aGUgc2VhcmNoIEM8Y3JpdGVyaXVtPgppcyBpZ25vcmVkLgoKICAgIG15ICRXb3JrT3JkZXJJRHNSZWYgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgQ2hhbmdlSURzICAgICAgICAgPT4gWyAxMjMsIDEyMiBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyTnVtYmVyICAgPT4gMTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFdvcmtPcmRlclRpdGxlICAgID0+ICdSZXBsYWNlbWVudCBvZiBtYWlsIHNlcnZlcicsICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluc3RydWN0aW9uICAgICAgID0+ICdJbnN0YWxsIHRoZSB0aGUgbmV3IHNlcnZlcicsICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlcG9ydCAgICAgICAgICAgID0+ICdJbnN0YWxsZWQgbmV3IHNlcnZlciB3aXRob3V0IHByb2JsZW1zJywgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIER5bmFtaWNGaWVsZHMgKGZvciB3b3Jrb3JkZXJzKQogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWyAxMSwgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gWyAnY2xvc2VkJywgJ2NhbmNlbGVkJyBdLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFdvcmtPcmRlclR5cGVJRHMgID0+IFsgMjEsIDIyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclR5cGVzICAgID0+IFsgJ2FwcHJvdmFsJywgJ3dvcmtvcmRlcicgXSwgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJHcm91cElEcyA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDcmVhdGVCeSAgICAgICAgICA9PiBbIDUsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICA9PiBbIDMsIDIsIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBzZWFyY2ggaW4gdGV4dCBmaWVsZHMgb2YgY2hhbmdlIG9iamVjdAogICAgICAgIENoYW5nZU51bWJlciAgICAgICAgPT4gJ051bWJlciBvZiBjaGFuZ2UnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgPT4gJ1RpdGxlIG9mIGNoYW5nZScsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZURlc2NyaXB0aW9uICAgPT4gJ0Rlc2NyaXB0aW9uIG9mIGNoYW5nZScsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUp1c3RpZmljYXRpb24gPT4gJ0p1c3RpZmljYXRpb24gb2YgY2hhbmdlJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBwbGFubmVkIHN0YXJ0IHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggcGxhbm5lZCBzdGFydCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggcGxhbm5lZCBlbmQgdGltZSBhZnRlciAuLi4KICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBwbGFubmVkIGVuZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIHN0YXJ0IHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIHN0YXJ0IHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBhY3R1YWwgZW5kIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIGVuZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggY3JlYXRlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgd29ya29yZGVycyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ3JlYXRlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgd29ya29yZGVycyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NoYW5nZUlEJywgJ1dvcmtPcmRlck51bWJlcicgXSwgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgZGVmYXVsdDogWyAnV29ya09yZGVySUQnIF0sCiAgICAgICAgIyAoV29ya09yZGVySUQsIENoYW5nZUlELCBXb3JrT3JkZXJOdW1iZXIsIFdvcmtPcmRlclRpdGxlCiAgICAgICAgIyBXb3JrT3JkZXJTdGF0ZUlELCBXb3JrT3JkZXJUeXBlSUQsIFdvcmtPcmRlckFnZW50SUQsIFdvcmtPcmRlckdyb3VwSUQsCiAgICAgICAgIyBQbGFubmVkU3RhcnRUaW1lLCBQbGFubmVkRW5kVGltZSwKICAgICAgICAjIEFjdHVhbFN0YXJ0VGltZSwgQWN0dWFsRW5kVGltZSwKICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgIyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBPcmRlckJ5OgogICAgICAgICMgVGhlIE9yZGVyQnlEaXJlY3Rpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBPcmRlckJ5IGF0dHJpYnV0ZS4KICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnRG93bicsICdVcCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdEb3duJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjICgwIHwgMSkgZGVmYXVsdCAxCgogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdDT1VOVCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2Ygd29ya29yZGVyIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgd29ya29yZGVycwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwoKICAgICAgICBNaXJyb3JEQiA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjICgwIHwgMSkgZGVmYXVsdCAwCiAgICAgICAgIyBpZiBzZXQgdG8gMSBhbmQgSVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoOjpNaXJyb3JEQgogICAgICAgICMgaXMgYWN0aXZhdGVkIGFuZCBhIG1pcnJvciBkYiBpcyBjb25maWd1cmVkIGluCiAgICAgICAgIyBDb3JlOjpNaXJyb3JEQjo6RFNOIHRoZSB3b3Jrb3JkZXIgc2VhcmNoIHdpbGwgdGhlbiB1c2UKICAgICAgICAjIHRoZSBtaXJyb3IgZGIKCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlclNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB2ZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBPcmRlckJ5CiAgICAgICAgT3JkZXJCeURpcmVjdGlvbgogICAgICAgIFdvcmtPcmRlclN0YXRlSURzCiAgICAgICAgV29ya09yZGVyU3RhdGVzCiAgICAgICAgV29ya09yZGVyVHlwZXMKICAgICAgICBXb3JrT3JkZXJUeXBlSURzCiAgICAgICAgQ2hhbmdlSURzCiAgICAgICAgV29ya09yZGVyQWdlbnRJRHMKICAgICAgICBXb3JrT3JkZXJHcm91cElEcwogICAgICAgIENyZWF0ZUJ5CiAgICAgICAgQ2hhbmdlQnkKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFyZ3VtZW50fSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWZpbmUgYSBsb2NhbCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgaWYgd2UgbmVlZCB0byBkbyBhIHdvcmtvcmRlciBzZWFyY2ggb24gYW4gZXh0ZXJuYWwgbWlycm9yIGRhdGFiYXNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte01pcnJvckRCfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoOjpNaXJyb3JEQicpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6RFNOJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpVc2VyJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNyZWF0ZSBhbiBleHRyYSBkYXRhYmFzZSBvYmplY3QgZm9yIHRoZSBtaXJyb3IgZGIKICAgICAgICBteSAkRXh0cmFEYXRhYmFzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgICAgICBEYXRhYmFzZURTTiAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6RFNOJyksCiAgICAgICAgICAgIERhdGFiYXNlVXNlciA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpVc2VyJyksCiAgICAgICAgICAgIERhdGFiYXNlUHcgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkRXh0cmFEYXRhYmFzZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBjcmVhdGUgZGF0YWJhc2Ugb2JqZWN0IGZvciBNaXJyb3JEQiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICREQk9iamVjdCA9ICRFeHRyYURhdGFiYXNlT2JqZWN0OwogICAgfQoKICAgIG15IEBTUUxXaGVyZTsgICAgICAgICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBASW5uZXJKb2luVGFibGVzOyAgICAjIGtlZXAgdHJhY2sgb2YgdGhlIHRhYmxlcyB0aGF0IG5lZWQgdG8gYmUgaW5uZXIgam9pbmVkCgogICAgIyBjaGVjayBhbGwgY29uZmlndXJlZCB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMsIGJ1aWxkIGxvb2t1cCBoYXNoIGJ5IG5hbWUKICAgIG15ICVXb3JrT3JkZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZzsKICAgIG15ICRXb3JrT3JkZXJEeW5hbWljRmllbGRzCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgKTsKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskV29ya09yZGVyRHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgJFdvcmtPcmRlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBkZWZpbmUgb3JkZXIgdGFibGUKICAgIG15ICVPcmRlckJ5VGFibGUgPSAoCgogICAgICAgICMgd29ya29yZGVyIGF0dHJpYnV0ZXMKICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICd3by5jaGFuZ2VfaWQnLAogICAgICAgIFdvcmtPcmRlcklEICAgICAgPT4gJ3dvLmlkJywKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgID0+ICd3by53b3Jrb3JkZXJfbnVtYmVyJywKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICd3by50aXRsZScsCiAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAnd28ud29ya29yZGVyX3N0YXRlX2lkJywKICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICd3by53b3Jrb3JkZXJfdHlwZV9pZCcsCiAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAnd28ud29ya29yZGVyX2FnZW50X2lkJywKICAgICAgICBXb3JrT3JkZXJHcm91cElEID0+ICd3by53b3Jrb3JkZXJfZ3JvdXBfaWQnLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJ3dvLnBsYW5uZWRfc3RhcnRfdGltZScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnd28ucGxhbm5lZF9lbmRfdGltZScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnd28uYWN0dWFsX3N0YXJ0X3RpbWUnLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJ3dvLmFjdHVhbF9lbmRfdGltZScsCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICA9PiAnd28uY3JlYXRlX3RpbWUnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJ3dvLmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICA9PiAnd28uY2hhbmdlX3RpbWUnLAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJ3dvLmNoYW5nZV9ieScsCgogICAgICAgICMgY2hhbmdlIGF0dHJpYnV0ZXMKICAgICAgICBDaGFuZ2VOdW1iZXIgICAgPT4gJ2MuY2hhbmdlX251bWJlcicsCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdjLnRpdGxlJywKICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gJ2MuY2hhbmdlX3N0YXRlX2lkJywKICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJ2MuY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAnYy5jaGFuZ2VfYnVpbGRlcl9pZCcsCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICdjLmNhdGVnb3J5X2lkJywKICAgICAgICBJbXBhY3RJRCAgICAgICAgPT4gJ2MuaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEICAgICAgPT4gJ2MucHJpb3JpdHlfaWQnLAogICAgICAgIFJlcXVlc3RlZFRpbWUgICA9PiAnYy5yZXF1ZXN0ZWRfdGltZScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CgogICAgICAgICMgam9pbiB0aGUgY2hhbmdlIHRhYmxlLCB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgdGhlIE9yZGVyQnktY2xhdXNlCiAgICAgICAgaWYgKCAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSA9fiBteyBcQSBjWy5dIH14bXMgKSB7CiAgICAgICAgICAgIHB1c2ggQElubmVySm9pblRhYmxlcywgJ2MnOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJwogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBvbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUKICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgY2hlY2sgd2hldGhlciBhbGwgb2YgdGhlIGdpdmVuIFdvcmtPcmRlclN0YXRlSURzIGFyZSB2YWxpZAogICAgcmV0dXJuIGlmICEkU2VsZi0+V29ya09yZGVyU3RhdGVJRHNDaGVjayggV29ya09yZGVyU3RhdGVJRHMgPT4gJFBhcmFte1dvcmtPcmRlclN0YXRlSURzfSApOwoKICAgICMgbG9vayB1cCBhbmQgdGh1cyBjaGVjayB0aGUgU3RhdGVzCiAgICBmb3IgbXkgJFdvcmtPcmRlclN0YXRlICggQHsgJFBhcmFte1dvcmtPcmRlclN0YXRlc30gfSApIHsKCiAgICAgICAgIyBsb29rIHVwIHRoZSBJRCBmb3IgdGhlIG5hbWUKICAgICAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRTZWxmLT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJFdvcmtPcmRlclN0YXRlLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgSUQgd2FzIGZvdW5kLCB3aGV0aGVyIHRoZSBuYW1lIGV4aXN0cwogICAgICAgIGlmICggISRXb3JrT3JkZXJTdGF0ZUlEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHdvcmtvcmRlciBzdGF0ZSAkV29ya09yZGVyU3RhdGUgaXMgbm90IGtub3duISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEc30gfSwgJFdvcmtPcmRlclN0YXRlSUQ7CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBXb3JrT3JkZXJUeXBlSURzIGFyZSBhbGwgdmFsaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja1dvcmtPcmRlclR5cGVJRHMoIFdvcmtPcmRlclR5cGVJRHMgPT4gJFBhcmFte1dvcmtPcmRlclR5cGVJRHN9ICk7CgogICAgIyBsb29rIHVwIGFuZCB0aHVzIGNoZWNrIHRoZSBXb3JrT3JkZXJUeXBlcwogICAgZm9yIG15ICRUeXBlICggQHsgJFBhcmFte1dvcmtPcmRlclR5cGVzfSB9ICkgewoKICAgICAgICAjIGdldCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgbXkgJFR5cGVJRCA9ICRTZWxmLT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICRUeXBlLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgSUQgd2FzIGZvdW5kLCB3aGV0aGVyIHRoZSBuYW1lIGV4aXN0cwogICAgICAgIGlmICggISRUeXBlSUQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgd29ya29yZGVyIHR5cGUgJyRUeXBlJyBpcyBub3Qga25vd24hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17V29ya09yZGVyVHlwZUlEc30gfSwgJFR5cGVJRDsKICAgIH0KCiAgICAjIGFkZCBzdHJpbmcgcGFyYW1zIHRvIHRoZSBXSEVSRSBjbGF1c2UKICAgIG15ICVTdHJpbmdQYXJhbXMgPSAoCgogICAgICAgICMgaW4gd29ya29yZGVyIHRhYmxlCiAgICAgICAgV29ya09yZGVyTnVtYmVyID0+ICd3by53b3Jrb3JkZXJfbnVtYmVyJywKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ3dvLnRpdGxlJywKICAgICAgICBJbnN0cnVjdGlvbiAgICAgPT4gJ3dvLmluc3RydWN0aW9uX3BsYWluJywKICAgICAgICBSZXBvcnQgICAgICAgICAgPT4gJ3dvLnJlcG9ydF9wbGFpbicsCgogICAgICAgICMgaW4gY2hhbmdlIHRhYmxlCiAgICAgICAgQ2hhbmdlTnVtYmVyICAgICAgICA9PiAnYy5jaGFuZ2VfbnVtYmVyJywKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgID0+ICdjLnRpdGxlJywKICAgICAgICBDaGFuZ2VEZXNjcmlwdGlvbiAgID0+ICdjLmRlc2NyaXB0aW9uX3BsYWluJywKICAgICAgICBDaGFuZ2VKdXN0aWZpY2F0aW9uID0+ICdjLmp1c3RpZmljYXRpb25fcGxhaW4nLAogICAgKTsKCiAgICAjIGFkZCBzdHJpbmcgcGFyYW1zIHRvIHNxbC13aGVyZS1hcnJheQogICAgU1RSSU5HUEFSQU06CiAgICBmb3IgbXkgJFN0cmluZ1BhcmFtICggc29ydCBrZXlzICVTdHJpbmdQYXJhbXMgKSB7CgogICAgICAgICMgY2hlY2sgc3RyaW5nIHBhcmFtcyBmb3IgdXNlZnVsIHZhbHVlcywgdGhlIHN0cmluZyAnMCcgaXMgYWxsb3dlZAogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWV4aXN0cyAkUGFyYW17JFN0cmluZ1BhcmFtfTsKICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICFkZWZpbmVkICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gZXEgJyc7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskU3RyaW5nUGFyYW19ICk7CgogICAgICAgICMgY2hlY2sgaWYgYSBDTE9CIGZpZWxkIGlzIHVzZWQgaW4gb3JhY2xlCiAgICAgICAgIyBGaXgvV29ya2Fyb3VuZCBmb3IgT1JBLTAwOTMyOiBpbmNvbnNpc3RlbnQgZGF0YXR5cGVzOiBleHBlY3RlZCAtIGdvdCBDTE9CCiAgICAgICAgbXkgJEZvcmNlTGlrZVNlYXJjaEZvclNwZWNpYWxGaWVsZHM7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0RCVHlwZX0gZXEgJ29yYWNsZScKICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgJFN0cmluZ1BhcmFtIGVxICdJbnN0cnVjdGlvbicKICAgICAgICAgICAgICAgIHx8ICRTdHJpbmdQYXJhbSBlcSAnUmVwb3J0JwogICAgICAgICAgICAgICAgfHwgJFN0cmluZ1BhcmFtIGVxICdDaGFuZ2VEZXNjcmlwdGlvbicKICAgICAgICAgICAgICAgIHx8ICRTdHJpbmdQYXJhbSBlcSAnQ2hhbmdlSnVzdGlmaWNhdGlvbicKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRm9yY2VMaWtlU2VhcmNoRm9yU3BlY2lhbEZpZWxkcyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZCAob3IgTElLRSBzZWFyY2ggaXMgZm9yY2VkIGZvciBzb21lIHNwZWNpYWwgZmllbGRzIG9uIG9yYWNsZSkKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gfHwgJEZvcmNlTGlrZVNlYXJjaEZvclNwZWNpYWxGaWVsZHMgKSB7CgogICAgICAgICAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAjIFF1b3RlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0sICdMaWtlJyApOwoKICAgICAgICAgICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBzdHJpbmcgcGFyYW1zIHdoaWNoIGNvbnRhaW4gb25seSAlCiAgICAgICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gPX4gbXsgXEEgJSogXHogfXhtczsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgIkxPV0VSKCRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSkgTElLRSBMT1dFUignJFBhcmFteyRTdHJpbmdQYXJhbX0nKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQoKICAgICAgICAjIG5vIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pID0gTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KCiAgICAgICAgIyBqb2luIHRoZSBjaGFuZ2UgdGFibGUsIHdoZW4gaXQgaXMgbmVlZGVkIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgICAgICBpZiAoICRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSA9fiBteyBcQSBjWy5dIH14bXMgKSB7CiAgICAgICAgICAgIHB1c2ggQElubmVySm9pblRhYmxlcywgJ2MnOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHNxbCBmb3IgZHluYW1pYyBmaWVsZHMKICAgIG15ICRTUUxEeW5hbWljRmllbGRJbm5lckpvaW5zID0gJyc7ICAgICMgam9pbi1zdGF0ZW1lbnRzCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgICAgICA9ICcnOyAgICAjIHdoZXJlLWNsYXVzZQogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyICAgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskV29ya09yZGVyRHluYW1pY0ZpZWxkc30gKSB7CgogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRTZWFyY2hQYXJhbSApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggcmVmICRTZWFyY2hQYXJhbSBuZSAnSEFTSCcgKTsKCiAgICAgICAgbXkgJE5lZWRKb2luOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICV7JFNlYXJjaFBhcmFtfSApIHsKCiAgICAgICAgICAgIG15IEBTZWFyY2hQYXJhbXMgPSAoIHJlZiAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgPyBAeyAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IH0KICAgICAgICAgICAgICAgIDogKCAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9ICk7CgogICAgICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnJzsKICAgICAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnICgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICoKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICAjIHZhbGlkYXRlIGRhdGEgdHlwZQogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcwogICAgICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdmFsdWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicgb24gZmllbGQgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YgogICAgICAgICAgICAgICAgICAgIC49ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcpICc7CiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlIC49ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YjsKICAgICAgICAgICAgICAgICROZWVkSm9pbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmVlZEpvaW4pIHsKCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKCiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkSW5uZXJKb2lucwogICAgICAgICAgICAgICAgICAgIC49ICJJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKHdvLmlkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIiAuCiAgICAgICAgICAgICAgICAgICAgJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKSAiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2hhbmdlSURzICAgICAgICAgPT4gJ3dvLmNoYW5nZV9pZCcsCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gJ3dvLndvcmtvcmRlcl9zdGF0ZV9pZCcsCiAgICAgICAgV29ya09yZGVyVHlwZUlEcyAgPT4gJ3dvLndvcmtvcmRlcl90eXBlX2lkJywKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiAnd28ud29ya29yZGVyX2FnZW50X2lkJywKICAgICAgICBXb3JrT3JkZXJHcm91cElEcyA9PiAnd28ud29ya29yZGVyX2dyb3VwX2lkJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgICA9PiAnd28uY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICA9PiAnd28uY2hhbmdlX2J5JywKICAgICk7CgogICAgIyBhZGQgYXJyYXkgcGFyYW1zIHRvIHNxbC13aGVyZS1hcnJheQogICAgQVJSQVlQQVJBTToKICAgIGZvciBteSAkQXJyYXlQYXJhbSAoIHNvcnQga2V5cyAlQXJyYXlQYXJhbXMgKSB7CgogICAgICAgICMgaWdub3JlIGVtcHR5IGxpc3RzCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICFAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgICMgcXVvdGUgYXMgaW50ZWdlcgogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICREQk9iamVjdC0+UXVvdGUoICRPbmVQYXJhbSwgJ0ludGVnZXInICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBzdHJpbmcKICAgICAgICBteSAkSW5TdHJpbmcgPSBqb2luICcsICcsIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkQXJyYXlQYXJhbXN7JEFycmF5UGFyYW19IElOICgkSW5TdHJpbmcpIjsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSB0aW1lIHBhcmFtcyBhbmQgYWRkIHRoZW0gdG8gdGhlIFdIRVJFIGNsYXVzZSBvZiB0aGUgU0VMRUNULVN0YXRlbWVudAogICAgbXkgJVRpbWVQYXJhbXMgPSAoCiAgICAgICAgQ3JlYXRlVGltZU5ld2VyRGF0ZSAgICAgICA9PiAnd28uY3JlYXRlX3RpbWUgPj0nLAogICAgICAgIENyZWF0ZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJ3dvLmNyZWF0ZV90aW1lIDw9JywKICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlICAgICAgID0+ICd3by5jaGFuZ2VfdGltZSA+PScsCiAgICAgICAgQ2hhbmdlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnd28uY2hhbmdlX3RpbWUgPD0nLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJ3dvLnBsYW5uZWRfc3RhcnRfdGltZSA+PScsCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnd28ucGxhbm5lZF9zdGFydF90aW1lIDw9JywKICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSAgID0+ICd3by5wbGFubmVkX2VuZF90aW1lID49JywKICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSAgID0+ICd3by5wbGFubmVkX2VuZF90aW1lIDw9JywKICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgID0+ICd3by5hY3R1YWxfc3RhcnRfdGltZSA+PScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlICA9PiAnd28uYWN0dWFsX3N0YXJ0X3RpbWUgPD0nLAogICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgICAgPT4gJ3dvLmFjdHVhbF9lbmRfdGltZSA+PScsCiAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSAgICA9PiAnd28uYWN0dWFsX2VuZF90aW1lIDw9JywKICAgICk7CiAgICBUSU1FUEFSQU06CiAgICBmb3IgbXkgJFRpbWVQYXJhbSAoIHNvcnQga2V5cyAlVGltZVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBUSU1FUEFSQU0gaWYgISRQYXJhbXskVGltZVBhcmFtfTsKCiAgICAgICAgaWYgKCAkUGFyYW17JFRpbWVQYXJhbX0gIX4gbXsgXEEgXGRcZFxkXGQtXGRcZC1cZFxkIFxzIFxkXGQ6XGRcZDpcZFxkIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICRUaW1lUGFyYW0gaGFzIGFuIGludmFsaWQgZGF0ZSBmb3JtYXQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskVGltZVBhcmFtfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskVGltZVBhcmFtfSApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRUaW1lUGFyYW1zeyRUaW1lUGFyYW19ICckUGFyYW17JFRpbWVQYXJhbX0nIjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICBteSBAU1FMT3JkZXJCeTsKICAgIG15ICRDb3VudCA9IDA7CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgIyBzZXQgdGhlIGRlZmF1bHQgb3JkZXIgZGlyZWN0aW9uCiAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgIyBhZGQgdGhlIGdpdmVuIG9yZGVyIGRpcmVjdGlvbgogICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0FTQyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdEb3duJyApIHsKICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnREVTQyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIFNRTAogICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAkRGlyZWN0aW9uIjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnQrKzsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgb3JkZXJpbmcgaXMgbm90IGRldGVybWluZWQKICAgICMgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQKICAgIGlmICggIWdyZXAgeyAkXyBlcSAnV29ya09yZGVySUQnIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxle1dvcmtPcmRlcklEfSBERVNDIjsKICAgIH0KCiAgICAjIGFzc2VtYmxlIHRoZSBTUUwgcXVlcnkKICAgIG15ICRTUUwgPSAnU0VMRUNUIHdvLmlkIEZST00gY2hhbmdlX3dvcmtvcmRlciB3byAnOwoKICAgICMgbW9kaWZ5IFNRTCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgIyBUaGVyZSBpcyBubyAnR1JPVVAgQlknIFNRTC1jbGF1c2UsIHRoZXJlZm9yZSBDT1VOVChjLmlkKSBhbHdheXMgZ2l2ZSB0aGUgd2FudGVkIGNvdW50CiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICAkU1FMICAgICAgICA9ICdTRUxFQ1QgQ09VTlQod28uaWQpIEZST00gY2hhbmdlX3dvcmtvcmRlciB3byAnOwogICAgICAgIEBTUUxPcmRlckJ5ID0gKCk7CiAgICB9CgogICAgIyBhZGQgdGhlIGpvaW5zCiAgICBteSAlTG9uZ1RhYmxlTmFtZSA9ICgKICAgICAgICBjID0+ICdjaGFuZ2VfaXRlbScsCiAgICApOwogICAgbXkgJVRhYmxlU2VlbjsKCiAgICBJTk5FUl9KT0lOX1RBQkxFOgogICAgZm9yIG15ICRUYWJsZSAoQElubmVySm9pblRhYmxlcykgewoKICAgICAgICAjIGRvIG5vdCBqb2luIGEgdGFibGUgdHdpY2UKICAgICAgICBuZXh0IElOTkVSX0pPSU5fVEFCTEUgaWYgJFRhYmxlU2VlbnskVGFibGV9OwoKICAgICAgICAkVGFibGVTZWVueyRUYWJsZX0gPSAxOwoKICAgICAgICBpZiAoICEkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5jb3VudGVyZWQgaW52YWxpZCBpbm5lciBqb2luIHRhYmxlICckVGFibGUnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRTUUwgLj0gIklOTkVSIEpPSU4gJExvbmdUYWJsZU5hbWV7JFRhYmxlfSAkVGFibGUgT04gJFRhYmxlLmlkID0gd28uY2hhbmdlX2lkICI7CiAgICB9CgogICAgIyBhZGQgdGhlIGR5bmFtaWMgZmllbGQgaW5uZXIgam9pbiBzdGF0ZW1lbnRzCiAgICAkU1FMIC49ICRTUUxEeW5hbWljRmllbGRJbm5lckpvaW5zOwoKICAgICMgYWRkIHRoZSBXSEVSRSBjbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAkU1FMIC49ICcgQU5EICcgLiAkU1FMRHluYW1pY0ZpZWxkV2hlcmU7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAkU1FMIC49ICcgV0hFUkUgJyAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnIE9SREVSIEJZICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcsICcsIEBTUUxPcmRlckJ5OwogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgICMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRQYXJhbXtMaW1pdH0gPSAxOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgY291bnQgYXMgc2NhbGFyCiAgICByZXR1cm4gJElEc1swXSBpZiAkUmVzdWx0IGVxICdDT1VOVCc7CgogICAgcmV0dXJuIFxASURzOwp9Cgo9aGVhZDIgV29ya09yZGVyRGVsZXRlKCkKCkRlbGV0ZSBhIEM8d29ya29yZGVyPi4KClRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgbGlua3MgYW5kIGF0dGFjaG1lbnRzIHRvIHRoZSBDPHdvcmtvcmRlcj4Kd2l0aCB0aGUgcGFzc2VkIEM8d29ya29yZGVyPiBpZC4KQWZ0ZXIgdGhhdCB0aGUgQzx3b3Jrb3JkZXI+IGlzIHJlbW92ZWQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgV29ya09yZGVySUQgID0+IDEyMywKICAgICAgICBOb051bWJlckNhbGMgPT4gMSwgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCwgaWYgMSBpdCBwcmV2ZW50cyBhIHJlY2FsY3VsYXRpb24gb2YgdGhlIHdvcmtvcmRlciBudW1iZXJzCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoV29ya09yZGVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBXb3JrT3JkZXJEZWxldGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckRlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IG9sZCB3b3Jrb3JkZXIgZGF0YSB0byBiZSBnaXZlbiB0byBwb3N0IGV2ZW50IGhhbmRsZXIKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgbGlua3MgdG8gdGhpcyB3b3Jrb3JkZXIKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIEtleSAgICA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiB3b3Jrb3JkZXIgYXR0YWNobWVudHMgYW5kIGRlbGV0ZSB0aGVtCiAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICk7CgogICAgZm9yIG15ICRGaWxlbmFtZSAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXInLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISREZWxldGVTdWNjZXNzOwogICAgfQoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIHJlcG9ydCBhdHRhY2htZW50cyBhbmQgZGVsZXRlIHRoZW0KICAgIG15IEBSZXBvcnRBdHRhY2htZW50cyA9ICRTZWxmLT5Xb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50TGlzdCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKICAgIGZvciBteSAkRmlsZW5hbWUgKEBSZXBvcnRBdHRhY2htZW50cykgewoKICAgICAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRTZWxmLT5Xb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAnV29ya09yZGVyUmVwb3J0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkRGVsZXRlU3VjY2VzczsKICAgIH0KCiAgICAjIGdldCBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIHRoZSBvYmplY3QgdHlwZSBJVFNNV29ya09yZGVyCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICApOwoKICAgICMgZGVsZXRlIGR5bmFtaWNmaWVsZCB2YWx1ZXMgZm9yIHRoaXMgd29ya29yZGVyCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+VmFsdWVEZWxldGUoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX3dvcmtvcmRlciBXSEVSRSBpZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtXb3JrT3JkZXJJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgJ1dvcmtPcmRlckxpc3Q6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZVRpbWVHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ0NoYW5nZUdldDo6SUQ6OicgLiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgV29ya09yZGVyRGVsZXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyRGVsZXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBPbGRXb3JrT3JkZXJEYXRhID0+ICRXb3JrT3JkZXJEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgV29ya09yZGVyQ2hhbmdlVGltZUdldCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBQbGFubmVkU3RhcnRUaW1lIHwgUGxhbm5lZEVuZFRpbWUgfCBBY3R1YWxTdGFydFRpbWUgfCBBY3R1YWxFbmRUaW1lCm9mIGEgY2hhbmdlLCB3aGljaCB3b3VsZCBiZSB0aGUgcmVzcGVjdGl2ZSB0aW1lIG9mIHRoZSBlYXJsaWVzdCBzdGFydGluZwpDPHdvcmtvcmRlcj4gKGZvciBzdGFydCB0aW1lcykgb3IgdGhlIGxhdGVzdCBlbmRpbmcgQzx3b3Jrb3JkZXI+IChmb3IgZW5kIHRpbWVzKS4KCkZvciBQbGFubmVkU3RhcnRUaW1lIHwgUGxhbm5lZEVuZFRpbWUgfCBBY3R1YWxFbmRUaW1lIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZAppZiBhbnkgb2YgdGhlIEM8d29ya29yZGVycz4gb2YgYSBjaGFuZ2UgaGFzIHRoZSByZXNwZWN0aXZlIHRpbWUgbm90IGRlZmluZWQuCgpUaGUgQWN0dWFsU3RhcnRUaW1lIGlzIGRlZmluZWQgd2hlbiBhbnkgb2YgdGhlIEM8d29ya29yZGVycz4gb2YgYSBjaGFuZ2UgaGFzCmEgZGVmaW5lZCBBY3R1YWxTdGFydFRpbWUuCgpSZXR1cm4KCiAgICAkVGltZXtQbGFubmVkU3RhcnRUaW1lfQogICAgJFRpbWV7UGxhbm5lZEVuZFRpbWV9CiAgICAkVGltZXtBY3R1YWxTdGFydFRpbWV9CiAgICAkVGltZXtBY3R1YWxFbmRUaW1lfQoKICAgIG15ICRUaW1lUmVmID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQ2hhbmdlVGltZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAgICAgIyBUT0RPOiAoZGVjaWRlIHRoaXMgbGF0ZXIhKQogICAgICAgIE1heWJlIGFkZCB0aGlzIG5ldyBhdHRyaWJ1dGU6CgogICAgICAgICMgVGhlc2UgYXJlIFdvcmtPcmRlclR5cGVzIChUeXBlcywgbm90IFN0YXRlcyEpCiAgICAgICAgIyB3aGljaCB3b3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBjYWxjdWxhdGlvbgogICAgICAgICMgb2YgdGhlIGNoYW5nZSBzdGFydCB0aW1lLgoKICAgICAgICBFeGNsdWRlV29ya09yZGVyVHlwZXMgPT4gWyAnYXBwcm92YWwnLCAncGlyJyBdLCAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbml0aWFsaXplIHRoZSByZXR1cm4gdGltZSBoYXNoCiAgICBteSAlVGltZVJldHVybjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnV29ya09yZGVyQ2hhbmdlVGltZUdldDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAjIGdldCBkYXRhIGZyb20gY2FjaGUKICAgICAgICAlVGltZVJldHVybiA9ICV7JENhY2hlfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGJ1aWxkIHNxbCwgdXNpbmcgbWluIGFuZCBtYXggZnVuY3Rpb25zCiAgICAgICAgbXkgJFNRTCA9ICdTRUxFQ1QgJwogICAgICAgICAgICAuICdNSU4oIHBsYW5uZWRfc3RhcnRfdGltZSApLCAnCiAgICAgICAgICAgIC4gJ01BWCggcGxhbm5lZF9lbmRfdGltZSApLCAnCiAgICAgICAgICAgIC4gJ01JTiggYWN0dWFsX3N0YXJ0X3RpbWUgKSwgJwogICAgICAgICAgICAuICdNQVgoIGFjdHVhbF9lbmRfdGltZSApICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfd29ya29yZGVyICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyc7CgogICAgICAgICMgcmV0cmlldmUgdGhlIHJlcXVlc3RlZCB0aW1lCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRUaW1lUmV0dXJue1BsYW5uZWRTdGFydFRpbWV9ID0gJFJvd1swXSB8fCAnJzsKICAgICAgICAgICAgJFRpbWVSZXR1cm57UGxhbm5lZEVuZFRpbWV9ICAgPSAkUm93WzFdIHx8ICcnOwogICAgICAgICAgICAkVGltZVJldHVybntBY3R1YWxTdGFydFRpbWV9ICA9ICRSb3dbMl0gfHwgJyc7CiAgICAgICAgICAgICRUaW1lUmV0dXJue0FjdHVhbEVuZFRpbWV9ICAgID0gJFJvd1szXSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIFRJTUVGSUVMRDoKICAgICAgICBmb3IgbXkgJFRpbWUgKCBzb3J0IGtleXMgJVRpbWVSZXR1cm4gKSB7CgogICAgICAgICAgICBuZXh0IFRJTUVGSUVMRCBpZiAhJFRpbWVSZXR1cm57JFRpbWV9OwoKICAgICAgICAgICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICAgICAgICAgICRUaW1lUmV0dXJueyRUaW1lfQogICAgICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwoKICAgICAgICAgICAgIyBzZXQgZW1wdHkgc3RyaW5nIGlmIHRoZSBkZWZhdWx0IHRpbWUgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJFRpbWVSZXR1cm57JFRpbWV9IGVxICc5OTk5LTAxLTAxIDAwOjAwOjAwJyApIHsKICAgICAgICAgICAgICAgICRUaW1lUmV0dXJueyRUaW1lfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGNoYW5nZSBoYXMgd29ya29yZGVycyB3aXRoIG5vdCB5ZXQgZGVmaW5lZCBwbGFubmVkX3N0YXJ0X3RpbWUgZW50cmllcwogICAgICAgIGlmICggJFRpbWVSZXR1cm57UGxhbm5lZFN0YXJ0VGltZX0gKSB7CgogICAgICAgICAgICAjIGJ1aWxkIFNRTAogICAgICAgICAgICBteSAkU1FMID0gJ1NFTEVDVCBjb3VudCgqKSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNoYW5nZV93b3Jrb3JkZXIgJwogICAgICAgICAgICAgICAgLiAiV0hFUkUgcGxhbm5lZF9zdGFydF90aW1lID0gJzk5OTktMDEtMDEgMDA6MDA6MDAnICIKICAgICAgICAgICAgICAgIC4gJ0FORCBjaGFuZ2VfaWQgPSA/JzsKCiAgICAgICAgICAgICMgcmV0cmlldmUgbnVtYmVyIG9mIG5vdCBkZWZpbmVkIGVudHJpZXMKICAgICAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgIG15ICRDb3VudDsKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICRDb3VudCA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzZXQgUGxhbm5lZFN0YXJ0VGltZQogICAgICAgICAgICBpZiAoJENvdW50KSB7CiAgICAgICAgICAgICAgICAkVGltZVJldHVybntQbGFubmVkU3RhcnRUaW1lfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVUaW1lUmV0dXJuLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJVRpbWVSZXR1cm47Cn0KCj1oZWFkMiBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIEM8d29ya29yZGVyPiBzdGF0ZS4gSWYgYSBDPHdvcmtvcmRlcj4gc3RhdGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIEM8d29ya29yZGVyPiBzdGF0ZS4gSWYgYSBDPHdvcmtvcmRlcj4gc3RhdGUgbmFtZSBpcyBnaXZlbiwKdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRXb3JrT3JkZXJTdGF0ZSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gMTU3LAogICAgKTsKCiAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdyZWFkeScsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlclN0YXRlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBlaXRoZXIgV29ya09yZGVyU3RhdGVJRCBvciBXb3JrT3JkZXJTdGF0ZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ICYmICEkUGFyYW17V29ya09yZGVyU3RhdGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJTdGF0ZUlEIG9yIFdvcmtPcmRlclN0YXRlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gJiYgJFBhcmFte1dvcmtPcmRlclN0YXRlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyU3RhdGVJRCBPUiBXb3JrT3JkZXJTdGF0ZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nCiAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICk7CgogICAgIyBjb252ZXJ0IHN0YXRlIGxpc3QgaW50byBhIGxvb2t1cCBoYXNoCiAgICBteSAlU3RhdGVJRDJOYW1lOwogICAgaWYgKCAkU3RhdGVMaXN0ICYmIHJlZiAkU3RhdGVMaXN0IGVxICdIQVNIJyAmJiAleyRTdGF0ZUxpc3R9ICkgewogICAgICAgICVTdGF0ZUlEMk5hbWUgPSAleyRTdGF0ZUxpc3R9OwogICAgfQoKICAgICMgY2hlY2sgdGhlIHN0YXRlIGhhc2gKICAgIGlmICggISVTdGF0ZUlEMk5hbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgcmV0cmlldmUgd29ya29yZGVyIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cuJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTdGF0ZUlEMk5hbWV7ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmV2ZXJzZSBrZXkgLSB2YWx1ZSBwYWlycyB0byBoYXZlIHRoZSBuYW1lIGFzIGtleXMKICAgICAgICBteSAlU3RhdGVOYW1lMklEID0gcmV2ZXJzZSAlU3RhdGVJRDJOYW1lOwoKICAgICAgICByZXR1cm4gJFN0YXRlTmFtZTJJRHsgJFBhcmFte1dvcmtPcmRlclN0YXRlfSB9OwogICAgfQp9Cgo9aGVhZDIgV29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoKQoKVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgcG9zc2libGUgQzx3b3Jrb3JkZXI+IHN0YXRlcy4KSWYgQzxXb3JrT3JkZXJJRD4gaXMgb21pdHRlZCwgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgQzx3b3Jrb3JkZXI+IHN0YXRlcyBpcyByZXR1cm5lZC4KSWYgQzxXb3JrT3JkZXJJRD4gaXMgZ2l2ZW4sIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIGdpdmVuCkM8d29ya29yZGVyPiBpcyByZXR1cm5lZC4KCiAgICBteSAkV29ya09yZGVyU3RhdGVMaXN0ID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIGhhc2hyZWZzLiBUaGUgZWxlbWVudCAnS2V5JyBpcyB0aGVuCnRoZSBTdGF0ZUlEIGFuZCB0aGUgZWxlbWVudCAnVmFsdWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBzdGF0ZS4gVGhlIGFycmF5IGVsZW1lbnRzCmFyZSBzb3J0ZWQgYnkgc3RhdGUgaWQuCgogICAgbXkgJFdvcmtPcmRlclN0YXRlTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE1NiwKICAgICAgICAgICAgVmFsdWUgPT4gJ2FjY2VwdGVkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU3LAogICAgICAgICAgICBWYWx1ZSA9PiAnaW4gcHJvZ3Jlc3MnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHN0YXRlIGxpc3QKICAgIG15ICRTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgKSB8fCB7fTsKCiAgICAjIHRvIHN0b3JlIGFuIGFycmF5IG9mIGhhc2ggcmVmcwogICAgbXkgQEFycmF5SGFzaFJlZjsKCiAgICAjIGlmIFdvcmtPcmRlcklEIGlzIGdpdmVuLCBvbmx5IHVzZSBwb3NzaWJsZSBuZXh0IHN0YXRlcyBhcyBkZWZpbmVkIGluIHN0YXRlIG1hY2hpbmUKICAgIGlmICggJFBhcmFte1dvcmtPcmRlcklEfSApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3Igc3RhdGUgbG9jawogICAgICAgIG15ICRTdGF0ZUxvY2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpCiAgICAgICAgICAgIC0+Q29uZGl0aW9uTWF0Y2hTdGF0ZUxvY2soCiAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBTZWxlY3RvciAgID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIHNldCBhcyBkZWZhdWx0IHN0YXRlIGN1cnJlbnQgd29ya29yZGVyIHN0YXRlCiAgICAgICAgbXkgQE5leHRTdGF0ZUlEcyA9ICggJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ICk7CgogICAgICAgICMgY2hlY2sgaWYgcmVhY2hhYmxlIHdvcmtvcmRlciBlbmQgc3RhdGVzIHNob3VsZCBiZSBhbGxvd2VkIGZvciBsb2NrZWQgd29ya29yZGVyIHN0YXRlcwogICAgICAgIG15ICRXb3JrT3JkZXJFbmRTdGF0ZXNBbGxvd2VkCiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNV29ya09yZGVyOjpTdGF0ZUxvY2s6OkFsbG93RW5kU3RhdGVzJyk7CgogICAgICAgIGlmICgkV29ya09yZGVyRW5kU3RhdGVzQWxsb3dlZCkgewoKICAgICAgICAgICAgIyBzZXQgYXMgZGVmYXVsdCBzdGF0ZSBjdXJyZW50IHN0YXRlIGFuZCBhbGwgcG9zc2libGUgZW5kIHN0YXRlcwogICAgICAgICAgICBteSAkRW5kU3RhdGVJRHNSZWYKICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKQogICAgICAgICAgICAgICAgLT5TdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoCiAgICAgICAgICAgICAgICBTdGF0ZUlEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICAgICAgICAgKSB8fCBbXTsKICAgICAgICAgICAgQE5leHRTdGF0ZUlEcyA9IHNvcnQgKCBAeyRFbmRTdGF0ZUlEc1JlZn0sICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbmV4dCBzdGF0ZXMgaWYgbm8gc3RhdGUgbG9jawogICAgICAgIGlmICggISRTdGF0ZUxvY2sgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgcG9zc2libGUgbmV4dCBzdGF0ZSBpZHMKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJykKICAgICAgICAgICAgICAgIC0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgICAgICkgfHwgW107CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZSBpZCB0byBsaXN0CiAgICAgICAgICAgIEBOZXh0U3RhdGVJRHMgPSBzb3J0ICggQHskTmV4dFN0YXRlSURzUmVmfSwgJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGFzc2VtYmxlIHRoZSBhcnJheSBvZiBoYXNoIHJlZnMgd2l0aCBvbmx5IHBvc3NpYmxlIG5leHQgc3RhdGVzCiAgICAgICAgU1RBVEVJRDoKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBOZXh0U3RhdGVJRHMpIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgaWQKICAgICAgICAgICAgbmV4dCBTVEFURUlEIGlmICEkU3RhdGVJRDsKCiAgICAgICAgICAgICMgc3RvcmUgaWQgYW5kIG5hbWUgaW4gdGhlIGFycmF5CiAgICAgICAgICAgIHB1c2ggQEFycmF5SGFzaFJlZiwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIGFycmF5IG9mIGhhc2ggcmVmcyB3aXRoIGFsbCBuZXh0IHN0YXRlcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICV7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9Cgo9aGVhZDIgV29ya09yZGVyVHlwZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIEM8d29ya29yZGVyPiB0eXBlLiBJZiBhIEM8d29ya29yZGVyPiB0eXBlIGlkIGlzIGdpdmVuLAppdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBDPHdvcmtvcmRlcj4gdHlwZS4gSWYgYSBDPHdvcmtvcmRlcj4gdHlwZSBuYW1lIGlzIGdpdmVuLAp0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJFdvcmtPcmRlclR5cGUgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclR5cGVJRCA9PiAxNTcsCiAgICApOwoKICAgIG15ICRXb3JrT3JkZXJUeXBlSUQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclR5cGUgPT4gJ3JlYWR5JywKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyVHlwZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZWl0aGVyIFdvcmtPcmRlclR5cGVJRCBvciBXb3JrT3JkZXJUeXBlIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17V29ya09yZGVyVHlwZUlEfSAmJiAhJFBhcmFte1dvcmtPcmRlclR5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJUeXBlSUQgb3IgV29ya09yZGVyVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gJiYgJFBhcmFte1dvcmtPcmRlclR5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJUeXBlSUQgT1IgV29ya09yZGVyVHlwZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHR5cGUgZnJvbSBnZW5lcmFsIGNhdGFsb2cKICAgICMgbWFwcGluZyBvZiB0aGUgaWQgdG8gdGhlIG5hbWUKICAgIG15ICVXb3JrT3JkZXJUeXBlID0gJXsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgICAgICAgICApCiAgICB9OwoKICAgICMgY2hlY2sgdGhlIHdvcmtvcmRlciB0eXBlcyBoYXNoCiAgICBpZiAoICElV29ya09yZGVyVHlwZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCByZXRyaWV2ZSB3b3Jrb3JkZXIgdHlwZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nLicsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgcmV0dXJuICRXb3JrT3JkZXJUeXBleyAkUGFyYW17V29ya09yZGVyVHlwZUlEfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmV2ZXJzZSBrZXkgLSB2YWx1ZSBwYWlycyB0byBoYXZlIHRoZSBuYW1lIGFzIGtleXMKICAgICAgICBteSAlUmV2ZXJzZWRXb3JrT3JkZXJUeXBlID0gcmV2ZXJzZSAlV29ya09yZGVyVHlwZTsKCiAgICAgICAgcmV0dXJuICRSZXZlcnNlZFdvcmtPcmRlclR5cGV7ICRQYXJhbXtXb3JrT3JkZXJUeXBlfSB9OwogICAgfQp9Cgo9aGVhZDIgV29ya09yZGVyVHlwZUxpc3QoKQoKVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIEM8d29ya29yZGVyPiB0eXBlcy4KCiAgICBteSAkV29ya09yZGVyVHlwZUxpc3QgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTGlzdCgKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIERlZmF1bHQgICAgID0+IDEsICAgIyBvcHRpb25hbCAtIHRoZSBkZWZhdWx0IHR5cGUgaXMgc2VsZWN0ZWQgdHlwZSAoZGVmYXVsdDogMCkKICAgICAgICBTZWxlY3RlZElEICA9PiAxMjMsICMgb3B0aW9uYWwgLSB0aGlzIGlkIGlzIHNlbGVjdGVkCiAgICApOwoKVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNocmVmcy4gVGhlIEVsZW1lbnQgJ0tleScgaXMgdGhlbgp0aGUgVHlwZUlEIGFuZCBkaWUgRWxlbWVudCAnVmFsdWUnIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiBUaGUgYXJyYXkgZWxlbWVudHMKYXJlIHNvcnRlZCBieSB0eXBlIGlkLgoKICAgIG15ICRXb3JrT3JkZXJUeXBlTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE3MSwKICAgICAgICAgICAgVmFsdWUgPT4gJ3dvcmtvcmRlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE3MiwKICAgICAgICAgICAgVmFsdWUgPT4gJ2JhY2tvdXQnLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIFdvcmtPcmRlclR5cGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB3aGF0IHR5cGUgaXMgc2VsZWN0ZWQKICAgIG15ICRTZWxlY3RlZElEID0gJFBhcmFte1NlbGVjdGVkfSB8fCAwOwoKICAgIGlmICggJFBhcmFte0RlZmF1bHR9ICkgewoKICAgICAgICAjIHNldCBjb25maWcgb3B0aW9uCiAgICAgICAgbXkgJENvbmZpZ09wdGlvbiA9ICdJVFNNV29ya09yZGVyOjpUeXBlOjpEZWZhdWx0JzsKCiAgICAgICAgIyBnZXQgZGVmYXVsdCB3b3Jrb3JkZXIgdHlwZSBmcm9tIGNvbmZpZwogICAgICAgIG15ICREZWZhdWx0VHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgkQ29uZmlnT3B0aW9uKTsKCiAgICAgICAgIyBjaGVjayBpZiBkZWZhdWx0IHR5cGUgZXhpc3RzIGluIGdlbmVyYWwgY2F0YWxvZwogICAgICAgIG15ICRJdGVtRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlJywKICAgICAgICAgICAgTmFtZSAgPT4gJERlZmF1bHRUeXBlLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgaGFuZGxpbmcgYmVjYXVzZSBvZiBpbnZhbGlkIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgaWYgKCAhJEl0ZW1EYXRhUmVmIHx8IHJlZiAkSXRlbURhdGFSZWYgbmUgJ0hBU0gnIHx8ICEleyRJdGVtRGF0YVJlZn0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgZGVmYXVsdCBXb3JrT3JkZXJUeXBlICckRGVmYXVsdFR5cGUnICIKICAgICAgICAgICAgICAgICAgICAuICJpbiBzeXNjb25maWcgb3B0aW9uICckQ29uZmlnT3B0aW9uJyBpcyBpbnZhbGlkISBDaGVjayB0aGUgZ2VuZXJhbCBjYXRhbG9nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGRlZmF1bHQKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHR5cGUgbGlzdAogICAgbXkgJFdvcmtPcmRlclR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgKSB8fCB7fTsKCiAgICAjIGFzc2VtYmxlIGEgYW4gYXJyYXkgb2YgaGFzaCByZWZzCiAgICBteSBAQXJyYXlIYXNoUmVmOwogICAgZm9yIG15ICRUeXBlSUQgKCBzb3J0IGtleXMgJXskV29ya09yZGVyVHlwZUxpc3R9ICkgewogICAgICAgIG15ICVTZWxlY3RlZEluZm87CgogICAgICAgIGlmICggJFNlbGVjdGVkSUQgJiYgJFNlbGVjdGVkSUQgPT0gJFR5cGVJRCApIHsKICAgICAgICAgICAgJFNlbGVjdGVkSW5mb3tTZWxlY3RlZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgIFZhbHVlID0+ICRXb3JrT3JkZXJUeXBlTGlzdC0+eyRUeXBlSUR9LAogICAgICAgICAgICAlU2VsZWN0ZWRJbmZvLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9Cgo9aGVhZDIgUGVybWlzc2lvbigpCgpSZXR1cm5zIHdoZXRoZXIgdGhlIGFnZW50IEM8VXNlcklEPiBoYXMgcGVybWlzc2lvbnMgb2YgdGhlIHR5cGUgQzxUeXBlPgpvbiB0aGUgQzx3b3Jrb3JkZXI+IEM8V29ya09yZGVySUQ+LiBUaGUgcGFyYW1ldGVycyBhcmUgcGFzc2VkIG9uIHRvCnRoZSBwZXJtaXNzaW9uIG1vZHVsZXMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHBlcm1pc3Npb24gcmVnaXN0cnkuClRoZSBzdGFuZGFyZCBwZXJtaXNzaW9uIHJlZ2lzdHJ5IGlzIEI8SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbj4sIGJ1dAp0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggdGhlIHBhcmFtZXRlciBDPFBlcm1pc3Npb25SZWdpc3RyeT4uCgpUaGUgcmVnaXN0ZXJlZCBwZXJtaXNzaW9uIG1vZHVsZXMgYXJlIHJ1biBpbiB0aGUgYWxwaGFiZXRpY2FsIG9yZGVyIG9mCnRoZWlyIHJlZ2lzdHJ5IGtleXMuCk92ZXJhbGwgcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gYSBwZXJtaXNzaW9uIG1vZHVsZSwgd2hpY2ggaGFzIHRoZSBhdHRyaWJ1dGUgJ0dyYW50ZWQnIHNldCwKZ3JhbnRzIHBlcm1pc3Npb24uIE92ZXJhbGwgcGVybWlzc2lvbiBpcyBkZW5pZWQgd2hlbiBhIHBlcm1pc3Npb24gbW9kdWxlLCB3aGljaCBoYXMgdGhlIGF0dHJpYnV0ZSAnUmVxdWlyZWQnCnNldCwgZGVuaWVzIHBlcm1pc3Npb24uIE92ZXJhbGwgcGVybWlzc2lvbiBpcyBhbHNvIGRlbmllZCB3aGVuIHdoZW4gYWxsIHBlcm1pc3Npb24gbW9kdWxlIHdlcmUgYXNrZWQKd2l0aG91dCBjb21pbmcgdG8gYW4gY29uY2x1c2lvbi4KCkFwcHJvdmFsIGlzIGluZGljYXRlZCBieSB0aGUgcmV0dXJuIHZhbHVlIDEuIERlbmlhbCBpcyBpbmRpY2F0ZWQgYnkgcmV0dXJuaW5nIGFuIGVtcHR5IGxpc3QuCgpUaGUgb3B0aW9uYWwgb3B0aW9uIEM8TG9nTm8+IHR1cm5zIG9mZiBsb2dnaW5nIHdoZW4gYWNjZXNzIHdhcyBkZW5pZWQuClRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIG1ldGhvZCBpcyB1c2VkIGZvciBjaGVja2luZyB3aGV0aGVyIGEgbGluayBvciBhbiBhY3Rpb24gc2hvdWxkIGJlIHNob3duLgoKICAgIG15ICRBY2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgID0+ICdybycsICAgICAgICAgICAgICAgICAgICAgICAgICMgJ3JvJyBhbmQgJ3J3JyBhcmUgc3VwcG9ydGVkCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgID0+ICdBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQnLCAgICMgb3B0aW9uYWwKICAgICAgICBXb3JrT3JkZXJJRCAgICAgICAgPT4gNDQ0NCwKICAgICAgICBQZXJtaXNzaW9uUmVnaXN0cnkgPT4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHdpdGggZGVmYXVsdCAnSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbicKICAgICAgICBMb2dObyAgICAgICAgICAgICAgPT4gMSwgICAgICAjIG9wdGlvbmFsLCB0dXJucyBvZmYgbG9nZ2luZyB3aGVuIGFjY2VzcyBpcyBkZW5pZWQKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlIFVzZXJJRCBXb3JrT3JkZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgcGxhY2Ugd2hlcmUgdGhlIHBlcm1pc3Npb24gbW9kdWxlcyBhcmUgcmVnaXN0ZXJkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgcGFyYW1ldGVyCiAgICBteSAkUmVnaXN0cnkgPSAkUGFyYW17UGVybWlzc2lvblJlZ2lzdHJ5fSB8fCAnSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbic7CgogICAgIyBydW4gdGhlIHJlbGV2YW50IHBlcm1pc3Npb24gbW9kdWxlcwogICAgaWYgKCByZWYgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCRSZWdpc3RyeSkgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlTW9kdWxlcyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgkUmVnaXN0cnkpIH07CgogICAgICAgIE1PRFVMRToKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAlTW9kdWxlcyApIHsKCiAgICAgICAgICAgICMgbG9nIHRyeSBvZiBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ID4gMSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRyeSB0byBsb2FkIG1vZHVsZTogJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgTU9EVUxFCiAgICAgICAgICAgICAgICBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKQogICAgICAgICAgICAgICAgLT5SZXF1aXJlKCAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdAogICAgICAgICAgICBteSAkTW9kdWxlT2JqZWN0ID0gJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9LT5uZXcoKTsKCiAgICAgICAgICAgICMgYXNrIGZvciB0aGUgb3BpbmlvbiBvZiB0aGUgUGVybWlzc2lvbiBtb2R1bGUKICAgICAgICAgICAgbXkgJEFjY2VzcyA9ICRNb2R1bGVPYmplY3QtPlJ1biglUGFyYW0pOwoKICAgICAgICAgICAgIyBHcmFudCBvdmVyYWxsIHBlcm1pc3Npb24sCiAgICAgICAgICAgICMgd2hlbiB0aGUgbW9kdWxlIGdyYW50ZWQgYSBzdWZmaWNpZW50IHBlcm1pc3Npb24uCiAgICAgICAgICAgIGlmICggJEFjY2VzcyAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e0dyYW50ZWR9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHcmFudGVkICckUGFyYW17VHlwZX0nIGFjY2VzcyBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVXNlcklEOiAkUGFyYW17VXNlcklEfSBvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJXb3JrT3JkZXJJRCAnJFBhcmFte1dvcmtPcmRlcklEfScgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAidGhyb3VnaCAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gKG5vIG1vcmUgY2hlY2tzKSEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBncmFudCBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEZW55IG92ZXJhbGwgcGVybWlzc2lvbiwKICAgICAgICAgICAgIyB3aGVuIHRoZSBtb2R1bGUgZGVuaWVkIGEgcmVxdWlyZWQgcGVybWlzc2lvbi4KICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRGVuaWVkICckUGFyYW17VHlwZX0nIGFjY2VzcyBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiVXNlcklEOiAkUGFyYW17VXNlcklEfSBvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJXb3JrT3JkZXJJRCAnJFBhcmFte1dvcmtPcmRlcklEfScgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiYmVjYXVzZSAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gaXMgcmVxdWlyZWQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZGVueSBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBEZW55IGFjY2VzcyB3aGVuIG5laXRoZXIgYSAnR3JhbnRlZCctQ2hlY2sgbm9yIGEgJ1JlcXVpcmVkJy1DaGVjayBoYXMgcmVhY2hlZCBhIGNvbmNsdXNpb24uCiAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIChVc2VySUQ6ICRQYXJhbXtVc2VySUR9ICckUGFyYW17VHlwZX0nICIKICAgICAgICAgICAgICAgIC4gIm9uIFdvcmtPcmRlcklEOiAkUGFyYW17V29ya09yZGVySUR9KSEiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgV29ya09yZGVyU3RhdGVJRHNDaGVjaygpCgpDaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgZ2l2ZW4gQzx3b3Jrb3JkZXI+IHN0YXRlIGlkcyBhcmUgdmFsaWQuClRoZSBtZXRob2QgaXMgcHVibGljIGFzIGl0IGlzIHVzZWQgaW4gTDxLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoPi4KCiAgICBteSAkT2sgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUlEc0NoZWNrKAogICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFsgMjUgXSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyU3RhdGVJRHNDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJTdGF0ZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte1dvcmtPcmRlclN0YXRlSURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIFdvcmtPcmRlclN0YXRlSURzIG11c3QgYmUgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBXb3JrT3JkZXJTdGF0ZUlEcyBiZWxvbmdzIHRvIGNvcnJlY3QgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBmb3IgbXkgJFN0YXRlSUQgKCBAeyAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9IH0gKSB7CiAgICAgICAgbXkgJFN0YXRlID0gJFNlbGYtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdGF0ZSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzdGF0ZSBpZCAkU3RhdGVJRCBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBXb3JrT3JkZXJBdHRhY2htZW50QWRkKCkKCkFkZCBhbiBhdHRhY2htZW50IHRvIHRoZSBnaXZlbiBDPHdvcmtvcmRlcj4uCgogICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50QWRkKAogICAgICAgIENoYW5nZUlEICAgICAgID0+IDEyMywKICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiA0NTYsICAgICAgICAgICAgIyB0aGUgV29ya09yZGVySUQgYmVjb21lcyBwYXJ0IG9mIHRoZSBmaWxlIHBhdGgKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAnV29ya09yZGVyJywgICAgIyAoICdXb3JrT3JkZXInIHx8ICdXb3JrT3JkZXJSZXBvcnQnKSAgKG9wdGlvbmFsLCBkZWZhdWx0ICdXb3JrT3JkZXInICkKICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAnZmlsZW5hbWUnLAogICAgICAgIENvbnRlbnQgICAgICAgID0+ICdjb250ZW50JywKICAgICAgICBDb250ZW50VHlwZSAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hhbmdlSUQgV29ya09yZGVySUQgRmlsZW5hbWUgQ29udGVudCBDb250ZW50VHlwZSBVc2VySUQgKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCBhdHRhY2htZW50IHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhdHRhY2htZW50cyBvZiB3b3Jrb3JkZXJzCiAgICAjIGFuZCB0aG9zZSBmcm9tIHJlcG9ydHMgb2Ygd29ya29yZGVycwogICAgbXkgJEF0dGFjaG1lbnRUeXBlID0gJFBhcmFte0F0dGFjaG1lbnRUeXBlfSB8fCAnV29ya09yZGVyJzsKCiAgICAjIHNldCBldmVudCBuYW1lIGJhc2VkIG9uIHRoZSBhdHRhY2htZW50IHR5cGUKICAgIG15ICRFdmVudDsKICAgIGlmICggJEF0dGFjaG1lbnRUeXBlIGVxICdXb3JrT3JkZXInICkgewogICAgICAgICRFdmVudCA9ICdXb3JrT3JkZXJBdHRhY2htZW50QWRkUG9zdCc7CiAgICB9CiAgICBlbHNpZiAoICRBdHRhY2htZW50VHlwZSBlcSAnV29ya09yZGVyUmVwb3J0JyApIHsKICAgICAgICAkRXZlbnQgPSAnV29ya09yZGVyUmVwb3J0QXR0YWNobWVudEFkZFBvc3QnOwogICAgfQoKICAgICMgd3JpdGUgdG8gdmlydHVhbCBmcwogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPldyaXRlKAogICAgICAgIEZpbGVuYW1lICAgID0+ICIkQXR0YWNobWVudFR5cGUvJFBhcmFte1dvcmtPcmRlcklEfS8kUGFyYW17RmlsZW5hbWV9IiwKICAgICAgICBNb2RlICAgICAgICA9PiAnYmluYXJ5JywKICAgICAgICBDb250ZW50ICAgICA9PiBcJFBhcmFte0NvbnRlbnR9LAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29udGVudElEICAgPT4gJFBhcmFte0NvbnRlbnRJRH0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnRBZGQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAkRXZlbnQsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCBhZGQgYXR0YWNobWVudCBmb3Igd29ya29yZGVyICRQYXJhbXtXb3JrT3JkZXJJRH0iLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoKQoKRGVsZXRlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gMTIzNDUsCiAgICAgICAgV29ya09yZGVySUQgICAgPT4gNTEyMywKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAnV29ya09yZGVyJywgICAgICAgICAgICMgKCAnV29ya09yZGVyJyB8fCAnV29ya09yZGVyUmVwb3J0JykgIChvcHRpb25hbCwgZGVmYXVsdCAnV29ya09yZGVyJyApCiAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJ1Byb2plY3RwbGFuLnBkZicsICAgICAjIGlkZW50aWZpZXMgdGhlIGF0dGFjaG1lbnQgKHRvZ2V0aGVyIHdpdGggdGhlIFdvcmtPcmRlcklEKQogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENoYW5nZUlEIFdvcmtPcmRlcklEIEZpbGVuYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCBhdHRhY2htZW50IHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhdHRhY2htZW50cyBvZiB3b3Jrb3JkZXJzCiAgICAjIGFuZCB0aG9zZSBmcm9tIHJlcG9ydHMgb2Ygd29ya29yZGVycwogICAgbXkgJEF0dGFjaG1lbnRUeXBlID0gJFBhcmFte0F0dGFjaG1lbnRUeXBlfSB8fCAnV29ya09yZGVyJzsKCiAgICAjIHNldCBldmVudCBuYW1lIGJhc2VkIG9uIHRoZSBhdHRhY2htZW50IHR5cGUKICAgIG15ICRFdmVudDsKICAgIGlmICggJEF0dGFjaG1lbnRUeXBlIGVxICdXb3JrT3JkZXInICkgewogICAgICAgICRFdmVudCA9ICdXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlUG9zdCc7CiAgICB9CiAgICBlbHNpZiAoICRBdHRhY2htZW50VHlwZSBlcSAnV29ya09yZGVyUmVwb3J0JyApIHsKICAgICAgICAkRXZlbnQgPSAnV29ya09yZGVyUmVwb3J0QXR0YWNobWVudERlbGV0ZVBvc3QnOwogICAgfQoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gIiRBdHRhY2htZW50VHlwZS8kUGFyYW17V29ya09yZGVySUR9LyRQYXJhbXtGaWxlbmFtZX0iOwoKICAgICMgZGVsZXRlIGZpbGUKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5EZWxldGUoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgICMgdHJpZ2dlciBBdHRhY2htZW50RGVsZXRlUG9zdC1FdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICRFdmVudCwKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2Fubm90IGRlbGV0ZSBhdHRhY2htZW50ICRGaWxlbmFtZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBXb3JrT3JkZXJBdHRhY2htZW50R2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgb25lIHNwZWNpZmljIGF0dGFjaG1lbnQuCgogICAgbXkgJEF0dGFjaG1lbnQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgIFdvcmtPcmRlcklEICAgID0+IDQsCiAgICAgICAgQXR0YWNobWVudFR5cGUgPT4gJ1dvcmtPcmRlcicsICAgICMgKCAnV29ya09yZGVyJyB8fCAnV29ya09yZGVyUmVwb3J0JykgIChvcHRpb25hbCwgZGVmYXVsdCAnV29ya09yZGVyJyApCiAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJ3Rlc3QudHh0JywKICAgICk7CgpyZXR1cm5zCgogICAgJEF0dGFjaG1lbnQgPSB7CiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBBbGxQcmVmZXJlbmNlcyA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAndGVzdC50eHQnLAogICAgICAgIENvbnRlbnQgICAgICAgID0+ICdoYWxsbycsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIEZpbGVzaXplICAgICAgID0+ICcxMjMgS0J5dGVzJywKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgQXR0YWNobWVudFR5cGUgPT4gJ1dvcmtPcmRlcicsCiAgICB9OwoKPWN1dAoKc3ViIFdvcmtPcmRlckF0dGFjaG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoV29ya09yZGVySUQgRmlsZW5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGF0dGFjaG1lbnQgdHlwZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGF0dGFjaG1lbnRzIG9mIHdvcmtvcmRlcnMKICAgICMgYW5kIHRob3NlIGZyb20gcmVwb3J0cyBvZiB3b3Jrb3JkZXJzCiAgICBteSAkQXR0YWNobWVudFR5cGUgPSAkUGFyYW17QXR0YWNobWVudFR5cGV9IHx8ICdXb3JrT3JkZXInOwoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gJEF0dGFjaG1lbnRUeXBlIC4gJy8nIC4gJFBhcmFte1dvcmtPcmRlcklEfSAuICcvJyAuICRQYXJhbXtGaWxlbmFtZX07CgogICAgIyBmaW5kIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIHdvcmtvcmRlcgogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5GaW5kKAogICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhQEF0dGFjaG1lbnRzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICBteSAlQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPlJlYWQoCiAgICAgICAgRmlsZW5hbWUgPT4gJEZpbGVuYW1lLAogICAgICAgIE1vZGUgICAgID0+ICdiaW5hcnknLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEluZm8gPSB7CiAgICAgICAgJUF0dGFjaG1lbnREYXRhLAogICAgICAgIEZpbGVuYW1lICAgICAgID0+ICRQYXJhbXtGaWxlbmFtZX0sCiAgICAgICAgQ29udGVudCAgICAgICAgPT4gJHsgJEF0dGFjaG1lbnREYXRhe0NvbnRlbnR9IH0sCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0NvbnRlbnRUeXBlfSwKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgRmlsZXNpemUgICAgICAgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVzaXplUmF3fSwKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAkQXR0YWNobWVudFR5cGUsCiAgICB9OwoKICAgIHJldHVybiAkQXR0YWNobWVudEluZm87Cn0KCj1oZWFkMiBXb3JrT3JkZXJBdHRhY2htZW50TGlzdCgpCgpSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIEM8d29ya29yZGVyPiBhdHRhY2htZW50cyAobm90IHRoZSByZXBvcnQgYXR0YWNobWVudHMpIG9mIHRoZSBnaXZlbiBDPHdvcmtvcmRlcj4uCgogICAgbXkgQEF0dGFjaG1lbnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLAogICAgKTsKCnJldHVybnMKCiAgICBAQXR0YWNobWVudHMgPSAoCiAgICAgICAgJ2ZpbGVuYW1lLnR4dCcsCiAgICAgICAgJ290aGVyX2ZpbGUucGRmJywKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVySUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIHdvcmtvcmRlcgogICAgbXkgQEF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUycpLT5GaW5kKAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGV4dHJhY3Qgb25seSB0aGUgd29ya29yZGVyIGF0dGFjaG1lbnRzCiAgICBteSBAV29ya09yZGVyQXR0YWNobWVudHM7CiAgICBGSUxFTkFNRToKICAgIGZvciBteSAkRmlsZW5hbWUgKEBBdHRhY2htZW50cykgewoKICAgICAgICBuZXh0IEZJTEVOQU1FIGlmICRGaWxlbmFtZSAhfiBteyBcQSBXb3JrT3JkZXIgLyBcZCsgLyB9eG1zOwoKICAgICAgICAjIHJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lCiAgICAgICAgJEZpbGVuYW1lID1+IHN7IFxBIFdvcmtPcmRlciAvIFxkKyAvIH17fXhtczsKCiAgICAgICAgcHVzaCBAV29ya09yZGVyQXR0YWNobWVudHMsICRGaWxlbmFtZTsKICAgIH0KCiAgICByZXR1cm4gQFdvcmtPcmRlckF0dGFjaG1lbnRzOwp9Cgo9aGVhZDIgV29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoKQoKUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCByZXBvcnQgYXR0YWNobWVudHMgb2YgdGhlIGdpdmVuIEM8d29ya29yZGVyPi4KCiAgICBteSBAQXR0YWNobWVudHMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50TGlzdCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIEBBdHRhY2htZW50cyA9ICgKICAgICAgICAnZmlsZW5hbWUudHh0JywKICAgICAgICAnb3RoZXJfZmlsZS5wZGYnLAogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17V29ya09yZGVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgYWxsIGF0dGFjaG1lbnRzIG9mIHRoaXMgd29ya29yZGVyCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZXh0cmFjdCBvbmx5IHRoZSByZXBvcnQgYXR0YWNobWVudHMKICAgIG15IEBSZXBvcnRBdHRhY2htZW50czsKICAgIEZJTEVOQU1FOgogICAgZm9yIG15ICRGaWxlbmFtZSAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgIG5leHQgRklMRU5BTUUgaWYgJEZpbGVuYW1lICF+IG17IFxBIFdvcmtPcmRlclJlcG9ydCAvIFxkKyAvIH14bXM7CgogICAgICAgICMgcmVtb3ZlIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWUKICAgICAgICAkRmlsZW5hbWUgPX4gc3sgXEEgV29ya09yZGVyUmVwb3J0IC8gXGQrIC8gfXt9eG1zOwoKICAgICAgICBwdXNoIEBSZXBvcnRBdHRhY2htZW50cywgJEZpbGVuYW1lOwoKICAgIH0KCiAgICByZXR1cm4gQFJlcG9ydEF0dGFjaG1lbnRzOwp9Cgo9aGVhZDIgV29ya09yZGVyQXR0YWNobWVudEV4aXN0cygpCgpDaGVja3MgaWYgYSBmaWxlIHdpdGggYSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuCgogICAgbXkgJEV4aXN0cyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJ3Rlc3QudHh0JywKICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAxMjMsCiAgICAgICAgQXR0YWNobWVudFR5cGUgPT4gJ1dvcmtPcmRlcicsICAgICMgKCAnV29ya09yZGVyJyB8fCAnV29ya09yZGVyUmVwb3J0JykgIChvcHRpb25hbCwgZGVmYXVsdCAnV29ya09yZGVyJyApCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudEV4aXN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmlsZW5hbWUgV29ya09yZGVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCBhdHRhY2htZW50IHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhdHRhY2htZW50cyBvZiB3b3Jrb3JkZXJzCiAgICAjIGFuZCB0aG9zZSBmcm9tIHJlcG9ydHMgb2Ygd29ya29yZGVycwogICAgbXkgJEF0dGFjaG1lbnRUeXBlID0gJFBhcmFte0F0dGFjaG1lbnRUeXBlfSB8fCAnV29ya09yZGVyJzsKCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RmluZCgKICAgICAgICBGaWxlbmFtZSA9PiAkQXR0YWNobWVudFR5cGUgLiAnLycgLiAkUGFyYW17V29ya09yZGVySUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0KCkKCnJldHVybnMgdGhlIGNvbWJpbmVkIGVmZm9ydHMgb2YgdGhlIEM8d29ya29yZGVycz4gZm9yIHRoZSBnaXZlbiBjaGFuZ2UKCiAgICBteSAkQ2hhbmdlRWZmb3J0cyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluaXRpYWxpemUgdGhlIHJldHVybiB0aW1lIGhhc2gKICAgIG15ICVDaGFuZ2VFZmZvcnRzOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0OjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoJENhY2hlKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICVDaGFuZ2VFZmZvcnRzID0gJXskQ2FjaGV9OwoKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGJ1aWxkIHNxbCwgdXNpbmcgbWluIGFuZCBtYXggZnVuY3Rpb25zCiAgICAgICAgbXkgJFNRTCA9ICdTRUxFQ1QgJwogICAgICAgICAgICAuICdTVU0oIHBsYW5uZWRfZWZmb3J0ICksIFNVTSggYWNjb3VudGVkX3RpbWUgKSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8nOwoKICAgICAgICAjIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgdGltZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3tQbGFubmVkRWZmb3J0fSA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgICAgICRDaGFuZ2VFZmZvcnRze0FjY291bnRlZFRpbWV9ID0gJFJvd1sxXSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoUGxhbm5lZEVmZm9ydCBBY2NvdW50ZWRUaW1lKSkgewoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgIyBkbyBub3Qgc2hvdyB6ZXJvIHZhbHVlcwogICAgICAgICAgICBpZiAoICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9IGVxIDAgKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3skQXR0cmlidXRlfSA9ICcnOwogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29udmVydCBkZWNpbWFsIGNoYXJhY3RlciBmcm9tICcsJyB0byAnLicgaWYgbmVjY2Vzc2FyeQogICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3skQXR0cmlidXRlfSA9fiBzeyx9ey59eG1zZzsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIGRlY2ltYWwgbnVtYmVyCiAgICAgICAgICAgICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9ID0gc3ByaW50ZiAnJS4yZicsICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlQ2hhbmdlRWZmb3J0cywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVDaGFuZ2VFZmZvcnRzOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZXhlY3V0ZSBhbGwgdHJhbnNhY3Rpb24gZXZlbnRzCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyVHJhbnNhY3Rpb24oKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX0NoZWNrV29ya09yZGVyVHlwZUlEcygpCgpjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBDPHdvcmtvcmRlcj4gdHlwZSBpZHMgYXJlIGFsbCB2YWxpZAoKICAgIG15ICRPayA9ICRXb3JrT3JkZXJPYmplY3QtPl9DaGVja1dvcmtPcmRlclR5cGVJRHMoCiAgICAgICAgV29ya09yZGVyVHlwZUlEcyA9PiBbIDIsIDUwMCBdLAogICAgKTsKCj1jdXQKCnN1YiBfQ2hlY2tXb3JrT3JkZXJUeXBlSURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXb3JrT3JkZXJUeXBlSURzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyVHlwZUlEcyEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17V29ya09yZGVyVHlwZUlEc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbSBXb3JrT3JkZXJUeXBlSURzIG11c3QgYmUgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgV29ya09yZGVyVHlwZUlEcyBiZWxvbmdzIHRvIGNvcnJlY3QgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBmb3IgbXkgJFR5cGVJRCAoIEB7ICRQYXJhbXtXb3JrT3JkZXJUeXBlSURzfSB9ICkgewogICAgICAgIG15ICRUeXBlID0gJFNlbGYtPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCA9PiAkVHlwZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRUeXBlICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHR5cGUgaWQgJFR5cGVJRCBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfR2V0V29ya09yZGVyTnVtYmVyKCkKCkdldCBhIG5ldyB1bnVzZWQgQzx3b3Jrb3JkZXI+IG51bWJlciBmb3IgdGhlIGdpdmVuIGNoYW5nZS4KVGhlIGhpZ2hlc3QgY3VycmVudCBDPHdvcmtvcmRlcj4gbnVtYmVyIGZvciB0aGUgZ2l2ZW4gY2hhbmdlIGlzCmxvb2tlZCB1cCBhbmQgaW5jcmVtZW50ZWQgYnkgb25lLgoKICAgIG15ICRXb3JrT3JkZXJOdW1iZXIgPSAkV29ya09yZGVyT2JqZWN0LT5fR2V0V29ya09yZGVyTnVtYmVyKAogICAgICAgIENoYW5nZUlEID0+IDIsCiAgICApOwoKPWN1dAoKc3ViIF9HZXRXb3JrT3JkZXJOdW1iZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgbGFyZ2VzdCB3b3Jrb3JkZXIgbnVtYmVyCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIE1BWCh3b3Jrb3JkZXJfbnVtYmVyKSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQsIGRlZmF1bHQgdG8gMCB3aGVuIHRoZXJlIGFyZSBubyB3b3Jrb3JkZXJzIHlldAogICAgbXkgJFdvcmtPcmRlck51bWJlcjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFdvcmtPcmRlck51bWJlciA9ICRSb3dbMF07CiAgICB9CiAgICAkV29ya09yZGVyTnVtYmVyIHx8PSAwOwoKICAgICMgaW5jcmVtZW50IG51bWJlciB0byBnZXQgYSBub24tZXhpc3RlbnQgd29ya29yZGVyIG51bWJlcgogICAgJFdvcmtPcmRlck51bWJlcisrOwoKICAgIHJldHVybiAkV29ya09yZGVyTnVtYmVyOwp9Cgo9aGVhZDIgX0NoZWNrV29ya09yZGVyUGFyYW1zKCkKCkNoZWNrcyB0aGUgcGFyYW1zIHRvIFdvcmtPcmRlckFkZCgpIGFuZCBXb3JrT3JkZXJVcGRhdGUoKS4KVGhlcmUgYXJlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMuClRoZSB2YWx1ZSBmb3IgQzxXb3JrT3JkZXJBZ2VudElEPiBjYW4gYmUgdW5kZWZpbmVkLgoKICAgIG15ICRPayA9ICRXb3JrT3JkZXJPYmplY3QtPl9DaGVja1dvcmtPcmRlclBhcmFtcygKICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlck51bWJlciAgICA9PiA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyVGl0bGUgICAgID0+ICdSZXBsYWNlbWVudCBvZiBtYWlsIHNlcnZlcicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbnN0cnVjdGlvbiAgICAgICAgPT4gJ0luc3RhbGwgdGhlIDxiPm5ldzwvYj4gc2VydmVyJywgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluc3RydWN0aW9uUGxhaW4gICA9PiAnSW5zdGFsbCB0aGUgbmV3IHNlcnZlcicsICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVwb3J0ICAgICAgICAgICAgID0+ICdJbnN0YWxsZWQgbmV3IHNlcnZlciA8Yj53aXRob3V0PC9iPiBwcm9ibGVtcycsICAjIChvcHRpb25hbCkKICAgICAgICBSZXBvcnRQbGFpbiAgICAgICAgPT4gJ0luc3RhbGxlZCBuZXcgc2VydmVyIHdpdGhvdXQgcHJvYmxlbXMnLCAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclN0YXRlSUQgICA9PiA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyVHlwZUlEICAgID0+IDEyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJBZ2VudElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB1bmRlZiBpcyBhbGxvd2VkCiAgICAgICAgV29ya09yZGVyR3JvdXBJRCAgID0+IDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdW5kZWYgaXMgYWxsb3dlZAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgICA9PiAnMjAwOS0xMC0wMSAxMDozMzowMCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICAgID0+ICcyMDA5LTEwLTAxIDEwOjMzOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQbGFubmVkRW5kVGltZSAgICAgPT4gJzIwMDktMTAtMDEgMTA6MzM6MDAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgICA9PiAnMjAwOS0xMC0wMSAxMDozMzowMCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRHluYW1pY0ZpZWxkX1ggICAgID0+ICdTdW4nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEeW5hbWljRmllbGRfWSAgICAgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICk7CgpUaGVzZSBzdHJpbmcgcGFyYW1ldGVycyBoYXZlIGxlbmd0aCBjb25zdHJhaW50czoKCiAgICBQYXJhbWV0ZXIgICAgICAgIHwgbWF4LiBsZW5ndGgKICAgIC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCiAgICBXb3JrT3JkZXJUaXRsZSAgICAgIHwgIDI1MCBjaGFyYWN0ZXJzCiAgICBJbnN0cnVjdGlvbiAgICAgICAgIHwgMTgwMDAwMCBjaGFyYWN0ZXJzCiAgICBJbnN0cnVjdGlvblBsYWluICAgIHwgMTgwMDAwMCBjaGFyYWN0ZXJzCiAgICBSZXBvcnQgICAgICAgICAgICAgIHwgMTgwMDAwMCBjaGFyYWN0ZXJzCiAgICBSZXBvcnRQbGFpbiAgICAgICAgIHwgMTgwMDAwMCBjaGFyYWN0ZXJzCiAgICBEeW5hbWljRmllbGRfWCAgICAgIHwgMzgwMCBjaGFyYWN0ZXJzCiAgICBEeW5hbWljRmllbGRfWSAgICAgIHwgMzgwMCBjaGFyYWN0ZXJzCgo9Y3V0CgpzdWIgX0NoZWNrV29ya09yZGVyUGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0aGUgc3RyaW5nIGFuZCBpZCBwYXJhbWV0ZXJzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKAogICAgICAgIHF3KAogICAgICAgIFdvcmtPcmRlclRpdGxlCiAgICAgICAgSW5zdHJ1Y3Rpb24KICAgICAgICBJbnN0cnVjdGlvblBsYWluCiAgICAgICAgUmVwb3J0CiAgICAgICAgUmVwb3J0UGxhaW4KICAgICAgICBXb3JrT3JkZXJBZ2VudElECiAgICAgICAgV29ya09yZGVyR3JvdXBJRAogICAgICAgIFdvcmtPcmRlclN0YXRlSUQKICAgICAgICBXb3JrT3JkZXJUeXBlSUQKICAgICAgICBXb3JrT3JkZXJOdW1iZXIKICAgICAgICBDaGFuZ2VJRAogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgcGFyYW1zIGFyZSBub3QgcmVxdWlyZWQKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICMgY2hlY2sgaWYgcGFyYW0gaXMgbm90IGRlZmluZWQKICAgICAgICBpZiAoICRBcmd1bWVudCBlcSAnV29ya09yZGVyQWdlbnRJRCcgJiYgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CgogICAgICAgICAgICAjIFdvcmtPcmRlckFnZW50SUQgY2FuIGJlIHVuZGVmaW5lZAogICAgICAgIH0KICAgICAgICBlbHNpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0IGJlIGRlZmluZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgZGVmaW5lZAogICAgICAgIGlmICggJEFyZ3VtZW50IGVxICdXb3JrT3JkZXJHcm91cElEJyAmJiAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKCiAgICAgICAgICAgICMgV29ya09yZGVyR3JvdXBJRCBjYW4gYmUgdW5kZWZpbmVkCiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgZGVmaW5lZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHBhcmFtIGlzIG5vdCBhIHJlZmVyZW5jZQogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICcnICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0bid0IGJlIGEgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRpdGxlCiAgICAgICAgaWYgKCAkQXJndW1lbnQgZXEgJ1dvcmtPcmRlclRpdGxlJyAmJiBsZW5ndGgoICRQYXJhbXskQXJndW1lbnR9ICkgPiAyNTAgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDI1MCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJndW1lbnQgZXEgJ0luc3RydWN0aW9uJwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ0luc3RydWN0aW9uUGxhaW4nCiAgICAgICAgICAgIHx8ICRBcmd1bWVudCBlcSAnUmVwb3J0JwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ1JlcG9ydFBsYWluJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGxlbmd0aCggJFBhcmFteyRBcmd1bWVudH0gKSA+IDE4MDAwMDAgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlRoZSBwYXJhbWV0ZXIgJyRBcmd1bWVudCcgbXVzdCBiZSBzaG9ydGVyIHRoYW4gMTgwMDAwMCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGltZSBmb3JtYXRzCiAgICBPUFRJT046CiAgICBmb3IgbXkgJE9wdGlvbiAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgbmV4dCBPUFRJT04gaWYgISRQYXJhbXskT3B0aW9ufTsKCiAgICAgICAgaWYgKCAkUGFyYW17JE9wdGlvbn0gIX4gbXsgXEEgXGRcZFxkXGQtXGRcZC1cZFxkIFxzIFxkXGQ6XGRcZDpcZFxkIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXcm9uZyB0aW1lIGZvcm1hdCBmb3IgJE9wdGlvbjogJyRQYXJhbXskT3B0aW9ufSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHdvcmtvcmRlciBhZ2VudAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9ICYmIGRlZmluZWQgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9ICkgewoKICAgICAgICAjIFdvcmtPcmRlckFnZW50IG11c3QgYmUgYW4gYWdlbnQKICAgICAgICBteSAlVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgV29ya09yZGVyQWdlbnQgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9IGlzIG5vdCBhIHZhbGlkIHVzZXIgaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHdvcmtvcmRlciBhZ2VudAogICAgaWYgKCAkUGFyYW17V29ya09yZGVyR3JvdXBJRH0gJiYgZGVmaW5lZCAkUGFyYW17V29ya09yZGVyR3JvdXBJRH0gKSB7CgogICAgICAgICMgV29ya09yZGVyQWdlbnQgbXVzdCBiZSBhbiBhZ2VudAogICAgICAgIG15ICVHcm91cERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEID0+ICRQYXJhbXtXb3JrT3JkZXJHcm91cElEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkR3JvdXBEYXRhe05hbWV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIFdvcmtPcmRlckdyb3VwICRQYXJhbXtXb3JrT3JkZXJHcm91cElEfSBpcyBub3QgYSB2YWxpZCBncm91cCBpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcwogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVBhcmFtICkgewoKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5ICF+IG17IFxBIER5bmFtaWNGaWVsZF8oLiopIFx6IH14bXM7CgogICAgICAgICMgcGFyYW1zIGFyZSBub3QgcmVxdWlyZWQKICAgICAgICBuZXh0IEtFWSBpZiAhZXhpc3RzICRQYXJhbXskS2V5fTsKCiAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgZGVmaW5lZAogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEtleScgbXVzdCBiZSBkZWZpbmVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgaWYgKCBsZW5ndGgoICRQYXJhbXskS2V5fSApID4gMzgwMCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJyRLZXknIG11c3QgYmUgc2hvcnRlciB0aGFuIDM4MDAgY2hhcmFjdGVycyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZ2l2ZW4gV29ya09yZGVyU3RhdGVJRCBpcyB2YWxpZAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPldvcmtPcmRlclN0YXRlSURzQ2hlY2soCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFsgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGdpdmVuIFdvcmtPcmRlclR5cGVJRCBpcyB2YWxpZAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrV29ya09yZGVyVHlwZUlEcygKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEcyA9PiBbICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9DaGVja1RpbWVzdGFtcHMoKQoKQ2hlY2tzIHRoZSBjb25zdHJhaW50cyBvZiB0aW1lc3RhbXBzOiBDPHh4eFN0YXJ0VGltZT4gbXVzdCBiZSBiZWZvcmUgQzx4eHhFbmRUaW1lPgoKICAgIG15ICRPayA9ICRXb3JrT3JkZXJPYmplY3QtPl9DaGVja1RpbWVzdGFtcHMoCiAgICAgICAgV29ya09yZGVyRGF0YSAgICA9PiAkV29ya09yZGVyRGF0YSwKICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTEwLTEyIDAwOjAwOjAxJywgICAgICMgKG9wdGlvbmFsKSBvciB1bmRlZgogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMTUgMTU6MDA6MDAnLCAgICAgIyAob3B0aW9uYWwpIG9yIHVuZGVmCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMjAwOS0xMC0xNCAwMDowMDowMScsICAgICAjIChvcHRpb25hbCkgb3IgdW5kZWYKICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcyMDA5LTAxLTIwIDAwOjAwOjAxJywgICAgICMgKG9wdGlvbmFsKSBvciB1bmRlZgogICAgKTsKCklmIFBsYW5uZWRTdGFydFRpbWUgaXMgZ2l2ZW4sIFBsYW5uZWRFbmRUaW1lIGhhcyB0byBiZSBnaXZlbiwgdG9vIC0gYW5kIHZpY2UgdmVyc2EuCklmIEFjdHVhbFN0YXJ0VGltZSBpcyBnaXZlbiBBY3R1YWxFbmRUaW1lIGlzIG9wdGlvbmFsLgpCdXQgaWYgQWN0dWFsRW5kVGltZSBpcyBnaXZlbiB0aGVuIEFjdHVhbFN0YXJ0VGltZSBoYXMgdG8gYmUgZ2l2ZW4sIHRvby4KV29ya09yZGVyRGF0YSBpcyBvbmx5IHBhc3NlZCBmb3IgaW1wcm92aW5nIHRoZSBwZXJmb3JtYW5jZS4KCj1jdXQKCnN1YiBfQ2hlY2tUaW1lc3RhbXBzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFdvcmtPcmRlckRhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREZWZhdWx0VGltZVN0YW1wID0gJzk5OTktMDEtMDEgMDA6MDA6MDAnOwoKICAgICMgY2hlY2sgdGltZXMKICAgIFRZUEU6CiAgICBmb3IgbXkgJFR5cGUgKHF3KEFjdHVhbCBQbGFubmVkKSkgewoKICAgICAgICAjIGNoZWNrIG9ubHkgd2hlbiBhIHN0YXJ0IG9yIGEgZW5kIHRpbWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyAkVHlwZSAuICdTdGFydFRpbWUnIH0gJiYgIWV4aXN0cyAkUGFyYW17ICRUeXBlIC4gJ0VuZFRpbWUnIH0gKSB7CiAgICAgICAgICAgIG5leHQgVFlQRTsKICAgICAgICB9CgogICAgICAgICMgZm9yIHRoZSBsb2cgbWVzc2FnZXMKICAgICAgICBteSAkVHlwZUxjID0gbGMgJFR5cGU7CgogICAgICAgIG15ICRTdGFydFRpbWUgPSAnJzsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyAkVHlwZSAuICdTdGFydFRpbWUnIH0gKSB7CgogICAgICAgICAgICAjIGlmIGEgdGltZSBpcyBub3QgZ2l2ZW4sIGdldCBpdCBmcm9tIHRoZSB3b3Jrb3JkZXIKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRQYXJhbXtXb3JrT3JkZXJEYXRhfS0+eyAkVHlwZSAuICdTdGFydFRpbWUnIH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJFBhcmFteyAkVHlwZSAuICdTdGFydFRpbWUnIH0gKSB7CgogICAgICAgICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgY2xlYXJpbmcgdGhlIHRpbWUKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICREZWZhdWx0VGltZVN0YW1wOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICEkUGFyYW17ICRUeXBlIC4gJ1N0YXJ0VGltZScgfSApIHsKCiAgICAgICAgICAgICMgaWYgYSB0aW1lIGlzIG5vdCBnaXZlbiwgZ2V0IGl0IGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFBhcmFte1dvcmtPcmRlckRhdGF9LT57ICRUeXBlIC4gJ1N0YXJ0VGltZScgfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17ICRUeXBlIC4gJ1N0YXJ0VGltZScgfSBlcSAkRGVmYXVsdFRpbWVTdGFtcCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSB2YWx1ZSAkU3RhcnRUaW1lIGlzIGludmFsaWQgZm9yIHRoZSAkVHlwZUxjIHN0YXJ0IHRpbWUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRQYXJhbXsgJFR5cGUgLiAnU3RhcnRUaW1lJyB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEVuZFRpbWUgPSAnJzsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyAkVHlwZSAuICdFbmRUaW1lJyB9ICkgewoKICAgICAgICAgICAgIyBpZiBhIHRpbWUgaXMgbm90IGdpdmVuLCBnZXQgaXQgZnJvbSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgICRFbmRUaW1lID0gJFBhcmFte1dvcmtPcmRlckRhdGF9LT57ICRUeXBlIC4gJ0VuZFRpbWUnIH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJFBhcmFteyAkVHlwZSAuICdFbmRUaW1lJyB9ICkgewoKICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIGNsZWFyaW5nIHRoZSB0aW1lCiAgICAgICAgICAgICRFbmRUaW1lID0gJERlZmF1bHRUaW1lU3RhbXA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggISRQYXJhbXsgJFR5cGUgLiAnRW5kVGltZScgfSApIHsKCiAgICAgICAgICAgICMgaWYgYSB0aW1lIGlzIG5vdCBnaXZlbiwgZ2V0IGl0IGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICAgICAkRW5kVGltZSA9ICRQYXJhbXtXb3JrT3JkZXJEYXRhfS0+eyAkVHlwZSAuICdFbmRUaW1lJyB9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXsgJFR5cGUgLiAnRW5kVGltZScgfSBlcSAkRGVmYXVsdFRpbWVTdGFtcCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSB2YWx1ZSAkRW5kVGltZSBpcyBpbnZhbGlkIGZvciB0aGUgJFR5cGVMYyBlbmQgdGltZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRW5kVGltZSA9ICRQYXJhbXsgJFR5cGUgLiAnRW5kVGltZScgfTsKICAgICAgICB9CgogICAgICAgICMgZG9uJ3QgY2hlY2sgYWN0dWFsIHN0YXJ0IHRpbWUgd2hlbiB0aGUgd29ya29yZGVyIGhhcyBub3QgZW5kZWQgeWV0CiAgICAgICAgaWYgKCAkVHlwZSBlcSAnQWN0dWFsJyAmJiAkU3RhcnRUaW1lICYmICEkRW5kVGltZSApIHsKICAgICAgICAgICAgbmV4dCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgIyB0aGUgY2hlY2sgZmFpbHMgaWYgbm90IGJvdGggKHN0YXJ0IGFuZCBlbmQpIHRpbWVzIGFyZSBwcmVzZW50CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZSB8fCAhJEVuZFRpbWUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkVHlwZSBzdGFydCB0aW1lIGFuZCAkVHlwZUxjIGVuZCB0aW1lIG11c3QgYmUgZ2l2ZW4hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgb3JkZXJpbmcgb2YgdGhlIHRpbWVzLCBvbmx5IGluIHRoZSBub24tZGVmYXVsdC1jYXNlCiAgICAgICAgaWYgKCAkU3RhcnRUaW1lIG5lICREZWZhdWx0VGltZVN0YW1wICYmICRFbmRUaW1lIG5lICREZWZhdWx0VGltZVN0YW1wICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIG5vbi1kaWdpdCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICRTdGFydFRpbWUgPX4gc3sgXEQgfXt9eG1zZzsKICAgICAgICAgICAgJEVuZFRpbWUgPX4gc3sgXEQgfXt9eG1zZzsKCiAgICAgICAgICAgICMgc3RhcnQgdGltZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBlbmQgdGltZQogICAgICAgICAgICBpZiAoICRTdGFydFRpbWUgPj0gJEVuZFRpbWUgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkVHlwZUxjIHN0YXJ0IHRpbWUgJyRTdGFydFRpbWUnIG11c3QgYmUgYmVmb3JlIHRoZSAkVHlwZUxjIGVuZCB0aW1lICckRW5kVGltZSchIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9Ob3RpZmljYXRpb24ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IE5vdGlmaWNhdGlvbi5wbSx2IDEuMiAyMDE4LzEwLzExIDE0OjM5OjI2IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgU3RvcmFibGU7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7Cgp1c2UgdmFycyBxdyhASVNBKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24gLSBub3RpZmljYXRpb24gZnVuY3Rpb25zIGZvciBjaGFuZ2UgbWFuYWdlbWVudAoKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIG1vZHVsZSBpcyBtYW5hZ2luZyBub3RpZmljYXRpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGEgbm90aWZpY2F0aW9uIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICROb3RpZmljYXRpb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCB0aGUgY2FjaGUgdHlwZSBhbmQgVFRMIChpbiBzZWNvbmRzKQogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6Q2FjaGVUVEwnKSAqIDYwOwoKICAgICMgZG8gd2UgdXNlIHJpY2h0ZXh0CiAgICAkU2VsZi0+e1JpY2hUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgQElTQSA9ICgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcicsCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50Tm90aWZpY2F0aW9uOjpFdmVudE1vZHVsZScsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIE5vdGlmaWNhdGlvblNlbmQoKQoKU2VuZCB0aGUgbm90aWZpY2F0aW9uIHRvIGN1c3RvbWVycyBhbmQvb3IgYWdlbnRzLgoKICAgIG15ICRTdWNjZXNzID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uU2VuZCgKICAgICAgICBBZ2VudElEcyAgICA9PiBbIDEsIDIsIDMsIF0KICAgICAgICBDdXN0b21lcklEcyA9PiBbIDEsIDIsIDMsIF0sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ0NoYW5nZScsICAgICAgICAgICMgQ2hhbmdlfFdvcmtPcmRlcgogICAgICAgIEV2ZW50ICAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgIERhdGEgICAgICAgID0+IHsgJUNoYW5nZURhdGEgfSwgICAjIENoYW5nZXxXb3JrT3JkZXJ8TGluayBkYXRhCiAgICAgICAgTWVzc2FnZSA9PiB7CiAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICdlbicgPT4gewogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdIZWxsbyBBZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0hlbGxvIFdvcmxkJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2RlJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hhbGxvIEFnZW50JywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGFsbG8gV2VsdCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hlbGxvIEN1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGVsbG8gV29ybGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZGUnID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGFsbG8gS3VuZGUnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIYWxsbyBXZWx0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uU2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlIEV2ZW50IFVzZXJJRCBEYXRhIE1lc3NhZ2UpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbWVzc2FnZQogICAgZm9yIG15ICRUeXBlIChxdyhBZ2VudCBDdXN0b21lcikpIHsKCiAgICAgICAgIyBjaGVjayBtZXNzYWdlIHBhcmFtZXRlciwgd2UgYWx3YXlzIG5lZWQgYWdlbnQgYW5kIG1lc3NhZ2UKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRUeXBlIE1lc3NhZ2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlYWNoIGFyZ3VtZW50IGZvciBlYWNoIG1lc3NhZ2UgbGFuZ3VhZ2UKICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggc29ydCBrZXlzICV7ICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfSB9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRBcmd1bWVudCAocXcoU3ViamVjdCBCb2R5IENvbnRlbnRUeXBlKSkgewoKICAgICAgICAgICAgICAgICMgZXJyb3IgaWYgbWVzc2FnZSBkYXRhIGlzIGluY29tcGxldGUKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZX0tPnskQXJndW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCAkVHlwZSBNZXNzYWdlIGFyZ3VtZW50ICckQXJndW1lbnQnIGZvciBsYW5ndWFnZSAnJExhbmd1YWdlJyEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIGNvbnZlbmllbmNlCiAgICBteSAkRXZlbnQgPSAkUGFyYW17RXZlbnR9OwoKICAgICMgbmVlZCBhdCBsZWFzdCBBZ2VudElEcyBvciBDdXN0b21lcklEcwogICAgaWYgKCAhJFBhcmFte0FnZW50SURzfSAmJiAhJFBhcmFte0N1c3RvbWVySURzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgYXQgbGVhc3QgQWdlbnRJRHMgb3IgQ3VzdG9tZXJJRHMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEFnZW50SURzIGFuZCBDdXN0b21lcklEcyBoYXZlIHRvIGJlIGFycmF5IHJlZmVyZW5jZXMKICAgIGZvciBteSAkSURLZXkgKHF3KEFnZW50SURzIEN1c3RvbWVySURzKSkgewogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17JElES2V5fSAmJiByZWYgJFBhcmFteyRJREtleX0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRJREtleSBoYXMgdG8gYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBzZW5kaW5nIG9mIG5vdGlmaWNhdGlvbiBoYXMgYmVlbiB0dXJuZWQgb2ZmCiAgICByZXR1cm4gMSBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpTZW5kTm90aWZpY2F0aW9ucycpOwoKICAgICMgd2UgbmVlZCB0byBnZXQgdGhlIGl0ZW1zIGZvciByZXBsYWNlbWVudHMKICAgIG15ICRDaGFuZ2UgICAgPSB7fTsKICAgIG15ICRXb3JrT3JkZXIgPSB7fTsKICAgIG15ICRMaW5rICAgICAgPSB7fTsKCiAgICAjIHN0YXJ0IHdpdGggd29ya29yZGVyLCBhcyB0aGUgY2hhbmdlIGlkIG1pZ2h0IGJlIHRha2VuIGZyb20gdGhlIHdvcmtvcmRlcgogICAgaWYgKCAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0gKSB7CgogICAgICAgIGlmICggJEV2ZW50IGVxICdXb3JrT3JkZXJEZWxldGUnICkgewoKICAgICAgICAgICAgIyB0aGUgd29ya29yZGVyIGlzIGFscmVhZHkgZGVsZXRlZCwKICAgICAgICAgICAgIyBzbyB3ZSBkaXNwbGF5IHRoZSBvbGQgZGF0YQogICAgICAgICAgICAkV29ya09yZGVyID0gJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgZnJlc2ggZGF0YQogICAgICAgICAgICAkV29ya09yZGVyCiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFRoZSBldmVudCAnV29ya09yZGVyQWRkJyBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgdGhlIHdvcmtvcmRlcgogICAgICAgICMgaXMgbm90IGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgeWV0LiBTbyBhbHNvIHRha2UKICAgICAgICAjIHRoZSBwYXJhbXMgZm9yIFdvcmtPcmRlckFkZCgpIGludG8gYWNjb3VudC4KICAgICAgICAjIFdvcmtPcmRlckdldCgpIG11c3Qgc3RpbGwgYmUgY2FsbGVkLCBhcyBpdCBwcm92aWRlcyB0cmFuc2xhdGlvbgogICAgICAgICMgZm9yIHNvbWUgSURzIHRoYXQgd2VyZSBzZXQgaW4gV29ya09yZGVyQWRkKCkuCiAgICAgICAgaWYgKCAkRXZlbnQgZXEgJ1dvcmtPcmRlckFkZCcgKSB7CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICV7JFdvcmtPcmRlcn0gKSB7CiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57JEF0dHJpYnV0ZX0gfHw9ICRQYXJhbXtEYXRhfS0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YSBmb3IgdGhlIHdvcmtvcmRlciBhZ2VudAogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJBZ2VudH0gPSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgaW5mZXIgdGhlIGNoYW5nZSBpZCBmcm9tIHRoZSB3b3Jrb3JkZXIKICAgICAgICBpZiAoICRXb3JrT3JkZXItPntDaGFuZ2VJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSA9ICRXb3JrT3JkZXItPntDaGFuZ2VJRH07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9ICkgewoKICAgICAgICAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVGhlIGV2ZW50ICdDaGFuZ2VBZGQnIGlzIGEgc3BlY2lhbCBjYXNlLCBhcyB0aGUgY2hhbmdlCiAgICAgICAgIyBpcyBub3QgY29tcGxldGVseSBpbml0aWFsaXplZCB5ZXQuIFNvIGFsc28gdGFrZQogICAgICAgICMgdGhlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkKCkgaW50byBhY2NvdW50LgogICAgICAgICMgQ2hhbmdlR2V0KCkgbXVzdCBzdGlsbCBiZSBjYWxsZWQsIGFzIGl0IHByb3ZpZGVzIHRyYW5zbGF0aW9uCiAgICAgICAgIyBmb3Igc29tZSBJRHMgdGhhdCB3ZXJlIHNldCBpbiBDaGFuZ2VBZGQoKS4KICAgICAgICBpZiAoICRFdmVudCBlcSAnQ2hhbmdlQWRkJyApIHsKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXskQ2hhbmdlfSApIHsKICAgICAgICAgICAgICAgICRDaGFuZ2UtPnskQXR0cmlidXRlfSB8fD0gJFBhcmFte0RhdGF9LT57JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NoYW5nZUJ1aWxkZXJ9ID0gewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICggJENoYW5nZS0+e0NoYW5nZU1hbmFnZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NoYW5nZU1hbmFnZXJ9ID0gewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VNYW5hZ2VySUR9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBmb3IgbGluayBldmVudHMgdGhlcmUgaXMgc29tZSBpbmZvIGFib3V0IHRoZSBsaW5rCiAgICBpZiAoICRFdmVudCA9fiBteyBcQSAoPzogQ2hhbmdlIHwgV29ya09yZGVyICkgTGluayAoPzogQWRkIHwgRGVsZXRlICkgfXhtcyApIHsKICAgICAgICAkTGluayA9IHsKICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0sCiAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkUGFyYW17RGF0YX0tPntUYXJnZXRPYmplY3R9LAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57U3RhdGV9LAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57VHlwZX0sCiAgICAgICAgICAgIE9iamVjdCAgICAgICA9PiAkUGFyYW17RGF0YX0tPntPYmplY3R9LAogICAgICAgIH07CiAgICB9CgogICAgIyBnZXQgdGhlIHZhbGlkIGlkcwogICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICBteSAlVmFsaWRJRExvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAVmFsaWRJRHM7CgogICAgbXkgJUFnZW50c1NlbnQ7CgogICAgQUdFTlRJRDoKICAgIGZvciBteSAkQWdlbnRJRCAoIEB7ICRQYXJhbXtBZ2VudElEc30gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBub3RpZmljYXRpb24gd2FzIGFscmVhZHkgc2VudCB0byB0aGlzIGFnZW50CiAgICAgICAgbmV4dCBBR0VOVElEIGlmICRBZ2VudHNTZW50eyRBZ2VudElEfTsKCiAgICAgICAgIyB1c2VyIGluZm8gZm9yIHByZWZlcnJlZCBsYW5ndWFnZSBhbmQgbWFjcm8gcmVwbGFjZW1lbnQKICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJEFnZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBub3Qgc2VuZCBlbWFpbHMgdG8gaW52YWxpZCBhZ2VudHMKICAgICAgICBpZiAoIGV4aXN0cyAkVXNlcntWYWxpZElEfSAmJiAhJFZhbGlkSURMb29rdXB7ICRVc2Vye1ZhbGlkSUR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgQUdFTlRJRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHN5c3RlbSBkZWZhdWx0IGxhbmd1YWdlCiAgICAgICAgbXkgJERlZmF1bHRMYW5ndWFnZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJyZWQgbGFuZ3VhZ2UKICAgICAgICBteSAkUHJlZmVycmVkTGFuZ3VhZ2UgPSAkVXNlcntVc2VyTGFuZ3VhZ2V9IHx8ICREZWZhdWx0TGFuZ3VhZ2U7CgogICAgICAgICMgbWFrZSBzdXJlIGEgbWVzc2FnZSBpbiB0aGUgdXNlciBsYW5ndWFnZSBleGlzdHMKICAgICAgICBpZiAoICEkUGFyYW17TWVzc2FnZX0tPntBZ2VudH0tPnskUHJlZmVycmVkTGFuZ3VhZ2V9ICkgewoKICAgICAgICAgICAgIyBvdGhlcndpc2UgdXNlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICAgICAgJFByZWZlcnJlZExhbmd1YWdlID0gJERlZmF1bHRMYW5ndWFnZTsKCiAgICAgICAgICAgICMgaWYgbm8gbWVzc2FnZSBleGlzdHMgaW4gZGVmYXVsdCBsYW5ndWFnZSwgdGhlbiB0YWtlIHRoZSBmaXJzdCBhdmFpbGFibGUgbGFuZ3VhZ2UKICAgICAgICAgICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9LT57QWdlbnR9LT57JFByZWZlcnJlZExhbmd1YWdlfSApIHsKICAgICAgICAgICAgICAgIG15IEBMYW5ndWFnZXMgPSBzb3J0IGtleXMgJXsgJFBhcmFte01lc3NhZ2V9LT57QWdlbnR9IH07CiAgICAgICAgICAgICAgICAkUHJlZmVycmVkTGFuZ3VhZ2UgPSAkTGFuZ3VhZ2VzWzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFBhcmFte01lc3NhZ2V9LT57QWdlbnR9LT57JFByZWZlcnJlZExhbmd1YWdlfTsKICAgICAgICByZXR1cm4gaWYgISROb3RpZmljYXRpb247CgogICAgICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbi0+e0NvbnRlbnRUeXBlfSA9fiBteyB0ZXh0L3BsYWluIH14bXNpICkgewogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICROb3RpZmljYXRpb24tPntCb2R5fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgICAgICBlbHNpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9uLT57Q29udGVudFR5cGV9ID1+IG17IHRleHQvaHRtbCB9eG1zaSApIHsKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0JvZHl9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgbWFjcm9zCiAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0JvZHl9ID0gJFNlbGYtPl9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKAogICAgICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICBUZXh0ICAgICAgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICBSZWNpcGllbnQgPT4geyVVc2VyfSwKICAgICAgICAgICAgUmljaFRleHQgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIENoYW5nZSAgICA9PiAkQ2hhbmdlLAogICAgICAgICAgICBXb3JrT3JkZXIgPT4gJFdvcmtPcmRlciwKICAgICAgICAgICAgTGluayAgICAgID0+ICRMaW5rLAogICAgICAgICAgICBEYXRhICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgICAgICBMYW5ndWFnZSAgPT4gJFByZWZlcnJlZExhbmd1YWdlLAogICAgICAgICk7CgogICAgICAgICROb3RpZmljYXRpb24tPntTdWJqZWN0fSA9ICRTZWxmLT5fTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcygKICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgVGV4dCAgICAgID0+ICROb3RpZmljYXRpb24tPntTdWJqZWN0fSwKICAgICAgICAgICAgUmVjaXBpZW50ID0+IHslVXNlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgICAgIFdvcmtPcmRlciA9PiAkV29ya09yZGVyLAogICAgICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgICAgIERhdGEgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgICAgIExhbmd1YWdlICA9PiAkUHJlZmVycmVkTGFuZ3VhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdXJscyBhbmQgdmVyaWZ5IHRvIGJlIGZ1bGwgaHRtbCBkb2N1bWVudAogICAgICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICd1dGYtOCcsCiAgICAgICAgICAgICAgICBTdHJpbmcgID0+ICROb3RpZmljYXRpb24tPntCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBub3RpZmljYXRpb24KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKS0+U2VuZCgKICAgICAgICAgICAgRnJvbSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ05vdGlmaWNhdGlvblNlbmRlck5hbWUnKSAuICcgPCcKICAgICAgICAgICAgICAgIC4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpIC4gJz4nLAogICAgICAgICAgICBUbyAgICAgICA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkTm90aWZpY2F0aW9uLT57U3ViamVjdH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gfHwgJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBDaGFyc2V0ICA9PiAndXRmLTgnLAogICAgICAgICAgICBCb2R5ICAgICA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgIExvb3AgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGV2ZW50IHR5cGUKICAgICAgICBteSAkVHlwZTsKICAgICAgICBpZiAoICRFdmVudCA9fiBteyBcQSAoQ2hhbmdlfEFjdGlvbkV4ZWN1dGUpIH14bXMgKSB7CiAgICAgICAgICAgICRUeXBlID0gJ0NoYW5nZSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEV2ZW50ID1+IG17IFxBIFdvcmtPcmRlciB9eG1zICkgewogICAgICAgICAgICAkVHlwZSA9ICdXb3JrT3JkZXInOwogICAgICAgIH0KCiAgICAgICAgIyB0cmlnZ2VyIE5vdGlmaWNhdGlvblNlbnQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAkVHlwZSAuICdOb3RpZmljYXRpb25TZW50UG9zdCcsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgRXZlbnRUeXBlICAgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgPT4gJFVzZXJ7VXNlckVtYWlsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRBZ2VudHNTZW50eyRBZ2VudElEfSA9IDE7CiAgICB9CgogICAgbXkgJUN1c3RvbWVyc1NlbnQ7CgogICAgQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIEB7ICRQYXJhbXtDdXN0b21lcklEc30gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBub3RpZmljYXRpb24gd2FzIGFscmVhZHkgc2VudCB0byBjdXN0b21lcgogICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAkQ3VzdG9tZXJzU2VudHskQ3VzdG9tZXJJRH07CgogICAgICAgICMgVXNlciBpbmZvIGZvciBwcmVmZXJlZCBsYW5ndWFnZSBhbmQgbWFjcm8gcmVwbGFjZW1lbnQKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lcklELAogICAgICAgICk7CgogICAgICAgICMgZG8gbm90IHNlbmQgZW1haWxzIHRvIGludmFsaWQgY3VzdG9tZXJzCiAgICAgICAgaWYgKCBleGlzdHMgJEN1c3RvbWVyVXNlcntWYWxpZElEfSAmJiAhJFZhbGlkSURMb29rdXB7ICRDdXN0b21lclVzZXJ7VmFsaWRJRH0gfSApIHsKICAgICAgICAgICAgbmV4dCBDVVNUT01FUklEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3lzdGVtIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICBteSAkRGVmYXVsdExhbmd1YWdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgICAgICAjIGdldCB1c2VyIHByZWZlcnJlZCBsYW5ndWFnZQogICAgICAgIG15ICRQcmVmZXJyZWRMYW5ndWFnZSA9ICRDdXN0b21lclVzZXJ7VXNlckxhbmd1YWdlfSB8fCAkRGVmYXVsdExhbmd1YWdlOwoKICAgICAgICAjIG1ha2Ugc3VyZSBhIG1lc3NhZ2UgaW4gdGhlIHVzZXIgbGFuZ3VhZ2UgZXhpc3RzCiAgICAgICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9LT57Q3VzdG9tZXJ9LT57JFByZWZlcnJlZExhbmd1YWdlfSApIHsKCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHVzZSBkZWZhdWx0IGxhbmd1YWdlCiAgICAgICAgICAgICRQcmVmZXJyZWRMYW5ndWFnZSA9ICREZWZhdWx0TGFuZ3VhZ2U7CgogICAgICAgICAgICAjIGlmIG5vIG1lc3NhZ2UgZXhpc3RzIGluIGRlZmF1bHQgbGFuZ3VhZ2UsIHRoZW4gdGFrZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGxhbmd1YWdlCiAgICAgICAgICAgIGlmICggISRQYXJhbXtNZXNzYWdlfS0+e0N1c3RvbWVyfS0+eyRQcmVmZXJyZWRMYW5ndWFnZX0gKSB7CiAgICAgICAgICAgICAgICBteSBATGFuZ3VhZ2VzID0gc29ydCBrZXlzICV7ICRQYXJhbXtNZXNzYWdlfS0+e0N1c3RvbWVyfSB9OwogICAgICAgICAgICAgICAgJFByZWZlcnJlZExhbmd1YWdlID0gJExhbmd1YWdlc1swXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbXtNZXNzYWdlfS0+e0N1c3RvbWVyfS0+eyRQcmVmZXJyZWRMYW5ndWFnZX07CiAgICAgICAgcmV0dXJuIGlmICEkTm90aWZpY2F0aW9uOwoKICAgICAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgICAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gPX4gbXsgdGV4dC9wbGFpbiB9eG1zaSApIHsKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICAgICAgZWxzaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbi0+e0NvbnRlbnRUeXBlfSA9fiBteyB0ZXh0L2h0bWwgfXhtc2kgKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgICROb3RpZmljYXRpb24tPntCb2R5fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIG1hY3JvcwogICAgICAgICROb3RpZmljYXRpb24tPntCb2R5fSA9ICRTZWxmLT5fTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcygKICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgVGV4dCAgICAgID0+ICROb3RpZmljYXRpb24tPntCb2R5fSwKICAgICAgICAgICAgUmVjaXBpZW50ID0+IHslQ3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgUmljaFRleHQgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIENoYW5nZSAgICA9PiAkQ2hhbmdlLAogICAgICAgICAgICBXb3JrT3JkZXIgPT4gJFdvcmtPcmRlciwKICAgICAgICAgICAgTGluayAgICAgID0+ICRMaW5rLAogICAgICAgICAgICBEYXRhICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgICAgICBMYW5ndWFnZSAgPT4gJFByZWZlcnJlZExhbmd1YWdlLAogICAgICAgICk7CgogICAgICAgICROb3RpZmljYXRpb24tPntTdWJqZWN0fSA9ICRTZWxmLT5fTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcygKICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgVGV4dCAgICAgID0+ICROb3RpZmljYXRpb24tPntTdWJqZWN0fSwKICAgICAgICAgICAgUmVjaXBpZW50ID0+IHslQ3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBDaGFuZ2UgICAgPT4gJENoYW5nZSwKICAgICAgICAgICAgV29ya09yZGVyID0+ICRXb3JrT3JkZXIsCiAgICAgICAgICAgIExpbmsgICAgICA9PiAkTGluaywKICAgICAgICAgICAgRGF0YSAgICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICAgICAgICAgTGFuZ3VhZ2UgID0+ICRQcmVmZXJyZWRMYW5ndWFnZSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsJyktPlNlbmQoCiAgICAgICAgICAgIEZyb20gPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJOYW1lJykgLiAnIDwnCiAgICAgICAgICAgICAgICAuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyRW1haWwnKSAuICc+JywKICAgICAgICAgICAgVG8gICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkTm90aWZpY2F0aW9uLT57U3ViamVjdH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gfHwgJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBDaGFyc2V0ICA9PiAndXRmLTgnLAogICAgICAgICAgICBCb2R5ICAgICA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgIExvb3AgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmlnZ2VyIE5vdGlmaWNhdGlvblNlbnQtRXZlbnQKICAgICAgICBteSAoJFR5cGUpID0gJEV2ZW50ID1+IG17IChXb3JrT3JkZXJ8Q2hhbmdlKSB9eG1zOwogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICRUeXBlIC4gJ05vdGlmaWNhdGlvblNlbnRQb3N0JywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBFdmVudFR5cGUgICA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkQ3VzdG9tZXJzU2VudHskQ3VzdG9tZXJJRH0gPSAxOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgTm90aWZpY2F0aW9uUnVsZUdldCgpCgpHZXQgaW5mbyBhYm91dCBhIHNpbmdsZSBub3RpZmljYXRpb24gcnVsZQoKICAgIG15ICROb3RpZmljYXRpb25SdWxlID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZUdldCgKICAgICAgICBJRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIHsKICAgICAgICBJRCAgICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnYSBkZXNjcmlwdGl2ZSBuYW1lJywKICAgICAgICBBdHRyaWJ1dGUgICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICBFdmVudElEICAgICAgPT4gMSwKICAgICAgICBFdmVudCAgICAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgID0+ICdkZXNjcmlwdGlvbiB3aGF0IHRoZSBydWxlIGRvZXMnLAogICAgICAgIFJ1bGUgICAgICAgICA9PiAncmVqZWN0ZWQnLAogICAgICAgIFJlY2lwaWVudHMgICA9PiBbICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLCAnQ2hhbmdlQ0FCQ3VzdG9tZXJzJyBdLAogICAgICAgIFJlY2lwaWVudElEcyA9PiBbIDIsIDMsIDcgXSwKICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hlbGxvIEFnZW50JywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGVsbG8gV29ybGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZGUnID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGFsbG8gQWdlbnQnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIYWxsbyBXZWx0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAnZW4nID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGVsbG8gQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIZWxsbyBXb3JsZCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdkZScgPT4gewogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdIYWxsbyBLdW5kZScsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0hhbGxvIFdlbHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0KCj1jdXQKCnN1YiBOb3RpZmljYXRpb25SdWxlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGUgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdOb3RpZmljYXRpb25SdWxlR2V0OjpJRDo6JyAuICRQYXJhbXtJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICAgICAgICAgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMSwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAwLAogICAgKTsKCiAgICAjIHJldHVybiBhIGNsb25lIG9mIHRoZSBjYWNoZSwgYXMgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRoZSBjYWNoZQogICAgcmV0dXJuIFN0b3JhYmxlOjpkY2xvbmUoJENhY2hlKSBpZiAkQ2FjaGU7CgogICAgIyBkbyBzcWwgcXVlcnkKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY24uaWQsIGNuLm5hbWUsIGl0ZW1fYXR0cmlidXRlLCBldmVudF9pZCwgY2h0Lm5hbWUsCiAgICAgICAgICAgIGNuLnZhbGlkX2lkLCBjbi5jb21tZW50cywgbm90aWZpY2F0aW9uX3J1bGUKICAgICAgICAgICAgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uIGNuLCBjaGFuZ2VfaGlzdG9yeV90eXBlIGNodAogICAgICAgICAgICBXSEVSRSBldmVudF9pZCA9IGNodC5pZCBBTkQgY24uaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCBub3RpZmljYXRpb24gcnVsZQogICAgbXkgJU5vdGlmaWNhdGlvblJ1bGU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVOb3RpZmljYXRpb25SdWxlID0gKAogICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICA9PiAkUm93WzJdIC8vICcnLAogICAgICAgICAgICBFdmVudElEICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgUnVsZSAgICAgICAgID0+ICRSb3dbN10gLy8gJycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgICA9PiB1bmRlZiwKICAgICAgICAgICAgUmVjaXBpZW50SURzID0+IHVuZGVmLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYWRkaXRpb25hbCBpbmZvCiAgICBpZiAoJU5vdGlmaWNhdGlvblJ1bGUpIHsKCiAgICAgICAgIyBnZXQgcmVjaXBpZW50cwogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGdycC5pZCwgZ3JwLm5hbWUKICAgICAgICAgICAgICAgIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbl9ncnBzIGdycCwgY2hhbmdlX25vdGlmaWNhdGlvbl9yZWMgcgogICAgICAgICAgICAgICAgV0hFUkUgZ3JwLmlkID0gci5ncm91cF9pZCBBTkQgci5ub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkTm90aWZpY2F0aW9uUnVsZXtJRH0gXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHJlY2lwaWVudHMKICAgICAgICBteSBAUmVjaXBpZW50czsKICAgICAgICBteSBAUmVjaXBpZW50SURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudElEcywgJFJvd1swXTsKICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50cywgICAkUm93WzFdOwogICAgICAgIH0KCiAgICAgICAgJE5vdGlmaWNhdGlvblJ1bGV7UmVjaXBpZW50c30gICA9IFxAUmVjaXBpZW50czsKICAgICAgICAkTm90aWZpY2F0aW9uUnVsZXtSZWNpcGllbnRJRHN9ID0gXEBSZWNpcGllbnRJRHM7CgogICAgICAgICMgZ2V0IGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBkYXRhCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1Qgc3ViamVjdCwgdGV4dCwgY29udGVudF90eXBlLCBsYW5ndWFnZSwgbm90aWZpY2F0aW9uX3R5cGUKICAgICAgICAgICAgICAgIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbl9tZXNzYWdlCiAgICAgICAgICAgICAgICBXSEVSRSBub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkTm90aWZpY2F0aW9uUnVsZXtJRH0gXSwKICAgICAgICApOwoKICAgICAgICBteSAlTWVzc2FnZTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgIyBhZGQgdG8gbWVzc2FnZSBoYXNoIHdpdGggdGhlIG5vdGlmaWNhdGlvbiB0eXBlIGFuZCB0aGUgbGFuZ3VhZ2UgYXMga2V5CiAgICAgICAgICAgICMgZS5nLiAkTWVzc2FnZXtBZ2VudH0tPntkZX0sIG9yICRNZXNzYWdle0N1c3RvbWVyfS0+e2VufQogICAgICAgICAgICAkTWVzc2FnZXsgJFJvd1s0XSB9LT57ICRSb3dbM10gfSA9IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJFJvd1syXSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICROb3RpZmljYXRpb25SdWxle01lc3NhZ2V9ID0gXCVNZXNzYWdlOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZXMgaW4gY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCgogICAgICAgICMgbWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIG5vdGlmaWNhdGlvbiBkYXRhIHRvIGF2b2lkIGl0IGJlaW5nIGFsdGVyZWQgaW4tbWVtb3J5IGxhdGVyCiAgICAgICAgVmFsdWUgPT4geyVOb3RpZmljYXRpb25SdWxlfSwKCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMSwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAwLAogICAgICAgIFRUTCAgICAgICAgICAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICAjIHJldHVybiBhIGNsb25lIG9mIHRoZSBjYWNoZSwgYXMgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRoZSBjYWNoZQogICAgcmV0dXJuIFN0b3JhYmxlOjpkY2xvbmUoIFwlTm90aWZpY2F0aW9uUnVsZSApOwp9Cgo9aGVhZDIgTm90aWZpY2F0aW9uUnVsZUFkZCgpCgpBZGQgYSBub3RpZmljYXRpb24gcnVsZS4gUmV0dXJucyB0aGUgSUQgb2YgdGhlIHJ1bGUuCgogICAgbXkgJElEID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZUFkZCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJ2EgZGVzY3JpcHRpdmUgbmFtZScsCiAgICAgICAgQXR0cmlidXRlICAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgRXZlbnRJRCAgICAgID0+IDEsCiAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgID0+ICdkZXNjcmlwdGlvbiB3aGF0IHRoZSBydWxlIGRvZXMnLAogICAgICAgIFJ1bGUgICAgICAgICA9PiAncmVqZWN0ZWQnLAogICAgICAgIFJlY2lwaWVudElEcyA9PiBbIDIsIDMsIDcgXSwKICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hlbGxvIEFnZW50JywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGVsbG8gV29ybGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZGUnID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGFsbG8gQWdlbnQnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIYWxsbyBXZWx0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAnZW4nID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGVsbG8gQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIZWxsbyBXb3JsZCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdkZScgPT4gewogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdIYWxsbyBLdW5kZScsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0hhbGxvIFdlbHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uUnVsZUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudElEIFZhbGlkSUQgUmVjaXBpZW50SURzIE1lc3NhZ2UpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBSZWNpcGllbnRJRHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UKICAgIGlmICggcmVmICRQYXJhbXtSZWNpcGllbnRJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZWNpcGllbnRJRHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG1lc3NhZ2UKICAgIGZvciBteSAkVHlwZSAocXcoQWdlbnQgQ3VzdG9tZXIpKSB7CgogICAgICAgICMgY2hlY2sgbWVzc2FnZSBwYXJhbWV0ZXIsIHdlIGFsd2F5cyBuZWVkIGFnZW50IGFuZCBtZXNzYWdlCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkVHlwZSBNZXNzYWdlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZWFjaCBhcmd1bWVudCBmb3IgZWFjaCBtZXNzYWdlIGxhbmd1YWdlCiAgICAgICAgZm9yIG15ICRMYW5ndWFnZSAoIHNvcnQga2V5cyAleyAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0gfSApIHsKCiAgICAgICAgICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN1YmplY3QgQm9keSBDb250ZW50VHlwZSkpIHsKCiAgICAgICAgICAgICAgICAjIGVycm9yIGlmIG1lc3NhZ2UgZGF0YSBpcyBpbmNvbXBsZXRlCiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2V9LT57JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgJFR5cGUgTWVzc2FnZSBhcmd1bWVudCAnJEFyZ3VtZW50JyBmb3IgbGFuZ3VhZ2UgJyRMYW5ndWFnZSchIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaXggc29tZSBiYWQgc3R1ZmYgZnJvbSBzb21lIGJyb3dzZXJzIChPcGVyYSkhCiAgICAgICAgICAgICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfS0+eyRMYW5ndWFnZX0tPntCb2R5fSA9fiBzLyhcblxyfFxyXHJcbnxcclxufFxyKS9cbi9nOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNhdmUgbm90aWZpY2F0aW9uIHJ1bGUKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX25vdGlmaWNhdGlvbgogICAgICAgICAgICAobmFtZSwgZXZlbnRfaWQsIHZhbGlkX2lkLCBpdGVtX2F0dHJpYnV0ZSwgY29tbWVudHMsIG5vdGlmaWNhdGlvbl9ydWxlKQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgICBcJFBhcmFte0V2ZW50SUR9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0F0dHJpYnV0ZX0sIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17UnVsZX0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgSUQgb2YgcnVsZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZAogICAgICAgICAgICBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb24KICAgICAgICAgICAgV0hFUkUgbmFtZSA9ID8KICAgICAgICAgICAgQU5EIGV2ZW50X2lkID0gPwogICAgICAgICAgICBBTkQgdmFsaWRfaWQgPSA/CiAgICAgICAgICAgIEFORCBpdGVtX2F0dHJpYnV0ZSA9ID8KICAgICAgICAgICAgQU5EIGNvbW1lbnRzID0gPwogICAgICAgICAgICBBTkQgbm90aWZpY2F0aW9uX3J1bGUgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgICAgICBcJFBhcmFte0V2ZW50SUR9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0F0dHJpYnV0ZX0sIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17UnVsZX0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIElECiAgICBteSAkUnVsZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUnVsZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRSdWxlSUQ7CgogICAgIyBpbnNlcnQgcmVjaXBpZW50cwogICAgZm9yIG15ICRSZWNpcGllbnRJRCAoIEB7ICRQYXJhbXtSZWNpcGllbnRJRHN9IH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX25vdGlmaWNhdGlvbl9yZWMgKG5vdGlmaWNhdGlvbl9pZCwgZ3JvdXBfaWQpIFZBTFVFUyAoPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRSdWxlSUQsIFwkUmVjaXBpZW50SUQgXSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5zZXJ0IGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBkYXRhCiAgICBmb3IgbXkgJFR5cGUgKHF3KEFnZW50IEN1c3RvbWVyKSkgewoKICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggc29ydCBrZXlzICV7ICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfSB9ICkgewoKICAgICAgICAgICAgbXkgJU1lc3NhZ2UgPSAleyAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2V9IH07CgogICAgICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX25vdGlmaWNhdGlvbl9tZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgKG5vdGlmaWNhdGlvbl9pZCwgc3ViamVjdCwgdGV4dCwgY29udGVudF90eXBlLCBsYW5ndWFnZSwgbm90aWZpY2F0aW9uX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgICAgICBcJFJ1bGVJRCwKICAgICAgICAgICAgICAgICAgICBcJE1lc3NhZ2V7U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgXCRNZXNzYWdle0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFwkTWVzc2FnZXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgXCRMYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICBcJFR5cGUsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdOb3RpZmljYXRpb25SdWxlTGlzdCcsCiAgICAgICAgJ05vdGlmaWNhdGlvblJ1bGVTZWFyY2g6OlZhbGlkOjowJywKICAgICAgICAnTm90aWZpY2F0aW9uUnVsZVNlYXJjaDo6VmFsaWQ6OjEnLAogICAgICAgICdOb3RpZmljYXRpb25SdWxlU2VhcmNoOjpWYWxpZDo6MDo6RXZlbnRJRDo6JyAuICRQYXJhbXtFdmVudElEfSwKICAgICAgICAnTm90aWZpY2F0aW9uUnVsZVNlYXJjaDo6VmFsaWQ6OjE6OkV2ZW50SUQ6OicgLiAkUGFyYW17RXZlbnRJRH0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRSdWxlSUQ7Cn0KCj1oZWFkMiBOb3RpZmljYXRpb25SdWxlVXBkYXRlKCkKClVwZGF0ZXMgYW4gZXhpc3Rpbmcgbm90aWZpY2F0aW9uIHJ1bGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlVXBkYXRlKAogICAgICAgIElEICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdhIGRlc2NyaXB0aXZlIG5hbWUnLAogICAgICAgIEF0dHJpYnV0ZSAgICA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgIEV2ZW50SUQgICAgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICA9PiAnZGVzY3JpcHRpb24gd2hhdCB0aGUgcnVsZSBkb2VzJywKICAgICAgICBSdWxlICAgICAgICAgPT4gJ3JlamVjdGVkJywKICAgICAgICBSZWNpcGllbnRJRHMgPT4gWyAyLCAzLCA3IF0sCiAgICAgICAgTWVzc2FnZSA9PiB7CiAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICdlbicgPT4gewogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICdIZWxsbyBBZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0hlbGxvIFdvcmxkJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2RlJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hhbGxvIEFnZW50JywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGFsbG8gV2VsdCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgJ2VuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0hlbGxvIEN1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAnSGVsbG8gV29ybGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZGUnID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAnSGFsbG8gS3VuZGUnLAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgID0+ICdIYWxsbyBXZWx0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvblJ1bGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIE5hbWUgRXZlbnRJRCBWYWxpZElEIFJlY2lwaWVudElEcyBNZXNzYWdlKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgUmVjaXBpZW50SURzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17UmVjaXBpZW50SURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjaXBpZW50SURzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBtZXNzYWdlCiAgICBmb3IgbXkgJFR5cGUgKHF3KEFnZW50IEN1c3RvbWVyKSkgewoKICAgICAgICAjIGNoZWNrIG1lc3NhZ2UgcGFyYW1ldGVyLCB3ZSBhbHdheXMgbmVlZCBhZ2VudCBhbmQgbWVzc2FnZQogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFR5cGUgTWVzc2FnZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVhY2ggYXJndW1lbnQgZm9yIGVhY2ggbWVzc2FnZSBsYW5ndWFnZQogICAgICAgIGZvciBteSAkTGFuZ3VhZ2UgKCBzb3J0IGtleXMgJXsgJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9IH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdWJqZWN0IEJvZHkgQ29udGVudFR5cGUpKSB7CgogICAgICAgICAgICAgICAgIyBlcnJvciBpZiBtZXNzYWdlIGRhdGEgaXMgaW5jb21wbGV0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9LT57JFR5cGV9LT57JExhbmd1YWdlfS0+eyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkICRUeXBlIE1lc3NhZ2UgYXJndW1lbnQgJyRBcmd1bWVudCcgZm9yIGxhbmd1YWdlICckTGFuZ3VhZ2UnISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZml4IHNvbWUgYmFkIHN0dWZmIGZyb20gc29tZSBicm93c2VycyAoT3BlcmEpIQogICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2V9LT57Qm9keX0gPX4gcy8oXG5ccnxcclxyXG58XHJcbnxccikvXG4vZzsKICAgICAgICB9CiAgICB9CgogICAgIyBzYXZlIG5vdGlmaWNhdGlvbiBydWxlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjaGFuZ2Vfbm90aWZpY2F0aW9uICcKICAgICAgICAgICAgLiAnU0VUIG5hbWUgPSA/LCBldmVudF9pZCA9ID8sIHZhbGlkX2lkID0gPywgaXRlbV9hdHRyaWJ1dGUgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NvbW1lbnRzID0gPywgbm90aWZpY2F0aW9uX3J1bGUgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgXCRQYXJhbXtFdmVudElEfSwgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtBdHRyaWJ1dGV9LCBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1J1bGV9LAogICAgICAgICAgICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBvbGQgcmVjaXBpZW50IGVudHJpZXMKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fcmVjIFdIRVJFIG5vdGlmaWNhdGlvbl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgKTsKCiAgICAjIGluc2VydCByZWNpcGllbnRzCiAgICBmb3IgbXkgJFJlY2lwaWVudElEICggQHsgJFBhcmFte1JlY2lwaWVudElEc30gfSApIHsKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2Vfbm90aWZpY2F0aW9uX3JlYyAobm90aWZpY2F0aW9uX2lkLCBncm91cF9pZCkgVkFMVUVTICg/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSwgXCRSZWNpcGllbnRJRCBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBkYXRhCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UgV0hFUkUgbm90aWZpY2F0aW9uX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICApOwoKICAgICMgaW5zZXJ0IGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBkYXRhCiAgICBmb3IgbXkgJFR5cGUgKHF3KEFnZW50IEN1c3RvbWVyKSkgewoKICAgICAgICBmb3IgbXkgJExhbmd1YWdlICggc29ydCBrZXlzICV7ICRQYXJhbXtNZXNzYWdlfS0+eyRUeXBlfSB9ICkgewoKICAgICAgICAgICAgbXkgJU1lc3NhZ2UgPSAleyAkUGFyYW17TWVzc2FnZX0tPnskVHlwZX0tPnskTGFuZ3VhZ2V9IH07CgogICAgICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX25vdGlmaWNhdGlvbl9tZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgKG5vdGlmaWNhdGlvbl9pZCwgc3ViamVjdCwgdGV4dCwgY29udGVudF90eXBlLCBsYW5ndWFnZSwgbm90aWZpY2F0aW9uX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte0lEfSwKICAgICAgICAgICAgICAgICAgICBcJE1lc3NhZ2V7U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgXCRNZXNzYWdle0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFwkTWVzc2FnZXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgXCRMYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICBcJFR5cGUsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdOb3RpZmljYXRpb25SdWxlR2V0OjpJRDo6JyAuICRQYXJhbXtJRH0sCiAgICAgICAgJ05vdGlmaWNhdGlvblJ1bGVMaXN0JywKICAgICAgICAnTm90aWZpY2F0aW9uUnVsZVNlYXJjaDo6VmFsaWQ6OjAnLAogICAgICAgICdOb3RpZmljYXRpb25SdWxlU2VhcmNoOjpWYWxpZDo6MScsCiAgICAgICAgJ05vdGlmaWNhdGlvblJ1bGVTZWFyY2g6OlZhbGlkOjowOjpFdmVudElEOjonIC4gJFBhcmFte0V2ZW50SUR9LAogICAgICAgICdOb3RpZmljYXRpb25SdWxlU2VhcmNoOjpWYWxpZDo6MTo6RXZlbnRJRDo6JyAuICRQYXJhbXtFdmVudElEfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE5vdGlmaWNhdGlvblJ1bGVEZWxldGUoKQoKZGVsZXRlcyBhbiBleGlzdGluZyBub3RpZmljYXRpb24gcnVsZQoKICAgIG15ICRTdWNjZXNzID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZURlbGV0ZSgKICAgICAgICBJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvblJ1bGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHJlY2lwaWVudCBlbnRyaWVzCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX3JlYyBXSEVSRSBub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGRhdGEKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fbWVzc2FnZSBXSEVSRSBub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2hhbmdlIG5vdGlmaWNhdGlvbgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgKTsKCiAgICAjIGNsZWFudXAgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE5vdGlmaWNhdGlvblJ1bGVMaXN0KCkKCnJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggSURzIG9mIGFsbCBleGlzdGluZyBub3RpZmljYXRpb24gcnVsZXMKCiAgICBteSAkTGlzdCA9ICROb3RpZmljYXRpb25PYmplY3QtPk5vdGlmaWNhdGlvblJ1bGVMaXN0KCk7CgpyZXR1cm5zCgogICAgWyAxLCAyLCAzIF0KCj1jdXQKCnN1YiBOb3RpZmljYXRpb25SdWxlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgY2hlY2sgdGhlIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnTm90aWZpY2F0aW9uUnVsZUxpc3QnOwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIGRvIHNxbCBxdWVyeSwKICAgICMgc29ydCBpbiBhIHVzZXJmcmllbmRseSBmYXNoaW9uCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbiAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGV2ZW50X2lkLCBpdGVtX2F0dHJpYnV0ZSwgbm90aWZpY2F0aW9uX3J1bGUnLAogICAgKTsKCiAgICAjIGZldGNoIElEcwogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZXMgaW4gY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFxASURzOwp9Cgo9aGVhZDIgTm90aWZpY2F0aW9uUnVsZVNlYXJjaCgpCgpSZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIElEcyBvZiBhbGwgbWF0Y2hpbmcgbm90aWZpY2F0aW9uIHJ1bGVzLgpUaGUgb25seSB2YWxpZCBzZWFyY2ggcGFyYW1ldGVyIGlzIHRoZSBFdmVudElELgoKICAgIG15ICROb3RpZmljYXRpb25SdWxlSURzID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZVNlYXJjaCgKICAgICAgICBFdmVudElEID0+IDQsICAgICMgb3B0aW9uYWwsIHByaW1hcnkga2V5IGluIGNoYW5nZV9oaXN0b3J5X3R5cGUKICAgICAgICBWYWxpZCAgID0+IDEsICAgICMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgMQogICAgKTsKCnJldHVybnMKCiAgICBbIDEsIDIsIDMgXQoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvblJ1bGVTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWQgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogMTsKCiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBAU1FMQmluZDsgICAgICMgcGFyYW1ldGVycyBmb3IgdGhlIFdIRVJFIGNsYXVzZQoKICAgICMgZGVmaW5lIHRoZSBjYWNoZSBrZXkKICAgIG15ICRDYWNoZUtleSA9ICdOb3RpZmljYXRpb25SdWxlU2VhcmNoOjpWYWxpZDo6JyAuICRWYWxpZDsKCiAgICAjIGZvciBub3cgd2Ugb25seSBoYXZlIGEgc2luZ2xlIHNlYXJjaCBwYXJhbQogICAgaWYgKCAkUGFyYW17RXZlbnRJRH0gKSB7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICdjbi5ldmVudF9pZCA9ID8nOwogICAgICAgIHB1c2ggQFNRTEJpbmQsICBcJFBhcmFte0V2ZW50SUR9OwogICAgICAgICRDYWNoZUtleSAuPSAnOjpFdmVudElEOjonIC4gJFBhcmFte0V2ZW50SUR9OwogICAgfQoKICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uIGNuICc7CgogICAgIyBhZGQgdGhlIFdIRVJFIGNsYXVzZQogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgICRTUUwgLj0gJ1dIRVJFICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KCiAgICAjIGFkZCB2YWxpZCBvcHRpb24KICAgIGlmICgkVmFsaWQpIHsKICAgICAgICAkU1FMIC49ICdBTkQgY24udmFsaWRfaWQgSU4gKCcKICAgICAgICAgICAgLiBqb2luKCAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSApIC4gJykgJzsKICAgIH0KCiAgICAjIGFkZCB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICAkU1FMIC49ICdPUkRFUiBCWSBjbi5pZCAnOwoKICAgICMgZG8gc3FsIHF1ZXJ5CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAU1FMQmluZCwKICAgICk7CgogICAgIyBmZXRjaCBJRHMKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHNhdmUgdmFsdWVzIGluIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBJRHMsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcQElEczsKfQoKPWhlYWQyIFJlY2lwaWVudExvb2t1cCgpCgpSZXR1cm5zIHRoZSBJRCB3aGVuIHlvdSBwYXNzIHRoZSByZWNpcGllbnQgbmFtZSBhbmQgcmV0dXJucyB0aGUgbmFtZSBpZiB5b3UKcGFzcyB0aGUgcmVjaXBpZW50IElELgoKICAgIG15ICRJRCA9ICROb3RpZmljYXRpb25PYmplY3QtPlJlY2lwaWVudExvb2t1cCgKICAgICAgICBOYW1lID0+ICdDaGFuZ2VCdWlsZGVyJywKICAgICk7CgogICAgbXkgJE5hbWUgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5SZWNpcGllbnRMb29rdXAoCiAgICAgICAgSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBSZWNpcGllbnRMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0lEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0lEfSAmJiAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBJRCBvciBOYW1lIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjYWNoZQogICAgbXkgJENhY2hlS2V5OwogICAgaWYgKCAkUGFyYW17SUR9ICkgewogICAgICAgICRDYWNoZUtleSA9ICdSZWNpcGllbnRMb29rdXA6OklEOjonIC4gJFBhcmFte0lEfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte05hbWV9ICkgewogICAgICAgICRDYWNoZUtleSA9ICdSZWNpcGllbnRMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICB9CiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgZGV0ZXJtaW5lIHNxbCBzdGF0ZW1lbnQgYW5kIGJpbmQgcGFyYW1ldGVycwogICAgbXkgJFNRTDsKICAgIG15IEBCaW5kczsKICAgIGlmICggJFBhcmFte0lEfSApIHsKICAgICAgICAkU1FMICAgPSAnU0VMRUNUIG5hbWUgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX2dycHMgV0hFUkUgaWQgPSA/JzsKICAgICAgICBAQmluZHMgPSAoIFwkUGFyYW17SUR9ICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU1FMICAgPSAnU0VMRUNUIGlkIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbl9ncnBzIFdIRVJFIG5hbWUgPSA/JzsKICAgICAgICBAQmluZHMgPSAoIFwkUGFyYW17TmFtZX0gKTsKICAgIH0KCiAgICAjIGRvIHNxbCBxdWVyeQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZHMsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdmFsdWUKICAgIG15ICRWYWx1ZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHNhdmUgdmFsdWUgaW4gY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCj1oZWFkMiBSZWNpcGllbnRMaXN0KCkKClJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggaGFzaCByZWZlcmVuY2VzLiBUaGUga2V5IG9mIHRoZSBoYXNoIHJlZmVyZW5jZSBpcyB0aGUgaWQKb2YgYW4gcmVjaXBpZW50IGFuZCB0aGUgaHVtYW4gcmVhZGFibGUgYW5kIHRyYW5zbGF0YWJsZSBuYW1lIGlzIHRoZSB2YWx1ZS4KCiAgICBteSAkTGlzdCA9ICROb3RpZmljYXRpb25PYmplY3QtPlJlY2lwaWVudExpc3QoKTsKCnJldHVybnMKCiAgICBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ2hhbmdlIEJ1aWxkZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAyLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ2hhbmdlIE1hbmFnZXInLAogICAgICAgIH0sCiAgICBdCgo9Y3V0CgpzdWIgUmVjaXBpZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgSHVtYW4gcmVhZGFibGUgdHJhbnNsYXRhYmxlIG5hbWVzIG9mIHJlY2lwaWVudHMuCiAgICBteSAlSHVtYW5SZWFkYWJsZVJlY2lwaWVudCA9ICgKICAgICAgICBDaGFuZ2VCdWlsZGVyICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIEJ1aWxkZXInKSwKICAgICAgICBPbGRDaGFuZ2VCdWlsZGVyICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUHJldmlvdXMgQ2hhbmdlIEJ1aWxkZXInKSwKICAgICAgICBDaGFuZ2VNYW5hZ2VyICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIE1hbmFnZXInKSwKICAgICAgICBPbGRDaGFuZ2VNYW5hZ2VyICAgICAgID0+IFRyYW5zbGF0YWJsZSgnUHJldmlvdXMgQ2hhbmdlIE1hbmFnZXInKSwKICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ0FCIEN1c3RvbWVycycpLAogICAgICAgIENBQkFnZW50cyAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDQUIgQWdlbnRzJyksCiAgICAgICAgV29ya09yZGVyQWdlbnRzICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciBBZ2VudHMnKSwKICAgICAgICBXb3JrT3JkZXJBZ2VudCAgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnV29ya29yZGVyIEFnZW50JyksCiAgICAgICAgV29ya09yZGVyR3JvdXAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1dvcmtvcmRlciBHcm91cCcpLAogICAgICAgIE9sZFdvcmtPcmRlckFnZW50ICAgICAgPT4gVHJhbnNsYXRhYmxlKCdQcmV2aW91cyBXb3Jrb3JkZXIgQWdlbnQnKSwKICAgICAgICBDaGFuZ2VJbml0aWF0b3JzICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQ2hhbmdlIEluaXRpYXRvcnMnKSwKICAgICAgICBHcm91cElUU01DaGFuZ2UgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnR3JvdXAgSVRTTUNoYW5nZScpLAogICAgICAgIEdyb3VwSVRTTUNoYW5nZUJ1aWxkZXIgPT4gVHJhbnNsYXRhYmxlKCdHcm91cCBJVFNNQ2hhbmdlQnVpbGRlcicpLAogICAgICAgIEdyb3VwSVRTTUNoYW5nZU1hbmFnZXIgPT4gVHJhbnNsYXRhYmxlKCdHcm91cCBJVFNNQ2hhbmdlTWFuYWdlcicpLAogICAgKTsKCiAgICAjIGRvIFNRTCBxdWVyeQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZQogICAgICAgICAgICBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fZ3JwcwogICAgICAgICAgICBPUkRFUiBCWSBuYW1lJywKICAgICk7CgogICAgIyBmZXRjaCByZWNpcGllbnRzCiAgICBteSBAUmVjaXBpZW50czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJFJlY2lwaWVudCA9IHsKICAgICAgICAgICAgS2V5ID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFZhbHVlID0+ICRIdW1hblJlYWRhYmxlUmVjaXBpZW50eyAkUm93WzFdIH0gfHwgJFJvd1sxXSwKICAgICAgICB9OwogICAgICAgIHB1c2ggQFJlY2lwaWVudHMsICRSZWNpcGllbnQ7CiAgICB9CgogICAgcmV0dXJuIFxAUmVjaXBpZW50czsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKCkKClRoaXMgbWV0aG9kIHJlcGxhY2VzIGFsbCB0aGUgPE9GT1JLX3h4eHg+IG1hY3JvcyBpbiBub3RpZmljYXRpb24gdGV4dC4KCiAgICBteSAkQ2xlYW5UZXh0ID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+X05vdGlmaWNhdGlvblJlcGxhY2VNYWNyb3MoCiAgICAgICAgVHlwZSAgICAgID0+ICdDaGFuZ2UnLCAgICAjIENoYW5nZXxXb3JrT3JkZXIKICAgICAgICBUZXh0ICAgICAgPT4gJ1NvbWUgPE9GT1JLX0NPTkZJR19GUUROPiB0ZXh0JywKICAgICAgICBSaWNoVGV4dCAgPT4gMSwgICAgICAgICAgICMgb3B0aW9uYWwsIGlzIFRleHQgcmljaHRleHQgb3Igbm90LiBkZWZhdWx0IDAKICAgICAgICBSZWNpcGllbnQgPT4geyVVc2VyfSwKICAgICAgICBEYXRhICAgICAgPT4gewogICAgICAgICAgICBDaGFuZ2VCdWlsZGVyID0+IHsKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ1RvbScsCiAgICAgICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdUZXN0ZXInLAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAndHRAby1mb3JrLmNvbScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2UgICAgPT4gJENoYW5nZSwKICAgICAgICBXb3JrT3JkZXIgPT4gJFdvcmtPcmRlciwKICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgTGFuZ3VhZ2UgID0+ICRMYW5ndWFnZSwgICAgIyB1c2VkIGZvciB0cmFuc2xhdGluZyBzdGF0ZXMgYW5kIHN1Y2gKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX05vdGlmaWNhdGlvblJlcGxhY2VNYWNyb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVGV4dCBEYXRhIFVzZXJJRCBDaGFuZ2UgV29ya09yZGVyIExpbmsgTGFuZ3VhZ2UpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGV4dCA9ICRQYXJhbXtUZXh0fTsKCiAgICAjIGRldGVybWluZSB3aGF0ICJtYWNybyIgZGVsaW1pdGVycyBhcmUgdXNlZAogICAgbXkgJFN0YXJ0ID0gJzwnOwogICAgbXkgJEVuZCAgID0gJz4nOwoKICAgICMgd2l0aCByaWNodGV4dCBlbmFibGVkLCB0aGUgZGVsaW1pdGVycyBjaGFuZ2UKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgICAgICRUZXh0ID1+IHN7IChcbnxccikgfXt9eG1zZzsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZSBDaGFuZ2UgYW5kIFdvcmtvcmRlciB2YWx1ZXMsIHdoZXJlIGFwcHJvcHJpYXRlCiAgICAjIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGxhbmd1YWdlIG9iamVjdCBtYW51YWxseSAod2l0aG91dCB0aGUgb2JqZWN0IG1hbmFnZXIpLAogICAgIyBzbyB3ZSBjYW4gdHJhbnNsYXRlIGludG8gdGhlIGxhbmd1YWdlIG9mIHRoZSByZWNpcGllbnQKICAgIG15ICRMYW5ndWFnZU9iamVjdCA9IEtlcm5lbDo6TGFuZ3VhZ2UtPm5ldygKICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSwKICAgICk7CiAgICBteSAlQ2hhbmdlRGF0YSA9ICV7ICRQYXJhbXtDaGFuZ2V9IH07CiAgICBmb3IgbXkgJEZpZWxkIChxdyhDaGFuZ2VTdGF0ZSBDYXRlZ29yeSBQcmlvcml0eSBJbXBhY3QpKSB7CiAgICAgICAgJENoYW5nZURhdGF7JEZpZWxkfSA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCAkQ2hhbmdlRGF0YXskRmllbGR9ICk7CiAgICB9CgogICAgbXkgJVdvcmtPcmRlckRhdGEgPSAleyAkUGFyYW17V29ya09yZGVyfSB9OwogICAgZm9yIG15ICRGaWVsZCAocXcoV29ya09yZGVyU3RhdGUgV29ya09yZGVyVHlwZSkpIHsKICAgICAgICAkV29ya09yZGVyRGF0YXskRmllbGR9ID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoICRXb3JrT3JkZXJEYXRheyRGaWVsZH0gKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT0ZPUktfQ09ORklHXyc7CiAgICAkVGV4dCA9fiBzeyAkVGFnICguKz8pICRFbmQgfXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKCiAgICAjIGNsZWFudXAKICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmQgfXstfWdpOwoKICAgICRUYWcgPSAkU3RhcnQgLiAnT0ZPUktfQWdlbnRfJzsKICAgIG15ICRUYWcyID0gJFN0YXJ0IC4gJ09GT1JLX0NVUlJFTlRfJzsKICAgIG15ICVDdXJyZW50VXNlcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSApOwoKICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUN1cnJlbnRVc2VyICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEN1cnJlbnRVc2VyeyRLZXl9OwogICAgICAgICAgICAkQ3VycmVudFVzZXJ7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ3VycmVudFVzZXJ7JEtleX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpdAogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUN1cnJlbnRVc2VyICkgewogICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRDdXJyZW50VXNlcnskS2V5fTsKICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyRDdXJyZW50VXNlcnskS2V5fX1neG1zaTsKICAgICAgICAkVGV4dCA9fiBzeyAkVGFnMiAkS2V5ICRFbmQgfXskQ3VycmVudFVzZXJ7JEtleX19Z3htc2k7CiAgICB9CgogICAgIyByZXBsYWNlIG90aGVyIG5lZWRlZCBzdHVmZgogICAgJFRleHQgPX4gc3sgJFN0YXJ0IE9GT1JLX0ZJUlNUX05BTUUgJEVuZCB9eyRDdXJyZW50VXNlcntVc2VyRmlyc3RuYW1lfX1neG1zOwogICAgJFRleHQgPX4gc3sgJFN0YXJ0IE9GT1JLX0xBU1RfTkFNRSAkRW5kIH17JEN1cnJlbnRVc2Vye1VzZXJMYXN0bmFtZX19Z3htczsKCiAgICAjIGNsZWFudXAKICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19eG1zZ2k7CiAgICAkVGV4dCA9fiBzeyAkVGFnMiAuKz8gJEVuZH17LX14bXNnaTsKCiAgICAjIGdldCBhbmQgcHJlcGFyZSByZWFsbmFtZQogICAgJFRhZyA9ICRTdGFydCAuICdPRk9SS19DVVNUT01FUl9SRUFMTkFNRSc7CiAgICAkVGV4dCA9fiBzeyRUYWckRW5kfXstfWc7CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPRk9SS19DVVNUT01FUl9EQVRBXy4uLgogICAgJFRhZyAgPSAkU3RhcnQgLiAnT0ZPUktfQ1VTVE9NRVJfJzsKICAgICRUYWcyID0gJFN0YXJ0IC4gJ09GT1JLX0NVU1RPTUVSX0RBVEFfJzsKCiAgICAjIGNsZWFudXAgYWxsIG5vdCBuZWVkZWQgPE9GT1JLX0NVU1RPTUVSX0RBVEFfIHRhZ3MKICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmQgfXstfXhtc2dpOwogICAgJFRleHQgPX4gc3sgJFRhZzIgLis/ICRFbmR9ey19eG1zZ2k7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgcmVwbGFjZSA8T0ZPUktfQ0hBTkdFXy4uLiB0YWdzCiAgICB7CiAgICAgICAgbXkgJFRhZyA9ICRTdGFydCAuICdPRk9SS19DSEFOR0VfJzsKCiAgICAgICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlQ2hhbmdlRGF0YSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkQ2hhbmdlRGF0YXskS2V5fTsKICAgICAgICAgICAgICAgICRDaGFuZ2VEYXRheyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2VEYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hhbmdlIGJ1aWxkZXIgYW5kIGNoYW5nZSBtYW5hZ2VyCiAgICAgICAgVVNFUjoKICAgICAgICBmb3IgbXkgJFVzZXIgKHF3KENoYW5nZUJ1aWxkZXIgQ2hhbmdlTWFuYWdlcikpIHsKCiAgICAgICAgICAgIG15ICRBdHRyaWJ1dGUgPSAkVXNlciAuICdJRCc7CgogICAgICAgICAgICAjIG9ubHkgaWYgYW4gYWdlbnQgaXMgc2V0IGZvciB0aGlzIGF0dHJpYnV0ZQogICAgICAgICAgICBuZXh0IFVTRVIgaWYgISRDaGFuZ2VEYXRheyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2VEYXRheyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFVTRVIgaWYgISVVc2VyRGF0YTsKCiAgICAgICAgICAgICMgYnVpbGQgdXNlciBhdHRyaWJ1dGUKICAgICAgICAgICAgJENoYW5nZURhdGF7JFVzZXJ9ID0gIiRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9IjsKICAgICAgICB9CgogICAgICAgICMgRHJvcGRvd24sIENoZWNrYm94IGFuZCBNdWx0aXBsZVNlbGVjdCBEeW5hbWljRmllbGRzLCBjYW4gc3RvcmUgdmFsdWVzIChrZXlzKSB0aGF0IGFyZQogICAgICAgICMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSB2YWx1ZXMgdG8gZGlzcGxheQogICAgICAgICMgPE9GT1JLX0NIQU5HRV9EeW5hbWljRmllbGRfTmFtZVg+IHJldHVybnMgdGhlIHN0b3JlZCBrZXkKICAgICAgICAjIDxPRk9SS19DSEFOR0VfRHluYW1pY0ZpZWxkX05hbWVYX1ZhbHVlPiByZXR1cm5zIHRoZSBkaXNwbGF5IHZhbHVlCgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlID0+IFsnSVRTTUNoYW5nZSddLAogICAgICAgICkgfHwgW107CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCBhbGwgY2hhbmdlIER5bmFtaWMgRmllbGRzCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIGdldCB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICREaXNwbGF5VmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICA9PiAkQ2hhbmdlRGF0YXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBMYW5ndWFnZU9iamVjdCAgICAgPT4gJExhbmd1YWdlT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlICh2YWx1ZSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkRGlzcGxheVZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJERpc3BsYXlWYWx1ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmlsbCB0aGUgRHluYW1pY0ZpZWxzRGlzcGxheVZhbHVlcwogICAgICAgICAgICBpZiAoJERpc3BsYXlWYWx1ZVN0cmcpIHsKICAgICAgICAgICAgICAgICRDaGFuZ2VEYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1ZhbHVlJyB9CiAgICAgICAgICAgICAgICAgICAgPSAkRGlzcGxheVZhbHVlU3RyZy0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlIChrZXkpIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJENoYW5nZURhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXBsYWNlIHRpY2tldCBjb250ZW50IHdpdGggdGhlIHZhbHVlIGZyb20gUmVhZGFibGVWYWx1ZVJlbmRlciAoaWYgYW55KQogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRWYWx1ZVN0cmcpICkgewogICAgICAgICAgICAgICAgJENoYW5nZURhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVDaGFuZ2VEYXRhICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkQ2hhbmdlRGF0YXskS2V5fTsKICAgICAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAkS2V5ICRFbmQgfXskQ2hhbmdlRGF0YXskS2V5fX1neG1zaTsKICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19Z3htc2k7CiAgICB9CgogICAgIyByZXBsYWNlIDxPRk9SS19XT1JLT1JERVJfLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnID0gJFN0YXJ0IC4gJ09GT1JLX1dPUktPUkRFUl8nOwoKICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVXb3JrT3JkZXJEYXRhICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRXb3JrT3JkZXJEYXRheyRLZXl9OwogICAgICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFdvcmtPcmRlckRhdGF7JEtleX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgYWdlbnQKICAgICAgICBpZiAoICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlckFnZW50SUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHdvcmtvcmRlciBhZ2VudCBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyQWdlbnR9ID0gIiRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9IjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEcm9wZG93biwgQ2hlY2tib3ggYW5kIE11bHRpcGxlU2VsZWN0IER5bmFtaWNGaWVsZHMsIGNhbiBzdG9yZSB2YWx1ZXMgKGtleXMpIHRoYXQgYXJlCiAgICAgICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgdGhlIHZhbHVlcyB0byBkaXNwbGF5CiAgICAgICAgIyA8T0ZPUktfV09SS09SREVSX0R5bmFtaWNGaWVsZF9OYW1lWD4gcmV0dXJucyB0aGUgc3RvcmVkIGtleQogICAgICAgICMgPE9GT1JLX1dPUktPUkRFUl9EeW5hbWljRmllbGRfTmFtZVhfVmFsdWU+IHJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUKCiAgICAgICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB3b3Jrb3JkZXIgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gWydJVFNNV29ya09yZGVyJ10sCiAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIGFsbCB3b3Jrb3JkZXIgRHluYW1pYyBGaWVsZHMKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBkaXNwbGF5IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJERpc3BsYXlWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJFdvcmtPcmRlckRhdGF7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VPYmplY3QgPT4gJExhbmd1YWdlT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlICh2YWx1ZSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkRGlzcGxheVZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJERpc3BsYXlWYWx1ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmlsbCB0aGUgRHluYW1pY0ZpZWxzRGlzcGxheVZhbHVlcwogICAgICAgICAgICBpZiAoJERpc3BsYXlWYWx1ZVN0cmcpIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJEYXRheyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1ZhbHVlJyB9CiAgICAgICAgICAgICAgICAgICAgPSAkRGlzcGxheVZhbHVlU3RyZy0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlIChrZXkpIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkV29ya09yZGVyRGF0YXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgdGlja2V0IGNvbnRlbnQgd2l0aCB0aGUgdmFsdWUgZnJvbSBSZWFkYWJsZVZhbHVlUmVuZGVyIChpZiBhbnkpCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFZhbHVlU3RyZykgKSB7CiAgICAgICAgICAgICAgICAkV29ya09yZGVyRGF0YXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICAgICA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSBpdAogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlV29ya09yZGVyRGF0YSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJFdvcmtPcmRlckRhdGF7JEtleX07CiAgICAgICAgICAgICRUZXh0ID1+IHN7ICRUYWcgJEtleSAkRW5kIH17JFdvcmtPcmRlckRhdGF7JEtleX19Z3htc2k7CiAgICAgICAgfQoKICAgICAgICAjIGNsZWFudXAKICAgICAgICAkVGV4dCA9fiBzeyAkVGFnIC4rPyAkRW5kfXstfWd4bXNpOwogICAgfQoKICAgICMgcmVwbGFjZSA8T0ZPUktfQ09ORElUSU9OLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnICA9ICRTdGFydCAuICdPRk9SS19DT05ESVRJT05fJzsKICAgICAgICBteSAlRGF0YSA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISREYXRheyRLZXl9OwogICAgICAgICAgICAgICAgJERhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7JEtleX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgaXQKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICREYXRheyRLZXl9OwogICAgICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyREYXRheyRLZXl9fWd4bXNpOwogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAuKz8gJEVuZH17LX1neG1zaTsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9GT1JLX0xJTktfLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnICAgICAgPSAkU3RhcnQgLiAnT0ZPUktfTElOS18nOwogICAgICAgIG15ICVMaW5rRGF0YSA9ICV7ICRQYXJhbXtMaW5rfSB9OwoKICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVMaW5rRGF0YSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkTGlua0RhdGF7JEtleX07CiAgICAgICAgICAgICAgICAkTGlua0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExpbmtEYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVMaW5rRGF0YSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJExpbmtEYXRheyRLZXl9OwogICAgICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyRMaW5rRGF0YXskS2V5fX1neG1zaTsKICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19Z3htc2k7CiAgICB9CgogICAgIyByZXBsYWNlIGV4dGVuZGVkIDxPRk9SS19DSEFOR0VfLi4uIHRhZ3MKICAgIG15ICVJbmZvSGFzaCA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgIGZvciBteSAkT2JqZWN0IChxdyhDaGFuZ2VCdWlsZGVyIENoYW5nZU1hbmFnZXIgV29ya09yZGVyQWdlbnQpKSB7CiAgICAgICAgbXkgJFRhZyA9ICRTdGFydCAuIHVjICdPRk9SS18nIC4gJE9iamVjdCAuICdfJzsKCiAgICAgICAgaWYgKCBleGlzdHMgJEluZm9IYXNoeyRPYmplY3R9ICYmIHJlZiAkSW5mb0hhc2h7JE9iamVjdH0gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJEluZm9IYXNoeyRPYmplY3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRJbmZvSGFzaHskT2JqZWN0fS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgICRJbmZvSGFzaHskT2JqZWN0fS0+eyRLZXl9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSW5mb0hhc2h7JE9iamVjdH0tPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJEluZm9IYXNoeyRPYmplY3R9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkSW5mb0hhc2h7JE9iamVjdH0tPnskS2V5fTsKICAgICAgICAgICAgICAgICRUZXh0ID1+IHN7ICRUYWcgJEtleSAkRW5kIH17JEluZm9IYXNoeyRPYmplY3R9LT57JEtleX19Z3htc2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19Z3htc2k7CiAgICB9CgogICAgIyBnZXQgcmVjaXBpZW50IGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T0ZPUktfLi4uCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09GT1JLXyc7CiAgICBpZiAoICRQYXJhbXtSZWNpcGllbnR9ICkgewoKICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtSZWNpcGllbnR9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJFBhcmFte1JlY2lwaWVudH0tPnskS2V5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWNpcGllbnR9LT57JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY2lwaWVudH0tPnskS2V5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSBpdAogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UmVjaXBpZW50fSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9OwogICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9OwogICAgICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyRWYWx1ZX1neG1zaTsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkVGV4dCA9fiBzeyAkVGFnIC4rPyAkRW5kfXstfWd4bXNpOwoKICAgIHJldHVybiAkVGV4dDsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9aGVhZDIgVGhlIGZvbGxvd2luZyBwbGFjZWhvbGRlcnMgY2FuIGJlIHVzZWQgaW4gQ2hhbmdlOjp4eHggbm90aWZpY2F0aW9ucwoKPWhlYWQzIEM8T0ZPUktfQ0hBTkdFX3h4eD4KCndpdGggdGhlIHN1YnNlcXVlbnQgdmFsdWVzIGZvciB4eHg6CgogICAgQ2hhbmdlSUQKICAgICAgICBUaGUgSUQgb2YgdGhlIGNoYW5nZQogICAgQ2hhbmdlTnVtYmVyCiAgICAgICAgVGhlIG51bWJlciBvZiB0aGUgY2hhbmdlCiAgICBDaGFuZ2VTdGF0ZUlECiAgICAgICAgVGhlIElEIG9mIHRoZSBjaGFuZ2Ugc3RhdGUKICAgIENoYW5nZVN0YXRlCiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoYW5nZSBzdGF0ZSAoZS5nLiByZXF1ZXN0ZWQsIGFwcHJvdmVkKQogICAgQ2hhbmdlU3RhdGVTaWduYWwKICAgIENoYW5nZVRpdGxlCiAgICAgICAgVGhlIGNoYW5nZSB0aXRsZQogICAgRGVzY3JpcHRpb24KICAgICAgICBUaGUgIm9yaWdpbmFsIiBkZXNjcmlwdGlvbi4gUGxlYXNlIG5vdGU6IElmIHJpY2h0ZXh0IGZlYXR1cmUgaXMgZW5hYmxlZCwKICAgICAgICB0aGlzIGNvbnRhaW5zIEhUTUwgbWFya3VwLiBTbyB0aGlzIGNhbiBiZSB1c2VkIHRvIHNlbmQgSFRNTCBub3RpZmljYXRpb25zLgogICAgRGVzY3JpcHRpb25QbGFpbgogICAgICAgIFRoaXMgaXMgdGhlIHBsYWluIGRlc2NyaXB0aW9uIHdpdGhvdXQgYW55IEhUTUwgbWFya3VwLiBUaGlzIGlzIGJldHRlciBmb3IgcGxhaW4gbm90aWZpY2F0aW9ucy4KICAgIEp1c3RpZmljYXRpb24KICAgICAgICBUaGUgc2FtZSBhcyBmb3IgRGVzY3JpcHRpb24gYXBwbGllcyBoZXJlLgogICAgSnVzdGlmaWNhdGlvblBsYWluCiAgICAgICAgU2VlIERlc2NyaXB0aW9uUGxhaW4uCiAgICBDaGFuZ2VCdWlsZGVySUQKICAgICAgICBDaGFuZ2UgYnVpbGRlciBJRAogICAgQ2hhbmdlTWFuYWdlcklECiAgICAgICAgQ2hhbmdlIG1hbmFnZXIgSUQKICAgIENhdGVnb3J5SUQKICAgICAgICBJRCBvZiBjaGFuZ2VzJyBjYXRlZ29yeS4KICAgIENhdGVnb3J5CiAgICAgICAgTmFtZSBvZiBjaGFuZ2VzJyBjYXRlZ29yeS4KICAgIEltcGFjdElECiAgICAgICAgSUQgb2YgY2hhbmdlcycgaW1wYWN0LgogICAgSW1wYWN0CiAgICAgICAgTmFtZSBvZiBjaGFuZ2VzJyBpbXBhY3QuCiAgICBQcmlvcml0eUlECiAgICAgICAgSUQgb2YgY2hhbmdlcycgcHJpb3JpdHkuCiAgICBQcmlvcml0eQogICAgICAgIE5hbWUgb2YgY2hhbmdlcycgcHJpb3JpdHkuCiAgICBXb3JrT3JkZXJDb3VudAogICAgICAgIE51bWJlciBvZiBhbGwgd29yayBvcmRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGNoYW5nZS4KICAgIFJlcXVlc3RlZFRpbWUKICAgICAgICBUaGUgdGltZSB0aGUgY3VzdG9tZXIgd2FudCB0aGUgY2hhbmdlIHRvIGJlIGZpbmlzaGVkLgogICAgUGxhbm5lZEVmZm9ydAogICAgICAgIFN1bSBvZiB0aGUgcGxhbm5lZCBlZmZvcnRzIChjYWxjdWxhdGVkIGZyb20gdGhlIHdvcmtvcmRlcnMpLgogICAgQWNjb3VudGVkVGltZQogICAgICAgIEFjY291bnRlZCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBQbGFubmVkU3RhcnRUaW1lCiAgICAgICAgUGxhbm5lZCBzdGFydCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBQbGFubmVkRW5kVGltZQogICAgICAgIFBsYW5uZWQgZW5kIHRpbWUgb2YgdGhlIGNoYW5nZSAoY2FsY3VsYXRlZCBmcm9tIHRoZSB3b3Jrb3JkZXJzKS4KICAgIEFjdHVhbFN0YXJ0VGltZQogICAgICAgIEFjdHVhbCBzdGFydCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBBY3R1YWxFbmRUaW1lCiAgICAgICAgQWN0dWFsIGVuZCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCgo9aGVhZDMgQzxPRk9SS19DSEFOR0VCVUlMREVSX3h4eD4sIEM8T0ZPUktfQ0hBTkdFTUFOQUdFUl94eHg+LCBDPE9GT1JLX1dPUktPUkRFUkFHRU5UX3h4eD4KCndpdGggdGhlIHN1YnNlcXVlbnQgdmFsdWVzIGZvciB4eHg6CgogICAgVXNlckZpcnN0bmFtZQogICAgICAgIEZpcnN0bmFtZSBvZiB0aGUgcGVyc29uLgogICAgVXNlckxhc3RuYW1lCiAgICAgICAgTGFzdG5hbWUgb2YgdGhlIHBlcnNvbi4KICAgIFVzZXJFbWFpbAogICAgICAgIEVtYWlsIGFkZHJlc3Mgb2YgdGhlIHBlcnNvbi4KCj1oZWFkMyBDPE9GT1JLX1dPUktPUkRFUl94eHg+Cgp3aXRoIHRoZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgeHh4OgoKICAgIFdvcmtPcmRlcklECiAgICAgICAgSUQgb2YgdGhlIHdvcmtvcmRlcgogICAgQ2hhbmdlSUQKICAgICAgICBJRCBvZiB0aGUgY2hhbmdlIHRoZSB3b3Jrb3JkZXIgYmVsb25ncyB0by4KICAgIFdvcmtPcmRlck51bWJlcgogICAgICAgIFdvcmtvcmRlciBudW1iZXIKICAgIFdvcmtPcmRlclRpdGxlCiAgICAgICAgVGl0bGUgb2YgdGhlIHdvcmtvcmRlcgogICAgSW5zdHJ1Y3Rpb24KICAgICAgICBTZWUgQ2hhbmdlIHBsYWNlaG9sZGVycyAtPiBEZXNjcmlwdGlvbgogICAgSW5zdHJ1Y3Rpb25QbGFpbgogICAgICAgIFNlZSBDaGFuZ2UgcGxhY2Vob2xkZXJzIC0+IERlc2NyaXB0aW9uUGxhaW4KICAgIFJlcG9ydAogICAgICAgIFNlZSBDaGFuZ2UgcGxhY2Vob2xkZXJzIC0+IERlc2NyaXB0aW9uCiAgICBSZXBvcnRQbGFpbgogICAgICAgIFNlZSBDaGFuZ2UgcGxhY2Vob2xkZXJzIC0+IERlc2NyaXB0aW9uUGxhaW4KICAgIFdvcmtPcmRlclN0YXRlSUQKICAgICAgICBJRCBvZiB0aGUgd29ya29yZGVyIHN0YXRlLgogICAgV29ya09yZGVyU3RhdGUKICAgICAgICBOYW1lIG9mIHRoZSB3b3Jrb3JkZXIgc3RhdGUuCiAgICBXb3JrT3JkZXJTdGF0ZVNpZ25hbAogICAgV29ya09yZGVyVHlwZUlECiAgICAgICAgSUQgb2YgdGhlIHdvcmtvcmRlciB0eXBlLgogICAgV29ya09yZGVyVHlwZQogICAgICAgIFRoZSBuYW1lIG9mIHRoZSB3b3JrIG9yZGVyIHR5cGUuCiAgICBXb3JrT3JkZXJBZ2VudElECiAgICAgICAgVGhlIElEIG9mIHRoZSB3b3Jrb3JkZXIgYWdlbnQuCiAgICBQbGFubmVkU3RhcnRUaW1lCiAgICAgICAgVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBmb3IgdGhlIHdvcmtvcmRlci4KICAgIFBsYW5uZWRFbmRUaW1lCiAgICAgICAgVGhlIHBsYW5uZWQgZW5kIHRpbWUgZm9yIHRoZSB3b3Jrb3JkZXIuCiAgICBBY3R1YWxTdGFydFRpbWUKICAgICAgICBXaGVuIGRpZCB0aGUgd29ya29yZGVyIGFjdHVhbGx5IHN0YXJ0LgogICAgQWN0dWFsRW5kVGltZQogICAgICAgIFdoZW4gZGlkIHRoZSB3b3Jrb3JkZXIgYWN0dWFsbHkgZW5kLgogICAgQWNjb3VudGVkVGltZQogICAgICAgIFRoZSBzbyBmYXIgYWNjb3VudGVkIHRpbWUgZm9yIHRoZSBzaW5nbGUgd29ya29yZGVyCiAgICBQbGFubmVkRWZmb3J0CiAgICAgICAgVGhpcyBpcyB0aGUgZWZmb3J0IHBsYW5uZWQgZm9yIHRoZSBzaW5nbGUgd29ya29yZGVyLgoKPWhlYWQzIEM8T0ZPUktfTElOS194eHg+Cgp3aXRoIHRoZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgeHh4OgoKICAgIE9iamVjdAogICAgICAgIG90aGVyIG9iamVjdCBvZiB0aGUgbGluawogICAgU291cmNlT2JqZWN0CiAgICAgICAgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rLCB3aGVuIHRoZSBvdGhlciBvYmplY3QgaXMgdGhlIHNvdXJjZQogICAgVGFyZ2V0T2JqZWN0CiAgICAgICAgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rLCB3aGVuIHRoZSBvdGhlciBvYmplY3QgaXN0IHRoZSB0YXJnZXQKICAgIFN0YXRlCiAgICAgICAgU3RhdGUgb2YgdGhlIGxpbmsKICAgIFR5cGUKICAgICAgICBUeXBlIG9mIHRoZSBsaW5rCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBUZW1wbGF0ZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwoKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlIC0gdGVtcGxhdGUgbGliCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0LgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICBASVNBID0gKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyJywKICAgICk7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnSVRTTVRlbXBsYXRlOjpFdmVudE1vZHVsZScsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRlbXBsYXRlQWRkKCkKCkFkZCBhIG5ldyB0ZW1wbGF0ZS4KCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1RoZSB0ZW1wbGF0ZSBuYW1lJywKICAgICAgICBDb250ZW50ICAgICAgICA9PiAnW3sgQ2hhbmdlQWRkID0+IHsgLi4uIH0gfV0nLCAgICMgYSBzZXJpYWxpemVkIGNoYW5nZSwgd29ya29yZGVyLCAuLi4KICAgICAgICBDb21tZW50ICAgICAgICA9PiAnQSBjb21tZW50JywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFRlbXBsYXRlVHlwZSAgID0+ICdJVFNNQ2hhbmdlJywgICAgICAgICAgICAgICAgICAgIyBhbHRlcm5hdGl2ZWx5OiBUZW1wbGF0ZVR5cGVJRAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbHRlcm5hdGl2ZWx5OiBUZW1wbGF0ZVR5cGUKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFRlbXBsYXRlVHlwZSBhbmQgVGVtcGxhdGVUeXBlSUQgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBUZW1wbGF0ZVR5cGUgT1IgVGVtcGxhdGVUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd2hlbiB0aGUgdGVtcGxhdGUgdHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ID0gJFNlbGYtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbnRlbnQgTmFtZSBUZW1wbGF0ZVR5cGVJRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgYW5kIHR5cGUgYWxyZWFkeSBleGlzdHMKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZSBXSEVSRSBuYW1lID0gPyBBTkQgdHlwZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBhIHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGV4aXN0cyBhbHJlYWR5CiAgICBpZiAoJFRlbXBsYXRlSUQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkEgdGVtcGxhdGUgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9JyBhbmQgdGhlIHR5cGUgJyRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0nIGFscmVhZHkgZXhpc3RzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlQWRkUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdUZW1wbGF0ZUFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIG5ldyB0ZW1wbGF0ZSB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfdGVtcGxhdGUgJwogICAgICAgICAgICAuICcobmFtZSwgY29tbWVudHMsIGNvbnRlbnQsIHR5cGVfaWQsIHZhbGlkX2lkLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtDb250ZW50fSwgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfdGVtcGxhdGUgV0hFUkUgbmFtZSA9ID8gQU5EIHR5cGVfaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VGVtcGxhdGVUeXBlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRlbXBsYXRlIGNvdWxkIGJlIGFkZGVkCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlQWRkKCkgZmFpbGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVBZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBUT0RPOiBhbGwgYXR0YWNobWVudHMgaW4gdGhlIHRlbXBsYXRlIHNob3VsZCBiZSBjb3BpZWQKICAgICMgaW4gdGhlIHZpcnR1YWwgZnMuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhbgogICAgIyBhdHRhY2htZW50IGlzIGRlbGV0ZWQgYWZ0ZXIgdGVtcGxhdGUgY3JlYXRpb24gYW5kIHRoZXJlZm9yZQogICAgIyBubyBsb25nZXIgYXZhaWxhYmxlLgoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWhlYWQyIFRlbXBsYXRlVXBkYXRlKCkKClVwZGF0ZSBhIHRlbXBsYXRlLgoKICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMzQsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGhlIHRlbXBsYXRlIG5hbWUnLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDb21tZW50ICAgID0+ICdBIGNvbW1lbnQnLCAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENvbnRlbnQgID0+ICdbeyBDaGFuZ2VBZGQgPT4geyAuLi4gfSB9XScsICAgIyAob3B0aW9uYWwpIGEgc2VyaWFsaXplZCBjaGFuZ2UsIHdvcmtvcmRlciwgLi4uCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBUeXBlSUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBUZW1wbGF0ZVVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVVcGRhdGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWFwIHVwZGF0ZSBhdHRyaWJ1dGVzIHRvIGNvbHVtbiBuYW1lcwogICAgbXkgJUF0dHJpYnV0ZSA9ICgKICAgICAgICBOYW1lICAgID0+ICduYW1lJywKICAgICAgICBDb21tZW50ID0+ICdjb21tZW50cycsCiAgICAgICAgQ29udGVudCA9PiAnY29udGVudCcsCiAgICAgICAgVmFsaWRJRCA9PiAndmFsaWRfaWQnLAogICAgICAgIFR5cGVJRCAgPT4gJ3R5cGVfaWQnLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgdGVtcGxhdGUKICAgIG15ICRTUUwgPSAnVVBEQVRFIGNoYW5nZV90ZW1wbGF0ZSBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBhZGQgY2hhbmdlIHRpbWUgYW5kIGNoYW5nZSB1c2VyCiAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CgogICAgIyBzZXQgbWF0Y2hpbmcgb2YgU1FMIHN0YXRlbWVudAogICAgJFNRTCAuPSAnV0hFUkUgaWQgPSA/JzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VGVtcGxhdGVJRH07CgogICAgIyB1cGRhdGUgdGVtcGxhdGUKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlVXBkYXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVVcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZFRlbXBsYXRlRGF0YSA9PiAkVGVtcGxhdGVEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgVE9ETzogYWxsIGF0dGFjaG1lbnRzIGluIHRoZSB0ZW1wbGF0ZSBzaG91bGQgYmUgY29waWVkCiAgICAjIGluIHRoZSB2aXJ0dWFsIGZzLiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIHRoYXQgYW4KICAgICMgYXR0YWNobWVudCBpcyBkZWxldGVkIGFmdGVyIHRlbXBsYXRlIGNyZWF0aW9uIGFuZCB0aGVyZWZvcmUKICAgICMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFRlbXBsYXRlR2V0KCkKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgdGVtcGxhdGUgZGF0YSBmb3IgYSBnaXZlbiBUZW1wbGF0ZUlELgoKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9CiAgICAkVGVtcGxhdGVEYXRhe05hbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9CiAgICAkVGVtcGxhdGVEYXRhe0NvbnRlbnR9CiAgICAkVGVtcGxhdGVEYXRhe1R5cGVJRH0KICAgICRUZW1wbGF0ZURhdGF7VHlwZX0KICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fQoKPWN1dAoKc3ViIFRlbXBsYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjdC5pZCwgY3QubmFtZSwgY29tbWVudHMsIGNvbnRlbnQsIHR5cGVfaWQsIGN0dC5uYW1lLCAnCiAgICAgICAgICAgIC4gJ2N0LnZhbGlkX2lkLCBjdC5jcmVhdGVfdGltZSwgY3QuY3JlYXRlX2J5LCBjdC5jaGFuZ2VfdGltZSwgY3QuY2hhbmdlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2VfdGVtcGxhdGUgY3QsIGNoYW5nZV90ZW1wbGF0ZV90eXBlIGN0dCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGN0LnR5cGVfaWQgPSBjdHQuaWQgQU5EIGN0LmlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGVtcGxhdGVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9ID0gJFJvd1swXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe05hbWV9ICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9ICAgID0gJFJvd1syXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NvbnRlbnR9ICAgID0gJFJvd1szXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe1R5cGVJRH0gICAgID0gJFJvd1s0XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe1R5cGV9ICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1s2XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s3XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s4XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s5XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1sxMF07CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJVRlbXBsYXRlRGF0YSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlSUQgJFBhcmFte1RlbXBsYXRlSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICBUSU1FRklFTEQ6CiAgICBmb3IgbXkgJFRpbWVmaWVsZCAoICdDcmVhdGVUaW1lJywgJ0NoYW5nZVRpbWUnLCApIHsKICAgICAgICBuZXh0IFRJTUVGSUVMRCBpZiAhJFRlbXBsYXRlRGF0YXskVGltZWZpZWxkfTsKICAgICAgICAkVGVtcGxhdGVEYXRheyRUaW1lZmllbGR9CiAgICAgICAgICAgID1+IHN7IFxBICggXGRcZFxkXGQgLSBcZFxkIC0gXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCApIFwuIC4rPyBceiB9eyQxfXhtczsKICAgIH0KCiAgICByZXR1cm4gXCVUZW1wbGF0ZURhdGE7Cn0KCj1oZWFkMiBUZW1wbGF0ZUxpc3QoKQoKcmV0dXJuIGEgaGFzaHJlZiBvZiBhbGwgdGVtcGxhdGVzCgogICAgbXkgJFRlbXBsYXRlcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkICAgICAgICAgID0+IDAsICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBDb21tZW50TGVuZ3RoICA9PiAxNSwgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwCiAgICAgICAgVGVtcGxhdGVUeXBlICAgPT4gJ0lUU01DaGFuZ2UnICAgIyAob3B0aW9uYWwpIG9yIFRlbXBsYXRlVHlwZQogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+IDEsICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBUZW1wbGF0ZVR5cGVJRAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKcmV0dXJucwoKICAgICRUZW1wbGF0ZXMgPSB7CiAgICAgICAgMSA9PiAnbXkgdGVtcGxhdGUnLAogICAgICAgIDMgPT4gJ3lvdXIgdGVtcGxhdGUgbmFtZScsCiAgICB9OwoKSWYgcGFyYW1ldGVyIEM8Q29tbWVudExlbmd0aD4gaXMgcGFzc2VkLCBhbiBleGNlcnB0IChvZiB0aGUgcGFzc2VkIGxlbmd0aCkKb2YgdGhlIGNvbW1lbnQgaXMgYXBwZW5kZWQgdG8gdGhlIHRlbXBsYXRlIG5hbWUuCklmIHRoZSBwYXJhbWV0ZXIgQzxUZW1wbGF0ZVR5cGU+IG9yIEM8VGVtcGxhdGVUeXBlSUQ+IGlzIHBhc3NlZCwgdGhlbiB0aGUKbGlzdCBvZiB0ZW1wbGF0ZXMgaXMgcmVzdHJpY3RlZCB0byB0aGUgZ2l2ZW4gdHlwZS4KCj1jdXQKCnN1YiBUZW1wbGF0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgbm90IGJvdGggVGVtcGxhdGVUeXBlIGFuZCBUZW1wbGF0ZVR5cGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1RlbXBsYXRlVHlwZX0gJiYgJFBhcmFte1RlbXBsYXRlVHlwZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFRlbXBsYXRlVHlwZSBPUiBUZW1wbGF0ZVR5cGVJRCAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3aGVuIHRoZSB0ZW1wbGF0ZSB0eXBlIGlzIGdpdmVuLCB0aGVuIGxvb2sgdXAgdGhlIElECiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gPSAkU2VsZi0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJFBhcmFte1RlbXBsYXRlVHlwZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBkZWZpbmUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIGNvbW1lbnRzIEZST00gY2hhbmdlX3RlbXBsYXRlICc7CiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBAU1FMQmluZDsKCiAgICAjIHJlc3RyaWN0IGJ5IHRlbXBsYXRlIHR5cGUKICAgIGlmICggJFBhcmFte1RlbXBsYXRlVHlwZUlEfSApIHsKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgInR5cGVfaWQgPSA/IjsKICAgICAgICBwdXNoIEBTUUxCaW5kLCAgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH07CiAgICB9CgogICAgIyBnZXQgb25seSB2YWxpZCB0ZW1wbGF0ZSBpZHMKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKCiAgICAgICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICAgICAgbXkgJFZhbGlkSURTdHJpbmcgPSBqb2luICcsICcsIEBWYWxpZElEczsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJ2YWxpZF9pZCBJTiAoICRWYWxpZElEU3RyaW5nICkiOwogICAgfQoKICAgICMgYXBwZW5kIHRoZSBXSEVSRS1jbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBTUUxCaW5kLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVUZW1wbGF0ZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZXN7ICRSb3dbMF0gfSA9IFsgJFJvd1sxXSwgJFJvd1syXSBdOwogICAgfQoKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVUZW1wbGF0ZXMgKSB7CiAgICAgICAgbXkgKCAkTmFtZSwgJENvbW1lbnQgKSA9IEB7ICRUZW1wbGF0ZXN7JEtleX0gfTsKCiAgICAgICAgbXkgJENvbW1lbnRBcHBlbmQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtDb21tZW50TGVuZ3RofSAmJiAkQ29tbWVudCApIHsKICAgICAgICAgICAgbXkgJExlbmd0aCA9ICRQYXJhbXtDb21tZW50TGVuZ3RofSA+IGxlbmd0aCAkQ29tbWVudAogICAgICAgICAgICAgICAgPyBsZW5ndGggJENvbW1lbnQKICAgICAgICAgICAgICAgIDogJFBhcmFte0NvbW1lbnRMZW5ndGh9OwogICAgICAgICAgICBteSAkRWxsaXBzaXMgPSAkUGFyYW17Q29tbWVudExlbmd0aH0gPiBsZW5ndGggJENvbW1lbnQKICAgICAgICAgICAgICAgID8gJycKICAgICAgICAgICAgICAgIDogJy4uLic7CiAgICAgICAgICAgICRDb21tZW50ID0gc3Vic3RyICRDb21tZW50LCAwLCAkTGVuZ3RoOwogICAgICAgICAgICAkQ29tbWVudEFwcGVuZCA9ICcgKCcgLiAkQ29tbWVudCAuICRFbGxpcHNpcyAuICcpJzsKICAgICAgICB9CgogICAgICAgICRUZW1wbGF0ZXN7JEtleX0gPSAkTmFtZSAuICRDb21tZW50QXBwZW5kOwogICAgfQoKICAgIHJldHVybiBcJVRlbXBsYXRlczsKfQoKPWhlYWQyIFRlbXBsYXRlU2VhcmNoKCkKClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgdGVtcGxhdGUgaWRzLgpUaGUgY291bnQgb2YgcmVzdWx0cyBpcyByZXR1cm5lZCB3aGVuIHRoZSBwYXJhbWV0ZXIgQzxSZXN1bHQgPT4gJ0NPVU5UJz4gaXMgcGFzc2VkLgoKVGhlIHNlYXJjaCBjcml0ZXJpYSBhcmUgbG9naWNhbGx5IEFORCBjb25uZWN0ZWQuCldoZW4gYSBsaXN0IGlzIHBhc3NlZCBhcyBDPGNyaXRlcml1bT4sIHRoZSBpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIE9SIGNvbm5lY3RlZC4KV2hlbiBhbiB1bmRlZiBvciBhIHJlZmVyZW5jZSB0byBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIHNlYXJjaCBDPGNyaXRlcml1bT4KaXMgaWdub3JlZC4KCiAgICBteSAkVGVtcGxhdGVJRHNSZWYgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VhcmNoKAoKICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnU2FtcGxlIHRlbXBsYXRlJywgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDb21tZW50ICAgICAgICAgICA9PiAnanVzdCBhbiBleGFtcGxlJywgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgVGVtcGxhdGVUeXBlSURzICAgPT4gWyAxMSwgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVGVtcGxhdGVUeXBlcyAgICAgPT4gWyAnSVRTTUNoYW5nZScsICdDQUInIF0sICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgID0+IFsgNSwgMiwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUJ5ICAgICAgICAgID0+IFsgMywgMiwgMSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHRlbXBsYXRlcyB3aXRoIGNyZWF0ZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDcmVhdGVUaW1lTmV3ZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHRlbXBsYXRlcyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ3JlYXRlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgdGVtcGxhdGVzIHdpdGggY2hhbmdlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENoYW5nZVRpbWVOZXdlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgdGVtcGxhdGVzIHdpdGggY2hhbmdlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgT3JkZXJCeSA9PiBbICdUZW1wbGF0ZUlEJywgJ05hbWUnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ1RlbXBsYXRlSUQnIF0sCiAgICAgICAgIyAoVGVtcGxhdGVJRCwgTmFtZSwgQ29tbWVudCwgVGVtcGxhdGVUeXBlSUQsCiAgICAgICAgIyBDcmVhdGVUaW1lLCBDcmVhdGVCeSwgQ2hhbmdlVGltZSwgQ2hhbmdlQnkpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgZGVmYXVsdDogWyAnRG93bicgXQogICAgICAgICMgKERvd24gfCBVcCkKCiAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyAoMCB8IDEpIGRlZmF1bHQgMQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGRlZmF1bHQ6IEFSUkFZLCByZXR1cm5zIGFuIGFycmF5IG9mIHRlbXBsYXRlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgdGVtcGxhdGVzCgogICAgICAgIExpbWl0ID0+IDEwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCgogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB2ZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBPcmRlckJ5CiAgICAgICAgT3JkZXJCeURpcmVjdGlvbgogICAgICAgIFRlbXBsYXRlVHlwZXMKICAgICAgICBUZW1wbGF0ZVR5cGVJRHMKICAgICAgICBDcmVhdGVCeQogICAgICAgIENoYW5nZUJ5CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcmd1bWVudH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBTUUxXaGVyZTsgICAgIyBhc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UKCiAgICAjIGRlZmluZSBvcmRlciB0YWJsZQogICAgbXkgJU9yZGVyQnlUYWJsZSA9ICgKICAgICAgICBUZW1wbGF0ZUlEICAgICA9PiAndC5pZCcsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ3QubmFtZScsCiAgICAgICAgQ29tbWVudCAgICAgICAgPT4gJ3QuY29tbWVudHMnLAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+ICd0LnR5cGVfaWQnLAogICAgICAgIFZhbGlkSUQgICAgICAgID0+ICd0LnZhbGlkX2lkJywKICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAndC5jcmVhdGVfdGltZScsCiAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJ3QuY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAndC5jaGFuZ2VfdGltZScsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJ3QuY2hhbmdlX2J5JywKICAgICk7CgogICAgIyBjaGVjayBpZiBPcmRlckJ5IGNvbnRhaW5zIG9ubHkgdW5pcXVlIHZhbGlkIHZhbHVlcwogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSB8fCAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ICkgewoKICAgICAgICAgICAgIyBmb3VuZCBhbiBlcnJvcgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgIgogICAgICAgICAgICAgICAgICAgIC4gJ29yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UKICAgICAgICAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ID0gMTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJwogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBvbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUKICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gVGVtcGxhdGVUeXBlSURzIGFyZSBhbGwgdmFsaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja1RlbXBsYXRlVHlwZUlEcygKICAgICAgICBUZW1wbGF0ZVR5cGVJRHMgPT4gJFBhcmFte1RlbXBsYXRlVHlwZUlEc30sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGxvb2sgdXAgYW5kIHRodXMgY2hlY2sgdGhlIFRlbXBsYXRlVHlwZXMKICAgIGZvciBteSAkVHlwZSAoIEB7ICRQYXJhbXtUZW1wbGF0ZVR5cGVzfSB9ICkgewoKICAgICAgICAjIGdldCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgbXkgJFR5cGVJRCA9ICRTZWxmLT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAkVHlwZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkVHlwZUlEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHRlbXBsYXRlIHR5cGUgJyRUeXBlJyBpcyBub3Qga25vd24hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17VGVtcGxhdGVUeXBlSURzfSB9LCAkVHlwZUlEOwogICAgfQoKICAgICMgYWRkIHN0cmluZyBwYXJhbXMgdG8gdGhlIFdIRVJFIGNsYXVzZQogICAgbXkgJVN0cmluZ1BhcmFtcyA9ICgKICAgICAgICBOYW1lICAgID0+ICd0Lm5hbWUnLAogICAgICAgIENvbW1lbnQgPT4gJ3QuY29tbWVudHMnLAogICAgKTsKCiAgICAjIGFkZCBzdHJpbmcgcGFyYW1zIHRvIHNxbC13aGVyZS1hcnJheQogICAgU1RSSU5HUEFSQU06CiAgICBmb3IgbXkgJFN0cmluZ1BhcmFtICggc29ydCBrZXlzICVTdHJpbmdQYXJhbXMgKSB7CgogICAgICAgICMgY2hlY2sgc3RyaW5nIHBhcmFtcyBmb3IgdXNlZnVsIHZhbHVlcywgdGhlIHN0cmluZyAnMCcgaXMgYWxsb3dlZAogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWV4aXN0cyAkUGFyYW17JFN0cmluZ1BhcmFtfTsKICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICFkZWZpbmVkICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gZXEgJyc7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0gKTsKCiAgICAgICAgIyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIGdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAgICAgICAgICMgUXVvdGUKICAgICAgICAgICAgJFBhcmFteyRTdHJpbmdQYXJhbX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVvdGUoICRQYXJhbXskU3RyaW5nUGFyYW19LCAnTGlrZScgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAqIHdpdGggJQogICAgICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2Ugc3RyaW5nIHBhcmFtcyB3aGljaCBjb250YWluIG9ubHkgJQogICAgICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IG17IFxBICUqIFx6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pIExJS0UgTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgIH0KCiAgICAgICAgIyBubyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAiTE9XRVIoJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19KSA9IExPV0VSKCckUGFyYW17JFN0cmluZ1BhcmFtfScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgVGVtcGxhdGVUeXBlSURzID0+ICd0LnR5cGVfaWQnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAndC5jcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAndC5jaGFuZ2VfYnknLAogICAgKTsKCiAgICAjIGFkZCBhcnJheSBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBBUlJBWVBBUkFNOgogICAgZm9yIG15ICRBcnJheVBhcmFtICggc29ydCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgIyBpZ25vcmUgZW1wdHkgbGlzdHMKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZSBhcyBpbnRlZ2VyCiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfSApIHsKICAgICAgICAgICAgJE9uZVBhcmFtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkT25lUGFyYW0sICdJbnRlZ2VyJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyRBcnJheVBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBjaGVjayB0aGUgdGltZSBwYXJhbXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBXSEVSRSBjbGF1c2Ugb2YgdGhlIFNFTEVDVC1TdGF0ZW1lbnQKICAgIG15ICVUaW1lUGFyYW1zID0gKAogICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJ3QuY3JlYXRlX3RpbWUgPj0nLAogICAgICAgIENyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJ3QuY3JlYXRlX3RpbWUgPD0nLAogICAgICAgIENoYW5nZVRpbWVOZXdlckRhdGUgPT4gJ3QuY2hhbmdlX3RpbWUgPj0nLAogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgPT4gJ3QuY2hhbmdlX3RpbWUgPD0nLAogICAgKTsKICAgIFRJTUVQQVJBTToKICAgIGZvciBteSAkVGltZVBhcmFtICggc29ydCBrZXlzICVUaW1lUGFyYW1zICkgewoKICAgICAgICBuZXh0IFRJTUVQQVJBTSBpZiAhJFBhcmFteyRUaW1lUGFyYW19OwoKICAgICAgICBpZiAoICRQYXJhbXskVGltZVBhcmFtfSAhfiBteyBcQSBcZFxkXGRcZC1cZFxkLVxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgXHogfXhtcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJFRpbWVQYXJhbSBoYXMgYW4gaW52YWxpZCBkYXRlIGZvcm1hdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFteyRUaW1lUGFyYW19ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkUGFyYW17JFRpbWVQYXJhbX0gKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3skVGltZVBhcmFtfSAnJFBhcmFteyRUaW1lUGFyYW19JyI7CiAgICB9CgogICAgIyBkZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRQYXJhbXtPcmRlckJ5fSA9IFtdOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgbXkgQFNRTE9yZGVyQnk7CiAgICBteSAkQ291bnQgPSAwOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgICMgc2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbgogICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICMgYWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24KICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBTUUwKICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CiAgICB9CiAgICBjb250aW51ZSB7CiAgICAgICAgJENvdW50Kys7CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAjIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkCiAgICBpZiAoICFncmVwIHsgJF8gZXEgJ1RlbXBsYXRlSUQnIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxle1RlbXBsYXRlSUR9IERFU0MiOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgdC5pZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZSB0ICc7CgogICAgIyBtb2RpZnkgU1FMIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAjIFRoZXJlIGlzIG5vICdHUk9VUCBCWScgU1FMLWNsYXVzZSwgdGhlcmVmb3JlIENPVU5UKGMuaWQpIGFsd2F5cyBnaXZlIHRoZSB3YW50ZWQgY291bnQKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgICAgICAgID0gJ1NFTEVDVCBDT1VOVCh0LmlkKSBGUk9NIGNoYW5nZV90ZW1wbGF0ZSB0ICc7CiAgICAgICAgQFNRTE9yZGVyQnkgPSAoKTsKICAgIH0KCiAgICAjIGFkZCB0aGUgV0hFUkUgY2xhdXNlCiAgICBpZiAoQFNRTFdoZXJlKSB7CiAgICAgICAgJFNRTCAuPSAnV0hFUkUgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgICMgYWRkIHRoZSBPUkRFUiBCWSBjbGF1c2UKICAgIGlmIChAU1FMT3JkZXJCeSkgewogICAgICAgICRTUUwgLj0gJ09SREVSIEJZICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcsICcsIEBTUUxPcmRlckJ5OwogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgICMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRQYXJhbXtMaW1pdH0gPSAxOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyByZXR1cm4gdGhlIGNvdW50IGFzIHNjYWxhcgogICAgcmV0dXJuICRJRHNbMF0gaWYgJFJlc3VsdCBlcSAnQ09VTlQnOwoKICAgIHJldHVybiBcQElEczsKfQoKPWhlYWQyIFRlbXBsYXRlRGVsZXRlKCkKCkRlbGV0ZSBhIHRlbXBsYXRlLgoKICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlRGVsZXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdUZW1wbGF0ZURlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgdGVtcGxhdGUgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX3RlbXBsYXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlRGVsZXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVEZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZFRlbXBsYXRlRGF0YSA9PiAkVGVtcGxhdGVEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGVtcGxhdGVUeXBlTG9va3VwKCkKClJldHVybiB0aGUgdGVtcGxhdGUgdHlwZSBpZCB3aGVuIHRoZSB0ZW1wbGF0ZSB0eXBlIG5hbWUgaXMgcGFzc2VkLgpSZXR1cm4gdGhlIHRlbXBsYXRlIHR5cGUgbmFtZSB3aGVuIHRoZSB0ZW1wbGF0ZSB0eXBlIGlkIGlzIHBhc3NlZC4KV2hlbiBubyB0ZW1wbGF0ZSB0eXBlIGlkIG9yIHRlbXBsYXRlIHR5cGUgbmFtZSBpcyBmb3VuZCwgdGhlbiB0aGUKdW5kZWZpbmVkIHZhbHVlIGlzIHJldHVybmVkLgoKICAgIG15ICRUeXBlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ215IHRlbXBsYXRlIHR5cGUgbmFtZScsCiAgICApOwoKICAgIG15ICRUeHBlTmFtZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+IDQyLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVR5cGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRoZSB0ZW1wbGF0ZSB0eXBlIGlkIG9yIHRoZSB0ZW1wbGF0ZSB0eXBlIG5hbWUgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gJiYgISRQYXJhbXtUZW1wbGF0ZVR5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB0aGUgVGVtcGxhdGVUeXBlSUQgb3IgdGhlIFRlbXBsYXRlVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBvbmUgb2YgdGVtcGxhdGUgaWQgYW5kIHRlbXBsYXRlIG5hbWUgY2FuIGJlIHBhc3NlZAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgdGhlIFRlbXBsYXRlVHlwZSBvciB0aGUgVGVtcGxhdGVUZW1wbGF0ZUlELCBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHR5cGUgaWQKICAgIGlmICggJFBhcmFte1RlbXBsYXRlVHlwZX0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZV90eXBlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlVHlwZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZUlEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRUeXBlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRUeXBlSUQ7CiAgICB9CgogICAgIyBnZXQgdHlwZSBuYW1lCiAgICBlbHNpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGNoYW5nZV90ZW1wbGF0ZV90eXBlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZU5hbWU7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFR5cGVOYW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkVHlwZU5hbWU7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgVGVtcGxhdGVTZXJpYWxpemUoKQoKVGhpcyBtZXRob2QgaXMgaW4gZmFjdCBhIGRpc3BhdGNoZXIgZm9yIGRpZmZlcmVudCB0ZW1wbGF0ZSB0eXBlcy4KQ3VycmVudGx5IElUU01DaGFuZ2VNYW5hZ2VtZW50IHN1cHBvcnRzIHRoZXNlIHRlbXBsYXRlIHR5cGVzOgoKSVRTTUNoYW5nZQpJVFNNV29ya09yZGVyCkNBQgpJVFNNQ29uZGl0aW9uCgpUaGUgbWV0aG9kIHJldHVybnMgYSBkYXRhIHN0cnVjdHVyZSwgc2VyaWFsaXplZCB3aXRoIERhdGE6OkR1bXBlci4KCiAgICBteSAkQ2hhbmdlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU3RhdGVSZXNldCAgID0+IDEsICMgKG9wdGlvbmFsKSByZXNldCB0byBkZWZhdWx0IHN0YXRlCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCgogICAgICAgICMgb3RoZXIgb3B0aW9ucyBuZWVkZWQgZGVwZW5kaW5nIG9uIHRoZSB0ZW1wbGF0ZSB0eXBlCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0aGUgdGVtcGxhdGUgdHlwZSBpZCBvciB0aGUgdGVtcGxhdGUgdHlwZSBuYW1lIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17VGVtcGxhdGVUeXBlSUR9ICYmICEkUGFyYW17VGVtcGxhdGVUeXBlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdGhlIFRlbXBsYXRlVHlwZUlEIG9yIHRoZSBUZW1wbGF0ZVR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9ubHkgb25lIG9mIHRlbXBsYXRlIHR5cGUgbmFtZSBhbmQgdGVtcGxhdGUgdHlwZSBpZCBjYW4gYmUgcGFzc2VkCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciB0aGUgVGVtcGxhdGVUeXBlSUQgb3IgdGhlIFRlbXBsYXRlVHlwZSwgbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkVGVtcGxhdGVUeXBlID0gJFBhcmFte1RlbXBsYXRlVHlwZX07CiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgJFRlbXBsYXRlVHlwZSA9ICRTZWxmLT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZUlEID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHdoYXQgdHlwZXMgb2YgdGVtcGxhdGVzIGFyZSBzdXBwb3J0ZWQgYW5kIHdoYXQgc3Vicm91dGluZXMgZG8gdGhlIHNlcmlhbGl6YXRpb24KICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6JyAuICRUZW1wbGF0ZVR5cGUgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgIG15ICRTZXJpYWxpemVkRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5TZXJpYWxpemUoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFNlcmlhbGl6ZWREYXRhOwp9Cgo9aGVhZDIgVGVtcGxhdGVEZVNlcmlhbGl6ZSgpCgpUaGlzIG1ldGhvZCBkZXNlcmlhbGl6ZXMgdGhlIHRlbXBsYXRlIGNvbnRlbnQuIEl0IHJldHVybnMgdGhlCklEIG9mIHRoZSAibWFpbiIgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZS4KCiAgICBteSAkRWxlbWVudElEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVEZVNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgVGVtcGxhdGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUKICAgIG15ICRUZW1wbGF0ZSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFRlbXBsYXRlOwoKICAgICMgZ2V0IHRoZSBQZXJsIGRhdGFzdHJ1Y3R1cmUKICAgIG15ICRUZW1wbGF0ZUNvbnRlbnQgPSAkVGVtcGxhdGUtPntDb250ZW50fTsKICAgIG15ICRWQVIxOwoKICAgIHJldHVybiBpZiAhZXZhbCAiXCRWQVIxID0gJFRlbXBsYXRlQ29udGVudDsgMTsiOyAgICAjIyBubyBjcml0aWMKCiAgICByZXR1cm4gaWYgISRWQVIxOwogICAgcmV0dXJuIGlmIHJlZiAkVkFSMSBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgZW50aXRpZXMgZGVmaW5lZCBieSB0aGUgdGVtcGxhdGUKICAgIG15ICVJbmZvID0gJFNlbGYtPl9DcmVhdGVUZW1wbGF0ZUVsZW1lbnRzKAogICAgICAgICVQYXJhbSwKICAgICAgICBUZW1wbGF0ZSA9PiAkVkFSMSwKICAgICk7CgogICAgcmV0dXJuICRJbmZve0lEfTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX0NyZWF0ZVRlbXBsYXRlRWxlbWVudHMoKQoKVGhpcyBtZXRob2QgZGlzcGF0Y2hlcyB0aGUgZWxlbWVudHMgY3JlYXRpb24uIEl0IGNhbGxzIHRoZSBzdWJyb3V0aW5lCnRoYXQgYmVsb25ncyB0byB0aGUgZ2l2ZW4gdHlwZSAoZS5nLiBDaGFuZ2VBZGQpLiBBZnRlciB0aGF0IGl0Cmludm9rZXMgaXRzZWxmIGZvciBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBtYWluIGVsZW1lbnQuCgpUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCBvZiB0aGUgbWFpbiBlbGVtZW50LgoKICAgIG15ICRFbGVtZW50SUQgPSAkVGVtcGxhdGVPYmplY3QtPl9DcmVhdGVUZW1wbGF0ZUVsZW1lbnRzKAogICAgICAgIFRlbXBsYXRlID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgIENoaWxkcmVuICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7IC4uLiB9LAogICAgICAgICAgICAgICAgICAgIENoaWxkcmVuICAgICA9PiBbIC4uLiBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAoKICAgICAgICAjIGFueSBvdGhlciBwYXJhbWV0ZXJzIGNhbiBmb2xsb3cKICAgICkKCj1jdXQKCnN1YiBfQ3JlYXRlVGVtcGxhdGVFbGVtZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hpbGRyZW4KICAgIG15ICRDaGlsZHJlbiA9IGRlbGV0ZSAkUGFyYW17VGVtcGxhdGV9LT57Q2hpbGRyZW59OwogICAgJENoaWxkcmVuIHx8PSBbXTsKCiAgICAjIGRpc3BhdGNoIHRhYmxlCiAgICBteSAlTWV0aG9kMk9iamVjdCA9ICgKICAgICAgICBDaGFuZ2VBZGQgICAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBXb3JrT3JkZXJBZGQgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBDQUJBZGQgICAgICAgID0+ICdDQUInLAogICAgICAgIENvbmRpdGlvbkFkZCAgPT4gJ0lUU01Db25kaXRpb24nLAogICAgICAgIEF0dGFjaG1lbnRBZGQgPT4gJ1BhcmVudCcsCiAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiAnUGFyZW50JywKICAgICAgICBBY3Rpb25BZGQgICAgID0+ICdQYXJlbnQnLAogICAgICAgIExpbmtBZGQgICAgICAgPT4gJ1BhcmVudCcsCiAgICApOwoKICAgICMgZ2V0IGFjdGlvbgogICAgbXkgKCAkTWV0aG9kLCAkRGF0YSApID0gZWFjaCAleyAkUGFyYW17VGVtcGxhdGV9IH07CiAgICBteSAkVHlwZSA9ICRNZXRob2QyT2JqZWN0eyRNZXRob2R9OwogICAgbXkgJEJhY2tlbmRPYmplY3Q7CiAgICBpZiAoICRUeXBlIGVxICdQYXJlbnQnICkgewogICAgICAgICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6JyAuICRQYXJhbXtQYXJlbnR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OicgLiAkVHlwZSApOwogICAgfQoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBjcmVhdGUgcGFyZW50IGVsZW1lbnQKICAgIG15ICVQYXJlbnRSZXR1cm4gPSAkQmFja2VuZE9iamVjdC0+RGVTZXJpYWxpemUoCiAgICAgICAgJVBhcmFtLAogICAgICAgIERhdGEgICA9PiAkRGF0YSwKICAgICAgICBUeXBlICAgPT4gJFR5cGUsCiAgICAgICAgTWV0aG9kID0+ICRNZXRob2QsCiAgICApOwoKICAgIHJldHVybiBpZiAhJVBhcmVudFJldHVybjsKCiAgICBteSAlU2libGluZ3NJbmZvOwoKICAgICMgY3JlYXRlIGNoaWxkIGVsZW1lbnRzCiAgICAjIHByZXZlbnQgbmV3IG51bWJlciBjYWxjdWxhdGlvbiBmb3Igd29ya29yZGVycywKICAgICMgYXMgdGhlIG9yaWdpbmFsIG51bWJlciB3aWxsIGJlIHVzZWQKICAgIGZvciBteSAkQ2hpbGQgKCBAeyRDaGlsZHJlbn0gKSB7CiAgICAgICAgbXkgJUNoaWxkSW5mbyA9ICRTZWxmLT5fQ3JlYXRlVGVtcGxhdGVFbGVtZW50cygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlU2libGluZ3NJbmZvLAogICAgICAgICAgICAlUGFyZW50UmV0dXJuLAogICAgICAgICAgICBUZW1wbGF0ZSAgICAgPT4gJENoaWxkLAogICAgICAgICAgICBQYXJlbnQgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgIE1ldGhvZCAgICAgICA9PiAkTWV0aG9kLAogICAgICAgICAgICBOb051bWJlckNhbGMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgaW5mbyBmb3IgbmV4dCBzaWJsaW5nCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUNoaWxkSW5mbyApIHsKICAgICAgICAgICAgJFNpYmxpbmdzSW5mb3skS2V5fSA9ICRDaGlsZEluZm97JEtleX07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlUGFyZW50UmV0dXJuOwp9Cgo9aGVhZDIgX0NoZWNrVGVtcGxhdGVUeXBlSURzKCkKCmNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHRlbXBsYXRlIHR5cGUgaWRzIGFyZSBhbGwgdmFsaWQKCiAgICBteSAkT2sgPSAkVGVtcGxhdGVPYmplY3QtPl9DaGVja1RlbXBsYXRlVHlwZUlEcygKICAgICAgICBUZW1wbGF0ZVR5cGVJRHMgPT4gWyAyLCA1MDAgXSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NoZWNrVGVtcGxhdGVUeXBlSURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlVHlwZUlEcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gVGVtcGxhdGVUeXBlSURzIG11c3QgYmUgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgVGVtcGxhdGVUeXBlSURzIGNhbiBiZSBsb29rZWQgdXAKICAgIGZvciBteSAkVHlwZUlEICggQHsgJFBhcmFte1RlbXBsYXRlVHlwZUlEc30gfSApIHsKICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZUlEID0+ICRUeXBlSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFR5cGUgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgdHlwZSBpZCAkVHlwZUlEIGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Db25kaXRpb24ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ29uZGl0aW9uLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgY2hhbmdlIGlkCiAgICBteSAkQ2hhbmdlSUQ7CgogICAgIyB0byBzdG9yZSB0aGUgb2JqZWN0IHdlcmUgdGhlIGRhdGEgY29tZXMgZnJvbQogICAgbXkgJE9iamVjdDsKCiAgICAjIGhhbmRsZSBjaGFuZ2UgZXZlbnRzCiAgICBpZiAoICRQYXJhbXtFdmVudH0gPX4gbXsgXEEgQ2hhbmdlIH14bXMgKSB7CgogICAgICAgICMgc2V0IHRoZSBjaGFuZ2UgaWQKICAgICAgICAkQ2hhbmdlSUQgPSAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH07CgogICAgICAgICMgc2V0IHRoZSBvYmplY3QKICAgICAgICAkT2JqZWN0ID0gJ0lUU01DaGFuZ2UnOwogICAgfQoKICAgICMgaGFuZGxlIHdvcmtvcmRlciBldmVudHMKICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSA9fiBteyBcQSBXb3JrT3JkZXIgfXhtcyApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgY2hhbmdlIGlkIGZyb20gd29ya29yZGVyIGRhdGEKICAgICAgICAkQ2hhbmdlSUQgPSAkV29ya09yZGVyLT57Q2hhbmdlSUR9OwoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0CiAgICAgICAgJE9iamVjdCA9ICdJVFNNV29ya09yZGVyJzsKICAgIH0KCiAgICAjIHNob3cgZXJyb3IgZm9yIHVua25vd24gZXZlbnRzCiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3QgaGFuZGxlIGV2ZW50ICckUGFyYW17RXZlbnR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW4gY2FzZSBvZiBhbiB1cGRhdGUgZXZlbnQgb3IgYSB0aW1lIHJlYWNoZWQgZXZlbnQsIHN0b3JlIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZXMKICAgIG15IEBBdHRyaWJ1dGVzQ2hhbmdlZDsKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfTsKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgYXZvaWQgcmVjdXJzaW9uCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdPbGRDaGFuZ2VEYXRhJzsKCiAgICAgICAgICAgICMgd2UgZG8gbm90IHRyYWNrIHRoZSB1c2VyIGlkIGFuZCAicGxhaW4iIGNvbHVtbnMKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ1VzZXJJRCc7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdKdXN0aWZpY2F0aW9uUGxhaW4nOwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnRGVzY3JpcHRpb25QbGFpbic7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZEhhc0NoYW5nZWQ7CgogICAgICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzQ2hhbmdlZCwgJEZpZWxkOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSBlcSAnV29ya09yZGVyVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRXb3JrT3JkZXJEYXRhfTsKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgYXZvaWQgcmVjdXJzaW9uCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdPbGRXb3JrT3JkZXJEYXRhJzsKCiAgICAgICAgICAgICMgd2UgZG8gbm90IHRyYWNrIHRoZSB1c2VyIGlkIGFuZCAicGxhaW4iIGNvbHVtbnMKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ1VzZXJJRCc7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdSZXBvcnRQbGFpbic7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdJbnN0cnVjdGlvblBsYWluJzsKCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgYWNjb3VudGVkIHRpbWUKICAgICAgICAgICAgaWYgKCAkRmllbGQgZXEgJ0FjY291bnRlZFRpbWUnICkgewoKICAgICAgICAgICAgICAgICMgd2UgZG8gbm90IHRyYWNrIGlmIGFjY291bnRlZCB0aW1lIHdhcyBlbXB0eSBvciB6ZXJvCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkUGFyYW17RGF0YX0tPntBY2NvdW50ZWRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlc0NoYW5nZWQsICRGaWVsZDsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZEhhc0NoYW5nZWQ7CgogICAgICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzQ2hhbmdlZCwgJEZpZWxkOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFsbCBraW5kIG9mIGNoYW5nZSBhbmQgd29ya29yZGVyIHRpbWUgcmVhY2hlZCBldmVudHMKICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSA9fiBteyBcQSAoPzogQ2hhbmdlIHwgV29ya09yZGVyICkgKCAuKyBUaW1lICkgUmVhY2hlZFBvc3QgXHogfXhtcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIHJlYWNoZWQgdGltZSBmaWVsZAogICAgICAgIG15ICRGaWVsZCA9ICQxOwoKICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXNDaGFuZ2VkLCAkRmllbGQ7CiAgICB9CgogICAgIyBtYXRjaCBhbGwgY29uZGl0aW9ucyBmb3IgdGhpcyBjaGFuZ2UgYW5kIGV4ZWN1dGUgYWxsIGFjdGlvbnMKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+Q29uZGl0aW9uTWF0Y2hFeGVjdXRlQWxsKAogICAgICAgIENoYW5nZUlEICAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7ICRPYmplY3QgPT4gXEBBdHRyaWJ1dGVzQ2hhbmdlZCB9LAogICAgICAgIEV2ZW50ICAgICAgICAgICAgID0+ICRQYXJhbXtFdmVudH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3JzCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbk1hdGNoRXhlY3V0ZUFsbCBjb3VsZCBub3QgYmUgIgogICAgICAgICAgICAgICAgLiAiZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBldmVudCAnJFBhcmFte0V2ZW50fScgb24gQ2hhbmdlSUQgJyRDaGFuZ2VJRCchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX0hhc0ZpZWxkQ2hhbmdlZCgpCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIGZpZWxkIHdhcyBjaGFuZ2VkIG9yIG5vdC4gSXQgcmV0dXJucyAxIHdoZW4gZmllbGQKd2FzIGNoYW5nZWQsIDAgb3RoZXJ3aXNlCgogICAgbXkgJEZpZWxkSGFzQ2hhbmdlZCA9ICRDb25kaXRpb25PYmplY3QtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgT2xkID0+ICdvbGQgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgICAgIE5ldyA9PiAnbmV3IHZhbHVlJywgIyBjYW4gYmUgYXJyYXkgcmVmZXJlbmNlIG9yIGhhc2ggcmVmZXJlbmNlIGFzIHdlbGwKICAgICk7Cgo9Y3V0CgpzdWIgX0hhc0ZpZWxkQ2hhbmdlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZmllbGQgaGFzIGNoYW5nZWQgd2hlbiBlaXRoZXIgJ25ldycgb3IgJ29sZCBpcyBub3Qgc2V0CiAgICByZXR1cm4gMSBpZiAhKCAkUGFyYW17TmV3fSAmJiAkUGFyYW17T2xkfSApICYmICggJFBhcmFte05ld30gfHwgJFBhcmFte09sZH0gKTsKCiAgICAjIGZpZWxkIGhhcyBub3QgY2hhbmdlZCB3aGVuIGJvdGggdmFsdWVzIGFyZSBlbXB0eQogICAgcmV0dXJuIGlmICEkUGFyYW17TmV3fSAmJiAhJFBhcmFte09sZH07CgogICAgIyByZXR1cm4gcmVzdWx0IG9mICdlcScgd2hlbiBib3RoIHBhcmFtcyBhcmUgc2NhbGFycwogICAgcmV0dXJuICRQYXJhbXtOZXd9IG5lICRQYXJhbXtPbGR9IGlmICFyZWYoICRQYXJhbXtOZXd9ICkgJiYgIXJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGEgZmllbGQgaGFzIGNoYW5nZWQgd2hlbiAncmVmJyBpcyBkaWZmZXJlbnQKICAgIHJldHVybiAxIGlmIHJlZiggJFBhcmFte05ld30gKSBuZSByZWYoICRQYXJhbXtPbGR9ICk7CgogICAgIyBjaGVjayBoYXNoZXMKICAgIGlmICggcmVmICRQYXJhbXtOZXd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIG51bWJlciBvZiBrZXlzIGFyZSBkaWZmZXJlbnQKICAgICAgICByZXR1cm4gMSBpZiBzY2FsYXIga2V5cyAleyAkUGFyYW17TmV3fSB9ICE9IHNjYWxhciBrZXlzICV7ICRQYXJhbXtPbGR9IH07CgogICAgICAgICMgY2hlY2sgdGhlIHZhbHVlcyBmb3IgZWFjaCBrZXkKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17TmV3fSB9ICkgewogICAgICAgICAgICByZXR1cm4gMSBpZiAkUGFyYW17TmV3fS0+eyRLZXl9IG5lICRQYXJhbXtPbGR9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgYXJyYXlzCiAgICBpZiAoIHJlZiAkUGFyYW17TmV3fSBlcSAnQVJSQVknICkgewoKICAgICAgICAjIGNoYW5nZWQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZGlmZmVyCiAgICAgICAgcmV0dXJuIDEgaWYgc2NhbGFyIEB7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIEB7ICRQYXJhbXtPbGR9IH07CgogICAgICAgICMgY2hlY2sgZWFjaCBlbGVtZW50CiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCN7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT5bJEluZGV4XSBuZSAkUGFyYW17T2xkfS0+WyRJbmRleF07CiAgICAgICAgfQogICAgfQoKICAgICMgZmllbGQgaGFzIG5vdCBiZWVuIGNoYW5nZWQKICAgIHJldHVybiAwOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Db25kaXRpb25EZWxldGUucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ29uZGl0aW9uRGVsZXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBkZWxldGlvbiBvZiBhIGNoYW5nZQogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdDaGFuZ2VEZWxldGVQb3N0JyApIHsKCiAgICAgICAgIyBkZWxldGUgYWxsIGNvbmRpdGlvbnMgKGFuZCBleHByZXNzaW9ucyBhbmQgYWN0aW9ucykgZm9yIHRoaXMgY2hhbmdlIGlkCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5Db25kaXRpb25EZWxldGVBbGwoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBoYW5kbGUgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbkRlbGV0ZUFsbCgpIGZhaWxlZCBmb3IgQ2hhbmdlSUQgJyRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSchIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGVycm9yCiAgICBlbHNlIHsKCiAgICAgICAgIyBhbiB1bmtub3duIGV2ZW50CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW17RXZlbnR9IGlzIGFuIHVua25vd24gZXZlbnQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9IaXN0b3J5QWRkLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEhpc3RvcnlBZGQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBldmVudCwgYmVjYXVzZSB3ZSBuZWVkIHRoaXMgdW5tb2RpZmllZCBpbiBsYXRlciBldmVudCBtb2R1bGVzCiAgICBteSAkRXZlbnQgPSAkUGFyYW17RXZlbnR9OwoKICAgICMgaW4gaGlzdG9yeSBldmVudCBoYW5kbGluZyB3ZSB1c2UgRXZlbnQgbmFtZSB3aXRob3V0IHRoZSB0cmFpbGluZyAnUG9zdCcKICAgICRFdmVudCA9fiBzeyBQb3N0IFx6IH17fXhtczsKCiAgICAjIGRpc3Rpbmd1aXNoIGJldHdlZW4gQ2hhbmdlIGFuZCBXb3JrT3JkZXIgZXZlbnRzLCBiYXNlZCBvbiBuYW1pbmcgY29udmVudGlvbgogICAgbXkgKCRUeXBlKSA9ICRFdmVudCA9fiBteyBcQSAoIENoYW5nZSB8IFdvcmtPcmRlciB8IENvbmRpdGlvbiB8IEV4cHJlc3Npb24gfCBBY3Rpb24gKSB9eG1zOwogICAgaWYgKCAhJFR5cGUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSBmb3IgdGhlIGV2ZW50ICckRXZlbnQnISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHN0b3JlIGFsbCBoaXN0b3J5IGFkZCBkYXRhCiAgICBteSBASGlzdG9yeUFkZERhdGE7CgogICAgIyBkbyBoaXN0b3J5IHN0dWZmCiAgICBpZiAoICRFdmVudCBlcSAnQ2hhbmdlQWRkJyB8fCAkRXZlbnQgZXEgJ1dvcmtPcmRlckFkZCcgKSB7CgogICAgICAgICMgdGVsbCBoaXN0b3J5IHRoYXQgYSBjaGFuZ2Ugd2FzIGFkZGVkCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57ICRUeXBlIC4gJ0lEJyB9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwogICAgfQoKICAgIGVsc2lmICggJEV2ZW50IGVxICdDaGFuZ2VVcGRhdGUnIHx8ICRFdmVudCBlcSAnV29ya09yZGVyVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEsIGVpdGhlciBmcm9tIGNoYW5nZSBvciB3b3Jrb3JkZXIKICAgICAgICBteSAkT2xkRGF0YSAgPSAkUGFyYW17RGF0YX0tPnsiT2xkJHtUeXBlfURhdGEifTsKICAgICAgICBteSAkQ2hhbmdlSUQgPSAkT2xkRGF0YS0+e0NoYW5nZUlEfTsgICAgICAgICAgICAgICAjIHdvcmtzIGZvciBjaGFuZ2UgYW5kIHdvcmtvcmRlciBldmVudHMKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHRyYWNrIHNwZWNpYWwgZmllbGRzICdPbGRDaGFuZ2VEYXRhJyBvciAnT2xkV29ya09yZGVyRGF0YScKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgIk9sZCR7VHlwZX1EYXRhIjsKCiAgICAgICAgICAgICMgd2UgZG8gbm90IHRyYWNrIHRoZSB1c2VyIGlkCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdVc2VySUQnOwoKICAgICAgICAgICAgIyB3ZSBkbyBub3QgdHJhY2sgdGhlICJwbGFpbiIgY29sdW1ucywgb25seSB0aGUgbm9uLXBsYWluIGNvbHVtbnMKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0p1c3RpZmljYXRpb25QbGFpbic7ICAgICMgY2hhbmdlCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdEZXNjcmlwdGlvblBsYWluJzsgICAgICAjIGNoYW5nZQogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnUmVwb3J0UGxhaW4nOyAgICAgICAgICAgIyB3b3Jrb3JkZXIKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0luc3RydWN0aW9uUGxhaW4nOyAgICAgICMgd29ya29yZGVyCgogICAgICAgICAgICAjIHdlIGRvIG5vIHdhbnQgdG8gdHJhY2sgdGhlIGludGVybmFsIGZpZWxkICJOb051bWJlckNhbGMiCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdOb051bWJlckNhbGMnOyAgICAgICAgICAjIHdvcmtvcmRlcgoKICAgICAgICAgICAgIyBUaGUgaGlzdG9yeSBvZiBDQUIgdXBkYXRlcyBpcyBub3QgdHJhY2tlZCBoZXJlLAogICAgICAgICAgICAjIGJ1dCBpbiB0aGUgaGFuZGxlciBmb3IgQ2hhbmdlQ0FCVXBkYXRlLgogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnQ0FCQWdlbnRzJzsgICAgICAgIyBjaGFuZ2UKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0NBQkN1c3RvbWVycyc7ICAgICMgY2hhbmdlCgogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFjY291bnRlZCB0aW1lCiAgICAgICAgICAgIGlmICggJFR5cGUgZXEgJ1dvcmtPcmRlcicgJiYgJEZpZWxkIGVxICdBY2NvdW50ZWRUaW1lJyApIHsKCiAgICAgICAgICAgICAgICAjIHdlIGRvIG5vdCB0cmFjayBpZiBhY2NvdW50ZWQgdGltZSB3YXMgZW1wdHkKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRGaWVsZH07CgogICAgICAgICAgICAgICAgIyBpZiBhY2NvdW50ZWQgdGltZSBpcyBub3QgZW1wdHksIHdlIGFsd2F5cyB0cmFjayB0aGUgaGlzdG9yeQoKICAgICAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICBteSAkV29ya09yZGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzYXZlIGhpc3RvcnkgaWYgYWNjb3VudGVkIHRpbWUgaGFzIGNoYW5nZWQKICAgICAgICAgICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgRmllbGRuYW1lICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRXb3JrT3JkZXItPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JEZpZWxkfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRGaWVsZH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgaGlzdG9yeSBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBpZiAoJEZpZWxkSGFzQ2hhbmdlZCkgewoKICAgICAgICAgICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgRmllbGRuYW1lICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+eyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgQ29udGVudE9sZCAgPT4gJE9sZERhdGEtPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBlbHNpZiAoICRFdmVudCBlcSAnV29ya09yZGVyRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZFdvcmtPcmRlckRhdGF9OwoKICAgICAgICAjIGdldCBleGlzdGluZyBoaXN0b3J5IGVudHJpZXMgZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgbXkgJEhpc3RvcnlFbnRyaWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+V29ya09yZGVySGlzdG9yeUdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJE9sZERhdGEtPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIGhpc3RvcnkgZW50cmllczogZGVsZXRlIHdvcmtvcmRlciBpZAogICAgICAgIEhJU1RPUllFTlRSWToKICAgICAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoIEB7JEhpc3RvcnlFbnRyaWVzfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+SGlzdG9yeVVwZGF0ZSgKICAgICAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRIaXN0b3J5RW50cnktPntIaXN0b3J5RW50cnlJRH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaGlzdG9yeSBlbnRyeSBmb3IgV29ya09yZGVyIGRlbGV0aW9uCiAgICAgICAgIyBjYWxsIEhpc3RvcnlBZGQgZGlyZWN0bHkgZnJvbSBoZXJlIGluc3RlYWQgb2YgdXNpbmcgdGhlIEBIaXN0b3J5QWRkRGF0YQogICAgICAgICMgYXMgd2Ugd2FudCB0aGlzIHRvIGFwcGVhciBuZXh0IHRvIHRoZSBsaW5lIGluIGhpc3RvcnkgdGhhdCBIaXN0b3J5VXBkYXRlCiAgICAgICAgIyBqdXN0IGFkZGVkIGluIHRoZSBjb2RlIGJsb2NrIGJlZm9yZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJE9sZERhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJE9sZERhdGEtPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgQ2hhbmdlQ0FCIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0NoYW5nZUNBQlVwZGF0ZScgfHwgJEV2ZW50IGVxICdDaGFuZ2VDQUJEZWxldGUnICkgewoKICAgICAgICAjIGdldCBvbGQgZGF0YQogICAgICAgIG15ICRPbGREYXRhID0gJFBhcmFte0RhdGF9LT57T2xkQ2hhbmdlQ0FCRGF0YX07CgogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KENBQkFnZW50cyBDQUJDdXN0b21lcnMpKSB7CgogICAgICAgICAgICAjIHdlIGRvIG5vdCB0cmFjayB3aGVuIHRoZSBwYXJhbSBoYXMgbm90IGJlZW4gcGFzc2VkCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRGaWVsZH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2F2ZSBoaXN0b3J5IGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIGlmICgkRmllbGRIYXNDaGFuZ2VkKSB7CgogICAgICAgICAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiBqb2luKCAnJSUnLCBAeyAkUGFyYW17RGF0YX0tPnskRmllbGR9IH0gKSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50T2xkICA9PiBqb2luKCAnJSUnLCBAeyAkT2xkRGF0YS0+eyRGaWVsZH0gfSApLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBsaW5rIGV2ZW50cwogICAgZWxzaWYgKAogICAgICAgICRFdmVudCBlcSAnQ2hhbmdlTGlua0FkZCcKICAgICAgICB8fCAkRXZlbnQgZXEgJ0NoYW5nZUxpbmtEZWxldGUnCiAgICAgICAgfHwgJEV2ZW50IGVxICdXb3JrT3JkZXJMaW5rQWRkJwogICAgICAgIHx8ICRFdmVudCBlcSAnV29ya09yZGVyTGlua0RlbGV0ZScKICAgICAgICApCiAgICB7CgogICAgICAgICMgZm9yICB3b3Jrb3JkZXIgbGlua3MgZ2V0IHRoZSBjaGFuZ2UgaWQKICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSApIHsKICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9ID0gJFdvcmtPcmRlci0+e0NoYW5nZUlEfTsKICAgICAgICB9CgogICAgICAgIG15ICRDb250ZW50TmV3ID0gam9pbiAnJSUnLAogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntTb3VyY2VPYmplY3R9IHx8ICRQYXJhbXtEYXRhfS0+e1RhcmdldE9iamVjdH0sCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1NvdXJjZUtleX0gfHwgJFBhcmFte0RhdGF9LT57VGFyZ2V0S2V5fTsKCiAgICAgICAgIyB0ZWxsIGhpc3RvcnkgdGhhdCBhIGxpbmsgd2FzIGFkZGVkCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJENvbnRlbnROZXcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CiAgICB9CgogICAgIyBoYW5kbGUgYXR0YWNobWVudCBldmVudHMKICAgIGVsc2lmICgKICAgICAgICAkRXZlbnQgZXEgJ0NoYW5nZUF0dGFjaG1lbnRBZGQnCiAgICAgICAgfHwgJEV2ZW50IGVxICdDaGFuZ2VBdHRhY2htZW50RGVsZXRlJwogICAgICAgIHx8ICRFdmVudCBlcSAnV29ya09yZGVyQXR0YWNobWVudEFkZCcKICAgICAgICB8fCAkRXZlbnQgZXEgJ1dvcmtPcmRlckF0dGFjaG1lbnREZWxldGUnCiAgICAgICAgfHwgJEV2ZW50IGVxICdXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50QWRkJwogICAgICAgIHx8ICRFdmVudCBlcSAnV29ya09yZGVyUmVwb3J0QXR0YWNobWVudERlbGV0ZScKICAgICAgICApCiAgICB7CgogICAgICAgICMgdGVsbCBoaXN0b3J5IHRoYXQgYW4gYXR0YWNobWVudCBldmVudCB3YXMgdHJpZ2dlcmVkCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57RmlsZW5hbWV9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwogICAgfQoKICAgICMgaGFuZGxlIHh4eFRpbWVSZWFjaGVkIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgPX4gbXsgVGltZVJlYWNoZWQgXHogfXhtcyApIHsKCiAgICAgICAgIyBnZXQgZWl0aGVyIFdvcmtPcmRlcklEIG9yIENoYW5nZUlECiAgICAgICAgbXkgJElEID0gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9IHx8ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfTsKCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJElEIC4gJyUlTm90aWZpY2F0aW9uIFNlbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwogICAgfQoKICAgICMgYWRkIGhpc3RvcnkgZW50cnkgd2hlbiBub3RpZmljYXRpb24gd2FzIHNlbnQKICAgIGVsc2lmICggJEV2ZW50ID1+IG17IE5vdGlmaWNhdGlvblNlbnQgXHogfXhtcyApIHsKCiAgICAgICAgIyBnZXQgZWl0aGVyIFdvcmtPcmRlcklEIG9yIENoYW5nZUlECiAgICAgICAgbXkgJElEID0gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9IHx8ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfTsKCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57VG99IC4gJyUlJyAuICRQYXJhbXtEYXRhfS0+e0V2ZW50VHlwZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CiAgICB9CgogICAgIyBoYW5kbGUgY29uZGl0aW9uIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0NvbmRpdGlvbkFkZCcgKSB7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGNvbmRpdGlvbgogICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntDb25kaXRpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGFsbCBjb25kaXRpb24gZmllbGRzCiAgICAgICAgbXkgQENvbmRpdGlvblN0YXRpYyA9IHF3KENvbmRpdGlvbklEIFVzZXJJRCBDaGFuZ2VJRCk7CiAgICAgICAgQ09ORElUSU9ORklFTEQ6CiAgICAgICAgZm9yIG15ICRDb25kaXRpb25GaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgbmV4dCBDT05ESVRJT05GSUVMRCBpZiBncmVwIHsgJF8gZXEgJENvbmRpdGlvbkZpZWxkIH0gQENvbmRpdGlvblN0YXRpYzsKCiAgICAgICAgICAgICMgZG8gbm90IGFkZCBlbXB0eSBmaWVsZHMgdG8gaGlzdG9yeQogICAgICAgICAgICBuZXh0IENPTkRJVElPTkZJRUxEIGlmICEkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9OwoKICAgICAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRDb25kaXRpb25GaWVsZCwKICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+eyRDb25kaXRpb25GaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgY29uZGl0aW9uIHVwZGF0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdDb25kaXRpb25VcGRhdGUnICkgewoKICAgICAgICAjIGdldCBvbGQgZGF0YQogICAgICAgIG15ICRPbGREYXRhID0gJFBhcmFte0RhdGF9LT57T2xkQ29uZGl0aW9uRGF0YX07CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGFsbCBjb25kaXRpb24gZmllbGRzCiAgICAgICAgbXkgQENvbmRpdGlvblN0YXRpYyA9IHF3KENvbmRpdGlvbklEIFVzZXJJRCBDaGFuZ2VJRCBPbGRDb25kaXRpb25EYXRhKTsKICAgICAgICBDT05ESVRJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJENvbmRpdGlvbkZpZWxkICggc29ydCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc3RhdGljIGZpZWxkcwogICAgICAgICAgICBuZXh0IENPTkRJVElPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkQ29uZGl0aW9uRmllbGQgfSBAQ29uZGl0aW9uU3RhdGljOwoKICAgICAgICAgICAgIyBkbyBub3QgYWRkIGVtcHR5IGZpZWxkcyB0byBoaXN0b3J5CiAgICAgICAgICAgIG5leHQgQ09ORElUSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRDb25kaXRpb25GaWVsZH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JENvbmRpdGlvbkZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIGhpc3Rvcnkgb25seSBmb3IgY2hhbmdlZCBmaWVsZHMKICAgICAgICAgICAgbmV4dCBDT05ESVRJT05GSUVMRCBpZiAhJEZpZWxkSGFzQ2hhbmdlZDsKCiAgICAgICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkT2xkRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRDb25kaXRpb25GaWVsZCwKICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0NvbmRpdGlvbklEfSAuICclJScgLiAkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgQ29udGVudE9sZCAgPT4gJFBhcmFte0RhdGF9LT57Q29uZGl0aW9uSUR9IC4gJyUlJyAuICRPbGREYXRhLT57JENvbmRpdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBjb25kaXRpb24gZGVsZXRlIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0NvbmRpdGlvbkRlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRDb25kaXRpb25EYXRhfTsKCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJE9sZERhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJE9sZERhdGEtPntDb25kaXRpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CiAgICB9CgogICAgIyBoYW5kbGUgY29uZGl0aW9uIGRlbGV0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdDb25kaXRpb25EZWxldGVBbGwnICkgewoKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5JyktPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgZXhwcmVzc2lvbiBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uQWRkJyApIHsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgZXhwcmVzc2lvbgogICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntFeHByZXNzaW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwoKICAgICAgICAjIGNyZWF0ZSBoaXN0b3J5IGZvciBhbGwgZXhwcmVzc2lvbiBmaWVsZHMKICAgICAgICBteSBARXhwcmVzc2lvblN0YXRpYyA9IHF3KCBFeHByZXNzaW9uSUQgVXNlcklEIENoYW5nZUlEKTsKICAgICAgICBFWFBSRVNTSU9ORklFTEQ6CiAgICAgICAgZm9yIG15ICRFeHByZXNzaW9uRmllbGQgKCBzb3J0IGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG5leHQgRVhQUkVTU0lPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkRXhwcmVzc2lvbkZpZWxkIH0gQEV4cHJlc3Npb25TdGF0aWM7CgogICAgICAgICAgICAjIGRvIG5vdCBhZGQgZW1wdHkgZmllbGRzIHRvIGhpc3RvcnkKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRFeHByZXNzaW9uRmllbGR9OwoKICAgICAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRFeHByZXNzaW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnskRXhwcmVzc2lvbkZpZWxkfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBleHByZXNzaW9uIHVwZGF0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZEV4cHJlc3Npb25EYXRhfTsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWxsIGV4cHJlc3Npb24gZmllbGRzCiAgICAgICAgbXkgQEV4cHJlc3Npb25TdGF0aWMgPSBxdyggRXhwcmVzc2lvbklEIFVzZXJJRCBDaGFuZ2VJRCBPbGRFeHByZXNzaW9uRGF0YSApOwogICAgICAgIEVYUFJFU1NJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25GaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9ORklFTEQgaWYgZ3JlcCB7ICRfIGVxICRFeHByZXNzaW9uRmllbGQgfSBARXhwcmVzc2lvblN0YXRpYzsKCiAgICAgICAgICAgICMgZG8gbm90IGFkZCBlbXB0eSBmaWVsZHMgdG8gaGlzdG9yeQogICAgICAgICAgICBuZXh0IEVYUFJFU1NJT05GSUVMRCBpZiAhJFBhcmFte0RhdGF9LT57JEV4cHJlc3Npb25GaWVsZH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskRXhwcmVzc2lvbkZpZWxkfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRFeHByZXNzaW9uRmllbGR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBvbmx5IGZvciBjaGFuZ2VkIGZpZWxkcwogICAgICAgICAgICBuZXh0IEVYUFJFU1NJT05GSUVMRCBpZiAhJEZpZWxkSGFzQ2hhbmdlZDsKCiAgICAgICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgICA9PiAkRXhwcmVzc2lvbkZpZWxkLAogICAgICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57RXhwcmVzc2lvbklEfSAuICclJScKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtEYXRhfS0+eyRFeHByZXNzaW9uRmllbGR9LAogICAgICAgICAgICAgICAgQ29udGVudE9sZCA9PiAkUGFyYW17RGF0YX0tPntFeHByZXNzaW9uSUR9IC4gJyUlJyAuICRPbGREYXRhLT57JEV4cHJlc3Npb25GaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBleHByZXNzaW9uIGRlbGV0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uRGVsZXRlJyApIHsKCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0V4cHJlc3Npb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CiAgICB9CgogICAgIyBoYW5kbGUgZGVsZXRlIGFsbCBleHByZXNzaW9ucyBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uRGVsZXRlQWxsJyApIHsKCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGhhbmRsZSBhY3Rpb24gZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnQWN0aW9uQWRkJyApIHsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWN0aW9uCiAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0FjdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgfTsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWxsIGFjdGlvbiBmaWVsZHMKICAgICAgICBteSBAQWN0aW9uU3RhdGljID0gcXcoIEFjdGlvbklEIFVzZXJJRCBDaGFuZ2VJRCk7CiAgICAgICAgQUNUSU9ORklFTEQ6CiAgICAgICAgZm9yIG15ICRBY3Rpb25GaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgbmV4dCBBQ1RJT05GSUVMRCBpZiBncmVwIHsgJF8gZXEgJEFjdGlvbkZpZWxkIH0gQEFjdGlvblN0YXRpYzsKCiAgICAgICAgICAgICMgZG8gbm90IGFkZCBlbXB0eSBmaWVsZHMgdG8gaGlzdG9yeQogICAgICAgICAgICBuZXh0IEFDVElPTkZJRUxEIGlmICEkUGFyYW17RGF0YX0tPnskQWN0aW9uRmllbGR9OwoKICAgICAgICAgICAgcHVzaCBASGlzdG9yeUFkZERhdGEsIHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRBY3Rpb25GaWVsZCwKICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+eyRBY3Rpb25GaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgYWN0aW9uIHVwZGF0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25VcGRhdGUnICkgewoKICAgICAgICAjIGdldCBvbGQgZGF0YQogICAgICAgIG15ICRPbGREYXRhID0gJFBhcmFte0RhdGF9LT57T2xkQWN0aW9uRGF0YX07CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGFsbCBleHByZXNzaW9uIGZpZWxkcwogICAgICAgIG15IEBBY3Rpb25TdGF0aWMgPSBxdyggQWN0aW9uSUQgVXNlcklEIENoYW5nZUlEIE9sZEFjdGlvbkRhdGEgKTsKICAgICAgICBBQ1RJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJEFjdGlvbkZpZWxkICggc29ydCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc3RhdGljIGZpZWxkcwogICAgICAgICAgICBuZXh0IEFDVElPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkQWN0aW9uRmllbGQgfSBAQWN0aW9uU3RhdGljOwoKICAgICAgICAgICAgIyBkbyBub3QgYWRkIGVtcHR5IGZpZWxkcyB0byBoaXN0b3J5CiAgICAgICAgICAgIG5leHQgQUNUSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRBY3Rpb25GaWVsZH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskQWN0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEFjdGlvbkZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIGhpc3Rvcnkgb25seSBmb3IgY2hhbmdlZCBmaWVsZHMKICAgICAgICAgICAgbmV4dCBBQ1RJT05GSUVMRCBpZiAhJEZpZWxkSGFzQ2hhbmdlZDsKCiAgICAgICAgICAgIHB1c2ggQEhpc3RvcnlBZGREYXRhLCB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgICA9PiAkQWN0aW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntBY3Rpb25JRH0gLiAnJSUnIC4gJFBhcmFte0RhdGF9LT57JEFjdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgID0+ICRQYXJhbXtEYXRhfS0+e0FjdGlvbklEfSAuICclJScgLiAkT2xkRGF0YS0+eyRBY3Rpb25GaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgYWN0aW9uIGRlbGV0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25EZWxldGUnICkgewoKICAgICAgICBwdXNoIEBIaXN0b3J5QWRkRGF0YSwgewogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57QWN0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwogICAgfQoKICAgICMgaGFuZGxlIGRlbGV0ZSBhbGwgYWN0aW9ucyBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25EZWxldGVBbGwnICkgewoKICAgICAgICBwdXNoIEBIaXN0b3J5QWRkRGF0YSwgewogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9OwogICAgfQoKICAgICMgaGFuZGxlIGFjdGlvbiBleGVjdXRlIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0FjdGlvbkV4ZWN1dGUnICkgewoKICAgICAgICBwdXNoIEBIaXN0b3J5QWRkRGF0YSwgewogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57QWN0aW9uSUR9IC4gJyUlJyAuICRQYXJhbXtEYXRhfS0+e0FjdGlvblJlc3VsdH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH07CiAgICB9CgogICAgIyBlcnJvcgogICAgZWxzZSB7CgogICAgICAgICMgYW4gdW5rbm93biBldmVudAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJEV2ZW50IGlzIGFuIHVua25vd24gZXZlbnQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlIHRvIHRoZSBoaXN0b3J5CiAgICByZXR1cm4gMSBpZiAhQEhpc3RvcnlBZGREYXRhOwoKICAgICMgaWYgdGhlcmUgaXMganVzdCBvbmUgaGlzdG9yeSBlbnRyeSB0byB3cml0ZQogICAgaWYgKCBzY2FsYXIgQEhpc3RvcnlBZGREYXRhID09IDEgKSB7CgogICAgICAgICMgd3JpdGUgdGhlIGZpcnN0IGFuZCBvbmx5IGVudHJ5IG9mIHRoZSBhcnJheSB0byB0aGUgaGlzdG9yeQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5JyktPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICV7ICRIaXN0b3J5QWRkRGF0YVswXSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVudHJ5IHRvIHdyaXRlCiAgICAjIGxldCB0aGUgSGlzdG9yeUFkZE11bHRpcGxlIGZ1bmN0aW9uIGhhbmRsZSB0aGF0CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeScpLT5IaXN0b3J5QWRkTXVsdGlwbGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBIaXN0b3J5QWRkRGF0YSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfSGFzRmllbGRDaGFuZ2VkKCkKClRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGEgZmllbGQgd2FzIGNoYW5nZWQgb3Igbm90LiBJdCByZXR1cm5zIDEgd2hlbiBmaWVsZAp3YXMgY2hhbmdlZCwgdW5kZWYgb3RoZXJ3aXNlLgoKICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkSGlzdG9yeU9iamVjdC0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICBPbGQgPT4gJ29sZCB2YWx1ZScsICMgY2FuIGJlIGFycmF5IHJlZmVyZW5jZSBvciBoYXNoIHJlZmVyZW5jZSBhcyB3ZWxsCiAgICAgICAgTmV3ID0+ICduZXcgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgKTsKCj1jdXQKCnN1YiBfSGFzRmllbGRDaGFuZ2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIGVpdGhlciAnbmV3JyBvciAnb2xkIGlzIG5vdCBzZXQKICAgIHJldHVybiAxIGlmICEoICRQYXJhbXtOZXd9ICYmICRQYXJhbXtPbGR9ICkgJiYgKCAkUGFyYW17TmV3fSB8fCAkUGFyYW17T2xkfSApOwoKICAgICMgZmllbGQgaGFzIG5vdCBjaGFuZ2VkIHdoZW4gYm90aCB2YWx1ZXMgYXJlIGVtcHR5CiAgICByZXR1cm4gaWYgISRQYXJhbXtOZXd9ICYmICEkUGFyYW17T2xkfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgJ2VxJyB3aGVuIGJvdGggcGFyYW1zIGFyZSBzY2FsYXJzCiAgICByZXR1cm4gJFBhcmFte05ld30gbmUgJFBhcmFte09sZH0gaWYgIXJlZiggJFBhcmFte05ld30gKSAmJiAhcmVmKCAkUGFyYW17T2xkfSApOwoKICAgICMgYSBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuICdyZWYnIGlzIGRpZmZlcmVudAogICAgcmV0dXJuIDEgaWYgcmVmKCAkUGFyYW17TmV3fSApIG5lIHJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGNoZWNrIGhhc2hlcwogICAgaWYgKCByZWYgJFBhcmFte05ld30gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGZpZWxkIGhhcyBjaGFuZ2VkIHdoZW4gbnVtYmVyIG9mIGtleXMgYXJlIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmIHNjYWxhciBrZXlzICV7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIGtleXMgJXsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayB0aGUgdmFsdWVzIGZvciBlYWNoIGtleQogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT57JEtleX0gbmUgJFBhcmFte09sZH0tPnskS2V5fTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBhcnJheXMKICAgIGlmICggcmVmICRQYXJhbXtOZXd9IGVxICdBUlJBWScgKSB7CgogICAgICAgICMgY2hhbmdlZCB3aGVuIG51bWJlciBvZiBlbGVtZW50cyBkaWZmZXIKICAgICAgICByZXR1cm4gMSBpZiBzY2FsYXIgQHsgJFBhcmFte05ld30gfSAhPSBzY2FsYXIgQHsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayBlYWNoIGVsZW1lbnQKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAkI3sgJFBhcmFte05ld30gfSApIHsKICAgICAgICAgICAgcmV0dXJuIDEgaWYgJFBhcmFte05ld30tPlskSW5kZXhdIG5lICRQYXJhbXtPbGR9LT5bJEluZGV4XTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWVsZCBoYXMgbm90IGJlZW4gY2hhbmdlZAogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9IaXN0b3J5RGVsZXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEhpc3RvcnlEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5RGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBkZWxldGlvbiBvZiBhIGNoYW5nZQogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdDaGFuZ2VEZWxldGVQb3N0JyApIHsKCiAgICAgICAgIyBkZWxldGUgaGlzdG9yeSBvZiBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5JyktPkNoYW5nZUhpc3RvcnlEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBoYW5kbGUgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNoYW5nZURlbGV0ZSgpIGZhaWxlZCBmb3IgQ2hhbmdlSUQgJyRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBlcnJvcgogICAgZWxzZSB7CgogICAgICAgICMgYW4gdW5rbm93biBldmVudAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFte0V2ZW50fSBpcyBhbiB1bmtub3duIGV2ZW50ISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Ob3RpZmljYXRpb24ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IE5vdGlmaWNhdGlvbi5wbSx2IDEuMiAyMDE4LzEwLzExIDE0OjQ0OjA0IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Tm90aWZpY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhEYXRhIEV2ZW50IENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgZXZlbnQsIGJlY2F1c2Ugd2UgbmVlZCB0aGlzIHVubW9kaWZpZWQgaW4gbGF0ZXIgZXZlbnQgbW9kdWxlcwogICAgbXkgJEV2ZW50ID0gJFBhcmFte0V2ZW50fTsKCiAgICAjIGluIGhpc3RvcnkgZXZlbnQgaGFuZGxpbmcgd2UgdXNlIEV2ZW50IG5hbWUgd2l0aG91dCB0aGUgdHJhaWxpbmcgJ1Bvc3QnCiAgICAkRXZlbnQgPX4gc3sgUG9zdCBceiB9e314bXM7CgogICAgIyBkaXN0aW5ndWlzaCBiZXR3ZWVuIENoYW5nZSBhbmQgV29ya09yZGVyIGV2ZW50cywgYmFzZWQgb24gbmFtaW5nIGNvbnZlbnRpb24KICAgIG15ICRUeXBlOwogICAgaWYgKCAkRXZlbnQgPX4gbXsgXEEgKENoYW5nZXxBY3Rpb25FeGVjdXRlKSB9eG1zICkgewogICAgICAgICRUeXBlID0gJ0NoYW5nZSc7CiAgICB9CiAgICBlbHNpZiAoICRFdmVudCA9fiBteyBcQSBXb3JrT3JkZXIgfXhtcyApIHsKICAgICAgICAkVHlwZSA9ICdXb3JrT3JkZXInOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSBmb3IgdGhlIGV2ZW50ICckRXZlbnQnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGV2ZW50IGlkLCBmb3IgbG9va2luZyB1cCB0aGUgbGlzdCBvZiByZWxldmFudCBydWxlcwogICAgbXkgJEV2ZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeScpLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICApOwogICAgaWYgKCAhJEV2ZW50SUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmNvdW50ZXJlZCB1bmtub3duIGV2ZW50ICckRXZlbnQnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJE5vdGlmaWNhdGlvblJ1bGVJRHMKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24nKS0+Tm90aWZpY2F0aW9uUnVsZVNlYXJjaCgKICAgICAgICBFdmVudElEID0+ICRFdmVudElELAogICAgICAgICk7CiAgICBpZiAoICEkTm90aWZpY2F0aW9uUnVsZUlEcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBnZXQgbm90aWZpY2F0aW9uIHJ1bGVzIGZvciB0aGUgZXZlbnQgJyRFdmVudCchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluIGNhc2Ugb2YgYW4gdXBkYXRlLCB3ZSBoYXZlIHRoZSBvbGQgZGF0YSBmb3IgY29tcGFyaXNvbgogICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPnsiT2xkJHtUeXBlfURhdGEifTsKCiAgICAjIFRoZSBub3RpZmljYXRpb24gcnVsZXMgYXJlIGJhc2VkIG9uIG5hbWVzLCB3aGlsZSB0aGUgQ2hhbmdlVXBkYXRlLUZ1bmN0aW9uCiAgICAjIHByaW1hcmlseSBjYXJlcyBhYm91dCBJRHMuIFNvIHRoZXJlIG5lZWRzIHRvIGJlIGEgbWFwcGluZy4KICAgIG15ICVOYW1lMklEID0gKAogICAgICAgIENoYW5nZVN0YXRlICAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICApOwoKICAgICMgbG9vcCBvdmVyIHRoZSBub3RpZmljYXRpb24gcnVsZXMgYW5kIGNoZWNrIHRoZSBjb25kaXRpb24KICAgIFJVTEVJRDoKICAgIGZvciBteSAkUnVsZUlEICggQHskTm90aWZpY2F0aW9uUnVsZUlEc30gKSB7CiAgICAgICAgbXkgJFJ1bGUKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJyktPk5vdGlmaWNhdGlvblJ1bGVHZXQoCiAgICAgICAgICAgIElEID0+ICRSdWxlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgIG15ICRBdHRyaWJ1dGUgPSAkUnVsZS0+e0F0dHJpYnV0ZX0gfHwgJyc7CiAgICAgICAgaWYgKCAkTmFtZTJJRHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZSA9ICROYW1lMklEeyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBubyBub3RpZmljYXRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVsZXZhbnQKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgJiYgIWV4aXN0cyAkUGFyYW17RGF0YX0tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgbmV4dCBSVUxFSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGluIGNhc2Ugb2YgYW4gdXBkYXRlLCBjaGVjayB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRyaWJ1dGUKICAgICAgICAgICAgJiYgKCAkRXZlbnQgZXEgJ0NoYW5nZVVwZGF0ZScgfHwgJEV2ZW50IGVxICdXb3JrT3JkZXJVcGRhdGUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBSVUxFSUQgaWYgISRIYXNDaGFuZ2VkOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0CiAgICAgICAgbXkgJE5ld0ZpZWxkQ29udGVudCA9ICRBdHRyaWJ1dGUgPyAkUGFyYW17RGF0YX0tPnskQXR0cmlidXRlfSA6ICcnOwoKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgZXEgJ0NoYW5nZVN0YXRlSUQnICkgewogICAgICAgICAgICAkTmV3RmllbGRDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICROZXdGaWVsZENvbnRlbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnV29ya09yZGVyU3RhdGVJRCcgKSB7CiAgICAgICAgICAgICROZXdGaWVsZENvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpCiAgICAgICAgICAgICAgICAtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkTmV3RmllbGRDb250ZW50LAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdWxkIHRoZSBub3RpZmljYXRpb24gYmUgc2VudCA/CiAgICAgICAgIyB0aGUgeC1tb2RpZmllciBpcyBoYXJtZnVsIGhlcmUsIGFzICRSdWxlLT57UnVsZX0gY2FuIGNvbnRhaW4gc3BhY2VzCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRSdWxlLT57UnVsZX0KICAgICAgICAgICAgJiYgZGVmaW5lZCAkTmV3RmllbGRDb250ZW50CiAgICAgICAgICAgICYmICROZXdGaWVsZENvbnRlbnQgIX4gbS9eJFJ1bGUtPntSdWxlfSQvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgUlVMRUlEOwogICAgICAgIH0KCiAgICAgICAgIyBkZXRlcm1pbmUgbGlzdCBvZiBhZ2VudHMgYW5kIGN1c3RvbWVycwogICAgICAgIG15ICRBZ2VudEFuZEN1c3RvbWVySURzID0gJFNlbGYtPl9BZ2VudEFuZEN1c3RvbWVySURzR2V0KAogICAgICAgICAgICBSZWNpcGllbnRzICA9PiAkUnVsZS0+e1JlY2lwaWVudHN9LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgRXZlbnQgICAgICAgPT4gJEV2ZW50LAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgT2xkRGF0YSAgICAgPT4gJE9sZERhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgUlVMRUlEIGlmICEkQWdlbnRBbmRDdXN0b21lcklEczsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok5vdGlmaWNhdGlvbicpLT5Ob3RpZmljYXRpb25TZW5kKAogICAgICAgICAgICAleyRBZ2VudEFuZEN1c3RvbWVySURzfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRUeXBlLAogICAgICAgICAgICBFdmVudCAgPT4gJEV2ZW50LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIERhdGEgICA9PiB7CiAgICAgICAgICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwgICAjIGRvIG5vdCBwYXNzIGFzIHJlZmVyZW5jZSwgYXMgaXQgd291bGQgaW5mbHVlbmNlIGxhdGVyIGV2ZW50cyEKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJ1bGUtPntNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aGVhZDIgX0hhc0ZpZWxkQ2hhbmdlZCgpCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIGZpZWxkIHdhcyBjaGFuZ2VkIG9yIG5vdC4gSXQgcmV0dXJucyAxIHdoZW4gZmllbGQKd2FzIGNoYW5nZWQsIDAgb3RoZXJ3aXNlCgogICAgbXkgJEZpZWxkSGFzQ2hhbmdlZCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICBPbGQgPT4gJ29sZCB2YWx1ZScsICMgY2FuIGJlIGFycmF5IHJlZmVyZW5jZSBvciBoYXNoIHJlZmVyZW5jZSBhcyB3ZWxsCiAgICAgICAgTmV3ID0+ICduZXcgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgKTsKCj1jdXQKCnN1YiBfSGFzRmllbGRDaGFuZ2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIGVpdGhlciAnbmV3JyBvciAnb2xkIGlzIG5vdCBzZXQKICAgIHJldHVybiAxIGlmICEoICRQYXJhbXtOZXd9ICYmICRQYXJhbXtPbGR9ICkgJiYgKCAkUGFyYW17TmV3fSB8fCAkUGFyYW17T2xkfSApOwoKICAgICMgZmllbGQgaGFzIG5vdCBjaGFuZ2VkIHdoZW4gYm90aCB2YWx1ZXMgYXJlIGVtcHR5CiAgICByZXR1cm4gaWYgISRQYXJhbXtOZXd9ICYmICEkUGFyYW17T2xkfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgJ2VxJyB3aGVuIGJvdGggcGFyYW1zIGFyZSBzY2FsYXJzCiAgICByZXR1cm4gJFBhcmFte05ld30gbmUgJFBhcmFte09sZH0gaWYgIXJlZiggJFBhcmFte05ld30gKSAmJiAhcmVmKCAkUGFyYW17T2xkfSApOwoKICAgICMgYSBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuICdyZWYnIGlzIGRpZmZlcmVudAogICAgcmV0dXJuIDEgaWYgcmVmKCAkUGFyYW17TmV3fSApIG5lIHJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGNoZWNrIGhhc2hlcwogICAgaWYgKCByZWYgJFBhcmFte05ld30gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGZpZWxkIGhhcyBjaGFuZ2VkIHdoZW4gbnVtYmVyIG9mIGtleXMgYXJlIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmIHNjYWxhciBrZXlzICV7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIGtleXMgJXsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayB0aGUgdmFsdWVzIGZvciBlYWNoIGtleQogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT57JEtleX0gbmUgJFBhcmFte09sZH0tPnskS2V5fTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBhcnJheXMKICAgIGlmICggcmVmICRQYXJhbXtOZXd9IGVxICdBUlJBWScgKSB7CgogICAgICAgICMgY2hhbmdlZCB3aGVuIG51bWJlciBvZiBlbGVtZW50cyBkaWZmZXIKICAgICAgICByZXR1cm4gMSBpZiBzY2FsYXIgQHsgJFBhcmFte05ld30gfSAhPSBzY2FsYXIgQHsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayBlYWNoIGVsZW1lbnQKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAkI3sgJFBhcmFte05ld30gfSApIHsKICAgICAgICAgICAgcmV0dXJuIDEgaWYgJFBhcmFte05ld30tPlskSW5kZXhdIG5lICRQYXJhbXtPbGR9LT5bJEluZGV4XTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWVsZCBoYXMgbm90IGJlZW4gY2hhbmdlZAogICAgcmV0dXJuIDA7Cn0KCj1oZWFkMiBfQWdlbnRBbmRDdXN0b21lcklEc0dldCgpCgpHZXQgdGhlIGFnZW50IGFuZCBjdXN0b21lciBJRHMgZnJvbSB0aGUgcmVjaXBpZW50IGxpc3QuCgogICAgbXkgJEFnZW50QW5kQ3VzdG9tZXJJRHMgPSAkSGlzdG9yeU9iamVjdC0+X0FnZW50QW5kQ3VzdG9tZXJJRHNHZXQoCiAgICAgICAgUmVjaXBpZW50cyA9PiBbJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlciddLAogICAgKTsKCnJldHVybnMKCiAgICAkQWdlbnRBbmRDdXN0b21lcklEcyA9IHsKICAgICAgICBBZ2VudElEcyAgICA9PiBbIDIsIDQgXSwKICAgICAgICBDdXN0b21lcklEcyA9PiBbXSwKICAgIH07Cgo9Y3V0CgpzdWIgX0FnZW50QW5kQ3VzdG9tZXJJRHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV29ya09yZGVyQWdlbnRJRDsKICAgIG15IEBXb3JrT3JkZXJHcm91cEFnZW50czsKCiAgICBpZiAoICRQYXJhbXtUeXBlfSBlcSAnV29ya09yZGVyJyApIHsKCiAgICAgICAgIyBjaGVjayBXb3JrT3JkZXJJRAogICAgICAgIGlmICggISRQYXJhbXtXb3JrT3JkZXJJRH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW0gJ1dvcmtPcmRlcklEJyBpcyByZXF1aXJlZCBmb3IgV29ya09yZGVyIGV2ZW50cyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ1dvcmtPcmRlckRlbGV0ZScgKSB7CgogICAgICAgICAgICAjIHRoZSB3b3Jrb3JkZXIgaXMgYWxyZWFkeSBkZWxldGVkLCBzbyB3ZSBsb29rIGF0IHRoZSBPbGREYXRhCiAgICAgICAgICAgICRQYXJhbXtDaGFuZ2VJRH0gPSAkUGFyYW17T2xkRGF0YX0tPntDaGFuZ2VJRH07CiAgICAgICAgICAgICRXb3JrT3JkZXJBZ2VudElEID0gJFBhcmFte09sZERhdGF9LT57V29ya09yZGVyQWdlbnRJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgQ2hhbmdlSUQgYW5kIFdvcmtPcmRlckFnZW50SUQgZnJvbSB0aGUgV29ya09yZGVyLAogICAgICAgICAgICAjIHRoZSBXb3JrT3JkZXJBZ2VudCBtaWdodCBoYXZlIGJlZW4gcmVjZW50bHkgdXBkYXRlZAogICAgICAgICAgICBteSAkV29ya09yZGVyCiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17Q2hhbmdlSUR9ID0gJFdvcmtPcmRlci0+e0NoYW5nZUlEfTsKICAgICAgICAgICAgJFdvcmtPcmRlckFnZW50SUQgPSAkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CgogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJHcm91cElEfSApIHsKCiAgICAgICAgICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICAgICAgICAgIG15ICVVc2VyTGlzdCAgICA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckdldCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJHcm91cElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdydycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgR1JPVVBNRU1CRVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUE1FTUJFUiBpZiAkVXNlcklEID09IDE7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAV29ya09yZGVyR3JvdXBBZ2VudHMsICRVc2VySUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB0aGVzZSBhcnJheXMgd2lsbCBiZSByZXR1cm5lZAogICAgbXkgKCBAQWdlbnRJRHMsIEBDdXN0b21lcklEcyApOwoKICAgICMgbmVlZGVkIGZvciBkZXRlcm1pbmluZyB0aGUgYWN0dWFsIHJlY2lwaWVudHMKICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hhbmdlOwogICAgcmV0dXJuIGlmIHJlZiAkQ2hhbmdlIG5lICdIQVNIJzsKICAgIHJldHVybiBpZiAhJXskQ2hhbmdlfTsKCiAgICBmb3IgbXkgJFJlY2lwaWVudCAoIEB7ICRQYXJhbXtSZWNpcGllbnRzfSB9ICkgewoKICAgICAgICBpZiAoICRSZWNpcGllbnQgZXEgJ0NoYW5nZUJ1aWxkZXInIHx8ICRSZWNpcGllbnQgZXEgJ0NoYW5nZU1hbmFnZXInICkgewoKICAgICAgICAgICAgIyB0YWtlIHRoZSBidWlsZGVyIG9yIG1hbmFnZXIgZnJvbSB0aGUgY3VycmVudCBjaGFuZ2UgZGF0YQogICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJENoYW5nZS0+eyAkUmVjaXBpZW50IC4gJ0lEJyB9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ09sZENoYW5nZUJ1aWxkZXInIHx8ICRSZWNpcGllbnQgZXEgJ09sZENoYW5nZU1hbmFnZXInICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtFdmVudH0gbmUgJ0NoYW5nZVVwZGF0ZScgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWNpcGllbnQgJFJlY2lwaWVudCBpcyBvbmx5IHZhbGlkIGZvciBDaGFuZ2VVcGRhdGUgZXZlbnRzLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImJ1dCB0aGUgZXZlbnQgd2FzIGEgJyRQYXJhbXtFdmVudH0nIGV2ZW50ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgdGFrZSB0aGUgYnVpbGRlciBvciBtYW5hZ2VyIGZyb20gdGhlIG9yaWdpbmFsIGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICAkUmVjaXBpZW50ID1+IHN7IFxBIE9sZCB9e314bXM7CiAgICAgICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJFBhcmFte09sZERhdGF9LT57ICRSZWNpcGllbnQgLiAnSUQnIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdDQUJDdXN0b21lcnMnICkgewogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgQHsgJENoYW5nZS0+e0NBQkN1c3RvbWVyc30gfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdDQUJBZ2VudHMnICkgewogICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgQHsgJENoYW5nZS0+e0NBQkFnZW50c30gfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdXb3JrT3JkZXJBZ2VudCcgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1R5cGV9IG5lICdXb3JrT3JkZXInICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjaXBpZW50ICRSZWNpcGllbnQgaXMgb25seSB2YWxpZCBmb3Igd29ya29yZGVyIGV2ZW50cyAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImJ1dCB0aGUgZXZlbnQgd2FzIGEgJyRQYXJhbXtFdmVudH0nIGV2ZW50ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBAQWdlbnRJRHMsICRXb3JrT3JkZXJBZ2VudElEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnV29ya09yZGVyR3JvdXAnICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSBuZSAnV29ya09yZGVyJyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY2lwaWVudCAkUmVjaXBpZW50IGlzIG9ubHkgdmFsaWQgZm9yIHdvcmtvcmRlciBldmVudHMgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJidXQgdGhlIGV2ZW50IHdhcyBhICckUGFyYW17RXZlbnR9JyBldmVudCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCBAV29ya09yZGVyR3JvdXBBZ2VudHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdPbGRXb3JrT3JkZXJBZ2VudCcgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0V2ZW50fSBuZSAnV29ya09yZGVyVXBkYXRlJyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY2lwaWVudCAkUmVjaXBpZW50IGlzIG9ubHkgdmFsaWQgZm9yIFdvcmtPcmRlclVwZGF0ZSBldmVudHMgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJidXQgdGhlIGV2ZW50IHdhcyBhICckUGFyYW17RXZlbnR9JyBldmVudCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHRha2UgdGhlIHdvcmtvcmRlciBhZ2VudCBmcm9tIHRoZSBvcmlnaW5hbCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgJFJlY2lwaWVudCA9fiBzeyBcQSBPbGQgfXt9eG1zOwogICAgICAgICAgICAgICAgcHVzaCBAQWdlbnRJRHMsICRQYXJhbXtPbGREYXRhfS0+eyAkUmVjaXBpZW50IC4gJ0lEJyB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnV29ya09yZGVyQWdlbnRzJyApIHsKCiAgICAgICAgICAgICMgbG9vcCBvdmVyIHRoZSB3b3Jrb3JkZXJzIG9mIGEgY2hhbmdlIGFuZCBnZXQgdGhlaXIgd29ya29yZGVyIGFnZW50cwogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfSApIHsKICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXIKICAgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnQ2hhbmdlSW5pdGlhdG9ycycgKSB7CgogICAgICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyB3aGljaCBhcmUgZGlyZWN0bHkgbGlua2VkIHdpdGggdGhpcyBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlIGluaXRpYXRvcnMgKGN1c3RvbWVyIHVzZXJzIG9mIGxpbmtlZCB0aWNrZXRzKQogICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGxpc3QgYSBkaXNwbGF5ZWQgaW4gQ2hhbmdlWm9vbS4KICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJExpbmtMaXN0V2l0aERhdGEtPntUaWNrZXR9IHx8IHt9OwogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIHRoZSBsaW5rZWQgdGlja2V0cyBhcmUgYWx3YXlzIHRoZSAnU291cmNlJy4KICAgICAgICAgICAgICAgIGZvciBteSAkVGlja2V0RGF0YSAoIHZhbHVlcyAleyAkTGlua0xpc3QtPnskTGlua1R5cGV9LT57U291cmNlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBkYXRhIGZvciB0aGUgbGlua2VkIHRpY2tldCBjYW4gaGF2ZSBhIGN1c3RvbWVyIGlkLgogICAgICAgICAgICAgICAgICAgICMgSWYgaXQgZG9lc24ndCwgZmFsbCBiYWNrIHRvIHRoZSBvd25lci4KICAgICAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXREYXRhLT57Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFRpY2tldERhdGEtPntDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJFRpY2tldERhdGEtPntPd25lcklEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50ID1+IG17IFxBIEdyb3VwSVRTTUNoYW5nZSh8QnVpbGRlcnxNYW5hZ2VyKSBceiB9eG1zICkgewoKICAgICAgICAgICAgbXkgJVJlY2lwaWVudDJHcm91cCA9ICgKICAgICAgICAgICAgICAgIEdyb3VwSVRTTUNoYW5nZSAgICAgICAgPT4gJ2l0c20tY2hhbmdlJywKICAgICAgICAgICAgICAgIEdyb3VwSVRTTUNoYW5nZUJ1aWxkZXIgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgICAgICAgICAgICAgR3JvdXBJVFNNQ2hhbmdlTWFuYWdlciA9PiAnaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBncm91cCBpZAogICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwID0+ICRSZWNpcGllbnQyR3JvdXB7JFJlY2lwaWVudH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1lbWJlcnMgb2YgZ3JvdXAKICAgICAgICAgICAgbXkgJVVzZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCBrZXlzICVVc2VyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmtub3duIHJlY2lwaWVudCAnJFJlY2lwaWVudCchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIG5lZWQgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZXMsIE5vdGlmaWNhdGlvblNlbmQoKSB0YWtlcyBjYXJlIG9mIHRoYXQKICAgICMgcmVtb3ZlIGVtcHR5IElEcwogICAgQEFnZW50SURzICAgID0gZ3JlcCB7JF99IEBBZ2VudElEczsKICAgIEBDdXN0b21lcklEcyA9IGdyZXAgeyRffSBAQ3VzdG9tZXJJRHM7CgogICAgbXkgJUFnZW50QW5kQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgQWdlbnRJRHMgICAgPT4gXEBBZ2VudElEcywKICAgICAgICBDdXN0b21lcklEcyA9PiBcQEN1c3RvbWVySURzLAogICAgKTsKCiAgICByZXR1cm4gXCVBZ2VudEFuZEN1c3RvbWVySURzOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Ub29sQmFyQ2hhbmdlTWFuYWdlckNhY2hlRGVsZXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFRvb2xCYXJDaGFuZ2VNYW5hZ2VyQ2FjaGVEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpUb29sQmFyQ2hhbmdlTWFuYWdlckNhY2hlRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUgcHJlZml4CiAgICBteSAkQ2FjaGVUeXBlUHJlZml4ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50VG9vbEJhckNoYW5nZU1hbmFnZXInOwoKICAgICMgaGFuZGxlIGFkZGluZyBvZiBhIGNoYW5nZQogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdDaGFuZ2VBZGRQb3N0JyApIHsKCiAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZSBDaGFuZ2VNYW5hZ2VySUQgd2FzIG5vdCBzZXQKICAgICAgICByZXR1cm4gMSBpZiAhJFBhcmFte0RhdGF9LT57Q2hhbmdlTWFuYWdlcklEfTsKCiAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUKICAgICAgICBteSAkQ2FjaGVUeXBlID0gJENhY2hlVHlwZVByZWZpeCAuICRQYXJhbXtEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH07CgogICAgICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBoYW5kbGUgdXBkYXRlIG9mIGEgY2hhbmdlCiAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0NoYW5nZVVwZGF0ZVBvc3QnICkgewoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcyBpbml0aWFsaXplZAogICAgICAgICRQYXJhbXtEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH0gfHw9ICcnOwogICAgICAgICRQYXJhbXtEYXRhfS0+e09sZENoYW5nZURhdGF9LT57Q2hhbmdlTWFuYWdlcklEfSB8fD0gJyc7CgogICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgQ2hhbmdlTWFuYWdlcklEIGRpZCBub3QgY2hhbmdlCiAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgaWYgJFBhcmFte0RhdGF9LT57Q2hhbmdlTWFuYWdlcklEfSBlcSAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH07CgogICAgICAgICMgc2V0IHRoZSBjYWNoZSB0eXBlIHBvc3RmaXgKICAgICAgICBteSBAQ2FjaGVUeXBlUG9zdGZpeGVzID0gKAogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDaGFuZ2VNYW5hZ2VySUR9LAogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIGNhY2hlIGZvciB0aGUgb2xkIGFuZCB0aGUgY3VycmVudCBjaGFuZ2UgbWFuYWdlcgogICAgICAgIENBQ0hFVFlQRVBPU1RGSVg6CiAgICAgICAgZm9yIG15ICRDYWNoZVR5cGVQb3N0Zml4IChAQ2FjaGVUeXBlUG9zdGZpeGVzKSB7CgogICAgICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlIENoYW5nZU1hbmFnZXJJRCB3YXMgbm90IHNldAogICAgICAgICAgICBuZXh0IENBQ0hFVFlQRVBPU1RGSVggaWYgISRDYWNoZVR5cGVQb3N0Zml4OwoKICAgICAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUKICAgICAgICAgICAgbXkgJENhY2hlVHlwZSA9ICRDYWNoZVR5cGVQcmVmaXggLiAkQ2FjaGVUeXBlUG9zdGZpeDsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaGFuZGxlIGRlbGV0aW5nIGEgY2hhbmdlCiAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0NoYW5nZURlbGV0ZVBvc3QnICkgewoKICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlIENoYW5nZU1hbmFnZXJJRCB3YXMgbm90IHNldAogICAgICAgIHJldHVybiAxIGlmICEkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH07CgogICAgICAgICMgc2V0IHRoZSBjYWNoZSB0eXBlCiAgICAgICAgbXkgJENhY2hlVHlwZSA9ICRDYWNoZVR5cGVQcmVmaXggLiAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfS0+e0NoYW5nZU1hbmFnZXJJRH07CgogICAgICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Ub29sQmFyTXlDQUJDYWNoZURlbGV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBUb29sQmFyTXlDQUJDYWNoZURlbGV0ZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OlRvb2xCYXJNeUNBQkNhY2hlRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUgcHJlZml4CiAgICBteSAkQ2FjaGVUeXBlUHJlZml4ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50VG9vbEJhck15Q0FCJzsKCiAgICAjIGhhbmRsZSB1cGRhdGUgb2YgYSBDQUIKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlQ0FCVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgQ0FCQWdlbnRzIHdlcmUgbm90IHVwZGF0ZWQKICAgICAgICByZXR1cm4gMSBpZiAhJFBhcmFte0RhdGF9LT57Q0FCQWdlbnRzfTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQKICAgICAgICAkUGFyYW17RGF0YX0tPntDQUJBZ2VudHN9IHx8PSBbXTsKICAgICAgICAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VDQUJEYXRhfS0+e0NBQkFnZW50c30gfHw9IFtdOwoKICAgICAgICAjIGJ1aWxkIGxvb2t1cCBoYXNoIGZvciBDQUJBZ2VudHMgZnJvbSAibmV3IiBhbmQgIm9sZCIgQWdlbnRzCiAgICAgICAgbXkgJUNoYW5nZWRDQUJBZ2VudHNMb29rdXA7CiAgICAgICAgZm9yIG15ICRDQUJBZ2VudCAoCiAgICAgICAgICAgIEB7ICRQYXJhbXtEYXRhfS0+e0NBQkFnZW50c30gfSwKICAgICAgICAgICAgQHsgJFBhcmFte0RhdGF9LT57T2xkQ2hhbmdlQ0FCRGF0YX0tPntDQUJBZ2VudHN9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJENoYW5nZWRDQUJBZ2VudHNMb29rdXB7JENBQkFnZW50fSsrOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIHRoZSBDQUJBZ2VudHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQsIHdoaWNoIGFyZSBvbmx5IGFnZW50cyB3aXRoIGEgY291bnQgb2YgZXhhY3RseSBvbmUKICAgICAgICBteSBAQ2hhbmdlZENBQkFnZW50czsKICAgICAgICBmb3IgbXkgJENBQkFnZW50ICggc29ydCBrZXlzICVDaGFuZ2VkQ0FCQWdlbnRzTG9va3VwICkgewogICAgICAgICAgICBpZiAoICRDaGFuZ2VkQ0FCQWdlbnRzTG9va3VweyRDQUJBZ2VudH0gPT0gMSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENoYW5nZWRDQUJBZ2VudHMsICRDQUJBZ2VudDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY2FjaGUgZm9yIGFsbCBjaGFuZ2VkIENBQkFnZW50cwogICAgICAgIGZvciBteSAkQ0FCQWdlbnQgKEBDaGFuZ2VkQ0FCQWdlbnRzKSB7CgogICAgICAgICAgICAjIHNldCB0aGUgY2FjaGUgdHlwZQogICAgICAgICAgICBteSAkQ2FjaGVUeXBlID0gJENhY2hlVHlwZVByZWZpeCAuICRDQUJBZ2VudDsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaGFuZGxlIGRlbGV0aW5nIGEgQ0FCCiAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0NoYW5nZUNBQkRlbGV0ZVBvc3QnICkgewoKICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgd2VyZSBubyBDQUJBZ2VudHMgc2V0CiAgICAgICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfS0+e09sZENoYW5nZUNBQkRhdGF9LT57Q0FCQWdlbnRzfTsKICAgICAgICByZXR1cm4gMSBpZiAhQHsgJFBhcmFte0RhdGF9LT57T2xkQ2hhbmdlQ0FCRGF0YX0tPntDQUJBZ2VudHN9IH07CgogICAgICAgICMgZGVsZXRlIGNhY2hlIGZvciBhbGwgQ0FCQWdlbnRzCiAgICAgICAgZm9yIG15ICRDQUJBZ2VudCAoIEB7ICRQYXJhbXtEYXRhfS0+e09sZENoYW5nZUNBQkRhdGF9LT57Q0FCQWdlbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUKICAgICAgICAgICAgbXkgJENhY2hlVHlwZSA9ICRDYWNoZVR5cGVQcmVmaXggLiAkQ0FCQWdlbnQ7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Ub29sQmFyTXlDaGFuZ2VzQ2FjaGVEZWxldGUucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogVG9vbEJhck15Q2hhbmdlc0NhY2hlRGVsZXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6VG9vbEJhck15Q2hhbmdlc0NhY2hlRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUgcHJlZml4CiAgICBteSAkQ2FjaGVUeXBlUHJlZml4ID0gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50VG9vbEJhck15Q2hhbmdlcyc7CgogICAgIyBoYW5kbGUgYWRkaW5nIG9mIGEgY2hhbmdlCiAgICBpZiAoICRQYXJhbXtFdmVudH0gZXEgJ0NoYW5nZUFkZFBvc3QnICkgewoKICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlIENoYW5nZUJ1aWxkZXJJRCB3YXMgbm90IHNldAogICAgICAgIHJldHVybiAxIGlmICEkUGFyYW17RGF0YX0tPntDaGFuZ2VCdWlsZGVySUR9OwoKICAgICAgICAjIHNldCB0aGUgY2FjaGUgdHlwZQogICAgICAgIG15ICRDYWNoZVR5cGUgPSAkQ2FjaGVUeXBlUHJlZml4IC4gJFBhcmFte0RhdGF9LT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAgICAgIyBkZWxldGUgdGhlIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGhhbmRsZSB1cGRhdGUgb2YgYSBjaGFuZ2UKICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBkYXRhIGlzIGluaXRpYWxpemVkCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q2hhbmdlQnVpbGRlcklEfSB8fD0gJyc7CiAgICAgICAgJFBhcmFte0RhdGF9LT57T2xkQ2hhbmdlRGF0YX0tPntDaGFuZ2VCdWlsZGVySUR9IHx8PSAnJzsKCiAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZSBDaGFuZ2VCdWlsZGVySUQgZGlkIG5vdCBjaGFuZ2UKICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBpZiAkUGFyYW17RGF0YX0tPntDaGFuZ2VCdWlsZGVySUR9IGVxICRQYXJhbXtEYXRhfS0+e09sZENoYW5nZURhdGF9LT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUgcG9zdGZpeAogICAgICAgIG15IEBDYWNoZVR5cGVQb3N0Zml4ZXMgPSAoCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NoYW5nZUJ1aWxkZXJJRH0sCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e09sZENoYW5nZURhdGF9LT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUgZm9yIHRoZSBvbGQgYW5kIHRoZSBjdXJyZW50IGNoYW5nZSBidWlsZGVyCiAgICAgICAgQ0FDSEVUWVBFUE9TVEZJWDoKICAgICAgICBmb3IgbXkgJENhY2hlVHlwZVBvc3RmaXggKEBDYWNoZVR5cGVQb3N0Zml4ZXMpIHsKCiAgICAgICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgQ2hhbmdlQnVpbGRlcklEIHdhcyBub3Qgc2V0CiAgICAgICAgICAgIG5leHQgQ0FDSEVUWVBFUE9TVEZJWCBpZiAhJENhY2hlVHlwZVBvc3RmaXg7CgogICAgICAgICAgICAjIHNldCB0aGUgY2FjaGUgdHlwZQogICAgICAgICAgICBteSAkQ2FjaGVUeXBlID0gJENhY2hlVHlwZVByZWZpeCAuICRDYWNoZVR5cGVQb3N0Zml4OwoKICAgICAgICAgICAgIyBkZWxldGUgdGhlIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBoYW5kbGUgZGVsZXRpbmcgYSBjaGFuZ2UKICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlRGVsZXRlUG9zdCcgKSB7CgogICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgQ2hhbmdlQnVpbGRlcklEIHdhcyBub3Qgc2V0CiAgICAgICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfS0+e09sZENoYW5nZURhdGF9LT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUKICAgICAgICBteSAkQ2FjaGVUeXBlID0gJENhY2hlVHlwZVByZWZpeCAuICRQYXJhbXtEYXRhfS0+e09sZENoYW5nZURhdGF9LT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAgICAgIyBkZWxldGUgdGhlIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0FjdGlvbi5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBY3Rpb24ucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkFjdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uIC0gY29uZGl0aW9uIGFjdGlvbiBsaWIKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgQWN0aW9uQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gYWN0aW9uLgoKICAgIG15ICRBY3Rpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkFkZCgKICAgICAgICBDb25kaXRpb25JRCAgPT4gMTIzLAogICAgICAgIEFjdGlvbk51bWJlciA9PiA1LAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsCiAgICAgICAgQXR0cmlidXRlSUQgID0+IDM0NSwKICAgICAgICBPcGVyYXRvcklEICAgPT4gNDU2LAogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0LAogICAgICAgIEFjdGlvblZhbHVlICA9PiAncmVqZWN0ZWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgT2JqZWN0SUQgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCBTZWxlY3RvciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlICdBY3Rpb25WYWx1ZScgaW4gYSBzcGVjaWFsIHdheQogICAgaWYgKCAhZXhpc3RzICRQYXJhbXtBY3Rpb25WYWx1ZX0gfHwgIWRlZmluZWQgJFBhcmFte0FjdGlvblZhbHVlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQWN0aW9uVmFsdWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyB0cmlnZ2VyIEFjdGlvbkFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uQWRkUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZGVmYXVsdCBhY3Rpb24gbnVtYmVyIGlmIG5vdCBnaXZlbgogICAgbXkgJEFjdGlvbk51bWJlciA9IGRlbGV0ZSAkUGFyYW17QWN0aW9uTnVtYmVyfTsKICAgIGlmICggISRBY3Rpb25OdW1iZXIgKSB7CiAgICAgICAgJEFjdGlvbk51bWJlciA9ICRTZWxmLT5fQ3JlYXRlTmV3QWN0aW9uTnVtYmVyKCVQYXJhbSk7CiAgICB9CgogICAgIyBhZGQgbmV3IGFjdGlvbiBuYW1lIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmRpdGlvbl9hY3Rpb24gJwogICAgICAgICAgICAuICcoY29uZGl0aW9uX2lkLCBhY3Rpb25fbnVtYmVyLCBvYmplY3RfaWQsICcKICAgICAgICAgICAgLiAnYXR0cmlidXRlX2lkLCBvcGVyYXRvcl9pZCwgc2VsZWN0b3IsICcKICAgICAgICAgICAgLiAnIGFjdGlvbl92YWx1ZSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDb25kaXRpb25JRH0sIFwkQWN0aW9uTnVtYmVyLCBcJFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgXCRQYXJhbXtBdHRyaWJ1dGVJRH0sIFwkUGFyYW17T3BlcmF0b3JJRH0sIFwkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICAgICBcJFBhcmFte0FjdGlvblZhbHVlfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgbXkgJEFjdGlvbklEOwoKICAgICMgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIG9yYWNsZSBmb3Igd2hpY2ggYW4gZW1wdHkgc3RyaW5nIGFuZCBOVUxMIGlzIHRoZSBzYW1lIQogICAgaWYgKCAkU2VsZi0+e0RCVHlwZX0gZXEgJ29yYWNsZScgJiYgJFBhcmFte0FjdGlvblZhbHVlfSBlcSAnJyApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8gQU5EIGFjdGlvbl9udW1iZXIgPSA/IEFORCBvYmplY3RfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ0FORCBhdHRyaWJ1dGVfaWQgPSA/IEFORCBvcGVyYXRvcl9pZCA9ID8gQU5EIHNlbGVjdG9yID0gPyAnCiAgICAgICAgICAgICAgICAuICdBTkQgYWN0aW9uX3ZhbHVlIElTIE5VTEwnLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17Q29uZGl0aW9uSUR9LCBcJEFjdGlvbk51bWJlciwgXCRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICBcJFBhcmFte0F0dHJpYnV0ZUlEfSwgXCRQYXJhbXtPcGVyYXRvcklEfSwgXCRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZvciBhbGwgb3RoZXIgZGF0YWJhc2VzIEFORCBmb3Igb3JhY2xlIElGIHRoZSBhY3Rpb24gdmFsdWUgaXMgTk9UIGFuIGVtcHR5IHN0cmluZwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8gQU5EIGFjdGlvbl9udW1iZXIgPSA/IEFORCBvYmplY3RfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ0FORCBhdHRyaWJ1dGVfaWQgPSA/IEFORCBvcGVyYXRvcl9pZCA9ID8gQU5EIHNlbGVjdG9yID0gPyAnCiAgICAgICAgICAgICAgICAuICdBTkQgYWN0aW9uX3ZhbHVlID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDb25kaXRpb25JRH0sIFwkQWN0aW9uTnVtYmVyLCBcJFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlSUR9LCBcJFBhcmFte09wZXJhdG9ySUR9LCBcJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17QWN0aW9uVmFsdWV9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgY3JlYXRlZCBhY3Rpb24KICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFjdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFjdGlvbiBjb3VsZCBiZSBhZGRlZAogICAgaWYgKCAhJEFjdGlvbklEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQWN0aW9uQWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnQWN0aW9uTGlzdDo6Q29uZGl0aW9uSUQ6OicgLiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgKTsKCiAgICAjIHRyaWdnZXIgQWN0aW9uQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uQWRkUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBY3Rpb25JRDsKfQoKPWhlYWQyIEFjdGlvblVwZGF0ZSgpCgpVcGRhdGUgYSBjb25kaXRpb24gYWN0aW9uLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uVXBkYXRlKAogICAgICAgIEFjdGlvbklEICAgICA9PiAxMjM0LAogICAgICAgIEFjdGlvbk51bWJlciA9PiAxLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBPYmplY3RJRCAgICAgPT4gMjM0LCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQXR0cmlidXRlSUQgID0+IDM0NSwgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9wZXJhdG9ySUQgICA9PiA0NTYsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTZWxlY3RvciAgICAgPT4gMTIzNCcsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWN0aW9uVmFsdWUgID0+ICdyZWplY3RlZCcsICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQWN0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY3Rpb24KICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgYWN0aW9uCiAgICByZXR1cm4gaWYgISRBY3Rpb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBBY3Rpb25VcGRhdGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvblVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWFwIHVwZGF0ZSBhdHRyaWJ1dGVzIHRvIGNvbHVtbiBuYW1lcwogICAgbXkgJUF0dHJpYnV0ZSA9ICgKICAgICAgICBBY3Rpb25OdW1iZXIgPT4gJ2FjdGlvbl9udW1iZXInLAogICAgICAgIE9iamVjdElEICAgICA9PiAnb2JqZWN0X2lkJywKICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gJ2F0dHJpYnV0ZV9pZCcsCiAgICAgICAgT3BlcmF0b3JJRCAgID0+ICdvcGVyYXRvcl9pZCcsCiAgICAgICAgU2VsZWN0b3IgICAgID0+ICdzZWxlY3RvcicsCiAgICAgICAgQWN0aW9uVmFsdWUgID0+ICdhY3Rpb25fdmFsdWUnLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgYWN0aW9uCiAgICBteSAkU1FMID0gJ1VQREFURSBjb25kaXRpb25fYWN0aW9uIFNFVCAnOwogICAgbXkgQEJpbmQ7CgogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJUF0dHJpYnV0ZSApIHsKCiAgICAgICAgIyBwcmVzZXJ2ZSB0aGUgb2xkIHZhbHVlLCB3aGVuIHRoZSBjb2x1bW4gaXNuJ3QgaW4gZnVuY3Rpb24gcGFyYW1ldGVycwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFleGlzdHMgJFBhcmFteyRBdHRyaWJ1dGV9OwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFkZWZpbmVkICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBzZXQgY29uZGl0aW9uIElEIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIG9mIHByZXZpb3VzIGxvb3AKICAgICRTUUwgLj0gJyBjb25kaXRpb25faWQgPSBjb25kaXRpb25faWQgJzsKCiAgICAjIHNldCBtYXRjaGluZyBvZiBTUUwgc3RhdGVtZW50CiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8nOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBY3Rpb25JRH07CgogICAgIyB1cGRhdGUgYWN0aW9uCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ0FjdGlvbkxpc3Q6OkNvbmRpdGlvbklEOjonIC4gJEFjdGlvbi0+e0NvbmRpdGlvbklEfSwKICAgICAgICAnQWN0aW9uR2V0OjonIC4gJFBhcmFte0FjdGlvbklEfSwKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBBY3Rpb25VcGRhdGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBY3Rpb25VcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBPbGRBY3Rpb25EYXRhID0+ICRBY3Rpb24sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQWN0aW9uR2V0KCkKCkdldCBhIGNvbmRpdGlvbiBhY3Rpb24gZm9yIGEgZ2l2ZW4gYWN0aW9uIGlkLgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugb2YgdGhlIGFjdGlvbiBkYXRhLgoKICAgIG15ICRDb25kaXRpb25BY3Rpb25SZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJENvbmRpdGlvbkFjdGlvbntBY3Rpb25JRH0KICAgICRDb25kaXRpb25BY3Rpb257Q29uZGl0aW9uSUR9CiAgICAkQ29uZGl0aW9uQWN0aW9ue0FjdGlvbk51bWJlcn0KICAgICRDb25kaXRpb25BY3Rpb257T2JqZWN0SUR9CiAgICAkQ29uZGl0aW9uQWN0aW9ue0F0dHJpYnV0ZUlEfQogICAgJENvbmRpdGlvbkFjdGlvbntPcGVyYXRvcklEfQogICAgJENvbmRpdGlvbkFjdGlvbntTZWxlY3Rvcn0KICAgICRDb25kaXRpb25BY3Rpb257QWN0aW9uVmFsdWV9Cgo9Y3V0CgpzdWIgQWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEFjdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0FjdGlvbkdldDo6JyAuICRQYXJhbXtBY3Rpb25JRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25kaXRpb25faWQsIGFjdGlvbl9udW1iZXIsIG9iamVjdF9pZCwgJwogICAgICAgICAgICAuICdhdHRyaWJ1dGVfaWQsIG9wZXJhdG9yX2lkLCBzZWxlY3RvciwgYWN0aW9uX3ZhbHVlICcKICAgICAgICAgICAgLiAnRlJPTSBjb25kaXRpb25fYWN0aW9uIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0FjdGlvbklEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUFjdGlvbkRhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBY3Rpb25EYXRhe0FjdGlvbklEfSAgICAgPSAkUm93WzBdOwogICAgICAgICRBY3Rpb25EYXRhe0NvbmRpdGlvbklEfSAgPSAkUm93WzFdOwogICAgICAgICRBY3Rpb25EYXRhe0FjdGlvbk51bWJlcn0gPSAkUm93WzJdOwogICAgICAgICRBY3Rpb25EYXRhe09iamVjdElEfSAgICAgPSAkUm93WzNdOwogICAgICAgICRBY3Rpb25EYXRhe0F0dHJpYnV0ZUlEfSAgPSAkUm93WzRdOwogICAgICAgICRBY3Rpb25EYXRhe09wZXJhdG9ySUR9ICAgPSAkUm93WzVdOwogICAgICAgICRBY3Rpb25EYXRhe1NlbGVjdG9yfSAgICAgPSAkUm93WzZdOwoKICAgICAgICAjIHRoaXMgaXMgaW1wb3J0YW50IGZvciBvcmFjbGUgZm9yIHdoaWNoIGFuIGVtcHR5IHN0cmluZyBhbmQgTlVMTCBpcyB0aGUgc2FtZSEKICAgICAgICAkQWN0aW9uRGF0YXtBY3Rpb25WYWx1ZX0gPSAkUm93WzddIC8vICcnOwogICAgfQoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISVBY3Rpb25EYXRhICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQWN0aW9uSUQgJFBhcmFte0FjdGlvbklEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVBY3Rpb25EYXRhLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXCVBY3Rpb25EYXRhOwp9Cgo9aGVhZDIgQWN0aW9uTGlzdCgpCgpSZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2YgYWxsIGNvbmRpdGlvbiBhY3Rpb24KaWRzIGZvciBhIGdpdmVuIENvbmRpdGlvbklEIGFzIGFycmF5IHJlZmVyZW5jZS4KCiAgICBteSAkQ29uZGl0aW9uQWN0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uTGlzdCgKICAgICAgICBDb25kaXRpb25JRCA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnQWN0aW9uTGlzdDo6Q29uZGl0aW9uSUQ6OicgLiAkUGFyYW17Q29uZGl0aW9uSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmRpdGlvbl9hY3Rpb24gJwogICAgICAgICAgICAuICdXSEVSRSBjb25kaXRpb25faWQgPSA/ICcKICAgICAgICAgICAgLiAnT1JERVIgQlkgYWN0aW9uX251bWJlciBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBBY3Rpb25MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBBY3Rpb25MaXN0LCAkUm93WzBdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBBY3Rpb25MaXN0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXEBBY3Rpb25MaXN0Owp9Cgo9aGVhZDIgQWN0aW9uRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gYWN0aW9uLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uRGVsZXRlKAogICAgICAgIEFjdGlvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQWN0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY3Rpb24KICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgYWN0aW9uCiAgICByZXR1cm4gaWYgISRBY3Rpb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBBY3Rpb25EZWxldGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBhY3Rpb24gZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBY3Rpb25JRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQWN0aW9uTGlzdDo6Q29uZGl0aW9uSUQ6OicgLiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgICdBY3Rpb25HZXQ6OicgLiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIEFjdGlvbkRlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFjdGlvbkRlbGV0ZUFsbCgpCgpEZWxldGVzIGFsbCBjb25kaXRpb24gYWN0aW9ucyBmb3IgYSBnaXZlbiBjb25kaXRpb24gaWQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25EZWxldGVBbGwoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvbkRlbGV0ZUFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBmb3IgZXZlbnQgaGFuZGxlcgogICAgbXkgJENvbmRpdGlvbiA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIGdldCBhbGwgYWN0aW9ucyBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBpZAogICAgbXkgJEFjdGlvbklEc1JlZiA9ICRTZWxmLT5BY3Rpb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdHJpZ2dlciBBY3Rpb25EZWxldGVBbGxQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZUFsbFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBhY3Rpb25zIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2FjdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdBY3Rpb25MaXN0OjpDb25kaXRpb25JRDo6JyAuICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBpZiAoICRBY3Rpb25JRHNSZWYgJiYgQHskQWN0aW9uSURzUmVmfSApIHsKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggQHskQWN0aW9uSURzUmVmfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAnQWN0aW9uR2V0OjonIC4gJEFjdGlvbklELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgQWN0aW9uRGVsZXRlQWxsUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uRGVsZXRlQWxsUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQWN0aW9uRXhlY3V0ZSgpCgpSZXR1cm5zIHRoZSBzdWNjZXNzIHZhbHVlIG9mIHRoZSBleGVjdXRpb24gb2YgYW4gYWN0aW9uLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uRXhlY3V0ZSgKICAgICAgICBBY3Rpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBY3Rpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFjdGlvbiBjb250ZW50CiAgICBteSAkQWN0aW9uID0gJFNlbGYtPkFjdGlvbkdldCgKICAgICAgICBBY3Rpb25JRCA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGFjdGlvbiBjb250ZW50CiAgICByZXR1cm4gaWYgISRBY3Rpb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgZ2V0IGFjdGlvbiBhdHRyaWJ1dGVzCiAgICBteSAkQWN0aW9uRGF0YSA9ICRTZWxmLT5fQWN0aW9uRXhlY3V0ZUluaXQoCiAgICAgICAgQWN0aW9uID0+ICRBY3Rpb24sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGFjdGlvbiBhdHRyaWJ1dGVzCiAgICByZXR1cm4gaWYgISRBY3Rpb25EYXRhOwoKICAgICMgZG8gbm90IGV4ZWN1dGUgJ2xvY2snIGFjdGlvbnMsIHRoZXkgYXJlIHBhc3NpdmUhCiAgICBteSBAT21pdEFjdGlvbnMgPSBxdyggbG9jayApOwogICAgcmV0dXJuIDAgaWYgZ3JlcCB7ICRBY3Rpb25EYXRhLT57T3BlcmF0b3J9LT57TmFtZX0gZXEgJF8gfSBAT21pdEFjdGlvbnM7CgogICAgIyB0cmlnZ2VyIEFjdGlvbkV4ZWN1dGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkV4ZWN1dGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDb25kaXRpb259LAogICAgICAgICAgICBDb25kaXRpb25OYW1lID0+ICRDb25kaXRpb24tPntOYW1lfSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgbmFtZQogICAgbXkgJE9iamVjdE5hbWUgPSAkQWN0aW9uRGF0YS0+e09iamVjdH0tPntOYW1lfTsKCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJEFjdGlvbk9iamVjdERhdGEgPSAkU2VsZi0+T2JqZWN0RGF0YUdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIE9iamVjdE5hbWUgID0+ICRPYmplY3ROYW1lLAogICAgICAgIFNlbGVjdG9yICAgID0+ICRBY3Rpb24tPntTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGFjdGlvbiBvYmplY3QgZGF0YQogICAgIyBubyBuZWVkIHRvIGV4ZWN1dGUgb3BlcmF0b3IgaWYgaXQgaXMgYW4gZW1wdHkgYXJyYXkgcmVmCiAgICBpZiAoCiAgICAgICAgISRBY3Rpb25PYmplY3REYXRhCiAgICAgICAgfHwgcmVmICRBY3Rpb25PYmplY3REYXRhIG5lICdBUlJBWScKICAgICAgICB8fCByZWYgJEFjdGlvbk9iamVjdERhdGEgZXEgJ0FSUkFZJyAmJiAhQHskQWN0aW9uT2JqZWN0RGF0YX0KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3IgJE9iamVjdE5hbWUgKCRBY3Rpb24tPntTZWxlY3Rvcn0pIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgYXR0cmlidXRlIHR5cGUKICAgIG15ICRBdHRyaWJ1dGVUeXBlID0gJEFjdGlvbkRhdGEtPntBdHRyaWJ1dGV9LT57TmFtZX07CgogICAgIyBjaGVjayBhdHRyaWJ1dGUgdHlwZQogICAgaWYgKCAhJEF0dHJpYnV0ZVR5cGUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBhdHRyaWJ1dGUgJE9iamVjdE5hbWUgKCRBY3Rpb24tPntTZWxlY3Rvcn0pIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBmb3Igb2JqZWN0IGF0dHJpYnV0ZQogICAgZm9yIG15ICRBY3Rpb25PYmplY3QgKCBAeyRBY3Rpb25PYmplY3REYXRhfSApIHsKICAgICAgICBpZiAoICFleGlzdHMgJEFjdGlvbk9iamVjdC0+eyRBdHRyaWJ1dGVUeXBlfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG9iamVjdCBhdHRyaWJ1dGUgZm9yICRPYmplY3ROYW1lICgkQXR0cmlidXRlVHlwZSkgZm91bmQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSBvcGVyYXRvciB2YWx1ZXMKICAgIG15ICVPcGVyYXRvckV4ZWN1dGUgPSAoCiAgICAgICAgT3BlcmF0b3JOYW1lID0+ICRBY3Rpb25EYXRhLT57T3BlcmF0b3J9LT57TmFtZX0sCiAgICAgICAgT2JqZWN0RGF0YSAgID0+ICRBY3Rpb25PYmplY3REYXRhLAogICAgICAgIE9iamVjdE5hbWUgICA9PiAkT2JqZWN0TmFtZSwKICAgICAgICBTZWxlY3RvciAgICAgPT4gJEFjdGlvbi0+e1NlbGVjdG9yfSwKICAgICAgICBBdHRyaWJ1dGUgICAgPT4gJEF0dHJpYnV0ZVR5cGUsCiAgICAgICAgQWN0aW9uVmFsdWUgID0+ICRBY3Rpb24tPntBY3Rpb25WYWx1ZX0sCiAgICAgICAgQWN0aW9uSUQgICAgID0+ICRBY3Rpb24tPntBY3Rpb25JRH0sCiAgICApOwoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aW9ucyBleGVjdXRpb24KICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+T3BlcmF0b3JFeGVjdXRlKAogICAgICAgICVPcGVyYXRvckV4ZWN1dGUsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBuaWNlIGFjdGlvbiByZXN1bHQKICAgIG15ICRBY3Rpb25SZXN1bHQgPSAoJFJlc3VsdCkgPyAnc3VjY2Vzc2Z1bGx5JyA6ICd1bnN1Y2Nlc3NmdWxseSc7CgogICAgIyB0cmlnZ2VyIEFjdGlvbkV4ZWN1dGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBY3Rpb25FeGVjdXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENvbmRpdGlvbn0sCiAgICAgICAgICAgIENvbmRpdGlvbk5hbWUgPT4gJENvbmRpdGlvbi0+e05hbWV9LAogICAgICAgICAgICAlT3BlcmF0b3JFeGVjdXRlLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgQWN0aW9uUmVzdWx0ID0+ICRBY3Rpb25SZXN1bHQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aW9ucyBleGVjdXRpb24KICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfQWN0aW9uRXhlY3V0ZUluaXQoKQoKUmV0dXJucyBvYmplY3QsIGF0dHJpYnV0ZSBhbmQgb3BlcmF0b3Igb2YgYSBnaXZlbiBhY3Rpb24uCgogICAgbXkgJEFjdGlvbkRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5fQWN0aW9uRXhlY3V0ZUluaXQoCiAgICAgICAgQWN0aW9uID0+ICRBY3Rpb25SZWYsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9BY3Rpb25FeGVjdXRlSW5pdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZXh0cmFjdCBhY3Rpb24KICAgIG15ICRBY3Rpb24gPSAkUGFyYW17QWN0aW9ufTsKCiAgICAjIGRlY2xhcmUgYWN0aW9uIGRhdGEKICAgIG15ICVBY3Rpb25EYXRhOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICAkQWN0aW9uRGF0YXtPYmplY3R9ID0gJFNlbGYtPk9iamVjdEdldCgKICAgICAgICBPYmplY3RJRCA9PiAkQWN0aW9uLT57T2JqZWN0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBvYmplY3QgZGF0YQogICAgaWYgKCAhJEFjdGlvbkRhdGF7T2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT2JqZWN0JyB3aXRoIElEICckQWN0aW9uLT57T2JqZWN0SUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGF0dHJpYnV0ZSBkYXRhCiAgICAkQWN0aW9uRGF0YXtBdHRyaWJ1dGV9ID0gJFNlbGYtPkF0dHJpYnV0ZUdldCgKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkQWN0aW9uLT57QXR0cmlidXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBhdHRyaWJ1dGUgZGF0YQogICAgaWYgKCAhJEFjdGlvbkRhdGF7QXR0cmlidXRlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnQXR0cmlidXRlJyB3aXRoIElEICckQWN0aW9uLT57QXR0cmlidXRlSUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9wZXJhdG9yIGRhdGEKICAgICRBY3Rpb25EYXRhe09wZXJhdG9yfSA9ICRTZWxmLT5PcGVyYXRvckdldCgKICAgICAgICBPcGVyYXRvcklEID0+ICRBY3Rpb24tPntPcGVyYXRvcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBvcGVyYXRvciBkYXRhCiAgICBpZiAoICEkQWN0aW9uRGF0YXtPcGVyYXRvcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWx1ZSBmb3IgJ09wZXJhdG9yJyB3aXRoIElEICckQWN0aW9uLT57T3BlcmF0b3JJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIFwlQWN0aW9uRGF0YTsKfQoKPWhlYWQyIF9DcmVhdGVOZXdBY3Rpb25OdW1iZXIoKQoKQ3JlYXRlIGEgbmV3IHVudXNlZCBhY3Rpb24gbnVtYmVyIGZvciB0aGUgZ2l2ZW4gY29uZGl0aW9uLgpUaGUgaGlnaGVzdCBjdXJyZW50IGFjdGlvbiBudW1iZXIgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaXMKbG9va2VkIHVwIGFuZCBpbmNyZW1lbnRlZCBieSBvbmUuCgogICAgbXkgJEFjdGlvbk51bWJlciA9ICRDb25kaXRpb25PYmplY3QtPl9DcmVhdGVOZXdBY3Rpb25OdW1iZXIoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfQ3JlYXRlTmV3QWN0aW9uTnVtYmVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25kaXRpb25JRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmRpdGlvbklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGxhcmdlc3QgYWN0aW9uIG51bWJlcgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBNQVgoYWN0aW9uX251bWJlcikgJwogICAgICAgICAgICAuICdGUk9NIGNvbmRpdGlvbl9hY3Rpb24gJwogICAgICAgICAgICAuICdXSEVSRSBjb25kaXRpb25faWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZGl0aW9uSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0LCBkZWZhdWx0IHRvIDAgd2hlbiB0aGVyZSBhcmUgbm8gYWN0aW9ucyB5ZXQKICAgIG15ICRBY3Rpb25OdW1iZXI7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBY3Rpb25OdW1iZXIgPSAkUm93WzBdOwogICAgfQogICAgJEFjdGlvbk51bWJlciB8fD0gMDsKCiAgICAjIGluY3JlbWVudCBudW1iZXIgdG8gZ2V0IGEgbm9uLWV4aXN0ZW50IGFjdGlvbiBudW1iZXIKICAgICRBY3Rpb25OdW1iZXIrKzsKCiAgICByZXR1cm4gJEFjdGlvbk51bWJlcjsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0F0dHJpYnV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBdHRyaWJ1dGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkF0dHJpYnV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QXR0cmlidXRlIC0gY29uZGl0aW9uIGF0dHJpYnV0ZSBsaWIKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgQXR0cmlidXRlQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gYXR0cmlidXRlLgoKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUFkZCgKICAgICAgICBOYW1lICAgPT4gJ0F0dHJpYnV0ZU5hbWUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBsb29rdXAgd2l0aCBnaXZlbiBuYW1lIGZvciBjaGVja3MKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRTZWxmLT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgYXR0cmlidXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkQXR0cmlidXRlSUQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbiBhdHRyaWJ1dGUgKCRQYXJhbXtOYW1lfSkgYWxyZWFkeSBleGlzdHMhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBuZXcgYXR0cmlidXRlIG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX2F0dHJpYnV0ZSAnCiAgICAgICAgICAgIC4gJyhuYW1lKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICApOwoKICAgICMgZ2V0IGlkIG9mIGNyZWF0ZWQgYXR0cmlidXRlCiAgICAkQXR0cmlidXRlSUQgPSAkU2VsZi0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGF0dHJpYnV0ZSBjb3VsZCBiZSBhZGRlZAogICAgaWYgKCAhJEF0dHJpYnV0ZUlEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXR0cmlidXRlQWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnQXR0cmlidXRlTGlzdCcsCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlSUQ7Cn0KCj1oZWFkMiBBdHRyaWJ1dGVVcGRhdGUoKQoKVXBkYXRlIGEgY29uZGl0aW9uIGF0dHJpYnV0ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZVVwZGF0ZSgKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAxMjM0LAogICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdBdHRyaWJ1dGVOYW1lJywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQXR0cmlidXRlSUQgTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGF0dHJpYnV0ZSBkYXRhCiAgICBteSAkQXR0cmlidXRlRGF0YSA9ICRTZWxmLT5BdHRyaWJ1dGVHZXQoCiAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBhdHRyaWJ1dGUgZGF0YQogICAgaWYgKCAhJEF0dHJpYnV0ZURhdGEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRyaWJ1dGVVcGRhdGUgb2YgJFBhcmFte0F0dHJpYnV0ZUlEfSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBhdHRyaWJ1dGUgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmRpdGlvbl9hdHRyaWJ1dGUgJwogICAgICAgICAgICAuICdTRVQgbmFtZSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdBdHRyaWJ1dGVMaXN0JywKICAgICAgICAnQXR0cmlidXRlR2V0OjpBdHRyaWJ1dGVJRDo6JyAuICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgJ0F0dHJpYnV0ZUxvb2t1cDo6QXR0cmlidXRlSUQ6OicgLiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICdBdHRyaWJ1dGVMb29rdXA6Ok5hbWU6OicgLiAkQXR0cmlidXRlRGF0YS0+e05hbWV9LCAgICAjIHVzZSB0aGUgb2xkIG5hbWUKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXR0cmlidXRlR2V0KCkKCkdldCBhIGNvbmRpdGlvbiBhdHRyaWJ1dGUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIGlkLgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugb2YgdGhlIGF0dHJpYnV0ZSBkYXRhLgoKICAgIG15ICRDb25kaXRpb25BdHRyaWJ1dGVSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVHZXQoCiAgICAgICAgQXR0cmlidXRlSUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJENvbmRpdGlvbkF0dHJpYnV0ZXtBdHRyaWJ1dGVJRH0KICAgICRDb25kaXRpb25BdHRyaWJ1dGV7TmFtZX0KCj1jdXQKCnN1YiBBdHRyaWJ1dGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQXR0cmlidXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnQXR0cmlidXRlR2V0OjpBdHRyaWJ1dGVJRDo6JyAuICRQYXJhbXtBdHRyaWJ1dGVJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjb25kaXRpb25fYXR0cmlidXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0F0dHJpYnV0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUF0dHJpYnV0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBdHRyaWJ1dGVEYXRhe0F0dHJpYnV0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJEF0dHJpYnV0ZURhdGF7TmFtZX0gICAgICAgID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElQXR0cmlidXRlRGF0YSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUlEICRQYXJhbXtBdHRyaWJ1dGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlQXR0cmlidXRlRGF0YSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFwlQXR0cmlidXRlRGF0YTsKfQoKPWhlYWQyIEF0dHJpYnV0ZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNvbmRpdGlvbiBhdHRyaWJ1dGUuIElmIGFuIGF0dHJpYnV0ZQppZCBpcyBnaXZlbiwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBJZiB0aGUgbmFtZSBvZiB0aGUKYXR0cmlidXRlIGlzIGdpdmVuLCB0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgQXR0cmlidXRlSUQgPT4gNDMyMSwKICAgICk7CgogICAgbXkgJEF0dHJpYnV0ZUlEID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnQXR0cmlidXRlTmFtZScsCiAgICApOwoKPWN1dAoKc3ViIEF0dHJpYnV0ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXR0cmlidXRlSUQgb3IgTmFtZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBib3RoIHBhcmFtZXRlcnMgYXJlIG5vdCBnaXZlbgogICAgaWYgKCAhJFBhcmFte0F0dHJpYnV0ZUlEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBdHRyaWJ1dGVJRCBvciBOYW1lIC0gbm9uZSBpcyBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgQXR0cmlidXRlSUQgaXMgYSBudW1iZXIKICAgIGlmICggJFBhcmFte0F0dHJpYnV0ZUlEfSAmJiAkUGFyYW17QXR0cmlidXRlSUR9ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXR0cmlidXRlSUQgbXVzdCBiZSBhIG51bWJlciEgKEF0dHJpYnV0ZUlEOiAkUGFyYW17QXR0cmlidXRlSUR9KSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENhY2hlS2V5OwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50cwogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgJENhY2hlS2V5ID0gJ0F0dHJpYnV0ZUxvb2t1cDo6QXR0cmlidXRlSUQ6OicgLiAkUGFyYW17QXR0cmlidXRlSUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBjb25kaXRpb25fYXR0cmlidXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBdHRyaWJ1dGVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICAkQ2FjaGVLZXkgPSAnQXR0cmlidXRlTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2F0dHJpYnV0ZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9va3VwID0gJyc7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb29rdXAgPSAkUm93WzBdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gJExvb2t1cCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICRMb29rdXA7Cn0KCj1oZWFkMiBBdHRyaWJ1dGVMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBjb25kaXRpb24gYXR0cmlidXRlcyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRDb25kaXRpb25BdHRyaWJ1dGVzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZW50cmllcyBsaWtlIHRoaXM6CgogICAgJENvbmRpdGlvbkF0dHJpYnV0ZXtBdHRyaWJ1dGVJRH0gPSAnQXR0cmlidXRlTmFtZScKCj1jdXQKCnN1YiBBdHRyaWJ1dGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnQXR0cmlidXRlTGlzdCc7CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gY29uZGl0aW9uX2F0dHJpYnV0ZScsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUF0dHJpYnV0ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBdHRyaWJ1dGVMaXN0eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVBdHRyaWJ1dGVMaXN0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXCVBdHRyaWJ1dGVMaXN0Owp9Cgo9aGVhZDIgQXR0cmlidXRlRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gYXR0cmlidXRlLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlRGVsZXRlKAogICAgICAgIEF0dHJpYnV0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQXR0cmlidXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cCBhdHRyaWJ1dGUgbmFtZQogICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkU2VsZi0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBhdHRyaWJ1dGUgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fYXR0cmlidXRlICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBdHRyaWJ1dGVJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQXR0cmlidXRlTGlzdCcsCiAgICAgICAgJ0F0dHJpYnV0ZUdldDo6QXR0cmlidXRlSUQ6OicgLiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICdBdHRyaWJ1dGVMb29rdXA6OkF0dHJpYnV0ZUlEOjonIC4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAnQXR0cmlidXRlTG9va3VwOjpOYW1lOjonIC4gJEF0dHJpYnV0ZU5hbWUsCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0V4cHJlc3Npb24ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogRXhwcmVzc2lvbi5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbiAtIGNvbmRpdGlvbiBleHByZXNzaW9uIGxpYgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBFeHByZXNzaW9uQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gZXhwcmVzc2lvbi4KCiAgICBteSAkRXhwcmVzc2lvbklEID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkFkZCgKICAgICAgICBDb25kaXRpb25JRCAgPT4gMTIzLAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsCiAgICAgICAgQXR0cmlidXRlSUQgID0+IDM0NSwKICAgICAgICBPcGVyYXRvcklEICAgPT4gNDU2LAogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0LAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAncmVqZWN0ZWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHByZXNzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIE9iamVjdElEIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSAnQ29tcGFyZVZhbHVlJyBpbiBhIHNwZWNpYWwgd2F5CiAgICBpZiAoICFleGlzdHMgJFBhcmFte0NvbXBhcmVWYWx1ZX0gfHwgIWRlZmluZWQgJFBhcmFte0NvbXBhcmVWYWx1ZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbXBhcmVWYWx1ZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBmb3IgZXZlbnQgaGFuZGxlcgogICAgbXkgJENvbmRpdGlvbiA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvbkFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRXhwcmVzc2lvbkFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIG5ldyBleHByZXNzaW9uIG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAuICcoY29uZGl0aW9uX2lkLCBvYmplY3RfaWQsIGF0dHJpYnV0ZV9pZCwgJwogICAgICAgICAgICAuICdvcGVyYXRvcl9pZCwgc2VsZWN0b3IsIGNvbXBhcmVfdmFsdWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q29uZGl0aW9uSUR9LCBcJFBhcmFte09iamVjdElEfSwgXCRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17T3BlcmF0b3JJRH0sICBcJFBhcmFte1NlbGVjdG9yfSwgXCRQYXJhbXtDb21wYXJlVmFsdWV9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICBteSAkRXhwcmVzc2lvbklEOwoKICAgICMgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIG9yYWNsZSBmb3Igd2hpY2ggYW4gZW1wdHkgc3RyaW5nIGFuZCBOVUxMIGlzIHRoZSBzYW1lIQogICAgaWYgKCAkU2VsZi0+e0RCVHlwZX0gZXEgJ29yYWNsZScgJiYgJFBhcmFte0NvbXBhcmVWYWx1ZX0gZXEgJycgKSB7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgY29uZGl0aW9uX2lkID0gPyBBTkQgb2JqZWN0X2lkID0gPyBBTkQgYXR0cmlidXRlX2lkID0gPyAnCiAgICAgICAgICAgICAgICAuICdBTkQgb3BlcmF0b3JfaWQgPSA/IEFORCBzZWxlY3RvciA9ID8gQU5EIGNvbXBhcmVfdmFsdWUgSVMgTlVMTCcsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDb25kaXRpb25JRH0sIFwkUGFyYW17T2JqZWN0SUR9LCBcJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17T3BlcmF0b3JJRH0sIFwkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmb3IgYWxsIG90aGVyIGRhdGFiYXNlcyBBTkQgZm9yIG9yYWNsZSBJRiB0aGUgY29tcGFyZSB2YWx1ZSBpcyBOT1QgYW4gZW1wdHkgc3RyaW5nCiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmRpdGlvbl9leHByZXNzaW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8gQU5EIG9iamVjdF9pZCA9ID8gQU5EIGF0dHJpYnV0ZV9pZCA9ID8gJwogICAgICAgICAgICAgICAgLiAnQU5EIG9wZXJhdG9yX2lkID0gPyBBTkQgc2VsZWN0b3IgPSA/IEFORCBjb21wYXJlX3ZhbHVlID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDb25kaXRpb25JRH0sIFwkUGFyYW17T2JqZWN0SUR9LCBcJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17T3BlcmF0b3JJRH0sICBcJFBhcmFte1NlbGVjdG9yfSwgXCRQYXJhbXtDb21wYXJlVmFsdWV9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgY3JlYXRlZCBleHByZXNzaW9uCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRFeHByZXNzaW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgaWYgZXhwcmVzc2lvbiBjb3VsZCBiZSBhZGRlZAogICAgaWYgKCAhJEV4cHJlc3Npb25JRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4cHJlc3Npb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdFeHByZXNzaW9uTGlzdDo6Q29uZGl0aW9uSUQ6OicgLiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgKTsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvbkFkZFBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25BZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEV4cHJlc3Npb25JRDsKfQoKPWhlYWQyIEV4cHJlc3Npb25VcGRhdGUoKQoKVXBkYXRlIGEgY29uZGl0aW9uIGV4cHJlc3Npb24uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uVXBkYXRlKAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAxMjM0LAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gMzQ1LCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgT3BlcmF0b3JJRCAgID0+IDQ1NiwgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0LCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ3JlamVjdGVkJywgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cHJlc3Npb25VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRXhwcmVzc2lvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb24gPSAkU2VsZi0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGV4cHJlc3Npb24KICAgIHJldHVybiBpZiAhJEV4cHJlc3Npb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkRXhwcmVzc2lvbi0+e0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvblVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRXhwcmVzc2lvblVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWFwIHVwZGF0ZSBhdHRyaWJ1dGVzIHRvIGNvbHVtbiBuYW1lcwogICAgbXkgJUF0dHJpYnV0ZSA9ICgKICAgICAgICBPYmplY3RJRCAgICAgPT4gJ29iamVjdF9pZCcsCiAgICAgICAgQXR0cmlidXRlSUQgID0+ICdhdHRyaWJ1dGVfaWQnLAogICAgICAgIE9wZXJhdG9ySUQgICA9PiAnb3BlcmF0b3JfaWQnLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAnc2VsZWN0b3InLAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnY29tcGFyZV92YWx1ZScsCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIHVwZGF0ZSBleHByZXNzaW9uCiAgICBteSAkU1FMID0gJ1VQREFURSBjb25kaXRpb25fZXhwcmVzc2lvbiBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZGVmaW5lZCAkUGFyYW17JEF0dHJpYnV0ZX07CgogICAgICAgICMgcGFyYW0gY2hlY2tpbmcgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBzbyB0aGlzIGlzIHNhZmUKICAgICAgICAkU1FMIC49ICIkQXR0cmlidXRleyRBdHRyaWJ1dGV9ID0gPywgIjsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFteyRBdHRyaWJ1dGV9OwogICAgfQoKICAgICMgc2V0IGNvbmRpdGlvbiBJRCB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBvZiBwcmV2aW91cyBsb29wCiAgICAkU1FMIC49ICcgY29uZGl0aW9uX2lkID0gY29uZGl0aW9uX2lkICc7CgogICAgIyBzZXQgbWF0Y2hpbmcgb2YgU1FMIHN0YXRlbWVudAogICAgJFNRTCAuPSAnV0hFUkUgaWQgPSA/JzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RXhwcmVzc2lvbklEfTsKCiAgICAjIHVwZGF0ZSBleHByZXNzaW9uCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ0V4cHJlc3Npb25MaXN0OjpDb25kaXRpb25JRDo6JyAuICRFeHByZXNzaW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgICdFeHByZXNzaW9uR2V0OjonIC4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvblVwZGF0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25VcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgT2xkRXhwcmVzc2lvbkRhdGEgPT4gJEV4cHJlc3Npb24sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRXhwcmVzc2lvbkdldCgpCgpHZXQgYSBjb25kaXRpb24gZXhwcmVzc2lvbiBmb3IgYSBnaXZlbiBleHByZXNzaW9uIGlkLgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugb2YgdGhlIGV4cHJlc3Npb24gZGF0YS4KCiAgICBteSAkQ29uZGl0aW9uRXhwcmVzc2lvblJlZiA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25HZXQoCiAgICAgICAgRXhwcmVzc2lvbklEID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntFeHByZXNzaW9uSUR9CiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntDb25kaXRpb25JRH0KICAgICRDb25kaXRpb25FeHByZXNzaW9ue09iamVjdElEfQogICAgJENvbmRpdGlvbkV4cHJlc3Npb257QXR0cmlidXRlSUR9CiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntPcGVyYXRvcklEfQogICAgJENvbmRpdGlvbkV4cHJlc3Npb257U2VsZWN0b3J9CiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntDb21wYXJlVmFsdWV9Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhFeHByZXNzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnRXhwcmVzc2lvbkdldDo6JyAuICRQYXJhbXtFeHByZXNzaW9uSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZGl0aW9uX2lkLCBvYmplY3RfaWQsIGF0dHJpYnV0ZV9pZCwgJwogICAgICAgICAgICAuICdvcGVyYXRvcl9pZCwgc2VsZWN0b3IsIGNvbXBhcmVfdmFsdWUgJwogICAgICAgICAgICAuICdGUk9NIGNvbmRpdGlvbl9leHByZXNzaW9uIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0V4cHJlc3Npb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVFeHByZXNzaW9uRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEV4cHJlc3Npb25EYXRhe0V4cHJlc3Npb25JRH0gPSAkUm93WzBdOwogICAgICAgICRFeHByZXNzaW9uRGF0YXtDb25kaXRpb25JRH0gID0gJFJvd1sxXTsKICAgICAgICAkRXhwcmVzc2lvbkRhdGF7T2JqZWN0SUR9ICAgICA9ICRSb3dbMl07CiAgICAgICAgJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZUlEfSAgPSAkUm93WzNdOwogICAgICAgICRFeHByZXNzaW9uRGF0YXtPcGVyYXRvcklEfSAgID0gJFJvd1s0XTsKICAgICAgICAkRXhwcmVzc2lvbkRhdGF7U2VsZWN0b3J9ICAgICA9ICRSb3dbNV07CgogICAgICAgICMgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIG9yYWNsZSBmb3Igd2hpY2ggYW4gZW1wdHkgc3RyaW5nIGFuZCBOVUxMIGlzIHRoZSBzYW1lIQogICAgICAgICRFeHByZXNzaW9uRGF0YXtDb21wYXJlVmFsdWV9ID0gJFJvd1s2XSAvLyAnJzsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElRXhwcmVzc2lvbkRhdGEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeHByZXNzaW9uSUQgJFBhcmFte0V4cHJlc3Npb25JRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRXhwcmVzc2lvbkRhdGEsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcJUV4cHJlc3Npb25EYXRhOwp9Cgo9aGVhZDIgRXhwcmVzc2lvbkxpc3QoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbmRpdGlvbiBleHByZXNzaW9uIGlkcyBmb3IKYSBnaXZlbiBDb25kaXRpb25JRCBhcyBhcnJheSByZWZlcmVuY2UuCgogICAgbXkgJENvbmRpdGlvbkV4cHJlc3Npb25JRHNSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uTGlzdCgKICAgICAgICBDb25kaXRpb25JRCA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cHJlc3Npb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0V4cHJlc3Npb25MaXN0OjpDb25kaXRpb25JRDo6JyAuICRQYXJhbXtDb25kaXRpb25JRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAuICdXSEVSRSBjb25kaXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25kaXRpb25JRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBARXhwcmVzc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEV4cHJlc3Npb25MaXN0LCAkUm93WzBdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBFeHByZXNzaW9uTGlzdCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIFxARXhwcmVzc2lvbkxpc3Q7Cn0KCj1oZWFkMiBFeHByZXNzaW9uRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gZXhwcmVzc2lvbi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25EZWxldGUoCiAgICAgICAgRXhwcmVzc2lvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhFeHByZXNzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBleHByZXNzaW9uCiAgICBteSAkRXhwcmVzc2lvbiA9ICRTZWxmLT5FeHByZXNzaW9uR2V0KAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAkUGFyYW17RXhwcmVzc2lvbklEfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXhwcmVzc2lvbgogICAgcmV0dXJuIGlmICEkRXhwcmVzc2lvbjsKCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRFeHByZXNzaW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBFeHByZXNzaW9uRGVsZXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdFeHByZXNzaW9uRGVsZXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY29uZGl0aW9uIGV4cHJlc3Npb24gZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fZXhwcmVzc2lvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17RXhwcmVzc2lvbklEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdFeHByZXNzaW9uTGlzdDo6Q29uZGl0aW9uSUQ6OicgLiAkRXhwcmVzc2lvbi0+e0NvbmRpdGlvbklEfSwKICAgICAgICAnRXhwcmVzc2lvbkdldDo6JyAuICRQYXJhbXtFeHByZXNzaW9uSUR9LAogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIEV4cHJlc3Npb25EZWxldGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdFeHByZXNzaW9uRGVsZXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRXhwcmVzc2lvbkRlbGV0ZUFsbCgpCgpEZWxldGVzIGFsbCBjb25kaXRpb24gZXhwcmVzc2lvbnMgZm9yIGEgZ2l2ZW4gY29uZGl0aW9uIGlkLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkRlbGV0ZUFsbCgKICAgICAgICBDb25kaXRpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbkRlbGV0ZUFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBmb3IgZXZlbnQgaGFuZGxlcgogICAgbXkgJENvbmRpdGlvbiA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIGdldCBhbGwgZXhwcmVzc2lvbnMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgIG15ICRFeHByZXNzaW9uSURzUmVmID0gJFNlbGYtPkV4cHJlc3Npb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdHJpZ2dlciBFeHByZXNzaW9uRGVsZXRlQWxsUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdFeHByZXNzaW9uRGVsZXRlQWxsUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY29uZGl0aW9uIGV4cHJlc3Npb25zIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAuICdXSEVSRSBjb25kaXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25kaXRpb25JRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnRXhwcmVzc2lvbkxpc3Q6OkNvbmRpdGlvbklEOjonIC4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGlmICggJEV4cHJlc3Npb25JRHNSZWYgJiYgQHskRXhwcmVzc2lvbklEc1JlZn0gKSB7CiAgICAgICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uSURzUmVmfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAnRXhwcmVzc2lvbkdldDo6JyAuICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBFeHByZXNzaW9uRGVsZXRlQWxsUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRXhwcmVzc2lvbkRlbGV0ZUFsbFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEV4cHJlc3Npb25NYXRjaCgpCgpSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24uCgogICAgbXkgJE1hdGNoID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgIEV4cHJlc3Npb25JRCAgICAgID0+IDEyMywKICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7IElUU01DaGFuZ2UgPT4gWyBDaGFuZ2VUaXRsZSwgQ2hhbmdlRGVzY3JpcHRpb24gXSB9LCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbk1hdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEV4cHJlc3Npb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGV4cHJlc3Npb24gY29udGVudAogICAgbXkgJEV4cHJlc3Npb24gPSAkU2VsZi0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGV4cHJlc3Npb24gY29udGVudAogICAgcmV0dXJuIGlmICEkRXhwcmVzc2lvbjsKCiAgICAjIGdldCBleHByZXNzaW9uIGF0dHJpYnV0ZXMKICAgIG15ICRFeHByZXNzaW9uRGF0YSA9ICRTZWxmLT5fRXhwcmVzc2lvbk1hdGNoSW5pdCgKICAgICAgICBFeHByZXNzaW9uID0+ICRFeHByZXNzaW9uLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXhwcmVzc2lvbiBhdHRyaWJ1dGVzCiAgICByZXR1cm4gaWYgISRFeHByZXNzaW9uRGF0YTsKCiAgICAjIGdldCBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgIG15ICRBdHRyaWJ1dGVzQ2hhbmdlZFR5cGU7CiAgICBteSBAQXR0cmlidXRlc0NoYW5nZWQ7CiAgICBpZiAoIGV4aXN0cyAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9ICYmIGRlZmluZWQgJFBhcmFte0F0dHJpYnV0ZXNDaGFuZ2VkfSApIHsKCiAgICAgICAgIyBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgICAgICBteSAlQXR0cmlidXRlQ2hhbmdlZDsKCiAgICAgICAgIyBjaGVjayBmb3IgcmVmZXJlbmNlIHR5cGUKICAgICAgICBpZiAoIHJlZiAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgJUF0dHJpYnV0ZUNoYW5nZWQgPSAleyAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9IH07CgogICAgICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdHlwZQogICAgICAgICAgICAkQXR0cmlidXRlc0NoYW5nZWRUeXBlID0gKCBrZXlzICVBdHRyaWJ1dGVDaGFuZ2VkIClbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciByZWZlcmVuY2UgdHlwZQogICAgICAgIGlmICggJEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZSAmJiByZWYgJEF0dHJpYnV0ZUNoYW5nZWR7JEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZX0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgY2hhbmdlZCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIEBBdHRyaWJ1dGVzQ2hhbmdlZCA9IEB7ICRBdHRyaWJ1dGVDaGFuZ2VkeyRBdHRyaWJ1dGVzQ2hhbmdlZFR5cGV9IH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRFeHByZXNzaW9uRGF0YS0+e09iamVjdH0tPntOYW1lfTsKCiAgICAjIGNoZWNrIGZvciBjaGFuZ2VkIGF0dHJpYnV0ZXMgdHlwZXMKICAgIGlmICggJEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZSAmJiAkQXR0cmlidXRlc0NoYW5nZWRUeXBlIG5lICRPYmplY3ROYW1lICkgewoKICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgdHlwZQogICAgbXkgJEF0dHJpYnV0ZVR5cGUgPSAkRXhwcmVzc2lvbkRhdGEtPntBdHRyaWJ1dGV9LT57TmFtZX07CgogICAgIyBjaGVjayBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzIGFuZCBhdmFpbGFibGUgYXR0cmlidXRlcyBvZiBleHByZXNzaW9uCiAgICBpZiAoICRBdHRyaWJ1dGVUeXBlICYmIEBBdHRyaWJ1dGVzQ2hhbmdlZCApIHsKCiAgICAgICAgIyBjaGVjayBmb3Igb3VyIGF0dHJpYnV0ZSBpbiBjaGFuZ2VkIGF0dHJpYnV0ZSBsaXN0CiAgICAgICAgbXkgQEF0dHJpYnV0ZUZvdW5kID0gZ3JlcCB7ICRfIGVxICRBdHRyaWJ1dGVUeXBlIH0gQEF0dHJpYnV0ZXNDaGFuZ2VkOwoKICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCiAgICAgICAgcmV0dXJuIGlmICFAQXR0cmlidXRlRm91bmQ7CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRFeHByZXNzaW9uT2JqZWN0RGF0YSA9ICRTZWxmLT5PYmplY3REYXRhR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRFeHByZXNzaW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIE9iamVjdE5hbWUgID0+ICRPYmplY3ROYW1lLAogICAgICAgIFNlbGVjdG9yICAgID0+ICRFeHByZXNzaW9uLT57U2VsZWN0b3J9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBleHByZXNzaW9uIG9iamVjdCBkYXRhCiAgICAjIG5vIG5lZWQgdG8gZXhlY3V0ZSBvcGVyYXRvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSByZWYKICAgIGlmICgKICAgICAgICAhJEV4cHJlc3Npb25PYmplY3REYXRhCiAgICAgICAgfHwgcmVmICRFeHByZXNzaW9uT2JqZWN0RGF0YSBuZSAnQVJSQVknCiAgICAgICAgfHwgcmVmICRFeHByZXNzaW9uT2JqZWN0RGF0YSBlcSAnQVJSQVknICYmICFAeyRFeHByZXNzaW9uT2JqZWN0RGF0YX0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgYXR0cmlidXRlIHR5cGUKICAgIGlmICggISRBdHRyaWJ1dGVUeXBlICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYXR0cmlidXRlICRPYmplY3ROYW1lICgkRXhwcmVzc2lvbi0+e1NlbGVjdG9yfSkgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBvYmplY3QgYXR0cmlidXRlCiAgICBmb3IgbXkgJEV4cHJlc3Npb25PYmplY3QgKCBAeyRFeHByZXNzaW9uT2JqZWN0RGF0YX0gKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRFeHByZXNzaW9uT2JqZWN0LT57JEF0dHJpYnV0ZVR5cGV9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGF0dHJpYnV0ZSBmb3IgJE9iamVjdE5hbWUgKCRBdHRyaWJ1dGVUeXBlKSBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbnMgZXhlY3V0aW9uCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPk9wZXJhdG9yRXhlY3V0ZSgKICAgICAgICBPcGVyYXRvck5hbWUgPT4gJEV4cHJlc3Npb25EYXRhLT57T3BlcmF0b3J9LT57TmFtZX0sCiAgICAgICAgQXR0cmlidXRlICAgID0+ICRBdHRyaWJ1dGVUeXBlLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAkRXhwcmVzc2lvbi0+e1NlbGVjdG9yfSwKICAgICAgICBPYmplY3REYXRhICAgPT4gJEV4cHJlc3Npb25PYmplY3REYXRhLAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkRXhwcmVzc2lvbi0+e0NvbXBhcmVWYWx1ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb25zIGV4ZWN1dGlvbgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9FeHByZXNzaW9uTWF0Y2hJbml0KCkKClJldHVybnMgb2JqZWN0LCBhdHRyaWJ1dGUgYW5kIG9wZXJhdG9yIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbi4KCiAgICBteSAkRXhwcmVzc2lvbkRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5fRXhwcmVzc2lvbk1hdGNoSW5pdCgKICAgICAgICBFeHByZXNzaW9uID0+ICRFeHByZXNzaW9uUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cHJlc3Npb25NYXRjaEluaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGV4dHJhY3QgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb24gPSAkUGFyYW17RXhwcmVzc2lvbn07CgogICAgIyBkZWNsYXJlIGV4cHJlc3Npb24gZGF0YQogICAgbXkgJUV4cHJlc3Npb25EYXRhOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICAkRXhwcmVzc2lvbkRhdGF7T2JqZWN0fSA9ICRTZWxmLT5PYmplY3RHZXQoCiAgICAgICAgT2JqZWN0SUQgPT4gJEV4cHJlc3Npb24tPntPYmplY3RJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIG9iamVjdCBkYXRhCiAgICBpZiAoICEkRXhwcmVzc2lvbkRhdGF7T2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT2JqZWN0JyB3aXRoIElEICckRXhwcmVzc2lvbi0+e09iamVjdElEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgZGF0YQogICAgJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZX0gPSAkU2VsZi0+QXR0cmlidXRlR2V0KAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRFeHByZXNzaW9uLT57QXR0cmlidXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBhdHRyaWJ1dGUgZGF0YQogICAgaWYgKCAhJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWx1ZSBmb3IgJ0F0dHJpYnV0ZScgd2l0aCBJRCAnJEV4cHJlc3Npb24tPntBdHRyaWJ1dGVJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3IgZGF0YQogICAgJEV4cHJlc3Npb25EYXRhe09wZXJhdG9yfSA9ICRTZWxmLT5PcGVyYXRvckdldCgKICAgICAgICBPcGVyYXRvcklEID0+ICRFeHByZXNzaW9uLT57T3BlcmF0b3JJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3Igb3BlcmF0b3IgZGF0YQogICAgaWYgKCAhJEV4cHJlc3Npb25EYXRhe09wZXJhdG9yfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT3BlcmF0b3InIHdpdGggSUQgJyRFeHByZXNzaW9uLT57T3BlcmF0b3JJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIFwlRXhwcmVzc2lvbkRhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBPYmplY3QucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0IC0gY29uZGl0aW9uIG9iamVjdCBsaWIKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgT2JqZWN0QWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gb2JqZWN0LgoKICAgIG15ICRDb25kaXRpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdEFkZCgKICAgICAgICBOYW1lICAgPT4gJ09iamVjdE5hbWUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBsb29rdXAgd2l0aCBnaXZlbiBuYW1lIGZvciBjaGVja3MKICAgIG15ICRPYmplY3RJRCA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgb2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkT2JqZWN0SUQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbiBvYmplY3QgKCRQYXJhbXtOYW1lfSkgYWxyZWFkeSBleGlzdHMhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBuZXcgb2JqZWN0IG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX29iamVjdCAnCiAgICAgICAgICAgIC4gJyhuYW1lKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICApOwoKICAgICMgZ2V0IGlkIG9mIGNyZWF0ZWQgb2JqZWN0CiAgICAkT2JqZWN0SUQgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIG9iamVjdCBjb3VsZCBiZSBhZGRlZAogICAgaWYgKCAhJE9iamVjdElEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2JqZWN0QWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnT2JqZWN0TGlzdCcsCiAgICApOwoKICAgIHJldHVybiAkT2JqZWN0SUQ7Cn0KCj1oZWFkMiBPYmplY3RVcGRhdGUoKQoKVXBkYXRlIGEgY29uZGl0aW9uIG9iamVjdC4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdFVwZGF0ZSgKICAgICAgICBPYmplY3RJRCA9PiAxMjM0LAogICAgICAgIE5hbWUgICAgID0+ICdOZXdPYmplY3ROYW1lJywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0SUQgTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT5PYmplY3RHZXQoCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBvYmplY3QgZGF0YQogICAgaWYgKCAhJE9iamVjdERhdGEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RVcGRhdGUgb2YgJFBhcmFte09iamVjdElEfSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBvYmplY3QgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmRpdGlvbl9vYmplY3QgJwogICAgICAgICAgICAuICdTRVQgbmFtZSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte09iamVjdElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdPYmplY3RMaXN0JywKICAgICAgICAnT2JqZWN0R2V0OjpPYmplY3RJRDo6JyAuICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgJ09iamVjdExvb2t1cDo6T2JqZWN0SUQ6OicgLiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICdPYmplY3RMb29rdXA6Ok5hbWU6OicgLiAkT2JqZWN0RGF0YS0+e05hbWV9LCAgICAjIHVzZSB0aGUgb2xkIG5hbWUKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgT2JqZWN0R2V0KCkKCkdldCBhIGNvbmRpdGlvbiBvYmplY3QgZm9yIGEgZ2l2ZW4gb2JqZWN0IGlkLgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugb2YgdGhlIG9iamVjdCBkYXRhLgoKICAgIG15ICRDb25kaXRpb25PYmplY3RSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RHZXQoCiAgICAgICAgT2JqZWN0SUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJENvbmRpdGlvbk9iamVjdC0+e09iamVjdElEfQogICAgJENvbmRpdGlvbk9iamVjdC0+e05hbWV9Cgo9Y3V0CgpzdWIgT2JqZWN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ09iamVjdEdldDo6T2JqZWN0SUQ6OicgLiAkUGFyYW17T2JqZWN0SUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gY29uZGl0aW9uX29iamVjdCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtPYmplY3RJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXtPYmplY3RJRH0gPSAkUm93WzBdOwogICAgICAgICRPYmplY3REYXRhe05hbWV9ICAgICA9ICRSb3dbMV07CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJU9iamVjdERhdGEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RJRCAkUGFyYW17T2JqZWN0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJU9iamVjdERhdGEsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcJU9iamVjdERhdGE7Cn0KCj1oZWFkMiBPYmplY3RMb29rdXAoKQoKVGhpcyBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3IgYSBjb25kaXRpb24gb2JqZWN0LiBJZiBhbiBvYmplY3QKaWQgaXMgZ2l2ZW4sIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG9iamVjdC4gSWYgdGhlIG5hbWUgb2YgdGhlCm9iamVjdCBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRPYmplY3ROYW1lID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TG9va3VwKAogICAgICAgIE9iamVjdElEID0+IDQzMjEsCiAgICApOwoKICAgIG15ICRPYmplY3RJRCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ09iamVjdE5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIGJvdGggcGFyYW1ldGVycyBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte09iamVjdElEfSAmJiAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdElEIG9yIE5hbWUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtPYmplY3RJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0SUQgb3IgTmFtZSAtIG5vbmUgaXMgZ2l2ZW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIE9iamVjdElEIGlzIGEgbnVtYmVyCiAgICBpZiAoICRQYXJhbXtPYmplY3RJRH0gJiYgJFBhcmFte09iamVjdElEfSAhfiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9iamVjdElEIG11c3QgYmUgYSBudW1iZXIhIChPYmplY3RJRDogJFBhcmFte09iamVjdElEfSkiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDYWNoZUtleTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudHMKICAgIGlmICggJFBhcmFte09iamVjdElEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgICRDYWNoZUtleSA9ICdPYmplY3RMb29rdXA6Ok9iamVjdElEOjonIC4gJFBhcmFte09iamVjdElEfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBuYW1lIEZST00gY29uZGl0aW9uX29iamVjdCBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0SUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgJENhY2hlS2V5ID0gJ09iamVjdExvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmRpdGlvbl9vYmplY3QgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExvb2t1cDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExvb2t1cCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiAkTG9va3VwLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJExvb2t1cDsKfQoKPWhlYWQyIE9iamVjdExpc3QoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbmRpdGlvbiBvYmplY3RzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJENvbmRpdGlvbk9iamVjdHNSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBlbnRyaWVzIGxpa2UgdGhpczoKCiAgICAkQ29uZGl0aW9uT2JqZWN0e09iamVjdElEfSA9ICdPYmplY3ROYW1lJwoKPWN1dAoKc3ViIE9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdPYmplY3RMaXN0JzsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjb25kaXRpb25fb2JqZWN0JywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlT2JqZWN0TGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9iamVjdExpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJU9iamVjdExpc3QsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBcJU9iamVjdExpc3Q7Cn0KCj1oZWFkMiBPYmplY3REZWxldGUoKQoKRGVsZXRlcyBhIGNvbmRpdGlvbiBvYmplY3QuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3REZWxldGUoCiAgICAgICAgT2JqZWN0SUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICk7CgogICAgIyBkZWxldGUgY29uZGl0aW9uIG9iamVjdCBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNvbmRpdGlvbl9vYmplY3QgJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte09iamVjdElEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgZm9yIG15ICRLZXkgKAogICAgICAgICdPYmplY3RMaXN0JywKICAgICAgICAnT2JqZWN0R2V0OjpPYmplY3RJRDo6JyAuICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgJ09iamVjdExvb2t1cDo6T2JqZWN0SUQ6OicgLiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICdPYmplY3RMb29rdXA6Ok5hbWU6OicgLiAkT2JqZWN0TmFtZSwKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgT2JqZWN0U2VsZWN0b3JMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBzZWxlY3RvcnMgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGlkIGFuZCBjb25kaXRpb24gaWQgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkU2VsZWN0b3JMaXN0ID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0U2VsZWN0b3JMaXN0KAogICAgICAgIE9iamVjdElEICAgID0+IDEyMzQsCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gNSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBsaWtlIHRoaXMgKGZvciBDPHdvcmtvcmRlcj4gb2JqZWN0cykKCiAgICAkU2VsZWN0b3JMaXN0ID0gewogICAgICAgIDEwICAgID0+ICcxIC0gV29ya29yZGVyVGl0bGUgb2YgV29ya29yZGVyIDEnLAogICAgICAgIDEyICAgID0+ICcyIC0gV29ya29yZGVyVGl0bGUgb2YgV29ya29yZGVyIDInLAogICAgICAgIDM0ICAgID0+ICczIC0gV29ya29yZGVyVGl0bGUgb2YgV29ya29yZGVyIDMnLAogICAgICAgICdhbnknID0+ICdhbnknLAogICAgICAgICdhbGwnID0+ICdhbGwnLAogICAgfQoKb3IgZm9yIGNoYW5nZSBvYmplY3RzOgoKICAgICRTZWxlY3Rvckxpc3QgPSB7CiAgICAgICAgNDU2ID0+ICdDaGFuZ2UjIDIwMTAwMTE2MTAwMDA2MTgnLAogICAgfQoKPWN1dAoKc3ViIE9iamVjdFNlbGVjdG9yTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RJRCBDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICk7CgogICAgIyBnZXQgY29uZGl0aW9uIGRhdGEKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uRGF0YTsKCiAgICAjIGdldCBvYmplY3QgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6JyAuICRPYmplY3ROYW1lICk7CgogICAgIyBjaGVjayBmb3IgZXJyb3IKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBkZWZpbmUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGJhY2tlbmQKICAgIG15ICRTdWIgPSAnU2VsZWN0b3JMaXN0JzsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT2JqZWN0TmFtZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdWJyb3V0aW5lCiAgICBteSAkU2VsZWN0b3JMaXN0ID0gJEJhY2tlbmRPYmplY3QtPiRTdWIoCiAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDb25kaXRpb25EYXRhLT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgQWN0aW9uSUQgICAgID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICApIHx8IHt9OwoKICAgIHJldHVybiAkU2VsZWN0b3JMaXN0Owp9Cgo9aGVhZDIgT2JqZWN0Q29tcGFyZVZhbHVlTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhdmFpbGFibGUgQ29tcGFyZVZhbHVlcyBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZCBhbmQgYXR0cmlidXRlIGlkIGFzIGhhc2ggcmVmZXJlbmNlLgoKICAgIG15ICRDb21wYXJlVmFsdWVMaXN0ID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0Q29tcGFyZVZhbHVlTGlzdCgKICAgICAgICBPYmplY3RJRCAgICAgID0+IDEyMzQsCiAgICAgICAgQXR0cmlidXRlTmFtZSA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBsaWtlIHRoaXMsIGZvciBhIEM8d29ya29yZGVyPiBvYmplY3QgYW5kIHRoZSBhdHRyaWJ1dGUgJ1dvcmtPcmRlclN0YXRlSUQnOgoKICAgICRDb21wYXJlVmFsdWVMaXN0ID0gewogICAgICAgIDEwICAgID0+ICdjcmVhdGVkJywKICAgICAgICAxMiAgICA9PiAnYWNjZXB0ZWQnLAogICAgICAgIDEzICAgID0+ICdyZWFkeScsCiAgICAgICAgMTQgICAgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAxNSAgICA9PiAnY2xvc2VkJywKICAgICAgICAxNiAgICA9PiAnY2FuY2VsZWQnLAogICAgfQoKPWN1dAoKc3ViIE9iamVjdENvbXBhcmVWYWx1ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0SUQgQXR0cmlidXRlTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRQYXJhbXtPYmplY3ROYW1lfTsKICAgIGlmICggJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgdHlwZQogICAgbXkgJE9iamVjdFR5cGUgPSAkT2JqZWN0TmFtZTsKCiAgICAjIGdldCBvYmplY3QgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6JyAuICRPYmplY3RUeXBlICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGRlZmluZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYmFja2VuZAogICAgbXkgJFN1YiA9ICdDb21wYXJlVmFsdWVMaXN0JzsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT2JqZWN0VHlwZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdWJyb3V0aW5lCiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRCYWNrZW5kT2JqZWN0LT4kU3ViKAogICAgICAgIEF0dHJpYnV0ZU5hbWUgPT4gJFBhcmFte0F0dHJpYnV0ZU5hbWV9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IHt9OwoKICAgIHJldHVybiAkQ29tcGFyZVZhbHVlTGlzdDsKfQoKPWhlYWQyIE9iamVjdERhdGFHZXQoKQoKUmV0dXJuIHRoZSBkYXRhIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgc2VsZWN0b3Igb2YgYSBjZXJ0YWluIG9iamVjdC4KCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdERhdGFHZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzNCwKICAgICAgICBPYmplY3ROYW1lICA9PiAnSVRTTUNoYW5nZScsICAgICMgb3IgT2JqZWN0SUQKICAgICAgICBPYmplY3RJRCAgICA9PiAxLCAgICAgICAgICAgICAgICMgb3IgT2JqZWN0TmFtZQogICAgICAgIFNlbGVjdG9yICAgID0+ICcxMjMnLCAgICAgICAgICAgIyAgKCBPYmplY3RLZXkgfCBhbnkgfCBhbGwgKQogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGVpdGhlciBPYmplY3ROYW1lIG9yIE9iamVjdElEIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TmFtZX0gJiYgISRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdPYmplY3ROYW1lIElEIG9yIE9iamVjdElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIE9iamVjdE5hbWUgYW5kIE9iamVjdElEIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17T2JqZWN0TmFtZX0gJiYgJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIE9iamVjdE5hbWUgT1IgT2JqZWN0SUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRQYXJhbXtPYmplY3ROYW1lfTsKICAgIGlmICggJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgdHlwZQogICAgbXkgJE9iamVjdFR5cGUgPSAkT2JqZWN0TmFtZTsKCiAgICAjIGdldCBvYmplY3QgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6JyAuICRPYmplY3RUeXBlICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGRlZmluZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYmFja2VuZAogICAgbXkgJFN1YiA9ICdEYXRhR2V0JzsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT2JqZWN0VHlwZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgIHJldHVybiAkT2JqZWN0RGF0YTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE9wZXJhdG9yLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3IgLSBjb25kaXRpb24gb3BlcmF0b3IgbGliCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIE9wZXJhdG9yQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gb3BlcmF0b3IuCgogICAgbXkgJE9wZXJhdG9ySUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckFkZCgKICAgICAgICBOYW1lICAgPT4gJ09wZXJhdG9yTmFtZScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9wZXJhdG9yQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgbG9va3VwIHdpdGggZ2l2ZW4gbmFtZSBmb3IgY2hlY2tzCiAgICBteSAkT3BlcmF0b3JJRCA9ICRTZWxmLT5PcGVyYXRvckxvb2t1cCggTmFtZSA9PiAkUGFyYW17TmFtZX0gKTsKCiAgICAjIGNoZWNrIGlmIG9wZXJhdG9yIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkT3BlcmF0b3JJRCkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29uZGl0aW9uIG9wZXJhdG9yICgkUGFyYW17TmFtZX0pIGFscmVhZHkgZXhpc3RzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgbmV3IG9wZXJhdG9yIG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX29wZXJhdG9yICcKICAgICAgICAgICAgLiAnKG5hbWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICk7CgogICAgIyBnZXQgaWQgb2YgY3JlYXRlZCBvcGVyYXRvcgogICAgJE9wZXJhdG9ySUQgPSAkU2VsZi0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgb3BlcmF0b3IgY291bGQgYmUgYWRkZWQKICAgIGlmICggISRPcGVyYXRvcklEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JBZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdPcGVyYXRvckxpc3QnLAogICAgKTsKCiAgICByZXR1cm4gJE9wZXJhdG9ySUQ7Cn0KCj1oZWFkMiBPcGVyYXRvclVwZGF0ZSgpCgpVcGRhdGUgYSBjb25kaXRpb24gb3BlcmF0b3IuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvclVwZGF0ZSgKICAgICAgICBPcGVyYXRvcklEID0+IDEyMzQsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3BlcmF0b3JOYW1lJywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9wZXJhdG9yVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9wZXJhdG9ySUQgTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9wZXJhdG9yIGRhdGEKICAgIG15ICRPcGVyYXRvckRhdGEgPSAkU2VsZi0+T3BlcmF0b3JHZXQoCiAgICAgICAgT3BlcmF0b3JJRCA9PiAkUGFyYW17T3BlcmF0b3JJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBvcGVyYXRvciBkYXRhCiAgICBpZiAoICEkT3BlcmF0b3JEYXRhICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JVcGRhdGUgb2YgJFBhcmFte09wZXJhdG9ySUR9IGZhaWxlZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIG9wZXJhdG9yIGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25kaXRpb25fb3BlcmF0b3IgJwogICAgICAgICAgICAuICdTRVQgbmFtZSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte09wZXJhdG9ySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ09wZXJhdG9yTGlzdCcsCiAgICAgICAgJ09wZXJhdG9yR2V0OjpPcGVyYXRvcklEOjonIC4gJFBhcmFte09wZXJhdG9ySUR9LAogICAgICAgICdPcGVyYXRvckxvb2t1cDo6T3BlcmF0b3JJRDo6JyAuICRQYXJhbXtPcGVyYXRvcklEfSwKICAgICAgICAnT3BlcmF0b3JMb29rdXA6Ok5hbWU6OicgLiAkT3BlcmF0b3JEYXRhLT57TmFtZX0sICAgICMgdXNlIHRoZSBvbGQgbmFtZQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBPcGVyYXRvckdldCgpCgpHZXQgYSBjb25kaXRpb24gb3BlcmF0b3IgZm9yIGEgZ2l2ZW4gb3BlcmF0b3IgaWQuClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgb3BlcmF0b3IgZGF0YS4KCiAgICBteSAkQ29uZGl0aW9uT3BlcmF0b3JSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckdldCgKICAgICAgICBPcGVyYXRvcklEID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJENvbmRpdGlvbk9wZXJhdG9ye09wZXJhdG9ySUR9CiAgICAkQ29uZGl0aW9uT3BlcmF0b3J7TmFtZX0KCj1jdXQKCnN1YiBPcGVyYXRvckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPcGVyYXRvcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ09wZXJhdG9yR2V0OjpPcGVyYXRvcklEOjonIC4gJFBhcmFte09wZXJhdG9ySUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gY29uZGl0aW9uX29wZXJhdG9yIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09wZXJhdG9ySUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlT3BlcmF0b3JEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT3BlcmF0b3JEYXRhe09wZXJhdG9ySUR9ID0gJFJvd1swXTsKICAgICAgICAkT3BlcmF0b3JEYXRhe05hbWV9ICAgICAgID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElT3BlcmF0b3JEYXRhICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JJRCAkUGFyYW17T3BlcmF0b3JJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlT3BlcmF0b3JEYXRhLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXCVPcGVyYXRvckRhdGE7Cn0KCj1oZWFkMiBPcGVyYXRvckxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNvbmRpdGlvbiBvcGVyYXRvci4gSWYgYW4gb3BlcmF0b3IKaWQgaXMgZ2l2ZW4sIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdG9yLiBJZiB0aGUgbmFtZSBvZiB0aGUKb3BlcmF0b3IgaXMgZ2l2ZW4sIHRoZSBhcHByb3ByaWF0ZSBpZCBpcyByZXR1cm5lZC4KCiAgICBteSAkT3BlcmF0b3JOYW1lID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgT3BlcmF0b3JJRCA9PiA0MzIxLAogICAgKTsKCiAgICBteSAkT3BlcmF0b3JJRCA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yTG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnT3BlcmF0b3JOYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgT3BlcmF0b3JMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIGJvdGggcGFyYW1ldGVycyBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte09wZXJhdG9ySUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT3BlcmF0b3JJRCBvciBOYW1lIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGJvdGggcGFyYW1ldGVycyBhcmUgbm90IGdpdmVuCiAgICBpZiAoICEkUGFyYW17T3BlcmF0b3JJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT3BlcmF0b3JJRCBvciBOYW1lIC0gbm9uZSBpcyBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgT3BlcmF0b3JJRCBpcyBhIG51bWJlcgogICAgaWYgKCAkUGFyYW17T3BlcmF0b3JJRH0gJiYgJFBhcmFte09wZXJhdG9ySUR9ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JJRCBtdXN0IGJlIGEgbnVtYmVyISAoT3BlcmF0b3JJRDogJFBhcmFte09wZXJhdG9ySUR9KSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENhY2hlS2V5OwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50cwogICAgaWYgKCAkUGFyYW17T3BlcmF0b3JJRH0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICAkQ2FjaGVLZXkgPSAnT3BlcmF0b3JMb29rdXA6Ok9wZXJhdG9ySUQ6OicgLiAkUGFyYW17T3BlcmF0b3JJRH07CiAgICAgICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvciBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T3BlcmF0b3JJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICAkQ2FjaGVLZXkgPSAnT3BlcmF0b3JMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25kaXRpb25fb3BlcmF0b3IgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJExvb2t1cDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExvb2t1cCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiAkTG9va3VwLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJExvb2t1cDsKfQoKPWhlYWQyIE9wZXJhdG9yTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29uZGl0aW9uIG9wZXJhdG9ycyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRDb25kaXRpb25PcGVyYXRvcnNSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGVudHJpZXMgbGlrZSB0aGlzOgoKICAgICRDb25kaXRpb25PcGVyYXRvcntPYmplY3RJRH0gPSAnT2JqZWN0TmFtZScKCj1jdXQKCnN1YiBPcGVyYXRvckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdPcGVyYXRvckxpc3QnOwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvcicsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU9wZXJhdG9yTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9wZXJhdG9yTGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlT3BlcmF0b3JMaXN0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gXCVPcGVyYXRvckxpc3Q7Cn0KCj1oZWFkMiBPcGVyYXRvckRlbGV0ZSgpCgpEZWxldGVzIGEgY29uZGl0aW9uIG9wZXJhdG9yLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JEZWxldGUoCiAgICAgICAgT3BlcmF0b3JJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT3BlcmF0b3JEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT3BlcmF0b3JJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9va3VwIG9wZXJhdG9yIG5hbWUKICAgIG15ICRPcGVyYXRvck5hbWUgPSAkU2VsZi0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgT3BlcmF0b3JJRCA9PiAkUGFyYW17T3BlcmF0b3JJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBvcGVyYXRvciBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvciAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T3BlcmF0b3JJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnT3BlcmF0b3JMaXN0JywKICAgICAgICAnT3BlcmF0b3JHZXQ6Ok9wZXJhdG9ySUQ6OicgLiAkUGFyYW17T3BlcmF0b3JJRH0sCiAgICAgICAgJ09wZXJhdG9yTG9va3VwOjpPcGVyYXRvcklEOjonIC4gJFBhcmFte09wZXJhdG9ySUR9LAogICAgICAgICdPcGVyYXRvckxvb2t1cDo6TmFtZTo6JyAuICRPcGVyYXRvck5hbWUsCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE9wZXJhdG9yRXhlY3V0ZSgpCgpFeGVjdXRlcyB0aGUgb3BlcmF0b3IgYW5kIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckV4ZWN1dGUoCiAgICAgICAgT3BlcmF0b3JOYW1lID0+ICdpcycsCiAgICAgICAgQXR0cmlidXRlICAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEJywKICAgICAgICBTZWxlY3RvciAgICAgPT4gJzEyMzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgKCBPYmplY3RLZXkgfCBhbnkgfCBhbGwgKQogICAgICAgIE9iamVjdERhdGEgICA9PiBbICRXb3JrT3JkZXJEYXRhMSwgJFdvcmtPcmRlckRhdGEyIF0sCiAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdTb21lVmFsdWUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IgQWN0aW9uVmFsdWUKICAgICAgICBPYmplY3ROYW1lICAgPT4gJ0lUU01Xb3JrT3JkZXInLCAgICAgICAgICAgICAgICAgICAgICAgIyBuZWVkZWQgZm9yIEFjdGlvblZhbHVlCiAgICAgICAgQWN0aW9uSUQgICAgID0+IDEyMzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmVlZGVkIGZvciBBY3Rpb25WYWx1ZQogICAgICAgIEFjdGlvblZhbHVlICA9PiAnU29tZVZhbHVlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yIENvbXBhcmVWYWx1ZQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBPcGVyYXRvckV4ZWN1dGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT3BlcmF0b3JOYW1lIEF0dHJpYnV0ZSBTZWxlY3RvciBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgJ0NvbXBhcmVWYWx1ZScgYW5kICdBY3Rpb25WYWx1ZScgaW4gYSBzcGVjaWFsIHdheQogICAgaWYgKAogICAgICAgICggIWV4aXN0cyAkUGFyYW17Q29tcGFyZVZhbHVlfSB8fCAhZGVmaW5lZCAkUGFyYW17Q29tcGFyZVZhbHVlfSApCiAgICAgICAgJiYgKCAhZXhpc3RzICRQYXJhbXtBY3Rpb25WYWx1ZX0gfHwgIWRlZmluZWQgJFBhcmFte0FjdGlvblZhbHVlfSApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgQ29tcGFyZVZhbHVlIG9yIEFjdGlvblZhbHVlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zIGZvciBhY3Rpb25zCiAgICByZXR1cm4gaWYgZXhpc3RzICRQYXJhbXtBY3Rpb25WYWx1ZX0gJiYgISRQYXJhbXtPYmplY3ROYW1lfTsKCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkUGFyYW17T2JqZWN0RGF0YX07CgogICAgIyBjaGVjayBPYmplY3REYXRhCiAgICBpZiAoIHJlZiAkT2JqZWN0RGF0YSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBpcyBub3QgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmb3IgYWN0aW9ucyAnYW55JyBpcyBub3QgYWxsb3dlZAogICAgcmV0dXJuIGlmIGV4aXN0cyAkUGFyYW17QWN0aW9uVmFsdWV9ICYmICRQYXJhbXtTZWxlY3Rvcn0gZXEgJ2FueSc7CgogICAgIyBleGVjdXRlIG9wZXJhdG9yIGZvciBhY3Rpb25zIGhlcmUKICAgICMgbm8gbmVlZCB0byBpdGVyYXRlIG92ZXIgb2JqZWN0IGluIHRoaXMgY2FzZQogICAgaWYgKCBleGlzdHMgJFBhcmFte0FjdGlvblZhbHVlfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9PcGVyYXRvckFjdGlvbkV4ZWN1dGUoCiAgICAgICAgICAgIE9wZXJhdG9yICAgID0+ICRQYXJhbXtPcGVyYXRvck5hbWV9LAogICAgICAgICAgICBPYmplY3ROYW1lICA9PiAkUGFyYW17T2JqZWN0TmFtZX0sCiAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+ICRQYXJhbXtBdHRyaWJ1dGV9LAogICAgICAgICAgICBBY3Rpb25JRCAgICA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICAgICBBY3Rpb25WYWx1ZSA9PiAkUGFyYW17QWN0aW9uVmFsdWV9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIGZhbHNlIGlmIG5vIG9iamVjdCBkYXRhIGlzIGdpdmVuCiAgICByZXR1cm4gaWYgIUB7JE9iamVjdERhdGF9OwoKICAgICMgZXhlY3V0ZSBvcGVyYXRvciBmb3IgZWFjaCBvYmplY3QKICAgIG15IEBPcGVyYXRvckV4ZWN1dGVSZXN1bHQ7CiAgICBmb3IgbXkgJE9iamVjdCAoIEB7JE9iamVjdERhdGF9ICkgewoKICAgICAgICAjIGdldCBlcXVhdGlvbiByZXN1bHQgZm9yIG9iamVjdAogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X09wZXJhdG9yRXhlY3V0ZSgKICAgICAgICAgICAgT3BlcmF0b3JOYW1lID0+ICRQYXJhbXtPcGVyYXRvck5hbWV9LAogICAgICAgICAgICBWYWx1ZTEgICAgICAgPT4gJE9iamVjdC0+eyAkUGFyYW17QXR0cmlidXRlfSB9IHx8ICcnLAogICAgICAgICAgICBWYWx1ZTIgICAgICAgPT4gJFBhcmFte0NvbXBhcmVWYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApIHx8IDA7CgogICAgICAgICMgcmV0dXJuIHRydWUgaWYgcmVzdWx0IGlzIHBvc2l0aXZlIGFuZCAnYW55JyBpcyByZXF1ZXN0ZWQKICAgICAgICBpZiAoICRQYXJhbXtTZWxlY3Rvcn0gZXEgJ2FueScgJiYgJFJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBmYWxzZSBpZiByZXN1bHQgaXMgbmVnYXRpdmUgYW5kICdhbGwnIGlzIHJlcXVlc3RlZAogICAgICAgIGlmICggJFBhcmFte1NlbGVjdG9yfSBlcSAnYWxsJyAmJiAhJFJlc3VsdCApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIGN1cnJlbnQgcmVzdWx0IGZvciBjb21pbmcgY2hlY2tzCiAgICAgICAgcHVzaCBAT3BlcmF0b3JFeGVjdXRlUmVzdWx0LCAkUmVzdWx0OwogICAgfQoKICAgICMgY291bnQgYWxsIHJlc3VsdHMgd2hpY2ggaGF2ZSBhIHRydWUgdmFsdWUKICAgIG15ICRUcnVlQ291bnQgPSBzY2FsYXIgZ3JlcCB7ICRfID09IDEgfSBAT3BlcmF0b3JFeGVjdXRlUmVzdWx0OwoKICAgICMgcmV0dXJuIGZhbHNlIGlmIG5vdCBhbGwgcmVzdWx0cyBhcmUgdHJ1ZQogICAgcmV0dXJuIGlmICRUcnVlQ291bnQgIT0gc2NhbGFyIEB7JE9iamVjdERhdGF9OwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfT3BlcmF0b3JFeGVjdXRlKCkKClJldHVybnMgdHJ1ZSBvciBmYWxzZSAoMS91bmRlZikuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPl9PcGVyYXRvckV4ZWN1dGUoCiAgICAgICAgT3BlcmF0b3JOYW1lID0+ICdpcycsCiAgICAgICAgVmFsdWUxICAgICAgID0+ICdTb21lVmFsdWUnLAogICAgICAgIFZhbHVlMiAgICAgICA9PiAnU29tZU90aGVyVmFsdWUnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JFeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9wZXJhdG9yTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsdWUxIFZhbHVlMikpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFwIGZvciBvcGVyYXRvciBhY3Rpb24KICAgIG15ICVPcGVyYXRvckFjdGlvbiA9ICgKCiAgICAgICAgIyBjb21tb24gbWF0Y2hpbmcKICAgICAgICAnaXMnICAgICAgICAgICA9PiAnX09wZXJhdG9yRXF1YWwnLAogICAgICAgICdpcyBub3QnICAgICAgID0+ICdfT3BlcmF0b3JOb3RFcXVhbCcsCiAgICAgICAgJ2lzIGVtcHR5JyAgICAgPT4gJ19PcGVyYXRvcklzRW1wdHknLAogICAgICAgICdpcyBub3QgZW1wdHknID0+ICdfT3BlcmF0b3JJc05vdEVtcHR5JywKCiAgICAgICAgIyBkaWdpdCBtYXRjaGluZwogICAgICAgICdpcyBncmVhdGVyIHRoYW4nID0+ICdfT3BlcmF0b3JJc0dyZWF0ZXJUaGFuJywKICAgICAgICAnaXMgbGVzcyB0aGFuJyAgICA9PiAnX09wZXJhdG9ySXNMZXNzVGhhbicsCgogICAgICAgICMgZGF0ZSBtYXRjaGluZwogICAgICAgICdpcyBiZWZvcmUnID0+ICdfT3BlcmF0b3JJc0JlZm9yZScsCiAgICAgICAgJ2lzIGFmdGVyJyAgPT4gJ19PcGVyYXRvcklzQWZ0ZXInLAoKICAgICAgICAjIHN0cmluZyBtYXRjaGluZwogICAgICAgICdjb250YWlucycgICAgID0+ICdfT3BlcmF0b3JDb250YWlucycsCiAgICAgICAgJ25vdCBjb250YWlucycgPT4gJ19PcGVyYXRvck5vdENvbnRhaW5zJywKICAgICAgICAnYmVnaW5zIHdpdGgnICA9PiAnX09wZXJhdG9yQmVnaW5zV2l0aCcsCiAgICAgICAgJ2VuZHMgd2l0aCcgICAgPT4gJ19PcGVyYXRvckVuZHNXaXRoJywKICAgICk7CgogICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgbXkgJE9wZXJhdG9yTmFtZSA9ICRQYXJhbXtPcGVyYXRvck5hbWV9OwoKICAgICMgY2hlY2sgZm9yIG1hdGNoaW5nIG9wZXJhdG9yCiAgICBpZiAoICFleGlzdHMgJE9wZXJhdG9yQWN0aW9ueyRPcGVyYXRvck5hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gbWF0Y2hpbmcgb3BlcmF0b3IgZm9yICckT3BlcmF0b3JOYW1lJyBmb3VuZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBvcGVyYXRvciBzdWIKICAgIG15ICRTdWIgPSAkT3BlcmF0b3JBY3Rpb257JE9wZXJhdG9yTmFtZX07CgogICAgIyBjaGVjayBmb3IgYXZhaWxhYmxlIGZ1bmN0aW9uCiAgICBpZiAoICEkU2VsZi0+Y2FuKCRTdWIpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZnVuY3Rpb24gJyRTdWInIGF2YWlsYWJsZSBmb3IgJyRPcGVyYXRvck5hbWUnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBleGVjdXRlIGV4dHJhY3RlZCBtYXRjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT4kU3ViKAogICAgICAgIFZhbHVlMSA9PiAkUGFyYW17VmFsdWUxfSwKICAgICAgICBWYWx1ZTIgPT4gJFBhcmFte1ZhbHVlMn0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgX09wZXJhdG9yQWN0aW9uRXhlY3V0ZSgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIGdpdmVuIGFjdGlvbiBjb3VsZCBiZQpleGVjdXRlZCBzdWNjZXNzZnVsbHkuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPl9PcGVyYXRvckFjdGlvbkV4ZWN1dGUoCiAgICAgICAgT3BlcmF0b3IgICAgPT4gJ3NldCcsCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNlbGVjdG9yICAgID0+ICcxMjM0JwogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBBY3Rpb25JRCAgICA9PiAyMzQ1LAogICAgICAgIEFjdGlvblZhbHVlID0+ICcxMycsCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9yQWN0aW9uRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPcGVyYXRvciBPYmplY3ROYW1lIFNlbGVjdG9yIEF0dHJpYnV0ZSBBY3Rpb25JRCBBY3Rpb25WYWx1ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZiBpbiBhIHNwZWNpYWwgd2F5CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBY3Rpb25WYWx1ZSkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFwIGZvciBvcGVyYXRvciBhY3Rpb24KICAgIG15ICVPcGVyYXRvckFjdGlvbiA9ICgKICAgICAgICAnc2V0JyA9PiAnX09wZXJhdG9yU2V0JywKICAgICk7CgogICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgbXkgJE9wZXJhdG9yTmFtZSA9ICRQYXJhbXtPcGVyYXRvcn07CgogICAgIyBjaGVjayBmb3IgbWF0Y2hpbmcgb3BlcmF0b3IKICAgIGlmICggIWV4aXN0cyAkT3BlcmF0b3JBY3Rpb257JE9wZXJhdG9yTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBtYXRjaGluZyBvcGVyYXRvciBmb3IgJyRPcGVyYXRvck5hbWUnIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBleHRyYWN0IG9wZXJhdG9yIHN1YgogICAgbXkgJFN1YiA9ICRPcGVyYXRvckFjdGlvbnskT3BlcmF0b3JOYW1lfTsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRTZWxmLT5jYW4oJFN1YikgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciAnJE9wZXJhdG9yTmFtZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4ZWN1dGUgZXh0cmFjdGVkIGFjdGlvbgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT4kU3ViKAogICAgICAgIE9wZXJhdG9yICAgID0+ICRQYXJhbXtPcGVyYXRvcn0sCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgQWN0aW9uSUQgICAgPT4gJFBhcmFte0FjdGlvbklEfSwKICAgICAgICBBY3Rpb25WYWx1ZSA9PiAkUGFyYW17QWN0aW9uVmFsdWV9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIF9PcGVyYXRvckVxdWFsKCkKClJldHVybnMgdHJ1ZSBvciBmYWxzZSAoMS91bmRlZikgaWYgZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yRXF1YWwoCiAgICAgICAgVmFsdWUxID0+ICdTb21lVmFsdWUnLAogICAgICAgIFZhbHVlMiA9PiAnU29tZU90aGVyVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JFcXVhbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlMX0gZXEgJFBhcmFte1ZhbHVlMn07Cn0KCj1oZWFkMiBfT3BlcmF0b3JOb3RFcXVhbCgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIGdpdmVuIHZhbHVlcyBhcmUgbm90IGVxdWFsLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JOb3RFcXVhbCgKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdTb21lT3RoZXJWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvck5vdEVxdWFsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQgb2YgbmVnYXRlZCBlcXVhdGlvbgogICAgcmV0dXJuICEkU2VsZi0+X09wZXJhdG9yRXF1YWwoJVBhcmFtKTsKfQoKPWhlYWQyIF9PcGVyYXRvcklzRW1wdHkoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZSBpcyBlbXB0eS4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNFbXB0eSgKICAgICAgICBWYWx1ZTEgPT4gJycsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvcklzRW1wdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsdWUxKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsZW5ndGggb2YgdmFsdWUKICAgIG15ICRWYWx1ZUxlbmd0aCA9IGxlbmd0aCAkUGFyYW17VmFsdWUxfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgbGVuZ3RoIGNoZWNrCiAgICByZXR1cm4gJFZhbHVlTGVuZ3RoID09IDA7Cn0KCj1oZWFkMiBfT3BlcmF0b3JJc05vdEVtcHR5KCkKClJldHVybnMgdHJ1ZSBvciBmYWxzZSAoMS91bmRlZikgaWYgZ2l2ZW4gdmFsdWUgaXMgbm90IGVtcHR5LgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JJc05vdEVtcHR5KAogICAgICAgIFZhbHVlMSA9PiAnU29tZVZhbHVlJywKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9ySXNOb3RFbXB0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQgb2YgbmVnYXRlZCBlcXVhdGlvbgogICAgcmV0dXJuICEkU2VsZi0+X09wZXJhdG9ySXNFbXB0eSglUGFyYW0pOwp9Cgo9aGVhZDIgX09wZXJhdG9ySXNHcmVhdGVyVGhhbigpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIFZhbHVlMSBpcyBncmVhdGVyIHRoYW4KdGhlIGNvbXBhcmUgVmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JJc0dyZWF0ZXJUaGFuKAogICAgICAgIFZhbHVlMSA9PiAyMzQ1LAogICAgICAgIFZhbHVlMiA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JJc0dyZWF0ZXJUaGFuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdCB0byBudW1iZXIgMCAoemVybykKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBkaWdpdHMsIGFsbG93IGRlY2ltYWwgcG9pbnQsIGFsbG93IG5lZ2F0aXZlIG51bWJlcnMKICAgIHJldHVybiBpZiAkUGFyYW17VmFsdWUxfSAhfiBteyBcQSBbKy1dPyBcZCsgKCBcLiBcZCsgKT8gXHogfXhtczsKICAgIHJldHVybiBpZiAkUGFyYW17VmFsdWUyfSAhfiBteyBcQSBbKy1dPyBcZCsgKCBcLiBcZCsgKT8gXHogfXhtczsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgZ3JlYXRlciB0aGFuIGNoZWNrCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlMX0gPiAkUGFyYW17VmFsdWUyfTsKfQoKPWhlYWQyIF9PcGVyYXRvcklzTGVzc1RoYW4oKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBWYWx1ZTEgaXMgbGVzcyB0aGFuCnRoZSBjb21wYXJlIFZhbHVlMi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNMZXNzVGhhbigKICAgICAgICBWYWx1ZTEgPT4gMjM0NSwKICAgICAgICBWYWx1ZTIgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9ySXNMZXNzVGhhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGRlZmF1bHQgdG8gbnVtYmVyIDAgKHplcm8pCiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZGlnaXRzLCBhbGxvdyBkZWNpbWFsIHBvaW50LCBhbGxvdyBuZWdhdGl2ZSBudW1iZXJzCiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMX0gIX4gbXsgXEEgWystXT8gXGQrICggXC4gXGQrICk/IFx6IH14bXM7CiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMn0gIX4gbXsgXEEgWystXT8gXGQrICggXC4gXGQrICk/IFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGxlc3MgdGhhbiBjaGVjawogICAgcmV0dXJuICRQYXJhbXtWYWx1ZTF9IDwgJFBhcmFte1ZhbHVlMn07Cn0KCj1oZWFkMiBfT3BlcmF0b3JJc0JlZm9yZSgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIFZhbHVlMSBpcyBiZWZvcmUgdGhlIGNvbXBhcmUgVmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JJc0JlZm9yZSgKICAgICAgICBWYWx1ZTEgPT4gJzIwMTAtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgIFZhbHVlMiA9PiAnMjAxMC0wMS0wMSAxMDowMTowMScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvcklzQmVmb3JlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIGRhdGUgZm9ybWF0CiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMX0gIX4gbXsgXEEgXGR7NH0tXGR7Mn0tXGR7Mn0gXHMgXGR7Mn06XGR7Mn06XGR7Mn0gXHogfXhtczsKICAgIHJldHVybiBpZiAkUGFyYW17VmFsdWUyfSAhfiBteyBcQSBcZHs0fS1cZHsyfS1cZHsyfSBccyBcZHsyfTpcZHsyfTpcZHsyfSBceiB9eG1zOwoKICAgICMgZ2V0IHRpbWVzdGFtcHMKICAgIG15ICVUaW1lc3RhbXA7CiAgICBmb3IgbXkgJERhdGUgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CgogICAgICAgICMgY29udmVydCB0aW1lCiAgICAgICAgJFRpbWVzdGFtcHskRGF0ZX0gPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JERhdGV9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICAjIGNoZWNrIGZvciB0aW1lCiAgICAgICAgcmV0dXJuIGlmICEkVGltZXN0YW1weyREYXRlfTsKICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQgb2YgbG93ZXIgdGhhbiBjaGVjawogICAgcmV0dXJuICRUaW1lc3RhbXB7VmFsdWUxfSA8ICRUaW1lc3RhbXB7VmFsdWUyfTsKfQoKPWhlYWQyIF9PcGVyYXRvcklzQWZ0ZXIoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBWYWx1ZTEgaXMgYWZ0ZXIgdGhlIGNvbXBhcmUgVmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JJc0FmdGVyKAogICAgICAgIFZhbHVlMSA9PiAnMjAxMC0wMS0wMSAxMDowMTowMScsCiAgICAgICAgVmFsdWUyID0+ICcyMDEwLTAxLTAxIDAxOjAxOjAxJywKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9ySXNBZnRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBkYXRlIGZvcm1hdAogICAgcmV0dXJuIGlmICRQYXJhbXtWYWx1ZTF9ICF+IG17IFxBIFxkezR9LVxkezJ9LVxkezJ9IFxzIFxkezJ9OlxkezJ9OlxkezJ9ICBceiB9eG1zOwogICAgcmV0dXJuIGlmICRQYXJhbXtWYWx1ZTJ9ICF+IG17IFxBIFxkezR9LVxkezJ9LVxkezJ9IFxzIFxkezJ9OlxkezJ9OlxkezJ9ICBceiB9eG1zOwoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiBuZWdhdGVkIGVxdWF0aW9uCiAgICByZXR1cm4gISRTZWxmLT5fT3BlcmF0b3JJc0JlZm9yZSglUGFyYW0pOwp9Cgo9aGVhZDIgX09wZXJhdG9yQ29udGFpbnMoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBDPHZhbHVlMT4gY29udGFpbnMgQzx2YWx1ZTI+LgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JDb250YWlucygKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckNvbnRhaW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsb3dlciBjYXNlLCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICBteSAkTG93ZXJWYWx1ZTEgPSBsYyAkUGFyYW17VmFsdWUxfTsKICAgIG15ICRMb3dlclZhbHVlMiA9IGxjICRQYXJhbXtWYWx1ZTJ9OwoKICAgICMgY2hlY2sgZW1iZWRkZWQgc3RyaW5nCiAgICBteSAkQ29udGFpbnMgPSAkTG93ZXJWYWx1ZTEgPX4gbXsgXEEgLiogJExvd2VyVmFsdWUyIC4qIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJENvbnRhaW5zOwp9Cgo9aGVhZDIgX09wZXJhdG9yTm90Q29udGFpbnMoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBDPHZhbHVlMT4gbm90IGNvbnRhaW5zIEM8dmFsdWUyPi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yTm90Q29udGFpbnMoCiAgICAgICAgVmFsdWUxID0+ICdTb21lVmFsdWUnLAogICAgICAgIFZhbHVlMiA9PiAnU29tZU90aGVyVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JOb3RDb250YWlucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIG5lZ2F0ZWQgZXF1YXRpb24KICAgIHJldHVybiAhJFNlbGYtPl9PcGVyYXRvckNvbnRhaW5zKCVQYXJhbSk7Cn0KCj1oZWFkMiBfT3BlcmF0b3JCZWdpbnNXaXRoKCkKClJldHVybnMgdHJ1ZSBvciBmYWxzZSAoMS91bmRlZikgaWYgQzx2YWx1ZTE+IGJlZ2lucyB3aXRoIEM8dmFsdWUyPi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yQmVnaW5zV2l0aCgKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdTb21lJywKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9yQmVnaW5zV2l0aCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbG93ZXIgY2FzZSwgZm9yIHBlcmZvcm1hbmNlIGlzc3VlcwogICAgbXkgJExvd2VyVmFsdWUxID0gbGMgJFBhcmFte1ZhbHVlMX07CiAgICBteSAkTG93ZXJWYWx1ZTIgPSBsYyAkUGFyYW17VmFsdWUyfTsKCiAgICAjIGNoZWNrIGVtYmVkZGVkIHN0cmluZwogICAgbXkgJEJlZ2luc1dpdGggPSAkTG93ZXJWYWx1ZTEgPX4gbXsgXEEgJExvd2VyVmFsdWUyIC4qIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJEJlZ2luc1dpdGg7Cn0KCj1oZWFkMiBfT3BlcmF0b3JFbmRzV2l0aCgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIEM8dmFsdWUxPiBlbmRzIHdpdGggQzx2YWx1ZTI+LgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JFbmRzV2l0aCgKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckVuZHNXaXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsb3dlciBjYXNlLCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICBteSAkTG93ZXJWYWx1ZTEgPSBsYyAkUGFyYW17VmFsdWUxfTsKICAgIG15ICRMb3dlclZhbHVlMiA9IGxjICRQYXJhbXtWYWx1ZTJ9OwoKICAgICMgY2hlY2sgZW1iZWRkZWQgc3RyaW5nCiAgICBteSAkRW5kc1dpdGggPSAkTG93ZXJWYWx1ZTEgPX4gbXsgXEEgLiogJExvd2VyVmFsdWUyIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJEVuZHNXaXRoOwp9Cgo9aGVhZDIgX09wZXJhdG9yU2V0KCkKClJldHVybnMgdGhlIHN1Y2Nlc3Mgb2Ygc2V0dGluZyBhIG5ldyB2YWx1ZS4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yU2V0KAogICAgICAgIE9wZXJhdG9yICAgID0+ICdzZXQnLAogICAgICAgIE9iamVjdE5hbWUgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBTZWxlY3RvciAgICA9PiAnMTIzNCcKICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgQWN0aW9uSUQgICAgPT4gJ0NoYW5nZVN0YXRlSUQnLAogICAgICAgIEFjdGlvblZhbHVlID0+ICcxMycsCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9yU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9wZXJhdG9yIE9iamVjdE5hbWUgU2VsZWN0b3IgQXR0cmlidXRlIEFjdGlvbklEIEFjdGlvblZhbHVlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9wZXJhdG9yIG5hbWUKICAgIG15ICRPcGVyYXRvck5hbWUgPSAkUGFyYW17T2JqZWN0TmFtZX07CgogICAgIyBnZXQgb3BlcmF0b3IgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OicgLiAkT3BlcmF0b3JOYW1lCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBkZWZpbmUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGJhY2tlbmQKICAgIG15ICRTdWIgPSAnU2V0JzsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT3BlcmF0b3JOYW1lJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzdWx0IHZhbHVlCiAgICBteSAkUmVzdWx0OwoKICAgICMgZXhlY3V0ZSBleHRyYWN0ZWQgYWN0aW9uIHdpdGggc2VsZWN0b3IgJ2FsbCcKICAgIGlmICggJFBhcmFte1NlbGVjdG9yfSBlcSAnYWxsJyApIHsKCiAgICAgICAgIyBkZWZpbmUgJ2FsbCcgZnVuY3Rpb24gZm9yIGJhY2tlbmQKICAgICAgICAkU3ViID0gJ1NldEFsbCc7CgogICAgICAgICMgY2hlY2sgZm9yIGF2YWlsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT3BlcmF0b3JOYW1lJyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhY3Rpb24KICAgICAgICBteSAkQWN0aW9uID0gJFNlbGYtPkFjdGlvbkdldCgKICAgICAgICAgICAgQWN0aW9uSUQgPT4gJFBhcmFte0FjdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhY3Rpb24KICAgICAgICByZXR1cm4gaWYgISRBY3Rpb247CgogICAgICAgICMgZ2V0IG9iamVjdHMgZm9yICdhbGwnCiAgICAgICAgbXkgJEFjdGlvbk9iamVjdHMgPSAkU2VsZi0+T2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJEFjdGlvbi0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgT2JqZWN0TmFtZSAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG9iamVjdHMKICAgICAgICByZXR1cm4gMSBpZiAhJEFjdGlvbk9iamVjdHM7CiAgICAgICAgcmV0dXJuICAgaWYgcmVmICRBY3Rpb25PYmplY3RzIG5lICdBUlJBWSc7CgogICAgICAgICMgZXhlY3V0ZSBhY3Rpb25zIGZvciBhbGwgb2JqZWN0cwogICAgICAgICRSZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICAgICAgT3BlcmF0b3IgICAgPT4gJFBhcmFte09wZXJhdG9yfSwKICAgICAgICAgICAgT2JqZWN0TmFtZSAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgICAgICBPYmplY3RzICAgICA9PiAkQWN0aW9uT2JqZWN0cywKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBleGVjdXRlIGV4dHJhY3RlZCBhY3Rpb24gd2l0aCBzaW5nbGUgc2VsZWN0b3IKICAgICAgICAkUmVzdWx0ID0gJEJhY2tlbmRPYmplY3QtPiRTdWIoCiAgICAgICAgICAgIE9wZXJhdG9yICAgID0+ICRQYXJhbXtPcGVyYXRvcn0sCiAgICAgICAgICAgIE9iamVjdE5hbWUgID0+ICRQYXJhbXtPYmplY3ROYW1lfSwKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC9JVFNNQ2hhbmdlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTUNoYW5nZSAtIGNvbmRpdGlvbiBpdHNtIGNoYW5nZSBvYmplY3QgbGliCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0SVRTTUNoYW5nZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q6OklUU01DaGFuZ2UnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRGF0YUdldCgpCgpSZXR1cm5zIGNoYW5nZSBkYXRhIGluIGFuIGFycmF5IHJlZmVyZW5jZS4KCiAgICBteSAkQ2hhbmdlRGF0YVJlZiA9ICRDb25kaXRpb25PYmplY3RJVFNNQ2hhbmdlLT5EYXRhR2V0KAogICAgICAgIFNlbGVjdG9yID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgPT4gMjM0NSwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZWxlY3RvciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbWFwIHBhcmFtcwogICAgbXkgJUNoYW5nZUdldCA9ICgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgZGF0YSBhcyBhbm9uIGhhc2ggcmVmCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KCVDaGFuZ2VHZXQpOwoKICAgICMgY2hlY2sgZm9yIGNoYW5nZQogICAgcmV0dXJuIGlmICEkQ2hhbmdlOwoKICAgICMgYnVpbGQgYXJyYXkgcmVmCiAgICBteSAkQ2hhbmdlRGF0YSA9IFskQ2hhbmdlXTsKCiAgICByZXR1cm4gJENoYW5nZURhdGE7Cn0KCj1oZWFkMiBDb21wYXJlVmFsdWVMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBDb21wYXJlVmFsdWVzIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlkIG9mIGEgY2hhbmdlIG9iamVjdCBhcyBoYXNoIHJlZmVyZW5jZS4KCiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRDb25kaXRpb25PYmplY3RJVFNNQ2hhbmdlLT5Db21wYXJlVmFsdWVMaXN0KAogICAgICAgIEF0dHJpYnV0ZU5hbWUgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2UgbGlrZSB0aGlzLCBmb3IgdGhlIGNoYW5nZSBhdHRyaWJ1dGUgJ1ByaW9yaXR5JzoKCiAgICAkQ29tcGFyZVZhbHVlTGlzdCA9IHsKICAgICAgICAyMyAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgMjQgICAgPT4gJzIgbG93JywKICAgICAgICAyNSAgICA9PiAnMyBub3JtYWwnLAogICAgICAgIDI2ICAgID0+ICc0IGhpZ2gnLAogICAgICAgIDI3ICAgID0+ICc1IHZlcnkgaGlnaCcsCiAgICB9Cgo9Y3V0CgpzdWIgQ29tcGFyZVZhbHVlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBdHRyaWJ1dGVOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgbGlzdAogICAgbXkgJENvbXBhcmVWYWx1ZUxpc3QgPSB7fTsKCiAgICAjIENhdGVnb3J5SUQsIEltcGFjdElELCBQcmlvcml0eUlECiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVOYW1lfSA9fiBteyBcQSAoIENhdGVnb3J5IHwgSW1wYWN0IHwgUHJpb3JpdHkgKSBJRCBceiB9eG1zICkgewoKICAgICAgICAjIHJlbW92ZSAnSUQnIGF0IHRoZSBlbmQgb2YgYXR0cmlidXRlCiAgICAgICAgbXkgJFR5cGUgPSAkMTsKCiAgICAgICAgIyBnZXQgdGhlIGNhdGVnb3J5IG9yIGltcGFjdCBvciBwcmlvcml0eSBsaXN0CiAgICAgICAgJENvbXBhcmVWYWx1ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICAgICAgVHlwZSAgID0+ICRUeXBlLAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoYW5nZVN0YXRlSUQKICAgIGVsc2lmICggJFBhcmFte0F0dHJpYnV0ZU5hbWV9IGVxICdDaGFuZ2VTdGF0ZUlEJyApIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGxpc3QKICAgICAgICAkQ29tcGFyZVZhbHVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ0NoYW5nZUJ1aWxkZXJJRCcKICAgICAgICB8fCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ0NoYW5nZU1hbmFnZXJJRCcKICAgICAgICApCiAgICB7CgogICAgICAgICMgZ2V0IGEgY29tcGxldGUgbGlzdCBvZiB1c2VycwogICAgICAgIG15ICVVc2VycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJENvbXBhcmVWYWx1ZUxpc3QgPSBcJVVzZXJzOwogICAgfQoKICAgIHJldHVybiAkQ29tcGFyZVZhbHVlTGlzdDsKfQoKPWhlYWQyIFNlbGVjdG9yTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VsZWN0b3JzIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIGNoYW5nZSBvYmplY3QgaWQgYW5kIGNvbmRpdGlvbiBpZCBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRTZWxlY3Rvckxpc3QgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTUNoYW5nZS0+U2VsZWN0b3JMaXN0KAogICAgICAgIE9iamVjdElEICAgID0+IDEyMzQsCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gNSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBsaWtlIHRoaXM6CgogICAgJFNlbGVjdG9yTGlzdCA9IHsKICAgICAgICA0NTYgPT4gJ0NoYW5nZSMgMjAxMDAxMTYxMDAwMDYxOCcsCiAgICB9Cgo9Y3V0CgpzdWIgU2VsZWN0b3JMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJENoYW5nZURhdGE7CgogICAgIyBidWlsZCBzZWxlY3RvciBsaXN0CiAgICBteSAlU2VsZWN0b3JMaXN0ID0gKAogICAgICAgICRDaGFuZ2VEYXRhLT57Q2hhbmdlSUR9ID0+ICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSwKICAgICk7CgogICAgcmV0dXJuIFwlU2VsZWN0b3JMaXN0Owp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC9JVFNNV29ya09yZGVyLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Xb3JrT3JkZXIucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTVdvcmtPcmRlciAtIGNvbmRpdGlvbiBpdHNtIEM8d29ya29yZGVyPiBvYmplY3QgbGliCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0SVRTTVdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q6OklUU01Xb3JrT3JkZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRGF0YUdldCgpCgpSZXR1cm5zIEM8d29ya29yZGVyPiBkYXRhIGluIGFuIGFycmF5IHJlZmVyZW5jZS4KCiAgICBteSAkV29ya09yZGVyRGF0YVJlZiA9ICRDb25kaXRpb25PYmplY3RJVFNNV29ya09yZGVyLT5EYXRhR2V0KAogICAgICAgIFNlbGVjdG9yID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgPT4gMjM0NSwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZWxlY3RvciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSAnYW55JyBvciAnYWxsJyBpbiBhIHNwZWNpYWwgY2FzZQogICAgcmV0dXJuICRTZWxmLT5fRGF0YUdldEFsbCglUGFyYW0pIGlmICRQYXJhbXtTZWxlY3Rvcn0gZXEgJ2FueSc7CiAgICByZXR1cm4gJFNlbGYtPl9EYXRhR2V0QWxsKCVQYXJhbSkgaWYgJFBhcmFte1NlbGVjdG9yfSBlcSAnYWxsJzsKCiAgICAjIHJlbWFwIHBhcmFtcwogICAgbXkgJVdvcmtPcmRlckdldCA9ICgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgYXMgYW5vbiBoYXNoIHJlZgogICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCglV29ya09yZGVyR2V0KTsKCiAgICAjIGNoZWNrIGZvciB3b3Jrb3JkZXIKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKCiAgICAjIGJ1aWxkIGFycmF5IHJlZgogICAgbXkgJFdvcmtPcmRlckRhdGEgPSBbJFdvcmtPcmRlcl07CgogICAgcmV0dXJuICRXb3JrT3JkZXJEYXRhOwp9Cgo9aGVhZDIgQ29tcGFyZVZhbHVlTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhdmFpbGFibGUgQ29tcGFyZVZhbHVlcyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpZCBvZiBhIEM8d29ya29yZGVyPiBvYmplY3QgYXMgaGFzaCByZWZlcmVuY2UuCgogICAgbXkgJENvbXBhcmVWYWx1ZUxpc3QgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTVdvcmtPcmRlci0+Q29tcGFyZVZhbHVlTGlzdCgKICAgICAgICBBdHRyaWJ1dGVOYW1lID0+ICdXb3JrT3JkZXJTdGF0ZUlEJywKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIGxpa2UgdGhpcywgZm9yIHRoZSBDPHdvcmtvcmRlcj4gYXR0cmlidXRlICdXb3JrT3JkZXJTdGF0ZUlEJzoKCiAgICAkQ29tcGFyZVZhbHVlTGlzdCA9IHsKICAgICAgICAxMCAgICA9PiAnY3JlYXRlZCcsCiAgICAgICAgMTIgICAgPT4gJ2FjY2VwdGVkJywKICAgICAgICAxMyAgICA9PiAncmVhZHknLAogICAgICAgIDE0ICAgID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgMTUgICAgPT4gJ2Nsb3NlZCcsCiAgICAgICAgMTYgICAgPT4gJ2NhbmNlbGVkJywKICAgIH0KCj1jdXQKCnN1YiBDb21wYXJlVmFsdWVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEF0dHJpYnV0ZU5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBsaXN0CiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9IHt9OwoKICAgICMgV29ya09yZGVyU3RhdGVJRAogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ1dvcmtPcmRlclN0YXRlSUQnICkgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgc3RhdGUgbGlzdAogICAgICAgICRDb21wYXJlVmFsdWVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgV29ya09yZGVyVHlwZUlECiAgICBlbHNpZiAoICRQYXJhbXtBdHRyaWJ1dGVOYW1lfSBlcSAnV29ya09yZGVyVHlwZUlEJyApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIHR5cGUgbGlzdAogICAgICAgICRDb21wYXJlVmFsdWVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyVHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ1dvcmtPcmRlckFnZW50SUQnICkgewoKICAgICAgICAjIGdldCBhIGNvbXBsZXRlIGxpc3Qgb2YgdXNlcnMKICAgICAgICBteSAlVXNlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRDb21wYXJlVmFsdWVMaXN0ID0gXCVVc2VyczsKICAgIH0KCiAgICByZXR1cm4gJENvbXBhcmVWYWx1ZUxpc3Q7Cn0KCj1oZWFkMiBTZWxlY3Rvckxpc3QoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHNlbGVjdG9ycyBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBDPHdvcmtvcmRlcj4gb2JqZWN0IGlkIGFuZCBjb25kaXRpb24gaWQgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkU2VsZWN0b3JMaXN0ID0gJENvbmRpdGlvbk9iamVjdElUU01Xb3JrT3JkZXItPlNlbGVjdG9yTGlzdCgKICAgICAgICBPYmplY3RJRCAgICA9PiAxMjM0LAogICAgICAgIENvbmRpdGlvbklEID0+IDUsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2UgbGlrZSB0aGlzOgoKICAgICRTZWxlY3Rvckxpc3QgPSB7CiAgICAgICAgMTAgICAgPT4gJzEgLSBXb3Jrb3JkZXJUaXRsZSBvZiBXb3Jrb3JkZXIgMScsCiAgICAgICAgMTIgICAgPT4gJzIgLSBXb3Jrb3JkZXJUaXRsZSBvZiBXb3Jrb3JkZXIgMicsCiAgICAgICAgMzQgICAgPT4gJzMgLSBXb3Jrb3JkZXJUaXRsZSBvZiBXb3Jrb3JkZXIgMycsCiAgICAgICAgJ2FueScgPT4gJ2FueScsCiAgICAgICAgJ2FsbCcgPT4gJ2FsbCcsCiAgICB9Cgo9Y3V0CgpzdWIgU2VsZWN0b3JMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIHdvcmtvcmRlciBpZHMgb2YgY2hhbmdlCiAgICBteSAkV29ya09yZGVySURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciB3b3Jrb3JkZXIgaWRzCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXJJRHM7CiAgICByZXR1cm4gaWYgcmVmICRXb3JrT3JkZXJJRHMgbmUgJ0FSUkFZJzsKCiAgICAjIGJ1aWxkIHNlbGVjdG9yIGxpc3QKICAgIG15ICVTZWxlY3Rvckxpc3Q7CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHskV29ya09yZGVySURzfSApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICBteSAkV29ya09yZGVyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZWN0b3JMaXN0eyAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlcklEfSB9CiAgICAgICAgICAgID0gJFdvcmtPcmRlckRhdGEtPntXb3JrT3JkZXJOdW1iZXJ9IC4gJyAtICcgLiAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlclRpdGxlfTsKICAgIH0KCiAgICAjIGFkZCAnYWxsJyBzZWxlY3RvciAoZm9yIGV4cHJlc3Npb25zIGFuZCBhY3Rpb25zKQogICAgJFNlbGVjdG9yTGlzdHsnYWxsJ30gPSBUcmFuc2xhdGFibGUoJ2FsbCcpOwoKICAgICMgYWRkICdhbnknIHNlbGVjdG9yIG9ubHkgZm9yIGV4cHJlc3Npb25zCiAgICBpZiAoICRQYXJhbXtFeHByZXNzaW9uSUR9ICkgewogICAgICAgICRTZWxlY3Rvckxpc3R7J2FueSd9ID0gVHJhbnNsYXRhYmxlKCdhbnknKTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWxlY3Rvckxpc3Q7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9EYXRhR2V0QWxsKCkKCiAgICBteSAkV29ya09yZGVyRGF0YUFycmF5UmVmID0gJENvbmRpdGlvbk9iamVjdElUU01Xb3JrT3JkZXItPl9EYXRhR2V0QWxsKAogICAgICAgIENvbmRpdGlvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfRGF0YUdldEFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmRpdGlvbgogICAgbXkgJENvbmRpdGlvbkRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRDb25kaXRpb25EYXRhOwoKICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgaWRzIG9mIGNoYW5nZQogICAgbXkgJFdvcmtPcmRlcklEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbkRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHdvcmtvcmRlciBpZHMKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcklEczsKICAgIHJldHVybiBpZiByZWYgJFdvcmtPcmRlcklEcyBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmICFAeyRXb3JrT3JkZXJJRHN9OwoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSBAV29ya09yZGVyRGF0YTsKICAgIFdPUktPUkRFUklEOgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc30gKSB7CiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdvcmtvcmRlcgogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgISRXb3JrT3JkZXI7CgogICAgICAgICMgYWRkIHdvcmtvcmRlciB0byByZXR1cm4gYXJyYXkKICAgICAgICBwdXNoIEBXb3JrT3JkZXJEYXRhLCAkV29ya09yZGVyOwogICAgfQoKICAgICMgcmV0dXJuIHdvcmtvcmRlciBkYXRhCiAgICByZXR1cm4gXEBXb3JrT3JkZXJEYXRhOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yL0lUU01DaGFuZ2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOjpJVFNNQ2hhbmdlIC0gY29uZGl0aW9uIGl0c20gY2hhbmdlIG9wZXJhdG9yIGxpYgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb25kaXRpb25PcGVyYXRvcklUU01DaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01DaGFuZ2UnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU2V0KCkKClVwZGF0ZXMgYSBjaGFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRJVFNNQ2hhbmdlT3BlcmF0b3ItPlNldCgKICAgICAgICBTZWxlY3RvciAgICA9PiAxMjM0LAogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBBY3Rpb25WYWx1ZSA9PiAyMzQ1LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZWxlY3RvciBBdHRyaWJ1dGUgQWN0aW9uVmFsdWUgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJENoYW5nZTsKICAgIHJldHVybiBpZiByZWYgJENoYW5nZSBuZSAnSEFTSCc7CgogICAgIyBzZXQgY2hhbmdlIGF0dHJpYnV0ZSB0byBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgbm90IHRydWUKICAgICRDaGFuZ2UtPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSB8fD0gJyc7CgogICAgIyBkbyBub3QgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgaXQgYWxyZWFkeSBoYXMgdGhpcyB2YWx1ZQogICAgIyAoIHRoaXMgd2lsbCBwcmV2ZW50IGluZmluaXRlIGV2ZW50IGxvb3BpbmchICkKICAgIHJldHVybiAxIGlmICRDaGFuZ2UtPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSBlcSAkUGFyYW17QWN0aW9uVmFsdWV9OwoKICAgICMgdXBkYXRlIGNoYW5nZSBhbmQgcmV0dXJuIHVwZGF0ZSByZXN1bHQKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAkUGFyYW17QXR0cmlidXRlfSA9PiAkUGFyYW17QWN0aW9uVmFsdWV9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yL0lUU01Xb3JrT3JkZXIucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlci5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOjpJVFNNV29ya09yZGVyIC0gY29uZGl0aW9uIGl0c20gd29ya29yZGVyIG9wZXJhdG9yIGxpYgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb25kaXRpb25PcGVyYXRvcklUU01Xb3JrT3JkZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01Xb3JrT3JkZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU2V0KCkKClVwZGF0ZXMgYSBDPHdvcmtvcmRlcj4gd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRJVFNNV29ya09yZGVyT3BlcmF0b3ItPlNldCgKICAgICAgICBTZWxlY3RvciAgICA9PiAxMjM0LAogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEJywKICAgICAgICBBY3Rpb25WYWx1ZSA9PiAyMzQ1LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZWxlY3RvciBBdHRyaWJ1dGUgQWN0aW9uVmFsdWUgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyCiAgICBteSAkV29ya09yZGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKICAgIHJldHVybiBpZiByZWYgJFdvcmtPcmRlciBuZSAnSEFTSCc7CgogICAgIyBzZXQgd29ya29yZGVyIGF0dHJpYnV0ZSB0byBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgbm90IHRydWUKICAgICRXb3JrT3JkZXItPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSB8fD0gJyc7CgogICAgIyBkbyBub3QgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgaXQgYWxyZWFkeSBoYXMgdGhpcyB2YWx1ZQogICAgIyAoIHRoaXMgd2lsbCBwcmV2ZW50IGluZmluaXRlIGV2ZW50IGxvb3BpbmchICkKICAgIHJldHVybiAxIGlmICRXb3JrT3JkZXItPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSBlcSAkUGFyYW17QWN0aW9uVmFsdWV9OwoKICAgICMgaWYgdGhlIHdvcmtvcmRlciBhZ2VudCBzaG91bGQgYmUgZGVsZXRlZCBpdCBoYXMgdG8gYmUgdW5kZWZpbmVkCiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGV9IGVxICdXb3JrT3JkZXJBZ2VudElEJyAmJiAhJFBhcmFte0FjdGlvblZhbHVlfSApIHsKICAgICAgICAkUGFyYW17QWN0aW9uVmFsdWV9ID0gdW5kZWY7CiAgICB9CgogICAgIyB1cGRhdGUgd29ya29yZGVyIGFuZCByZXR1cm4gdXBkYXRlIHJlc3VsdAogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICBXb3JrT3JkZXJJRCAgICAgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICRQYXJhbXtBdHRyaWJ1dGV9ID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwp9Cgo9aGVhZDIgU2V0QWxsKCkKClVwZGF0ZXMgYSBzZXQgb2YgQzx3b3Jrb3JkZXJzPiB3aXRoIHRoZSBnaXZlbiBkYXRhLgoKICAgIG15ICRTdWNjZXNzID0gJElUU01Xb3JrT3JkZXJPcGVyYXRvci0+U2V0QWxsKAogICAgICAgIE9iamVjdHMgICAgID0+IFsgey4uLn0sIHsuLi59LCBdLCAgIyBkYXRhIG9mIElUU01Xb3JrT3JkZXJzCiAgICAgICAgQXR0cmlidXRlICAgPT4gJ1dvcmtPcmRlclN0YXRlSUQnLAogICAgICAgIEFjdGlvblZhbHVlID0+IDIzNDUsCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgU2V0QWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdHMgQXR0cmlidXRlIEFjdGlvblZhbHVlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgb2JqZWN0cwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17T2JqZWN0c30gbmUgJ0FSUkFZJzsKCiAgICAjIHRoaXMgd2lsbCBiZSBzZXQgdG8gemVybyBpZiBhbnkgb2YgdGhlIFNldC1PcGVyYXRpb25zIGZhaWxzCiAgICBteSAkU2V0QWxsU3VjY2VzcyA9IDE7CgogICAgIyB1cGRhdGUgZWFjaCB3b3Jrb3JkZXIgb2JqZWN0CiAgICBXT1JLT1JERVJPQkpFQ1Q6CiAgICBmb3IgbXkgJFdvcmtPcmRlck9iamVjdCAoIEB7ICRQYXJhbXtPYmplY3RzfSB9ICkgewoKICAgICAgICAjIGNoZWNrIHdvcmtvcmRlciBvYmplY3QKICAgICAgICBuZXh0IFdPUktPUkRFUk9CSkVDVCBpZiAhJFdvcmtPcmRlck9iamVjdDsKICAgICAgICBuZXh0IFdPUktPUkRFUk9CSkVDVCBpZiByZWYgJFdvcmtPcmRlck9iamVjdCBuZSAnSEFTSCc7CgogICAgICAgICMgdXBkYXRlIHdvcmtvcmRlciBvYmplY3QKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPlNldCgKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFdvcmtPcmRlck9iamVjdC0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgaWYgYSBzZXQgb3BlcmF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwKICAgICAgICAjIHRoZW4gdGhlIGNvbXBsZXRlIFNldEFsbCBvcGVyYXRpb24gd2lsbCBub3QgYmUgc3VjY2Vzc2Z1bAogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZXRBbGxTdWNjZXNzID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZXRBbGxTdWNjZXNzOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL0V2ZW50L1Rvb2xCYXJNeVdvcmtPcmRlcnNDYWNoZURlbGV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBUb29sQmFyTXlXb3JrT3JkZXJzQ2FjaGVEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpUb29sQmFyTXlXb3JrT3JkZXJzQ2FjaGVEZWxldGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCB0aGUgY2FjaGUgdHlwZSBwcmVmaXgKICAgIG15ICRDYWNoZVR5cGVQcmVmaXggPSAnSVRTTUNoYW5nZU1hbmFnZW1lbnRUb29sQmFyTXlXb3JrT3JkZXJzJzsKCiAgICAjIGhhbmRsZSBhZGRpbmcgb2YgYSB3b3Jrb3JkZXIKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnV29ya09yZGVyQWRkUG9zdCcgKSB7CgogICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgV29ya09yZGVyQWdlbnRJRCB3YXMgbm90IHNldAogICAgICAgIHJldHVybiAxIGlmICEkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfTsKCiAgICAgICAgIyBzZXQgdGhlIGNhY2hlIHR5cGUKICAgICAgICBteSAkQ2FjaGVUeXBlID0gJENhY2hlVHlwZVByZWZpeCAuICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlckFnZW50SUR9OwoKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaGFuZGxlIHVwZGF0ZSBvZiBhIHdvcmtvcmRlcgogICAgZWxzaWYgKCAkUGFyYW17RXZlbnR9IGVxICdXb3JrT3JkZXJVcGRhdGVQb3N0JyApIHsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQKICAgICAgICAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfSB8fD0gJyc7CiAgICAgICAgJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfSB8fD0gJyc7CgogICAgICAgICMgZG8gbm90aGluZyBpZiB0aGUgV29ya09yZGVyQWdlbnRJRCBkaWQgbm90IGNoYW5nZQogICAgICAgIHJldHVybiAxCiAgICAgICAgICAgIGlmICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlckFnZW50SUR9IGVxCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e09sZFdvcmtPcmRlckRhdGF9LT57V29ya09yZGVyQWdlbnRJRH07CgogICAgICAgICMgc2V0IHRoZSBjYWNoZSB0eXBlIHBvc3RmaXgKICAgICAgICBteSBAQ2FjaGVUeXBlUG9zdGZpeGVzID0gKAogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUgZm9yIHRoZSBvbGQgYW5kIHRoZSBjdXJyZW50IHdvcmtvcmRlciBhZ2VudAogICAgICAgIENBQ0hFVFlQRVBPU1RGSVg6CiAgICAgICAgZm9yIG15ICRDYWNoZVR5cGVQb3N0Zml4IChAQ2FjaGVUeXBlUG9zdGZpeGVzKSB7CgogICAgICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlIFdvcmtPcmRlckFnZW50SUQgd2FzIG5vdCBzZXQKICAgICAgICAgICAgbmV4dCBDQUNIRVRZUEVQT1NURklYIGlmICEkQ2FjaGVUeXBlUG9zdGZpeDsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjYWNoZSB0eXBlCiAgICAgICAgICAgIG15ICRDYWNoZVR5cGUgPSAkQ2FjaGVUeXBlUHJlZml4IC4gJENhY2hlVHlwZVBvc3RmaXg7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGhhbmRsZSBkZWxldGluZyBhIHdvcmtvcmRlcgogICAgZWxzaWYgKCAkUGFyYW17RXZlbnR9IGVxICdXb3JrT3JkZXJEZWxldGVQb3N0JyApIHsKCiAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZSBXb3JrT3JkZXJBZ2VudElEIHdhcyBub3Qgc2V0CiAgICAgICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfS0+e09sZFdvcmtPcmRlckRhdGF9LT57V29ya09yZGVyQWdlbnRJRH07CgogICAgICAgICMgc2V0IHRoZSBjYWNoZSB0eXBlCiAgICAgICAgbXkgJENhY2hlVHlwZSA9ICRDYWNoZVR5cGVQcmVmaXggLiAkUGFyYW17RGF0YX0tPntPbGRXb3JrT3JkZXJEYXRhfS0+e1dvcmtPcmRlckFnZW50SUR9OwoKICAgICAgICAjIGRlbGV0ZSB0aGUgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL0V2ZW50L1dvcmtPcmRlckFjdHVhbFRpbWVzU2V0LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFdvcmtPcmRlckFjdHVhbFRpbWVzU2V0LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyQWN0dWFsVGltZXNTZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBXb3JrT3JkZXJVcGRhdGUgZXZlbnQKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnV29ya09yZGVyVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZ2V0IFdvcmtPcmRlcgogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgIyBnZXQgYWN0dWFsIHN0YXJ0IHRpbWUgZnJvbSB3b3Jrb3JkZXIKICAgICAgICBteSAkQWN0dWFsU3RhcnRUaW1lID0gJFdvcmtPcmRlci0+e0FjdHVhbFN0YXJ0VGltZX07CgogICAgICAgICMgZ2V0IGNvbmZpZ3VyZWQgd29ya29yZGVyIHN0YXRlcyB3aGVuIHRvIHNldCBhY3R1YWwgc3RhcnQgdGltZQogICAgICAgIG15ICRDb25maWd1cmVkV29ya09yZGVyU3RhcnRTdGF0ZXMKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkFjdHVhbFN0YXJ0VGltZVNldDo6U3RhdGVzJyk7CgogICAgICAgICMgY29udmVydCBpbnRvIGhhc2ggZm9yIGVhc2llciBsb29rdXAKICAgICAgICBteSAlQWN0dWFsU3RhcnRUaW1lU2V0U3RhdGVzID0gbWFwIHsgJF8gPT4gMSB9IEB7JENvbmZpZ3VyZWRXb3JrT3JkZXJTdGFydFN0YXRlc307CgogICAgICAgICMgZ2V0IGN1cnJlbnQgdGltZSBzdGFtcAogICAgICAgIG15ICRDdXJyZW50VGltZVN0YW1wID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CgogICAgICAgICMgY2hlY2sgaWYgQWN0dWFsU3RhcnRUaW1lIGlzIGVtcHR5LAogICAgICAgICMgYW5kIFdvcmtPcmRlclN0YXRlIGlzIGluIGFuIEFjdHVhbFN0YXJ0VGltZVNldFN0YXRlCiAgICAgICAgaWYgKCAhJEFjdHVhbFN0YXJ0VGltZSAmJiAkQWN0dWFsU3RhcnRUaW1lU2V0U3RhdGVzeyAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGV9IH0gKSB7CgogICAgICAgICAgICAjIHNldCB0aGUgYWN0dWFsIHN0YXJ0IHRpbWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICRDdXJyZW50VGltZVN0YW1wLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBBY3R1YWxTdGFydFRpbWUgZm9yIFdvcmtPcmRlcklEICckUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0nISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSBqdXN0IHNldCBhY3R1YWwgc3RhcnQgdGltZQogICAgICAgICAgICAkQWN0dWFsU3RhcnRUaW1lID0gJEN1cnJlbnRUaW1lU3RhbXA7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBBY3R1YWxFbmRUaW1lIGlzIGVtcHR5CiAgICAgICAgIyBhbmQgdGhlIGN1cnJlbnQgd29ya29yZGVyIHN0YXRlIGlzIGFuIGVuZCBzdGF0ZQogICAgICAgIGlmICggISRXb3JrT3JkZXItPntBY3R1YWxFbmRUaW1lfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBwb3NzaWJsZSBuZXh0IHN0YXRlIGlkcwogICAgICAgICAgICBteSAkTmV4dFN0YXRlSURzUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgb25seSBvbmUgbmV4dCBzdGF0ZSwgd2hpY2ggaXMgYWxzbyAwLAogICAgICAgICAgICAjIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBpcyBhbiBlbmQgc3RhdGUKICAgICAgICAgICAgaWYgKCAoIHNjYWxhciBAeyROZXh0U3RhdGVJRHNSZWZ9ID09IDEgKSAmJiAoICEkTmV4dFN0YXRlSURzUmVmLT5bMF0gKSApIHsKCiAgICAgICAgICAgICAgICAjIGlmIG5vIGFjdHVhbCBzdGFydCB0aW1lIGlzIHNldCwgdXNlIHRoZSBjdXJyZW50IHRpbWUKICAgICAgICAgICAgICAgIGlmICggISRBY3R1YWxTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjdHVhbFN0YXJ0VGltZSA9ICRDdXJyZW50VGltZVN0YW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIGN1cnJlbnQgdGltZSBzdGFtcCBieSBvbmUgc2Vjb25kIHRvIGF2b2lkIHRoZSBjYXNlIHRoYXQKICAgICAgICAgICAgICAgICMgYWN0dWFsIHN0YXJ0IGFuZCBlbmQgdGltZXMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgICAgICBteSAkQWN0dWFsRW5kVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDdXJyZW50VGltZVN0YW1wLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFjdHVhbEVuZFRpbWUtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFjdHVhbEVuZFRpbWUgPSAkQWN0dWFsRW5kVGltZS0+VG9TdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgYWN0dWFsIGVuZCB0aW1lLAogICAgICAgICAgICAgICAgIyBhbmQgaWYgdGhlIGFjdHVhbCBzdGFydCB0aW1lIHdhcyBub3Qgc2V0LCBzZXQgaXQgYWxzbwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgPT4gJEFjdHVhbFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJEFjdHVhbEVuZFRpbWUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgQWN0dWFsU3RhcnRUaW1lIGZvciBXb3JrT3JkZXJJRCAnJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9JyEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZXJyb3IKICAgIGVsc2UgewoKICAgICAgICAjIGFuIHVua25vd24gZXZlbnQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbXtFdmVudH0gaXMgYW4gdW5rbm93biBldmVudCBmb3IgdGhpcyBldmVudGhhbmRsZXIhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL0V2ZW50L1dvcmtPcmRlck51bWJlckNhbGMucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogV29ya09yZGVyTnVtYmVyQ2FsYy5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6RXZlbnQ6OldvcmtPcmRlck51bWJlckNhbGM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcmVjYWxjdWxhdGlvbiBvZiB3b3Jrb3JkZXIgbnVtYmVycyBpcyBuZWVkZWQKICAgIHJldHVybiAxIGlmICRQYXJhbXtEYXRhfS0+e05vTnVtYmVyQ2FsY307CgogICAgIyBoYW5kbGUgV29ya09yZGVyVXBkYXRlIGFuZCBXb3JrT3JkZXJEZWxldGVQb3N0IGV2ZW50cwogICAgaWYgKCAkUGFyYW17RXZlbnR9ID1+IG17IFxBICggV29ya09yZGVyVXBkYXRlUG9zdCB8IFdvcmtPcmRlckRlbGV0ZVBvc3QgKSBceiB9eG1zICkgewoKICAgICAgICAjIHJlY2FsY3VsYXRlIFdvcmtPcmRlciBudW1iZXJzCiAgICAgICAgIyB0aGUgQ2hhbmdlSUQgaXMgaW4gdGhlIE9sZFdvcmtPcmRlckRhdGEgc28gd2UgZG8gbm90IG5lZWQgdG8gbWFrZSBhIFdvcmtPcmRlckdldCgpIGhlcmUKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fV29ya09yZGVyTnVtYmVyQ2FsYygKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBlcnJvcgogICAgZWxzZSB7CgogICAgICAgICMgYW4gdW5rbm93biBldmVudAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFte0V2ZW50fSBpcyBhbiB1bmtub3duIGV2ZW50IGZvciB0aGlzIGV2ZW50aGFuZGxlciEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX1dvcmtPcmRlck51bWJlckNhbGMoKQoKVGhpcyBtZXRob2QgYWN0dWFsbHkgcmVjYWxjdWxhdGVzIHRoZSBXb3JrT3JkZXJOdW1iZXJzIGZvciB0aGUgQzx3b3Jrb3JkZXJzPiBvZgp0aGUgZ2l2ZW4gY2hhbmdlLgpJdCByZXR1cm5zIDEgb24gc3VjY2VzcywgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEV2ZW50T2JqZWN0LT5fV29ya09yZGVyTnVtYmVyQ2FsYygKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1dvcmtPcmRlck51bWJlckNhbGMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYgLSBDaGFuZ2VJRCBhbmQgVXNlcklECiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmaW5lIHRoZSBvcmRlciBkaXJlY3Rpb24gZm9yIGVhY2ggYXR0cmlidXRlCiAgICBteSAlT3JkZXJEaXJlY3Rpb24gPSAoCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnVXAnLAogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJ0Rvd24nLAogICAgICAgIFdvcmtPcmRlcklEICAgICAgPT4gJ1VwJywKICAgICk7CgogICAgIyBkZWZpbmUgdGhlIE9yZGVyQnkgYXJyYXkKICAgIG15IEBPcmRlckJ5ID0gKAogICAgICAgICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAnUGxhbm5lZEVuZFRpbWUnLAogICAgICAgICdXb3JrT3JkZXJJRCcsCiAgICApOwoKICAgICMgZGVmaW5lIHRoZSBPcmRlckJ5RGlyZWN0aW9uIGFycmF5CiAgICBteSBAT3JkZXJCeURpcmVjdGlvbiA9IG1hcCB7ICRPcmRlckRpcmVjdGlvbnskX30gfSBAT3JkZXJCeTsKCiAgICAjIHVzZSBXb3JrT3JkZXJTZWFyY2g6IFNlYXJjaCBmb3IgZ2l2ZW4gSURzLCBvcmRlcmVkIGJ5OgogICAgIyBQbGFubmVkU3RhcnRUaW1lLCBQbGFubmVkRW5kVGltZSwgV29yT3JkZXJJRAogICAgbXkgJFNvcnRlZFdvcmtPcmRlcklEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlclNlYXJjaCgKICAgICAgICBDaGFuZ2VJRHMgICAgICAgID0+IFsgJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBPcmRlckJ5LAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5RGlyZWN0aW9uLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgY291bnRlciAtIHVzZWQgYXMgV29ya09yZGVyTnVtYmVyCiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyB0byBzdG9yZSB0aGUgV29ya09yZGVySURzIGFuZCB0aGVpciBuZXcgV29ya09yZGVyTnVtYmVycwogICAgbXkgJU5ld1dvcmtPcmRlck51bWJlcjsKCiAgICAjIHNldCBuZXcgV29ya09yZGVyTnVtYmVyCiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyRTb3J0ZWRXb3JrT3JkZXJJRHN9ICkgewoKICAgICAgICAjIGluY3JlbWVudCBDb3VudGVyIHRvIGdldCBuZXcgV29ya09yZGVyTnVtYmVyCiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgIyBnZXQgV29ya09yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBvbmx5IHdoZW4gTnVtYmVyIGNoYW5nZWQgLSB0byBhdm9pZCBpbmZpbml0IGxvb3BzCiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAkQ291bnRlciA9PSAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfTsKCiAgICAgICAgIyBzdG9yZSB0aGUgbmV3IFdvcmtPcmRlck51bWJlciBmb3IgdGhpcyBXb3JrT3JkZXJJRAogICAgICAgICROZXdXb3JrT3JkZXJOdW1iZXJ7JFdvcmtPcmRlcklEfSA9ICRDb3VudGVyOwogICAgfQoKICAgICMgdXBkYXRlIHRoZSB3b3Jrb3JkZXJzIHRoYXQgbmVlZCBhIG5ldyBXb3JrT3JkZXJOdW1iZXIKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBzb3J0IGtleXMgJU5ld1dvcmtPcmRlck51bWJlciApIHsKCiAgICAgICAgIyB1cGRhdGUgZWFjaCB3b3Jrb3JkZXIsIHByZXZlbnQgcmVjYWxjdWxhdGlvbiBvZiB0aGUgV29ya09yZGVyTnVtYmVyIGFnYWluCiAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBXb3JrT3JkZXJOdW1iZXIgPT4gJE5ld1dvcmtPcmRlck51bWJlcnskV29ya09yZGVySUR9LAogICAgICAgICAgICBOb051bWJlckNhbGMgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ0FCQ2hlY2sucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ0FCQ2hlY2sucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNBQkNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q0FCQ2hlY2sgLSBDQUIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDQUJDaGVjaycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suIEFjY2VzcyBpcyBhbGxvd2VkIHdoZW4gdHlwZSBpcyBDPHJvPiBhbmQgdGhlIGFnZW50IGlzIGEgbWVtYmVyCm9mIHRoZSBDQUIgb2YgdGhlIGNoYW5nZSBvZiB0aGUgQzx3b3Jrb3JkZXI+LgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICAgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgV29ya09yZGVySUQgPT4gNDQ0NCwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSB3b3Jrb3JkZXIKICAgIG15ICRXb3JrT3JkZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiBubyB3b3Jrb3JkZXIgd2FzIGZvdW5kCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXIgfHwgISV7JFdvcmtPcmRlcn0gfHwgISRXb3JrT3JkZXItPntDaGFuZ2VJRH07CgogICAgIyBnZXQgdGhlIENBQiBvZiB0aGUgY2hhbmdlCiAgICBteSAkQ0FCID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQ0FCR2V0KAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICApOwoKICAgICMgbG9vayBmb3IgYSBDQUIgbWVtYmVyIHdpdGggdGhlIHJlbGV2YW50IFVzZXJJRAogICAgbXkgKCRGb3VuZENBQk1lbWJlcikgPSBncmVwIHsgJF8gPT0gJFBhcmFte1VzZXJJRH0gfSBAeyAkQ0FCLT57Q0FCQWdlbnRzfSB9OwoKICAgICMgYWxsb3cgYWNjZXNzIHRoZSB0aGUgYWdlbnQgaXMgYSBDQUIgbWVtYmVyCiAgICByZXR1cm4gMSBpZiAkRm91bmRDQUJNZW1iZXI7CgogICAgIyBkZW55IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKfQoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ2hhbmdlQnVpbGRlckNoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENoYW5nZUJ1aWxkZXJDaGVjay5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q2hhbmdlQnVpbGRlckNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2sgLSBjaGFuZ2UgYnVpbGRlciBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0LgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENoZWNrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjaycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suIEM8cm8+IGFuZCBDPHJ3PiBhY2Nlc3MgaXMgZ3JhbnRlZAp3aGVuIHRoZSBhZ2VudCBoYXMgdGhlIEM8cHJpdj4gaW4gdGhlICdpdHNtLWNoYW5nZS1idWlsZGVyJyBncm91cCBhbmQKd2hlbiB0aGUgYWdlbnQgaXMgdGhlIGNoYW5nZSBidWlsZGVyIG9mIHRoZSBjaGFuZ2UuCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBXb3JrT3JkZXJJRCA9PiA0NDQ0LAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUgV29ya09yZGVySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgYnVpbGRlcgogICAgbXkgJEdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgKTsKCiAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgZG8gbm90IGdyYW50IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSB3b3Jrb3JkZXIuIGUuZy4gQWdlbnRJVFNNV29ya09yZGVyRWRpdAogICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MsIHdoZW4gbm8gd29ya29yZGVyIHdhcyBmb3VuZAogICAgcmV0dXJuIGlmICEkV29ya09yZGVyIHx8ICEleyRXb3JrT3JkZXJ9IHx8ICEkV29ya09yZGVyLT57Q2hhbmdlSUR9OwoKICAgICMgZm9yIGNoZWNraW5nIHRoZSBjaGFuZ2UgYnVpbGRlciwgd2UgbmVlZCBpbmZvcm1hdGlvbiBvbiB0aGUgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICApOwoKICAgICMgZG8gbm90IGdyYW50IGFjY2Vzcywgd2hlbiBubyBjaGFuZ2Ugd2FzIGZvdW5kCiAgICByZXR1cm4gaWYgISRDaGFuZ2UgfHwgISV7JENoYW5nZX0gfHwgISRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9OwoKICAgICMgYWxsb3cgYWNjZXNzLCB3aGVuIHRoZSBhZ2VudCBpcyB0aGUgY2hhbmdlIGJ1aWxkZXIgb2YgdGhlIGNoYW5nZQogICAgcmV0dXJuIDEgaWYgJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH0gPT0gJFBhcmFte1VzZXJJRH07CgogICAgIyBkbyBub3QgZ3JhbnQgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ2hhbmdlTWFuYWdlckNoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENoYW5nZU1hbmFnZXJDaGVjay5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrIC0gY2hhbmdlIG1hbmFnZXIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VNYW5hZ2VyQ2hlY2snKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBDPHJvPiBhbmQgQzxydz4gYWNjZXNzIGlzIGdyYW50ZWQKd2hlbiB0aGUgYWdlbnQgaGFzIHRoZSBDPHByaXY+IGluIHRoZSAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgZ3JvdXAuCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBXb3JrT3JkZXJJRCA9PiA0NDQ0LAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUgV29ya09yZGVySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgbWFuYWdlcgogICAgbXkgJEdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJ2l0c20tY2hhbmdlLW1hbmFnZXInLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgKTsKCiAgICAjIGFsbG93IHJvIGFuZCBydyBhY2Nlc3MgaWYgdGhlIGFnZW50IGlzIGEgY2hhbmdlIG1hbmFnZXIKICAgIHJldHVybiAxIGlmICRHcm91cHN7JEdyb3VwSUR9OwoKICAgICMgbm8gbmVlZCB0byBjaGVjayBpZiB0aGUgYWdlbnQgaXMgdGhlIGFjdHVhbCBtYW5hZ2VyIG9mIHRoZSBjaGFuZ2Ugb2YgdGhlIHdvcmtvcmRlcgoKICAgICMgZGVueSBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vRW1wdHlBZ2VudENoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEVtcHR5QWdlbnRDaGVjay5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6RW1wdHlBZ2VudENoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkVtcHR5QWdlbnRDaGVjayAtIGdyYW50IHBlcm1pc3Npb24gd2hlbiBhZ2VudCBpcyBlbXB0eQoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpFbXB0eUFnZW50Q2hlY2snKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBDPHJvPiBhY2Nlc3MgaXMgZ3JhbnRlZCB3aGVuIHRoZSBhZ2VudCBpcyBhIEM8cm8+IG1lbWJlcgpvZiB0aGUgJ2l0c20tY2hhbmdlJyBncm91cC4gQzxydz4gYWNjZXNzIGlzIGdyYW50ZWQgd2hlbiB0aGUgQzx3b3Jrb3JkZXI+IGhhcyBubyBhZ2VudC4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIFdvcmtPcmRlcklEID0+IDQ0NDQsCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgVHlwZSBXb3JrT3JkZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdGhlIGNoZWNrIGlzIGJhc2VkIHVwb24gdGhlIHdvcmtvcmRlciBhZ2VudAogICAgbXkgJEdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJ2l0c20tY2hhbmdlJywKICAgICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB0aGUgZ3JvdXAgaXMgbm90IGZvdW5kCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZQogICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIHdvcmtvcmRlciBhZ2VudHMgYXJlIGdyYW50ZWQgcm8gYWNjZXNzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17VHlwZX0gZXEgJ3JvJzsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSB3b3Jrb3JkZXIuIGUuZy4gQWdlbnRJVFNNV29ya09yZGVyRWRpdAogICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIG5vIHdvcmtvcmRlciB3YXMgZm91bmQKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlciB8fCAhJXskV29ya09yZGVyfTsKCiAgICAjIGFsbG93IGFjY2Vzcywgd2hlbiB0aGVyZSBpcyBubyB3b3Jrb3JkZXIgYWdlbnQKICAgIHJldHVybiAxIGlmICEkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB3b3Jrb3JkZXIgYWdlbnQgaXMgZW1wdHkKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9OwoKICAgICMgZGVueSBydyBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vTGlzdEFnZW50Q2hlY2sucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTGlzdEFnZW50Q2hlY2sucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246Okxpc3RBZ2VudENoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6TGlzdEFnZW50Q2hlY2sgLSBncmFudCBwZXJtaXNzaW9uIHdoZW4gdGhlIGFnZW50IGlzIGluIGEgbGlzdAoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENoZWNrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246Okxpc3RBZ2VudENoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gQzxybz4gYWNjZXNzIGlzIGdyYW50ZWQgd2hlbiB0aGUgYWdlbnQgaXMgYSBDPHJvPiBtZW1iZXIKb2YgdGhlICdpdHNtLWNoYW5nZScgZ3JvdXAuIEM8cnc+IGFjY2VzcyBpcyBncmFudGVkIHdoZW4gdGhlIGN1cnJlbnQgQzx3b3Jrb3JkZXI+IGFnZW50CmlzIGNvbnRhaW5lZCBpbiB0aGUgY29uZmlndXJlZCBsaXN0LgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICAgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgV29ya09yZGVySUQgPT4gNDQ0NCwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSB3b3Jrb3JkZXIgYWdlbnQKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICdpdHNtLWNoYW5nZScsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyB3b3Jrb3JkZXIgYWdlbnRzIGFyZSBncmFudGVkIHJvIGFjY2VzcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1R5cGV9IGVxICdybyc7CgogICAgIyB0aGVyZSBhbHJlYWR5IGlzIGEgd29ya29yZGVyLiBlLmcuIEFnZW50SVRTTVdvcmtPcmRlckVkaXQKICAgIG15ICRXb3JrT3JkZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiBubyB3b3Jrb3JkZXIgd2FzIGZvdW5kCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXIgfHwgISV7JFdvcmtPcmRlcn07CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB3b3Jrb3JkZXIgYWdlbnQgaXMgZW1wdHkKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9OwoKICAgIG15ICRXb3JrT3JkZXJBZ2VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgVXNlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSwKICAgICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB0aGUgbmFtZSBjYW4gbm90IGJlIGxvb2tlZCB1cAogICAgcmV0dXJuIGlmICEkV29ya09yZGVyQWdlbnQ7CgogICAgIyB0YWtlIGxpc3Qgb2Ygc3BlY2lhbCBhZ2VudHMgZnJvbSB0aGUgc3lzY29uZmlnCiAgICBteSAkQWdlbnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNV29ya09yZGVyOjpUYWtlUGVybWlzc2lvbjo6TGlzdCcpOwoKICAgICMgYWxsb3cgYWNjZXNzLCB3aGVuIHRoZSB3b3Jrb3JkZXIgYWdlbnQgaXMgaW4gdGhlIGxpc3QKICAgIHJldHVybiAxIGlmICRBZ2VudExpc3QtPnskV29ya09yZGVyQWdlbnR9OwoKICAgICMgZGVueSBydyBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vV29ya09yZGVyQWdlbnRDaGVjay5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBXb3JrT3JkZXJBZ2VudENoZWNrLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpXb3JrT3JkZXJBZ2VudENoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OldvcmtPcmRlckFnZW50Q2hlY2sgLSB3b3Jrb3JkZXIgYWdlbnQgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpXb3JrT3JkZXJBZ2VudENoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gQzxybz4gYWNjZXNzIGlzIGdyYW50ZWQgd2hlbiB0aGUgYWdlbnQgaXMgYSBDPHJvPiBtZW1iZXIKb2YgdGhlICdpdHNtLWNoYW5nZScgZ3JvdXAuIEM8cnc+IGFjY2VzcyBpcyBncmFudGVkIHdoZW4gdGhlIGFnZW50IGlzIHRoZSBDPHdvcmtvcmRlcj4gYWdlbnQKb2YgdGhlIEM8d29ya29yZGVyPi4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIFdvcmtPcmRlcklEID0+IDQ0NDQsICAgICAjIG9wdGlvbmFsIGZvciBXb3JrT3JkZXJBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgY2hlY2sgaXMgYmFzZWQgdXBvbiB0aGUgd29ya29yZGVyIGFnZW50CiAgICBteSAkR3JvdXBJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCA9PiAnaXRzbS1jaGFuZ2UnLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzIGlmIHRoZSBhZ2VudCBkb2Vzbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW4gdGhlIGFwcHJvcHJpYXRlIGdyb3VwCiAgICByZXR1cm4gaWYgISRHcm91cHN7JEdyb3VwSUR9OwoKICAgICMgd29ya29yZGVyIGFnZW50cyBhcmUgZ3JhbnRlZCBybyBhY2Nlc3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtUeXBlfSBlcSAncm8nOwoKICAgICMgdGhlcmUgYWxyZWFkeSBpcyBhIHdvcmtvcmRlci4gZS5nLiBBZ2VudElUU01Xb3JrT3JkZXJFZGl0CiAgICBteSAkV29ya09yZGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gbm8gd29ya29yZGVyIHdhcyBmb3VuZAogICAgcmV0dXJuIGlmICEkV29ya09yZGVyIHx8ICEleyRXb3JrT3JkZXJ9IHx8ICEkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CgogICAgIyBhbGxvdyBhY2Nlc3MsIHdoZW4gdGhlIGFnZW50IGlzIHRoZSB3b3Jrb3JkZXIgYWdlbnQgb2YgdGhlIHdvcmtvcmRlcgogICAgcmV0dXJuIDEgaWYgJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9ID09ICRQYXJhbXtVc2VySUR9OwoKICAgICMgZGVueSBydyBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9OdW1iZXJCYXNlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE51bWJlckJhc2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok51bWJlckJhc2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgVGltZTo6SGlSZXMoKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkV4Y2x1c2l2ZUxvY2snLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok51bWJlckJhc2UgLSBDb21tb24gZnVuY3Rpb25zIGZvciBjaGFuZ2UgbnVtYmVyIGdlbmVyYXRvcnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICgkVHlwZSkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIElzRGF0ZUJhc2VkKCkKCmluZm9ybXMgaWYgdGhlIGN1cnJlbnQgbnVtYmVyIGNvdW50ZXIgaGFzIGEgcmVzZXQgd2l0aCBldmVyeSBuZXcgZGF5IG9yIG5vdC4gQWxsIGdlbmVyYXRvcnMKbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KCiAgICBteSAkSXNEYXRlYmFzZWQgPSAkQ2hhbmdlTnVtYmVyT2JqZWN0LT5Jc0RhdGVCYXNlZCgpOwoKPWN1dAoKPWhlYWQyIENoYW5nZU51bWJlckNvdW50ZXJBZGQoKQoKQWRkIGEgbmV3IHVuaXF1ZSBjaGFuZ2UgY291bnRlciBlbnRyeS4gVGhlc2UgY291bnRlcnMgYXJlIHVzZWQgYnkgdGhlIGRpZmZlcmVudCBudW1iZXIgZ2VuZXJhdG9ycwogICAgdG8gZ2VuZXJhdGUgdW5pcXVlIEM8Q2hhbmdlTnVtYmVyPnMKCiAgICBteSAkQ291bnRlciA9ICRDaGFuZ2VOdW1iZXJPYmplY3QtPkNoYW5nZU51bWJlckNvdW50ZXJBZGQoCiAgICAgICAgT2Zmc2V0ICAgICAgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgbXkgJENvdW50ZXIgPSAxMjM7ICAjIHVuZGVmIGluIGNhc2Ugb2YgYW4gZXJyb3IKClRoaXMgbWV0aG9kIGhhcyBsb2dpYyB0byBnZW5lcmF0ZSB1bmlxdWUgbnVtYmVycyBldmVuIHRob3VnaCBjb25jdXJyZW50IHByb2Nlc3NlcyBtaWdodCB3cml0ZSB0byB0aGUKc2FtZSB0YWJsZS4gVGhlIGFsZ29yaXRobSBydW5zIGFzIGZvbGxvd3M6CiAgICAtIEluc2VydCBhIG5ldyByZWNvcmQgaW50byB0aGUgQzxjaGFuZ2VfbnVtYmVyX2NvdW50ZXI+IHRhYmxlIHdpdGggYSBDPGNvdW50ZXI+IHZhbHVlIG9mIDAuCiAgICAtIFRoZW4gdXBkYXRlIGFsbCBwcmVjZWRpbmcgcmVjb3JkcyBpbmNsdWRpbmcgYW5kIHVwIHRvIHRoZSBjdXJyZW50IG9uZSB0aGF0IHN0aWxsIGhhdmUgdmFsdWUgMCBhbmQgY29tcHV0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgZWFjaCwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgcHJldmlvdXMgcmVjb3JkLgoKVGhpcyB3b3JrcyB3ZWxsIGFsc28gaWYgY29uY3VycmVudCBwcm9jZXNzZXMgd3JpdGUgdG8gdGhlIHJlY29yZHMgYXQgdGhlIHNhbWUgdGltZSwgYmVjYXVzZSB0aGV5IHdpbGwgY29tcHV0ZSB0aGUgc2FtZSAodW5pcXVlKSB2YWx1ZXMgZm9yIHRoZSBjb3VudGVycy4KCj1jdXQKCnN1YiBDaGFuZ2VOdW1iZXJDb3VudGVyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte09mZnNldH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE9mZnNldCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIUlzUG9zaXRpdmVJbnRlZ2VyKCAkUGFyYW17T2Zmc2V0fSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2Zmc2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb3VudGVyVUlEID0gJFNlbGYtPl9HZXRVSUQoKTsKCiAgICByZXR1cm4gaWYgISRDb3VudGVyVUlEOwoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICk7CiAgICBteSAkQ3VycmVudFRpbWVTdHJpbmcgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBJbnNlcnQgbmV3IGNoYW5nZSBjb3VudGVyIGludG8gdGhlIGRhdGFiYXNlICh3aXRoIHZhbHVlIDApCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gY2hhbmdlX251bWJlcl9jb3VudGVyCiAgICAgICAgICAgICAgICAoY291bnRlciwgY291bnRlcl91aWQsIGNyZWF0ZV90aW1lKQogICAgICAgICAgICBWQUxVRVMKICAgICAgICAgICAgICAgICggIDAsID8sID8gKScsCiAgICAgICAgQmluZCA9PiBbIFwkQ291bnRlclVJRCwgXCRDdXJyZW50VGltZVN0cmluZyBdLAogICAgKTsKCiAgICAjIEl0J3Mgc3RyYW5nZSwgYnV0IHRoaXMgc2xlZXAgc2VlbXMgdG8gYmUgbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IG90aGVyIGRhdGFiYXNlIHNlc3Npb25zIGFsc28gc2VlIHRoaXMgcmVjb3JkLgogICAgIyAgIFdpdGhvdXQgaXQsIHRoZXJlIHdlcmUgcmFjZSBjb25kaXRpb25zIGJlY2F1c2UgdGhlIGZpbGx1cCBvZiB1bnNldCB2YWx1ZXMgYmVsb3cgZGlkbid0IGZpbmQgcmVjb3JkcyB0aGF0IG90aGVyCiAgICAjICAgc2Vzc2lvbnMgYWxyZWFkeSBpbnNlcnRlZC4KICAgIFRpbWU6OkhpUmVzOjpzbGVlcCgwLjA1KTsKCiAgICAjIEdldCB0aGUgSUQgb2YgdGhlIGp1c3QgaW5zZXJ0ZWQgY2hhbmdlIGNvdW50ZXIuCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQKICAgICAgICAgICAgRlJPTSBjaGFuZ2VfbnVtYmVyX2NvdW50ZXIKICAgICAgICAgICAgV0hFUkUgY291bnRlcl91aWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQ291bnRlclVJRCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRDb3VudGVySUQ7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvdW50ZXJJRCA9ICREYXRhWzBdOwogICAgfQoKICAgICMgQ2FsY3VsYXRlIHRoZSBjb3VudGVyIHZhbHVlcyBmb3IgYWxsIHJlY29yZHMgdGhhdCBkb24ndCBoYXZlIGEgZ2VuZXJhdGVkIHZhbHVlIHlldC4KICAgICMgICBUaGlzIGlzIHNhZmUgZXZlbiBpZiBtdWx0aXBsZSBwcm9jZXNzZXMgYWNjZXNzIHRoZSByZWNvcmRzIGF0IHRoZSBzYW1lIHRpbWUuCgogICAgbXkgJERhdGVDb25kaXRpb25TUUwgPSAnJzsKCiAgICAjIE9ubHkgZ2V0IGNvdW50ZXJzIGZyb20gdGhlIGN1cnJlbnQgZGF0ZSBpZiB0aGUgbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUgaXMgZGF0ZSBiYXNlZC4KICAgIGlmICggJFNlbGYtPklzRGF0ZUJhc2VkKCkgKSB7CgogICAgICAgIG15ICREYXRlVGltZVNldHRpbmdzID0gJERhdGVUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEhvdXIgTWludXRlIFNlY29uZCkpIHsKICAgICAgICAgICAgJERhdGVUaW1lU2V0dGluZ3MtPnskRWxlbWVudH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5TZXQoICV7JERhdGVUaW1lU2V0dGluZ3N9ICk7CiAgICAgICAgJERhdGVDb25kaXRpb25TUUwgPSAiIEFORCBjcmVhdGVfdGltZSA+PSAnIiAuICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKSAuICInIjsKICAgIH0KCiAgICBteSAkU1FMID0gIgogICAgICAgIFNFTEVDVCBpZAogICAgICAgIEZST00gY2hhbmdlX251bWJlcl9jb3VudGVyCiAgICAgICAgV0hFUkUgY291bnRlciA9IDAKICAgICAgICAgICAgQU5EIGlkIDw9ID8KICAgICAgICAgICAgJERhdGVDb25kaXRpb25TUUwKICAgICAgICBPUkRFUiBCWSBpZCBBU0MiOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsgXCRDb3VudGVySUQgXQogICAgKTsKCiAgICBteSBAVW5zZXRDb3VudGVySURzOwoKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFVuc2V0Q291bnRlcklEcywgJFJvd1swXTsKICAgIH0KCiAgICBteSAkU2V0T2Zmc2V0OwogICAgZm9yIG15ICRVbnNldENvdW50ZXJJRCAoQFVuc2V0Q291bnRlcklEcykgewoKICAgICAgICAjIEdldCBwcmV2aW91cyBjb3VudGVyIHJlY29yZCB2YWx1ZSAodG9sZXJhdGUgZ2FwcykuCiAgICAgICAgbXkgJFByZXZpb3VzQ291bnRlciA9IDA7CgogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QgY291bnRlcgogICAgICAgICAgICBGUk9NIGNoYW5nZV9udW1iZXJfY291bnRlcgogICAgICAgICAgICBXSEVSRSBpZCA8ID8KICAgICAgICAgICAgICAgICREYXRlQ29uZGl0aW9uU1FMCiAgICAgICAgICAgIE9SREVSIEJZIGlkIERFU0MiLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkVW5zZXRDb3VudGVySUQgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRQcmV2aW91c0NvdW50ZXIgPSAkRGF0YVswXSB8fCAwOwogICAgICAgIH0KCiAgICAgICAgIyBPZmZzZXQgbXVzdCBvbmx5IGJlIHNldCBvbmNlIChmb2xsb3dpbmcgYXJlIGNvbnNlY3V0aXZlKS4KICAgICAgICBteSAkTmV3Q291bnRlciA9ICRQcmV2aW91c0NvdW50ZXIgKyAxOwogICAgICAgIGlmICggISRTZXRPZmZzZXQgKSB7CiAgICAgICAgICAgICROZXdDb3VudGVyID0gJFByZXZpb3VzQ291bnRlciArICRQYXJhbXtPZmZzZXR9OwogICAgICAgICAgICAkU2V0T2Zmc2V0ICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIFVwZGF0ZSB0aGUgY291bnRlciB2YWx1ZSwgdW5sZXNzIGFub3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpZCBpdC4KICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBVUERBVEUgY2hhbmdlX251bWJlcl9jb3VudGVyCiAgICAgICAgICAgICAgICBTRVQgY291bnRlciA9ID8KICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICAgICAgICAgICAgIEFORCBjb3VudGVyID0gMCcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJE5ld0NvdW50ZXIsIFwkVW5zZXRDb3VudGVySUQgXSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRoZSBqdXN0IGluc2VydGVkIGNoYW5nZSBjb3VudGVyIHdpdGggdGhlIG5vdyBjb21wdXRlZCB2YWx1ZS4KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBjb3VudGVyCiAgICAgICAgICAgIEZST00gY2hhbmdlX251bWJlcl9jb3VudGVyCiAgICAgICAgICAgIFdIRVJFIGNvdW50ZXJfdWlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJENvdW50ZXJVSUQgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkQ291bnRlcjsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnRlciA9ICREYXRhWzBdOwogICAgfQoKICAgIHJldHVybiAkQ291bnRlcjsKfQoKPWhlYWQyIENoYW5nZU51bWJlckNvdW50ZXJEZWxldGUoKQoKUmVtb3ZlIGEgY2hhbmdlIGNvdW50ZXIgZW50cnkuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlTnVtYmVyT2JqZWN0LT5DaGFuZ2VOdW1iZXJDb3VudGVyRGVsZXRlKAogICAgICAgIENvdW50ZXJJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICBteSAkU3VjY2VzcyA9IDE7ICAjIGZhbHNlIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBDaGFuZ2VOdW1iZXJDb3VudGVyRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte0NvdW50ZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENvdW50ZXJJRCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBEZWxldGUgY291bnRlciBmcm9tIHRoZSBsaXN0LgogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX251bWJlcl9jb3VudGVyIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q291bnRlcklEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENoYW5nZU51bWJlckNvdW50ZXJJc0VtcHR5KCkKCkNoZWNrIGlmIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIGNoYW5nZV9udW1iZXJfY291bnRlciBEQiB0YWJsZS4KCiAgICBteSAkSXNFbXB0eSA9ICRDaGFuYWdlTnVtYmVyT2JqZWN0LT5DaGFuZ2VOdW1iZXJDb3VudGVySXNFbXB0eSgpOwoKUmV0dXJuczoKCiAgICBteSAkSXNFbXB0eSA9IDE7ICAjIDAgaWYgaXQgaXMgbm90IGVtcHR5IGFuZCB1bmRlZiBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0CgpzdWIgQ2hhbmdlTnVtYmVyQ291bnRlcklzRW1wdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBDT1VOVCgqKSBGUk9NIGNoYW5nZV9udW1iZXJfY291bnRlcicsCiAgICApOwoKICAgIG15ICRDb3VudDsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnQgPSAkRGF0YVswXTsKICAgIH0KCiAgICByZXR1cm4gJENvdW50ID8gMCA6IDE7Cn0KCj1oZWFkMiBDaGFuZ2VOdW1iZXJDb3VudGVyQ2xlYW51cCgpCgpSZW1vdmVzIG9sZCBjb3VudGVycyBmcm9tIHRoZSBzeXN0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlTnVtYmVyT2JqZWN0LT5DaGFuZ2VOdW1iZXJDb3VudGVyQ2xlYW51cCgpOwoKUmV0dXJuczoKCiAgICBteSAkU3VjY2VzcyA9IDE7ICAjIG9yIGZhbHNlIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBDaGFuZ2VOdW1iZXJDb3VudGVyQ2xlYW51cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgR2V0IGFsbCBjb3VudGVycy4KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjcmVhdGVfdGltZSBGUk9NIGNoYW5nZV9udW1iZXJfY291bnRlciBPUkRFUiBCWSBpZCBERVNDJwogICAgKTsKCiAgICBteSBAQ291bnRlckxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDb3VudGVyTGlzdCwgewogICAgICAgICAgICBJRCAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFJvd1sxXSwKICAgICAgICB9OwogICAgfQoKICAgICMgS2VlcCB0aGUgbGF0ZXN0IDEwIGNvdW50ZXJzLgogICAgbXkgJFJlbWFpbmluZ0NvdW50ZXJzID0gMTA7CiAgICBAQ291bnRlckxpc3QgPSBzcGxpY2UoIEBDb3VudGVyTGlzdCwgJFJlbWFpbmluZ0NvdW50ZXJzICk7CgogICAgIyBDcmVhdGUgYSBkYXRlIHRpbWUgb2JqZWN0IHdpdGggMTAgbWludXRlcyBpbiB0aGUgcGFzdCBmb3IgbGF0ZXIgY29tcGFyaXNvbnMuCiAgICBteSAkVGFyZ2V0RGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgKTsKICAgIG15ICRTdWJzdHJhY3RTdWNjZXNzID0gJFRhcmdldERhdGVUaW1lLT5TdWJ0cmFjdCgKICAgICAgICBNaW51dGVzID0+IDEwLAogICAgKTsKCiAgICBteSAkTWF4Q291bnRlcklEOwoKICAgIENPVU5URVJJRDoKICAgIGZvciBteSAkQ291bnRlciAoQENvdW50ZXJMaXN0KSB7CgogICAgICAgIG15ICRDb3VudGVyRGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ291bnRlci0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgS2VlcCBhbHNvIGNvdW50ZXJzIGNyZWF0ZWQgaW4gdGhlIGxhdGVzdCAxMCBtaW51dGVzLgogICAgICAgIG5leHQgQ09VTlRFUklEIGlmICRDb3VudGVyRGF0ZVRpbWUgPj0gJFRhcmdldERhdGVUaW1lOwoKICAgICAgICAkTWF4Q291bnRlcklEID0gJENvdW50ZXItPntJRH07CiAgICAgICAgbGFzdCBDT1VOVEVSSUQ7CiAgICB9CgogICAgIyBEZWxldGUgY291bnRlciBmcm9tIHRoZSBsaXN0LgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9udW1iZXJfY291bnRlciBXSEVSRSBpZCA8PSA/JywKICAgICAgICBCaW5kID0+IFsgXCRNYXhDb3VudGVySUQgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDaGFuZ2VDcmVhdGVOdW1iZXIoKQoKQ3JlYXRlcyBhIHVuaXF1ZSBjaGFuZ2UgbnVtYmVyLgoKICAgIG15ICRDaGFuZ2VOdW1iZXIgPSAkQ2hhbmdlTnVtYmVyT2JqZWN0LT5DaGFuZ2VDcmVhdGVOdW1iZXIoKTsKClJldHVybnM6CgogICAgbXkgJENoYW5nZU51bWJlciA9IDQ1NjsKCj1jdXQKCnN1YiBDaGFuZ2VDcmVhdGVOdW1iZXIgewogICAgbXkgKCAkU2VsZiwgJE9mZnNldCApID0gQF87ICAgICMgT2Zmc2V0IGlzIGFuIGludGVybmFsIG9mZnNldCB2YWx1ZSBmb3IgdGhlIG5ldyBjb3VudGVyIGVudHJ5LgoKICAgICMgVHJ5IHRvIGdlbmVyYXRlIGEgbmV3IGNoYW5nZSBudW1iZXIuCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJFNlbGYtPkNoYW5nZU51bWJlckJ1aWxkKCRPZmZzZXQpOwogICAgcmV0dXJuIGlmICEkQ2hhbmdlTnVtYmVyOwoKICAgIG15ICRDaGFuZ2VOdW1iZXJBbHJlYWR5VXNlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJENoYW5nZU51bWJlciwKICAgICk7CgogICAgIyBOb3JtYWwgY2FzZTogZXZlcnl0aGluZyBmaW5lLCBjaGFuZ2UgbnVtYmVyIGNhbiBiZSB1c2VkLgogICAgcmV0dXJuICRDaGFuZ2VOdW1iZXIgaWYgISRDaGFuZ2VOdW1iZXJBbHJlYWR5VXNlZDsKCiAgICAjIE9rLCBjaGFuZ2UgbnVtYmVyIGFscmVhZHkgdXNlZC4gVHJ5IHRvIGdlbmVyYXRlIGFub3RoZXIgb25lLCB1bnRpbCBvbmUgaXMgdmFsaWQuCiAgICBpZiAoICsrJFNlbGYtPntMb29wUHJvdGVjdGlvbkNvdW50ZXJ9ID49IDE2MDAwICkgewoKICAgICAgICAjIExvb3AgcHJvdGVjdGlvbi4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdW50ZXJMb29wUHJvdGVjdGlvbiBpcyBub3cgJFNlbGYtPntMb29wUHJvdGVjdGlvbkNvdW50ZXJ9ISIKICAgICAgICAgICAgICAgIC4gIiBTdG9wcGVkIENoYW5nZUNyZWF0ZU51bWJlcigpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkNoYW5nZU51bWJlciAoJENoYW5nZU51bWJlcikgZXhpc3RzISBDcmVhdGluZyBhIG5ldyBvbmUuIiwKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5DaGFuZ2VDcmVhdGVOdW1iZXIoICRTZWxmLT57TG9vcFByb3RlY3Rpb25Db3VudGVyfSApOwp9Cgo9aGVhZDEgUFJJVkFURSBJTlRFUkZBQ0UKCj1oZWFkMiBfR2V0VUlEKCkKCkdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyLgoKICAgIG15ICRVSUQgPSAkQ2hhbmdlTnVtYmVyT2JqZWN0LT5fR2V0VUlEKCk7CgpSZXR1cm5zOgoKICAgIG15ICRVSUQgPSAxNDkwNjMyNzk0MTM2MGVkODQ1NWYxMjVkMDQ1MDI3NzsKCj1jdXQKCnN1YiBfR2V0VUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE5vZGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnTm9kZUlEJykgfHwgMTsKICAgIG15ICggJFNlY29uZHMsICRNaWNyb3NlY29uZHMgKSA9IFRpbWU6OkhpUmVzOjpnZXR0aW1lb2ZkYXkoKTsKICAgIG15ICRQcm9jZXNzSUQgPSAkJDsKCiAgICBteSAkQ291bnRlclVJRCA9ICRQcm9jZXNzSUQgLiAkU2Vjb25kcyAuICRNaWNyb3NlY29uZHMgLiAkTm9kZUlEOwoKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggICAgID0+IDMyIC0gbGVuZ3RoICRDb3VudGVyVUlELAogICAgICAgIERpY3Rpb25hcnkgPT4gWyAwIC4uIDksICdhJyAuLiAnZicgXSwgICAgIyBoZXhhZGVjaW1hbAogICAgKTsKCiAgICAkQ291bnRlclVJRCAuPSAkUmFuZG9tU3RyaW5nOwoKICAgIHJldHVybiAkQ291bnRlclVJRDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9OdW1iZXIvQXV0b0luY3JlbWVudC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBdXRvSW5jcmVtZW50LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXJCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKKTsKCnN1YiBJc0RhdGVCYXNlZCB7CiAgICByZXR1cm4gMDsKfQoKc3ViIENoYW5nZU51bWJlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICRPZmZzZXQgKSA9IEBfOwoKICAgICRPZmZzZXQgfHw9IDA7CgogICAgbXkgJEJhc2VDb3VudGVyID0gMTsKICAgIGlmICggJFNlbGYtPkNoYW5nZU51bWJlckNvdW50ZXJJc0VtcHR5KCkgKSB7CiAgICAgICAgJEJhc2VDb3VudGVyID0gJFNlbGYtPkluaXRpYWxDb3VudGVyT2Zmc2V0Q2FsY3VsYXRlKCk7CiAgICB9CgogICAgbXkgJENvdW50ZXIgPSAkU2VsZi0+Q2hhbmdlTnVtYmVyQ291bnRlckFkZCgKICAgICAgICBPZmZzZXQgPT4gJEJhc2VDb3VudGVyICsgJE9mZnNldCwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ291bnRlcjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkU3lzdGVtSUQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbUlEJyk7CiAgICBteSAkTWluU2l6ZSAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6Ok51bWJlckdlbmVyYXRvcjo6QXV0b0luY3JlbWVudDo6TWluQ291bnRlclNpemUnKQogICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yOjpNaW5Db3VudGVyU2l6ZScpCiAgICAgICAgfHwgNTsKCiAgICAjIFBhZCBjaGFuZ2UgbnVtYmVyIHdpdGggbGVhZGluZyAnMCcgdG8gbGVuZ3RoICRNaW5TaXplIChjb25maWcgb3B0aW9uKS4KICAgICRDb3VudGVyID0gc3ByaW50ZiAiJS4qdSIsICRNaW5TaXplLCAkQ291bnRlcjsKCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJFN5c3RlbUlEIC4gJENvdW50ZXI7CgogICAgcmV0dXJuICRDaGFuZ2VOdW1iZXI7Cn0KCiMKIyBDYWxjdWxhdGUgaW5pdGlhbCBjb3VudGVyIHZhbHVlIG9uIChtaWdyYXRlZCkgc3lzdGVtcyB0aGF0IGFscmVhZHkgaGF2ZSBjaGFuZ2VzLAojICAgYnV0IG5vIGNvdW50ZXIgZW50cmllcyB5ZXQuCiMKc3ViIEluaXRpYWxDb3VudGVyT2Zmc2V0Q2FsY3VsYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExhc3RDaGFuZ2VOdW1iZXIgPSAkU2VsZi0+X0dldExhc3RDaGFuZ2VOdW1iZXIoKTsKICAgIHJldHVybiAxIGlmICEkTGFzdENoYW5nZU51bWJlcjsKCiAgICAjIElmIHRoZSBjaGFuZ2UgbnVtYmVyIHdhcyBjcmVhdGVkIGJ5IGEgZGF0ZSBiYXNlZCBnZW5lcmF0b3IsIGNoYW5nZSBjb3VudGVyIG5lZWRzIHRvIHN0YXJ0IGZyb20gMQogICAgcmV0dXJuIDEgaWYgJFNlbGYtPl9Mb29rc0xpa2VEYXRlQmFzZWRDaGFuZ2VOdW1iZXIoJExhc3RDaGFuZ2VOdW1iZXIpOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c3RlbUlEICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtSUQnKTsKCiAgICAjIFJlbW92ZSBTeXN0ZW1JRCBhbmQgbGVhZGluZyB6ZXJvcwogICAgJExhc3RDaGFuZ2VOdW1iZXIgPX4gc3tcQSAkU3lzdGVtSUQgMCogfXt9bXN4OwoKICAgIHJldHVybiAxIGlmICEkTGFzdENoYW5nZU51bWJlcjsKCiAgICByZXR1cm4gJExhc3RDaGFuZ2VOdW1iZXIgKyAxOwp9CgpzdWIgX0dldExhc3RDaGFuZ2VOdW1iZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBNQVgoaWQpIEZST00gY2hhbmdlX2l0ZW0nLAogICAgKTsKCiAgICBteSAkQ2hhbmdlSUQ7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENoYW5nZUlEID0gJERhdGFbMF07CiAgICB9CgogICAgcmV0dXJuIGlmICRDaGFuZ2VJRCAmJiAkQ2hhbmdlSUQgPT0gMTsKCiAgICBteSAlQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIExvZ05vICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJUNoYW5nZTsKICAgIHJldHVybiBpZiAhJENoYW5nZXtDaGFuZ2VOdW1iZXJ9OwoKICAgIHJldHVybiAkQ2hhbmdle0NoYW5nZU51bWJlcn07Cn0KCnN1YiBfTG9va3NMaWtlRGF0ZUJhc2VkQ2hhbmdlTnVtYmVyIHsKICAgIG15ICggJFNlbGYsICRDaGFuZ2VOdW1iZXIgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJENoYW5nZU51bWJlcjsKCiAgICBteSAkUG9zc2libGVEYXRlID0gc3Vic3RyICRDaGFuZ2VOdW1iZXIsIDAsIDg7CiAgICByZXR1cm4gaWYgbGVuZ3RoICRQb3NzaWJsZURhdGUgIT0gODsKCiAgICAjIEZvcm1hdCBwb3NzaWJsZSBkYXRlIGFzIGEgZGF0ZSBzdHJpbmcKICAgICRQb3NzaWJsZURhdGUgPX4gc3tcQSAoXGR7NH0pIChcZHsyfSkgKFxkezJ9KSBcen17JDEtJDItJDMgMDA6MDA6MDB9Z3NteDsKCiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICBteSAkUmVzdWx0ID0gJERhdGVUaW1lT2JqZWN0LT5TZXQoIFN0cmluZyA9PiAkUG9zc2libGVEYXRlICk7CgogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9OdW1iZXIvRGF0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBEYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXI6OkRhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXJCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKKTsKCnN1YiBJc0RhdGVCYXNlZCB7CiAgICByZXR1cm4gMTsKfQoKc3ViIENoYW5nZU51bWJlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICRPZmZzZXQgKSA9IEBfOwoKICAgICRPZmZzZXQgfHw9IDA7CgogICAgbXkgJENvdW50ZXIgPSAkU2VsZi0+Q2hhbmdlTnVtYmVyQ291bnRlckFkZCgKICAgICAgICBPZmZzZXQgPT4gMSArICRPZmZzZXQsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENvdW50ZXI7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6Ok51bWJlckdlbmVyYXRvcjo6RGF0ZTo6VXNlRm9ybWF0dGVkQ291bnRlcicpICkgewogICAgICAgIG15ICRNaW5TaXplID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3I6Ok1pbkNvdW50ZXJTaXplJykKICAgICAgICAgICAgfHwgNTsKCiAgICAgICAgIyBQYWQgY2hhbmdlIG51bWJlciB3aXRoIGxlYWRpbmcgJzAnIHRvIGxlbmd0aCAkTWluU2l6ZSAoY29uZmlnIG9wdGlvbikuCiAgICAgICAgJENvdW50ZXIgPSBzcHJpbnRmICIlLip1IiwgJE1pblNpemUsICRDb3VudGVyOwogICAgfQoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICk7CiAgICBteSAkRGF0ZVRpbWVTZXR0aW5ncyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgIyBDcmVhdGUgbmV3IGNoYW5nZSBudW1iZXIuCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJERhdGVUaW1lU2V0dGluZ3MtPntZZWFyfQogICAgICAgIC4gc3ByaW50ZiggIiUuMnUiLCAkRGF0ZVRpbWVTZXR0aW5ncy0+e01vbnRofSApCiAgICAgICAgLiBzcHJpbnRmKCAiJS4ydSIsICREYXRlVGltZVNldHRpbmdzLT57RGF5fSApCiAgICAgICAgLiAkQ291bnRlcjsKCiAgICByZXR1cm4gJENoYW5nZU51bWJlcjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9OdW1iZXIvRGF0ZUNoZWNrc3VtLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IERhdGVDaGVja3N1bS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6TnVtYmVyOjpEYXRlQ2hlY2tzdW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXJCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKKTsKCnN1YiBJc0RhdGVCYXNlZCB7CiAgICByZXR1cm4gMTsKfQoKc3ViIENoYW5nZU51bWJlckJ1aWxkIHsKICAgIG15ICggJFNlbGYsICRPZmZzZXQgKSA9IEBfOwoKICAgICRPZmZzZXQgfHw9IDA7CgogICAgbXkgJENvdW50ZXIgPSAkU2VsZi0+Q2hhbmdlTnVtYmVyQ291bnRlckFkZCgKICAgICAgICBPZmZzZXQgPT4gMSArICRPZmZzZXQsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENvdW50ZXI7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJFN5c3RlbUlEID0gJENvbmZpZ09iamVjdC0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgUGFkIHRpY2tldCBudW1iZXIgd2l0aCBsZWFkaW5nICcwJyB0byBsZW5ndGggNS4KICAgICRDb3VudGVyID0gc3ByaW50ZiAiJS41dSIsICRDb3VudGVyOwoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICk7CiAgICBteSAkRGF0ZVRpbWVTZXR0aW5ncyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgIyBDcmVhdGUgbmV3IHRpY2tldCBudW1iZXIuCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJERhdGVUaW1lU2V0dGluZ3MtPntZZWFyfQogICAgICAgIC4gc3ByaW50ZiggIiUuMnUiLCAkRGF0ZVRpbWVTZXR0aW5ncy0+e01vbnRofSApCiAgICAgICAgLiBzcHJpbnRmKCAiJS4ydSIsICREYXRlVGltZVNldHRpbmdzLT57RGF5fSApCiAgICAgICAgLiAkU3lzdGVtSUQgLiAkQ291bnRlcjsKCiAgICAjIENhbGN1bGF0ZSBhIGNoZWNrc3VtLgogICAgbXkgJENoZWNrU3VtID0gMDsKICAgIG15ICRNdWx0aXBseSA9IDE7CiAgICBmb3IgKCBteSAkaSA9IDA7ICRpIDwgbGVuZ3RoKCRDaGFuZ2VOdW1iZXIpOyArKyRpICkgewoKICAgICAgICBteSAkRGlnaXQgPSBzdWJzdHIoICRDaGFuZ2VOdW1iZXIsICRpLCAxICk7CgogICAgICAgICRDaGVja1N1bSA9ICRDaGVja1N1bSArICggJE11bHRpcGx5ICogJERpZ2l0ICk7CiAgICAgICAgJE11bHRpcGx5ICs9IDE7CgogICAgICAgIGlmICggJE11bHRpcGx5ID09IDMgKSB7CiAgICAgICAgICAgICRNdWx0aXBseSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICRDaGVja1N1bSAlPSAxMDsKICAgICRDaGVja1N1bSA9IDEwIC0gJENoZWNrU3VtOwoKICAgIGlmICggJENoZWNrU3VtID09IDEwICkgewogICAgICAgICRDaGVja1N1bSA9IDE7CiAgICB9CgogICAgJENoYW5nZU51bWJlciAuPSAkQ2hlY2tTdW07CgogICAgcmV0dXJuICRDaGFuZ2VOdW1iZXI7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0FkZFdvcmtPcmRlckNoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkZFdvcmtPcmRlckNoZWNrLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpBZGRXb3JrT3JkZXJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpBZGRXb3JrT3JkZXJDaGVjayAtIFdvcmtPcmRlckFkZCBhbmQgV29ya09yZGVyQWRkRnJvbVRlbXBsYXRlIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6QWRkV29ya09yZGVyQ2hlY2snKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBDPHJvPiBhbmQgQzxydz4gYWNjZXNzIGlzIGdyYW50ZWQKd2hlbiB0aGUgYWdlbnQgaGFzIHRoZSBjb3JyZWN0IHByaXZpbGVnZXMgaW4gdGhlIGdyb3VwIGRlZmluZWQgaW4gdGhlCmZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24uCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICAgICBUeXBlICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBDaGFuZ2VJRCA9PiAzMzMzLCAgICAgIyBvcHRpb25hbCBmb3IgQ2hhbmdlQWRkCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgbm8gYWN0aW9uIGlzIGdpdmVuLCBwYXNzIHRoZSBjaGVja3MgdG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0FjdGlvbn07CgogICAgIyBpZiBubyBDaGFuZ2VJRCBpcyBnaXZlbiwgcGFzcyB0aGUgY2hlY2tzIHRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlcwogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtDaGFuZ2VJRH07CgogICAgIyBhY2Nlc3MgaXMgcGFzc2VkIHRvIG90aGVyIHBlcm1pc3Npb24gbW9kdWxlcyBpZiB0aGUgYWN0aW9uIGlzIG5vbmUgb2YgdGhlIGJlbG93CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0FjdGlvbn0gbmUgJ0FnZW50SVRTTVdvcmtPcmRlckFkZCcKICAgICAgICAmJiAkUGFyYW17QWN0aW9ufSBuZSAnQWdlbnRJVFNNV29ya09yZGVyQWRkRnJvbVRlbXBsYXRlJwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRQYXJhbXtBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIHJlcXVpcmVkIHByaXZpbGVnZSwgJ3JvJyBvciAncncnCiAgICBteSAkUmVxdWlyZWRQcml2OwogICAgaWYgKCAkRnJvbnRlbmRDb25maWcgJiYgJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CgogICAgICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2IGZyb20gdGhlIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KICAgICAgICAkUmVxdWlyZWRQcml2ID0gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn07CiAgICB9CgogICAgIyBhY2Nlc3MgaXMgcGFzc2VkIHRvIG90aGVyIHBlcm1pc3Npb24gbW9kdWxlcyBpZiB0aGVyZSBpcyBubyByZXF1aXJlZCBwcml2aWxlZ2UKICAgIHJldHVybiAxIGlmICEkUmVxdWlyZWRQcml2OwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBncm91cCBmb3IgdGhlIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJEdyb3VwID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0FjdGlvbn0gfQogICAgICAgIC0+e0dyb3VwUm99LT5bMF07CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB0aGUgZ3JvdXAgaXMgbm90IGZvdW5kCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkR3JvdXA7CgogICAgIyBnZXQgdGhlIGdyb3VwIGlkCiAgICBteSAkR3JvdXBJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCA9PiAkR3JvdXAsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRSZXF1aXJlZFByaXYsCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CgogICAgIyBhY2Nlc3MgaXMgcGFzc2VkIHRvIG90aGVyIHBlcm1pc3Npb24gbW9kdWxlcyBpZiB0aGUgYWdlbnQKICAgICMgaGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBkZW55IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKCn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NBQkNoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENBQkNoZWNrLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDQUJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q0FCQ2hlY2sgLSBDQUIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDQUJDaGVjaycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suIEFjY2VzcyBpcyBhbGxvd2VkIHdoZW4gdHlwZSBpcyBDPHJvPiBhbmQgdGhlIGFnZW50IGlzIGEgbWVtYmVyCm9mIHRoZSBDQUIgb2YgdGhlIGNoYW5nZS4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIENoYW5nZUlEID0+IDMzMzMsICAgICAjIG9wdGlvbmFsIGZvciBDaGFuZ2VBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIGRlbnkgYWNjZXNzIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlLCBhbmQgdGh1cyBubyBDQUIKICAgIHJldHVybiBpZiAhJFBhcmFte0NoYW5nZUlEfTsKCiAgICAjIGdldCB0aGUgQ0FCIG9mIHRoZSBjaGFuZ2UKICAgIG15ICRDQUIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VDQUJHZXQoCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgIyBsb29rIGZvciBhIENBQiBtZW1iZXIgd2l0aCB0aGUgcmVsZXZhbnQgVXNlcklECiAgICBteSAoJEZvdW5kQ0FCTWVtYmVyKSA9IGdyZXAgeyAkXyA9PSAkUGFyYW17VXNlcklEfSB9IEB7ICRDQUItPntDQUJBZ2VudHN9IH07CgogICAgIyBhbGxvdyBhY2Nlc3MgdGhlIHRoZSBhZ2VudCBpcyBhIENBQiBtZW1iZXIKICAgIHJldHVybiAxIGlmICRGb3VuZENBQk1lbWJlcjsKCiAgICAjIGRlbnkgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZUFnZW50Q2hlY2sucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ2hhbmdlQWdlbnRDaGVjay5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQWdlbnRDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUFnZW50Q2hlY2sgLSBjaGFuZ2UgYWdlbnQgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDaGVja09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDaGFuZ2VBZ2VudENoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gQzxybz4gYWNjZXNzIGlzIGFsbG93ZWQgd2hlbiB0aGUgYWdlbnQgaXMgYSA8cm8+IG1lbWJlcgpvZiB0aGUgJ2l0c20tY2hhbmdlJyBncm91cC4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIENoYW5nZUlEID0+IDMzMzMsICAgICAjIG9wdGlvbmFsIGZvciBDaGFuZ2VBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgYWdlbnQKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICdpdHNtLWNoYW5nZScsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBjaGFuZ2UgYWdlbnRzIGFyZSBncmFudGVkIHJvIGFjY2VzcwogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZUJ1aWxkZXJDaGVjay5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBDaGFuZ2VCdWlsZGVyQ2hlY2sucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2sgLSBjaGFuZ2UgYnVpbGRlciBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0LgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENoZWNrT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjaycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suIFdoZW4gbm8gQ2hhbmdlSUQgaXMgcGFzc2VkLCB0aGFuIEM8cm8+IGFuZCBDPHJ3PiBhY2Nlc3MgaXMgZ3JhbnRlZAp3aGVuIHRoZSBhZ2VudCBoYXMgdGhlIHByaXZpbGVnZSBpbiB0aGUgJ2l0c20tY2hhbmdlLWJ1aWxkZXInIGdyb3VwLgpXaGVuIHRoZSBDaGFuZ2VJRCB3YXMgcGFzc2VkLCB0aGFuIHRoZSBhZ2VudCBtdXN0IGFkZGl0aW9uYWxseSBiZSB0aGUgY2hhbmdlIGJ1aWxkZXIgb2YgdGhlIGNoYW5nZS4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIENoYW5nZUlEID0+IDMzMzMsICAgICAjIG9wdGlvbmFsIGZvciBDaGFuZ2VBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgY2hlY2sgaXMgYmFzZWQgdXBvbiB0aGUgY2hhbmdlIGJ1aWxkZXIKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICdpdHNtLWNoYW5nZS1idWlsZGVyJywKICAgICk7CgogICAgIyBkbyBub3QgZ3JhbnQgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgKTsKCiAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBBbGxvdyBhIGNoYW5nZSBidWlsZGVyIHRvIGNyZWF0ZSBhIGNoYW5nZSwgd2hlbiB0aGVyZSBpc24ndCBhIGNoYW5nZSB5ZXQuCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0NoYW5nZUlEfTsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSBjaGFuZ2UuIGUuZy4gQWdlbnRJVFNNQ2hhbmdlRWRpdAogICAgbXkgJENoYW5nZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUdldCgKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIGRvIG5vdCBncmFudCBhY2Nlc3MsIHdoZW4gbm8gY2hhbmdlIHdhcyBmb3VuZAogICAgcmV0dXJuIGlmICEkQ2hhbmdlIHx8ICEleyRDaGFuZ2V9IHx8ICEkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAjIGFsbG93IGFjY2Vzcywgd2hlbiB0aGUgYWdlbnQgaXMgdGhlIGNoYW5nZSBidWlsZGVyIG9mIHRoZSBjaGFuZ2UKICAgIHJldHVybiAxIGlmICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ID09ICRQYXJhbXtVc2VySUR9OwoKICAgICMgZG8gbm90IGdyYW50IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKfQoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZU1hbmFnZXJDaGVjay5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBDaGFuZ2VNYW5hZ2VyQ2hlY2sucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjayAtIGNoYW5nZSBtYW5hZ2VyIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gQzxybz4gYW5kIEM8cnc+IGFjY2VzcyBpcyBncmFudGVkCndoZW4gdGhlIGFnZW50IGhhcyB0aGUgcHJpdmlsZWdlIGluIHRoZSAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgZ3JvdXAuCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICAgICBUeXBlICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBDaGFuZ2VJRCA9PiAzMzMzLCAgICAgIyBvcHRpb25hbCBmb3IgQ2hhbmdlQWRkCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdGhlIGNoZWNrIGlzIGJhc2VkIHVwb24gdGhlIGNoYW5nZSBtYW5hZ2VyCiAgICBteSAkR3JvdXBJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCA9PiAnaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICApOwoKICAgICMgYWxsb3cgcm8gYW5kIHJ3IGFjY2VzcyBpZiB0aGUgYWdlbnQgaXMgYSBjaGFuZ2UgbWFuYWdlcgogICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGFnZW50IGlzIHRoZSBhY3R1YWwgbWFuYWdlciBvZiB0aGUgY2hhbmdlCgogICAgIyBkZW55IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKfQoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9DQUIucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ0FCLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6Q0FCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgRGF0YTo6RHVtcGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OkNBQiAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIENBQgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpDQUInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFNlcmlhbGl6ZSgpCgpTZXJpYWxpemUgdGhlIENBQiBvZiBhIGNoYW5nZS4gVGhpcyBpcyBkb25lIHdpdGggRGF0YTo6RHVtcGVyLiBJdCByZXR1cm5zCmEgc2VyaWFsaXplZCBzdHJpbmcgb2YgdGhlIGRhdGEgc3RydWN0dXJlLiBUaGUgQ0FCIGFjdGlvbnMKYXJlICJ3cmFwcGVkIiB3aXRoaW4gYSBoYXNoIHJlZmVyZW5jZS4uLgoKICAgIG15ICRUZW1wbGF0ZVN0cmluZyA9ICRUZW1wbGF0ZU9iamVjdC0+U2VyaWFsaXplKAogICAgICAgIENoYW5nZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBSZXR1cm4gICA9PiAnSEFTSCcsICMgKG9wdGlvbmFsKSBIQVNIfFNUUklORyBkZWZhdWx0ICdTVFJJTkcnCiAgICApOwoKcmV0dXJucwoKICAgICd7Q0FCQWRkID0+IHsgQ0FCQ3VzdG9tZXJzID0+IFsgJ21tQGxvY2FsaG9zdCcgXSwgLi4uIH19JwoKSWYgcGFyYW1ldGVyIEM8UmV0dXJuPiBpcyBzZXQgdG8gQzxIQVNIPiwgdGhlIFBlcmwgZGF0YSBzdHJ1Y3R1cmUKaXMgcmV0dXJuZWQKCiAgICB7CiAgICAgICAgQ0FCQWRkICAgPT4geyAuLi4gfSwKICAgICAgICBDaGlsZHJlbiA9PiBbIC4uLiBdLAogICAgfQoKPWN1dAoKc3ViIFNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUgZm9yICdSZXR1cm4nCiAgICAkUGFyYW17UmV0dXJufSB8fD0gJ1NUUklORyc7CgogICAgIyBnZXQgQ0FCIG9mIHRoZSBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hhbmdlOwoKICAgICMgdGVtcGxhdGVzIGhhdmUgdG8gYmUgYW4gYXJyYXkgcmVmZXJlbmNlOwogICAgbXkgJE9yaWdpbmFsRGF0YSA9IHsKICAgICAgICBDQUJBZGQgPT4gewogICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gJENoYW5nZS0+e0NBQkN1c3RvbWVyc30sCiAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiAkQ2hhbmdlLT57Q0FCQWdlbnRzfSwKICAgICAgICB9LAogICAgfTsKCiAgICBpZiAoICRQYXJhbXtSZXR1cm59IGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJE9yaWdpbmFsRGF0YTsKICAgIH0KCiAgICAjIG5vIGluZGVudGF0aW9uIChzYXZlcyBzcGFjZSkKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgogICAgIyBkbyBub3QgdXNlIGNyb3NzLXJlZmVyZW5jaW5nCiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpEZWVwY29weSA9IDE7CgogICAgIyBzZXJpYWxpemUgdGhlIGRhdGEgKGRvIG5vdCB1c2UgJFZBUjEsIGJ1dCAkVGVtcGxhdGVEYXRhIGZvciBEdW1wZXIgb3V0cHV0KQogICAgbXkgJFNlcmlhbGl6ZWREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RHVtcCggJE9yaWdpbmFsRGF0YSwgJ2JpbmFyeScgKTsKCiAgICByZXR1cm4gJFNlcmlhbGl6ZWREYXRhOwp9Cgo9aGVhZDIgRGVTZXJpYWxpemUoKQoKVXBkYXRlcyB0aGUgQ0FCIG9mIGEgY2hhbmdlIGJhc2VkIG9uIHRoZSBnaXZlbiBDQUIgdGVtcGxhdGUuIEl0CnJldHVybnMgdGhlIGNoYW5nZSBpZCB0aGUgY2FiIGlzIGZvci4KCiAgICBteSAkQ2hhbmdlSUQgPSAkVGVtcGxhdGVPYmplY3QtPkRlU2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWyAnbW1AbG9jYWxob3N0JyBdLAogICAgICAgICAgICBDQUJBZ2VudHMgICAgPT4gWyAxLCAyIF0sCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIERlU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDaGFuZ2VJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjdXJyZW50IENBQiBvZiBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhIENBQiBhZGQgaXMgYWN0dWFsbHkgYSBDQUIgdXBkYXRlIG9uIGEgY2hhbmdlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUNBQlVwZGF0ZSgKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBDQUJDdXN0b21lcnMgPT4gWyBAeyAkUGFyYW17RGF0YX0tPntDQUJDdXN0b21lcnN9IH0sIEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gXSwKICAgICAgICBDQUJBZ2VudHMgICAgPT4gWyBAeyAkUGFyYW17RGF0YX0tPntDQUJBZ2VudHN9IH0sIEB7ICRDaGFuZ2UtPntDQUJBZ2VudHN9IH0gXSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIElEICAgICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNQ2hhbmdlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpJVFNNQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZSAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIGNoYW5nZXMKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGZ1bmN0aW9ucyBmb3IgY2hhbmdlIHRlbXBsYXRlcyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCB0aGUgZGVidWcgZmxhZwogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU2VyaWFsaXplKCkKClNlcmlhbGl6ZSBhIGNoYW5nZS4gVGhpcyBpcyBkb25lIHdpdGggRGF0YTo6RHVtcGVyLiBJdCByZXR1cm5zCmEgc2VyaWFsaXplZCBzdHJpbmcgb2YgdGhlIGRhdGEgc3RydWN0dXJlLiBUaGUgY2hhbmdlIGFjdGlvbnMKYXJlICJ3cmFwcGVkIiB3aXRoaW4gYW4gYXJyYXkgcmVmZXJlbmNlLi4uCgogICAgbXkgJFRlbXBsYXRlU3RyaW5nID0gJFRlbXBsYXRlT2JqZWN0LT5TZXJpYWxpemUoCiAgICAgICAgQ2hhbmdlSUQgICA9PiAxLAogICAgICAgIFN0YXRlUmVzZXQgPT4gMSwgIyAob3B0aW9uYWwpIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUmV0dXJuICAgICA9PiAnSEFTSCcsICMgKG9wdGlvbmFsKSBIQVNIfFNUUklORyBkZWZhdWx0ICdTVFJJTkcnCiAgICApOwoKcmV0dXJucwoKICAgICd7Q2hhbmdlQWRkID0+IHtUaXRsZSA9PiAndGl0bGUnLCAuLi59fSwge1dvcmtPcmRlckFkZCA9PiB7IENoYW5nZUlEID0+IDEyMywgLi4uIH19JwoKSWYgcGFyYW1ldGVyIEM8UmV0dXJuPiBpcyBzZXQgdG8gQzxIQVNIPiwgdGhlIFBlcmwgZGF0YSBzdHJ1Y3R1cmUKaXMgcmV0dXJuZWQKCiAgICB7CiAgICAgICAgQ2hhbmdlQWRkID0+IHsgLi4uIH0sCiAgICAgICAgQ2hpbGRyZW4gID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgICAgICBDaGlsZHJlbiAgICAgPT4gWyAuLi4gXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgICAgICBDaGlsZHJlbiAgICAgPT4gWyAuLi4gXSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfQoKPWN1dAoKc3ViIFNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUgZm9yICdSZXR1cm4nCiAgICAkUGFyYW17UmV0dXJufSB8fD0gJ1NUUklORyc7CgogICAgIyBnZXQgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJENoYW5nZTsKCiAgICAjIGtlZXAgb25seSB3YW50ZWQgYXR0cmlidXRlcwogICAgbXkgJENsZWFuQ2hhbmdlOwogICAgZm9yIG15ICRBdHRyaWJ1dGUgKAogICAgICAgIHF3KAogICAgICAgIENoYW5nZUlEIENoYW5nZU51bWJlciBDaGFuZ2VTdGF0ZUlEIENoYW5nZVRpdGxlIERlc2NyaXB0aW9uCiAgICAgICAgSnVzdGlmaWNhdGlvbiBDaGFuZ2VNYW5hZ2VySUQgQ2hhbmdlQnVpbGRlcklECiAgICAgICAgQ2F0ZWdvcnlJRCBJbXBhY3RJRCBQcmlvcml0eUlEIENBQkFnZW50cyBDQUJDdXN0b21lcnMgUmVxdWVzdGVkVGltZQogICAgICAgIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKQogICAgICAgICkKICAgIHsKICAgICAgICAkQ2xlYW5DaGFuZ2UtPnskQXR0cmlidXRlfSA9ICRDaGFuZ2UtPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIHJlc2V0IGNoYW5nZSBzdGF0ZSB0byBkZWZhdWx0IGlmIHJlcXVlc3RlZAogICAgaWYgKCAkUGFyYW17U3RhdGVSZXNldH0gKSB7CgogICAgICAgICMgZ2V0IGluaXRpYWwgY2hhbmdlIHN0YXRlIGlkCiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lJyktPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAwLAogICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICApOwoKICAgICAgICAkQ2xlYW5DaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSA9ICROZXh0U3RhdGVJRHMtPlswXTsKICAgIH0KCiAgICAjIGFkZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgdG8gbGlzdCBvZiB3YW50ZWQgYXR0cmlidXRlcwogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXskQ2hhbmdlfSApIHsKCiAgICAgICAgIyBmaW5kIHRoZSBjaGFuZ2UgZHluYW1pYyBmaWVsZCBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkQXR0cmlidXRlID1+IG17IFxBIER5bmFtaWNGaWVsZF8uKiBceiB9eG1zICkgewoKICAgICAgICAgICAgJENsZWFuQ2hhbmdlLT57JEF0dHJpYnV0ZX0gPSAkQ2hhbmdlLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPcmlnaW5hbERhdGEgPSB7IENoYW5nZUFkZCA9PiAkQ2xlYW5DaGFuZ2UgfTsKCiAgICAjIGdldCBhdHRhY2htZW50cwogICAgbXkgQENoYW5nZUF0dGFjaG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICk7CiAgICBmb3IgbXkgJEZpbGVuYW1lIChAQ2hhbmdlQXR0YWNobWVudHMpIHsKCiAgICAgICAgIyBzYXZlIGF0dGFjaG1lbnRzIHRvIHRoaXMgdGVtcGxhdGUKICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBBdHRhY2htZW50QWRkID0+IHsgRmlsZW5hbWUgPT4gJEZpbGVuYW1lIH0gfTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXJzCiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OklUU01Xb3JrT3JkZXInKS0+U2VyaWFsaXplKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFN0YXRlUmVzZXQgID0+ICRQYXJhbXtTdGF0ZVJlc2V0fSB8fCAwLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgUmV0dXJuICAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgISRXb3JrT3JkZXI7CgogICAgICAgIHB1c2ggQHsgJE9yaWdpbmFsRGF0YS0+e0NoaWxkcmVufSB9LCAkV29ya09yZGVyOwogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBsaXN0IGZvciB0aGUgY2hhbmdlCiAgICBteSAkQ29uZGl0aW9uTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBWYWxpZCAgICA9PiAwLAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGdldCBlYWNoIGNvbmRpdGlvbgogICAgQ09ORElUSU9OSUQ6CiAgICBmb3IgbXkgJENvbmRpdGlvbklEICggQHskQ29uZGl0aW9uTGlzdH0gKSB7CiAgICAgICAgbXkgJENvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbicpLT5TZXJpYWxpemUoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFJldHVybiAgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkRJVElPTklEIGlmICEkQ29uZGl0aW9uOwoKICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgJENvbmRpdGlvbjsKICAgIH0KCiAgICAjIGdldCBsaW5rcyB0byBvdGhlciBvYmplY3QKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEtleSAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgZm9yIG15ICRUYXJnZXRPYmplY3QgKCBzb3J0IGtleXMgJXskTGlua0xpc3RXaXRoRGF0YX0gKSB7CiAgICAgICAgZm9yIG15ICRUeXBlICggc29ydCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGEtPnskVGFyZ2V0T2JqZWN0fS0+eyRUeXBlfSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRJRCAoCiAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0tPnskVHlwZX0tPnskS2V5fSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldElELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBMaW5rQWRkID0+ICRMaW5rSW5mbyB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte1JldHVybn0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkT3JpZ2luYWxEYXRhOwogICAgfQoKICAgICMgbm8gaW5kZW50YXRpb24gKHNhdmVzIHNwYWNlKQogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAjIGRvIG5vdCB1c2UgY3Jvc3MtcmVmZXJlbmNpbmcKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkRlZXBjb3B5ID0gMTsKCiAgICAjIHNlcmlhbGl6ZSB0aGUgZGF0YSAoZG8gbm90IHVzZSAkVkFSMSwgYnV0ICRUZW1wbGF0ZURhdGEgZm9yIER1bXBlciBvdXRwdXQpCiAgICBteSAkU2VyaWFsaXplZERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EdW1wKCAkT3JpZ2luYWxEYXRhLCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1oZWFkMiBEZVNlcmlhbGl6ZSgpCgpEZVNlcmlhbGl6ZSgpIGlzIGEgd3JhcHBlciBmb3IgYWxsIHRoZSBfWFhYQWRkIG1ldGhvZHMuCgogICAgbXkgJUluZm8gPSAkVGVtcGxhdGVPYmplY3QtPkRlU2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjIC4uLiBQYXJhbXMgZm9yIENoYW5nZUFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIE1ldGhvZCAgID0+ICdDaGFuZ2VBZGQnLAogICAgKTsKCj1jdXQKCnN1YiBEZVNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgTWV0aG9kIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGlzcGF0Y2ggdGFibGUKICAgIG15ICVNZXRob2QyU3ViID0gKAogICAgICAgIENoYW5nZUFkZCAgICAgPT4gJ19DaGFuZ2VBZGQnLAogICAgICAgIEF0dGFjaG1lbnRBZGQgPT4gJ19BdHRhY2htZW50QWRkJywKICAgICAgICBMaW5rQWRkICAgICAgID0+ICdfTGlua0FkZCcsCiAgICApOwoKICAgIG15ICRTdWIgPSAkTWV0aG9kMlN1YnsgJFBhcmFte01ldGhvZH0gfTsKCiAgICBpZiAoICEkU3ViICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBNZXRob2RuYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT4kU3ViKCVQYXJhbSk7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9DaGFuZ2VBZGQoKQoKQ3JlYXRlcyBhIG5ldyBjaGFuZ2UgYmFzZWQgb24gYSB0ZW1wbGF0ZS4gSXQgcmV0dXJucyBhIGhhc2ggd2l0aCBhZGRpdGlvbmFsCmluZm8gbGlrZSBDaGFuZ2VJRC4KCiAgICBteSAlUmV0dXJuID0gJFRlbXBsYXRlT2JqZWN0LT5fQ2hhbmdlQWRkKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICAjIG90aGVyIGNoYW5nZSBhdHRyaWJ1dGVzCiAgICAgICAgQ2hhbmdlSUQgPT4gMCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQ2hhbmdlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgYSBsb2NhbCBjb3B5CiAgICBteSAlRGF0YSA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgICMgd2UgbmVlZCB0aGUgb2xkIGNoYW5nZSBpZCBmb3IgZXhwcmVzc2lvbnMKICAgIG15ICRPbGRDaGFuZ2VJRCA9ICREYXRhe0NoYW5nZUlEfTsKCiAgICAjIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCBzbyBkb24ndCBwYXNzIHRoZW0gdG8gQ2hhbmdlQWRkKCkKICAgIGRlbGV0ZSBARGF0YXtxdyhDaGFuZ2VJRCBDaGFuZ2VOdW1iZXIgQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5KX07CiAgICBkZWxldGUgQERhdGF7cXcoRGVzY3JpcHRpb25QbGFpbiBKdXN0aWZpY2F0aW9uUGxhaW4pfTsKCiAgICAjIGlmIHVzZXIgc2V0IGEgbmV3IHRpbWUsIGNhbGN1bGF0ZSBkaWZmZXJlbmNlCiAgICBteSAkRGlmZmVyZW5jZTsKICAgIGlmICggJFBhcmFte05ld1RpbWVJbkVwb2NoZX0gKSB7CiAgICAgICAgbXkgJE9sZFRpbWUgPSAkRGF0YXsgJFBhcmFte01vdmVUaW1lVHlwZX0gfTsKCiAgICAgICAgaWYgKCRPbGRUaW1lKSB7CiAgICAgICAgICAgICREaWZmZXJlbmNlID0gJFNlbGYtPl9HZXRUaW1lRGlmZmVyZW5jZSgKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICAgICA9PiAkT2xkVGltZSwKICAgICAgICAgICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAkUGFyYW17TmV3VGltZUluRXBvY2hlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBQbGFubmVkWFhYVGltZSB3YXMgc2F2ZWQganVzdCBmb3IgIm1vdmUgdGltZSIgcHVycG9zZXMKICAgIGRlbGV0ZSAkRGF0YXtQbGFubmVkRW5kVGltZX07CiAgICBkZWxldGUgJERhdGF7UGxhbm5lZFN0YXJ0VGltZX07CgogICAgIyBSZXF1ZXN0ZWRUaW1lIHNob3VsZCBub3QgYmUgc2V0CiAgICBkZWxldGUgJERhdGF7UmVxdWVzdGVkVGltZX07CgogICAgIyBkZWxldGUgYWxsIHBhcmFtZXRlcnMgd2hvc2UgdmFsdWVzIGFyZSAndW5kZWYnCiAgICAjIF9DaGVja0NoYW5nZVBhcmFtcyB0aHJvd3MgYW4gZXJyb3Igb3RoZXJ3aXNlCiAgICBmb3IgbXkgJFBhcmFtZXRlciAoIHNvcnQga2V5cyAlRGF0YSApIHsKICAgICAgICBkZWxldGUgJERhdGF7JFBhcmFtZXRlcn0gaWYgIWRlZmluZWQgJERhdGF7JFBhcmFtZXRlcn07CiAgICB9CgogICAgIyByZXBsYWNlIHRoZSBDaGFuZ2VCdWlsZGVySUQgZnJvbSB0aGUgc2F2ZWQgdGVtcGxhdGUgd2l0aCB0aGUgY3VycmVudCB1c2VyIGlkCiAgICAkRGF0YXtDaGFuZ2VCdWlsZGVySUR9ID0gJFBhcmFte1VzZXJJRH07CgogICAgaWYgKCAkRGF0YXtDaGFuZ2VNYW5hZ2VySUR9ICkgewoKICAgICAgICAjIENoZWNrIGlmIHRoZSBjaGFuZ2UgbWFuYWdlciBpcyBzdGlsbCB2YWxpZCwgbGVhdmUgZW1wdHkgaWYgbm90CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7Q2hhbmdlTWFuYWdlcklEfSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXtDaGFuZ2VNYW5hZ2VySUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGlmIENBQiBhZ2VudHMgYXJlIHZhbGlkIGFnZW50cywgb3RoZXJ3aXNlIHJlbW92ZSB0aGVtLgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICREYXRhe0NBQkFnZW50c30gKSApIHsKCiAgICAgICAgbXkgQE5ld0NBQkFnZW50czsKCiAgICAgICAgIyBjaGVjayB1c2VycwogICAgICAgIFVTRVJJRDoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICREYXRhe0NBQkFnZW50c30gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyRGF0YXtVc2VySUR9OwoKICAgICAgICAgICAgcHVzaCBATmV3Q0FCQWdlbnRzLCAkVXNlcklEOwogICAgICAgIH0KCiAgICAgICAgJERhdGF7Q0FCQWdlbnRzfSA9IFxATmV3Q0FCQWdlbnRzOwogICAgfQoKICAgICMgQ2hlY2sgaWYgQ0FCIGN1c3RvbWVycyBhcmUgdmFsaWQgY3VzdG9tZXJzLCBvdGhlcndpc2UgcmVtb3ZlIHRoZW0uCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJERhdGF7Q0FCQ3VzdG9tZXJzfSApICkgewoKICAgICAgICBteSBATmV3Q0FCQ3VzdG9tZXJzOwoKICAgICAgICAjIGdldCB0aGUgdmFsaWQgaWQgZm9yICJ2YWxpZCIKICAgICAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGN1c3RvbWVyIHVzZXJzCiAgICAgICAgQ1VTVE9NRVJVU0VSOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyICggQHsgJERhdGF7Q0FCQ3VzdG9tZXJzfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVIgaWYgJEN1c3RvbWVyVXNlckRhdGF7VmFsaWRJRH0gbmUgJFZhbGlkSUQ7CgogICAgICAgICAgICBwdXNoIEBOZXdDQUJDdXN0b21lcnMsICRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAkRGF0YXtDQUJDdXN0b21lcnN9ID0gXEBOZXdDQUJDdXN0b21lcnM7CiAgICB9CgogICAgIyBhZGQgdGhlIGNoYW5nZQogICAgbXkgJENoYW5nZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQWRkKAogICAgICAgICVEYXRhLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJENoYW5nZUlEICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBjcmVhdGUgY2hhbmdlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgSUQgICAgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICBUaW1lRGlmZmVyZW5jZSA9PiAkRGlmZmVyZW5jZSwKICAgICAgICBPbGRDaGFuZ2VJRCAgICA9PiAkT2xkQ2hhbmdlSUQsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKPWhlYWQyIF9HZXRUaW1lRGlmZmVyZW5jZSgpCgpJZiBhIG5ldyBwbGFubmVkIHN0YXJ0L2VuZCB0aW1lIHdhcyBnaXZlbiwgdGhlIGRpZmZlcmVuY2UgaXMgbmVlZGVkCnRvIG1vdmUgYWxsIHRpbWUgdmFsdWVzCgogICAgbXkgJERpZmZJblNlY29uZHMgPSAkVGVtcGxhdGVPYmplY3QtPl9HZXRUaW1lRGlmZmVyZW5jZSgKICAgICAgICBDdXJyZW50VGltZSAgICAgPT4gJzIwMTAtMDEtMTIgMDA6MDA6MDAnLAogICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAxMjM0NTY3ODkwLAogICAgKTsKCj1jdXQKCnN1YiBfR2V0VGltZURpZmZlcmVuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VycmVudFRpbWUgTmV3VGltZUluRXBvY2hlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjdXJyZW50IHRpbWUgYXMgdGltZXN0YW1wCiAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Q3VycmVudFRpbWV9LAogICAgICAgICAgICB9CiAgICApLT5Ub0Vwb2NoKCk7CgogICAgbXkgJERpZmZTZWNvbmRzID0gJFBhcmFte05ld1RpbWVJbkVwb2NoZX0gLSAkQ3VycmVudFN5c3RlbVRpbWU7CgogICAgcmV0dXJuICREaWZmU2Vjb25kczsKfQoKPWhlYWQyIF9BdHRhY2htZW50QWRkKCkKCkNyZWF0ZXMgbmV3IGF0dGFjaG1lbnRzIGZvciBhIGNoYW5nZSBvciBhIEM8d29ya29yZGVyPiBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuCkl0IHJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uICh3aXRoIGp1c3Qgb25lIGtleSAtICJTdWNjZXNzIikKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0F0dGFjaG1lbnRBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgQXR0YWNobWVudEFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQXR0YWNobWVudEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEF0dGFjaG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VBdHRhY2htZW50R2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtPbGRDaGFuZ2VJRH0sCiAgICAgICAgRmlsZW5hbWUgPT4gJFBhcmFte0RhdGF9LT57RmlsZW5hbWV9LAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9Cgo9aGVhZDIgX0xpbmtBZGQoKQoKQ3JlYXRlcyBuZXcgbGlua3MgZm9yIGEgY2hhbmdlIG9yIGEgQzx3b3Jrb3JkZXI+IGJhc2VkIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gSXQKcmV0dXJucyBhIGhhc2ggb2YgaW5mb3JtYXRpb24gKHdpdGgganVzdCBvbmUga2V5IC0gIlN1Y2Nlc3MiKQoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5fTGlua0FkZCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAuLi4gUGFyYW1zIGZvciBMaW5rQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAxLAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9MaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU291cmNlS2V5OwoKICAgIGlmICggJFBhcmFte0RhdGF9LT57U291cmNlT2JqZWN0fSBlcSAnSVRTTUNoYW5nZScgKSB7CiAgICAgICAgJFNvdXJjZUtleSA9ICRQYXJhbXtDaGFuZ2VJRH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0gZXEgJ0lUU01Xb3JrT3JkZXInICkgewogICAgICAgICRTb3VyY2VLZXkgPSAkUGFyYW17V29ya09yZGVySUR9OwogICAgfQoKICAgIGlmICggISRTb3VyY2VLZXkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlcklEIG9yIENoYW5nZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICV7ICRQYXJhbXtEYXRhfSB9LAogICAgICAgIFNvdXJjZUtleSA9PiAkU291cmNlS2V5LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNQ29uZGl0aW9uLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Db25kaXRpb24ucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpJVFNNQ29uZGl0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgRGF0YTo6RHVtcGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OklUU01Db25kaXRpb24gLSBhbGwgdGVtcGxhdGUgZnVuY3Rpb25zIGZvciBjb25kaXRpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0LgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpJVFNNQ29uZGl0aW9uJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXJpYWxpemUoKQoKU2VyaWFsaXplIGEgY29uZGl0aW9uLiBUaGlzIGlzIGRvbmUgd2l0aCBEYXRhOjpEdW1wZXIuIEl0IHJldHVybnMKYSBzZXJpYWxpemVkIHN0cmluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUuIFRoZSBjb25kaXRpb24gYWN0aW9ucwphcmUgIndyYXBwZWQiIHdpdGhpbiBhIGhhc2ggcmVmZXJlbmNlLi4uCgogICAgbXkgJFRlbXBsYXRlU3RyaW5nID0gJFRlbXBsYXRlT2JqZWN0LT5TZXJpYWxpemUoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIFJldHVybiAgICAgID0+ICdIQVNIJywgIyAob3B0aW9uYWwpIEhBU0h8U1RSSU5HIGRlZmF1bHQgJ1NUUklORycKICAgICk7CgpyZXR1cm5zCgogICAgJ3tDb25kaXRpb25BZGQgPT4geyAuLi4gfX0nCgpJZiBwYXJhbWV0ZXIgQzxSZXR1cm4+IGlzIHNldCB0byBDPEhBU0g+LCB0aGUgUGVybCBkYXRhIHN0cnVjdHVyZQppcyByZXR1cm5lZAoKICAgIHsKICAgICAgICBDb25kaXRpb25BZGQgPT4geyAuLi4gfSwKICAgICAgICBDaGlsZHJlbiAgICAgPT4gWyAuLi4gXSwKICAgIH0KCj1jdXQKCnN1YiBTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENvbmRpdGlvbklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciAnUmV0dXJuJwogICAgJFBhcmFte1JldHVybn0gfHw9ICdTVFJJTkcnOwoKICAgICMgZ2V0IGNvbmRpdGlvbgogICAgbXkgJENvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyB0ZW1wbGF0ZXMgaGF2ZSB0byBiZSBhbiBhcnJheSByZWZlcmVuY2U7CiAgICBteSAkT3JpZ2luYWxEYXRhID0geyBDb25kaXRpb25BZGQgPT4gJENvbmRpdGlvbiB9OwoKICAgICMgZ2V0IGV4cHJlc3Npb25zCiAgICBteSAkRXhwcmVzc2lvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5FeHByZXNzaW9uTGlzdCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGFkZCBlYWNoIGV4cHJlc3Npb24gdG8gY29uZGl0aW9uIGRhdGEKICAgIGZvciBteSAkRXhwcmVzc2lvbklEICggQHskRXhwcmVzc2lvbnN9ICkgewogICAgICAgIG15ICRFeHByZXNzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+RXhwcmVzc2lvbkdldCgKICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBFeHByZXNzaW9uQWRkID0+ICRFeHByZXNzaW9uIH07CiAgICB9CgogICAgIyBnZXQgYWN0aW9ucwogICAgbXkgJEFjdGlvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5BY3Rpb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgYWRkIGVhY2ggYWN0aW9uIHRvIGNvbmRpdGlvbiBkYXRhCiAgICBmb3IgbXkgJEFjdGlvbklEICggQHskQWN0aW9uc30gKSB7CiAgICAgICAgbXkgJEFjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkFjdGlvbkdldCgKICAgICAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBBY3Rpb25BZGQgPT4gJEFjdGlvbiB9OwogICAgfQoKICAgIGlmICggJFBhcmFte1JldHVybn0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkT3JpZ2luYWxEYXRhOwogICAgfQoKICAgICMgbm8gaW5kZW50YXRpb24gKHNhdmVzIHNwYWNlKQogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAjIGRvIG5vdCB1c2UgY3Jvc3MtcmVmZXJlbmNpbmcKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkRlZXBjb3B5ID0gMTsKCiAgICAjIHNlcmlhbGl6ZSB0aGUgZGF0YSAoZG8gbm90IHVzZSAkVkFSMSwgYnV0ICRUZW1wbGF0ZURhdGEgZm9yIER1bXBlciBvdXRwdXQpCiAgICBteSAkU2VyaWFsaXplZERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EdW1wKCAkT3JpZ2luYWxEYXRhLCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1oZWFkMiBEZVNlcmlhbGl6ZSgpCgpEZVNlcmlhbGl6ZSgpIGlzIGEgd3JhcHBlciBmb3IgYWxsIHRoZSBfWFhYQWRkIG1ldGhvZHMuCgogICAgbXkgJUluZm8gPSAkVGVtcGxhdGVPYmplY3QtPkRlU2VyaWFsaXplKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjIC4uLiBQYXJhbXMgZm9yIENvbmRpdGlvbkFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIE1ldGhvZCAgID0+ICdDb25kaXRpb25BZGQnLAogICAgKTsKCj1jdXQKCnN1YiBEZVNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgTWV0aG9kIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGlzcGF0Y2ggdGFibGUKICAgIG15ICVNZXRob2QyU3ViID0gKAogICAgICAgIENvbmRpdGlvbkFkZCAgPT4gJ19Db25kaXRpb25BZGQnLAogICAgICAgIEV4cHJlc3Npb25BZGQgPT4gJ19FeHByZXNzaW9uQWRkJywKICAgICAgICBBY3Rpb25BZGQgICAgID0+ICdfQWN0aW9uQWRkJywKICAgICk7CgogICAgbXkgJFN1YiA9ICRNZXRob2QyU3VieyAkUGFyYW17TWV0aG9kfSB9OwoKICAgIGlmICggISRTdWIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIE1ldGhvZG5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPiRTdWIoJVBhcmFtKTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX0NvbmRpdGlvbkFkZCgpCgpDcmVhdGVzIG5ldyBjb25kaXRpb25zIGZvciBhIGNoYW5nZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uIChjaGFuZ2UgaWQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBpZCBpcwp0aGUgY29uZGl0aW9uIGlkKQoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5fQ29uZGl0aW9uQWRkKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjIC4uLiBQYXJhbXMgZm9yIENvbmRpdGlvbkFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQ29uZGl0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDaGFuZ2VJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRGF0YSA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgICMgZGVsZXRlIGF0dHJpYnV0ZXMKICAgIGRlbGV0ZSAkRGF0YXtDb25kaXRpb25JRH07CgogICAgIyBhZGQgY29uZGl0aW9uCiAgICBteSAkQ29uZGl0aW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5Db25kaXRpb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgSUQgICAgICAgICAgPT4gJENvbmRpdGlvbklELAogICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgKTsKCiAgICByZXR1cm4gJUluZm87Cn0KCj1oZWFkMiBfRXhwcmVzc2lvbkFkZCgpCgpDcmVhdGVzIG5ldyBleHByZXNzaW9ucyBmb3IgYSBjb25kaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIHRlbXBsYXRlLiBJdApyZXR1cm5zIGEgaGFzaCBvZiBpbmZvcm1hdGlvbiAoY2hhbmdlIGlkIGl0IHdhcyBjcmVhdGVkIGZvciwgaWQgaXMKdGhlIGV4cHJlc3Npb24gaWQpCgogICAgbXkgJUluZm8gPSAkVGVtcGxhdGVPYmplY3QtPl9FeHByZXNzaW9uQWRkKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjIC4uLiBQYXJhbXMgZm9yIEV4cHJlc3Npb25BZGQKICAgICAgICB9LAogICAgICAgIENoYW5nZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cHJlc3Npb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENoYW5nZUlEIERhdGEgQ29uZGl0aW9uSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVEYXRhID0gJXsgJFBhcmFte0RhdGF9IH07CgogICAgIyBkZWxldGUgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgbmVlZGVkCiAgICBkZWxldGUgJERhdGF7RXhwcmVzc2lvbklEfTsKCiAgICAjIHJlcGxhY2Ugb2xkIGlkcyB3aXRoIG5ldyBpZHMKICAgICREYXRhe0NvbmRpdGlvbklEfSA9ICRQYXJhbXtDb25kaXRpb25JRH07CgogICAgIyByZXBsYWNlIG9sZCBpZCBvbmx5IGlmIGl0IGlzIGFuIElECiAgICBpZiAoICREYXRhe1NlbGVjdG9yfSA9fiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICBteSAkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+T2JqZWN0R2V0KAogICAgICAgICAgICBPYmplY3RJRCA9PiAkRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJE9iamVjdC0+e05hbWV9IGVxICdJVFNNQ2hhbmdlJyApIHsKICAgICAgICAgICAgJERhdGF7U2VsZWN0b3J9ID0gJFBhcmFte0NoYW5nZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2JqZWN0LT57TmFtZX0gZXEgJ0lUU01Xb3JrT3JkZXInICkgewogICAgICAgICAgICAkRGF0YXtTZWxlY3Rvcn0gPSAkUGFyYW17T2xkV29ya09yZGVySURzfS0+eyAkRGF0YXtTZWxlY3Rvcn0gfTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb25JRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyktPkV4cHJlc3Npb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9Cgo9aGVhZDIgX0FjdGlvbkFkZCgpCgpDcmVhdGVzIG5ldyBhY3Rpb25zIGZvciBhIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uIChjaGFuZ2UgaWQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBpZCBpcwp0aGUgYWN0aW9uIGlkKQoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5fQWN0aW9uQWRkKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjIC4uLiBQYXJhbXMgZm9yIEFjdGlvbkFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQWN0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDaGFuZ2VJRCBEYXRhIENvbmRpdGlvbklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRGF0YSA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgICMgZGVsZXRlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IG5lZWRlZAogICAgZGVsZXRlICREYXRhe0FjdGlvbklEfTsKCiAgICAjIHJlcGxhY2Ugb2xkIGlkcyB3aXRoIG5ldyBpZHMKICAgICREYXRhe0NvbmRpdGlvbklEfSA9ICRQYXJhbXtDb25kaXRpb25JRH07CgogICAgIyByZXBsYWNlIG9sZCBpZCBvbmx5IGlmIGl0IGlzIGFuIElECiAgICBpZiAoICREYXRhe1NlbGVjdG9yfSA9fiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICBteSAkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+T2JqZWN0R2V0KAogICAgICAgICAgICBPYmplY3RJRCA9PiAkRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJE9iamVjdC0+e05hbWV9IGVxICdJVFNNQ2hhbmdlJyApIHsKICAgICAgICAgICAgJERhdGF7U2VsZWN0b3J9ID0gJFBhcmFte0NoYW5nZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2JqZWN0LT57TmFtZX0gZXEgJ0lUU01Xb3JrT3JkZXInICkgewogICAgICAgICAgICAkRGF0YXtTZWxlY3Rvcn0gPSAkUGFyYW17T2xkV29ya09yZGVySURzfS0+eyAkRGF0YXtTZWxlY3Rvcn0gfTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgYWN0aW9uCiAgICBteSAkQWN0aW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5BY3Rpb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICA9PiAkQWN0aW9uSUQsCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNV29ya09yZGVyLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBJVFNNV29ya09yZGVyLnBtLHYgMS4yIDIwMTgvMTAvMTEgMTQ6NDQ6MzIgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpJVFNNV29ya09yZGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgRGF0YTo6RHVtcGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlciAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIHdvcmtvcmRlcnMKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGZ1bmN0aW9ucyBmb3Igd29yayBvcmRlciB0ZW1wbGF0ZXMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWN1dAoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OklUU01Xb3JrT3JkZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFNlcmlhbGl6ZSgpCgpTZXJpYWxpemUgYSBDPHdvcmtvcmRlcj4uIFRoaXMgaXMgZG9uZSB3aXRoIERhdGE6OkR1bXBlci4gSXQgcmV0dXJucwphIHNlcmlhbGl6ZWQgc3RyaW5nIG9mIHRoZSBkYXRhIHN0cnVjdHVyZS4gVGhlIEM8d29ya29yZGVyPiBhY3Rpb25zCmFyZSAid3JhcHBlZCIgd2l0aGluIGEgaGFzaCByZWZlcmVuY2UuLi4KCiAgICBteSAkVGVtcGxhdGVTdHJpbmcgPSAkVGVtcGxhdGVPYmplY3QtPlNlcmlhbGl6ZSgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxLAogICAgICAgIFN0YXRlUmVzZXQgID0+IDEsICMgKG9wdGlvbmFsKSByZXNldCB0byBkZWZhdWx0IHN0YXRlCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBSZXR1cm4gICAgICA9PiAnSEFTSCcsICMgKG9wdGlvbmFsKSBIQVNIfFNUUklORyBkZWZhdWx0ICdTVFJJTkcnCiAgICApOwoKcmV0dXJucwoKICAgICd7V29ya09yZGVyQWRkID0+IHsgQ2hhbmdlSUQgPT4gMTIzLCAuLi4gfX0nCgpJZiBwYXJhbWV0ZXIgQzxSZXR1cm4+IGlzIHNldCB0byBDPEhBU0g+LCB0aGUgUGVybCBkYXRhIHN0cnVjdHVyZQppcyByZXR1cm5lZAoKICAgIHsKICAgICAgICBXb3JrT3JkZXJBZGQgPT4geyAuLi4gfSwKICAgICAgICBDaGlsZHJlbiAgICAgPT4gWyAuLi4gXSwKICAgIH0KCj1jdXQKCnN1YiBTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciAnUmV0dXJuJwogICAgJFBhcmFte1JldHVybn0gfHw9ICdTVFJJTkcnOwoKICAgICMgZ2V0IHdvcmtvcmRlcgogICAgbXkgJFdvcmtPcmRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXI7CgogICAgIyBrZWVwIGp1c3Qgd2FudGVkIGF0dHJpYnV0ZXMKICAgIG15ICRDbGVhbldvcmtPcmRlcjsKICAgIGZvciBteSAkQXR0cmlidXRlICgKICAgICAgICBxdygKICAgICAgICBXb3JrT3JkZXJJRCBDaGFuZ2VJRCBXb3JrT3JkZXJOdW1iZXIgV29ya09yZGVyVGl0bGUgSW5zdHJ1Y3Rpb24KICAgICAgICBSZXBvcnQgV29ya09yZGVyU3RhdGVJRCBXb3JrT3JkZXJUeXBlSUQgV29ya09yZGVyQWdlbnRJRCBXb3JrT3JkZXJHcm91cElECiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSBBY2NvdW50ZWRUaW1lIFBsYW5uZWRFZmZvcnQKICAgICAgICBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpCiAgICAgICAgKQogICAgewogICAgICAgICRDbGVhbldvcmtPcmRlci0+eyRBdHRyaWJ1dGV9ID0gJFdvcmtPcmRlci0+eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgICMgcmVzZXQgd29ya29yZGVyIHN0YXRlIHRvIGRlZmF1bHQgaWYgcmVxdWVzdGVkCiAgICBpZiAoICRQYXJhbXtTdGF0ZVJlc2V0fSApIHsKCiAgICAgICAgIyBnZXQgaW5pdGlhbCB3b3Jrb3JkZXIgc3RhdGUgaWQKICAgICAgICBteSAkTmV4dFN0YXRlSURzCiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICAgICApOwogICAgICAgICRDbGVhbldvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ID0gJE5leHRTdGF0ZUlEcy0+WzBdOwoKICAgICAgICAjIHJlc2V0IGFjdHVhbCBzdGFydCBhbmQgZW5kIHRpbWUKICAgICAgICAkQ2xlYW5Xb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9ID0gdW5kZWY7CiAgICAgICAgJENsZWFuV29ya09yZGVyLT57QWN0dWFsRW5kVGltZX0gICA9IHVuZGVmOwogICAgfQoKICAgICMgYWRkIHdvcmtvcmRlciBmaWVsZHMgdG8gbGlzdCBvZiB3YW50ZWQgYXR0cmlidXRlCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyRXb3JrT3JkZXJ9ICkgewoKICAgICAgICAjIGZpbmQgdGhlIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkIGF0dHJpYnV0ZXMKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgPX4gbXsgXEEgRHluYW1pY0ZpZWxkXy4qIFx6IH14bXMgKSB7CgogICAgICAgICAgICAkQ2xlYW5Xb3JrT3JkZXItPnskQXR0cmlidXRlfSA9ICRXb3JrT3JkZXItPnskQXR0cmlidXRlfTsKICAgICAgICB9CiAgICB9CgogICAgIyB0ZW1wbGF0ZXMgaGF2ZSB0byBiZSBhbiBhcnJheSByZWZlcmVuY2U7CiAgICBteSAkT3JpZ2luYWxEYXRhID0geyBXb3JrT3JkZXJBZGQgPT4gJENsZWFuV29ya09yZGVyIH07CgogICAgIyBnZXQgYXR0YWNobWVudHMKICAgIG15IEBXb3JrT3JkZXJBdHRhY2htZW50cwogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICApOwoKICAgIGZvciBteSAkRmlsZW5hbWUgKEBXb3JrT3JkZXJBdHRhY2htZW50cykgewoKICAgICAgICAjIHNhdmUgYXR0YWNobWVudHMgdG8gdGhpcyB0ZW1wbGF0ZQogICAgICAgIHB1c2ggQHsgJE9yaWdpbmFsRGF0YS0+e0NoaWxkcmVufSB9LCB7IEF0dGFjaG1lbnRBZGQgPT4geyBGaWxlbmFtZSA9PiAkRmlsZW5hbWUgfSB9OwogICAgfQoKICAgICMgZ2V0IGxpbmtzIHRvIG90aGVyIG9iamVjdAogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBmb3IgbXkgJFRhcmdldE9iamVjdCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGEtPnskVGFyZ2V0T2JqZWN0fSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YS0+eyRUYXJnZXRPYmplY3R9LT57JFR5cGV9IH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldElEICgKICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGEtPnskVGFyZ2V0T2JqZWN0fS0+eyRUeXBlfS0+eyRLZXl9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtJbmZvID0gewogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJE9yaWdpbmFsRGF0YS0+e0NoaWxkcmVufSB9LCB7IExpbmtBZGQgPT4gJExpbmtJbmZvIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17UmV0dXJufSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICRPcmlnaW5hbERhdGE7CiAgICB9CgogICAgIyBubyBpbmRlbnRhdGlvbiAoc2F2ZXMgc3BhY2UpCiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICMgZG8gbm90IHVzZSBjcm9zcy1yZWZlcmVuY2luZwogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6RGVlcGNvcHkgPSAxOwoKICAgICMgc2VyaWFsaXplIHRoZSBkYXRhIChkbyBub3QgdXNlICRWQVIxLCBidXQgJFRlbXBsYXRlRGF0YSBmb3IgRHVtcGVyIG91dHB1dCkKICAgIG15ICRTZXJpYWxpemVkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkR1bXAoICRPcmlnaW5hbERhdGEsICdiaW5hcnknICk7CgogICAgcmV0dXJuICRTZXJpYWxpemVkRGF0YTsKfQoKPWhlYWQyIERlU2VyaWFsaXplKCkKCkRlU2VyaWFsaXplKCkgaXMgYSB3cmFwcGVyIGZvciBhbGwgdGhlIF9YWFhBZGQgbWV0aG9kcy4KCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+RGVTZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgV29ya09yZGVyQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgTWV0aG9kICAgPT4gJ1dvcmtPcmRlckFkZCcsCiAgICApOwoKPWN1dAoKc3ViIERlU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBNZXRob2QgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkaXNwYXRjaCB0YWJsZQogICAgbXkgJU1ldGhvZDJTdWIgPSAoCiAgICAgICAgV29ya09yZGVyQWRkICA9PiAnX1dvcmtPcmRlckFkZCcsCiAgICAgICAgQXR0YWNobWVudEFkZCA9PiAnX0F0dGFjaG1lbnRBZGQnLAogICAgICAgIExpbmtBZGQgICAgICAgPT4gJ19MaW5rQWRkJywKICAgICk7CgogICAgbXkgJFN1YiA9ICRNZXRob2QyU3VieyAkUGFyYW17TWV0aG9kfSB9OwoKICAgIGlmICggISRTdWIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIE1ldGhvZG5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPiRTdWIoJVBhcmFtKTsKfQoKPWhlYWQyIF9Xb3JrT3JkZXJBZGQoKQoKQ3JlYXRlcyBhIG5ldyBDPHdvcmtvcmRlcj4gYmFzZWQgb24gYSB0ZW1wbGF0ZS4gSXQgcmV0dXJucyB0aGUKY2hhbmdlIGlkIGl0IHdhcyBjcmVhdGVkIGZvciBhbmQgdGhlIG5ldyBDPHdvcmtvcmRlcj4gaWQuCgogICAgbXkgKCAkQ2hhbmdlSUQsICRXb3JrT3JkZXJJRCApID0gJFRlbXBsYXRlT2JqZWN0LT5fV29ya09yZGVyQWRkKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9Xb3JrT3JkZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENoYW5nZUlEIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBhIGxvY2FsIGNvcHkKICAgIG15ICVEYXRhID0gJXsgJFBhcmFte0RhdGF9IH07CgogICAgIyB3ZSBuZWVkIHRoZSBvbGQgY2hhbmdlIGlkIGZvciBleHByZXNzaW9ucwogICAgbXkgJE9sZFdvcmtPcmRlcklEID0gJERhdGF7V29ya09yZGVySUR9OwoKICAgICMgdGhlc2UgYXR0cmlidXRlcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIHNvIGRvbid0IHBhc3MgdGhlbSB0byBXb3JrT3JkZXJBZGQoKQogICAgZGVsZXRlIEBEYXRhe3F3KFdvcmtPcmRlcklEIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSl9OwogICAgZGVsZXRlIEBEYXRhe3F3KEluc3RydWN0aW9uUGxhaW4gUmVwb3J0UGxhaW4pfTsKCiAgICAjIGRlbGV0ZSBhbGwgcGFyYW1ldGVycyB3aG9zZSB2YWx1ZXMgYXJlICd1bmRlZicKICAgICMgX0NoZWNrV29ya09yZGVyUGFyYW1zIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UKICAgIGZvciBteSAkUGFyYW1ldGVyICggc29ydCBrZXlzICVEYXRhICkgewogICAgICAgIGRlbGV0ZSAkRGF0YXskUGFyYW1ldGVyfSBpZiAhZGVmaW5lZCAkRGF0YXskUGFyYW1ldGVyfTsKICAgIH0KCiAgICAjIHh4eCg/OlN0YXJ0fEVuZClUaW1lcyBhcmUgZW1wdHkgc3RyaW5ncyBvbiBXb3JrT3JkZXJHZXQgd2hlbgogICAgIyBubyB0aW1lIHZhbHVlIGlzIHNldC4gVGhpcyBjb25mdXNlcyBfQ2hlY2tUaW1lc3RhbXBzLiBUaHVzCiAgICAjIGRlbGV0ZSB0aGVzZSBwYXJhbWV0ZXJzLgogICAgZm9yIG15ICRQcmVmaXggKHF3KEFjdHVhbCBQbGFubmVkKSkgewogICAgICAgIGZvciBteSAkU3VmZml4IChxdyhTdGFydCBFbmQpKSB7CiAgICAgICAgICAgIGlmICggISREYXRheyIkUHJlZml4JHtTdWZmaXh9VGltZSJ9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyIkUHJlZml4JHtTdWZmaXh9VGltZSJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbW92ZSB0aW1lIHNsb3QgZm9yIHdvcmtvcmRlciBpZiBuZWNjZXNzYXJ5CiAgICBteSAkRGlmZmVyZW5jZSA9ICRQYXJhbXtUaW1lRGlmZmVyZW5jZX07CiAgICBpZiAoICREaWZmZXJlbmNlIHx8ICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9ICkgewoKICAgICAgICAjIGNhbGMgbmV3IHZhbHVlcyBmb3Igc3RhcnQgYW5kIGVuZCB0aW1lCiAgICAgICAgZm9yIG15ICRTdWZmaXggKHF3KFN0YXJ0IEVuZCkpIHsKCiAgICAgICAgICAgIGlmICggJERhdGF7IlBsYW5uZWQke1N1ZmZpeH1UaW1lIn0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGlmZmVyZW5jZSBpZiBub3QgYWxyZWFkeSBjYWxjdWxhdGVkIChhbGxvdyB6ZXJvIGRpZmZlcmVuY2UpCiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICREaWZmZXJlbmNlICYmICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHRpbWUgbmVlZHMgdG8gYmUgY29ycmVjdGVkIGlmIHRoZSBtb3ZlIHRpbWUgdHlwZSBpcyB0aGUgcGxhbm5lZCBlbmQgdGltZQogICAgICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXJMZW5ndGhJblNlY29uZHMgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte01vdmVUaW1lVHlwZX0gZXEgJ1BsYW5uZWRFbmRUaW1lJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSBvbGQgcGxhbm5lZCBzdGFydCB0aW1lIGludG8gZXBvY2ggc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkT2xkUGxhbm5lZFN0YXJ0VGltZUluU2Vjb25kcyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIG9sZCBwbGFubmVkIGVuZCB0aW1lIGludG8gZXBvY2ggc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkT2xkUGxhbm5lZEVuZFRpbWVJblNlY29uZHMgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSB0aW1lIGxlbmd0aCBvZiB0aGUgd29ya29yZGVyIGluIHNlY29uZHMKICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlckxlbmd0aEluU2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkT2xkUGxhbm5lZEVuZFRpbWVJblNlY29uZHMgLSAkT2xkUGxhbm5lZFN0YXJ0VGltZUluU2Vjb25kczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSB0aW1lIGRpZmZlcmVuY2UKICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9ICRTZWxmLT5fR2V0VGltZURpZmZlcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICAgICA9PiAkRGF0YXsiUGxhbm5lZCR7U3VmZml4fVRpbWUifSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VGltZUluRXBvY2hlID0+ICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9IC0gJFdvcmtPcmRlckxlbmd0aEluU2Vjb25kcywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IG5ldyB2YWx1ZQogICAgICAgICAgICAgICAgJERhdGF7IlBsYW5uZWQke1N1ZmZpeH1UaW1lIn0gPSAkU2VsZi0+X01vdmVUaW1lKAogICAgICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lID0+ICREYXRheyJQbGFubmVkJHtTdWZmaXh9VGltZSJ9LAogICAgICAgICAgICAgICAgICAgIERpZmZlcmVuY2UgID0+ICREaWZmZXJlbmNlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICREYXRhe1dvcmtPcmRlckFnZW50SUR9ICkgewoKICAgICAgICAjIENoZWNrIGlmIHRoZSB3b3Jrb3JkZXIgYWdlbnQgaXMgc3RpbGwgdmFsaWQsIGxlYXZlIGVtcHR5IGlmIG5vdAogICAgICAgIG15ICVVc2VyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7V29ya09yZGVyQWdlbnRJRH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISRVc2VyRGF0YXtVc2VySUR9ICkgewogICAgICAgICAgICBkZWxldGUgJERhdGF7V29ya09yZGVyQWdlbnRJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgb3ZlcnJpZGUgdGhlIGNoYW5nZSBpZCBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgbXkgJFdvcmtPcmRlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyQWRkKAogICAgICAgICVEYXRhLAogICAgICAgIE5vTnVtYmVyQ2FsYyA9PiAkUGFyYW17Tm9OdW1iZXJDYWxjfSwKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBjcmVhdGUgV29ya29yZGVyIGZyb20gVGVtcGxhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdlIG5lZWQgYSBtYXBwaW5nICJvbGQgaWQiIHRvICJuZXcgaWQiIGZvciB0aGUgY29uZGl0aW9ucwogICAgbXkgJE9sZElEczJOZXdJRHMgPSB7CiAgICAgICAgJXsgJFBhcmFte09sZFdvcmtPcmRlcklEc30gfHwge30gfSwKICAgICAgICAkT2xkV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgfTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICAgICAgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFdvcmtPcmRlcklEICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgQ2hhbmdlSUQgICAgICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgT2xkV29ya09yZGVySURzID0+ICRPbGRJRHMyTmV3SURzLAogICAgKTsKCiAgICByZXR1cm4gJUluZm87Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9HZXRUaW1lRGlmZmVyZW5jZSgpCgpJZiBhIG5ldyBwbGFubmVkIHN0YXJ0L2VuZCB0aW1lIHdhcyBnaXZlbiwgdGhlIGRpZmZlcmVuY2UgaXMgbmVlZGVkCnRvIG1vdmUgYWxsIHRpbWUgdmFsdWVzCgogICAgbXkgJERpZmZJblNlY29uZHMgPSAkVGVtcGxhdGVPYmplY3QtPl9HZXRUaW1lRGlmZmVyZW5jZSgKICAgICAgICBDdXJyZW50VGltZSAgICAgPT4gJzIwMTAtMDEtMTIgMDA6MDA6MDAnLAogICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAxMjM0NTY3ODkwLAogICAgKTsKCj1jdXQKCnN1YiBfR2V0VGltZURpZmZlcmVuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VycmVudFRpbWUgTmV3VGltZUluRXBvY2hlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjdXJyZW50IHRpbWUgYXMgdGltZXN0YW1wCiAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Q3VycmVudFRpbWV9LAogICAgICAgICAgICB9CiAgICApLT5Ub0Vwb2NoKCk7CgogICAgbXkgJERpZmZTZWNvbmRzID0gJFBhcmFte05ld1RpbWVJbkVwb2NoZX0gLSAkQ3VycmVudFN5c3RlbVRpbWU7CgogICAgcmV0dXJuICREaWZmU2Vjb25kczsKfQoKPWhlYWQyIF9Nb3ZlVGltZSgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgZm9yIGEgdGltZSBjb2x1bW4gYmFzZWQgb24gdGhlCmRpZmZlcmVuY2UuCgogICAgbXkgJFRpbWVWYWx1ZSA9ICRUZW1wbGF0ZU9iamVjdC0+X01vdmVUaW1lKAogICAgICAgIEN1cnJlbnRUaW1lID0+ICcyMDEwLTAxLTEyIDAwOjAwOjAwJywKICAgICAgICBEaWZmZXJlbmNlICA9PiAxMzUsICAgICAgICAgICAgICAgICAgICAgIyBpbiBzZWNvbmRzCiAgICApOwoKPWN1dAoKc3ViIF9Nb3ZlVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAjIG5lZWQgdG8gY2hlY2sgZm9yIGRlZmluZWQsIGJlY2F1c2UgMCBpcyBhbGxvd2VkIGZvciBEaWZmZXJlbmNlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDdXJyZW50VGltZSBEaWZmZXJlbmNlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSBhcyB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtDdXJyZW50VGltZX0sCiAgICAgICAgfSwKICAgICktPlRvRXBvY2goKTsKCiAgICAjIGdldCBwbGFubmVkIHRpbWUgYXMgdGltZXN0YW1wCiAgICBteSAkTmV3VGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgRXBvY2ggPT4gJEN1cnJlbnRTeXN0ZW1UaW1lICsgJFBhcmFte0RpZmZlcmVuY2V9LAogICAgICAgIH0sCiAgICApLT5Ub1N0cmluZygpOwoKICAgIHJldHVybiAkTmV3VGltZTsKfQoKPWhlYWQyIF9BdHRhY2htZW50QWRkKCkKCkNyZWF0ZXMgbmV3IGF0dGFjaG1lbnRzIGZvciBhIGNoYW5nZSBvciBhIEM8d29ya29yZGVyPiBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuCkl0IHJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uICh3aXRoIGp1c3Qgb25lIGtleSAtICJTdWNjZXNzIikKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0F0dGFjaG1lbnRBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgQXR0YWNobWVudEFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQXR0YWNobWVudEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoIGZyb20gbmV3IHdvcmtvcmRlciBpZCB0byBvbGQgd29ya29yZGVyIGlkCiAgICBteSAlTmV3V29ya09yZGVySUQyT2xkV29ya09yZGVySUQgPSByZXZlcnNlICV7ICRQYXJhbXtPbGRXb3JrT3JkZXJJRHN9IH07CgogICAgbXkgJE9sZFdvcmtPcmRlcklEID0gJE5ld1dvcmtPcmRlcklEMk9sZFdvcmtPcmRlcklEeyAkUGFyYW17V29ya09yZGVySUR9IH07CgogICAgbXkgJEF0dGFjaG1lbnQKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJE9sZFdvcmtPcmRlcklELAogICAgICAgIEZpbGVuYW1lICAgID0+ICRQYXJhbXtEYXRhfS0+e0ZpbGVuYW1lfSwKICAgICAgICApOwoKICAgIG15ICRTdWNjZXNzCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5Xb3JrT3JkZXJBdHRhY2htZW50QWRkKAogICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKPWhlYWQyIF9MaW5rQWRkKCkKCkNyZWF0ZXMgbmV3IGxpbmtzIGZvciBhIGNoYW5nZSBvciBhIEM8d29ya29yZGVyPiBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uICh3aXRoIGp1c3Qgb25lIGtleSAtICJTdWNjZXNzIikKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0xpbmtBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgTGlua0FkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gMSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNvdXJjZUtleTsKCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0gZXEgJ0lUU01DaGFuZ2UnICkgewogICAgICAgICRTb3VyY2VLZXkgPSAkUGFyYW17Q2hhbmdlSUR9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGF0YX0tPntTb3VyY2VPYmplY3R9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAkU291cmNlS2V5ID0gJFBhcmFte1dvcmtPcmRlcklEfTsKICAgIH0KCiAgICBpZiAoICEkU291cmNlS2V5ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJJRCBvciBDaGFuZ2VJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0FkZCgKICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwKICAgICAgICBTb3VyY2VLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNQ2hhbmdlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01DaGFuZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpJVFNNQ2hhbmdlIC0gTGlua09iamVjdCBiYWNrZW5kIGZvciBJVFNNQ2hhbmdlCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkTGlua09iamVjdElUU01DaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6SVRTTUNoYW5nZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBMaW5rTGlzdFdpdGhEYXRhKCkKCkZpbGwgdXAgdGhlIGxpbmsgbGlzdCB3aXRoIGRhdGEKCiAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0QmFja2VuZC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBMaW5rTGlzdCA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9IH0gKSB7CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBDSEFOR0VJRDoKICAgICAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgaWQgZnJvbSBoYXNoIGlmIENoYW5nZUdldCgpIHJldHVybnMgbm8gcmVzdWx0cwogICAgICAgICAgICAgICAgaWYgKCAhJENoYW5nZURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQ2hhbmdlSUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgQ0hBTkdFSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQ2hhbmdlSUR9ID0gJENoYW5nZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBPYmplY3RQZXJtaXNzaW9uKCkKCkNoZWNrcyByZWFkIHBlcm1pc3Npb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IGFuZCBVc2VySUQuCgogICAgJFBlcm1pc3Npb24gPSAkTGlua09iamVjdC0+T2JqZWN0UGVybWlzc2lvbigKICAgICAgICBPYmplY3QgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBjaGFuZ2Ugem9vbSBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20nKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBY2Nlc3M7Cn0KCj1oZWFkMiBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpSZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMuCgpSZXR1cm4KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gIkNoYW5nZSMgMjAwOTEwMjExMDAwMTY3NCIsCiAgICAgICAgTG9uZyAgID0+ICJDaGFuZ2UjIDIwMDkxMDIxMTAwMDE2NzQ6IFRoZSBDaGFuZ2UgVGl0bGUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ0NoYW5nZScsCiAgICAgICAgTG9uZyAgID0+ICdDaGFuZ2UnLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uIGlmICRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGFuZ2VEYXRhOwogICAgcmV0dXJuIGlmICEleyRDaGFuZ2VEYXRhfTsKCiAgICAjIGRlZmluZSBkZXNjcmlwdGlvbiB0ZXh0CiAgICBteSAkQ2hhbmdlSG9vayAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpIb29rJyk7CiAgICBteSAkRGVzY3JpcHRpb25UZXh0ID0gIiRDaGFuZ2VIb29rICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSI7CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJERlc2NyaXB0aW9uVGV4dCwKICAgICAgICBMb25nICAgPT4gIiREZXNjcmlwdGlvblRleHQ6ICRDaGFuZ2VEYXRhLT57Q2hhbmdlVGl0bGV9IiwKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbjsKfQoKPWhlYWQyIE9iamVjdFNlYXJjaCgpCgpSZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzLgoKICAgICRTZWFyY2hMaXN0ID0gJExpbmtPYmplY3RCYWNrZW5kLT5PYmplY3RTZWFyY2goCiAgICAgICAgU2VhcmNoUGFyYW1zID0+ICRIYXNoUmVmLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlYXJjaExpc3QgPSB7CiAgICAgICAgTk9UTElOS0VEID0+IHsKICAgICAgICAgICAgU291cmNlID0+IHsKICAgICAgICAgICAgICAgIDEyICA9PiAkRGF0YU9mSXRlbTEyLAogICAgICAgICAgICAgICAgMjEyID0+ICREYXRhT2ZJdGVtMjEyLAogICAgICAgICAgICAgICAgMzMyID0+ICREYXRhT2ZJdGVtMzMyLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9OwoKPWN1dAoKc3ViIE9iamVjdFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMKICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9IHx8PSB7fTsKCiAgICAjIGFkZCB3aWxkY2FyZHMKICAgIG15ICVTZWFyY2g7CiAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KENoYW5nZU51bWJlciBDaGFuZ2VUaXRsZSBXb3JrT3JkZXJUaXRsZSkpIHsKICAgICAgICBpZiAoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9ICkgewogICAgICAgICAgICAkU2VhcmNoeyRFbGVtZW50fSA9ICcqJyAuICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9IC4gJyonOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgY2hhbmdlcwogICAgIyBubyBuZWVkIHRvIHVzZSBPcmRlckJ5IGhlcmUsIGJlY2F1c2UgaXQgaXMgc29ydGVkIGluIFRhYmxlQ3JlYXRlQ29tcGxleCBhbmQgVGFibGVDcmVhdGVTaW1wbGUKICAgIG15ICRDaGFuZ2VJRHNSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJFBhcmFte1NlYXJjaFBhcmFtc30gfSwKICAgICAgICAlU2VhcmNoLAogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDEsCiAgICAgICAgTWlycm9yREIgICAgICAgPT4gMSwKCiAgICAgICAgIyBUT0RPOgogICAgICAgICMgdXNlIHN5c2NvbmZpZyBvcHRpb24gZm9yICdsaW1pdCcgaW5zdGVhZCwgZGVjaWRlIHdoZWF0ZXIgdGhpcyBvcHRpb24gd291bGQgYmUgb25seQogICAgICAgICMgdmFsaWQgZm9yIGxpbmtpbmcgY2hhbmdlcywgb3IganVzdCB1c2UgYSBnbG9iYWwgc2V0dGluZyBmb3IgYWxsIGxpbmtpbmcgc3R1ZmYKICAgICAgICBMaW1pdCA9PiAyMDAsCgogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVNlYXJjaExpc3Q7CiAgICBDSEFOR0VJRDoKICAgIGZvciBteSAkQ2hhbmdlSUQgKCBAeyRDaGFuZ2VJRHNSZWZ9ICkgewoKICAgICAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgICAgIG15ICRDaGFuZ2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ2hhbmdlSUQgaWYgISRDaGFuZ2VEYXRhOwoKICAgICAgICAjIGFkZCBjaGFuZ2UgZGF0YQogICAgICAgICRTZWFyY2hMaXN0e05PVExJTktFRH0tPntTb3VyY2V9LT57JENoYW5nZUlEfSA9ICRDaGFuZ2VEYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1oZWFkMiBMaW5rQWRkUHJlKCkKCkxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUuCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rQWRkUG9zdCgpCgpMaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlLgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGxpbmtlZCBvYmplY3QKICAgIG15ICRJRCAgICAgPSAkUGFyYW17VGFyZ2V0S2V5fSAgICB8fCAkUGFyYW17U291cmNlS2V5fTsKICAgIG15ICRPYmplY3QgPSAkUGFyYW17VGFyZ2V0T2JqZWN0fSB8fCAkUGFyYW17U291cmNlT2JqZWN0fTsKCiAgICAjIHRyaWdnZXIgQ2hhbmdlTGlua0FkZFBvc3QtRXZlbnQKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlTGlua0FkZFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3QsICAgICAgICAgIyB0aGUgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rCiAgICAgICAgICAgIElEICAgICAgID0+ICRJRCwgICAgICAgICAgICAgIyBpZCBvZiB0aGUgb3RoZXIgb2JqZWN0CiAgICAgICAgICAgIFR5cGUgICAgID0+ICRQYXJhbXtUeXBlfSwgICAgIyB0aGUgbGluayB0eXBlCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rRGVsZXRlUHJlKCkKCkxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUuCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rRGVsZXRlUG9zdCgpCgpMaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZS4KCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaW5rZWQgb2JqZWN0CiAgICBteSAkSUQgICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgIyB0cmlnZ2VyIENoYW5nZUxpbmtEZWxldGVQb3N0LUV2ZW50CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUxpbmtEZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0LCAgICAgICAgICMgdGhlIG90aGVyIG9iamVjdCBvZiB0aGUgbGluawogICAgICAgICAgICBJRCAgICAgICA9PiAkSUQsICAgICAgICAgICAgICMgaWQgb2YgdGhlIG90aGVyIG9iamVjdAogICAgICAgICAgICBUeXBlICAgICA9PiAkUGFyYW17VHlwZX0sICAgICMgdGhlIGxpbmsgdHlwZQogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNV29ya09yZGVyLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Xb3JrT3JkZXIucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6SVRTTVdvcmtPcmRlciAtIExpbmtPYmplY3QgSVRTTVdvcmtPcmRlciBtb2R1bGUKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRMaW5rT2JqZWN0SVRTTVdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpJVFNNV29ya09yZGVyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIExpbmtMaXN0V2l0aERhdGEoKQoKRmlsbCB1cCB0aGUgbGluayBsaXN0IHdpdGggZGF0YS4KCiAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0QmFja2VuZC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBMaW5rTGlzdCA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9IH0gKSB7CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBXT1JLT1JERVJJRDoKICAgICAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgaWQgZnJvbSBoYXNoIGlmIFdvcmtPcmRlckdldCgpIHJldHVybnMgbm8gcmVzdWx0cwogICAgICAgICAgICAgICAgaWYgKCAhJFdvcmtPcmRlckRhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskV29ya09yZGVySUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgV09SS09SREVSSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEgZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgd29ya29yZGVyIGlkIGZyb20gaGFzaCBpZiBjaGFuZ2UgZm9yIHRoaXMgd29ya29yZGVyIHJldHVybnMgbm8gcmVzdWx0cwogICAgICAgICAgICAgICAgaWYgKCAhJENoYW5nZURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskV29ya09yZGVySUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgV09SS09SREVSSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIGNoYW5nZSBkYXRhIHRvIHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJEYXRhfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VEYXRhID0+ICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRXb3JrT3JkZXJJRH0gPSBcJURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBPYmplY3RQZXJtaXNzaW9uKCkKCkNoZWNrcyByZWFkIHBlcm1pc3Npb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IGFuZCBVc2VySUQuCgogICAgJFBlcm1pc3Npb24gPSAkTGlua09iamVjdC0+T2JqZWN0UGVybWlzc2lvbigKICAgICAgICBPYmplY3QgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiB3b3Jrb3JkZXIgem9vbSBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclpvb20nKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBY2Nlc3M7Cn0KCj1oZWFkMiBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpSZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMuCgogICAgJURlc2NyaXB0aW9uID0gJExpbmtPYmplY3QtPk9iamVjdERlc2NyaXB0aW9uR2V0KAogICAgICAgIEtleSAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiV29ya29yZGVyIyAyMDA5MTAyMTEwMDAxNjc0LTEiLAogICAgICAgIExvbmcgICA9PiAiV29ya29yZGVyIyAyMDA5MTAyMTEwMDAxNjc0LTE6IFRoZSBXb3Jrb3JkZXIgVGl0bGUiLAogICAgKTsKCgo9Y3V0CgpzdWIgT2JqZWN0RGVzY3JpcHRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICBteSAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICdXb3Jrb3JkZXInLAogICAgICAgIExvbmcgICA9PiAnV29ya29yZGVyJywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSAkV29ya09yZGVyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkV29ya09yZGVyRGF0YTsKICAgIHJldHVybiBpZiAhJXskV29ya09yZGVyRGF0YX07CgogICAgIyBnZXQgY2hhbmdlIGRhdGEgZm9yIHRoaXMgd29ya29yZGVyCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hhbmdlRGF0YTsKICAgIHJldHVybiBpZiAhJXskQ2hhbmdlRGF0YX07CgogICAgIyBkZWZpbmUgZGVzY3JpcHRpb24gdGV4dAogICAgbXkgJFdvcmtPcmRlckhvb2sgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTVdvcmtPcmRlcjo6SG9vaycpOwogICAgbXkgJERlc2NyaXB0aW9uVGV4dCA9ICIkV29ya09yZGVySG9vayAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0tJFdvcmtPcmRlckRhdGEtPntXb3JrT3JkZXJOdW1iZXJ9IjsKCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAkRGVzY3JpcHRpb25UZXh0LAogICAgICAgIExvbmcgICA9PiAiJERlc2NyaXB0aW9uVGV4dDogJFdvcmtPcmRlckRhdGEtPntXb3JrT3JkZXJUaXRsZX0iLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aGVhZDIgT2JqZWN0U2VhcmNoKCkKClJldHVybiBhIGhhc2ggbGlzdCBvZiB0aGUgc2VhcmNoIHJlc3VsdHMuCgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07Cgo9Y3V0CgpzdWIgT2JqZWN0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHBhcmFtcwogICAgJFBhcmFte1NlYXJjaFBhcmFtc30gfHw9IHt9OwoKICAgICMgYWRkIHdpbGRjYXJkcwogICAgbXkgJVNlYXJjaDsKICAgIGZvciBteSAkRWxlbWVudCAocXcoQ2hhbmdlTnVtYmVyIENoYW5nZVRpdGxlIFdvcmtPcmRlclRpdGxlKSkgewogICAgICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPnskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICRTZWFyY2h7JEVsZW1lbnR9ID0gJyonIC4gJFBhcmFte1NlYXJjaFBhcmFtc30tPnskRWxlbWVudH0gLiAnKic7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VhcmNoIHRoZSB3b3Jrb3JkZXJzCiAgICAjIG5vIG5lZWQgdG8gdXNlIE9yZGVyQnkgaGVyZSwgYmVjYXVzZSBpdCBpcyBzb3J0ZWQgaW4gVGFibGVDcmVhdGVDb21wbGV4IGFuZCBUYWJsZUNyZWF0U2ltcGxlCiAgICBteSAkV29ya09yZGVySURzUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyU2VhcmNoKAogICAgICAgICV7ICRQYXJhbXtTZWFyY2hQYXJhbXN9IH0sCiAgICAgICAgJVNlYXJjaCwKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLAogICAgICAgIE1pcnJvckRCICAgICAgID0+IDEsCgogICAgICAgICMgVE9ETzoKICAgICAgICAjIHVzZSBzeXNjb25maWcgb3B0aW9uIGZvciAnbGltaXQnIGluc3RlYWQsIGRlY2lkZSB3aGVhdGVyIHRoaXMgb3B0aW9uIHdvdWxkIGJlIG9ubHkKICAgICAgICAjIHZhbGlkIGZvciBsaW5raW5nIHdvcmtvcmRlcnMsIG9yIGp1c3QgdXNlIGEgZ2xvYmFsIHNldHRpbmcgZm9yIGFsbCBsaW5raW5nIHN0dWZmCiAgICAgICAgTGltaXQgPT4gMjAwLAoKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVTZWFyY2hMaXN0OwogICAgV09SS09SREVSSUQ6CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHskV29ya09yZGVySURzUmVmfSApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICBteSAkV29ya09yZGVyRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICEkV29ya09yZGVyRGF0YTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEgZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgbXkgJENoYW5nZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICEkQ2hhbmdlRGF0YTsKCiAgICAgICAgIyBhZGQgdGhlIGNoYW5nZSBkYXRhIHRvIHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJURhdGEgPSAoCiAgICAgICAgICAgICV7JFdvcmtPcmRlckRhdGF9LAogICAgICAgICAgICBDaGFuZ2VEYXRhID0+ICRDaGFuZ2VEYXRhLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHdvcmtvcmRlciBkYXRhCiAgICAgICAgJFNlYXJjaExpc3R7Tk9UTElOS0VEfS0+e1NvdXJjZX0tPnskV29ya09yZGVySUR9ID0gXCVEYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1oZWFkMiBMaW5rQWRkUHJlKCkKCkxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUuCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rQWRkUG9zdCgpCgpMaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlLgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGxpbmtlZCBvYmplY3QKICAgIG15ICRJRCAgICAgPSAkUGFyYW17VGFyZ2V0S2V5fSAgICB8fCAkUGFyYW17U291cmNlS2V5fTsKICAgIG15ICRPYmplY3QgPSAkUGFyYW17VGFyZ2V0T2JqZWN0fSB8fCAkUGFyYW17U291cmNlT2JqZWN0fTsKCiAgICAjIHRyaWdnZXIgV29ya09yZGVyTGlua0FkZFBvc3QtRXZlbnQKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyTGlua0FkZFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIE9iamVjdCAgICAgID0+ICRPYmplY3QsICAgICAgICAgIyB0aGUgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rCiAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJRCwgICAgICAgICAgICAgIyBpZCBvZiB0aGUgb3RoZXIgb2JqZWN0CiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICRQYXJhbXtUeXBlfSwgICAgIyB0aGUgbGluayB0eXBlCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rRGVsZXRlUHJlKCkKCkxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUuCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBMaW5rRGVsZXRlUG9zdCgpCgpMaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZS4KCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaW5rZWQgb2JqZWN0CiAgICBteSAkSUQgICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlckxpbmtEZWxldGVQb3N0LUV2ZW50CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckxpbmtEZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBPYmplY3QgICAgICA9PiAkT2JqZWN0LCAgICAgICAgICMgdGhlIG90aGVyIG9iamVjdCBvZiB0aGUgbGluawogICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSUQsICAgICAgICAgICAgICMgaWQgb2YgdGhlIG90aGVyIG9iamVjdAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkUGFyYW17VHlwZX0sICAgICMgdGhlIGxpbmsgdHlwZQogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgY2hhbmdlIG9iamVjdAogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+IFsnSVRTTUNIYW5nZSddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNQ2hhbmdlTWFuYWdlbWVudCc7Cn0KCnN1YiBHZXRPYmplY3RCZWhhdmlvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUJlaGF2aW91cnMgPSAoCiAgICAgICAgUHJvdmlkZXNEYXNoYm9hcmRXaWRnZXQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICVCZWhhdmlvdXJzOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBsaXN0CiAgICBteSAkQ2hhbmdlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJUNoYW5nZVN0YXRlTGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JENoYW5nZVN0YXRlc307CgogICAgIyBnZXQgY2lwIGxpc3RzCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVDYXRlZ29yeUxpc3QgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyRDYXRlZ29yaWVzfTsKCiAgICBteSAkSW1wYWN0cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnSW1wYWN0JywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlSW1wYWN0TGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JEltcGFjdHN9OwoKICAgIG15ICRQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVByaW9yaXR5TGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JFByaW9yaXRpZXN9OwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUb2RheSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQgMjM6NTk6NTknICk7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDaGFuZ2UgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDaGFuZ2VTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ2hhbmdlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NhdGVnb3J5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDYXRlZ29yeUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnSW1wYWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnSW1wYWN0SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUltcGFjdExpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpbWVwZXJpb2QnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaW1lUGVyaW9kJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywgICAgIyAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBUaW1lU3RvcCAgICAgICAgID0+ICRUb2RheSwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NyZWF0ZVRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICAgICAgVGltZVN0b3AgID0+ICdDcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgc2tpcCBhbGwgZmllbGRzIG5vdCBkZXNpZ25lZCB0byBiZSBzdXBwb3J0ZWQgYnkgc3RhdGlzdGljcwogICAgICAgIG15ICRJc1N0YXRzQ29uZGl0aW9uID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1N0YXRzQ29uZGl0aW9uJywKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzU3RhdHNDb25kaXRpb247CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgIG15ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlciA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TdGF0c0ZpZWxkUGFyYW1ldGVyQnVpbGQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcikgKSB7CgogICAgICAgICAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57QmxvY2t9ID0gJ0lucHV0RmllbGQnOwogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSApICkgewogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0Jsb2NrfSA9ICdNdWx0aVNlbGVjdEZpZWxkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntCbG9ja30gZXEgJ1RpbWUnICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdCBhdHRyaWJ1dGVzIChkYXRlL3RpbWUgZmllbGRzKQogICAgICAgICAgICAgICAgbXkgJFRpbWVQZXJpb2RGb3JtYXQgPSAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntUaW1lUGVyaW9kRm9ybWF0fSB8fCAnRGF0ZUlucHV0Rm9ybWF0TG9uZyc7CgogICAgICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAkVGltZVBlcmlvZEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICRUaW1lUGVyaW9kRm9ybWF0LAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0VsZW1lbnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdfR3JlYXRlclRoYW5FcXVhbHMnLAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3RvcCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ19TbWFsbGVyVGhhbkVxdWFscycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0Jsb2NrfSBlcSAnTXVsdGlTZWxlY3RGaWVsZCcgKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgb2JqZWN0IGF0dHJpYnV0ZXMgKG11bHRpcGxlIHZhbHVlcykKICAgICAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0VsZW1lbnR9LAogICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgSXNEeW5hbWljRmllbGQgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNob3dBc1RyZWUgICAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmVlVmlld30gfHwgMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QgYXR0cmlidXRlcyAodGV4dCBmaWVsZHMpCiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudFByZXZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaW50IHJhbmQgNTA7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIGZvciBteSAkUGFyYW1ldGVyTmFtZSAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW1ldGVyTmFtZSA9fiBteyBcQSBEeW5hbWljRmllbGRfICggW2EtekEtWlxkXSsgKSAoPzogXyAoIFthLXpBLVpcZF0rICkgKT8gXHogfXhtcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRmllbGROYW1lID0gJDE7CiAgICAgICAgICAgIG15ICRPcGVyYXRvciAgPSAkMjsKCiAgICAgICAgICAgICMgbG9vcCBvdmVyIHRoZSBkeW5hbWljIGZpZWxkcyBjb25maWd1cmVkCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgIyBza2lwIGFsbCBmaWVsZHMgdGhhdCBkbyBub3QgbWF0Y2ggd2l0aCBjdXJyZW50IGZpZWxkIG5hbWUKICAgICAgICAgICAgICAgICMgd2l0aG91dCB0aGUgJ0R5bmFtaWNGaWVsZF8nIHByZWZpeAogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IG5lICRGaWVsZE5hbWU7CgogICAgICAgICAgICAgICAgIyBza2lwIGFsbCBmaWVsZHMgbm90IGRlc2lnbmVkIHRvIGJlIHN1cHBvcnRlZCBieSBzdGF0aXN0aWNzCiAgICAgICAgICAgICAgICBteSAkSXNTdGF0c0NvbmRpdGlvbiA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzU3RhdHNDb25kaXRpb24nLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzU3RhdHNDb25kaXRpb247CgogICAgICAgICAgICAgICAgIyBnZXQgbmV3IHNlYXJjaCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTdGF0c1NlYXJjaFBhcmFtZXRlciA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TdGF0c1NlYXJjaEZpZWxkUGFyYW1ldGVyQnVpbGQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXskUGFyYW1ldGVyTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbmV3IHNlYXJjaCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17IkR5bmFtaWNGaWVsZF8kRmllbGROYW1lIn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17IkR5bmFtaWNGaWVsZF8kRmllbGROYW1lIn0gPQogICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkU3RhdHNTZWFyY2hQYXJhbWV0ZXI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleHRlbmQgc2VhcmNoIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgZWxzaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkU3RhdHNTZWFyY2hQYXJhbWV0ZXIpICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFBhcmFteyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JER5bmFtaWNGaWVsZFN0YXRzU2VhcmNoUGFyYW1ldGVyfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2VhcmNoIGNoYW5nZXMKICAgIG15ICRDb3VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVNlYXJjaCgKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQ09VTlQnLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRDb3VudDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHdyYXAgaWRzIHRvIHVzZWQgc3BlbGxpbmcKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQ7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdDaGFuZ2VTdGF0ZUlEcycgKSB7CiAgICAgICAgICAgICAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoIFVzZXJJRCA9PiAxICk7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgU1RBVEU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTdGF0ZSAoIEB7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU1RBVEUgaWYgJElELT57Q29udGVudH0gbmUgJFN0YXRlLT57S2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkU3RhdGUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkRWxlbWVudE5hbWUgZXEgJ0NhdGVnb3J5SURzJyB8fCAkRWxlbWVudE5hbWUgZXEgJ0ltcGFjdElEcycKICAgICAgICAgICAgICAgIHx8ICRFbGVtZW50TmFtZSBlcSAnUHJpb3JpdHlJRHMnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICgkVHlwZSkgPSAkRWxlbWVudE5hbWUgPX4gbXsgXEEgKC4qPykgSURzIFx6IH14bXM7CgogICAgICAgICAgICAgICAgbXkgJENJUExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBFTEVNRU5UOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7JENJUExpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJElELT57Q29udGVudH0gbmUgJEVsZW1lbnQtPntLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRFbGVtZW50LT57VmFsdWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgd3JhcCB1c2VkIHNwZWxsaW5nIHRvIGlkcwogICAgZm9yIG15ICRVc2UgKHF3KFVzZUFzVmFsdWVTZXJpZXMgVXNlQXNSZXN0cmljdGlvbiBVc2VBc1h2YWx1ZSkpIHsKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7ICRQYXJhbXskVXNlfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudDsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ0NoYW5nZVN0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQ2hhbmdlU3RhdGVJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRDaGFuZ2VTdGF0ZUlEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9ydDogQ2FuJ3QgZmluZCBzdGF0ZSAkSUQtPntDb250ZW50fSEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRJRCA9IHVuZGVmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbXBvcnQgd3JhcHBlciBmb3IgQ0lQCiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJFR5cGUgLiAnSURzJyApIHsKICAgICAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENJUElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQICA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQ0lQSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENJUElEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4ndCBmaW5kICRUeXBlICRJRC0+e0NvbnRlbnR9ISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVBhcmFtOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHMucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzSW5jaWRlbnRzLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzSW5jaWRlbnRzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlR5cGUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHMnOwp9CgpzdWIgR2V0T2JqZWN0QmVoYXZpb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVCZWhhdmlvdXJzID0gKAogICAgICAgIFByb3ZpZGVzRGFzaGJvYXJkV2lkZ2V0ID0+IDEsCiAgICApOwoKICAgIHJldHVybiAlQmVoYXZpb3VyczsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IG9mIHRpY2tldCB0eXBlcwogICAgbXkgJU9iamVjdHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKICAgICRPYmplY3RzeyctMSd9ID0gJ0NoYW5nZXMnOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUb2RheSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQgMjM6NTk6NTknICk7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdPYmplY3RzJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVPYmplY3RzLAogICAgICAgICAgICBTZWxlY3RlZFZhbHVlcyAgID0+IFsga2V5cyAlT2JqZWN0cyBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaW1lcGVyaW9kJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGltZVBlcmlvZCcsCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICMgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVGltZVN0b3AgICAgICAgICA9PiAkVG9kYXksCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnRQcmV2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGludCByYW5kIDUwOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBDcmVhdGVUaW1lTmV3ZXJEYXRhIGFzIHdlIHdhbnQgdG8gZ2V0ICpBTEwqIGV4aXN0aW5nIG9iamVjdHMKICAgIGRlbGV0ZSAkUGFyYW17Q3JlYXRlVGltZU5ld2VyRGF0ZX07CgogICAgIyBmb3IgdGlja2V0cyB0aGUgc2VhcmNoIG9wdGlvbiBpcyAiVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZSIKICAgICRQYXJhbXtUaWNrZXRDcmVhdGVUaW1lT2xkZXJEYXRlfSA9ICRQYXJhbXtDcmVhdGVUaW1lT2xkZXJEYXRlfTsKCiAgICAjIGlmIHRoaXMgY2VsbCBzaG91bGQgYmUgZmlsbGVkIHdpdGggbnVtYmVyIG9mIGNoYW5nZXMKICAgIGlmICggJFBhcmFte09iamVjdH0tPlswXSA9PSAtMSApIHsKICAgICAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHRoaXMgY2VsbCBzaG91bGQgYmUgZmlsbGVkIHdpdGggbnVtYmVyIG9mIHRpY2tldHMKICAgIGVsc2UgewogICAgICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICAgICAgVHlwZUlEcyAgICA9PiBbICRQYXJhbXtPYmplY3R9LT5bMF0gXSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgRXhwb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3Qgb2YgdGlja2V0IHR5cGVzCiAgICBteSAlT2JqZWN0cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAkT2JqZWN0c3snLTEnfSA9ICdDaGFuZ2VzJzsKCiAgICAjIHdyYXAgaWRzIHRvIHVzZWQgc3BlbGxpbmcKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQ7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdPYmplY3QnICkgewoKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRPYmplY3RzeyAkSUQtPntDb250ZW50fSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3Qgb2YgdGlja2V0IHR5cGVzCiAgICBteSAlT2JqZWN0cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAkT2JqZWN0c3snLTEnfSA9ICdDaGFuZ2VzJzsKCiAgICAjIHdyYXAgdXNlZCBzcGVsbGluZyB0byBpZHMKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQ7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdPYmplY3QnICkgewogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVPYmplY3RzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRLZXkgaWYgJE9iamVjdHN7JEtleX0gZXEgJElELT57Q29udGVudH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJVBhcmFtOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNQZXJDSUNsYXNzZXMucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzUGVyQ0lDbGFzc2VzLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzUGVyQ0lDbGFzc2VzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzUGVyQ0lDbGFzc2VzJzsKfQoKc3ViIEdldE9iamVjdEJlaGF2aW91cnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQmVoYXZpb3VycyA9ICgKICAgICAgICBQcm92aWRlc0Rhc2hib2FyZFdpZGdldCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJUJlaGF2aW91cnM7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2lwIGxpc3RzCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVDYXRlZ29yeUxpc3QgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyRDYXRlZ29yaWVzfTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjNDg3MAogICAgbXkgJFRvZGF5ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCAyMzo1OTo1OScgKTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NvbmZpZ0l0ZW0gQ2xhc3NlcycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDAsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NJQ2xhc3NJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMCwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ2F0ZWdvcnlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUNhdGVnb3J5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ29uZmlnSXRlbSBTdGF0dXMnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDSVN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiAkSW5jaVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50UHJldmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpbnQgcmFuZCA1MDsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgb2JqZWN0IGlkcyBmb3IgY2hhbmdlIGFuZCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3RJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbU9iamVjdElEOwoKICAgIG15ICRDaGFuZ2VPYmplY3RJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGFuZ2VPYmplY3RJRDsKCiAgICAjIGdldCBjaGFuZ2UgaWQgYW5kIGNvbmZpZyBpdGVtIGlkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoaS5pZCBBUyBjaGFuZ2VfaWQsIGNpLmlkIEFTIGNpX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2VfaXRlbSBjaGksIGNoYW5nZV93b3Jrb3JkZXIgY2h3LCBsaW5rX3JlbGF0aW9uIGxyLCBjb25maWdpdGVtIGNpICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hpLmlkID0gY2h3LmNoYW5nZV9pZCAnCiAgICAgICAgICAgIC4gJ0FORCBjaGkuY2F0ZWdvcnlfaWQgPSA/ICcKICAgICAgICAgICAgLiAnQU5EICggJwogICAgICAgICAgICAuICcoICcKICAgICAgICAgICAgLiAnY2h3LmlkID0gbHIudGFyZ2V0X2tleSAnCiAgICAgICAgICAgIC4gJ0FORCBsci50YXJnZXRfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBsci5zb3VyY2Vfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBsci5zb3VyY2Vfa2V5ID0gY2kuaWQgJwogICAgICAgICAgICAuICdBTkQgY2kuY2xhc3NfaWQgPSA/ICcKICAgICAgICAgICAgLiAnKSAnCiAgICAgICAgICAgIC4gJ09SICcKICAgICAgICAgICAgLiAnKCAnCiAgICAgICAgICAgIC4gJ2Nody5pZCA9IGxyLnNvdXJjZV9rZXkgJwogICAgICAgICAgICAuICdBTkQgbHIuc291cmNlX29iamVjdF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbHIudGFyZ2V0X29iamVjdF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbHIudGFyZ2V0X2tleSA9IGNpLmlkICcKICAgICAgICAgICAgLiAnQU5EIGNpLmNsYXNzX2lkID0gPyAnCiAgICAgICAgICAgIC4gJykgJwogICAgICAgICAgICAuICcpJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCggJFBhcmFte0NhdGVnb3J5SURzfS0+WzBdICksCiAgICAgICAgICAgIFwkQ2hhbmdlT2JqZWN0SUQsCiAgICAgICAgICAgIFwkQ29uZmlnSXRlbU9iamVjdElELAogICAgICAgICAgICBcKCAkUGFyYW17Q0lDbGFzc0lEc30tPlswXSApLAogICAgICAgICAgICBcJENoYW5nZU9iamVjdElELAogICAgICAgICAgICBcJENvbmZpZ0l0ZW1PYmplY3RJRCwKICAgICAgICAgICAgXCggJFBhcmFte0NJQ2xhc3NJRHN9LT5bMF0gKSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZldGNoIGNoYW5nZSBhbmQgY29uZmlnIGl0ZW0gaWRzCiAgICBteSBATWF0Y2hlczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWF0Y2hlcywgXEBSb3c7CiAgICB9CgogICAgIyBjaGVjayBmb3IgZWFjaCBjaGFuZ2UgaWYgdGhlIGNvbmZpZyBpdGVtIGlzIGluIGFwcHJvcHJpYXRlIHN0YXR1cwogICAgIyBpZiBzbywgY291bnQgdGhlIGNoYW5nZQogICAgbXkgJUNoYW5nZXNBbHJlYWR5Q291bnRlZDsKICAgIE1BVENIOgogICAgZm9yIG15ICRNYXRjaCAoQE1hdGNoZXMpIHsKICAgICAgICBuZXh0IE1BVENIIGlmICRDaGFuZ2VzQWxyZWFkeUNvdW50ZWR7ICRNYXRjaC0+WzBdIH07CgogICAgICAgICMgZ2V0IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbmZpZyBpdGVtCiAgICAgICAgbmV4dCBNQVRDSCBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGluY2lfc3RhdGVfaWQgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gJwogICAgICAgICAgICAgICAgLiAnQU5EIGNyZWF0ZV90aW1lID49ID8gQU5EIGNyZWF0ZV90aW1lIDw9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwoICRNYXRjaC0+WzFdICksCiAgICAgICAgICAgICAgICBcKCAkUGFyYW17Q3JlYXRlVGltZU5ld2VyRGF0ZX0gKSwKICAgICAgICAgICAgICAgIFwoICRQYXJhbXtDcmVhdGVUaW1lT2xkZXJEYXRlfSApLAogICAgICAgICAgICBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggY3VycmVudCBpbmNpZGVudCBzdGF0ZQogICAgICAgIG15ICRJbmNpZGVudFN0YXRlSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEluY2lkZW50U3RhdGVJRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBuZXh0IE1BVENIIGlmICEkSW5jaWRlbnRTdGF0ZUlEOwoKICAgICAgICAjIGNoZWNrIGlmIHVzZXIgaGFzIHNlbGVjdGVkIHRoaXMgc3RhdGUKICAgICAgICBteSAoJEZvdW5kKSA9IGdyZXAgeyAkXyA9PSAkSW5jaWRlbnRTdGF0ZUlEIH0gQHsgJFBhcmFte0NJU3RhdGVJRHN9IH07CgogICAgICAgIG5leHQgTUFUQ0ggaWYgISRGb3VuZDsKCiAgICAgICAgJENoYW5nZXNBbHJlYWR5Q291bnRlZHsgJE1hdGNoLT5bMF0gfSsrOwogICAgfQoKICAgICMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbmdlcwogICAgbXkgJENvdW50ID0ga2V5cyAlQ2hhbmdlc0FscmVhZHlDb3VudGVkOwogICAgcmV0dXJuICRDb3VudDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyB3cmFwIGlkcyB0byB1c2VkIHNwZWxsaW5nCiAgICBmb3IgbXkgJFVzZSAocXcoVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uIFVzZUFzWHZhbHVlKSkgewogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFBhcmFteyRVc2V9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQgfHwgISRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdDSVN0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRJbmNpU3RhdGVMaXN0LT57ICRJRC0+e0NvbnRlbnR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudE5hbWUgZXEgJ0NJQ2xhc3NJRHMnICkgewogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENsYXNzTGlzdC0+eyAkSUQtPntDb250ZW50fSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnROYW1lIGVxICdDYXRlZ29yeUlEcycgKSB7CgogICAgICAgICAgICAgICAgbXkgJENJUExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgIEVMRU1FTlQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHskQ0lQTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkSUQtPntDb250ZW50fSBuZSAkRWxlbWVudC0+e0tleX07CiAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJEVsZW1lbnQtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgd3JhcCB1c2VkIHNwZWxsaW5nIHRvIGlkcwogICAgZm9yIG15ICRVc2UgKHF3KFVzZUFzVmFsdWVTZXJpZXMgVXNlQXNSZXN0cmljdGlvbiBVc2VBc1h2YWx1ZSkpIHsKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7ICRQYXJhbXskVXNlfSB9ICkgewogICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgISRFbGVtZW50IHx8ICEkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKICAgICAgICAgICAgbXkgJEVsZW1lbnROYW1lID0gJEVsZW1lbnQtPntFbGVtZW50fTsKICAgICAgICAgICAgbXkgJFZhbHVlcyAgICAgID0gJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBpZiAoICRFbGVtZW50TmFtZSBlcSAnQ0lTdGF0ZUlEcycgKSB7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEluY2lTdGF0ZUxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRJRC0+e0NvbnRlbnR9IGVxICRJbmNpU3RhdGVMaXN0LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50TmFtZSBlcSAnQ0lDbGFzc0lEcycgKSB7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkSUQtPntDb250ZW50fSBlcSAkQ2xhc3NMaXN0LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW1wb3J0IHdyYXBwZXIgZm9yIENJUAogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5KSkgewogICAgICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJFR5cGUgLiAnSURzJyApIHsKICAgICAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENJUElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQICA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQ0lQSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENJUElEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4nIGZpbmQgJFR5cGUgJElELT57Q29udGVudH0hIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRCA9IHVuZGVmOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3RvcnkucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1hbmFnZW1lbnRIaXN0b3J5LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRIaXN0b3J5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3RvcnknOwp9CgpzdWIgR2V0T2JqZWN0QmVoYXZpb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVCZWhhdmlvdXJzID0gKAogICAgICAgIFByb3ZpZGVzRGFzaGJvYXJkV2lkZ2V0ID0+IDEsCiAgICApOwoKICAgIHJldHVybiAlQmVoYXZpb3VyczsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgbGlzdAogICAgbXkgJENoYW5nZVN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVDaGFuZ2VTdGF0ZUxpc3QgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyRDaGFuZ2VTdGF0ZXN9OwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUb2RheSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQgMjM6NTk6NTknICk7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDaGFuZ2UgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdOZXdWYWx1ZXMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUNoYW5nZVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnQ2hhbmdlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50UHJldmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpbnQgcmFuZCA1MDsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZWFyY2ggaGlzdG9yeQogICAgbXkgJElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5JyktPkhpc3RvcnlTZWFyY2goCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgVHlwZSAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgIEF0dHJpYnV0ZSA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgTGltaXQgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgbXkgQENoYW5nZU51bWJlcnM7CiAgICBpZiAoICRJRHMgJiYgcmVmICRJRHMgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgSUQ6CiAgICAgICAgZm9yIG15ICRJRCAoIEB7JElEc30gKSB7CiAgICAgICAgICAgIG15ICRDaGFuZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBJRCBpZiAhJENoYW5nZTsKCiAgICAgICAgICAgIHB1c2ggQENoYW5nZU51bWJlcnMsICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAiXG4iLCBAQ2hhbmdlTnVtYmVyczsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHdyYXAgaWRzIHRvIHVzZWQgc3BlbGxpbmcKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudCB8fCAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ05ld1ZhbHVlcycgKSB7CiAgICAgICAgICAgICAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoIFVzZXJJRCA9PiAxICk7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgU1RBVEU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTdGF0ZSAoIEB7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgU1RBVEUgaWYgJElELT57Q29udGVudH0gbmUgJFN0YXRlLT57S2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkU3RhdGUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB3cmFwIHVzZWQgc3BlbGxpbmcgdG8gaWRzCiAgICBmb3IgbXkgJFVzZSAocXcoVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uIFVzZUFzWHZhbHVlKSkgewogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFBhcmFteyRVc2V9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQgfHwgISRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdOZXdWYWx1ZXMnICkgewogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRJRC0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRDaGFuZ2VTdGF0ZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENoYW5nZVN0YXRlSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4nIGZpbmQgc3RhdGUgJElELT57Q29udGVudH0hIgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkSUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3Rlci5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3Rlci5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMjoxOCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50UmZjUmVxdWVzdGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3Rlcic7Cn0KCnN1YiBHZXRPYmplY3RCZWhhdmlvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUJlaGF2aW91cnMgPSAoCiAgICAgICAgUHJvdmlkZXNEYXNoYm9hcmRXaWRnZXQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICVCZWhhdmlvdXJzOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZkNUeXBlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyk7CgogICAgIyBnZXQgYWxsIHJmY3MKICAgIG15IEBUaWNrZXRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCgKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVHlwZXMgICAgICA9PiAkUmZDVHlwZXMsCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgKTsKCiAgICAjIGdldCBhbGwgcmVxdWVzdGVyCiAgICBteSAlUmVxdWVzdGVyOwoKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG5leHQgVElDS0VUSUQgaWYgISVUaWNrZXQ7CgogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9OwoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkUmVxdWVzdGVyeyJjdXN0b21lcl8kQ3VzdG9tZXJVc2VySUQifTsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXF1ZXN0ZXJ7ImN1c3RvbWVyXyRDdXN0b21lclVzZXJJRCJ9ID0gJEN1c3RvbWVyVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJE93bmVySUQgPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkUmVxdWVzdGVyeyJhZ2VudF8kT3duZXJJRCJ9OwoKICAgICAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkT3duZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXF1ZXN0ZXJ7ImFnZW50XyRPd25lcklEIn0gPSAkVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjdXJyZW50IHRpbWUgdG8gZml4IGJ1ZyM0ODcwCiAgICBteSAkVG9kYXkgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVZLSVtLSVkIDIzOjU5OjU5JyApOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnUmVxdWVzdGVyJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZXMgICA9PiBbIGtleXMgJVJlcXVlc3RlciBdLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXF1ZXN0ZXInLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVJlcXVlc3RlciwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDAsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50UHJldmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpbnQgcmFuZCA1MDsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGF0IHR5cGUgb2YgcmVxdWVzdGVyIHdlIGhhdmUKICAgICMgdGlja2V0IHNlYXJjaCBjcml0ZXJpYSBkaWZmZXIgZm9yIGFnZW50cyBhbmQgY3VzdG9tZXJzCiAgICBteSAkVHlwZSA9ICcnOwogICAgbXkgJElEOwogICAgaWYgKCAkUGFyYW17UmVxdWVzdGVyfSAmJiAkUGFyYW17UmVxdWVzdGVyfS0+WzBdICkgewogICAgICAgICggJFR5cGUsICRJRCApID0gc3BsaXQgL18vLCAkUGFyYW17UmVxdWVzdGVyfS0+WzBdOwogICAgICAgIG15ICRLZXkgPSAkVHlwZSBlcSAnYWdlbnQnID8gJ093bmVySURzJyA6ICdDdXN0b21lclVzZXJMb2dpbic7CiAgICAgICAgJFBhcmFteyRLZXl9ID0gWyRJRF07CiAgICB9CgogICAgIyBnZXQgdGlja2V0IHR5cGVzIHRoYXQgYXJlIGhhbmRsZWQgYXMgUmZDcwogICAgbXkgJFJmQ1R5cGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICAjIHNlYXJjaCB0aWNrZXRzCiAgICBteSBAVGlja2V0SURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZWFyY2goCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBUeXBlcyAgICAgID0+ICRSZkNUeXBlcywKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgICMgaWYgdGhpcyB3YW50cyB0aGUgbnVtYmVyIG9mIFJmQ3MgZm9yIGFuIGFnZW50IHdlIGhhdmUgdG8gY2hlY2sKICAgICMgd2hldGhlciBhIGN1c3RvbWVyIGlkIGlzIGluIHRoZSB0aWNrZXQuIFRoZSBvd25lciBpcyAqTk9UKiB0aGUKICAgICMgcmVxdWVzdGVyIHRoZW4uCiAgICBpZiAoICRUeXBlIGVxICdhZ2VudCcgKSB7CiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgVElDS0VUSUQ6CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICElVGlja2V0OwogICAgICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9OwoKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJENvdW50OwogICAgfQoKICAgIHJldHVybiBzY2FsYXIgQFRpY2tldElEczsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0FjbC9SZXN0cmljdFRpY2tldFR5cGVzLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFJlc3RyaWN0VGlja2V0VHlwZXMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QWNsOjpSZXN0cmljdFRpY2tldFR5cGVzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25maWcgQWNsKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgaWQgaXMgZ2l2ZW4KICAgIHJldHVybiAxIGlmICEkUGFyYW17VXNlcklEfTsKCiAgICAjIGdldCBhbmQgY2hlY2sgdGhlIGxpc3Qgb2YgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICBteSAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICByZXR1cm4gMSBpZiAhJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlczsKICAgIHJldHVybiAxIGlmIHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWSc7CiAgICByZXR1cm4gMSBpZiAhQHskQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzfTsKCiAgICAjIGNyZWF0ZSBhIGxvb2t1cCBoYXNoIGZvciB0aGUgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICMgaWYgdGlja2V0IGlkIHdhcyBnaXZlbgogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRpY2tldCBleGlzdHMKICAgICAgICByZXR1cm4gMSBpZiAhJVRpY2tldDsKCiAgICAgICAgIyBkb24ndCByZW1vdmUgcmVsZXZhbnQgdHlwZXMgZnJvbSB0eXBlIGxpc3QKICAgICAgICAjIGlmIHRoZSB0aWNrZXQgdHlwZSBpcyBhbHJlYWR5IG9uZSBvZiB0aGVzZSB0eXBlcwogICAgICAgIHJldHVybiAxIGlmICRJc1JlbGV2YW50eyAkVGlja2V0e1R5cGV9IH07CiAgICB9CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgcncgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYW5kIGNoZWNrIHRoZSBsaXN0IG9mIGdyb3VwcyB3aG8gYXJlIGFsbG93ZWQgdG8gdXNlIHRoZSBBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMKICAgIG15ICRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJVFNNQ2hhbmdlOjpSZXN0cmljdFRpY2tldFR5cGVzOjpHcm91cHMnKTsKCiAgICByZXR1cm4gMSBpZiAhJFJlc3RyaWN0VGlja2V0VHlwZXNHcm91cHM7CiAgICByZXR1cm4gMSBpZiByZWYgJFJlc3RyaWN0VGlja2V0VHlwZXNHcm91cHMgbmUgJ0FSUkFZJzsKICAgIHJldHVybiAxIGlmICFAeyRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzfTsKCiAgICAjIGNoZWNrIGlmIHRoZSB1c2VyIGlzIGluIG9uZSBvZiB0aGVzZSBncm91cHMKICAgIGZvciBteSAkR3JvdXAgKCBAeyRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIGdyb3VwIGlkCiAgICAgICAgbXkgJEdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRHcm91cCwKICAgICAgICApOwoKICAgICAgICAjIGRvIG5vdCByZW1vdmUgdGhlIHRpY2tldCB0eXBlICdSZkMnIGlmIHVzZXIgaXMgaW4gb25lIG9mIHRoZSBncm91cHMKICAgICAgICByZXR1cm4gMSBpZiAkR3JvdXBzeyRHcm91cElEfTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIGFjbAogICAgJFBhcmFte0FjbH0tPntSZXN0cmljdFRpY2tldFR5cGVzfSA9IHsKCiAgICAgICAgIyByZW1vdmUgdGlja2V0IHR5cGVzIGxpc3RlZCBpbiBzeXNjb25maWcgb3B0aW9uICdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnCiAgICAgICAgIyBmcm9tIHR5cGUgZHJvcGRvd24gbGlzdCBpbiBhbGwgZnJvbnRlbmQgbW9kdWxlcwogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlcywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ29uc29sZS9Db21tYW5kL0FkbWluL0lUU00vQ2hhbmdlL0RlbGV0ZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBEZWxldGUucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTI6MTggdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpDaGFuZ2U6OkRlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ0RlbGV0ZSBjaGFuZ2VzICAoYWxsIG9yIGJ5IG51bWJlcikuJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdhbGwnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJEZWxldGUgYWxsIGNoYW5nZXMuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwogICAgJFNlbGYtPkFkZEFyZ3VtZW50KAogICAgICAgIE5hbWUgICAgICAgID0+ICdhY2NlcHQnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJBY2NlcHQgZGVsZXRlIGFsbCBvciBjYW5jZWwuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLyh5fG4pL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdjaGFuZ2UtbnVtYmVyJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiRGVsZXRlIGxpc3RlZCBjaGFuZ2VzLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL1xkKy9zbXgsCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQENoYW5nZU51bWJlcnMgPSBAeyAkU2VsZi0+R2V0T3B0aW9uKCdjaGFuZ2UtbnVtYmVyJykgLy8gW10gfTsKCiAgICBpZiAoICEkU2VsZi0+R2V0T3B0aW9uKCdhbGwnKSAmJiAhQENoYW5nZU51bWJlcnMgKSB7CiAgICAgICAgZGllICJQbGVhc2UgcHJvdmlkZSBvcHRpb24gLS1hbGwgb3IgLS1jaGFuZ2UtbnVtYmVyLiBGb3IgbW9yZSBkZXRhaWxzIHVzZSAtLWhlbHBcbiI7CiAgICB9CgogICAgcmV0dXJuOwoKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5EZWxldGluZyBjaGFuZ2VzLi4uPC95ZWxsb3c+XG4iKTsKCiAgICAkU2VsZi0+UHJpbnQoICI8Z3JlZW4+IiAuICggJz0nIHggNjkgKSAuICI8L2dyZWVuPlxuIiApOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgZ2V0IGNoYW5nZSBudW1iZXJzCiAgICBteSBAQ2hhbmdlTnVtYmVycyA9IEB7ICRTZWxmLT5HZXRPcHRpb24oJ2NoYW5nZS1udW1iZXInKSAvLyBbXSB9OwoKICAgICMgZGVsZXRlIGFsbCBjaGFuZ2VzCiAgICBpZiAoICRTZWxmLT5HZXRPcHRpb24oJ2FsbCcpICkgewoKICAgICAgICAjIGdldCBhbGwgY2hhbmdlIGlkcwogICAgICAgIG15IEBDaGFuZ2VzSURzID0gQHsgJENoYW5nZU9iamVjdC0+Q2hhbmdlTGlzdCggVXNlcklEID0+IDEgKSB9OwoKICAgICAgICAjIGdldCBudW1iZXIgb2YgY2hhbmdlcwogICAgICAgIG15ICRDaGFuZ2VDb3VudCA9IHNjYWxhciBAQ2hhbmdlc0lEczsKCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgdG8gZGVsZXRlCiAgICAgICAgaWYgKCRDaGFuZ2VDb3VudCkgewoKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSBBTEwgJENoYW5nZUNvdW50IGNoYW5nZXM/PC95ZWxsb3c+XG4iKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PlRoaXMgaXMgaXJyZXZvY2FibGUuIFt5L25dIDwveWVsbG93PlxuIik7CiAgICAgICAgICAgIG15ICRDb25maXJtYXRpb24gPSAkU2VsZi0+R2V0QXJndW1lbnQoJ2FjY2VwdCcpOwogICAgICAgICAgICBjaG9tcCggJENvbmZpcm1hdGlvbiA9IGxjIDxTVERJTj4gKSBpZiAhZGVmaW5lZCAkQ29uZmlybWF0aW9uOwoKICAgICAgICAgICAgIyBpZiB0aGUgdXNlciBjb25maXJtcyB0aGUgZGVsZXRpb24KICAgICAgICAgICAgaWYgKCAkQ29uZmlybWF0aW9uIGVxICd5JyApIHsKCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+RGVsZXRpbmcgYWxsIGNoYW5nZXMuLi48L3llbGxvdz5cbiIpOwogICAgICAgICAgICAgICAgJFNlbGYtPkRlbGV0ZUNoYW5nZXMoIENoYW5nZXNJRHMgPT4gXEBDaGFuZ2VzSURzICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Q29tbWFuZCBkZWxldGUgd2FzIGNhbmNlbGVkITwveWVsbG93PlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PlRoZXJlIGFyZSBOTyBjaGFuZ2VzIHRvIGRlbGV0ZS48L3llbGxvdz5cbiIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBsaXN0ZWQgY2hhbmdlcwogICAgZWxzaWYgKEBDaGFuZ2VOdW1iZXJzKSB7CgogICAgICAgIG15IEBDaGFuZ2VzSURzOwoKICAgICAgICBmb3IgbXkgJENoYW5nZU51bWJlciAoQENoYW5nZU51bWJlcnMpIHsKCiAgICAgICAgICAgICMgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgY2hhbmdlIGlkCiAgICAgICAgICAgIG15ICRJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUxvb2t1cCgKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkQ2hhbmdlTnVtYmVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJRCkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2hhbmdlc0lEcywgJElEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIlVuYWJsZSB0byBmaW5kIGNoYW5nZSAkQ2hhbmdlTnVtYmVyLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjaGFuZ2VzIChpZiBhbnkgdmFsaWQgbnVtYmVyIHdhcyBnaXZlbikKICAgICAgICBpZiAoQENoYW5nZXNJRHMpIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkRlbGV0aW5nIHNwZWNpZmllZCBjaGFuZ2VzLi4uPC95ZWxsb3c+XG4iKTsKICAgICAgICAgICAgJFNlbGYtPkRlbGV0ZUNoYW5nZXMoIENoYW5nZXNJRHMgPT4gXEBDaGFuZ2VzSURzICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIk5vIGNoYW5nZSBmb3IgZGVsZXRlLiIpOwogICAgfQoKICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnPScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgpzdWIgRGVsZXRlQ2hhbmdlcyB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGVsZXRlZENoYW5nZXMgPSAwOwoKICAgICMgZGVsZXRlIHNwZWNpZmllZCBjaGFuZ2VzCiAgICBmb3IgbXkgJENoYW5nZUlEICggQHsgJFBhcmFte0NoYW5nZXNJRHN9IH0gKSB7CiAgICAgICAgbXkgJFRydWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpLT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggISRUcnVlICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVW5hYmxlIHRvIGRlbGV0ZSBjaGFuZ2Ugd2l0aCBpZCAkQ2hhbmdlSURcbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERlbGV0ZWRDaGFuZ2VzKys7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRlbGV0ZWQgJERlbGV0ZWRDaGFuZ2VzIGNoYW5nZShzKS48L2dyZWVuPlxuXG4iKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ29uc29sZS9Db21tYW5kL0FkbWluL0lUU00vQ2hhbmdlL0NoZWNrLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENoZWNrLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEyOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6Q2hhbmdlOjpDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoCiAgICBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQKICAgIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBJRCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeScsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdDaGVjayBpZiBJVFNNIGNoYW5nZXMgaGF2ZSByZWFjaGVkIHNwZWNpZmljIHRpbWVzLicpOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnZm9yY2UtcGlkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU3RhcnQgZXZlbiBpZiBhbm90aGVyIHByb2Nlc3MgaXMgc3RpbGwgcmVnaXN0ZXJlZCBpbiB0aGUgZGF0YWJhc2UuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IFBJRCBvYmplY3QKICAgIG15ICRQSURPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UElEJyk7CgogICAgIyBjcmVhdGUgUElEIGxvY2sKICAgIG15ICRQSURDcmVhdGVkID0gJFBJRE9iamVjdC0+UElEQ3JlYXRlKAogICAgICAgIE5hbWUgID0+ICRTZWxmLT5OYW1lKCksCiAgICAgICAgRm9yY2UgPT4gJFNlbGYtPkdldE9wdGlvbignZm9yY2UtcGlkJyksCiAgICAgICAgVFRMICAgPT4gNjAgKiA2MCAqIDIsCiAgICApOwogICAgaWYgKCAhJFBJRENyZWF0ZWQgKSB7CiAgICAgICAgbXkgJEVycm9yID0gIlVuYWJsZSB0byByZWdpc3RlciB0aGUgcHJvY2VzcyBpbiB0aGUgZGF0YWJhc2UuIElzIGFub3RoZXIgaW5zdGFuY2Ugc3RpbGwgcnVubmluZz9cbiI7CiAgICAgICAgJEVycm9yIC49ICJZb3UgY2FuIHVzZSAtLWZvcmNlLXBpZCB0byBvdmVycmlkZSB0aGlzIGNoZWNrLlxuIjsKICAgICAgICBkaWUgJEVycm9yOwogICAgfQoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0lUU01DaGFuZ2VDcm9uam9iOjpFdmVudE1vZHVsZScsCiAgICApOwoKICAgICMgZ2V0IHRpbWUgb2JqZWN0CiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAkU2VsZi0+e1N5c3RlbVRpbWV9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CiAgICAkU2VsZi0+e05vd30gICAgICAgID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5DaGVja2luZyBJVFNNIGNoYW5nZXMuLi48L3llbGxvdz5cbiIpOwoKICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICMgbm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcycgcGxhbm5lZFhYWHRpbWUgZXZlbnRzCiAgICBmb3IgbXkgJFR5cGUgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewoKICAgICAgICAjIGdldCBjaGFuZ2VzIHdpdGggUGxhbm5lZFN0YXJ0VGltZSBvbGRlciB0aGFuIG5vdwogICAgICAgIG15ICRQbGFubmVkQ2hhbmdlSURzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAiUGxhbm5lZCR7VHlwZX1PbGRlckRhdGUiID0+ICRTZWxmLT57Tm93fSwKICAgICAgICAgICAgTWlycm9yREIgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgQ0hBTkdFSUQ6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoIEB7JFBsYW5uZWRDaGFuZ2VJRHN9ICkgewoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICAgICAgbXkgJENoYW5nZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgY2hhbmdlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0dWFsWFhYdGltZSBzZXQgb3Igbm90aWZpY2F0aW9uIHdhcyBzZW50CiAgICAgICAgICAgIG5leHQgQ0hBTkdFSUQgaWYgJENoYW5nZS0+eyJBY3R1YWwkVHlwZSJ9OwoKICAgICAgICAgICAgbXkgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSA9ICRTZWxmLT5DaGFuZ2VOb3RpZmljYXRpb25TZW50KAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlBsYW5uZWQke1R5cGV9IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBbHJlYWR5U2VudFdpdGhpblBlcmlvZCA9ICRTZWxmLT5TZW50V2l0aGluUGVyaW9kKAogICAgICAgICAgICAgICAgTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0+ICRMYXN0Tm90aWZpY2F0aW9uU2VudERhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENIQU5HRUlEIGlmICRBbHJlYWR5U2VudFdpdGhpblBlcmlvZDsKCiAgICAgICAgICAgICMgdHJpZ2dlciBDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3QtRXZlbnQKICAgICAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgICAgIEV2ZW50ID0+ICJDaGFuZ2VQbGFubmVkJHtUeXBlfVJlYWNoZWRQb3N0IiwKICAgICAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjaGFuZ2VzIHdpdGggYWN0dWFseHh4dGltZQogICAgICAgIG15ICRBY3R1YWxDaGFuZ2VJRHMgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICJBY3R1YWwke1R5cGV9T2xkZXJEYXRlIiA9PiAkU2VsZi0+e05vd30sCiAgICAgICAgICAgIE1pcnJvckRCICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApIHx8IFtdOwoKICAgICAgICBBQ1RVQUxDSEFOR0VJRDoKICAgICAgICBmb3IgbXkgJENoYW5nZUlEICggQHskQWN0dWFsQ2hhbmdlSURzfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSA9ICRTZWxmLT5DaGFuZ2VOb3RpZmljYXRpb25TZW50KAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFjdHVhbCR7VHlwZX0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBBQ1RVQUxDSEFOR0VJRCBpZiAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlOwoKICAgICAgICAgICAgIyB0cmlnZ2VyIEV2ZW50CiAgICAgICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgICAgICBFdmVudCA9PiAiQ2hhbmdlQWN0dWFsJHtUeXBlfVJlYWNoZWRQb3N0IiwKICAgICAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZXMgd2l0aCBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlCiAgICBteSAkUmVxdWVzdGVkVGltZUNoYW5nZUlEcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlID0+ICRTZWxmLT57Tm93fSwKICAgICAgICBNaXJyb3JEQiAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgKSB8fCBbXTsKCiAgICBDSEFOR0VJRDoKICAgIGZvciBteSAkQ2hhbmdlSUQgKCBAeyRSZXF1ZXN0ZWRUaW1lQ2hhbmdlSURzfSApIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSA9ICRTZWxmLT5DaGFuZ2VOb3RpZmljYXRpb25TZW50KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICJSZXF1ZXN0ZWRUaW1lIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IENIQU5HRUlEIGlmICRMYXN0Tm90aWZpY2F0aW9uU2VudERhdGU7CgogICAgICAgICMgdHJpZ2dlciBFdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICJDaGFuZ2VSZXF1ZXN0ZWRUaW1lUmVhY2hlZFBvc3QiLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBub3RpZmljYXRpb25zIGZvciB3b3Jrb3JkZXJzJyBwbGFubmVkWFhYdGltZSBldmVudHMKICAgIGZvciBteSAkVHlwZSAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CgogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGdldCB3b3Jrb3JkZXJzIHdpdGggUGxhbm5lZFN0YXJ0VGltZSBvbGRlciB0aGFuIG5vdwogICAgICAgIG15ICRQbGFubmVkV29ya09yZGVySURzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU2VhcmNoKAogICAgICAgICAgICAiUGxhbm5lZCR7VHlwZX1PbGRlckRhdGUiID0+ICRTZWxmLT57Tm93fSwKICAgICAgICAgICAgTWlycm9yREIgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgV09SS09SREVSSUQ6CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFBsYW5uZWRXb3JrT3JkZXJJRHN9ICkgewoKICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgd29ya29yZGVyIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0dWFsWFhYdGltZSBzZXQgb3Igbm90aWZpY2F0aW9uIHdhcyBzZW50CiAgICAgICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgJFdvcmtPcmRlci0+eyJBY3R1YWwkVHlwZSJ9OwoKICAgICAgICAgICAgbXkgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSA9ICRTZWxmLT5Xb3JrT3JkZXJOb3RpZmljYXRpb25TZW50KAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gIlBsYW5uZWQke1R5cGV9IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBbHJlYWR5U2VudFdpdGhpblBlcmlvZCA9ICRTZWxmLT5TZW50V2l0aGluUGVyaW9kKAogICAgICAgICAgICAgICAgTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0+ICRMYXN0Tm90aWZpY2F0aW9uU2VudERhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICRBbHJlYWR5U2VudFdpdGhpblBlcmlvZDsKCiAgICAgICAgICAgICMgdHJpZ2dlciBXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3QtRXZlbnQKICAgICAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgICAgIEV2ZW50ID0+ICJXb3JrT3JkZXJQbGFubmVkJHtUeXBlfVJlYWNoZWRQb3N0IiwKICAgICAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmtvcmRlcnMgd2l0aCBhY3R1YWx4eHh0aW1lCiAgICAgICAgbXkgJEFjdHVhbFdvcmtPcmRlcklEcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgIkFjdHVhbCR7VHlwZX1PbGRlckRhdGUiID0+ICRTZWxmLT57Tm93fSwKICAgICAgICAgICAgTWlycm9yREIgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICkgfHwgW107CgogICAgICAgIFdPUktPUkRFUklEOgogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyRBY3R1YWxXb3JrT3JkZXJJRHN9ICkgewoKICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gJFNlbGYtPldvcmtPcmRlck5vdGlmaWNhdGlvblNlbnQoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAiQWN0dWFsJHtUeXBlfSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICRMYXN0Tm90aWZpY2F0aW9uU2VudERhdGU7CgogICAgICAgICAgICAjIHRyaWdnZXIgRXZlbnQKICAgICAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgICAgIEV2ZW50ID0+ICJXb3JrT3JkZXJBY3R1YWwke1R5cGV9UmVhY2hlZFBvc3QiLAogICAgICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwoKfQoKIyBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBzZW50IGZvciB0aGUgZ2l2ZW4gY2hhbmdlCnN1YiBDaGFuZ2VOb3RpZmljYXRpb25TZW50IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hhbmdlSUQgVHlwZSkpIHsKICAgICAgICByZXR1cm4gaWYgISRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IGVudHJpZXMKICAgIG15ICRIaXN0b3J5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+Q2hhbmdlSGlzdG9yeUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgc2VhcmNoIGZvciBub3RpZmljYXRpb25zIHNlbnQgZWFybGllcgogICAgZm9yIG15ICRIaXN0b3J5RW50cnkgKCByZXZlcnNlIEB7JEhpc3Rvcnl9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfSBlcSAnQ2hhbmdlJyAuICRQYXJhbXtUeXBlfSAuICdSZWFjaGVkJwogICAgICAgICAgICAmJiAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gPX4gbXsgTm90aWZpY2F0aW9uIFxzIFNlbnQgJCB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkSGlzdG9yeUVudHJ5LT57Q3JlYXRlVGltZX07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKIyBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBzZW50IGZvciB0aGUgZ2l2ZW4gd29ya29yZGVyCnN1YiBXb3JrT3JkZXJOb3RpZmljYXRpb25TZW50IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoV29ya09yZGVySUQgVHlwZSkpIHsKICAgICAgICByZXR1cm4gaWYgISRQYXJhbXskTmVlZGVkfTsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IGVudHJpZXMKICAgIG15ICRIaXN0b3J5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+V29ya09yZGVySGlzdG9yeUdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgc2VhcmNoIGZvciBub3RpZmljYXRpb25zIHNlbnQgZWFybGllcgogICAgZm9yIG15ICRIaXN0b3J5RW50cnkgKCByZXZlcnNlIEB7JEhpc3Rvcnl9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfSBlcSAnV29ya09yZGVyJyAuICRQYXJhbXtUeXBlfSAuICdSZWFjaGVkJwogICAgICAgICAgICAmJiAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gPX4gbXsgTm90aWZpY2F0aW9uIFxzIFNlbnQgfXhtcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJEhpc3RvcnlFbnRyeS0+e0NyZWF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCnN1YiBTZW50V2l0aGluUGVyaW9kIHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte0xhc3ROb3RpZmljYXRpb25TZW50RGF0ZX07CgogICAgIyBnZXQgU3lzQ29uZmlnIG9wdGlvbgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSVRTTUNoYW5nZTo6VGltZVJlYWNoZWROb3RpZmljYXRpb25zJyk7CgogICAgIyBpZiBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50IG9ubHkgb25jZQogICAgcmV0dXJuIDEgaWYgJENvbmZpZy0+e0ZyZXF1ZW5jeX0gZXEgJ29uY2UnOwoKICAgICMgZ2V0IGVwb2NoZSBzZWNvbmRzIG9mIHNlbmQgdGltZQogICAgbXkgJFNlbnRFcG9jaGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17TGFzdE5vdGlmaWNhdGlvblNlbnREYXRlfSwKICAgICAgICAgICAgfQogICAgKS0+VG9FcG9jaCgpOwoKICAgICMgY2FsYyBkaWZmCiAgICBteSAkRXBvY2hlU2luY2VTZW50ID0gJFNlbGYtPntTeXN0ZW1UaW1lfSAtICRTZW50RXBvY2hlOwogICAgbXkgJEhvdXJzU2luY2VTZW50ID0gaW50KCAkRXBvY2hlU2luY2VTZW50IC8gKCA2MCAqIDYwICkgKTsKCiAgICBpZiAoICRIb3Vyc1NpbmNlU2VudCA+PSAkQ29uZmlnLT57SG91cnN9ICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFBvc3RSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBwaWQgbG9jawogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBJRCcpLT5QSUREZWxldGUoIE5hbWUgPT4gJFNlbGYtPk5hbWUoKSApOwoKICAgIHJldHVybjsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUmVxdWVzdC5wbSAtIGFsbCBzZXJ2aWNlIGZ1bmN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBSZXF1ZXN0LnBtLHYgMS45IDIwMTkvMDYvMjggMDk6MTY6MTIgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlJlcXVlc3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0IC0gUmVxdWVzdCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIFJlcXVlc3QgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkUmVxdWVzdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZXF1ZXN0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUmVxdWVzdExpc3QoKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIFJlcXVlc3QKCiAgICBteSAlUmVxdWVzdExpc3QgPSAkUmVxdWVzdE9iamVjdC0+UmVxdWVzdExpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBSZXF1ZXN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAwOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lIEZST00gcmVxdWVzdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSByZXF1ZXN0IFdIRVJFIHZhbGlkX2lkIElOICIKICAgICAgICAgICAgICAgIC4gIiggJHtcKGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkpfSApIiwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVJlcXVlc3RMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlcXVlc3RMaXN0eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiAlUmVxdWVzdExpc3Q7Cn0KCj1pdGVtIFJlcXVlc3RHZXQoKQoKZ2V0IFJlcXVlc3QgYXR0cmlidXRlcwoKICAgIG15ICVSZXF1ZXN0ID0gJFJlcXVlc3RPYmplY3QtPlJlcXVlc3RHZXQoCiAgICAgICAgUmVxdWVzdElEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUmVxdWVzdEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17UmVxdWVzdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJykKICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgUmVxdWVzdElEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHNxbAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgaWQsIG5hbWUsIHN1YmplY3QsIHN1YmplY3RfY2hhbmdlYWJsZSwgY29tbWVudCwgcXVldWVfaWQsIHRpY2tldF9vd25lciwgdGlja2V0X3Jlc3BvbnNpYmxlLCB0ZW1wbGF0ZV9pZCwgdmFsaWRfaWQsIGltYWdlX2lkLCBzaG93X2NvbmZpZ2l0ZW0sIHNob3dfY29uZmlnaXRlbXMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksIHR5cGVfaWQsIHNob3dfYXR0YWNobWVudCwgcmVxdWVzdF9ncm91cCAnCiAgICAgICAgICAgIC4gJ0ZST00gcmVxdWVzdCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1JlcXVlc3RJRH0gXSwKICAgICk7CiAgICBteSAlUmVxdWVzdDsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlUmVxdWVzdCA9ICgKICAgICAgICAgICAgUmVxdWVzdElEICAgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICA9PiAkRGF0YVsyXSwKICAgICAgICAgICAgU3ViamVjdENoYW5nZWFibGUgPT4gJERhdGFbM10sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgID0+ICREYXRhWzRdLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgICAgICA9PiAkRGF0YVs1XSwKICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgPT4gJERhdGFbNl0sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgICAgID0+ICREYXRhWzddLAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgICAgICA9PiAkRGF0YVs4XSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gJERhdGFbOV0sCiAgICAgICAgICAgIEltYWdlSUQgICAgICAgICAgID0+ICREYXRhWzEwXSwKICAgICAgICAgICAgU2hvd0NvbmZpZ0l0ZW0gICAgPT4gJERhdGFbMTFdLAogICAgICAgICAgICBTaG93Q29uZmlnSXRlbXMgICA9PiAkRGF0YVsxMl0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICREYXRhWzEzXSwKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgPT4gJERhdGFbMTRdLAogICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAkRGF0YVsxNV0sCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgID0+ICREYXRhWzE2XSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJERhdGFbMTddLAogICAgICAgICAgICBTaG93QXR0YWNobWVudCAgICA9PiAkRGF0YVsxOF0sCiAgICAgICAgICAgIFJlcXVlc3RHcm91cCAgICAgID0+ICREYXRhWzE5XSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdAogICAgcmV0dXJuICVSZXF1ZXN0Owp9Cgo9aXRlbSBSZXF1ZXN0VXBkYXRlKCkKCnVwZGF0ZSBhIFJlcXVlc3QKCiAgICBteSAkUmVxdWVzdElEID0gJFJlcXVlc3RPYmplY3QtPlJlcXVlc3RVcGRhdGUoCiAgICAgICAgUmVxdWVzdElEICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdSZXF1ZXN0JywKICAgICAgICBTdWJqZWN0ICAgICAgICAgICA9PiAnU3ViamVjdCcKICAgICAgICBTdWJqZWN0Q2hhbmdlYWJsZSA9PiAxLAogICAgICAgIFF1ZXVlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBPd25lcklEICAgICAgICAgICA9PiAxLAogICAgICAgIFJlc3BvbnNpYmxlSUQgICAgID0+IDEsCiAgICAgICAgVGVtcGxhdGVJRCAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZElEICAgICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgICAgID0+IFJlcXVlc3QsCiAgICAgICAgSW1hZ2VJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBTaG93Q29uZmlnSXRlbSAgICA9PiAyLAogICAgICAgIFNob3dDb25maWdJdGVtcyAgID0+IDIsMyw0CiAgICAgICAgQ29tbWVudCAgICAgICAgICAgPT4gUmVxdWVzdCwKICAgICAgICBTaG93QXR0YWNobWVudCAgICA9PiAxLAogICAgICAgIFJlcXVlc3RHcm91cCAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMTIzLAoKICAgICk7Cgo9Y3V0CgpzdWIgUmVxdWVzdFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhSZXF1ZXN0SUQgTmFtZSBTdWJqZWN0IFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgdXBkYXRlIENoYW5nZUNhdGVnb3JpZXMKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1VQREFURSByZXF1ZXN0IFNFVCBuYW1lID0gPywgc3ViamVjdCA9ID8sIHN1YmplY3RfY2hhbmdlYWJsZSA9ID8sIGNvbW1lbnQgPSA/LCAnCiAgICAgICAgICAgIC4gJ3RpY2tldF9vd25lciA9ID8sIHRpY2tldF9yZXNwb25zaWJsZSA9ID8sICBzaG93X2F0dGFjaG1lbnQgPSA/LCBxdWV1ZV9pZCA9ID8sIHR5cGVfaWQgPSA/LCB0ZW1wbGF0ZV9pZCA9ID8sIGltYWdlX2lkID0gPywgc2hvd19jb25maWdpdGVtID0gPywgcmVxdWVzdF9ncm91cCA9ID8sIHNob3dfY29uZmlnaXRlbXMgPSA/LCB2YWxpZF9pZCA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtTdWJqZWN0fSwgXCRQYXJhbXtTdWJqZWN0Q2hhbmdlYWJsZX0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17T3duZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17UmVzcG9uc2libGVJRH0sIFwkUGFyYW17U2hvd0F0dGFjaG1lbnR9LCBcJFBhcmFte1F1ZXVlfSwgXCRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCRQYXJhbXtJbWFnZUlEfSwgXCRQYXJhbXtTaG93Q29uZmlnSXRlbX0sIFwkUGFyYW17UmVxdWVzdEdyb3VwfSwKICAgICAgICAgICAgXCRQYXJhbXtTaG93Q29uZmlnSXRlbXN9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17UmVxdWVzdElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gUmVxdWVzdEFkZCgpCgphZGQgYSBSZXF1ZXN0CgogICAgbXkgJFJlcXVlc3RJRCA9ICRSZXF1ZXN0T2JqZWN0LT5SZXF1ZXN0QWRkKAogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdSZXF1ZXN0JywKICAgICAgICBTdWJqZWN0ICAgICAgICAgICA9PiAnU3ViamVjdCcKICAgICAgICBTdWJqZWN0Q2hhbmdlYWJsZSA9PiAxLAogICAgICAgIFF1ZXVlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBPd25lcklEICAgICAgICAgICA9PiAxLAogICAgICAgIFJlc3BvbnNpYmxlSUQgICAgID0+IDEsCiAgICAgICAgVGVtcGxhdGVJRCAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZElEICAgICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgICAgID0+IFJlcXVlc3QsCiAgICAgICAgSW1hZ2VJRCAgICAgICAgICAgPT4gMSwKICAgICAgICBTaG93Q29uZmlnSXRlbSAgICA9PiAyLAogICAgICAgIFNob3dDb25maWdJdGVtcyAgID0+IDIsMyw0CiAgICAgICAgU2hvd0F0dGFjaG1lbnQgICAgPT4gMSwKICAgICAgICBSZXF1ZXN0R3JvdXAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUmVxdWVzdEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFN1YmplY3QgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBmaW5kIGV4aXN0aW5nIHNlcnZpY2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gcmVxdWVzdCBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRXhpc3RzID0gMTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIHRvIGRhdGFiYXNlCiAgICBpZiAoJEV4aXN0cykgewogICAgICAgIHJldHVybiAnRXhpc3RzJzsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyByZXF1ZXN0ICcKICAgICAgICAgICAgLiAnKG5hbWUsIHN1YmplY3QsIHN1YmplY3RfY2hhbmdlYWJsZSwgY29tbWVudCwgcXVldWVfaWQsIHR5cGVfaWQsIGltYWdlX2lkLCBzaG93X2F0dGFjaG1lbnQsIHNob3dfY29uZmlnaXRlbSwgdGVtcGxhdGVfaWQsIHJlcXVlc3RfZ3JvdXAsIHNob3dfY29uZmlnaXRlbXMsIHRpY2tldF9vd25lciwgdGlja2V0X3Jlc3BvbnNpYmxlLCAnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17U3ViamVjdH0sIFwkUGFyYW17U3ViamVjdENoYW5nZWFibGV9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1F1ZXVlfSwgICAgICBcJFBhcmFte1R5cGV9LAogICAgICAgICAgICBcJFBhcmFte0ltYWdlSUR9LCAgICBcJFBhcmFte1Nob3dBdHRhY2htZW50fSwgXCRQYXJhbXtTaG93Q29uZmlnSXRlbX0sCiAgICAgICAgICAgIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUGFyYW17UmVxdWVzdEdyb3VwfSwgXCRQYXJhbXtTaG93Q29uZmlnSXRlbXN9LAogICAgICAgICAgICBcJFBhcmFte093bmVySUR9LCAgICBcJFBhcmFte1Jlc3BvbnNpYmxlSUR9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBSZXF1ZXN0IGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHJlcXVlc3QgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgbXkgJFJlcXVlc3RJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZXF1ZXN0SUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUmVxdWVzdElEOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgTGlzdDo6VXRpbCBxdyhtYXgpOwoKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpUZXN0U3VicykKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICRUZXN0Q291bnQgPSAxOwoKIyBjcmVhdGUgY29tbW9uIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJEN1c3RvbWVyVXNlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwpteSAkVmFsaWRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDSVBBbGxvY2F0ZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnKTsKbXkgJEhpc3RvcnlPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKTsKbXkgJENhY2hlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7Cm15ICRMb2dPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKbXkgJERCT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7Cm15ICRXb3JrT3JkZXJPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7Cm15ICRDaGFuZ2VPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7Cm15ICRIZWxwZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIHRlc3QgaWYgY2hhbmdlIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkQ2hhbmdlT2JqZWN0LAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2YgY2hhbmdlIG9iamVjdCcsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkQ2hhbmdlT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAnIC0gY2xhc3Mgb2YgY2hhbmdlIG9iamVjdCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY3JlYXRlIG5lZWRlZCB1c2VycyBhbmQgY3VzdG9tZXIgdXNlcnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpteSBAVXNlcklEczsgICAgICAgICAgICAgICAjIGEgbGlzdCBvZiBleGlzdGluZyBhbmQgdmFsaWQgdXNlciBpZHMKbXkgQEludmFsaWRVc2VySURzOyAgICAgICAgIyBhIGxpc3Qgb2YgZXhpc3RpbmcgYnV0IGludmFsaWQgdXNlciBpZHMKbXkgQE5vbkV4aXN0aW5nVXNlcklEczsgICAgIyBhIGxpc3Qgb2Ygbm9uLWV4aXN0aW9uIHVzZXIgaWRzCm15IEBDdXN0b21lclVzZXJJRHM7ICAgICAgICMgYSBsaXN0IG9mIGV4aXN0aW5nIGFuZCB2YWxpZCBjdXN0b21lciB1c2VyIGlkcywgYSBsaXN0IG9mIHN0cmluZ3MKCiMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCm15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyQWRkKAogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0lUU01DaGFuZ2UnIC4gJENvdW50ZXIsCiAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUlUU01DaGFuZ2UtJyAuICRDb3VudGVyIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tTnVtYmVyKCksCiAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgKTsKICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CgogICAgIyBjcmVhdGUgbmV3IGN1c3RvbWVycyBmb3IgdGhlIHRlc3RzCiAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJ0lUU01DaGFuZ2VDdXN0b21lcicgLiAkQ291bnRlciwKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnVW5pdFRlc3RDdXN0b21lcicsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJ1VDVCcgLiAkQ291bnRlciAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpLAogICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICdVbml0VGVzdC1JVFNNQ2hhbmdlLUN1c3RvbWVyLScgLiAkQ291bnRlciAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpLAogICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICdVbml0VGVzdC1JVFNNQ2hhbmdlLUN1c3RvbWVyLScKICAgICAgICAgICAgLiAkQ291bnRlcgogICAgICAgICAgICAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpCiAgICAgICAgICAgIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CiAgICBwdXNoIEBDdXN0b21lclVzZXJJRHMsICRDdXN0b21lclVzZXJJRDsKfQoKIyBzb3J0IHRoZSB1c2VyIGFuZCBjdXN0b21lciB1c2VyIGFycmF5cwpAVXNlcklEcyAgICAgICAgID0gc29ydCBAVXNlcklEczsKQEN1c3RvbWVyVXNlcklEcyA9IHNvcnQgQEN1c3RvbWVyVXNlcklEczsKCiMgY3JlYXRlIG5vbiBleGlzdGluZyB1c2VyIElEcwpmb3IgKCAxIC4uIDIgKSB7CiAgICBMUEM6CiAgICBmb3IgbXkgJExvb3BQcm90ZWN0aW9uQ291bnRlciAoIDEgLi4gMTAwICkgewoKICAgICAgICAjIGNyZWF0ZSBhIHJhbmRvbSB1c2VyIGlkCiAgICAgICAgbXkgJFRlbXBOb25FeGlzdGluZ1VzZXJJRCA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpOwoKICAgICAgICAjIGNoZWNrIGlmIHJhbmRvbSB1c2VyIGlkIGV4aXN0cyBhbHJlYWR5CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFRlbXBOb25FeGlzdGluZ1VzZXJJRCwKICAgICAgICApOwogICAgICAgIG5leHQgTFBDIGlmICVVc2VyRGF0YTsKCiAgICAgICAgIyB3ZSBnb3QgYW4gdW51c2VkIHVzZXIgSUQKICAgICAgICBwdXNoIEBOb25FeGlzdGluZ1VzZXJJRHMsICRUZW1wTm9uRXhpc3RpbmdVc2VySUQ7CiAgICAgICAgbGFzdCBMUEM7CiAgICB9Cn0KCiMgc2V0IDNyZCB1c2VyIGludmFsaWQKJFVzZXJPYmplY3QtPlVzZXJVcGRhdGUoCiAgICAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzJdLAogICAgKSwKICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAnaW52YWxpZCcgKSwKICAgIENoYW5nZVVzZXJJRCA9PiAxLAopOwpwdXNoIEBJbnZhbGlkVXNlcklEcywgcG9wIEBVc2VySURzOwoKIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAopOwoKIyB0dXJuIG9mZiBTZW5kTm90aWZpY2F0aW9ucywgaW4gb3JkZXIgdG8gYXZvaWQgYSBsb3Qgb2YgdXNlbGVzcyBtYWlscwpteSAkU2VuZE5vdGlmaWNhdGlvbnNPcmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmNhdGlvbnMnKTsKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zJywKICAgIFZhbHVlID0+IDAsCik7CgojIHNhdmUgb3JpZ2luYWwgZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCm15ICRPcmlnaW5hbER5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgVmFsaWQgPT4gMCwKKTsKCm15ICRVbmlxdWVOYW1lUHJlZml4ID0gJ1VuaXRUZXN0Q2hhbmdlJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpOwoKIyBjcmVhdGUgc29tZSBkeW5hbWljIGZpZWxkcyBmb3IgY2hhbmdlcyAoYW5kIGZvciB3b3Jrb3JkZXJzKQpteSBARHluYW1pY0ZpZWxkcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJywKICAgICAgICBMYWJlbCAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJywKICAgICAgICBGaWVsZE9yZGVyID0+IDEwMDAwLAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0Rlc2NyaXB0aW9uIGZvciBEeW5hbWljIEZpZWxkLicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicsCiAgICAgICAgTGFiZWwgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicsCiAgICAgICAgRmllbGRPcmRlciA9PiAxMDAwMCwKICAgICAgICBGaWVsZFR5cGUgID0+ICdUZXh0JywKICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdEZXNjcmlwdGlvbiBmb3IgRHluYW1pYyBGaWVsZC4nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDMnLAogICAgICAgIExhYmVsICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDMnLAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRGVzY3JpcHRpb24gZm9yIER5bmFtaWMgRmllbGQuJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3Q0JywKICAgICAgICBMYWJlbCAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3Q0JywKICAgICAgICBGaWVsZE9yZGVyID0+IDEwMDAwLAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3Q0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0Rlc2NyaXB0aW9uIGZvciBEeW5hbWljIEZpZWxkLicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdXb3Jrb3JkZXJUZXN0MScsCiAgICAgICAgTGFiZWwgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdXb3Jrb3JkZXJUZXN0MScsCiAgICAgICAgRmllbGRPcmRlciA9PiAxMDAwMCwKICAgICAgICBGaWVsZFR5cGUgID0+ICdUZXh0JywKICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdXb3Jrb3JkZXJUZXN0MScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdEZXNjcmlwdGlvbiBmb3IgRHluYW1pYyBGaWVsZC4nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDInLAogICAgICAgIExhYmVsICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDInLAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRGVzY3JpcHRpb24gZm9yIER5bmFtaWMgRmllbGQuJywKICAgICAgICB9LAogICAgfSwKKTsKCm15IEBEeW5hbWljRmllbGRJRHM7CmZvciBteSAkVGVzdCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAjIGFkZCBkeW5hbWljIGZpZWxkCiAgICBteSAkRHluYW1pY0ZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgJXskVGVzdH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREeW5hbWljRmllbGRJRCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIER5bmFtaWNGaWVsZEFkZCgpIiwKICAgICk7CgogICAgIyByZW1lbWJlciBpZCB0byBkZWxldGUgaXQgbGF0ZXIKICAgIHB1c2ggQER5bmFtaWNGaWVsZElEcywgJER5bmFtaWNGaWVsZElEOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBJVFNNQ2hhbmdlIEFQSQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSBwdWJsaWMgaW50ZXJmYWNlIChpbiBhbHBoYWJldGljYWwgb3JkZXIpCm15IEBPYmplY3RNZXRob2RzID0gcXcoCiAgICBDaGFuZ2VBZGQKICAgIENoYW5nZUF0dGFjaG1lbnRBZGQKICAgIENoYW5nZUF0dGFjaG1lbnREZWxldGUKICAgIENoYW5nZUF0dGFjaG1lbnRFeGlzdHMKICAgIENoYW5nZUF0dGFjaG1lbnRHZXQKICAgIENoYW5nZUF0dGFjaG1lbnRMaXN0CiAgICBDaGFuZ2VDQUJEZWxldGUKICAgIENoYW5nZUNBQkdldAogICAgQ2hhbmdlQ0FCVXBkYXRlCiAgICBDaGFuZ2VDSVBMb29rdXAKICAgIENoYW5nZURlbGV0ZQogICAgQ2hhbmdlR2V0CiAgICBDaGFuZ2VMaXN0CiAgICBDaGFuZ2VMb29rdXAKICAgIENoYW5nZVBvc3NpYmxlQ0lQR2V0CiAgICBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldAogICAgQ2hhbmdlU2VhcmNoCiAgICBDaGFuZ2VTdGF0ZUxvb2t1cAogICAgQ2hhbmdlVXBkYXRlCiAgICBQZXJtaXNzaW9uCik7CgojIGNoZWNrIGlmIHN1YnMgYXJlIGF2YWlsYWJsZQpmb3IgbXkgJE9iamVjdE1ldGhvZCAoQE9iamVjdE1ldGhvZHMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VPYmplY3QtPmNhbigkT2JqZWN0TWV0aG9kKSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrICdjYW4gJE9iamVjdE1ldGhvZCciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHNlYXJjaCBmb3IgZGVmYXVsdCBJVFNNQ2hhbmdlLXN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSBkZWZhdWx0IElUU01DaGFuZ2Utc3RhdGVzCiMgY2FuJ3QgdXNlIHF3IGR1ZSB0byBzcGFjZXMgaW4gc3RhdGVzCm15IEBEZWZhdWx0Q2hhbmdlU3RhdGVzID0gKAogICAgJ3JlcXVlc3RlZCcsCiAgICAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAncmVqZWN0ZWQnLAogICAgJ2FwcHJvdmVkJywKICAgICdpbiBwcm9ncmVzcycsCiAgICAncGVuZGluZyBwaXInLAogICAgJ3N1Y2Nlc3NmdWwnLAogICAgJ2ZhaWxlZCcsCiAgICAnY2FuY2VsZWQnLAogICAgJ3JldHJhY3RlZCcsCik7CgojIGdldCBpdGVtIGxpc3Qgb2YgdGhlIGNoYW5nZSBzdGF0ZXMgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlQ2hhbmdlU3RhdGVJRDJOYW1lID0gJXsKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKSB8fCB7fQp9OwpteSAlQ2hhbmdlU3RhdGVOYW1lMklEICAgPSByZXZlcnNlICVDaGFuZ2VTdGF0ZUlEMk5hbWU7Cm15IEBTb3J0ZWRDaGFuZ2VTdGF0ZUlEcyA9IHNvcnQga2V5cyAlQ2hhbmdlU3RhdGVJRDJOYW1lOwoKIyBjaGVjayBpZiBzdGF0ZXMgYXJlIGluIEdlbmVyYWxDYXRhbG9nCmZvciBteSAkRGVmYXVsdENoYW5nZVN0YXRlIChARGVmYXVsdENoYW5nZVN0YXRlcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENoYW5nZVN0YXRlTmFtZTJJRHskRGVmYXVsdENoYW5nZVN0YXRlfSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrIHN0YXRlICckRGVmYXVsdENoYW5nZVN0YXRlJyIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCB0aGUgc3RhdGUgbG9va3VwIG1ldGhvZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGludmVzdGlnYXRlIHRoZSBkZWZhdWx0IHN0YXRlcwpmb3IgbXkgJFN0YXRlIChARGVmYXVsdENoYW5nZVN0YXRlcykgewoKICAgICMgbG9vayB1cCB0aGUgc3RhdGUgbmFtZQogICAgbXkgJExvb2tlZFVwU3RhdGVJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgIENoYW5nZVN0YXRlID0+ICRTdGF0ZSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJENoYW5nZVN0YXRlTmFtZTJJRHskU3RhdGV9LAogICAgICAgICJMb29rIHVwIHN0YXRlICckU3RhdGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFN0YXRlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkTG9va2VkVXBTdGF0ZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwU3RhdGUsCiAgICAgICAgJFN0YXRlLAogICAgICAgICJMb29rIHVwIHN0YXRlIGlkICckTG9va2VkVXBTdGF0ZUlEJyIsCiAgICApOwp9CgojIG5vdyBzb21lIHBhcmFtIGNoZWNrcyBmb3IgQ2hhbmdlU3RhdGVMb29rdXAKbXkgJExvb2t1cE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPaywKICAgICdObyBwYXJhbXMgcGFzc2VkIHRvIENoYW5nZVN0YXRlTG9va3VwKCknLAopOwoKJExvb2t1cE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICBDaGFuZ2VTdGF0ZSAgID0+ICdhcHByb3ZlZCcsCiAgICBDaGFuZ2VTdGF0ZUlEID0+IDIsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnRXhjbHVzaXZlIHBhcmFtcyBwYXNzZWQgdG8gQ2hhbmdlU3RhdGVMb29rdXAoKScsCik7CgokTG9va3VwT2sgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgIFN0YXRlID0+ICdhcHByb3ZlZCcsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAiSW5jb3JyZWN0IHBhcmFtICdTdGF0ZScgcGFzc2VkIHRvIENoYW5nZVN0YXRlTG9va3VwKCkiLAopOwoKJExvb2t1cE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICBTdGF0ZUlEID0+IDIsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAiSW5jb3JyZWN0IHBhcmFtICdTdGF0ZUlEJyBwYXNzZWQgdG8gQ2hhbmdlU3RhdGVMb29rdXAoKSIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2hlY2sgZXhpc3RlbmNlIG9mIHRoZSBkZWZhdWx0IGhpc3RvcnkgdHlwZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgQERlZmF1bHRIaXN0b3J5VHlwZXMgPSBxdygKICAgIENoYW5nZUFkZAogICAgQ2hhbmdlVXBkYXRlCiAgICBDaGFuZ2VEZWxldGUKICAgIENoYW5nZUNBQlVwZGF0ZQogICAgQ2hhbmdlQ0FCRGVsZXRlCiAgICBDaGFuZ2VMaW5rQWRkCiAgICBDaGFuZ2VMaW5rRGVsZXRlCiAgICBDaGFuZ2VBdHRhY2htZW50QWRkCiAgICBDaGFuZ2VBdHRhY2htZW50RGVsZXRlCiAgICBXb3JrT3JkZXJBZGQKICAgIFdvcmtPcmRlclVwZGF0ZQogICAgV29ya09yZGVyRGVsZXRlCiAgICBXb3JrT3JkZXJMaW5rQWRkCiAgICBXb3JrT3JkZXJMaW5rRGVsZXRlCiAgICBXb3JrT3JkZXJBdHRhY2htZW50QWRkCiAgICBXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlCiAgICBXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50QWRkCiAgICBXb3JrT3JkZXJSZXBvcnRBdHRhY2htZW50RGVsZXRlCiAgICBDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZAogICAgQ2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkCiAgICBDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkCiAgICBDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZAogICAgV29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQKICAgIFdvcmtPcmRlclBsYW5uZWRFbmRUaW1lUmVhY2hlZAogICAgV29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZAogICAgV29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQKICAgIENoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkCiAgICBDb25kaXRpb25BZGQKICAgIENvbmRpdGlvblVwZGF0ZQogICAgQ29uZGl0aW9uRGVsZXRlCiAgICBDb25kaXRpb25EZWxldGVBbGwKICAgIEV4cHJlc3Npb25BZGQKICAgIEV4cHJlc3Npb25VcGRhdGUKICAgIEV4cHJlc3Npb25EZWxldGUKICAgIEV4cHJlc3Npb25EZWxldGVBbGwKICAgIEFjdGlvbkFkZAogICAgQWN0aW9uVXBkYXRlCiAgICBBY3Rpb25EZWxldGUKICAgIEFjdGlvbkRlbGV0ZUFsbAogICAgQWN0aW9uRXhlY3V0ZQogICAgQ2hhbmdlTm90aWZpY2F0aW9uU2VudAogICAgV29ya09yZGVyTm90aWZpY2F0aW9uU2VudAopOwoKIyBpbnZlc3RpZ2F0ZSB0aGUgZGVmYXVsdCBoaXN0b3J5IHR5cGVzCmZvciBteSAkSGlzdG9yeVR5cGUgKEBEZWZhdWx0SGlzdG9yeVR5cGVzKSB7CgogICAgIyBsb29rIHVwIHRoZSBuYW1lCiAgICBteSAkTG9va2VkVXBIaXN0b3J5VHlwZUlEID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlID0+ICRIaXN0b3J5VHlwZSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExvb2tlZFVwSGlzdG9yeVR5cGVJRCwKICAgICAgICAiTG9vayB1cCBoaXN0b3J5IHR5cGUgJyRIaXN0b3J5VHlwZSciLAogICAgKTsKCiAgICAjIGRvIHRoZSByZXZlcnNlIGxvb2t1cAogICAgbXkgJExvb2tlZFVwSGlzdG9yeVR5cGUgPSAkSGlzdG9yeU9iamVjdC0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAkTG9va2VkVXBIaXN0b3J5VHlwZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwSGlzdG9yeVR5cGUsCiAgICAgICAgJEhpc3RvcnlUeXBlLAogICAgICAgICJMb29rIHVwIGhpc3RvcnkgdHlwZSBpZCAnJExvb2tlZFVwSGlzdG9yeVR5cGVJRCciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIGV4aXN0ZW5jZSBvZiB0aGUgZGVmYXVsdCBDSVAKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgQENJUFZhbHVlcyA9ICggJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnMyBub3JtYWwnLCAnNCBoaWdoJywgJzUgdmVyeSBoaWdoJyApOwoKIyBnZXQgbGlzdCBvZiB0aGUgY2F0ZWdvcmllcyB3aXRoIHN3YXBwZWQga2V5cyBhbmQgdmFsdWVzCm15ICVDaGFuZ2VDYXRlZ29yeUlEMk5hbWUgPSAlewogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2F0ZWdvcnknLAogICAgKSB8fCB7fQp9OwpteSAlQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEICAgPSByZXZlcnNlICVDaGFuZ2VDYXRlZ29yeUlEMk5hbWU7Cm15IEBTb3J0ZWRDaGFuZ2VDYXRlZ29yeUlEcyA9IHNvcnQga2V5cyAlQ2hhbmdlQ2F0ZWdvcnlJRDJOYW1lOwoKIyBnZXQgbGlzdCBvZiB0aGUgaW1wYWN0cyB3aXRoIHN3YXBwZWQga2V5cyBhbmQgdmFsdWVzCm15ICVDaGFuZ2VJbXBhY3RJRDJOYW1lID0gJXsKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkltcGFjdCcsCiAgICApIHx8IHt9Cn07Cm15ICVDaGFuZ2VJbXBhY3ROYW1lMklEICAgPSByZXZlcnNlICVDaGFuZ2VJbXBhY3RJRDJOYW1lOwpteSBAU29ydGVkQ2hhbmdlSW1wYWN0SURzID0gc29ydCBrZXlzICVDaGFuZ2VJbXBhY3RJRDJOYW1lOwoKIyBnZXQgbGlzdCBvZiB0aGUgcHJpb3JpdGllcyB3aXRoIHN3YXBwZWQga2V5cyBhbmQgdmFsdWVzCm15ICVDaGFuZ2VQcmlvcml0eUlEMk5hbWUgPSAlewogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6UHJpb3JpdHknLAogICAgKSB8fCB7fQp9OwpteSAlQ2hhbmdlUHJpb3JpdHlOYW1lMklEICAgPSByZXZlcnNlICVDaGFuZ2VQcmlvcml0eUlEMk5hbWU7Cm15IEBTb3J0ZWRDaGFuZ2VQcmlvcml0eUlEcyA9IHNvcnQga2V5cyAlQ2hhbmdlUHJpb3JpdHlJRDJOYW1lOwoKIyBjaGVjayBpZiBDSVAgdmFsdWVzIGFyZSBpbiBHZW5lcmFsQ2F0YWxvZwpmb3IgbXkgJENJUFZhbHVlIChAQ0lQVmFsdWVzKSB7CgogICAgIyB0ZXN0IGNhdGVnb3J5CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeyRDSVBWYWx1ZX0sCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayBjYXRlZ29yeSAnJENJUFZhbHVlJyAoZ2VuZXJhbCBjYXRhbG9nKSIKICAgICk7CgogICAgbXkgJENhdGVnb3J5SUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgVHlwZSA9PiAnQ2F0ZWdvcnknLAogICAgICAgIENJUCAgPT4gJENJUFZhbHVlLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDYXRlZ29yeUlELAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50IC4gIiAtIGNoZWNrIGNhdGVnb3J5ICckQ0lQVmFsdWUnIChDaGFuZ2VDSVBMb29rdXApIgogICAgKTsKCiAgICAjIHRlc3QgaW1wYWN0CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSW1wYWN0TmFtZTJJRHskQ0lQVmFsdWV9LAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgaW1wYWN0ICckQ0lQVmFsdWUnIChnZW5lcmFsIGNhdGFsb2cpIgogICAgKTsKCiAgICBteSAkSW1wYWN0SUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgVHlwZSA9PiAnSW1wYWN0JywKICAgICAgICBDSVAgID0+ICRDSVBWYWx1ZSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkSW1wYWN0SUQsCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQgLiAiIC0gY2hlY2sgaW1wYWN0ICckQ0lQVmFsdWUnIChDaGFuZ2VDSVBMb29rdXApIgogICAgKTsKCiAgICAjIHRlc3QgcHJpb3JpdHkKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JENJUFZhbHVlfSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrIHByaW9yaXR5ICckQ0lQVmFsdWUnIChnZW5lcmFsIGNhdGFsb2cpIgogICAgKTsKCiAgICBteSAkUHJpb3JpdHlJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICBUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgQ0lQICA9PiAkQ0lQVmFsdWUsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFByaW9yaXR5SUQsCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQgLiAiIC0gY2hlY2sgcHJpb3JpdHkgJyRDSVBWYWx1ZScgKENoYW5nZUNJUExvb2t1cCkiCiAgICApOwoKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIGV4aXN0ZW5jZSBvZiB0aGUgZ3JvdXBzIHRoYXQgYXJlIHVzZWQgZm9yIFBlcm1pc3Npb24KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBvZiB0aGUgZ3JvdXAgbmFtZSB0byB0aGUgZ3JvdXAgaWQKbXkgJUdyb3VwTmFtZTJJRCA9IHJldmVyc2UgJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoIFZhbGlkID0+IDEgKTsKCiMgY2hlY2sgaWYgdGhlIGdyb3VwcyB3ZXJlIGZvdW5kCmZvciBteSAkR3JvdXAgKHF3KCBpdHNtLWNoYW5nZSBpdHNtLWNoYW5nZS1idWlsZGVyIGl0c20tY2hhbmdlLW1hbmFnZXIgKSkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEdyb3VwTmFtZTJJRHskR3JvdXB9LAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgZ3JvdXAgJyRHcm91cCciCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZ2V0IHZhcmlhYmxlcyBmb3IgdGVzdAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICREZWZhdWx0Q2F0ZWdvcnkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OkNhdGVnb3J5OjpEZWZhdWx0Jyk7Cm15ICREZWZhdWx0SW1wYWN0ICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OkltcGFjdDo6RGVmYXVsdCcpOwpteSAkRGVmYXVsdFByaW9yaXR5ID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICBDYXRlZ29yeUlEID0+ICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JERlZmF1bHRDYXRlZ29yeX0sCiAgICBJbXBhY3RJRCAgID0+ICRDaGFuZ2VJbXBhY3ROYW1lMklEeyREZWZhdWx0SW1wYWN0fSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBjaGFuZ2UgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBzdG9yZSBjdXJyZW50IFRlc3RDb3VudCBmb3IgYmV0dGVyIHRlc3QgY2FzZSByZWNvZ25pdGlvbgpteSAkVGVzdENvdW50TWlzYyA9ICRUZXN0Q291bnQ7CgojIEFuIHVuaXF1ZSBpbmRlbnRpZmllciwgc28gdGhhdCBkYXRhIGZyb20gZGlmZmVyZW50IHRlc3QgcnVucwojIHdvbid0IGJlIG1peGVkIHVwLiBUaGUgc3RyaW5nIGlzIGZvcm1hdGVkIHRvIGEgY29uc3RhbnQgbGVuZ3RoLAojIGFzIHRoZSBjb252ZXJzaW9uIHRvIHBsYWluIHRleHQgd2l0aCBUb0FzY2lpKCkgZGVwZW5kcyBvbiB0aGUgc3RyaW5nIGxlbmd0aC4KbXkgJFVuaXF1ZVNpZ25hdHVyZSA9IHNwcmludGYgJ1VuaXRUZXN0LUlUU01DaGFuZ2UtJTA2ZC0lMDEwZCcsCiAgICAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21OdW1iZXIoKSwKICAgIHRpbWUoKTsKbXkgJE5vV2lsZGNhcmRzVGVzdFRpdGxlID0gc3ByaW50ZiAnVW5pdFRlc3QtSVRTTUNoYW5nZS1Ob1dpbGRjYXJkcy0lMDZkLSUwMTBkJywKICAgICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpLAogICAgdGltZSgpOwoKbXkgQENoYW5nZVRlc3RzID0gKAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIFRlc3RzIG9uIENoYW5nZUFkZAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKCiAgICAjIENoYW5nZSBkb2Vzbid0IGNvbnRhaW4gYWxsIGRhdGEgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgbm8gcGFyYW1zIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHRoaXMgdGVzdCB0byBmYWlsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4ge30sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgQ2hhbmdlIGNvbnRhaW5zIG9ubHkgcmVxdWlyZWQgZGF0YSAtIGRlZmF1bHQgdXNlciAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbmx5IG5lZWRlZCBwYXJhbXMgKFVzZXJJRCA9IDEpIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiAgID0+ICcnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEhpc3RvcnlHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlQWRkID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDI1LCAyNiBdLAogICAgICAgIExhYmVsICAgICAgPT4gJ0NoYW5nZUxvb2t1cFRlc3QnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBmb3IgdGVzdGluZyBDaGFuZ2VMb29rdXAoKS4KICAgIH0sCgogICAgIyBDaGFuZ2UgY29udGFpbnMgb25seSByZXF1aXJlZCBkYXRhIC0gZGVmYXVsdCB1c2VyIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9ubHkgbmVlZGVkIHBhcmFtcyAoVXNlcklEICE9IDEpIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnJywKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEcyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckNvdW50ICA9PiAwLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDI1LCAyNiBdLAogICAgfSwKCiAgICAjIENoYW5nZSBjb250YWlucyBIVE1MIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb25seSBuZWVkZWQgcGFyYW1zIChVc2VySUQgIT0gMSkgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICc8Yj5UaGlzIDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnPGI+VGhpcyA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICc8Yj5UaGlzIDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiAgID0+ICdUaGlzIGlzIGJvbGQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnPGI+VGhpcyA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb25QbGFpbiA9PiAnVGhpcyBpcyBib2xkIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0LCAyNSwgMjYsIDQ4LCA0OSwgNTAgXSwKICAgIH0sCgogICAgIyBDaGFuZ2Ugd2l0aCBuYW1lZCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBTdGF0ZW5hbWVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlICAgICAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlzdG9yeUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VBZGQgICAgPT4gJycsCiAgICAgICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgWyAnJywgJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlIF0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICBbIHVuZGVmLCAkVXNlcklEc1swXSBdLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIFsgdW5kZWYsICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSBdLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDI1LCAyNiwgMzMsIDM3IF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCB2YWxpZCBuYW1lZCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VVcGRhdGUoKSB3aXRoIHZhbGlkIG5hbWVkIENoYW5nZVN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCAgID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7J3BlbmRpbmcgYXBwcm92YWwnfSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlICAgICA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0LCAyNSwgMjYsIDM4IF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCBpbnZhbGlkIG5hbWVkIENoYW5nZVN0YXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVVwZGF0ZSgpIHdpdGggaW52YWxpZCBuYW1lZCBDaGFuZ2VTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ2ZhaWxlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJycsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtyZXF1ZXN0ZWR9LAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgICAgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgID0+IDAsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNCwgMjUsIDI2LCAzNyBdLAogICAgfSwKCiAgICAjIENoYW5nZVVwZGF0ZSgpIHdpdGggbm90IGFsbG93ZWQgbmV4dCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VVcGRhdGUoKSB3aXRoIG5vdCBhbGxvd2VkIG5leHQgQ2hhbmdlU3RhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFszOF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCBub3QgYWxsb3dlZCBuZXh0IENoYW5nZVN0YXRlIGJ1dCBCeXBhc3NTdGF0ZU1hY2hpbmUgcGFyYW1ldGVyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ0NoYW5nZVVwZGF0ZSgpIHdpdGggbm90IGFsbG93ZWQgbmV4dCBDaGFuZ2VTdGF0ZSBidXQgQnlwYXNzU3RhdGVNYWNoaW5lIHBhcmFtZXRlciAtICcKICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VTdGF0ZXMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICdwZW5kaW5nIGFwcHJvdmFsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQnlwYXNzU3RhdGVNYWNoaW5lID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSAgICAgICAgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAnc3VjY2Vzc2Z1bCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBjaGFuZ2UgY29udGFpbnMgYWxsIGRhdGEgLSAoYWxsIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgYWxsIHBvc3NpYmxlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAxIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAxIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCAzLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAyMywgMjQsIDI3IF0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnU2VhcmNoVGVzdCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIGJlIHVzZWQgZm9yIHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIGNoYW5nZSBjb250YWlucyB0aXRsZSwgZGVzY3JpcHRpb24sIGp1c3RpZmljYXRpb24sIGNoYW5nZW1hbmFnZXJpZCBhbmQgY2hhbmdlYnVpbGRlcmlkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgYWxsIHBvc3NpYmxlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkIChTZWNvbmQgdHJ5KS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnQ2hhbmdlIDIgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdDaGFuZ2UgMiAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ0NoYW5nZSAyIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ0NoYW5nZSAyIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ2hhbmdlIDIgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICdDaGFuZ2UgMiAtIEp1c3RpZmljYXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbICRVc2VySURzWzFdIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgPT4gWyAkQ3VzdG9tZXJVc2VySURzWzFdIF0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMV0KICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyMywgMjQgXSwKICAgIH0sCgogICAgIyBjaGFuZ2UgY29udGFpbnMgYWxsIGRhdGEgLSB3cm9uZyBDQUIgLSAod3JvbmcgQ0FCIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgaW52YWxpZCBDQUIgbWVtYmVycyBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAzIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgICAgICBGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIGNoYW5nZSBjb250YWlucyByZXF1aXJlZCBkYXRhIC0gZHVwbGljYXRlIENBQiBlbnRyaWVzIC0gKGR1cGxpY2F0ZSBDQUIgZW50cmllcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBkdXBsaWNhdGUgQ0FCIG1lbWJlcnMgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXggbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgIyBUaGUgbWF4IHBsYWluIHN0cmluZyBpcyBvbmx5IDE3OTk5OTksIGJlY2F1c2UgVG9Bc2NpaSgpIGFkZHMgYSBuZXdsaW5lCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDE3OTk5OTksCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDE3OTk5OTksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ0QnIHggMTc5OTk5OSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uUGxhaW4gICA9PiAnRCcgeCAxNzk5OTk5IC4gIlxuIiwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnSicgeCAxNzk5OTk5LAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluID0+ICdKJyB4IDE3OTk5OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMTEsIDEyLCAxMyBdLAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJyB4IDI1MSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMTgwMDAwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onIHggMTgwMDAwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsyIGxvbmcgcGFyYW1zICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzIgc3RyaW5nIGxlbmd0aCBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTIsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDE4MDAwMDEsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDE4MDAwMDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXgrMSBsb25nIHBhcmFtcyAtIHRpdGxlICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIC0gdGl0bGUgLSBsZW5ndGggZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ1QnIHggMjUxLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsxIGxvbmcgcGFyYW1zIC0gZGVzY3JpcHRpb24gKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyAtIGRlc2NyaXB0aW9uIC0gbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMTgwMDAwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgLSBqdXN0aWZpY2F0aW9uIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgLSBqdXN0aWZpY2F0aW9uIC0gbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnSicgeCAxODAwMDAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gdW5kZWYgcGFyYW1zIC0gdGl0bGUgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiAtIHRpdGxlJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHVuZGVmIHBhcmFtcyAtIGRlc2NyaXB0aW9uIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiAtIGRlc2NyaXB0aW9uJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHVuZGVmIHBhcmFtcyAtIGp1c3RpZmljYXRpb24gKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHVuZGVmIC0ganVzdGlmaWNhdGlvbicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gdW5kZWYsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiAnMCcgc3RyaW5ncyAtIGRlZmF1bHQgdXNlciAgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlRlc3QgZm9yICcwJyBzdHJpbmcgaGFuZGxpbmcgZm9yIENoYW5nZUFkZC4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJzAnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnMCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcwJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDE4LCAxOSwgMjAsIDIxIF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAiICBcdCBcbiAgVGl0bGUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDQ1IF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICJUaXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSAuICIgIFx0IFxuICAiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gIlRpdGxlIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDQ2IF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICIgIFx0IFxuICBUaXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlCiAgICAgICAgICAgICAgICAgICAgLiAiICBcdCBcbiAgIiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA0NyBdLAogICAgfSwKCiAgICAjIFRlc3QgdGl0bGUgd2l0aCBvbmx5IHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCBvbmx5IHdoaXRlc3BhY2UnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gIiAgXHQgXG4gICIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnJywKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gW10sCiAgICB9LAoKICAgICMgYSBjaGFuZ2UgZm9yIHRoZSAnVXNpbmdXaWxkY2FyZHMgPT4gMCcgdGVzdAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJBIGNoYW5nZSBmb3IgdGhlICdVc2luZ1dpbGRjYXJkcyA9PiAwJyB0ZXN0LiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkTm9XaWxkY2FyZHNUZXN0VGl0bGUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICROb1dpbGRjYXJkc1Rlc3RUaXRsZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJE5vV2lsZGNhcmRzVGVzdFRpdGxlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICROb1dpbGRjYXJkc1Rlc3RUaXRsZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJE5vV2lsZGNhcmRzVGVzdFRpdGxlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAkTm9XaWxkY2FyZHNUZXN0VGl0bGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1peGVkIHZhbGlkIGFuZCBpbnZhbGlkIENBQkFnZW50cyAgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gbWl4ZWQgdmFsaWQgYW5kIGludmFsaWQgQ0FCQWdlbnRzIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkTm9uRXhpc3RpbmdVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgICROb25FeGlzdGluZ1VzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWl4ZWQgdmFsaWQgYW5kIGludmFsaWQgQ0FCQ3VzdG9tZXJzICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBtaXhlZCB2YWxpZCBhbmQgaW52YWxpZCBDQUJDdXN0b21lcnMgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICAnVGhpc0lzQW5JbnZhbGlkQ3VzdG9tZXJVc2VySWQnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIGludmFsaWQgSURzIGZvciBDaGFuZ2VNYW5hZ2VySUQgYW5kIENoYW5nZUJ1aWxkZXJJRAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9uIGludmFsaWQgSURzIGZvciBDaGFuZ2VNYW5hZ2VySUQgYW5kIENoYW5nZUJ1aWxkZXJJRCBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkTm9uRXhpc3RpbmdVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICROb25FeGlzdGluZ1VzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBpbnZhbGlkIElEcyBmb3IgQ2hhbmdlTWFuYWdlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gaW52YWxpZCBJRCBmb3IgQ2hhbmdlTWFuYWdlcklEIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICROb25FeGlzdGluZ1VzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBpbnZhbGlkIElEcyBmb3IgQ2hhbmdlQnVpbGRlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gaW52YWxpZCBJRCBmb3IgQ2hhbmdlQnVpbGRlcklEIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICROb25FeGlzdGluZ1VzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBpbnZhbGlkIFJlcXVlc3RlZFRpbWUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBpbnZhbGlkIFJlcXVlc3RlZFRpbWUgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnYW55dGhpbmcgaW52YWxpZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiB2YWxpZCBSZXF1ZXN0ZWRUaW1lCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gdmFsaWQgUmVxdWVzdGVkVGltZSBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdSZXF1ZXN0ZWRUaW1lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0MiwgNDMgXSwKICAgIH0sCgogICAgIyBUZXN0IGRlZmF1bHQgQ0lQIHZhbHVlcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGRlZmF1bHQgQ0lQIHZhbHVlcycsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBkZWZhdWx0IENJUCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgZGVmYXVsdCBDSVAgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ICAgICAgICA9PiAkRGVmYXVsdENhdGVnb3J5LAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JERlZmF1bHRDYXRlZ29yeX0sCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICAgICAgPT4gJERlZmF1bHRJbXBhY3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgICAgPT4gJENoYW5nZUltcGFjdE5hbWUySUR7JERlZmF1bHRJbXBhY3R9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+ICREZWZhdWx0UHJpb3JpdHksCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgICAgPT4gJENoYW5nZVByaW9yaXR5SUQyTmFtZXskRGVmYXVsdFByaW9yaXR5fSwKCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgICAgICBMYWJlbCAgICAgID0+ICdPcmRlckJ5Q0lQVGVzdHMnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBUZXN0IGNhdGVnb3J5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2F0ZWdvcnkgIjEgdmVyeSBsb3ciJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBDSVAgKENhdGVnb3J5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeycxIHZlcnkgbG93J30sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNTEsIDU0LCA1NywgNjAsIDYzLCA2NCBdLAogICAgICAgIExhYmVsICAgICAgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICAgICAgICAgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIGNhdGVnb3J5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgaW52YWxpZCBjYXRlZ29yeSAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAgKENhdGVnb3J5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIyBUZXN0IGltcGFjdAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGltcGFjdCAiMSB2ZXJ5IGxvdyInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQIChJbXBhY3QpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBDSVAgKEltcGFjdCkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgICAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgICAgPT4gJENoYW5nZUltcGFjdE5hbWUySUR7JzEgdmVyeSBsb3cnfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1MiwgNTUsIDU4LCA2MSBdLAogICAgICAgIExhYmVsICAgICAgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW52YWxpZCBpbXBhY3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBpbnZhbGlkIGltcGFjdCAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAgKEltcGFjdCkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICcxOCBzdXBlciBoaWdoJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gW10sCiAgICB9LAoKICAgICMgVGVzdCBwcmlvcml0eQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IHByaW9yaXR5ICIxIHZlcnkgbG93IicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgQ0lQIChQcmlvcml0eSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgPT4gJENoYW5nZVByaW9yaXR5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDUzLCA1NiwgNTksIDYyIF0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgaW52YWxpZCBwcmlvcml0eSAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgb24gQ2hhbmdlVXBkYXRlCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgVXBkYXRlIGNoYW5nZSB3aXRob3V0IHJlcXVpcmVkIHBhcmFtcyAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBubyBwYXJhbXMgZm9yIENoYW5nZVVwZGF0ZSgpLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHRoaXMgdGVzdCB0byBmYWlsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4ge30sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXggbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXggc3RyaW5nIGxlbmd0aCBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDE3OTk5OTksCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDE3OTk5OTksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ0QnIHggMTc5OTk5OSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uUGxhaW4gICA9PiAnRCcgeCAxNzk5OTk5IC4gIlxuIiwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnSicgeCAxNzk5OTk5LAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluID0+ICdKJyB4IDE3OTk5OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAxMSwgMTQsIDE1LCAxNiwgMTcgXSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsxIGxvbmcgcGFyYW1zICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIGxlbmd0aCBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJyB4IDI1MSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMTgwMDAwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onIHggMTgwMDAwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJycsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXgrMSBsb25nIHBhcmFtcyAtIHRpdGxlICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIGxlbmd0aCAtIHRpdGxlIC0gZm9yIENoYW5nZVVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTEsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sICAgICMgdGVzdCBvbiBtYXgrMSBsb25nIHBhcmFtcyAtIGRlc2NyaXB0aW9uICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIGxlbmd0aCAtIGRlc2NyaXB0aW9uIC0gZm9yIENoYW5nZVVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDE4MDAwMDAsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJycsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LCAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgIC0ganVzdGlmaWNhdGlvbiAtIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0ganVzdGlmaWNhdGlvbiAtIGZvciBDaGFuZ2VVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ1QnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDE4MDAwMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gJzAnIHN0cmluZ3MgLSBkZWZhdWx0IHVzZXIgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJUZXN0IGZvciAnMCcgc3RyaW5nIGhhbmRsaW5nIGZvciBDaGFuZ2VVcGRhdGUuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJzAnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnMCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcwJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiB2YWxpZCBSZXF1ZXN0ZWRUaW1lCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gdmFsaWQgUmVxdWVzdGVkVGltZSBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdSZXF1ZXN0ZWRUaW1lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTExLTA2IDA4OjE1OjIyJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnMjAwOS0xMS0wNiAwODoxNToyMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdSZXF1ZXN0ZWRUaW1lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs0M10sCiAgICB9LAoKICAgICMgdGVzdCBvbiBpbnZhbGlkIFJlcXVlc3RlZFRpbWUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBpbnZhbGlkIFJlcXVlc3RlZFRpbWUgZm9yIENoYW5nZVVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdSZXF1ZXN0ZWRUaW1lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICdhbnl0aGluZycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVxdWVzdGVkVGltZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdSZXF1ZXN0ZWRUaW1lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNDIsIDQzIF0sCiAgICB9LAoKICAgICMgVGVzdCBjYXRlZ29yeQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNhdGVnb3J5IHVwZGF0ZSAiNSB2ZXJ5IGhpZ2giJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBDSVAgKENhdGVnb3J5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnNSB2ZXJ5IGhpZ2gnfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDU0LCA2MCBdLAogICAgICAgIExhYmVsICAgICAgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW52YWxpZCBjYXRlZ29yeQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGludmFsaWQgY2F0ZWdvcnkgdXBkYXRlICIxOCBzdXBlciBoaWdoIicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IGludmFsaWQgdXBkYXRlIENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ID0+ICcxOCBzdXBlciBoaWdoJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IGludmFsaWQgdXBkYXRlIENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeycyIGxvdyd9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDU0LCA2MCwgNjMsIDY0IF0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbXBhY3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBpbXBhY3QgdXBkYXRlICI1IHZlcnkgaGlnaCInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIENJUCAoSW1wYWN0KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgSW1wYWN0ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCB1cGRhdGUgQ0lQIChJbXBhY3QpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICAgICAgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgICA9PiAkQ2hhbmdlSW1wYWN0TmFtZTJJRHsnNSB2ZXJ5IGhpZ2gnfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDU1LCA2MSBdLAogICAgICAgIExhYmVsICAgICAgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW52YWxpZCBpbXBhY3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBpbnZhbGlkIGltcGFjdCB1cGRhdGUgIjE4IHN1cGVyIGhpZ2giJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIGludmFsaWQgQ0lQIChJbXBhY3QpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICBJbXBhY3QgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgdXBkYXRlIGludmFsaWQgQ0lQIChJbXBhY3QpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgICA9PiAkQ2hhbmdlSW1wYWN0TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1NSwgNjEgXSwKICAgICAgICBMYWJlbCAgICAgID0+ICdPcmRlckJ5Q0lQVGVzdHMnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBUZXN0IHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgcHJpb3JpdHkgdXBkYXRlICI1IHZlcnkgaGlnaCInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIENJUCAoUHJpb3JpdHkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCB1cGRhdGUgQ0lQIChQcmlvcml0eSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+ICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1NiwgNjIgXSwKICAgICAgICBMYWJlbCAgICAgID0+ICdPcmRlckJ5Q0lQVGVzdHMnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBUZXN0IGludmFsaWQgcHJpb3JpdHkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBpbnZhbGlkIHByaW9yaXR5IHVwZGF0ZSAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBpbnZhbGlkIHVwZGF0ZSBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnMTggc3VwZXIgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBpbnZhbGlkIHVwZGF0ZSBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICAgID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgPT4gJENoYW5nZVByaW9yaXR5TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1NiwgNjIgXSwKICAgICAgICBMYWJlbCAgICAgID0+ICdPcmRlckJ5Q0lQVGVzdHMnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIFRlc3RzIGZvciBDaGFuZ2UgRHluYW1pYyBmaWVsZHMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgdGVzdCBzb21lIGNoYW5nZSBkeW5hbWljIGZpZWxkcyBDaGFuZ2VBZGQgYW5kIENoYW5nZVVwZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IENoYW5nZUFkZCBhbmQgQ2hhbmdlVXBkYXRlIHdpdGggY2hhbmdlIGR5bmFtaWMgZmllbGRzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBhZGQgY2hhbmdlIHdpdGggZHluYW1pYyBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiAnQUFBQScsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0JCQkInLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDMnID0+ICdDQ0NDJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3Q0JyA9PiAnRERERCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnR0dHRycsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ0hISEgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDEnID0+ICdXLUFBQUEnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDInID0+ICdXLUJCQkInLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgYWRkIGNoYW5nZSB3aXRoIGR5bmFtaWMgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0FBQUEnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCQkJCJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnR0dHRycsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ0hISEgnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCgogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA2OSwgNzAsIDcxLCA3MiBdLAogICAgfSwKCiAgICAjIHRlc3QgY2hhbmdlIGR5bmFtaWMgZmllbGRzIHdpdGggbWF4aW11bSBsZW5ndGgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VBZGQgZHluYW1pYyBmaWVsZHMgd2l0aCAzODAwIGNoYXJhY3RlcnMuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IGFkZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgd2l0aCAzODAwIGNoYXJhY3RlcnMgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBJyB4IDM4MDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBJyB4IDM4MDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgIH0sCgogICAgIyB0ZXN0IGNoYW5nZSBkeW5hbWljIGZpZWxkcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGxlbmd0aAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IENoYW5nZUFkZCBkeW5hbWljIGZpZWxkcyB3aXRoIDM4MDEgY2hhcmFjdGVycy4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBhZGQgY2hhbmdlIGR5bmFtaWMgZmllbGRzIHdpdGggMzgwMSBjaGFyYWN0ZXJzIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiAnQScgeCAzODAxLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCJyB4IDM4MDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgbGFyZ2VyIHRoYW4gbWF4aW11bSBsZW5ndGgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VVcGRhdGUgZHluYW1pYyBmaWVsZHMgd2l0aCAzODAxIGNoYXJhY3RlcnMuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIGNoYW5nZSBkeW5hbWljIGZpZWxkcyB3aXRoIDM4MDEgY2hhcmFjdGVycyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0EnIHggMzgwMCwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQicgeCAzODAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MycgPT4gJ0MnIHggMzgwMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBJyB4IDM4MDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgIH0sCgogICAgIyB0ZXN0IGNoYW5nZSBkeW5hbWljIGZpZWxkcyB3aXRoIHplcm8gYW5kIGVtcHR5IHN0cmluZ3MKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VVcGRhdGUgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmcuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IHVwZGF0ZSBjaGFuZ2UgZHluYW1pYyBmaWVsZHMgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBQUFBJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQkJCQicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiAwLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gMCwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgb24gQ2hhbmdlQ0FCKgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGNoZWNrcyBlbXB0eSBBUlJBWS1yZWYgb24gQ2hhbmdlQ0FCR2V0IHdpdGggbm8gZ2l2ZW4gQ0FCIGZvciBDaGFuZ2VDQUJHZXQuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VDQUJHZXQgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFtdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDEyLCAxMyBdLAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIHJlbW92YWwgb2YgZHVwbGljYXRlIENBQiBtZW1iZXJzIGZvciBDaGFuZ2VDQUJVcGRhdGUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NBQlVwZGF0ZSBhbmQgQ0FCR2V0IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBIaXN0b3J5R2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUFkZCAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgWyB1bmRlZiwgam9pbiAnJSUnLCAkQ3VzdG9tZXJVc2VySURzWzBdLCAkQ3VzdG9tZXJVc2VySURzWzFdIF0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIENoYW5nZUNBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIFsgdW5kZWYsIGpvaW4gJyUlJywgJFVzZXJJRHNbMF0sICRVc2VySURzWzFdIF0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA4LCA5LCAxMCwgMjIsIDI4LCAyOSwgMzMsIDM0LCAzNSBdLAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGludmFsaWQgQ0FCQWdlbnRzIHBhcmFtIGZvciBDaGFuZ2VDQUJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Bhc3NpbmcgYW4gaW50ZWdlciBhcyBDQUJBZ2VudHMgdG8gQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ05laXRoZXIgQ0FCQWdlbnRzIG5vciBDQUJDdXN0b21lcnMgaXMgcGFzc2VkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGRlYWt0aXZhdGVkIENBQkFnZW50cyBwYXJhbSBmb3IgQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkSW52YWxpZFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGludmFsaWQgQ0FCQ3VzdG9tZXJzIHBhcmFtIGZvciBDaGFuZ2VDQUJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlRmFpbCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUNBQkdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gW10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJVcGRhdGUgYW5kIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBIHZhbGlkIENBQkN1c3RvbWVyIGlzIHBhc3NlZCB0byBDaGFuZ2VDQUJVcGRhdGUsIG5vIENBQkFnZW50cy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJVcGRhdGUgYW5kIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBIHZhbGlkIENBQkFnZW50IGlzIHBhc3NlZCB0byBDaGFuZ2VDQUJVcGRhdGUsIG5vIENBQkN1c3RvbWVycy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUNBQkdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIHZhbGlkIENoYW5nZUFkZCBhbmQgQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VDQUJHZXQgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJEZWxldGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjaGVja3MgQ2hhbmdlQ0FCRGVsZXRlIHdpdGggdmFsaWQgcGFyYW1zLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCRGVsZXRlID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQkRlbGV0ZSAtIGluIHRoZSBleGVjdXRpaW9uIG9mIHRoZSwgbm8gQ2hhbmdlSUQgd2lsbCBiZSBnaXZlbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNoZWNrcyBDaGFuZ2VDQUJEZWxldGUgd2l0aCBpbnZhbGlkIHBhcmFtcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NBQkRlbGV0ZSAoaW52YWxpZCBwYXJhbXMpIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCRGVsZXRlICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VDQUJEZWxldGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgOCwgOSwgMTAgXSwKICAgIH0sCgogICAgIyBhZGQgY2hhbmdlIGFuZCB1cGRhdGUgY2hhbmdlc3RhdGVpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IHNldHRpbmcgbmV3IENoYW5nZVN0YXRlSUQgaW4gQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVqZWN0ZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVqZWN0ZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDI5LCAzNSBdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgQ2hhbmdlcyBmb3IgJ09yZGVyQnknIHNlYXJjaCB0ZXN0cwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCgogICAgIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2UgZm9yICdPcmRlckJ5JyB0ZXN0cyAoMSkuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtzdWNjZXNzZnVsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQWRkQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDA5LTEwLTAxIDAxOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVOYW1lMklEe3N1Y2Nlc3NmdWx9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlTZWFyY2hUZXN0JywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hhbmdlIGZvciAnT3JkZXJCeScgdGVzdHMgKDIpLiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtyZWplY3RlZH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQWRkQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDA5LTEwLTMwIDAxOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICcyMDA5LTEwLTMwIDAxOjAwOjE1JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVOYW1lMklEe3JlamVjdGVkfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIExhYmVsID0+ICdPcmRlckJ5U2VhcmNoVGVzdCcsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoYW5nZSBmb3IgJ09yZGVyQnknIHRlc3RzICgzKS4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7ZmFpbGVkfSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ09yZGVyQnlDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUFkZENoYW5nZVRpbWUgPT4gewogICAgICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAwOS0wMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZUNoYW5nZVRpbWUgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAwOS0wMS0zMCAyMzo1OTo1OScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtmYWlsZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbNl0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnT3JkZXJCeVNlYXJjaFRlc3QnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBDaGFuZ2UgZm9yIFBlcm1pc3Npb24gdGVzdHMuCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoYW5nZSBmb3IgJ1Blcm1pc3Npb24nIHRlc3RzLiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnUGVybWlzc2lvbiAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdQZXJtaXNzaW9uIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgICAgICBMYWJlbCAgICAgID0+ICdQZXJtaXNzaW9uVGVzdCcsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIHBlcm1pc3Npb24gdGVzdHMKICAgIH0sCgogICAgIyBDaGFuZ2UgZm9yIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0IHRlc3RzLgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2UgZm9yICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCcgdGVzdHMuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgICAgICBMYWJlbCAgICAgID0+ICdQb3NzaWJsZVN0YXRlc1Rlc3QnLCAgICAjIGNoYW5nZSBmb3IgdGVzdGluZyBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpCiAgICB9LAoKICAgICMgQ2hhbmdlIGZvciBhdHRhY2htZW50IHRlc3RzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZSBmb3IgYXR0YWNobWVudCB0ZXN0cycsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQXR0YWNobWVudHMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQXR0YWNobWVudHMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbNl0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnQXR0YWNobWVudCcsCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGV4ZWN1dGUgdGhlIGdlbmVyYWwgY2hhbmdlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVUZXN0ZWRDaGFuZ2VJRDsgICAgICAgICAgICMgY2hhbmdlIGlkcyBvZiBjcmVhdGVkIGNoYW5nZXMKbXkgJUNoYW5nZUlERm9yU2VhcmNoVGVzdDsgICAgIyBjaGFuZ2UgaWRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGJ5IGEgc2VhcmNoIHRlc3QKbXkgJUxhYmVsMkNoYW5nZUlEczsgICAgICAgICAgIyBjaGFuZ2UgaWRzIHRoYXQgYXJlIHVzZWQgZm9yIHNwZWNpYWwgdGVzdHMKClRFU1Q6CmZvciBteSAkVGVzdCAoQENoYW5nZVRlc3RzKSB7CgogICAgIyBjaGVjayBTb3VyY2VEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VEYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VEYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QgKHRlc3QgY2FzZTogIgogICAgICAgICAgICAgICAgLiAoICRUZXN0Q291bnQgLSAkVGVzdENvdW50TWlzYyApIC4gIikuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBwcmludCB0ZXN0IGNhc2UgZGVzY3JpcHRpb24KICAgIGlmICggJFRlc3QtPntEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRUZXN0LT57RGVzY3JpcHRpb259ICh0ZXN0IGNhc2U6ICIKICAgICAgICAgICAgICAgIC4gKCAkVGVzdENvdW50IC0gJFRlc3RDb3VudE1pc2MgKSAuICIpLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4dHJhY3QgdGVzdCBkYXRhCiAgICBteSAkU291cmNlRGF0YSAgICA9ICRUZXN0LT57U291cmNlRGF0YX07CiAgICBteSAkUmVmZXJlbmNlRGF0YSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgIyB0aGUgY2hhbmdlIGlkIHdpbGwgYmUgdXNlZCBmb3Igc2V2ZXJhbCBjYWxscwogICAgbXkgJENoYW5nZUlEOwoKICAgICMgYWRkIGEgbmV3IENoYW5nZQogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUFkZH0gKSB7CgogICAgICAgICMgYWRkIHRoZSBjaGFuZ2UKICAgICAgICAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyByZW1lbWJlciBjdXJyZW50IENoYW5nZUlECiAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewoKICAgICAgICAgICAgJFRlc3RlZENoYW5nZUlEeyRDaGFuZ2VJRH0gPSAxOwoKICAgICAgICAgICAgIyBzYXZlIGNoYW5nZWlkIGZvciB1c2UgaW4gc2VhcmNoIHRlc3RzCiAgICAgICAgICAgIGlmICggZXhpc3RzICRUZXN0LT57U2VhcmNoVGVzdH0gKSB7CiAgICAgICAgICAgICAgICBteSBAU2VhcmNoVGVzdHMgPSBAeyAkVGVzdC0+e1NlYXJjaFRlc3R9IH07CgogICAgICAgICAgICAgICAgZm9yIG15ICRTZWFyY2hUZXN0TnIgKEBTZWFyY2hUZXN0cykgewogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VJREZvclNlYXJjaFRlc3R7JFNlYXJjaFRlc3ROcn0tPnskQ2hhbmdlSUR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIGNoYW5nZWlkIGZvciBzcGVjaWFsIHRlc3RzCiAgICAgICAgICAgIGlmICggZXhpc3RzICRUZXN0LT57TGFiZWx9ICkgewogICAgICAgICAgICAgICAgJExhYmVsMkNoYW5nZUlEc3sgJFRlc3QtPntMYWJlbH0gfSB8fD0gW107CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRMYWJlbDJDaGFuZ2VJRHN7ICRUZXN0LT57TGFiZWx9IH0gfSwgJENoYW5nZUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoYW5nZSBDcmVhdGVUaW1lCiAgICAgICAgaWYgKCAkQ2hhbmdlSUQgJiYgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGRDaGFuZ2VUaW1lfSApIHsKICAgICAgICAgICAgU2V0VGltZXMoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFNvdXJjZURhdGEtPntDaGFuZ2VBZGRDaGFuZ2VUaW1lfS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBVc2VySUQgaXMgdGhlIG9ubHkgcmVxdWlyZWQgcGFyYW1ldGVyCiAgICAgICAgaWYgKCAhJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9LT57VXNlcklEfSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlQWRkKCkgLSBEb24ndCBhZGQgY2hhbmdlIHdpdGhvdXQgZ2l2ZW4gVXNlcklELiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFRlc3QtPntGYWlsc30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZUFkZCgpIC0gQWRkIGNoYW5nZSBzaG91bGQgZmFpbC4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtIEFkZCBjaGFuZ2UuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9ICAgICMgZW5kIGlmICdDaGFuZ2VBZGQnCgogICAgaWYgKCBleGlzdHMgJFNvdXJjZURhdGEtPntDaGFuZ2VVcGRhdGV9ICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VVcGRhdGV9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGFuZ2UgQ2hhbmdlVGltZQogICAgICAgIGlmICggJENoYW5nZUlEICYmICRTb3VyY2VEYXRhLT57Q2hhbmdlVXBkYXRlQ2hhbmdlVGltZX0gKSB7CiAgICAgICAgICAgIFNldFRpbWVzKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICRTb3VyY2VEYXRhLT57Q2hhbmdlVXBkYXRlQ2hhbmdlVGltZX0tPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFRlc3QtPntGYWlsc30KICAgICAgICAgICAgfHwgJFRlc3QtPntVcGRhdGVGYWlsc30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VVcGRhdGVTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgQ2hhbmdlVXBkYXRlCgogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUNBQlVwZGF0ZX0gJiYgJENoYW5nZUlEICkgewogICAgICAgIG15ICRDQUJVcGRhdGVTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0FCVXBkYXRlKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZUNBQlVwZGF0ZX0gfSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VDQUJVcGRhdGVGYWlsfSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENBQlVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VDQUJVcGRhdGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ0FCVXBkYXRlU3VjY2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUNBQlVwZGF0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSAgICAjIGVuZCBpZiAnQ2hhbmdlQ0FCVXBkYXRlJwoKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VDQUJEZWxldGV9ICYmICRDaGFuZ2VJRCApIHsKICAgICAgICBteSAlQ0FCRGVsZXRlUGFyYW1zID0gKAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBmYWlsIHRlc3RzCiAgICAgICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUNBQkRlbGV0ZUZhaWx9ICkgewoKICAgICAgICAgICAgIyB0ZXN0IHZvaWQgY29udGV4dAogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDQUJEZWxldGUoKSB8fCAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQ0FCRGVsZXRlIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBEZWxldGVUZXN0cyA9ICgKICAgICAgICAgICAgICAgIHsgVXNlcklEICAgPT4gMSB9LAogICAgICAgICAgICAgICAgeyBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRGYWlsVGVzdCAoQERlbGV0ZVRlc3RzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0FCRGVsZXRlKCAleyRGYWlsVGVzdH0gKSB8fCAwLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUNBQkRlbGV0ZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBEZWxldGUgd2l0aCBhbGwgcGFyYW1zCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0FCRGVsZXRlKCVDQUJEZWxldGVQYXJhbXMpLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQ0FCRGVsZXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9ICAgICMgZW5kIGlmICdDaGFuZ2VDQUJEZWxldGUnCgogICAgIyBhZGQgYSB3b3Jrb3JkZXIKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9ICkgewogICAgICAgIG15ICRXb3JrT3JkZXJJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJBZGQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYSBjaGFuZ2UgYW5kIGNvbXBhcmUgdGhlIHJldHJpZXZlZCBkYXRhIHdpdGggdGhlIHJlZmVyZW5jZQogICAgaWYgKCBleGlzdHMgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewoKICAgICAgICBteSAkQ2hhbmdlR2V0UmVmZXJlbmNlRGF0YSA9ICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fTsKCiAgICAgICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZUdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJENoYW5nZUF0dHJpYnV0ZXMgKHF3KENoYW5nZUlEIENoYW5nZU51bWJlciBDaGFuZ2VCdWlsZGVySUQgQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VEYXRhLT57JENoYW5nZUF0dHJpYnV0ZXN9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gaGFzICRDaGFuZ2VBdHRyaWJ1dGVzLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUdldH0gfSApIHsKCiAgICAgICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKSBhbmQgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENoYW5nZURhdGEtPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwogICAgICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CiAgICAgICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ0NoYW5nZUdldCcKCiAgICBpZiAoICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlQ0FCR2V0fSApIHsKICAgICAgICBteSAkQ0FCRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNBQkdldCgKICAgICAgICAgICAgJXsgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VDQUJHZXR9IH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUNBQkdldH0gfSApIHsKCiAgICAgICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKSBhbmQgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENBQkRhdGEtPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwogICAgICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlQ0FCR2V0fS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CiAgICAgICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQ0FCR2V0ICggJFJlcXVlc3RlZEF0dHJpYnV0ZSApIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9ICAgICMgZW5kIGlmICdDaGFuZ2VDQUJHZXQnCgogICAgIyB0ZXN0IGhpc3RvcnkgZW50cmllcwogICAgaWYgKCAkUmVmZXJlbmNlRGF0YS0+e0hpc3RvcnlHZXR9ICkgewoKICAgICAgICAjIGdldCBzdWJ0cmVlCiAgICAgICAgbXkgJENoZWNrRGF0YSA9ICRSZWZlcmVuY2VEYXRhLT57SGlzdG9yeUdldH07CgogICAgICAgICMgZ2V0IGFsbCBoaXN0b3J5IGVudHJpZXMKICAgICAgICBteSAkSGlzdG9yeUVudHJpZXMgPSAkSGlzdG9yeU9iamVjdC0+Q2hhbmdlSGlzdG9yeUdldCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICVIaXN0b3J5VHlwZTJDaGVja0luZGV4OwoKICAgICAgICAjIGNoZWNrIGhpc3RvcnkgZW50cmllcwogICAgICAgIEhJU1RPUllFTlRSWToKICAgICAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoIEB7JEhpc3RvcnlFbnRyaWVzfSApIHsKICAgICAgICAgICAgbXkgJEhpc3RvcnlUeXBlID0gJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfTsKICAgICAgICAgICAgbXkgJERhdGFGb3JUeXBlID0gJENoZWNrRGF0YS0+eyRIaXN0b3J5VHlwZX07CgogICAgICAgICAgICBpZiAoICRIaXN0b3J5VHlwZSBlcSAnQ2hhbmdlQWRkJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30sCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIENoYW5nZUFkZCBoaXN0b3J5IGVudHJ5ICIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEhpc3RvcnlUeXBlIGVxICdDaGFuZ2VVcGRhdGUnIHx8ICRIaXN0b3J5VHlwZSBlcSAnQ2hhbmdlQ0FCVXBkYXRlJyApIHsKCiAgICAgICAgICAgICAgICBteSAkSW5kZXggICAgID0gJEhpc3RvcnlUeXBlMkNoZWNrSW5kZXh7JEhpc3RvcnlUeXBlfSsrOwogICAgICAgICAgICAgICAgbXkgJEZpZWxkbmFtZSA9ICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9OwoKICAgICAgICAgICAgICAgIG5leHQgSElTVE9SWUVOVFJZIGlmICEkRGF0YUZvclR5cGUtPnskRmllbGRuYW1lfTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnRPbGR9LAogICAgICAgICAgICAgICAgICAgICREYXRhRm9yVHlwZS0+eyRGaWVsZG5hbWV9LT5bJEluZGV4XS0+WzBdLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIENoYW5nZVVwZGF0ZSAtPiBDb250ZW50T2xkICIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30sCiAgICAgICAgICAgICAgICAgICAgJERhdGFGb3JUeXBlLT57JEZpZWxkbmFtZX0tPlskSW5kZXhdLT5bMV0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hlY2sgQ2hhbmdlVXBkYXRlIC0+IENvbnRlbnROZXcgZm9yICRGaWVsZG5hbWUiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKIyBnZXQgZXhlY3V0ZWQgZWFjaCBsb29wLCBldmVuIG9uIG5leHQKY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBmb3Igc3BlY2lhbCBDaGFuZ2VTZWFyY2ggKHdpdGggb3JkZXIgYnkgQ2hhbmdlTnVtYmVyKQojIGJ1ZyMgNTgyNSBodHRwOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTgyNQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCnsKCiAgICAjIGFkZCBhIG5ldyBjaGFuZ2Ugd2l0aCBDQUJDdXN0b21lciAkQ3VzdG9tZXJVc2VySURzWzJdCiAgICBteSAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdBQkMnLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnREVGJywKICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ1hZWicsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICBDQUJDdXN0b21lcnMgICAgPT4gWwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzJdLAogICAgICAgIF0sCiAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzFdLAogICAgKTsKCiAgICAjIHRlc3QgaWYgY2hhbmdlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAiVGVzdCAiCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gJyAtIGFkZGluZyBvZiBjaGFuZ2UgZm9yIHNwZWNpYWwgc2VhcmNoIHRlc3QgKHdpdGggb3JkZXIgYnkgQ2hhbmdlTnVtYmVyKScsCiAgICApOwoKICAgICMgc2VhcmNoIGZvciB0aGUgY2hhbmdlIGlkcwogICAgbXkgJENoYW5nZUlEcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDQUJDdXN0b21lcnMgICAgID0+IFsgJEN1c3RvbWVyVXNlcklEc1syXSBdLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydDaGFuZ2VOdW1iZXInXSwKICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbCiAgICAgICAgICAgICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgICdhcHByb3ZlZCcsCiAgICAgICAgICAgICdpbiBwcm9ncmVzcycsCiAgICAgICAgICAgICdwZW5kaW5nIHBpcicKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHNlYXJjaCByZXR1cm5lZCBhIHJlc3VsdAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENoYW5nZUlEcyAmJiByZWYgJENoYW5nZUlEcyBlcSAnQVJSQVknICYmIEB7JENoYW5nZUlEc30sCiAgICAgICAgIlRlc3QgIgogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICcgLSBzZWFyY2ggZm9yIENBQkN1c3RvbWVycywgc3BlY2lhbCBzZWFyY2ggdGVzdCAod2l0aCBvcmRlciBieSBDaGFuZ2VOdW1iZXIpJywKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2Ugd2FzIGZvdW5kCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZUlEcy0+WzBdLAogICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gJyAtIHNlYXJjaCBmb3IgQ0FCQ3VzdG9tZXJzLCBzcGVjaWFsIHNlYXJjaCB0ZXN0ICh3aXRoIG9yZGVyIGJ5IENoYW5nZU51bWJlcikgJywKICAgICk7CgogICAgIyBkZWxldGUgdGhlIENoYW5nZQogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHN1Y2Nlc3NmdWwgZGVsZXRpbmcKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVTdWNjZXNzLAogICAgICAgICJUZXN0ICIKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAnIC0gZGVsZXRpbmcgb2YgQ2hhbmdlSUQgJwogICAgICAgICAgICAuICRDaGFuZ2VJRAogICAgICAgICAgICAuICcgZm9yIHNwZWNpYWwgc2VhcmNoIHRlc3QgKHdpdGggb3JkZXIgYnkgQ2hhbmdlTnVtYmVyKScsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBmb3IgQ2hhbmdlTG9va3VwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICgkQ2hhbmdlTG9va3VwVGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7Q2hhbmdlTG9va3VwVGVzdH0gfHwgW10gfTsKCmlmICgkQ2hhbmdlTG9va3VwVGVzdENoYW5nZUlEKSB7CiAgICBteSAkQ2hhbmdlRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlTG9va3VwVGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIG15ICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJENoYW5nZURhdGEtPntDaGFuZ2VOdW1iZXJ9LAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZUlELAogICAgICAgICRDaGFuZ2VEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBDaGFuZ2VMb29rdXAgd2l0aCBDaGFuZ2VOdW1iZXIgJwogICAgICAgICAgICAuICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSAuICcgc3VjY2Vzc2Z1bC4nLAogICAgKTsKCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlTG9va3VwKAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VMb29rdXBUZXN0Q2hhbmdlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2hhbmdlTnVtYmVyLAogICAgICAgICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogQ2hhbmdlTG9va3VwIHdpdGggQ2hhbmdlSUQgJENoYW5nZUxvb2t1cFRlc3RDaGFuZ2VJRCBzdWNjZXNzZnVsLiIsCiAgICApOwoKICAgICMgbm93IHNvbWUgcGFyYW0gY2hlY2tzIGZvciBDaGFuZ2VMb29rdXAoKQogICAgbXkgJExvb2t1cE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlTG9va3VwKCBVc2VySUQgPT4gMSApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkTG9va3VwT2ssCiAgICAgICAgJ09ubHkgYW4gdW51c2VkIHBhcmFtIHBhc3NlZCB0byBDaGFuZ2VMb29rdXAoKScsCiAgICApOwoKICAgICRMb29rdXBPayA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUxvb2t1cCgpOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkTG9va3VwT2ssCiAgICAgICAgJ05vIHBhcmFtIHBhc3NlZCB0byBDaGFuZ2VMb29rdXAoKScsCiAgICApOwoKICAgICRMb29rdXBPayA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUxvb2t1cFRlc3RDaGFuZ2VJRCwKICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJENoYW5nZURhdGEtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJExvb2t1cE9rLAogICAgICAgICdFeGNsdXNpdmUgcGFyYW1zIHBhc3NlZCB0byBDaGFuZ2VMb29rdXAoKScsCiAgICApOwp9CgojIHRlc3QgaWYgQ2hhbmdlTGlzdCByZXR1cm5zIGF0IGxlYXN0IGFzIG1hbnkgY2hhbmdlcyBhcyB3ZSBjcmVhdGVkCiMgd2UgY2Fubm90IHRlc3QgZm9yIGEgc3BlY2lmaWMgbnVtYmVyIGFzIHRoZXNlIHRlc3RzIGNhbiBiZSBydW4gaW4gZXhpc3RpbmcgZW52aXJvbm1lbnRzCiMgd2hlcmUgb3RoZXIgY2hhbmdlcyBhbHJlYWR5IGV4aXN0Cm15ICRDaGFuZ2VMaXN0ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlTGlzdCggVXNlcklEID0+IDEgKSB8fCBbXTsKbXkgJUNoYW5nZUxpc3RNYXAgPSBtYXAgeyAkXyA9PiAxIH0gQHskQ2hhbmdlTGlzdH07CgojIGNoZWNrIHdoZXRoZXIgdGhlIGNyZWF0ZWQgY2hhbmdlcyB3ZXJlIGZvdW5kIGJ5IENoYW5nZUxpc3QoKQpmb3IgbXkgJEtleVRlc3RlZENoYW5nZUlEICggc29ydCBrZXlzICVUZXN0ZWRDaGFuZ2VJRCApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VMaXN0TWFweyRLZXlUZXN0ZWRDaGFuZ2VJRH0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IENoYW5nZUxpc3QoKSAtIENoYW5nZUlEICRLZXlUZXN0ZWRDaGFuZ2VJRCBpbiBsaXN0LiIsCiAgICApOwp9CgojIGNvdW50IGFsbCB0ZXN0cyB0aGF0IGFyZSByZXF1aXJlZCB0byBhbmQgcGxhbm5lZCBmb3IgZmFpbApteSAkRmFpbHMgPSBzY2FsYXIgZ3JlcCB7ICRfLT57RmFpbHN9IH0gQENoYW5nZVRlc3RzOwpteSAkTnJDcmVhdGVDaGFuZ2VzID0gKCBzY2FsYXIgQENoYW5nZVRlc3RzICkgLSAkRmFpbHM7CgojIHRlc3QgaWYgdGhlIGNoYW5nZXMgd2VyZSBjcmVhdGVkCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICVUZXN0ZWRDaGFuZ2VJRCB8fCAwLAogICAgJE5yQ3JlYXRlQ2hhbmdlcywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBhbW91bnQgb2YgY2hhbmdlIG9iamVjdHMgYW5kIHRlc3QgY2FzZXMuJywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBjaGFuZ2Ugc2VhcmNoIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKbXkgQENoYW5nZVNlYXJjaFRlc3RzID0gKAoKICAgICMgTnIgMSAtIGEgc2ltcGxlIGNoZWNrIGlmIHRoZSBzZWFyY2ggZnVuY3Rpb25zIHRha2VzIGNhcmUgb2YgIkxpbWl0IgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdMaW1pdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBMaW1pdCA9PiAzLCAgICAjIGV4cGVjdCBvbmx5IDMgcmVzdWx0cwogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLCAgICAjIGZsYWcgZm9yIGNoZWNrIHJlc3VsdCBhbW91bnQKICAgICAgICAgICAgQ291bnQgICAgID0+IDMsICAgICMgY2hlY2sgb24gMyByZXN1bHRzCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyIC0gc2VhcmNoIGZvciBhbGwgY2hhbmdlcyBjcmVhdGVkIGJ5IG91ciBmaXJzdCB1c2VyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVRpdGxlLCBKdXN0aWZpY2F0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ0NoYW5nZSAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMyAtIHRlc3QgY3JlYXRldGltZW5ld2VyZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBFcG9jaCA9PiAkU3lzdGVtVGltZSAtICggNjAgKiA2MCApCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLT5Ub1N0cmluZygpLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQgLSB0ZXN0IGNyZWF0ZXRpbWVvbGRlcmRhdGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFN5c3RlbVRpbWUgKyAoIDYwICogNjAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1IC0gdGVzdCBDaGFuZ2VNYW5hZ2VySUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTWFuYWdlcklEJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgPT4gWyAkVXNlcklEc1swXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYgLSB0ZXN0IENoYW5nZUJ1aWxkZXJJRCBhbmQgQ2hhbmdlVGl0bGUgd2l0aCB3aWxkY2FyZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VCdWlsZGVySUQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEcyA9PiBbICRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDcgLSB0ZXN0IENoYW5nZU1hbmFnZXJJRCBhbmQgQ2hhbmdlQnVpbGRlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUJ1aWxkZXJJRCwgQ2hhbmdlTWFuYWdlcklEJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gWyAkVXNlcklEc1swXSBdLAogICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySURzID0+IFsgJEludmFsaWRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA4IC0gdGVzdCBDQUJBZ2VudAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDQUJBZ2VudCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDQUJBZ2VudHMgICA9PiBbICRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA5IC0gdGVzdCBDQUJDdXN0b21lcgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDQUJDdXN0b21lcicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWyAkQ3VzdG9tZXJVc2VySURzWzBdIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTAgLSB0ZXN0IENBQkFnZW50IGFuZCBDQUJDdXN0b21lcgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDQUJBZ2VudCwgQ0FCQ3VzdG9tZXInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+IFsgJFVzZXJJRHNbMF0gXSwKICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsgJEN1c3RvbWVyVXNlcklEc1sxXSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDExIC0gdGVzdCBKdXN0aWZpY2F0aW9uCiAgICAjIFRvQXNjaWkoKSBhZGRzIGFuIGV4dHJhIG5ld2xpbmUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSnVzdGlmaWNhdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKSicgLiAnJScgLiAiXG4iLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDEyIC0gdGVzdCBjaGFuZ2V0aW1lbmV3ZXJkYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVRpbWVOZXdlckRhdGUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIEVwb2NoID0+ICRTeXN0ZW1UaW1lIC0gKCA2MCAqIDYwICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICktPlRvU3RyaW5nKCksCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTMgLSB0ZXN0IGNoYW5nZXRpbWVvbGRlcmRhdGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFN5c3RlbVRpbWUgKyAoIDYwICogNjAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxNCAtIENoYW5nZVRpdGxlIHdpdGggd2lsZGNhcmQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlVGl0bGUgd2l0aCB3aWxkY2FyZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAoICdUJyB4IDI1MCApIC4gJyUnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE1IC0gRGVzY3JpcHRpb24gd2l0aCB3aWxkY2FyZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdEZXNjcmlwdGlvbiB3aXRoIHdpbGRjYXJkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICggJ0QnIHggMjUwICkgLiAnJScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTYgLSBKdXN0aWZpY2F0aW9uIHdpdGggd2lsZGNhcmQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSnVzdGlmaWNhdGlvbiB3aXRoIHdpbGRjYXJkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gKCAnSicgeCAyNTAgKSAuICclJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxNyAtIENoYW5nZVRpdGxlLCBEZXNjcmlwdGlvbiwgSnVzdGlmaWNhdGlvbiB3aXRoIHdpbGRjYXJkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVRpdGxlLCBEZXNjcmlwdGlvbiwgSnVzdGlmaWNhdGlvbiB3aXRoIHdpbGRjYXJkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gKCAnVCcgeCAyNTAgKSAuICclJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAoICdEJyB4IDI1MCApIC4gJyUnLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICggJ0onIHggMjUwICkgLiAnJScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTggLSBDaGFuZ2VUaXRsZSB3aXRoICcwJwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2VUaXRsZSB3aXRoICcwJyIsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTkgLSBEZXNjcmlwdGlvbiB3aXRoICcwJwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJEZXNjcmlwdGlvbiB3aXRoICcwJyIsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjAgLSBKdXN0aWZpY2F0aW9uIHdpdGggJzAnCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkp1c3RpZmljYXRpb24gd2l0aCAnMCciLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjEgLSBDaGFuZ2VUaXRsZSwgRGVzY3JpcHRpb24sIEp1c3RpZmljYXRpb24gd2l0aCAnMCcKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hhbmdlVGl0bGUsIERlc2NyaXB0aW9uLCBKdXN0aWZpY2F0aW9uIHdpdGggJzAnIiwKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJzAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcwJywKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjIgLSBDaGFuZ2VTdGF0ZUlECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlSUQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRHMgPT4gWyAkQ2hhbmdlU3RhdGVOYW1lMklEe3JlcXVlc3RlZH0gXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMyAtIENoYW5nZUJ1aWxkZXJJRAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VCdWlsZGVySUQgKHR3byBidWlsZGVycyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEcyA9PiBbICRVc2VySURzWzBdLCAkVXNlcklEc1sxXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI0IC0gQ2hhbmdlTWFuYWdlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU1hbmFnZXJJRCAodHdvIG1hbmFnZXIpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgPT4gWyAkVXNlcklEc1swXSwgJFVzZXJJRHNbMV0gXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyNSAtIENyZWF0ZUJ5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NyZWF0ZUJ5ICh0d28gY3JlYXRvcnMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFsgMSwgJFVzZXJJRHNbMF0gXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyNiAtIENoYW5nZUJ5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUJ5ICh0d28gY3JlYXRvcnMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsgMSwgJFVzZXJJRHNbMF0gXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyNyAtIHRlc3QgY2hhbmdldGltZW5ld2VyZGF0ZSBhbmQgY2hhbmdldGltZW9sZGVyZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VUaW1lTmV3ZXJEYXRlLCBDaGFuZ2VUaW1lT2xkZXJEYXRlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpbWVOZXdlckRhdGUgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBFcG9jaCA9PiAkU3lzdGVtVGltZSAtICggNjAgKiA2MCApCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLT5Ub1N0cmluZygpLAogICAgICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFN5c3RlbVRpbWUgKyAoIDYwICogNjAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOCAtIENoYW5nZVN0YXRlSUQgKHNhbWUgSUQgdGhyZWUgdGltZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlSUQgKHNhbWUgSUQgdGhyZWUgdGltZXMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOSAtIENoYW5nZVN0YXRlSUQgKHRocmVlIGRpZmZlcmVudCBJRHMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlSUQgKHRocmVlIGRpZmZlcmVudCBJRHMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7YXBwcm92ZWR9LAogICAgICAgICAgICAgICAgJENoYW5nZVN0YXRlTmFtZTJJRHtyZWplY3RlZH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzAgLSBVc2luZ1dpbGRjYXJkcyA9PiAwLCBDaGFuZ2VUaXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdVc2luZ1dpbGRjYXJkcyA9PiAwLCBDaGFuZ2VUaXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZS1Ob1dpbGRjYXJkcy0nLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICBDb3VudCAgICAgPT4gMCwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDMxIC0gVXNpbmdXaWxkY2FyZHMgPT4gMCwgRGVzY3JpcHRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVXNpbmdXaWxkY2FyZHMgPT4gMCwgRGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ1VuaXRUZXN0LUlUU01DaGFuZ2UtTm9XaWxkY2FyZHMtJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzMiAtIFVzaW5nV2lsZGNhcmRzID0+IDAsIERlc2NyaXB0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1VzaW5nV2lsZGNhcmRzID0+IDAsIERlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICROb1dpbGRjYXJkc1Rlc3RUaXRsZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzMyAtIENoYW5nZVN0YXRlIChuYW1lcywgbm90IElEcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGUgKG5hbWVzLCBub3QgSURzKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgPT4gWydyZXF1ZXN0ZWQnXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNCAtIENoYW5nZVN0YXRlIChzYW1lIG5hbWUgdGhyZWUgdGltZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlIChzYW1lIG5hbWUgdGhyZWUgdGltZXMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlcyA9PiBbcXcocmVxdWVzdGVkIHJlcXVlc3RlZCByZXF1ZXN0ZWQpXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNSAtIENoYW5nZVN0YXRlICh0aHJlZSBkaWZmZXJlbnQgbmFtZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlICh0aHJlZSBkaWZmZXJlbnQgbmFtZXMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlcyA9PiBbcXcocmVxdWVzdGVkIGFwcHJvdmVkIHJlamVjdGVkKV0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzYgLSBDaGFuZ2VTdGF0ZSAobm9uLWV4aXN0ZW50IHN0YXRlKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VTdGF0ZSAobm9uLWV4aXN0ZW50IHN0YXRlKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgPT4gW3F3KHJlcXVlc3RlZCBhcHByb3ZlZCByZWplY3RlZCBub24tZXhpc3RlbnQpXSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgMzcgLSBDaGFuZ2VTdGF0ZXMgKG5hbWVzIG5vdCBpZHMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlcyAobmFtZXMgbm90IGlkcykgLSBmYWlsZWQgKyByZXF1ZXN0ZWQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gID0+ICdDaGFuZ2VTdGF0ZXMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+IFtxdyhyZXF1ZXN0ZWQgZmFpbGVkKV0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzOCAtIENoYW5nZVN0YXRlcyAobmFtZXMgbm90IGlkcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIChuYW1lcyBub3QgaWRzKSAtIHBlbmRpbmcgYXBwcm92YWwnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gID0+ICdDaGFuZ2VTdGF0ZXMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+IFsncGVuZGluZyBhcHByb3ZhbCddLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzkgLSBDaGFuZ2VTdGF0ZSAobm9uLWV4aXN0ZW50IHN0YXRlIG9ubHkpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlIChub24tZXhpc3RlbnQgc3RhdGUpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlcyA9PiBbJ25vbi1leGlzdGVudCddLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA0MCAtIFNlYXJjaCBmb3IgYW4gaW52YWxpZCBjaGFuZ2Ugc3RhdGUgaWQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBhbiBpbnZhbGlkIGNoYW5nZSBzdGF0ZSBpZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEcyA9PiBbLTExXSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA0MSAtIFNlYXJjaCBmb3IgYW4gaW52YWxpZCBjaGFuZ2UgUmVxdWVzdGVkVGltZU9sZGVyRGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIGludmFsaWQgUmVxdWVzdGVkVGltZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlID0+ICdhbnl0aGluZycsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDQyIC0gU2VhcmNoIGZvciBhbiB2YWxpZCBjaGFuZ2UgUmVxdWVzdGVkVGltZU9sZGVyRGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIHZhbGlkIFJlcXVlc3RlZFRpbWUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUmVxdWVzdGVkVGltZU9sZGVyRGF0ZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQzIC0gU2VhcmNoIGZvciBhbiB2YWxpZCBjaGFuZ2UgUmVxdWVzdGVkVGltZU5ld2VyRGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIHZhbGlkIFJlcXVlc3RlZFRpbWUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUmVxdWVzdGVkVGltZU5ld2VyRGF0ZSA9PiAnMjAwOS0xMC0yOSAxMzozMzozMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQ0IC0gU2VhcmNoIGZvciBhbiBpbnZhbGlkIGNoYW5nZSBSZXF1ZXN0ZWRUaW1lTmV3ZXJEYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYW4gaW52YWxpZCBSZXF1ZXN0ZWRUaW1lJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVOZXdlckRhdGUgPT4gJ2FueXRoaW5nJywKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgNDUgLSBTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICA9PiAiVGl0bGUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQ2IC0gU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgdHJhaWxpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICA9PiAiVGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA0NyAtIFNlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgPT4gIlRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNDggLSBTZWFyY2ggZm9yIHBsYWluIGRlc2NyaXB0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcGxhaW4gZGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ1RoaXMgaXMgYm9sZCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNDkgLSBTZWFyY2ggZm9yIHBsYWluIGp1c3RpZmljYXRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBwbGFpbiBkZXNjcmlwdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBKdXN0aWZpY2F0aW9uICA9PiAnVGhpcyBpcyBib2xkIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1MCAtIFNlYXJjaCBmb3IgcGxhaW4ganVzdGlmaWNhdGlvbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHBsYWluIGRlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICdUaGlzIGlzIGJvbGQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgPT4gJ1RoaXMgaXMgYm9sZCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNTEgLSBTZWFyY2ggZm9yIGNhdGVnb3J5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2F0ZWdvcnknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcmllcyAgPT4gWycxIHZlcnkgbG93J10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDUyIC0gU2VhcmNoIGZvciBpbXBhY3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbXBhY3QnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSW1wYWN0cyAgICAgPT4gWycxIHZlcnkgbG93J10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDUzIC0gU2VhcmNoIGZvciBwcmlvcml0eQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHByaW9yaXR5JywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFByaW9yaXRpZXMgID0+IFsnMSB2ZXJ5IGxvdyddLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1NCAtIFNlYXJjaCBmb3IgY2F0ZWdvcmllcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNhdGVnb3JpZXMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcmllcyAgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycsICc1IHZlcnkgaGlnaCcgXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QlQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNTUgLSBTZWFyY2ggZm9yIGltcGFjdHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbXBhY3RzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIEltcGFjdHMgICAgID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnNSB2ZXJ5IGhpZ2gnIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU2IC0gU2VhcmNoIGZvciBwcmlvcml0aWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcHJpb3JpdGllcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBQcmlvcml0aWVzICA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JywgJzUgdmVyeSBoaWdoJyBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1NyAtIFNlYXJjaCBmb3IgY2F0ZWdvcnkgaWQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjYXRlZ29yeSBpZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yeUlEcyA9PiBbICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JzEgdmVyeSBsb3cnfSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1OCAtIFNlYXJjaCBmb3IgaW1wYWN0IGlkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW1wYWN0IGlkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIEltcGFjdElEcyAgID0+IFsgJENoYW5nZUltcGFjdE5hbWUySUR7JzEgdmVyeSBsb3cnfSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1OSAtIFNlYXJjaCBmb3IgcHJpb3JpdHkgaWQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBwcmlvcml0eSBpZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBQcmlvcml0eUlEcyA9PiBbICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzEgdmVyeSBsb3cnfSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2MCAtIFNlYXJjaCBmb3IgY2F0ZWdvcnkgaWRzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2F0ZWdvcnkgaWRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JzEgdmVyeSBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JzIgbG93J30sCiAgICAgICAgICAgICAgICAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeyc1IHZlcnkgaGlnaCd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2MSAtIFNlYXJjaCBmb3IgaW1wYWN0cwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGltcGFjdHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSW1wYWN0SURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VJbXBhY3ROYW1lMklEeycxIHZlcnkgbG93J30sCiAgICAgICAgICAgICAgICAkQ2hhbmdlSW1wYWN0TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VJbXBhY3ROYW1lMklEeyc1IHZlcnkgaGlnaCd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2MiAtIFNlYXJjaCBmb3IgcHJpb3JpdHkgaWRzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcHJpb3JpdHkgaWRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFByaW9yaXR5SURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzEgdmVyeSBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzIgbG93J30sCiAgICAgICAgICAgICAgICAkQ2hhbmdlUHJpb3JpdHlOYW1lMklEeyc1IHZlcnkgaGlnaCd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2MyAtIFNlYXJjaCBmb3IgQ0lQcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFsbCBDSVAgY29sdW1ucycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yaWVzICA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JyBdLAogICAgICAgICAgICBJbXBhY3RzICAgICA9PiBbJzMgbm9ybWFsJ10sCiAgICAgICAgICAgIFByaW9yaXRpZXMgID0+IFsnMyBub3JtYWwnXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QlQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNjQgLSBTZWFyY2ggZm9yIENJUCBpZHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBhbGwgQ0lQIGlkIGNvbHVtbnMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWwogICAgICAgICAgICAgICAgJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9LAogICAgICAgICAgICAgICAgJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wYWN0SURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VJbXBhY3ROYW1lMklEeyczIG5vcm1hbCd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBQcmlvcml0eUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkQ2hhbmdlUHJpb3JpdHlOYW1lMklEeyczIG5vcm1hbCd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2NSAtIFNlYXJjaCBmb3IgaW52YWxpZCBDSVBzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW52YWxpZCBDSVBzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENhdGVnb3JpZXMgID0+IFsnRm9vQmFyJ10sCiAgICAgICAgICAgIEltcGFjdHMgICAgID0+IFsnRm9vQmFyJ10sCiAgICAgICAgICAgIFByaW9yaXRpZXMgID0+IFsnRm9vQmFyJ10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgNjYgLSBTZWFyY2ggZm9yIGludmFsaWQgQ2F0ZWdvcmllcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGludmFsaWQgQ2F0ZWdvcmllcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yaWVzICA9PiBbJ0Zvb0JhciddLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDY3IC0gU2VhcmNoIGZvciBpbnZhbGlkIENJUHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbnZhbGlkIEltcGFjdHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSW1wYWN0cyAgICAgPT4gWydGb29CYXInXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QlQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA2OCAtIFNlYXJjaCBmb3IgaW52YWxpZCBQcmlvcml0aWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW52YWxpZCBDSVBzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFByaW9yaXRpZXMgID0+IFsnRm9vQmFyJ10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgNjkgLSBTZWFyY2ggZm9yIGNoYW5nZSBkeW5hbWljIGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBkeW5hbWljIGZpZWxkcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdBQUFBJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAnQkJCQicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA3MCAtIFNlYXJjaCBmb3IgY2hhbmdlIGR5bmFtaWMgZmllbGRzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2hhbmdlIGR5bmFtaWMgZmllbGRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiB7CiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ0dHR0cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdISEhIJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDcxIC0gU2VhcmNoIGZvciBjaGFuZ2UgZHluYW1pYyBmaWVsZHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UgZHluYW1pYyBmaWVsZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgYWRkIGNoYW5nZSB3aXRoIGR5bmFtaWMgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiB7CiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ0FBQUEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdCQkJCJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDcyIC0gU2VhcmNoIGZvciBjaGFuZ2UgYW5kIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBhbmQgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiB7CiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ0FBQUEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdCQkJCJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDEnID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAnVy1BQUFBJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnV29ya29yZGVyVGVzdDInID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAnVy1CQkJCJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgZ2V0IGEgc2FtcGxlIGNoYW5nZSB3ZSBjcmVhdGVkIGFib3ZlIGZvciBzb21lICdzcGVjaWFsJyB0ZXN0IGNhc2VzCm15ICgkU2VhcmNoVGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7U2VhcmNoVGVzdH0gfTsKbXkgJE5yT2ZHZW5lcmFsU2VhcmNoVGVzdHMgPSBzY2FsYXIgQENoYW5nZVNlYXJjaFRlc3RzOwoKaWYgKCRTZWFyY2hUZXN0Q2hhbmdlSUQpIHsKICAgIG15ICRTZWFyY2hUZXN0Q2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRTZWFyY2hUZXN0Q2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgcHVzaCBAQ2hhbmdlU2VhcmNoVGVzdHMsICgKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkU3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgICAgIENvdW50ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyICAgICAgICAgICAgICA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgICA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgICAgIENvdW50ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLCBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUsIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlJwogICAgICAgICAgICAgICAgLiAnLCBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLCBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIgd2l0aCB3aWxkY2FyZCcsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiBzdWJzdHIoICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwgMCwgMTAgKSAuICclJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIENoYW5nZVRpdGxlIHdpdGggd2lsZGNhcmQnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gc3Vic3RyKCAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sIDAsIDEwICkgLiAnJScsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgPT4gc3Vic3RyKCAkU2VhcmNoVGVzdENoYW5nZS0+e1RpdGxlfSwgICAgICAgIDAsIDEgKSAuICclJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIHR3byBjcmVhdG9ycycsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgPT4gWyAkU2VhcmNoVGVzdENoYW5nZS0+e0NyZWF0ZUJ5fSwgJFNlYXJjaFRlc3RDaGFuZ2UtPntDcmVhdGVCeX0gKyAxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciAod2l0aCB3aWxkY2FyZCksIHR3byBjcmVhdG9ycycsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiBzdWJzdHIoICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwgMCwgMTAgKSAuICclJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICA9PiBbICRTZWFyY2hUZXN0Q2hhbmdlLT57Q3JlYXRlQnl9LCAkU2VhcmNoVGVzdENoYW5nZS0+e0NyZWF0ZUJ5fSArIDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VUaXRsZSwgQ2hhbmdlTnVtYmVyLCB0d28gY3JlYXRvcnMnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+IFsgJFNlYXJjaFRlc3RDaGFuZ2UtPntDcmVhdGVCeX0sICRTZWFyY2hUZXN0Q2hhbmdlLT57Q3JlYXRlQnl9ICsgMSBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgID0+IHN1YnN0ciggJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VUaXRsZX0sIDAsIDEgKSAuICclJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgICAgIENvdW50ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyICAgICAgICAgICA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsRW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0FjdHVhbEVuZFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSwgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxFbmRUaW1lfSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0FjdHVhbFN0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlLCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsU3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJE5yT2ZBbGxTZWFyY2hUZXN0cyA9IHNjYWxhciBAQ2hhbmdlU2VhcmNoVGVzdHM7CgogICAgZm9yIG15ICRUZXN0TnVtYmVyICggKCAkTnJPZkdlbmVyYWxTZWFyY2hUZXN0cyArIDEgKSAuLiAkTnJPZkFsbFNlYXJjaFRlc3RzICkgewogICAgICAgICRDaGFuZ2VJREZvclNlYXJjaFRlc3R7JFRlc3ROdW1iZXJ9LT57ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlSUR9IH0gPSAxOwogICAgfQp9CgpteSAkU2VhcmNoVGVzdENvdW50ID0gMTsKClNFQVJDSFRFU1Q6CmZvciBteSAkVGVzdCAoQENoYW5nZVNlYXJjaFRlc3RzKSB7CgogICAgIyBjaGVjayBTZWFyY2hEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTZWFyY2hEYXRhfSB8fCByZWYoICRUZXN0LT57U2VhcmNoRGF0YX0gKSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlYXJjaERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgU0VBUkNIVEVTVDsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJDaGFuZ2VTZWFyY2goKSB3aXRoIHBhcmFtczogJFRlc3QtPntEZXNjcmlwdGlvbn0gKFNlYXJjaFRlc3RDYXNlOiAkU2VhcmNoVGVzdENvdW50KSIsCiAgICApOwoKICAgICMgZ2V0IGEgcmVmIHRvIGFuIGFycmF5IG9mIGZvdW5kIGlkcwogICAgbXkgJENoYW5nZUlEcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGEgY291bnQgb2YgZm91bmQgaWRzCiAgICBteSAkQ291bnRDaGFuZ2VJRHMgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJFRlc3QtPntTZWFyY2hEYXRhfSB9LAogICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U2VhcmNoRmFpbHN9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCgkQ2hhbmdlSURzKSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlU2VhcmNoKCkgaXMgZXhwZWN0ZWQgdG8gZmFpbCAoUmVzdWx0ID0+ICdBUlJBWScpIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCgkQ291bnRDaGFuZ2VJRHMpLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSBpcyBleHBlY3RlZCB0byBmYWlsIChSZXN1bHQgPT4gJ0NPVU5UJykiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCgkQ2hhbmdlSURzKSAmJiByZWYgJENoYW5nZUlEcyBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBhcnJheSByZWZlcmVuY2UgZm9yIENoYW5nZUlEcy4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGRlZmluZWQoJENvdW50Q2hhbmdlSURzKSAmJiByZWYgJENvdW50Q2hhbmdlSURzIGVxICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBzY2FsYXIgZm9yIENvdW50Q2hhbmdlSURzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkQ2hhbmdlSURzIHx8PSBbXTsKICAgICRDb3VudENoYW5nZUlEcyB8fD0gMDsKCiAgICBpZiAoICRUZXN0LT57UmVzdWx0RGF0YX0tPntUZXN0Q291bnR9ICkgewoKICAgICAgICAjIGdldCBudW1iZXIgb2YgY2hhbmdlIGlkcyBDaGFuZ2VTZWFyY2ggc2hvdWxkIHJldHVybgogICAgICAgIG15ICRFeHBlY3RlZENvdW50ID0gc2NhbGFyIGtleXMgJXsgJENoYW5nZUlERm9yU2VhcmNoVGVzdHskU2VhcmNoVGVzdENvdW50fSB9OwoKICAgICAgICAjIGdldCBkZWZpbmVkIGV4cGVjdGVkIHJlc3VsdCBjb3VudCAoZGVmaW5lZCBpbiBzZWFyY2ggdGVzdCBjYXNlISkKICAgICAgICBpZiAoIGV4aXN0cyAkVGVzdC0+e1Jlc3VsdERhdGF9LT57Q291bnR9ICkgewogICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCA9ICRUZXN0LT57UmVzdWx0RGF0YX0tPntDb3VudH07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBudW1iZXIgb2YgSURzIGluIHRoZSByZXR1cm5lZCBhcnJheXJlZgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7JENoYW5nZUlEc30sCiAgICAgICAgICAgICRFeHBlY3RlZENvdW50LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBOdW1iZXIgb2YgZm91bmQgY2hhbmdlcyAoUmVzdWx0ID0+ICdBUlJBWScpLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBXaGVuIGEgJ0xpbWl0JyBoYXMgYmVlbiBwYXNzZWQsIHRoZW4gdGhlIHJldHVybmVkIGNvdW50IG5vdCBuZWNlc3NhcmlseSBtYXRjaGVzCiAgICAgICAgIyB0aGUgbnVtYmVyIG9mIElEcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuIEluIHRoYXQgY2FzZSB0ZXN0aW5nIGlzIGZ1dGlsZS4KICAgICAgICBpZiAoICEkVGVzdC0+e1NlYXJjaERhdGF9LT57TGltaXR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ291bnRDaGFuZ2VJRHMsCiAgICAgICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIE51bWJlciBvZiBmb3VuZCBjaGFuZ2VzIChSZXN1bHQgPT4gJ0NPVU5UJykuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkVGVzdC0+e1Jlc3VsdERhdGF9LT57VGVzdEV4aXN0ZW5jZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgYWxsIGlkcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBzZWFyY2h0ZXN0IGFyZSByZXR1cm5lZAogICAgICAgIG15IEBDaGFuZ2VJRHMgPSBrZXlzICV7ICRDaGFuZ2VJREZvclNlYXJjaFRlc3R7JFNlYXJjaFRlc3RDb3VudH0gfTsKICAgICAgICBteSAlUmV0dXJuZWRDaGFuZ2VJRCA9IG1hcCB7ICRfID0+IDEgfSBAeyRDaGFuZ2VJRHN9OwogICAgICAgIGZvciBteSAkQ2hhbmdlSUQgKEBDaGFuZ2VJRHMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmV0dXJuZWRDaGFuZ2VJRHskQ2hhbmdlSUR9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlSUQgJENoYW5nZUlEIGZvdW5kIGluIHJldHVybmVkIGxpc3QuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwogICAgJFNlYXJjaFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGNoYW5nZSBzZWFyY2ggdGVzdHMgZm9yICdPcmRlckJ5JyBzZWFyY2hlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0aHJlZSBjaGFuZ2UgaWRzLiBUaGVuIGdldCB0aGUgZGF0YS4gVGhhdCBpcyBuZWVkZWQgZm9yIHNvcnRpbmcKbXkgQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlSURzID0gQHsgJExhYmVsMkNoYW5nZUlEc3tPcmRlckJ5U2VhcmNoVGVzdH0gfTsKbXkgQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlczsKCmZvciBteSAkQ2hhbmdlSURGb3JPcmRlckJ5VGVzdHMgKEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZUlEcykgewogICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlERm9yT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkQ2hhbmdlRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlcywgJENoYW5nZURhdGE7Cn0KCm15IEBPcmRlckJ5Q29sdW1ucyA9IHF3KAogICAgQ2hhbmdlSUQKICAgIENoYW5nZU51bWJlcgogICAgQ2hhbmdlVGl0bGUKICAgIENoYW5nZVN0YXRlSUQKICAgIENoYW5nZU1hbmFnZXJJRAogICAgQ2hhbmdlQnVpbGRlcklECiAgICBDcmVhdGVCeQogICAgQ2hhbmdlQnkKICAgIENyZWF0ZVRpbWUKICAgIENoYW5nZVRpbWUKICAgIFBsYW5uZWRTdGFydFRpbWUKICAgIFBsYW5uZWRFbmRUaW1lCiAgICBBY3R1YWxTdGFydFRpbWUKICAgIEFjdHVhbEVuZFRpbWUKKTsKCmZvciBteSAkT3JkZXJCeUNvbHVtbiAoQE9yZGVyQnlDb2x1bW5zKSB7CgogICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICBteSBAU29ydGVkQ2hhbmdlczsKICAgIGlmICggJE9yZGVyQnlDb2x1bW4gPX4gbXsgXEEgKCBDaGFuZ2VUaXRsZSB8IC4rIFRpbWUgKSBceiB9eG1zICkgewogICAgICAgIEBTb3J0ZWRDaGFuZ2VzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IGNtcCAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntDaGFuZ2VJRH0gPD0+ICRhLT57Q2hhbmdlSUR9CiAgICAgICAgfSBAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFNvcnRlZENoYW5nZXMgPSBzb3J0IHsKICAgICAgICAgICAgJGEtPnskT3JkZXJCeUNvbHVtbn0gPD0+ICRiLT57JE9yZGVyQnlDb2x1bW59CiAgICAgICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICB9IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZXM7CiAgICB9CiAgICBteSBAU29ydGVkSURzID0gbWFwIHsgJF8tPntDaGFuZ2VJRH0gfSBAU29ydGVkQ2hhbmdlczsKCiAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgIG15ICRSZWZlcmVuY2VMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzICk7ICAgICMjIG5vIGNyaXRpYwoKICAgIG15ICRTZWFyY2hSZXN1bHQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJE9yZGVyQnlDb2x1bW5dLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgbXkgJFNlYXJjaExpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0KTsgICAgICAgIyMgbm8gY3JpdGljCgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkuIgogICAgKTsKCiAgICBteSBAU29ydGVkQ2hhbmdlc0Rvd247CiAgICBpZiAoICRPcmRlckJ5Q29sdW1uID1+IG17IFxBICggQ2hhbmdlVGl0bGUgfCAuKyBUaW1lICkgXHogfXhtcyApIHsKICAgICAgICBAU29ydGVkQ2hhbmdlc0Rvd24gPSBzb3J0IHsKICAgICAgICAgICAgJGItPnskT3JkZXJCeUNvbHVtbn0gY21wICRhLT57JE9yZGVyQnlDb2x1bW59CiAgICAgICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICB9IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZXM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAU29ydGVkQ2hhbmdlc0Rvd24gPSBzb3J0IHsKICAgICAgICAgICAgJGItPnskT3JkZXJCeUNvbHVtbn0gPD0+ICRhLT57JE9yZGVyQnlDb2x1bW59CiAgICAgICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICB9IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZXM7CiAgICB9CiAgICBteSBAU29ydGVkSURzRG93biA9IG1hcCB7ICRfLT57Q2hhbmdlSUR9IH0gQFNvcnRlZENoYW5nZXNEb3duOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3REb3duID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzRG93biApOyAgICAjIyBubyBjcml0aWMKCiAgICBteSAkU2VhcmNoUmVzdWx0RG93biA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpCiAgICBteSAkU2VhcmNoTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0RG93bik7ICAgICAgICMjIG5vIGNyaXRpYwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoTGlzdERvd24sCiAgICAgICAgJFJlZmVyZW5jZUxpc3REb3duLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChEb3duKS4iCiAgICApOwoKICAgICMgY2hlY2sgaWYgSVRTTUNoYW5nZS5wbSBoYW5kbGVzIG5vbi1leGlzdGVudCBPcmRlckJ5RGlyZWN0aW9uIGNyaXRlcmlhIGNvcnJlY3QKICAgIG15ICRTZWFyY2hSZXN1bHRTaWRld2F5cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFskT3JkZXJCeUNvbHVtbl0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ1NpZGV3YXlzJ10sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaFJlc3VsdFNpZGV3YXlzLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChTaWRld2F5cykuIgogICAgKTsKfQoKIyBjcmVhdGUgYW4gZXh0cmEgYmxvY2ssIGluIG9yZGVyIHRvIGxpbWl0IHNjb3BlIG9mIGxleGljYWxzCnsKCiAgICAjIGNoZWNrIGZvciAnT3JkZXJCeScgd2l0aCBub24tZXhpc3RlbnQgY29sdW1uCiAgICBteSAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICA9PiBbJ0Zvb0JhciddLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5IEZvb0JhciAoRG93bikuIgogICAgKTsKCiAgICAjIGNoZWNrIGZvciAnT3JkZXJCeScgd2l0aCBub24tZXhpc3RlbnQgY29sdW1uCiAgICBteSAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uRGlyZWN0aW9uID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJ09yZGVyQnlDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWydGb29CYXInXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnRm9vQmFyJ10sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaFJlc3VsdEZvb0JhckNvbHVtbkRpcmVjdGlvbiwKICAgICAgICB1bmRlZiwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgT3JkZXJCeSBGb29CYXIgKEZvb0JhcikuIgogICAgKTsKCiAgICAjIGNoZWNrIGZvciAnT3JkZXJCeScgd2l0aCBub24tZXhpc3RlbnQgY29sdW1uCiAgICBteSAkU2VhcmNoUmVzdWx0Rm9vQmFyRG91YmxlQ29sdW1uID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICA9PiBbICdDaGFuZ2VJRCcsICdDaGFuZ2VJRCcgXSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaFJlc3VsdEZvb0JhckRvdWJsZUNvbHVtbiwKICAgICAgICB1bmRlZiwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgRG91YmxlZCBPcmRlckJ5IEZvb0Jhci4iCiAgICApOwp9CgojIGNoYW5nZSB0aGUgY3JlYXRlIHRpbWUgZm9yIHRoZSBzZWNvbmQgdGVzdCBjYXNlIHdlIGRlZmluZWQgYWJvdmUgZm9yIHRoZSBvcmRlcmJ5IHRlc3RzCiMgd2UgZG8gdGhpcyB0byBoYXZlIHR3byBjaGFuZ2VzIHdpdGggdGhlIHNhbWUgY3JlYXRlIHRpbWUuIHRoaXMgaXMgbmVlZGVkIHRvIHRlc3QKIyB0aGUgJ29yZGVyYnknIHdpdGggdHdvIGNvbHVtbnMKU2V0VGltZXMoCiAgICBDaGFuZ2VJRCAgID0+ICggc29ydCBAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VJRHMgKVsxXSwKICAgIENyZWF0ZVRpbWUgPT4gJzIwMDktMTAtMDEgMDE6MDA6MDAnLAopOwoKbXkgQENoYW5nZXNGb3JTZWNvbmRPcmRlckJ5VGVzdHM7CmZvciBteSAkQ2hhbmdlSURGb3JTZWNvbmRPcmRlckJ5VGVzdHMgKEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZUlEcykgewogICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlERm9yU2Vjb25kT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkQ2hhbmdlRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQENoYW5nZXNGb3JTZWNvbmRPcmRlckJ5VGVzdHMsICRDaGFuZ2VEYXRhOwp9CgojIGNyZWF0ZSBhbiBleHRyYSBibG9jayBhcyB3ZSB1c2UgImxvY2FsIgp7CiAgICBteSBAU29ydGVkQ2hhbmdlcyA9IHNvcnQgewogICAgICAgICRhLT57Q3JlYXRlVGltZX0gPD0+ICRiLT57Q3JlYXRlVGltZX0gICAgICAgIyBjcmVhdGV0aW1lIGlzIHNvcnRlZCBhc2NlbmRpbmcKICAgICAgICAgICAgfHwgJGEtPntDaGFuZ2VJRH0gPD0+ICRiLT57Q2hhbmdlSUR9ICAgICMgY2hhbmdlaWQgaXMgc29ydGVkIGFzY2VuZGluZwogICAgfSBAQ2hhbmdlc0ZvclNlY29uZE9yZGVyQnlUZXN0czsKICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e0NoYW5nZUlEfSB9IEBTb3J0ZWRDaGFuZ2VzOwoKICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFsgJ0NyZWF0ZVRpbWUnLCAnQ2hhbmdlSUQnIF0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdVcCcsICdVcCcgXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgIG15ICRTZWFyY2hMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCk7ICAgICMjIG5vIGNyaXRpYwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHMgKTsgICAgIyMgbm8gY3JpdGljCgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5IENyZWF0ZVRpbWUgKERvd24pIGFuZCBDaGFuZ2VJRCAoVXApLiIKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBhZHZhbmNlZCBzZWFyY2ggYnkgdGVzdHMgZm9yIHRpbWVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRTVENoYW5nZVRpdGxlID0gJ1RpbWVTZWFyY2hUZXN0IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZTsKbXkgQFRTVENoYW5nZUlEczsKbXkgQFRpbWVTZWFyY2hUZXN0cyA9ICgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDItMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDQtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBwbGFubmVkIHN0YXJ0IHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIHRlc3QgZm9yIHBsYW5uZWQgZW5kIHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAxLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0yNyAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBhY3R1YWwgc3RhcnQgdGltZQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMCwgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBhY3R1YWwgZW5kIHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKKTsKCm15ICRUU1RDb3VudGVyID0gMTsKbXkgQFRTVFdvcmtPcmRlcklEczsKVFNURVNUOgpmb3IgbXkgJFRlc3QgKEBUaW1lU2VhcmNoVGVzdHMpIHsKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICBteSAkQ2hhbmdlSUQ7CiAgICBteSAkV29ya09yZGVySUQ7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkVGVzdC0+e0Rlc2NyaXB0aW9ufSAoVFNUZXN0IGNhc2U6ICRUU1RDb3VudGVyKSIsCiAgICApOwoKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9ICkgewogICAgICAgICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQWRkIiwKICAgICAgICApOwoKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKICAgICAgICAgICAgcHVzaCBAVFNUQ2hhbmdlSURzLCAkQ2hhbmdlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9ICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJBZGQiLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFRTVFdvcmtPcmRlcklEcywgJFdvcmtPcmRlcklEOwogICAgfQoKICAgIG15ICRTZWFyY2hSZXN1bHQ7CiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlU2VhcmNofSApIHsKICAgICAgICAkU2VhcmNoUmVzdWx0ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUU1RFU1QgaWYgISRTZWFyY2hSZXN1bHQ7CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGZvdW5kZWQgY2hhbmdlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgbWFwIGFycmF5IGluZGV4IHRvIENoYW5nZUlECiAgICAgICAgbXkgQFJlc3VsdENoYW5nZUlEczsKICAgICAgICBmb3IgbXkgJFJlc3VsdENoYW5nZUlEICggQHskUmVmZXJlbmNlRGF0YX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdENoYW5nZUlEcywgJFRTVENoYW5nZUlEc1skUmVzdWx0Q2hhbmdlSURdOwogICAgICAgIH0KCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZVNlYXJjaCgpIGFuZCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgIG15ICRTZWFyY2hSZXN1bHREdW1wID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIHNvcnQgQHskU2VhcmNoUmVzdWx0fSApOwogICAgICAgIG15ICRSZWZlcmVuY2VEdW1wICAgID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIHNvcnQgQFJlc3VsdENoYW5nZUlEcyApOwogICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VhcmNoUmVzdWx0RHVtcCwKICAgICAgICAgICAgJFJlZmVyZW5jZUR1bXAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZVNlYXJjaCgpOiAiCiAgICAgICAgICAgICAgICAuIERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gKSAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgICAgIC4gJFNlYXJjaFJlc3VsdER1bXAsCiAgICAgICAgKTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7CiAgICAkVFNUQ291bnRlcisrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgJ09yZGVyQnknIHRlc3RzIGZvciBDSVAgY29sdW1ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0aHJlZSBjaGFuZ2UgaWRzLiBUaGVuIGdldCB0aGUgZGF0YS4gVGhhdCBpcyBuZWVkZWQgZm9yIHNvcnRpbmcKbXkgQE9yZGVyQnlDSVBDaGFuZ2VJRHMgPSBAeyAkTGFiZWwyQ2hhbmdlSURze09yZGVyQnlDSVBUZXN0c30gfTsKbXkgQE9yZGVyQnlDSVBDaGFuZ2VzOwoKZm9yIG15ICRDaGFuZ2VJREZvck9yZGVyQnlDSVBUZXN0cyAoQE9yZGVyQnlDSVBDaGFuZ2VJRHMpIHsKICAgIG15ICRDaGFuZ2VEYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvck9yZGVyQnlDSVBUZXN0cywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBPcmRlckJ5Q0lQQ2hhbmdlcywgJENoYW5nZURhdGE7Cn0KCm15IEBPcmRlckJ5Q0lQQ29sdW1ucyA9IHF3KAogICAgQ2F0ZWdvcnlJRAogICAgSW1wYWN0SUQKICAgIFByaW9yaXR5SUQKKTsKCmZvciBteSAkQ0lQQ29sdW1uIChAT3JkZXJCeUNJUENvbHVtbnMpIHsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgIG15IEBTb3J0ZWRDaGFuZ2VzID0gc29ydCB7CiAgICAgICAgJGEtPnskQ0lQQ29sdW1ufSA8PT4gJGItPnskQ0lQQ29sdW1ufQogICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgIH0gQE9yZGVyQnlDSVBDaGFuZ2VzOwoKICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e0NoYW5nZUlEfSB9IEBTb3J0ZWRDaGFuZ2VzOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHMgKTsgICAgIyMgbm8gY3JpdGljCgogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICclQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRDSVBDb2x1bW5dLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgbXkgJFNlYXJjaExpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0KTsgICAgICAgIyMgbm8gY3JpdGljCgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRDSVBDb2x1bW4gKFVwKS4iCiAgICApOwoKICAgIG15IEBTb3J0ZWRDaGFuZ2VzRG93biA9IHNvcnQgewogICAgICAgICRiLT57JENJUENvbHVtbn0gPD0+ICRhLT57JENJUENvbHVtbn0KICAgICAgICAgICAgfHwgJGItPntDaGFuZ2VJRH0gPD0+ICRhLT57Q2hhbmdlSUR9CiAgICB9IEBPcmRlckJ5Q0lQQ2hhbmdlczsKCiAgICBteSBAU29ydGVkSURzRG93biA9IG1hcCB7ICRfLT57Q2hhbmdlSUR9IH0gQFNvcnRlZENoYW5nZXNEb3duOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3REb3duID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzRG93biApOyAgICAjIyBubyBjcml0aWMKCiAgICBteSAkU2VhcmNoUmVzdWx0RG93biA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnJUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICA9PiBbJENJUENvbHVtbl0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgbXkgJFNlYXJjaExpc3REb3duID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdERvd24pOyAgICAgICAjIyBubyBjcml0aWMKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaExpc3REb3duLAogICAgICAgICRSZWZlcmVuY2VMaXN0RG93biwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgT3JkZXJCeSAkQ0lQQ29sdW1uIChEb3duKS4iCiAgICApOwoKICAgICMgY2hlY2sgaWYgSVRTTUNoYW5nZS5wbSBoYW5kbGVzIG5vbi1leGlzdGVudCBPcmRlckJ5RGlyZWN0aW9uIGNyaXRlcmlhIGNvcnJlY3QKICAgIG15ICRTZWFyY2hSZXN1bHRTaWRld2F5cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICclQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRDSVBDb2x1bW5dLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydTaWRld2F5cyddLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hSZXN1bHRTaWRld2F5cywKICAgICAgICB1bmRlZiwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgT3JkZXJCeSAkQ0lQQ29sdW1uIChTaWRld2F5cykuIgogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGFkdmFuY2VkIHNlYXJjaCBieSB0ZXN0cyBmb3Igd29ya29yZGVyIHN0cmluZ3MgYW5kIGFnZW50IGlkCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgQFdPU3RyaW5nQW5kQWdlbnRTZWFyY2hUZXN0cyA9ICgKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0luc2VydCBjaGFuZ2Ugd2l0aCBvbmUgd29ya29yZGVyIGFuZCB3aXRoIHNldCBzdHJpbmcgZmllbGRzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdTdHJpbmcgVGVzdCAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJ1N0cmluZyBUZXN0IDEgLSBJbnN0cnVjdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgICA9PiAnU3RyaW5nIFRlc3QgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyVGl0bGUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnU3RyaW5nIFRlc3QgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFswXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vbi1leGlzdGluZyBXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdOT05FWElTVEVOVCBTdHJpbmcgVGVzdCAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgSW5zdHJ1Y3Rpb24nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJbnN0cnVjdGlvbiA9PiAnU3RyaW5nIFRlc3QgMSAtIEluc3RydWN0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFswXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vbi1leGlzdGluZyBXb3JrT3JkZXIgSW5zdHJ1Y3Rpb24nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJbnN0cnVjdGlvbiA9PiAnTk9ORVhJU1RFTlQgU3RyaW5nIFRlc3QgMSAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgUmVwb3J0JywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclJlcG9ydCA9PiAnU3RyaW5nIFRlc3QgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbMF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub24tZXhpc3RpbmcgV29ya09yZGVyIFJlcG9ydCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJSZXBvcnQgPT4gJ05PTkVYSVNURU5UIFN0cmluZyBUZXN0IDEgLSBSZXBvcnQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBleGlzdGluZyBXb3JrT3JkZXJBZ2VudElEJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRHMgPT4gWyAkVXNlcklEc1sxXSBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbMF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBleGlzdGluZyBhbmQgbm9uLWV4aXN0aW5nIFdvcmtPcmRlckFnZW50SUQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbIEBVc2VySURzWyAwLCAxIF0gXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWzBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uLWV4aXN0aW5nIFdvcmtPcmRlckFnZW50SUQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbICRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKKTsKCm15ICRXT1NUQ291bnRlciA9IDE7Cm15IEBXT1NUQ2hhbmdlSURzOyAgICAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCBjaGFuZ2UgaWRzCm15IEBXT1NUV29ya09yZGVySURzOyAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCB3b3Jrb3JkZXIgaWRzCldPU1RFU1Q6CmZvciBteSAkVGVzdCAoQFdPU3RyaW5nQW5kQWdlbnRTZWFyY2hUZXN0cykgewogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgIG15ICRDaGFuZ2VJRDsKICAgIG15ICRXb3JrT3JkZXJJRDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRUZXN0LT57RGVzY3JpcHRpb259IChXT1NUZXN0IGNhc2U6ICRXT1NUQ291bnRlcikiLAogICAgKTsKCiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSApIHsKICAgICAgICAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewogICAgICAgICAgICAkVGVzdGVkQ2hhbmdlSUR7JENoYW5nZUlEfSA9IDE7CiAgICAgICAgICAgIHB1c2ggQFdPU1RDaGFuZ2VJRHMsICRDaGFuZ2VJRDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gKSB7CiAgICAgICAgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gfSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAV09TVFdvcmtPcmRlcklEcywgJFdvcmtPcmRlcklEOwogICAgfQoKICAgIG15ICRTZWFyY2hSZXN1bHQ7CiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlU2VhcmNofSApIHsKICAgICAgICAkU2VhcmNoUmVzdWx0ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBXT1NURVNUIGlmICEkU2VhcmNoUmVzdWx0OwoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgbWFwIGFycmF5IGluZGV4IHRvIENoYW5nZUlECiAgICAgICAgbXkgQFJlc3VsdENoYW5nZUlEczsKICAgICAgICBmb3IgbXkgJFJlc3VsdENoYW5nZUlEICggQHskUmVmZXJlbmNlRGF0YX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdENoYW5nZUlEcywgJFdPU1RDaGFuZ2VJRHNbJFJlc3VsdENoYW5nZUlEXTsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VTZWFyY2goKQogICAgICAgIG15ICRTZWFyY2hSZXN1bHREdW1wID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIHNvcnQgQHskU2VhcmNoUmVzdWx0fSApOyAgICAjIyBubyBjcml0aWMKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgbXkgJFJlZmVyZW5jZUR1bXAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggc29ydCBAUmVzdWx0Q2hhbmdlSURzICk7ICAgICAgICMjIG5vIGNyaXRpYwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWFyY2hSZXN1bHREdW1wLAogICAgICAgICAgICAkUmVmZXJlbmNlRHVtcCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlU2VhcmNoKCk6ICIKICAgICAgICAgICAgICAgIC4gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRTb3VyY2VEYXRhLT57Q2hhbmdlU2VhcmNofSApICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgICAgICAuICRTZWFyY2hSZXN1bHREdW1wLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwogICAgJFdPU1RDb3VudGVyKys7Cn0KCiMgZWFjaCBvZiB0aGUgY2hhbmdlcyBzaG91bGQgaGF2ZSBvbmUgd29ya29yZGVyCmZvciBteSAkQ2hhbmdlSUQgKEBXT1NUQ2hhbmdlSURzKSB7CiAgICBteSAkQ2hhbmdlRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZURhdGEtPntXb3JrT3JkZXJDb3VudH0sCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VHZXQoKTogb25lIHdvcmtvcmRlciB3YXMgYWRkZWQiCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgYWR2YW5jZWQgc2VhcmNoIGJ5IHRlc3RzIGZvciB3b3Jrb3JkZXIgc3RyaW5ncyBhbmQgYWdlbnQgaWQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGdldCBpdGVtIGxpc3Qgb2YgdGhlIHdvcmtvcmRlciBzdGF0ZXMgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlV29ya09yZGVyU3RhdGVJRDJOYW1lID0gJXsKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgKSB8fCB7fQp9OwpteSAlV29ya09yZGVyU3RhdGVOYW1lMklEID0gcmV2ZXJzZSAlV29ya09yZGVyU3RhdGVJRDJOYW1lOwoKbXkgQFdPU3RhdGVUZXN0cyA9ICgKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0luc2VydCBjaGFuZ2Ugd2l0aCBvbmUgd29ya29yZGVyIGFuZCB3aXRoIFdvcmtPcmRlclN0YXRlIHNldC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnV29ya09yZGVyU3RhdGVJRCBpbiBDaGFuZ2VTZWFyY2ggLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICA9PiAnV29ya09yZGVyU3RhdGVJRCBpbiBDaGFuZ2VTZWFyY2ggLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWyAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbMV0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgYW5kIHdpdGggV29ya09yZGVyU3RhdGUgc2V0LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEIGluIENoYW5nZVNlYXJjaCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2FuY2VsZWR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgID0+ICdXb3JrT3JkZXJTdGF0ZUlEIGluIENoYW5nZVNlYXJjaCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEcyA9PiBbICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2FuY2VsZWR9IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsyXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdJbnNlcnQgY2hhbmdlIHdpdGggb25lIHdvcmtvcmRlciBhbmQgd2l0aCBXb3JrT3JkZXJTdGF0ZSBzZXQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlclN0YXRlSUQgaW4gQ2hhbmdlU2VhcmNoIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjbG9zZWR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1dvcmtPcmRlclN0YXRlSUQgaW4gQ2hhbmdlU2VhcmNoIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlcyA9PiBbICdyZWFkeScsICdjbG9zZWQnIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMSwgMyBdLAogICAgfSwKKTsKCm15ICRXT1N0YXRlVGVzdENvdW50ZXIgPSAxOwpteSBAV09TdGF0ZVRlc3RDaGFuZ2VJRHM7ICAgICAgICMgc2VhcmNoIGluIHdvcmtvcmRlciB0ZXN0IGNoYW5nZSBpZHMKbXkgQFdPU3RhdGVUZXN0V29ya09yZGVySURzOyAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCB3b3Jrb3JkZXIgaWRzCm15ICVXb3JrT3JkZXJTdGF0ZVRlc3RNYXA7CgpXT1NUQVRFVEVTVDoKZm9yIG15ICRXb3JrT3JkZXJTdGF0ZVRlc3QgKEBXT1N0YXRlVGVzdHMpIHsKICAgIG15ICRTb3VyY2VEYXRhID0gJFdvcmtPcmRlclN0YXRlVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkV29ya09yZGVyU3RhdGVUZXN0LT57UmVmZXJlbmNlRGF0YX0gfHwgW107CgogICAgbXkgJENoYW5nZUlEOwogICAgbXkgJFdvcmtPcmRlcklEOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFdvcmtPcmRlclN0YXRlVGVzdC0+e0Rlc2NyaXB0aW9ufSAoV09TdGF0ZVRlc3QgY2FzZTogJFdPU3RhdGVUZXN0Q291bnRlcikiLAogICAgKTsKCiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSApIHsKICAgICAgICAkQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewogICAgICAgICAgICAkVGVzdGVkQ2hhbmdlSUR7JENoYW5nZUlEfSA9IDE7CiAgICAgICAgICAgIHB1c2ggQFdPU3RhdGVUZXN0Q2hhbmdlSURzLCAkQ2hhbmdlSUQ7CiAgICAgICAgICAgICRXb3JrT3JkZXJTdGF0ZVRlc3RNYXB7JFdPU3RhdGVUZXN0Q291bnRlcn0gPSAkQ2hhbmdlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9ICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJBZGQiLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFdPU3RhdGVUZXN0V29ya09yZGVySURzLCAkV29ya09yZGVySUQ7CiAgICB9CgogICAgbXkgJFNlYXJjaFJlc3VsdDsKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VTZWFyY2h9ICkgewogICAgICAgICRTZWFyY2hSZXN1bHQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlU2VhcmNofSB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VhcmNoUmVzdWx0ICYmIHJlZiAkU2VhcmNoUmVzdWx0IGVxICdBUlJBWScsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCgpIC0gTGlzdCBpcyBhbiBhcnJheSByZWZlcmVuY2UuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFdPU1RBVEVURVNUIGlmICEkU2VhcmNoUmVzdWx0OwoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSByZXR1cm5lZCBpZHMgaW4gaGFzaCBmb3IgZWFzaWVyIGNoZWNrcwogICAgICAgIG15ICVSZXN1bHRJRHMgPSBtYXAgeyAkXyA9PiAxIH0gQHskU2VhcmNoUmVzdWx0fTsKCiAgICAgICAgIyBjaGVjayByZXR1cm5lZCBDaGFuZ2VJRHMKICAgICAgICBmb3IgbXkgJFRlc3ROciAoIEB7JFJlZmVyZW5jZURhdGF9ICkgewogICAgICAgICAgICBteSAkQ2hhbmdlSUQgPSAkV29ya09yZGVyU3RhdGVUZXN0TWFweyRUZXN0TnJ9OwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRSZXN1bHRJRHN7JENoYW5nZUlEfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCgpIC0gJENoYW5nZUlEIChmcm9tIHRlc3QgJFRlc3ROcikgaW4gcmVzdWx0IHNldCBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAkVGVzdENvdW50Kys7CiAgICAkV09TdGF0ZVRlc3RDb3VudGVyKys7Cn0KCiMgZWFjaCBvZiB0aGUgY2hhbmdlcyBzaG91bGQgaGF2ZSBvbmUgd29ya29yZGVyCmZvciBteSAkQ2hhbmdlSUQgKEBXT1N0YXRlVGVzdENoYW5nZUlEcykgewogICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRDaGFuZ2VEYXRhLT57V29ya09yZGVyQ291bnR9LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlR2V0KCk6IG9uZSB3b3Jrb3JkZXIgd2FzIGFkZGVkIgogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3RpbmcgdGhlIG1ldGhvZCBQZXJtaXNzaW9uKCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRQZXJtaXNzaW9uVGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7UGVybWlzc2lvblRlc3R9IH07Cm15IEBQZXJtaXNzaW9uVGVzdHMgPSAoCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDEKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5pdGlhbGx5IG5vIHByaXYgaW4gYW55IGdyb3VwJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiAyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3JvIGluIGl0c20tY2hhbmdlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gMwogICAgewoKICAgICAgICAjIFRoZSB0eXBlICdydycgaW1wbGllcyBhbGwgb3RoZXIgdHlwZXMuIFNlZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXBfR2V0VHlwZVN0cmluZygpCiAgICAgICAgIyBUaGVyZWZvcmUgVXNlcjEgZWZmZWN0aXZlbHkgaGFzICdybycgaW4gJ2l0c20tY2hhbmdlJyBhbmQKICAgICAgICAjIHRoZSBDaGFuZ2VBZ2VudENoZWNrIFBlcm1pc3Npb24gbW9kdWxlIGdpdmVzICdybycgYWNjZXNzLgogICAgICAgICMgTm90ZSB0aGF0IHRoZSBDaGFuZ2VBZ2VudENoZWNrIFBlcm1pc3Npb24gbW9kdWxlIG5ldmVyIGdpdmVzICdydycgYWNjZXNzLgogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZSBvbmx5IGdyYW50cyBybycsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncm8gaW4gaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gNQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZS1tYW5hZ2VyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLW1hbmFnZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA2CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3JvIGluIGl0c20tY2hhbmdlLWJ1aWxkZXIsIFVzZXIgMCBpcyB0aGUgYnVpbGRlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA3CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3J3IGluIGl0c20tY2hhbmdlLWJ1aWxkZXIsIEFnZW50IGlzIHRoZSBidWlsZGVyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLW1hbmFnZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICBydyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncm8gaW4gaXRzbS1jaGFuZ2UtYnVpbGRlciwgdXNlciAxIGlzIG5vdCB0aGUgYnVpbGRlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncncgaW4gaXRzbS1jaGFuZ2UtYnVpbGRlciwgdXNlciAxIGlzIG5vdCB0aGUgYnVpbGRlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgopOwoKbXkgJFBlcm1pc3Npb25UZXN0Q291bnRlciA9IDE7CmZvciBteSAkVGVzdCAoQFBlcm1pc3Npb25UZXN0cykgewogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRlc3QtPntEZXNjcmlwdGlvbn0gKFBlcm1pc3Npb24gVGVzdCBjYXNlOiAkUGVybWlzc2lvblRlc3RDb3VudGVyKSIsCiAgICApOwoKICAgICMgZXhlY3V0ZSB0aGUgc291cmNlIG1vZGlmaWNhdGlvbnMKICAgICRTb3VyY2VEYXRhLT57R3JvdXBNZW1iZXJBZGR9IHx8PSBbXTsKICAgIGZvciBteSAkUGFyYW1zICggQHsgJFNvdXJjZURhdGEtPntHcm91cE1lbWJlckFkZH0gfSApIHsKCiAgICAgICAgIyBtb2RpZnkgdGhlIGdyb3VwIG1lbWJlcnNoaXAKICAgICAgICBteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgICAgICV7JFBhcmFtc30sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoICRTdWNjZXNzLCAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IEdyb3VwTWVtYmVyQWRkKCkiLCApOwogICAgfQoKICAgICMgY2hlY2sgdGhlIHJlc3VsdAogICAgaWYgKCAkUmVmZXJlbmNlRGF0YS0+e1Blcm1pc3Npb25zfSApIHsKICAgICAgICBmb3IgbXkgJFVzZXJJbmRleCAoIHNvcnQga2V5cyAleyAkUmVmZXJlbmNlRGF0YS0+e1Blcm1pc3Npb25zfSB9ICkgewogICAgICAgICAgICBteSAkUHJpdnMgPSAkUmVmZXJlbmNlRGF0YS0+e1Blcm1pc3Npb25zfS0+eyRVc2VySW5kZXh9OwogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskUHJpdnN9ICkgewogICAgICAgICAgICAgICAgJENoYW5nZU9iamVjdC0+e0RlYnVnfSA9IDEwOwogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBlcm1pc3Npb25UZXN0Q2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbJFVzZXJJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQcml2cy0+eyRUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gdGVzdCAkUGVybWlzc2lvblRlc3RDb3VudGVyOiBVc2VyICRVc2VySW5kZXgsIHdpdGggVXNlclVEICRVc2VySURzWyRVc2VySW5kZXhdLCBoYXMgJFR5cGUgYWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IFVzZXIgJFVzZXJJbmRleCwgd2l0aCBVc2VySUQgJFVzZXJJRHNbJFVzZXJJbmRleF0sIGhhcyBubyAkVHlwZSBhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewogICAgJFBlcm1pc3Npb25UZXN0Q291bnRlcisrOwogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyB0aGUgbWV0aG9kIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRQb3NzaWJsZVN0YXRlc1Rlc3RDaGFuZ2VJRCkgPSBAeyAkTGFiZWwyQ2hhbmdlSURze1Bvc3NpYmxlU3RhdGVzVGVzdH0gfTsKCiMgV2hlbiBubyBDaGFuZ2VJRCBpcyBnaXZlbiBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIHJldHVybnMgYSBsaXN0IG9mIGFsbCBzdGF0ZXMuCm15ICRQb3NzaWJsZVN0YXRlcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAoKICAgICMgICAgQ2hhbmdlSUQgPT4gJFBvc3NpYmxlU3RhdGVzVGVzdENoYW5nZUlELAogICAgVXNlcklEID0+IDEsCikgfHwge307CgojIGRvIHRoZSBjaGVja3MKbXkgQFBvc3NpYmxlU3RhdGVJRHNSZWZlcmVuY2UgPSBAU29ydGVkQ2hhbmdlU3RhdGVJRHM7CmZvciBteSAkUG9zc2libGVTdGF0ZUlEIChAUG9zc2libGVTdGF0ZUlEc1JlZmVyZW5jZSkgewogICAgbXkgKCAkRmlyc3RIYXNoUmVmLCAkU2Vjb25kSGFzaFJlZiApID0gZ3JlcCB7ICRfLT57S2V5fSA9PSAkUG9zc2libGVTdGF0ZUlEIH0gQHskUG9zc2libGVTdGF0ZXN9OwoKICAgICMgYSBtYXRjaCBpcyBleHBlY3RlZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZpcnN0SGFzaFJlZiwKICAgICAgICAiQ2hlY2sgZm9yIHBvc3NpYmxlIHN0YXRlIGlkICRQb3NzaWJsZVN0YXRlSUQiLAogICAgKTsKCiAgICAjIHRoZSBuYW1lIHNob3VsZCBhbHNvIG1hdGNoCiAgICAkRmlyc3RIYXNoUmVmIHx8PSB7fTsKICAgIG15ICRQb3NzaWJsZVN0YXRlTmFtZSA9ICRDaGFuZ2VTdGF0ZUlEMk5hbWV7JFBvc3NpYmxlU3RhdGVJRH07CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEZpcnN0SGFzaFJlZi0+e1ZhbHVlfSwKICAgICAgICAkUG9zc2libGVTdGF0ZU5hbWUsCiAgICAgICAgIkNoZWNrIGZvciBwb3NzaWJsZSBzdGF0ZSBuYW1lICRQb3NzaWJsZVN0YXRlSUQiLAogICAgKTsKCiAgICAjIG9ubHkgb25lIG1hdGNoIGlzIGV4cGVjdGVkCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFNlY29uZEhhc2hSZWYsCiAgICAgICAgIkNoZWNrIHRoYXQgdGhlIHN0YXRlIGlkICRQb3NzaWJsZVN0YXRlSUQgaXMgcmV0dXJuZWQgb25seSBvbmNlLiIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyB0aGUgbWV0aG9kIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KCkgd2l0aCBDaGFuZ2VJRCBhcmd1bWVudAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMuLi4KbXkgJFRlc3ROdW1iZXIgPSAwOwoKbXkgQFBvc3NpYmxlU3RhdGVzRm9yUmVxdWVzdGVkID0gKAogICAgJ3JlcXVlc3RlZCcsCiAgICAnaW4gcHJvZ3Jlc3MnLAogICAgJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgJ3JlamVjdGVkJywKICAgICdyZXRyYWN0ZWQnLAopOwoKbXkgQFBvc3NpYmxlU3RhdGVzRm9yUGVuZGlnQXBwcm92YWwgPSAoCiAgICAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAnYXBwcm92ZWQnLAogICAgJ3JlamVjdGVkJywKICAgICdyZXRyYWN0ZWQnLAopOwoKbXkgQFBvc3NpYmxlU3RhdGVzRm9yQXBwcm92ZWQgPSAoCiAgICAnYXBwcm92ZWQnLAogICAgJ3JldHJhY3RlZCcsCiAgICAnaW4gcHJvZ3Jlc3MnLAopOwoKbXkgQFBvc3NpYmxlU3RhdGVzRm9ySW5Qcm9ncmVzcyA9ICgKICAgICdpbiBwcm9ncmVzcycsCiAgICAnY2FuY2VsZWQnLAogICAgJ2ZhaWxlZCcsCiAgICAncGVuZGluZyBwaXInLAogICAgJ3JldHJhY3RlZCcsCiAgICAnc3VjY2Vzc2Z1bCcsCik7CgojIFRlc3QgbG9naWMgc3RhcnRzLi4uCgojIENyZWF0ZSBhIGNoYW5nZSBvYmplY3QuLi4KbXkgJENoYW5nZUlERm9yQ2hhbmdlUG9zc2libGVTdGF0ZUdldCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBHZXQgcG9zc3NpYmxlIHN0YXRlcy4uLgpteSAkUG9zc2libGVTdGF0ZXNVc2luZ0NoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSURGb3JDaGFuZ2VQb3NzaWJsZVN0YXRlR2V0LAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRUZXN0TnVtYmVyKys7CgpfVGVzdFBvc3NpYmxlU3RhdGVzKAogICAgU3RhdGUgICAgICAgICAgICAgICAgID0+ICdSZXF1ZXN0ZWQnLAogICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQsCiAgICBQb3NzaWJsZURlZmF1bHRTdGF0ZXMgPT4gXEBQb3NzaWJsZVN0YXRlc0ZvclJlcXVlc3RlZCwKICAgIFRlc3ROdW1iZXIgICAgICAgICAgICA9PiAkVGVzdE51bWJlciwKKTsKCiMgQ2hhbmdlIHRoZSBzdGF0ZQpteSAkQ2hhbmdlVXBkYXRlU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBDaGFuZ2VTdGF0ZSA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFRlc3ROdW1iZXIrKzsKCiRTZWxmLT5UcnVlKAogICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAiVGVzdCAkVGVzdE51bWJlciBTdGF0ZSBjaGFuZ2UiCik7CgojIEdldCBwb3Nzc2libGUgc3RhdGVzLi4uCiRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKX1Rlc3RQb3NzaWJsZVN0YXRlcygKICAgIFN0YXRlICAgICAgICAgICAgICAgICA9PiAnQXBwcm92ZWQnLAogICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQsCiAgICBQb3NzaWJsZURlZmF1bHRTdGF0ZXMgPT4gXEBQb3NzaWJsZVN0YXRlc0ZvclBlbmRpZ0FwcHJvdmFsLAogICAgVGVzdE51bWJlciAgICAgICAgICAgID0+ICRUZXN0TnVtYmVyLAopOwoKIyBDaGFuZ2UgdGhlIHN0YXRlCiRDaGFuZ2VVcGRhdGVTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlVXBkYXRlKAogICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlERm9yQ2hhbmdlUG9zc2libGVTdGF0ZUdldCwKICAgIENoYW5nZVN0YXRlID0+ICdhcHByb3ZlZCcsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFRlc3ROdW1iZXIrKzsKCiRTZWxmLT5UcnVlKAogICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAiVGVzdCAkVGVzdE51bWJlciBTdGF0ZSBjaGFuZ2UiCik7CgojIEdldCBwb3Nzc2libGUgc3RhdGVzLi4uCiRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKX1Rlc3RQb3NzaWJsZVN0YXRlcygKICAgIFN0YXRlICAgICAgICAgICAgICAgICA9PiAnQXBwcm92ZWQnLAogICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQsCiAgICBQb3NzaWJsZURlZmF1bHRTdGF0ZXMgPT4gXEBQb3NzaWJsZVN0YXRlc0ZvckFwcHJvdmVkLAogICAgVGVzdE51bWJlciAgICAgICAgICAgID0+ICRUZXN0TnVtYmVyLAopOwoKIyBDaGFuZ2UgdGhlIHN0YXRlCiRDaGFuZ2VVcGRhdGVTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlVXBkYXRlKAogICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlERm9yQ2hhbmdlUG9zc2libGVTdGF0ZUdldCwKICAgIENoYW5nZVN0YXRlID0+ICdpbiBwcm9ncmVzcycsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFRlc3ROdW1iZXIrKzsKCiRTZWxmLT5UcnVlKAogICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAiVGVzdCAkVGVzdE51bWJlciBTdGF0ZSBjaGFuZ2UiCik7CgojIEdldCBwb3Nzc2libGUgc3RhdGVzLi4uCiRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKX1Rlc3RQb3NzaWJsZVN0YXRlcygKICAgIFN0YXRlICAgICAgICAgICAgICAgICA9PiAnSW4gUHJvZ3Jlc3MnLAogICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQsCiAgICBQb3NzaWJsZURlZmF1bHRTdGF0ZXMgPT4gXEBQb3NzaWJsZVN0YXRlc0ZvckluUHJvZ3Jlc3MsCiAgICBUZXN0TnVtYmVyICAgICAgICAgICAgPT4gJFRlc3ROdW1iZXIsCik7CgojIERlbGV0ZSB0aGUgQ2hhbmdlCiRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENJUCBhbGxvY2F0ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBjdXJyZW50IGFsbG9jYXRpb24gbGlzdCAoVXNlcklEIGlzIG5lZWRlZCkKbXkgJEVtcHR5QWxsb2NhdGVEYXRhID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZUxpc3QoKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoCiAgICAkRW1wdHlBbGxvY2F0ZURhdGEsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVMaXN0KCknLAopOwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QKbXkgJEN1cnJlbnRBbGxvY2F0ZURhdGEgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5UcnVlKAogICAgJEN1cnJlbnRBbGxvY2F0ZURhdGEsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVMaXN0KCknLAopOwoKIyBjaGVjayB0aGUgYWxsb2NhdGlvbiBoYXNoCm15ICRIYXNoSXNPSyA9IDE7CmlmICggcmVmICRDdXJyZW50QWxsb2NhdGVEYXRhIG5lICdIQVNIJyApIHsKICAgICRIYXNoSXNPSyA9IDA7Cn0KCiMgY2hlY2sgdGhlIGFsbG9jYXRpb24gMmQgaGFzaAppZiAoJEhhc2hJc09LKSB7CgogICAgSU1QQUNUSUQ6CiAgICBmb3IgbXkgJEltcGFjdElEICggc29ydCBrZXlzICV7JEN1cnJlbnRBbGxvY2F0ZURhdGF9ICkgewoKICAgICAgICBpZiAoIHJlZiAkQ3VycmVudEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RJRH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkSGFzaElzT0sgPSAwOwogICAgICAgICAgICBsYXN0IElNUEFDVElEOwogICAgICAgIH0KCiAgICAgICAgQ0FURUdPUllJRDoKICAgICAgICBmb3IgbXkgJENhdGVnb3J5SUQgKCBzb3J0IGtleXMgJXsgJEN1cnJlbnRBbGxvY2F0ZURhdGEtPnskSW1wYWN0SUR9IH0gKSB7CgogICAgICAgICAgICBpZiAoICEkQ2F0ZWdvcnlJRCB8fCAhJEN1cnJlbnRBbGxvY2F0ZURhdGEtPnskSW1wYWN0SUR9LT57JENhdGVnb3J5SUR9ICkgewogICAgICAgICAgICAgICAgJEhhc2hJc09LID0gMDsKICAgICAgICAgICAgICAgIGxhc3QgSU1QQUNUSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2hlY2sgSGFzaE9LCiRTZWxmLT5UcnVlKAogICAgJEhhc2hJc09LLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IEFsbG9jYXRlTGlzdCgpJywKKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJENJUEFsbG9jYXRpb25VcGRhdGVkID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSgKICAgICRDSVBBbGxvY2F0aW9uVXBkYXRlZCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBBbGxvY2F0ZVVwZGF0ZSgpJywKKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJENJUEFsbG9jYXRpb25Jc1VwZGF0ZWQgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlVXBkYXRlKAogICAgQWxsb2NhdGVEYXRhID0+ICRDdXJyZW50QWxsb2NhdGVEYXRhLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSgKICAgICRDSVBBbGxvY2F0aW9uSXNVcGRhdGVkLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IEFsbG9jYXRlVXBkYXRlKCknLAopOwoKIyB1cGRhdGUgdGhlIGFsbG9jYXRpb24gaGFzaCAoYWxsb2NhdGlvbiBoYXNoKQpteSAkQ0lQQWxsb2NhdGlvbklzVXBkYXRlZE5yVGhyZWUgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlVXBkYXRlKAogICAgQWxsb2NhdGVEYXRhID0+IHsKICAgICAgICBUZXN0ICA9PiAnYWFhJywKICAgICAgICBUZXN0MiA9PiAnYmJiJywKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoCiAgICAkQ0lQQWxsb2NhdGlvbklzVXBkYXRlZE5yVGhyZWUsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVVcGRhdGUoKScsCik7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoCm15ICRTdWNjZXNzID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiAkQ3VycmVudEFsbG9jYXRlRGF0YSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVVcGRhdGUoKScsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ0lQIGxvb2t1cCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokTG9va3VwT2sgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDSVBMb29rdXAoCiAgICBDSVAgID0+ICcxIHZlcnkgaGlnaCcsCiAgICBUeXBlID0+ICdub24tZXhpc3RlbnQnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ0ludmFsaWQgdHlwZSBwYXNzZWQgdG8gQ2hhbmdlQ0lQTG9va3VwKCknLAopOwoKJExvb2t1cE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQ0lQTG9va3VwKAogICAgQ0lQID0+ICcxIHZlcnkgaGlnaCcsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnUGFyYW1ldGVyIFR5cGUgbm90IHBhc3NlZCB0byBDaGFuZ2VDSVBMb29rdXAoKScsCik7CgokTG9va3VwT2sgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDSVBMb29rdXAoCiAgICBUeXBlID0+ICdQcmlvcml0eScsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnUGFyYW1ldGVyIElEIG9yIENJUCBub3QgcGFzc2VkIHRvIENoYW5nZUNJUExvb2t1cCgpJywKKTsKCiRMb29rdXBPayA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgIFR5cGUgPT4gJ1ByaW9yaXR5JywKICAgIENJUCAgPT4gJzEgdmVyeSBoaWdoJywKICAgIElEICAgPT4gMTIzLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ0V4Y2x1c2l2ZSBwYXJhbWV0ZXJzIElEIGFuZCBDSVAgcGFzc2VkIHRvIENoYW5nZUNJUExvb2t1cCgpJywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDaGFuZ2VQb3NzaWJsZUNJUEdldCgpIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRQb3NzaWJsZUNJUEdldE9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICBUeXBlICAgPT4gJ25vbi1leGlzdGVudCcsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRQb3NzaWJsZUNJUEdldE9rLAogICAgJ0ludmFsaWQgdHlwZSBwYXNzZWQgdG8gQ2hhbmdlUG9zc2libGVDSVBHZXQoKScsCik7CgokUG9zc2libGVDSVBHZXRPayA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkUG9zc2libGVDSVBHZXRPaywKICAgICdQYXJhbWV0ZXIgVHlwZSBub3QgcGFzc2VkIHRvIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCknLAopOwoKIyBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHRocmVlIHR5cGVzLgpteSAkUG9zc2libGVDSVBSZWZlcmVuY2UgPSBqb2luICcsICcsIEBDSVBWYWx1ZXM7CmZvciBteSAkVHlwZSAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgbXkgJFBvc3NpYmxlQ0lQcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkUG9zc2libGVDSVBzLAogICAgICAgICdBUlJBWScsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDaGFuZ2VQb3NzaWJsZUNJUEdldCgpIHJldHVybmVkIGFycmF5IHJlZiBmb3IgJyRUeXBlJyIsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICBqb2luKCAnLCAnLCBtYXAgeyAkXy0+e1ZhbHVlfSB9IEB7JFBvc3NpYmxlQ0lQc30gKSwKICAgICAgICAkUG9zc2libGVDSVBSZWZlcmVuY2UsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudCAtIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCkgcmV0dXJuZWQgZXhwZWN0ZWQgdmFsdWVzIGZvciAnJFR5cGUnIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0aW5nIHN1cHBvcnQgZm9yIGF0dGFjaG1lbnRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICgkQXR0YWNobWVudFRlc3RDaGFuZ2VJRCkgPSBAeyAkTGFiZWwyQ2hhbmdlSURze0F0dGFjaG1lbnR9IH07CgojIHZlcmlmeSB0aGF0IGluaXRpYWx5IG5vIGF0dGFjaG1lbnQgZXhpc3RzCm15IEBBdHRhY2htZW50TGlzdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgQ2hhbmdlSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q2hhbmdlSUQsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEF0dGFjaG1lbnRMaXN0LAogICAgMCwKICAgICdObyBhdHRhY2htZW50cyBpbml0aWFsbHknLAopOwoKbXkgQFRlc3RGaWxlTGlzdCA9ICgKICAgIHsKICAgICAgICBGaWxlbmFtZSAgICA9PiAnZmlyc3QgYXR0YWNobWVudCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ0ZpcnN0IGF0dGFjaG1lbnQgZnJvbSBJVFNNQ2hhbmdlLnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgIH0sCiAgICB7CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NlY29uZCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICA9PiAnU2Vjb25kIGF0dGFjaG1lbnQgZnJvbSBJVFNNQ2hhbmdlLnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgIH0sCik7CgpteSAkRmlsZUNvdW50Owpmb3IgbXkgJFRlc3RGaWxlIChAVGVzdEZpbGVMaXN0KSB7CgogICAgJEZpbGVDb3VudCsrOwoKICAgIG15ICRBZGRPayA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskVGVzdEZpbGV9LAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFkZE9rLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgYWRkZWQiLAogICAgKTsKCiAgICBteSBAQXR0YWNobWVudExpc3QgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQXR0YWNobWVudFRlc3RDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQEF0dGFjaG1lbnRMaXN0LAogICAgICAgICRGaWxlQ291bnQsCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogbnVtYmVyIG9mIGF0dGFjaG1lbnRzIGFmdGVyIGFkZGluZyIsCiAgICApOwoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgbGFzdCBhZGRlZCBhdHRhY2htZW50IGlzIGluIHRoZSBsaXN0CiAgICBteSAlQXR0YWNobWVudExvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAQXR0YWNobWVudExpc3Q7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0YWNobWVudExvb2t1cHsgJFRlc3RGaWxlLT57RmlsZW5hbWV9IH0sCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogZmlsZW5hbWUgZnJvbSBDaGFuZ2VBdHRhY2htZW50TGlzdCgpIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGF0dGFjaG1lbnQKICAgIG15ICRBdHRhY2htZW50ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudEdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQXR0YWNobWVudFRlc3RDaGFuZ2VJRCwKICAgICAgICBGaWxlbmFtZSA9PiAkVGVzdEZpbGUtPntGaWxlbmFtZX0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dGFjaG1lbnQsCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogQ2hhbmdlQXR0YWNobWVudEdldCgpIHJldHVybmVkIHRydWUiLAogICAgKTsKCiAgICAjIGNoZWNrIGF0dGFjaG1lbnQgZmlsZSBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoRmlsZW5hbWUgQ29udGVudCBDb250ZW50VHlwZSkpIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICRUZXN0RmlsZS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiAkQXR0cmlidXRlIGZyb20gQ2hhbmdlQXR0YWNobWVudEdldCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGV4aXN0ZW5jZSBvZiBhdHRhY2htZW50CiAgICBteSAkQXR0YWNobWVudEV4aXN0cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q2hhbmdlSUQsCiAgICAgICAgRmlsZW5hbWUgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dGFjaG1lbnRFeGlzdHMsCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogYXR0YWNobWVudCBleGlzdHMiLAogICAgKTsKCn0KCiMgbm93IGRlbGV0ZSB0aGUgYXR0YWNobWVudHMKJEZpbGVDb3VudCA9IDA7Cm15ICRNYXhUZXN0RmlsZXMgPSBzY2FsYXIgQFRlc3RGaWxlTGlzdDsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgICRGaWxlQ291bnQrKzsKCiAgICBteSAkRGVsZXRlT2sgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50RGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIEZpbGVuYW1lID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBhdHRhY2htZW50IGRlbGV0ZWQiLAogICAgKTsKCiAgICBteSBAQXR0YWNobWVudExpc3QgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQXR0YWNobWVudFRlc3RDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBBdHRhY2htZW50TGlzdCwKICAgICAgICAkTWF4VGVzdEZpbGVzIC0gJEZpbGVDb3VudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgZGVsZXRpb24iLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEV4aXN0cyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgRmlsZW5hbWUgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRBdHRhY2htZW50RXhpc3RzLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgaXMgZ29uZSIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBIaXN0b3J5QWRkTXVsdGlwbGUoKSBmdW5jdGlvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgIyBkZWZpbmUgb2xkIHZhbHVlcyBmb3IgY2hhbmdlCiAgICBteSAlT2xkVmFsdWVzID0gKAogICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ0FBQScsCiAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnQkJCJywKICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdDQ0MnLAogICAgKTsKCiAgICAjIGFkZCBhIG5ldyB0ZXN0IGNoYW5nZQogICAgbXkgJENoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICVPbGRWYWx1ZXMsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgcmVtZW1iZXIgY2hhbmdlIGlkIGZvciBhdXRvbWF0aWMgZGVsZXRpb24KICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKCiAgICAjIGRlZmluZSBuZXcgdmFsdWVzIGZvciBjaGFuZ2UgdXBkYXRlCiAgICBteSAlTmV3VmFsdWVzID0gKAogICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ1hYWCcsCiAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnWVlZJywKICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdaWlonLAogICAgKTsKCiAgICAjIHVwZGF0ZSB0aGUgY2hhbmdlCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVVwZGF0ZSgKICAgICAgICAlTmV3VmFsdWVzLAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCB0aGUgY2hhbmdlIGhpc3RvcnkKICAgIG15ICRIaXN0b3J5RW50cmllcyA9ICRIaXN0b3J5T2JqZWN0LT5DaGFuZ2VIaXN0b3J5R2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCByZXZlcnNlIGhpc3RvcnkgZW50cmllcwogICAgbXkgQFJldmVyc2VIaXN0b3J5ID0gcmV2ZXJzZSBAeyRIaXN0b3J5RW50cmllc307CgogICAgIyBnZXQgdGhlIGxhc3QgMyBoaXN0b3J5IGVudHJpZXMgYW5kIHB1dCB0aGVtIGluIGEgaGFzaAogICAgIyBrZXkgaXMgdGhlIGZpZWxkbmFtZSwgdmFsdWUgaXMgdGhlIGNvbXBsZXRlIGhpc3RvcnkgZGF0YSBvZiB0aGF0IGxpbmUKICAgIG15ICVIaXN0b3J5TG9va3VwQnlGaWVsZG5hbWUgPSBtYXAgeyAkXy0+e0ZpZWxkbmFtZX0gPT4gJF8gfSBAUmV2ZXJzZUhpc3RvcnlbIDAsIDEsIDIgXTsKCiAgICBmb3IgbXkgJEZpZWxkbmFtZSAoIHNvcnQga2V5cyAlTmV3VmFsdWVzICkgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRIaXN0b3J5TG9va3VwQnlGaWVsZG5hbWV7JEZpZWxkbmFtZX0tPntDb250ZW50T2xkfSwKICAgICAgICAgICAgJE9sZFZhbHVlc3skRmllbGRuYW1lfSwKICAgICAgICAgICAgIkNoZWNraW5nIEhpc3RvcnkgZm9yIEZpZWxkOiAkRmllbGRuYW1lLCBDb250ZW50T2xkOiAkT2xkVmFsdWVzeyRGaWVsZG5hbWV9IiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRIaXN0b3J5TG9va3VwQnlGaWVsZG5hbWV7JEZpZWxkbmFtZX0tPntDb250ZW50TmV3fSwKICAgICAgICAgICAgJE5ld1ZhbHVlc3skRmllbGRuYW1lfSwKICAgICAgICAgICAgIkNoZWNraW5nIEhpc3RvcnkgZm9yIEZpZWxkOiAkRmllbGRuYW1lLCBDb250ZW50TmV3OiAkTmV3VmFsdWVzeyRGaWVsZG5hbWV9IiwKICAgICAgICApOwogICAgfQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNoYW5nZSB0aGUgbmV3bHkgYWRkZWQgdXNlcnMKJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKTsKaWYgKCAhZGVmaW5lZCAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyApIHsKICAgICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gMTsKfQokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAwLAopOwoKIyBzZXQgdW5pdHRlc3QgdXNlcnMgaW52YWxpZApmb3IgbXkgJFVuaXR0ZXN0VXNlcklEIChAVXNlcklEcykgewoKICAgICMgZ2V0IHVzZXIgZGF0YQogICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRVbml0dGVzdFVzZXJJRCwKICAgICk7CgogICAgIyB1cGRhdGUgdXNlcgogICAgJFVzZXJPYmplY3QtPlVzZXJVcGRhdGUoCiAgICAgICAgJVVzZXIsCiAgICAgICAgVmFsaWRJRCAgICAgID0+ICRWYWxpZE9iamVjdC0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICdpbnZhbGlkJyApLAogICAgICAgIENoYW5nZVVzZXJJRCA9PiAxLAogICAgKTsKfQoKIyBkZWxldGUgdGhlIHRlc3QgY2hhbmdlcwpteSAkRGVsZXRlVGVzdENvdW50ID0gMTsKZm9yIG15ICRDaGFuZ2VJRCAoIHNvcnQga2V5cyAlVGVzdGVkQ2hhbmdlSUQgKSB7CgogICAgbXkgJERlbGV0ZU9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gQ2hhbmdlRGVsZXRlKCkgKENoYW5nZUlEPSRDaGFuZ2VJRCkiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDaGFuZ2VEYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENhY2hlICAgID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gZG91YmxlIGNoZWNrIChDaGFuZ2VJRD0kQ2hhbmdlSUQpIiwKICAgICk7Cn0KY29udGludWUgewogICAgJERlbGV0ZVRlc3RDb3VudCsrOwp9CgojIGRlbGV0ZSBkeW5hbWljIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGlzIHRlc3QKZm9yIG15ICREeW5hbWljRmllbGRJRCAoQER5bmFtaWNGaWVsZElEcykgewoKICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJEeW5hbWljRmllbGREZWxldGUoKSBkZWxldGVkIER5bmFtaWNGaWVsZCAkRHluYW1pY0ZpZWxkSUQiLAogICAgKTsKfQoKIyByZXN0b3JlIG9yaWdpbmFsIGR5bmFtaWMgZmllbGRzIG9yZGVyCmZvciBteSAkRHluYW1pY0ZpZWxkICggQHskT3JpZ2luYWxEeW5hbWljRmllbGRzfSApIHsKCiAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgdXBkYXRlIChyZXN0b3JlKSB3YXMgc3VjY2Vzc2Z1bAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlJlc3RvcmVkIE9yaWdpbmFsIER5bmFtaWMgRmllbGQgIC0gZm9yIEZpZWxkSUQgJER5bmFtaWNGaWVsZC0+e0lEfSIsCiAgICApOwp9CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCik7Cgo9aGVhZDIgU2V0VGltZXMoKQoKU2V0IG5ldyB2YWx1ZXMgZm9yIENyZWF0ZVRpbWUgYW5kIENoYW5nZVRpbWUgZm9yIGEgZ2l2ZW4gQ2hhbmdlSUQuCgogICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSBTZXRUaW1lcygKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAwOS0xMC0zMCAwMTowMDoxNScsCiAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAwOS0xMC0zMCAwMTowMDoxNScsCiAgICApOwoKPWN1dAoKc3ViIFNldFRpbWVzIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBjaGVjayBjaGFuZ2UgaWQKICAgIGlmICggISRQYXJhbXtDaGFuZ2VJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGFuZ2VJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgaWYgKCAhJFBhcmFte0NyZWF0ZVRpbWV9ICYmICEkUGFyYW17Q2hhbmdlVGltZX0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBwYXJhbWV0ZXIgQ3JlYXRlVGltZSBvciBDaGFuZ2VUaW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEJpbmQ7CiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfaXRlbSBTRVQgJzsKCiAgICBpZiAoICRQYXJhbXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAkU1FMIC49ICdjcmVhdGVfdGltZSA9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NyZWF0ZVRpbWV9OwogICAgfQoKICAgIGlmICggJFBhcmFte0NyZWF0ZVRpbWV9ICYmICRQYXJhbXtDaGFuZ2VUaW1lfSApIHsKICAgICAgICAkU1FMIC49ICcsICc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2hhbmdlVGltZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnY2hhbmdlX3RpbWUgPSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDaGFuZ2VUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8gJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2hhbmdlSUR9OwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgY2xlYW51cCB0aGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIHNldCBTZW5kTm90aWZpY2F0aW9ucyB0byBpdCdzIG9yaWdpbmFsIHZhbHVlCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlOjpTZW5kTm90aWZpY2F0aW9ucycsCiAgICBWYWx1ZSA9PiAkU2VuZE5vdGlmaWNhdGlvbnNPcmcsCik7Cgo9aGVhZDIgX1Rlc3RQb3NzaWJsZVN0YXRlcygpCgpJbnRlcm5hbCB1c2Ugb25seSEKUnVucyBhIHNlcmllcyBvZiB0ZXN0cyBmb3IgQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoKSBieSB1c2luZyBhIENoYW5nZUlEIGFzIGFyZ3VtZW50CgogICAgX1Rlc3RQb3Nzc2libGVTdGF0ZXMoCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgID0+ICdJbiBQcm9ncmVzcycsICAgICAgICAgICAgICAgICAjIFN0YXRlIG5hbWUgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSB0ZXN0cwogICAgICAgIFBvc3NpYmxlU3RhdGVzICAgICAgICA9PiAkUG9zc2libGVTdGF0ZXMsICAgICAgICAgICAgICAgIyBUaGUgcmVzdWx0IGZyb20gQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoKQogICAgICAgIFBvc3NpYmxlRGVmYXVsdFN0YXRlcyA9PiBcQFBvc3NpYmxlU3RhdGVzRm9ySW5Qcm9ncmVzcywgIyBBcnJheSB0byBwb3NzaWJsZSBzdGF0ZSB0byBjb21wYXJlCiAgICAgICAgVGVzdE51bWJlciAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRlc3RudW1iZXIKCiAgICApOwoKPWN1dAoKc3ViIF9UZXN0UG9zc2libGVTdGF0ZXMgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBteSAkU3RhdGUgICAgICAgICAgICAgICAgID0gJFBhcmFte1N0YXRlfTsKICAgIG15ICRQb3NzaWJsZVN0YXRlcyAgICAgICAgPSAkUGFyYW17UG9zc2libGVTdGF0ZXN9OwogICAgbXkgQFBvc3NpYmxlRGVmYXVsdFN0YXRlcyA9IEB7ICRQYXJhbXtQb3NzaWJsZURlZmF1bHRTdGF0ZXN9IH07CiAgICBteSAkVGVzdE51bWJlciAgICAgICAgICAgID0gJFBhcmFte1Rlc3ROdW1iZXJ9OwoKICAgICMgQ2hlY2sgaWYgcmV0dXJuLi4uCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUG9zc2libGVTdGF0ZXMsCiAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIC0gIgogICAgICAgICAgICAuICJyZXR1cm5zIGEgbGlzdCBvZiBwb3NpYmxlIHN0YXRlcyBmcm9tICRTdGF0ZSBTdGF0ZS4iLAogICAgKTsKCiAgICAjIENoZWNrIGlmIHJldHVybmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygc3RhdGVzLi4uCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFBvc3NpYmxlU3RhdGVzVXNpbmdDaGFuZ2VJRH0sCiAgICAgICAgc2NhbGFyIEBQb3NzaWJsZURlZmF1bHRTdGF0ZXMsCiAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiB8LSIKICAgICAgICAgICAgLiAicmV0dXJucyB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgdGhlICRTdGF0ZSBTdGF0ZSBkZWZhdWx0LiIsCiAgICApOwoKICAgIGZvciBteSAkUG9zc2libGVTdGF0ZUhhc2ggKCBAeyRQb3NzaWJsZVN0YXRlc30gKSB7CiAgICAgICAgbXkgKCAkRmlyc3RIYXNoUmVmLCAkU2Vjb25kSGFzaFJlZiApID0gZ3JlcCB7ICRfIGVxICRQb3NzaWJsZVN0YXRlSGFzaC0+e1ZhbHVlfSB9IEBQb3NzaWJsZURlZmF1bHRTdGF0ZXM7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHN0YXRlIG5hbWVzIGFyZSBjb3JyZWN0Li4uCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkRmlyc3RIYXNoUmVmLAogICAgICAgICAgICAkUG9zc2libGVTdGF0ZUhhc2gtPntWYWx1ZX0sCiAgICAgICAgICAgICJQb3NzaWJsZSBTdGF0ZXMgVGVzdCAkVGVzdE51bWJlcjogfC0gbWF0Y2ggZGVmYXVsdCBzdGF0ZXMgZnJvbSAkU3RhdGUgU3RhdGUuIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHRoZSBzdGF0ZSBuYW1lIGlzIG5vdCByZXBldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2Vjb25kSGFzaFJlZiwKICAgICAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiB8LSBzdGF0ZXMgZm9ybSAkU3RhdGUgbWF0Y2ggb25seSBvbmNlIgogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwoKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpUZXN0U3VicykKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkQ29uZGl0aW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKTsKbXkgJENoYW5nZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7Cm15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyB0ZXN0IGlmIGNoYW5nZSBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5UcnVlKAogICAgJENoYW5nZU9iamVjdCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gY29uc3RydWN0aW9uIG9mIGNoYW5nZSBvYmplY3QnLAopOwoKIyB0ZXN0IGlmIHdvcmtvcmRlciBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5UcnVlKAogICAgJFdvcmtPcmRlck9iamVjdCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gY29uc3RydWN0aW9uIG9mIHdvcmtvcmRlciBvYmplY3QnLAopOwoKIyB0ZXN0IGlmIGNvbmRpdGlvbiBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5UcnVlKAogICAgJENvbmRpdGlvbk9iamVjdCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gY29uc3RydWN0aW9uIG9mIGNvbmRpdGlvbiBvYmplY3QnLAopOwoKIyB0dXJuIG9mZiBTZW5kTm90aWZpY2F0aW9ucywgaW4gb3JkZXIgdG8gYXZvaWQgYSBsb3Qgb2YgdXNlbGVzcyBtYWlscwpteSAkU2VuZE5vdGlmaWNhdGlvbnNPcmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmNhdGlvbnMnKTsKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zJywKICAgIFZhbHVlID0+IDAsCik7CgojIGRlZmluZSBuZWVkZWQgdmFyaWFibGUKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IENvbmRpdGlvbiBBUEkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgcHVibGljIGludGVyZmFjZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyKQpteSBAT2JqZWN0TWV0aG9kcyA9IHF3KAogICAgQXR0cmlidXRlQWRkCiAgICBBdHRyaWJ1dGVEZWxldGUKICAgIEF0dHJpYnV0ZUdldAogICAgQXR0cmlidXRlTGlzdAogICAgQXR0cmlidXRlTG9va3VwCiAgICBBdHRyaWJ1dGVVcGRhdGUKICAgIENvbmRpdGlvbkFkZAogICAgQ29uZGl0aW9uRGVsZXRlCiAgICBDb25kaXRpb25EZWxldGVBbGwKICAgIENvbmRpdGlvbkdldAogICAgQ29uZGl0aW9uTGlzdAogICAgQ29uZGl0aW9uTG9va3VwCiAgICBDb25kaXRpb25NYXRjaEV4ZWN1dGUKICAgIENvbmRpdGlvbk1hdGNoRXhlY3V0ZUFsbAogICAgQ29uZGl0aW9uVXBkYXRlCiAgICBFeHByZXNzaW9uQWRkCiAgICBFeHByZXNzaW9uRGVsZXRlCiAgICBFeHByZXNzaW9uRGVsZXRlQWxsCiAgICBFeHByZXNzaW9uR2V0CiAgICBFeHByZXNzaW9uTGlzdAogICAgRXhwcmVzc2lvbk1hdGNoCiAgICBFeHByZXNzaW9uVXBkYXRlCiAgICBPYmplY3RBZGQKICAgIE9iamVjdERlbGV0ZQogICAgT2JqZWN0R2V0CiAgICBPYmplY3RMaXN0CiAgICBPYmplY3RMb29rdXAKICAgIE9iamVjdFVwZGF0ZQogICAgT3BlcmF0b3JBZGQKICAgIE9wZXJhdG9yRGVsZXRlCiAgICBPcGVyYXRvckV4ZWN1dGUKICAgIE9wZXJhdG9yR2V0CiAgICBPcGVyYXRvckxpc3QKICAgIE9wZXJhdG9yTG9va3VwCiAgICBPcGVyYXRvclVwZGF0ZQopOwoKIyBjaGVjayBpZiBzdWJzIGFyZSBhdmFpbGFibGUKZm9yIG15ICRPYmplY3RNZXRob2QgKEBPYmplY3RNZXRob2RzKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT5jYW4oJE9iamVjdE1ldGhvZCksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayAnY2FuICRPYmplY3RNZXRob2QnIiwKICAgICk7Cn0KCiMKIyBtYWtlIHNvbWUgcHJlcGFyYXRpb25zCiMKCiMga2VlcCB0cmFjayBvZiBhIHRpbWUgYmVmb3JlIG9iamVjdHMgd2VyZSBhZGRlZCwKIyBmb3IgY29tcGFyaXNvbnMgaW4gZXhwcmVzc2lvbiBtYXRjaCB0ZXN0cwpteSAkRGF0ZVRpbWVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwpteSAkU3lzdGVtVGltZUJlZm9yZUFkZGluZyA9ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpIC0gMTsKCiMgY3JlYXRlIG5ldyBjaGFuZ2UKbXkgQENoYW5nZUlEczsKbXkgQENoYW5nZVRpdGxlczsKQ1JFQVRFQ0hBTkdFOgpmb3IgbXkgJENyZWF0ZUNoYW5nZSAoIDAgLi4gOSApIHsKICAgIG15ICRDaGFuZ2VUaXRsZSA9ICdVbml0VGVzdENoYW5nZScgLiAkQ3JlYXRlQ2hhbmdlOwogICAgbXkgJENoYW5nZUlEICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgIENoYW5nZVRpdGxlID0+ICRDaGFuZ2VUaXRsZSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDaGFuZ2VBZGQgLT4gJENoYW5nZUlEIiwKICAgICk7CgogICAgIyBkbyBub3Qgc3RvcmUgY2hhbmdlIGlkIGlmIGFkZCBmYWlsZWQKICAgIG5leHQgQ1JFQVRFQ0hBTkdFIGlmICEkQ2hhbmdlSUQ7CgogICAgIyBzdG9yZSBjaGFuZ2UgaWQgZm9yIGZ1cnRoZXIgdXNhZ2UgYW5kIGRlbGV0aW9uCiAgICBwdXNoIEBDaGFuZ2VJRHMsICAgICRDaGFuZ2VJRDsKICAgIHB1c2ggQENoYW5nZVRpdGxlcywgJENoYW5nZVRpdGxlOwp9CgojIGNyZWF0ZSBuZXcgd29ya29yZGVycwpteSBAV29ya09yZGVySURzOwpteSBAV29ya09yZGVyVGl0bGVzOwpDUkVBVEVXT1JLT1JERVI6CmZvciBteSAkQ3JlYXRlV29ya09yZGVyICggMCAuLiAoICggMyAqICggc2NhbGFyIEBDaGFuZ2VJRHMgKSApIC0gMSApICkgewogICAgbXkgJFdvcmtPcmRlclRpdGxlID0gJ1VuaXRUZXN0V08nIC4gJENyZWF0ZVdvcmtPcmRlcjsKICAgIG15ICRXb3JrT3JkZXJJRCAgICA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRDaGFuZ2VJRHNbICggJENyZWF0ZVdvcmtPcmRlciAlIHNjYWxhciBAQ2hhbmdlSURzICkgXSwKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZSwKICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKSwKICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgRXBvY2ggPT4gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCkgKyAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICBBY3R1YWxTdGFydFRpbWUgPT4gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIEVwb2NoID0+ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpICsgMTAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICktPlRvU3RyaW5nKCksCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIFdvcmtPcmRlckFkZCAoQ2hhbmdlSUQ6ICcKICAgICAgICAgICAgLiAkQ2hhbmdlSURzWyAoICRDcmVhdGVXb3JrT3JkZXIgJSBzY2FsYXIgQENoYW5nZUlEcyApIF0gLiAiKSAtPiAkV29ya09yZGVySUQiLAogICAgKTsKCiAgICAjIGRvIG5vdCBzdG9yZSB3b3Jrb3JkZXIgaWQgaWYgYWRkIGZhaWxlZAogICAgbmV4dCBDUkVBVEVXT1JLT1JERVIgaWYgISRXb3JrT3JkZXJJRDsKCiAgICAjIHN0b3JlIHdvcmtvcmRlciBpZCBmb3IgZnVydGhlciB1c2FnZSBhbmQgZGVsZXRpb24KICAgIHB1c2ggQFdvcmtPcmRlcklEcywgICAgJFdvcmtPcmRlcklEOwogICAgcHVzaCBAV29ya09yZGVyVGl0bGVzLCAkV29ya09yZGVyVGl0bGU7Cn0KCiMKIyBjb25kaXRpb24gdGVzdHMKIwoKIyBjcmVhdGUgbmV3IGNvbmRpdGlvbgpteSBAQ29uZGl0aW9uSURzOwpteSAlQ29uZGl0aW9uQ291bnQ7CkNIQU5HRUlEOgpmb3IgbXkgJENoYW5nZUlEIChAQ2hhbmdlSURzKSB7CgogICAgIyBhZGQgc29tZSBjb25kaXRpb25zIHRvIGVhY2ggY2hhbmdlCiAgICBDT05ESVRJT05DT1VOVEVSOgogICAgZm9yIG15ICRDb25kaXRpb25Db3VudGVyICggMCAuLiA1ICkgewoKICAgICAgICAjIGJ1aWxkIGNvbmRpdGlvbiBuYW1lCiAgICAgICAgbXkgJENvbmRpdGlvbk5hbWUgPSAiVW5pdFRlc3RDb25kaXRpb25OYW1lXyR7Q2hhbmdlSUR9XyIgLiAkQ29uZGl0aW9uQ291bnRlciAuICRSYW5kb21JRDsKCiAgICAgICAgIyBhZGQgYSBjb25kaXRpb24KICAgICAgICBteSAkQ29uZGl0aW9uSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25BZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkQ29uZGl0aW9uTmFtZSwKICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICdhbGwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25kaXRpb25JRCwKICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25BZGQgLT4gQ29uZGl0aW9uSUQ6ICRDb25kaXRpb25JRCIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05ESVRJT05DT1VOVEVSIGlmICEkQ29uZGl0aW9uSUQ7CgogICAgICAgICMgdGVzdCBjb25kaXRpb24gbG9va3VwIGJ5IG5hbWUKICAgICAgICBteSAkTG9va3VwQ29uZGl0aW9uSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25Mb29rdXAoCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRDb25kaXRpb25OYW1lLAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRMb29rdXBDb25kaXRpb25JRCwKICAgICAgICAgICAgJENvbmRpdGlvbklELAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkxvb2t1cCAtPiBOYW1lOiAkQ29uZGl0aW9uTmFtZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IGNvbmRpdGlvbiBsb29rdXAgYnkgaWQKICAgICAgICBteSAkTG9va3VwQ29uZGl0aW9uTmFtZSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkxvb2t1cCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRMb29rdXBDb25kaXRpb25OYW1lLAogICAgICAgICAgICAkQ29uZGl0aW9uTmFtZSwKICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25Mb29rdXAgLT4gQ29uZGl0aW9uSUQ6ICRDb25kaXRpb25JRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1lbWJlciBjaGFuZ2UgaWQgZm9yIGxhdGVyIHRlc3RzCiAgICAgICAgJENvbmRpdGlvbkNvdW50eyRDaGFuZ2VJRH0rKzsKCiAgICAgICAgIyBnZXQgdGhlIGFkZGVkIGNvbmRpdGlvbgogICAgICAgIG15ICRDb25kaXRpb25EYXRhID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uR2V0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ29uZGl0aW9uRGF0YS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgJENvbmRpdGlvbklELAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkdldCAtPiBDb25kaXRpb25JRDogJENvbmRpdGlvbklEIiwKICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIGFsbCBjcmVhdGVkIGNvbmRpdGlvbnMgaWRzCiAgICAgICAgcHVzaCBAQ29uZGl0aW9uSURzLCAkQ29uZGl0aW9uSUQ7CgogICAgICAgICMgY29uZGl0aW9uIHVwZGF0ZSB0ZXN0cwogICAgICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uVXBkYXRlKAogICAgICAgICAgICBDb25kaXRpb25JRCAgICAgICAgICAgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FsbCcsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAnQW4gdXBkYXRlZCBjb21tZW50JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvblVwZGF0ZSAtPiBDb25kaXRpb25JRDogJENvbmRpdGlvbklEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgdXBkYXRlZCBjb25kaXRpb24KICAgICAgICAkQ29uZGl0aW9uRGF0YSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkdldCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENvbmRpdGlvbkRhdGEtPntDb21tZW50fSwKICAgICAgICAgICAgJ0FuIHVwZGF0ZWQgY29tbWVudCcsCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uR2V0IC0+IENvbmRpdGlvbklEOiAkQ29uZGl0aW9uSUQiLAogICAgICAgICk7CgogICAgICAgICMgdHJ5IHRvIGFkZCB0aGUgc2FtZSBjb25kaXRpb24gYWdhaW4gKENoYW5nZUlEIGFuZCBOYW1lIGFyZSB0aGUgc2FtZSkgKG11c3QgZmFpbCkKICAgICAgICAkQ29uZGl0aW9uSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25BZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkQ29uZGl0aW9uTmFtZSwKICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICdhbGwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uQWRkIiwKICAgICAgICApOwoKICAgICAgICAjIGp1c3QgaW4gY2FzZSBpZiB0aGUgY29uZGl0aW9uIGNvdWxkIGJlIGFkZGVkCiAgICAgICAgaWYgKCRDb25kaXRpb25JRCkgewogICAgICAgICAgICBwdXNoIEBDb25kaXRpb25JRHMsICRDb25kaXRpb25JRDsKICAgICAgICB9CiAgICB9Cn0KCiMgY29uZGl0aW9uIGxpc3QgdGVzdApDSEFOR0VJRDoKZm9yIG15ICRDaGFuZ2VJRCAoIHNvcnQga2V5cyAlQ29uZGl0aW9uQ291bnQgKSB7CgogICAgIyBnZXQgY29uZGl0aW9uIGxpc3QKICAgIG15ICRDb25kaXRpb25JRHNSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25MaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBWYWxpZCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskQ29uZGl0aW9uSURzUmVmfSwKICAgICAgICAkQ29uZGl0aW9uQ291bnR7JENoYW5nZUlEfSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkxpc3QgLT4gTnVtYmVyIG9mIGNvbmRpdGlvbnMgZm9yIENoYW5nZUlEOiAkQ2hhbmdlSUQiLAogICAgKTsKCiAgICAjIGlmIG5vIGNvbmRpdGlvbnMgZXhpc3QgZm9yIHRoaXMgY2hhbmdlCiAgICBuZXh0IENIQU5HRUlEIGlmICFAeyRDb25kaXRpb25JRHNSZWZ9OwoKICAgICMgc2V0IHRoZSBmaXJzdCBjb25kaXRpb24gb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGludmFsaWQKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uVXBkYXRlKAogICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRHNSZWYtPlswXSwKICAgICAgICBWYWxpZElEICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgIyBpbnZhbGlkCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25VcGRhdGUgLT4gQ29uZGl0aW9uSUQ6ICRDb25kaXRpb25JRHNSZWYtPlswXSIsCiAgICApOwoKICAgICMgZ2V0IGNvbmRpdGlvbiBsaXN0IGFnYWluCiAgICAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVmFsaWQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JENvbmRpdGlvbklEc1JlZn0sCiAgICAgICAgJENvbmRpdGlvbkNvdW50eyRDaGFuZ2VJRH0gLSAxLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uTGlzdCAtPiBOdW1iZXIgb2YgY29uZGl0aW9ucyBmb3IgQ2hhbmdlSUQ6ICRDaGFuZ2VJRCIsCiAgICApOwoKICAgICMgZ2V0IGNvbmRpdGlvbiBsaXN0IGFnYWluLCBidXQgbm93IHdpdGggYWxzbyB0aGUgaW52YWxpZCBjb25kaXRpb25zCiAgICAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVmFsaWQgICAgPT4gMCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JENvbmRpdGlvbklEc1JlZn0sCiAgICAgICAgJENvbmRpdGlvbkNvdW50eyRDaGFuZ2VJRH0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25MaXN0IC0+IE51bWJlciBvZiBjb25kaXRpb25zIGZvciBDaGFuZ2VJRDogJENoYW5nZUlEIiwKICAgICk7Cgp9CgojCiMgY29uZGl0aW9uIG9iamVjdCB0ZXN0cwojCgojIGNoZWNrIGNvbmRpdGlvbiBzdWItb2JqZWN0cwpmb3IgbXkgJENvbmRpdGlvblN1Yk9iamVjdE5hbWUgKHF3KElUU01DaGFuZ2UgSVRTTVdvcmtPcmRlcikpIHsKCiAgICAjIG1ha2UgbG9va3VwIHRvIGdldCBvYmplY3QgaWQKICAgIG15ICRPYmplY3RJRCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJENvbmRpdGlvblN1Yk9iamVjdE5hbWUsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApIHx8ICcnOwoKICAgICMgY2hlY2sgb24gcmV0dXJuIHZhbHVlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT2JqZWN0SUQsCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICIgLSBPYmplY3RMb29rdXAgb24gJyRDb25kaXRpb25TdWJPYmplY3ROYW1lJyAtPiBPYmplY3RJRDogJE9iamVjdElEIiwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IGRhdGEgd2l0aCBvYmplY3QgaWQKICAgIG15ICRPYmplY3REYXRhID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0R2V0KAogICAgICAgIE9iamVjdElEID0+ICRPYmplY3RJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHJldHVybiBwYXJhbWV0ZXJzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJE9iamVjdERhdGEtPntOYW1lfSwKICAgICAgICAkQ29uZGl0aW9uU3ViT2JqZWN0TmFtZSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIE9iamVjdEdldCgpIG5hbWUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3Igb2JqZWN0IGFkZApteSBAQ29uZGl0aW9uT2JqZWN0Q3JlYXRlZDsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIG5ldyBvYmplY3RzCiAgICBteSAkT2JqZWN0SUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RBZGQoCiAgICAgICAgTmFtZSAgID0+ICdPYmplY3ROYW1lJyAuICRDb3VudGVyIC4gJFJhbmRvbUlELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIG9uIHJldHVybiB2YWx1ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE9iamVjdElELAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT2JqZWN0QWRkIC0+IE9iamVjdElEOiAkT2JqZWN0SUQiLAogICAgKTsKCiAgICAjIHNhdmUgb2JqZWN0IGlkIGZvciBkZWxldGUgdGVzdAogICAgcHVzaCBAQ29uZGl0aW9uT2JqZWN0Q3JlYXRlZCwgJE9iamVjdElEOwp9CgojIGNoZWNrIGNvbmRpdGlvbiBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdExpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgZm9yIG9iamVjdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9iamVjdExpc3QsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9iamVjdExpc3QgaXMgbm90IGVtcHR5IiwKKTsKCiMgY2hlY2sgZm9yIG9iamVjdCBsaXN0IGFzIGhhc2ggcmVmCiRTZWxmLT5JcygKICAgIHJlZiAkT2JqZWN0TGlzdCwKICAgICdIQVNIJywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT2JqZWN0TGlzdCB0eXBlIiwKKTsKCiMgY2hlY2sgdXBkYXRlIG9mIGNvbmRpdGlvbiBvYmplY3QKbXkgJENvbmRpdGlvbk9iamVjdE5ld05hbWUgPSAnVW5pdFRlc3RVcGRhdGUnIC4gJFJhbmRvbUlEOwokU2VsZi0+VHJ1ZSgKICAgICRDb25kaXRpb25PYmplY3QtPk9iamVjdFVwZGF0ZSgKICAgICAgICBPYmplY3RJRCA9PiAkQ29uZGl0aW9uT2JqZWN0Q3JlYXRlZFswXSwKICAgICAgICBOYW1lICAgICA9PiAkQ29uZGl0aW9uT2JqZWN0TmV3TmFtZSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT2JqZWN0VXBkYXRlIiwKKTsKbXkgJENvbmRpdGlvbk9iamVjdFVwZGF0ZSA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdEdldCgKICAgIE9iamVjdElEID0+ICRDb25kaXRpb25PYmplY3RDcmVhdGVkWzBdLAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPklzKAogICAgJENvbmRpdGlvbk9iamVjdFVwZGF0ZS0+e05hbWV9LAogICAgJENvbmRpdGlvbk9iamVjdE5ld05hbWUsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9iamVjdFVwZGF0ZSB2ZXJpZnkgdXBkYXRlIiwKKTsKCiMgY2hlY2sgZm9yIG9iamVjdCBkZWxldGUKZm9yIG15ICRPYmplY3RJRCAoQENvbmRpdGlvbk9iamVjdENyZWF0ZWQpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25kaXRpb25PYmplY3QtPk9iamVjdERlbGV0ZSgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJE9iamVjdElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPYmplY3REZWxldGUgLT4gT2JqZWN0SUQ6ICRPYmplY3RJRCIsCiAgICApOwp9CgojCiMgY29uZGl0aW9uIGF0dHJpYnV0ZXMgdGVzdHMKIwoKIyBjaGVjayBmb3IgZGVmYXVsdCBjb25kaXRpb24gYXR0cmlidXRlcwpteSBAQ29uZGl0aW9uQXR0cmlidXRlcyA9IHF3KAogICAgQ2hhbmdlVGl0bGUgICAgICBDYXRlZ29yeUlEICAgICAgSW1wYWN0SUQgUHJpb3JpdHlJRCBQbGFubmVkRWZmb3J0ICAgIEFjY291bnRlZFRpbWUKICAgIENoYW5nZU1hbmFnZXJJRCAgQ2hhbmdlQnVpbGRlcklEIFdvcmtPcmRlckFnZW50SUQKICAgIFdvcmtPcmRlclRpdGxlICAgV29ya09yZGVyTnVtYmVyIFdvcmtPcmRlclN0YXRlSUQgICAgV29ya09yZGVyVHlwZUlECiAgICBQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lICBBY3R1YWxTdGFydFRpbWUgICAgIEFjdHVhbEVuZFRpbWUKKTsKCiMgY2hlY2sgY29uZGl0aW9uIGF0dHJpYnV0ZXMKZm9yIG15ICRDb25kaXRpb25BdHRyaWJ1dGUgKEBDb25kaXRpb25BdHRyaWJ1dGVzKSB7CgogICAgIyBtYWtlIGxvb2t1cCB0byBnZXQgYXR0cmlidXRlIGlkCiAgICBteSAkQXR0cmlidXRlSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgTmFtZSA9PiAkQ29uZGl0aW9uQXR0cmlidXRlLAogICAgKSB8fCAnJzsKCiAgICAjIGNoZWNrIG9uIHJldHVybiB2YWx1ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dHJpYnV0ZUlELAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiIC0gQXR0cmlidXRlTG9va3VwIG9uICckQ29uZGl0aW9uQXR0cmlidXRlJyAtPiBBdHRyaWJ1dGVJRDogJEF0dHJpYnV0ZUlEJyIsCiAgICApOwoKICAgICMgZ2V0IGF0dHJpYnV0ZSBkYXRhIHdpdGggYXR0cmlidXRlIGlkCiAgICBteSAkQXR0cmlidXRlRGF0YSA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBdHRyaWJ1dGVJRCwKICAgICk7CgogICAgIyBjaGVjayByZXR1cm4gcGFyYW1ldGVycwogICAgJFNlbGYtPklzKAogICAgICAgICRBdHRyaWJ1dGVEYXRhLT57TmFtZX0sCiAgICAgICAgJENvbmRpdGlvbkF0dHJpYnV0ZSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIEF0dHJpYnV0ZUdldCgpIG5hbWUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3Igb2JqZWN0IGFkZApteSBAQ29uZGl0aW9uQXR0cmlidXRlQ3JlYXRlZDsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIG5ldyBvYmplY3RzCiAgICBteSAkQXR0cmlidXRlSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVBZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdBdHRyaWJ1dGVOYW1lJyAuICRDb3VudGVyIC4gJFJhbmRvbUlELAogICAgKTsKCiAgICAjIGNoZWNrIG9uIHJldHVybiB2YWx1ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dHJpYnV0ZUlELAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlQWRkIC0+IEF0dHJpYnV0ZUlEOiAkQXR0cmlidXRlSUQiLAogICAgKTsKCiAgICAjIHNhdmUgb2JqZWN0IGl0IGZvciBkZWxldGUgdGVzdAogICAgcHVzaCBAQ29uZGl0aW9uQXR0cmlidXRlQ3JlYXRlZCwgJEF0dHJpYnV0ZUlEOwp9CgojIGNoZWNrIGNvbmRpdGlvbiBhdHRyaWJ1dGUgbGlzdApteSAkQXR0cmlidXRlTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgZm9yIGF0dHJpYnV0ZSBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEF0dHJpYnV0ZUxpc3QsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEF0dHJpYnV0ZUxpc3QgaXMgbm90IGVtcHR5IiwKKTsKCiMgY2hlY2sgZm9yIGF0dHJpYnV0ZSBsaXN0IGFzIGhhc2ggcmVmCiRTZWxmLT5JcygKICAgIHJlZiAkQXR0cmlidXRlTGlzdCwKICAgICdIQVNIJywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlTGlzdCB0eXBlIiwKKTsKCiMgY2hlY2sgdXBkYXRlIG9mIGF0dHJpYnV0ZSBvYmplY3QKbXkgJENvbmRpdGlvbkF0dHJpYnV0ZU5ld05hbWUgPSAnVW5pdFRlc3RVcGRhdGUnIC4gJFJhbmRvbUlEOwokU2VsZi0+VHJ1ZSgKICAgICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZVVwZGF0ZSgKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRDb25kaXRpb25BdHRyaWJ1dGVDcmVhdGVkWzBdLAogICAgICAgIE5hbWUgICAgICAgID0+ICRDb25kaXRpb25BdHRyaWJ1dGVOZXdOYW1lLAogICAgKSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlVXBkYXRlIiwKKTsKbXkgJENvbmRpdGlvbkF0dHJpYnV0ZVVwZGF0ZSA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUdldCgKICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICBBdHRyaWJ1dGVJRCA9PiAkQ29uZGl0aW9uQXR0cmlidXRlQ3JlYXRlZFswXSwKKTsKJFNlbGYtPklzKAogICAgJENvbmRpdGlvbkF0dHJpYnV0ZVVwZGF0ZS0+e05hbWV9LAogICAgJENvbmRpdGlvbkF0dHJpYnV0ZU5ld05hbWUsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEF0dHJpYnV0ZVVwZGF0ZSB2ZXJpZnkgdXBkYXRlIiwKKTsKCiMgY2hlY2sgZm9yIGF0dHJpYnV0ZSBkZWxldGUKZm9yIG15ICRBdHRyaWJ1dGVJRCAoQENvbmRpdGlvbkF0dHJpYnV0ZUNyZWF0ZWQpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZURlbGV0ZSgKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJEF0dHJpYnV0ZUlELAogICAgICAgICksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBdHRyaWJ1dGVEZWxldGUgLT4gQXR0cmlidXRlSUQ6ICRBdHRyaWJ1dGVJRCIsCiAgICApOwp9CgojCiMgY29uZGl0aW9uIG9wZXJhdG9yIHRlc3RzCiMKCiMgY2hlY2sgZm9yIGRlZmF1bHQgY29uZGl0aW9uIG9wZXJhdG9ycwpteSBAQ29uZGl0aW9uT3BlcmF0b3JzID0gKAoKICAgICMgY29tbW9uIG1hdGNoaW5nCiAgICAnaXMnLCAnaXMgbm90JywgJ2lzIGVtcHR5JywgJ2lzIG5vdCBlbXB0eScsCgogICAgIyBkaWdpdCBtYXRjaGluZwogICAgJ2lzIGdyZWF0ZXIgdGhhbicsICdpcyBsZXNzIHRoYW4nLAoKICAgICMgZGF0ZSBtYXRjaGluZwogICAgJ2lzIGJlZm9yZScsICdpcyBhZnRlcicsCgogICAgIyBzdHJpbmcgbWF0Y2hpbmcKICAgICdjb250YWlucycsICdub3QgY29udGFpbnMnLCAnYmVnaW5zIHdpdGgnLCAnZW5kcyB3aXRoJywKCiAgICAjIGFjdGlvbiBvcGVyYXRvcgogICAgJ3NldCcsICdsb2NrJywKKTsKCiMgY2hlY2sgY29uZGl0aW9uIG9wZXJhdG9ycwpmb3IgbXkgJENvbmRpdGlvbk9wZXJhdG9yIChAQ29uZGl0aW9uT3BlcmF0b3JzKSB7CgogICAgIyBtYWtlIGxvb2t1cCB0byBnZXQgb3BlcmF0b3IgaWQKICAgIG15ICRPcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JMb29rdXAoIE5hbWUgPT4gJENvbmRpdGlvbk9wZXJhdG9yICkgfHwgJyc7CgogICAgIyBjaGVjayBvbiByZXR1cm4gdmFsdWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRPcGVyYXRvcklELAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiIC0gT3BlcmF0b3JMb29rdXAgb24gJyRDb25kaXRpb25PcGVyYXRvcicgLT4gT3BlcmF0b3JJRDogJE9wZXJhdG9ySUQiLAogICAgKTsKCiAgICAjIGdldCBvcGVyYXRvciBkYXRhIHdpdGggb3BlcmF0b3IgaWQKICAgIG15ICRPcGVyYXRvckRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckdldCgKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgT3BlcmF0b3JJRCA9PiAkT3BlcmF0b3JJRCwKICAgICk7CgogICAgIyBjaGVjayByZXR1cm4gcGFyYW1ldGVycwogICAgJFNlbGYtPklzKAogICAgICAgICRPcGVyYXRvckRhdGEtPntOYW1lfSwKICAgICAgICAkQ29uZGl0aW9uT3BlcmF0b3IsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBPcGVyYXRvckdldCgpIG5hbWUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3Igb2JqZWN0IGFkZApteSBAQ29uZGl0aW9uT3BlcmF0b3JDcmVhdGVkOwpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgIyBhZGQgbmV3IG9iamVjdHMKICAgIG15ICRPcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JBZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdPcGVyYXRvck5hbWUnIC4gJENvdW50ZXIgLiAkUmFuZG9tSUQsCiAgICApOwoKICAgICMgY2hlY2sgb24gcmV0dXJuIHZhbHVlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT3BlcmF0b3JJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9wZXJhdG9yQWRkIC0+IE9wZXJhdG9ySUQ6ICRPcGVyYXRvcklEIiwKICAgICk7CgogICAgIyBzYXZlIG9iamVjdCBpdCBmb3IgZGVsZXRlIHRlc3QKICAgIHB1c2ggQENvbmRpdGlvbk9wZXJhdG9yQ3JlYXRlZCwgJE9wZXJhdG9ySUQ7Cn0KCiMgY2hlY2sgY29uZGl0aW9uIG9wZXJhdG9yIGxpc3QKbXkgJE9wZXJhdG9yTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayBmb3Igb3BlcmF0b3IgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRPcGVyYXRvckxpc3QsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9wZXJhdG9yTGlzdCBpcyBub3QgZW1wdHkiLAopOwoKIyBjaGVjayBmb3Igb3BlcmF0b3IgbGlzdCBhcyBoYXNoIHJlZgokU2VsZi0+SXMoCiAgICByZWYgJE9wZXJhdG9yTGlzdCwKICAgICdIQVNIJywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT3BlcmF0b3JMaXN0IHR5cGUiLAopOwoKIyBjaGVjayB1cGRhdGUgb2Ygb3BlcmF0b3Igb2JqZWN0Cm15ICRDb25kaXRpb25PcGVyYXRvck5ld05hbWUgPSAnVW5pdFRlc3RVcGRhdGUnIC4gJFJhbmRvbUlEOwokU2VsZi0+VHJ1ZSgKICAgICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yVXBkYXRlKAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBPcGVyYXRvcklEID0+ICRDb25kaXRpb25PcGVyYXRvckNyZWF0ZWRbMF0sCiAgICAgICAgTmFtZSAgICAgICA9PiAkQ29uZGl0aW9uT3BlcmF0b3JOZXdOYW1lLAogICAgKSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT3BlcmF0b3JVcGRhdGUiLAopOwpteSAkQ29uZGl0aW9uT3BlcmF0b3JVcGRhdGUgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckdldCgKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIE9wZXJhdG9ySUQgPT4gJENvbmRpdGlvbk9wZXJhdG9yQ3JlYXRlZFswXSwKKTsKJFNlbGYtPklzKAogICAgJENvbmRpdGlvbk9wZXJhdG9yVXBkYXRlLT57TmFtZX0sCiAgICAkQ29uZGl0aW9uT3BlcmF0b3JOZXdOYW1lLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPcGVyYXRvclVwZGF0ZSB2ZXJpZnkgdXBkYXRlIiwKKTsKCiMgY2hlY2sgZm9yIG9wZXJhdG9yIGRlbGV0ZQpmb3IgbXkgJE9wZXJhdG9ySUQgKEBDb25kaXRpb25PcGVyYXRvckNyZWF0ZWQpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yRGVsZXRlKAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gJE9wZXJhdG9ySUQsCiAgICAgICAgKSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9wZXJhdG9yRGVsZXRlIC0+IE9wZXJhdG9ySUQ6ICRPcGVyYXRvcklEIiwKICAgICk7Cn0KCiMKIyBjb25kaXRpb24gZXhwcmVzc2lvbiB0ZXN0cwojCgojIGNoZWNrIGZvciBkZWZhdWx0IGNvbmRpdGlvbiBleHByZXNzaW9ucwpteSBARXhwcmVzc2lvblRlc3RzID0gKAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnRHVtbXlDb21wYXJlVmFsdWUxJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VNYW5hZ2VySUQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkQ2hhbmdlSURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdEdW1teUNvbXBhcmVWYWx1ZTEnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbm90JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzFdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ0R1bW15Q29tcGFyZVZhbHVlMicsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwcmVzc2lvblVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnTmV3RHVtbXlDb21wYXJlVmFsdWUnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBub3QnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1sxXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cHJlc3Npb25VcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBncmVhdGVyIHRoYW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnRHVtbXlDb21wYXJlVmFsdWUyJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHByZXNzaW9uVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIFNlbGVjdG9yID0+ICRXb3JrT3JkZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkQ2hhbmdlVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBub3QnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkQ2hhbmdlVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBub3QnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkQ2hhbmdlVGl0bGVzWzBdIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRXb3JrT3JkZXJUaXRsZXNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICdhbGwnLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRXb3JrT3JkZXJUaXRsZXNbOF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICdhbnknLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRXb3JrT3JkZXJUaXRsZXNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIGVtcHR5JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFdvcmtPcmRlclRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbm90IGVtcHR5JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFdvcmtPcmRlclRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlck51bWJlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIGdyZWF0ZXIgdGhhbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBncmVhdGVyIHRoYW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAxXzAwMF8wMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBsZXNzIHRoYW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAxXzAwMF8wMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBsZXNzIHRoYW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCkgKyAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVwb2NoID0+ICRTeXN0ZW1UaW1lQmVmb3JlQWRkaW5nLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLT5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIGFmdGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBFcG9jaCA9PiAkU3lzdGVtVGltZUJlZm9yZUFkZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBhZnRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCkgKyAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS0+VG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdjb250YWlucycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+IHN1YnN0ciggJFdvcmtPcmRlclRpdGxlc1swXSwgLTQgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnY29udGFpbnMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdjb250YWlucycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdOb3QgQSBWYWxpZCBWYWx1ZSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdub3QgY29udGFpbnMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnTm90IEEgVmFsaWQgVmFsdWUgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnbm90IGNvbnRhaW5zJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFdvcmtPcmRlclRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnYmVnaW5zIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDAsIDQgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnYmVnaW5zIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDEgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnZW5kcyB3aXRoJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gc3Vic3RyKCAkV29ya09yZGVyVGl0bGVzWzBdLCAtNCApLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdlbmRzIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDEsIDMgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVGVzdCBmb3IgYnVnIyAxMDg2MgogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZU1hbmFnZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkQ2hhbmdlSURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgojIGNoZWNrIGNvbmRpdGlvbiBleHByZXNzaW9ucwpteSBARXhwcmVzc2lvbklEczsKRVhQUkVTU0lPTlRFU1Q6CmZvciBteSAkRXhwcmVzc2lvblRlc3QgKEBFeHByZXNzaW9uVGVzdHMpIHsKCiAgICAjIHN0b3JlIGRhdGEgb2YgdGVzdCBjYXNlcyBsb2NhbGx5CiAgICBteSAlU291cmNlRGF0YTsKICAgIG15ICRFeHByZXNzaW9uSUQ7CiAgICBteSAlRXhwcmVzc2lvbkFkZFNvdXJjZURhdGE7CiAgICBteSAlRXhwcmVzc2lvbkFkZERhdGE7CgogICAgIyBleHRyYWN0IHNvdXJjZSBkYXRhCiAgICBpZiAoICRFeHByZXNzaW9uVGVzdC0+e1NvdXJjZURhdGF9ICkgewogICAgICAgICVTb3VyY2VEYXRhID0gJXsgJEV4cHJlc3Npb25UZXN0LT57U291cmNlRGF0YX0gfTsKICAgIH0KCiAgICBuZXh0IEVYUFJFU1NJT05URVNUIGlmICElU291cmNlRGF0YTsKCiAgICBDUkVBVEVEQVRBOgogICAgZm9yIG15ICRDcmVhdGVEYXRhICggc29ydCBrZXlzICVTb3VyY2VEYXRhICkgewoKICAgICAgICAjIGFkZCBleHByZXNzaW9uCiAgICAgICAgaWYgKCAkQ3JlYXRlRGF0YSBlcSAnRXhwcmVzc2lvbkFkZCcgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgRXhwcmVzc2lvbkFkZCBkYXRhCiAgICAgICAgICAgICVFeHByZXNzaW9uQWRkU291cmNlRGF0YSA9ICV7ICRTb3VyY2VEYXRheyRDcmVhdGVEYXRhfSB9OwoKICAgICAgICAgICAgIyBzZXQgc3RhdGljIGZpZWxkcwogICAgICAgICAgICBteSBAU3RhdGljRmllbGRzID0gcXcoIFNlbGVjdG9yIENvbXBhcmVWYWx1ZSBVc2VySUQgQ29uZGl0aW9uSUQgKTsKCiAgICAgICAgICAgIFNUQVRJQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJFN0YXRpY0ZpZWxkIChAU3RhdGljRmllbGRzKSB7CgogICAgICAgICAgICAgICAgIyBvbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICFleGlzdHMgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH0KICAgICAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkRXhwcmVzc2lvbkFkZFNvdXJjZURhdGF7JFN0YXRpY0ZpZWxkfTsKCiAgICAgICAgICAgICAgICAjIHNhZmUgZGF0YQogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25BZGREYXRheyRTdGF0aWNGaWVsZH0gPSAkRXhwcmVzc2lvbkFkZFNvdXJjZURhdGF7JFN0YXRpY0ZpZWxkfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWxsIGZpZWxkcyBmb3IgRXhwcmVzc2lvbkFkZAogICAgICAgICAgICBFWFBSRVNTSU9OQUREVkFMVUU6CiAgICAgICAgICAgIGZvciBteSAkRXhwcmVzc2lvbkFkZFZhbHVlICggc29ydCBrZXlzICVFeHByZXNzaW9uQWRkU291cmNlRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIG9taXQgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9OQUREVkFMVUUgaWYgZ3JlcCB7ICRfIGVxICRFeHByZXNzaW9uQWRkVmFsdWUgfSBAU3RhdGljRmllbGRzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBmb3IgZmllbGRzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkVmFsdWUgKCBzb3J0IGtleXMgJXsgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRFeHByZXNzaW9uQWRkVmFsdWV9IH0gKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAgICAgICAgICRFeHByZXNzaW9uQWRkRGF0YXskRXhwcmVzc2lvbkFkZFZhbHVlfSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25kaXRpb25PYmplY3QtPiRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgICAgICAgICAleyAkRXhwcmVzc2lvbkFkZFNvdXJjZURhdGF7JEV4cHJlc3Npb25BZGRWYWx1ZX0tPnskRmllbGRWYWx1ZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgZXhwcmVzc2lvbgogICAgICAgICAgICAkRXhwcmVzc2lvbklEID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkFkZCgKICAgICAgICAgICAgICAgICVFeHByZXNzaW9uQWRkRGF0YSwKICAgICAgICAgICAgKSB8fCAwOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSAkQ3JlYXRlRGF0YSAtPiAkRXhwcmVzc2lvbklEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ1JFQVRFREFUQSBpZiAhJEV4cHJlc3Npb25JRDsKCiAgICAgICAgICAgICMgc2F2ZSBjcmVhdGVkIElEIGZvciBkZWxldGluZyBleHByZXNzaW9ucwogICAgICAgICAgICBwdXNoIEBFeHByZXNzaW9uSURzLCAkRXhwcmVzc2lvbklEOwoKICAgICAgICAgICAgIyBjaGVjayB0aGUgYWRkZWQgZXhwcmVzc2lvbgogICAgICAgICAgICBteSAkRXhwcmVzc2lvbkdldERhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uR2V0KAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLAogICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBFeHByZXNzaW9uQWRkKCk6IEV4cHJlc3Npb25HZXQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0ZXN0IHZhbHVlcwogICAgICAgICAgICBkZWxldGUgJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH07CiAgICAgICAgICAgIGZvciBteSAkVGVzdFZhbHVlICggc29ydCBrZXlzICVFeHByZXNzaW9uQWRkRGF0YSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkRXhwcmVzc2lvbkdldERhdGEtPnskVGVzdFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAkRXhwcmVzc2lvbkFkZERhdGF7JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBFeHByZXNzaW9uQWRkKCk6IEV4cHJlc3Npb25HZXQgLT4gJFRlc3RWYWx1ZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAjIGVuZCBpZiAoICRDcmVhdGVEYXRhIGVxICdFeHByZXNzaW9uQWRkJyApCgogICAgICAgICMgdXBkYXRlIGV4cHJlc3Npb24KICAgICAgICBpZiAoICRDcmVhdGVEYXRhIGVxICdFeHByZXNzaW9uVXBkYXRlJyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBFeHByZXNzaW9uVXBkYXRlIGRhdGEKICAgICAgICAgICAgbXkgJUV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRhID0gJXsgJFNvdXJjZURhdGF7JENyZWF0ZURhdGF9IH07CiAgICAgICAgICAgIG15ICVFeHByZXNzaW9uVXBkYXRlRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgbXkgQFN0YXRpY0ZpZWxkcyA9IHF3KCBTZWxlY3RvciBDb21wYXJlVmFsdWUgVXNlcklEIENvbmRpdGlvbklEICk7CgogICAgICAgICAgICBTVEFUSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRTdGF0aWNGaWVsZCAoQFN0YXRpY0ZpZWxkcykgewoKICAgICAgICAgICAgICAgICMgb21pdCBzdGF0aWMgZmllbGQgaWYgaXQgaXMgbm90IHNldAogICAgICAgICAgICAgICAgbmV4dCBTVEFUSUNGSUVMRCBpZiAhJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH07CgogICAgICAgICAgICAgICAgIyBzYWZlIGRhdGEKICAgICAgICAgICAgICAgICRFeHByZXNzaW9uVXBkYXRlRGF0YXskU3RhdGljRmllbGR9ID0gJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFsbCBmaWVsZHMgZm9yIEV4cHJlc3Npb25VcGRhdGUKICAgICAgICAgICAgRVhQUkVTU0lPTlVQREFURVZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25VcGRhdGVWYWx1ZSAoIHNvcnQga2V5cyAlRXhwcmVzc2lvblVwZGF0ZVNvdXJjZURhdGEgKSB7CgogICAgICAgICAgICAgICAgIyBvbWl0IHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIG5leHQgRVhQUkVTU0lPTlVQREFURVZBTFVFIGlmIGdyZXAgeyAkXyBlcSAkRXhwcmVzc2lvblVwZGF0ZVZhbHVlIH0gQFN0YXRpY0ZpZWxkczsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIGZpZWxkcwogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZFZhbHVlICgKICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsgJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRFeHByZXNzaW9uVXBkYXRlVmFsdWV9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgc3RvcmUgZ2F0aGVyZWQgaW5mb3JtYXRpb24gaW4gaGFzaCBmb3IgdXBkYXRpbmcKICAgICAgICAgICAgICAgICAgICAkRXhwcmVzc2lvblVwZGF0ZURhdGF7JEV4cHJlc3Npb25VcGRhdGVWYWx1ZX0gPQogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT4kRmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRFeHByZXNzaW9uVXBkYXRlVmFsdWV9LT57JEZpZWxkVmFsdWV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIGV4cHJlc3Npb24KICAgICAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uVXBkYXRlKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICAlRXhwcmVzc2lvblVwZGF0ZURhdGEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNjZXNzLAogICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSAkQ3JlYXRlRGF0YSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENSRUFURURBVEEgaWYgISRVcGRhdGVTdWNjZXNzOwoKICAgICAgICAgICAgIyBjaGVjayB0aGUgYWRkZWQgZXhwcmVzc2lvbgogICAgICAgICAgICBteSAkRXhwcmVzc2lvbkdldERhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uR2V0KAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJEV4cHJlc3Npb25VcGRhdGVEYXRhe1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLAogICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBFeHByZXNzaW9uVXBkYXRlKCk6IEV4cHJlc3Npb25HZXQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtZXJnZSBhZGQgYW5kIHVwZGF0ZSBkYXRhCiAgICAgICAgICAgICVFeHByZXNzaW9uVXBkYXRlRGF0YSA9ICggJUV4cHJlc3Npb25BZGREYXRhLCAlRXhwcmVzc2lvblVwZGF0ZURhdGEgKTsKCiAgICAgICAgICAgICMgdGVzdCB2YWx1ZXMKICAgICAgICAgICAgZGVsZXRlICRFeHByZXNzaW9uVXBkYXRlRGF0YXtVc2VySUR9OwogICAgICAgICAgICBmb3IgbXkgJFRlc3RWYWx1ZSAoIHNvcnQga2V5cyAlRXhwcmVzc2lvblVwZGF0ZURhdGEgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLT57JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25VcGRhdGVEYXRheyRUZXN0VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gRXhwcmVzc2lvblVwZGF0ZSgpOiBFeHByZXNzaW9uR2V0IC0+ICRUZXN0VmFsdWUiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0gICAgIyBlbmQgaWYgKCAkQ3JlYXRlRGF0YSBlcSAnRXhwcmVzc2lvblVwZGF0ZScgKQogICAgfQp9CgojIGNoZWNrIGZvciBleHByZXNzaW9uIGxpc3QKQ09ORElUSU9OSUQ6CmZvciBteSAkQ29uZGl0aW9uSUQgKEBDb25kaXRpb25JRHMpIHsKCiAgICAjIGNoZWNrIGZvciBleHByZXNzaW9ucyBvZiB0aGlzIGNvbmRpdGlvbiBpZAogICAgbXkgJEV4cHJlc3Npb25UZXN0Q291bnQgPSAwOwogICAgRVhQUkVTU0lPTlRFU1Q6CiAgICBmb3IgbXkgJEV4cHJlc3Npb25UZXN0IChARXhwcmVzc2lvblRlc3RzKSB7CgogICAgICAgICMgb21pdCB0ZXN0IGNhc2UgaWYgbm8gc291cmNlIGRhdGEgaXMgYXZhaWxhYmxlCiAgICAgICAgbmV4dCBFWFBSRVNTSU9OVEVTVCBpZiAhJEV4cHJlc3Npb25UZXN0LT57U291cmNlRGF0YX07CgogICAgICAgICMgb21pdCB0ZXN0IGNhc2UgaWYgbm8gZXhwcmVzc2lvbiBzaG91bGQgYmUgYWRkZWQKICAgICAgICBuZXh0IEVYUFJFU1NJT05URVNUIGlmICEkRXhwcmVzc2lvblRlc3QtPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25BZGR9OwoKICAgICAgICAkRXhwcmVzc2lvblRlc3RDb3VudCsrCiAgICAgICAgICAgIGlmICRFeHByZXNzaW9uVGVzdC0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvbkFkZH0tPntDb25kaXRpb25JRH0gPT0gJENvbmRpdGlvbklEOwogICAgfQoKICAgIG15ICRFeHByZXNzaW9uTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgcmVmICRFeHByZXNzaW9uTGlzdCwKICAgICAgICAnQVJSQVknLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gRXhwcmVzc2lvbkxpc3QgcmV0dXJuIHZhbHVlJywKICAgICk7CgogICAgIyBjaGVjayBmb3IgbGlzdCB0eXBlCiAgICBuZXh0IENPTkRJVElPTklEIGlmIHJlZiAkRXhwcmVzc2lvbkxpc3QgbmUgJ0FSUkFZJzsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JEV4cHJlc3Npb25MaXN0fSwKICAgICAgICAkRXhwcmVzc2lvblRlc3RDb3VudCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEV4cHJlc3Npb25MaXN0IC0+ICRDb25kaXRpb25JRCIsCiAgICApOwp9CgojIHRlc3QgZm9yIG1hdGNoaW5nCmZvciBteSAkRXhwcmVzc2lvbkNvdW50ZXIgKCAwIC4uICggc2NhbGFyIEBFeHByZXNzaW9uSURzIC0gMSApICkgewoKICAgIG15ICRFeHByZXNzaW9uSUQgPSAkRXhwcmVzc2lvbklEc1skRXhwcmVzc2lvbkNvdW50ZXJdOwoKICAgICMgZ3JvdXAgcmVsYXRlZCB0ZXN0cwogICAgJFRlc3RDb3VudCsrOwoKICAgICMgcHJpbnQgaW5mbyBhYm91dCB0aGUgbWF0Y2ggdGVzdDoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIk1hdGNoIHRlc3QgJFRlc3RDb3VudDogIgogICAgICAgICAgICAuICJFeHByZXNzaW9uQ291bnRlciA9PiAkRXhwcmVzc2lvbkNvdW50ZXIsIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklEIiwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IHZhbHVlIGZvciBhdHRyaWJ1dGVzCiAgICBteSAkT2JqZWN0TmFtZSA9ICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvbkFkZH0tPntPYmplY3RJRH0KICAgICAgICAtPntPYmplY3RMb29rdXB9LT57TmFtZX07CgogICAgIyBjaGVjayBmb3IgdXBkYXRlZCBvYmplY3QKICAgIGlmICgKICAgICAgICAkRXhwcmVzc2lvblRlc3RzWyRFeHByZXNzaW9uQ291bnRlcl0tPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25VcGRhdGV9CiAgICAgICAgJiYgJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uVXBkYXRlfS0+e09iamVjdElEfQogICAgICAgIC0+e09iamVjdExvb2t1cH0tPntOYW1lfQogICAgICAgICkKICAgIHsKICAgICAgICAkT2JqZWN0TmFtZSA9ICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvblVwZGF0ZX0tPntPYmplY3RJRH0KICAgICAgICAgICAgLT57T2JqZWN0TG9va3VwfS0+e05hbWV9OwogICAgfQoKICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMKICAgIG15ICRBdHRyaWJ1dGVOYW1lID0gJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uQWRkfS0+e0F0dHJpYnV0ZUlEfQogICAgICAgIC0+e0F0dHJpYnV0ZUxvb2t1cH0tPntOYW1lfTsKCiAgICAjIGNoZWNrIGZvciB1cGRhdGVkIGF0dHJpYnV0ZQogICAgaWYgKAogICAgICAgICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvblVwZGF0ZX0KICAgICAgICAmJiAkRXhwcmVzc2lvblRlc3RzWyRFeHByZXNzaW9uQ291bnRlcl0tPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25VcGRhdGV9LT57QXR0cmlidXRlSUR9CiAgICAgICAgLT57QXR0cmlidXRlTG9va3VwfS0+e05hbWV9CiAgICAgICAgKQogICAgewogICAgICAgICRBdHRyaWJ1dGVOYW1lID0gJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uVXBkYXRlfS0+e0F0dHJpYnV0ZUlEfQogICAgICAgICAgICAtPntBdHRyaWJ1dGVMb29rdXB9LT57TmFtZX07CiAgICB9CgogICAgIyB0ZXN0IG9uIHN1Y2Nlc3NmdWwgcmVzdWx0CiAgICBpZiAoICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e01hdGNoU3VjY2Vzc30gKSB7CgogICAgICAgICMgdGVzdCB3aXRob3V0IGdpdmVuIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uTWF0Y2goCiAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudCAtIEV4cHJlc3Npb25NYXRjaCByZXR1cm4gdHJ1ZSwgd2l0aG91dCBjaGFuZ2VkIGF0dHJpYnV0ZXMiLAogICAgICAgICk7CgogICAgICAgICMgdGVzdCB3aXRoIGdpdmVuIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uTWF0Y2goCiAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgICAgICA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4geyAkT2JqZWN0TmFtZSA9PiBbJEF0dHJpYnV0ZU5hbWVdIH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudCAtIEV4cHJlc3Npb25NYXRjaCByZXR1cm4gdHJ1ZSwgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMiLAogICAgICAgICk7CgogICAgICAgICMgdGVzdCB3aXRoIHdyb25nIGdpdmVuIG9iamVjdCB0eXBlIG9mIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdE5hbWUgLiAnVVQnIC4gJFJhbmRvbUlEID0+IFskQXR0cmlidXRlTmFtZV0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50IC0gRXhwcmVzc2lvbk1hdGNoIHJldHVybiBmYWxzZSwgd3Jvbmcgb2JqZWN0IHR5cGUiLAogICAgICAgICk7CgogICAgICAgICMgdGVzdCB3aXRoIHdyb25nIGdpdmVuIGF0dHJpYnV0ZSB0eXBlIG9mIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdE5hbWUgPT4gWyAkQXR0cmlidXRlTmFtZSAuICdVVCcgLiAkUmFuZG9tSUQgXSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIGZhbHNlLCB3cm9uZyBhdHRyaWJ1dGUgdHlwZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHRlc3Qgd2l0aG91dCBnaXZlbiBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50IC0gRXhwcmVzc2lvbk1hdGNoIHJldHVybiBmYWxzZSwgd2l0aG91dCBjaGFuZ2VkIGF0dHJpYnV0ZXMiLAogICAgICAgICk7CgogICAgICAgICMgdGVzdCB3aXRoIGdpdmVuIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdE5hbWUgPT4gWyRBdHRyaWJ1dGVOYW1lXSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIGZhbHNlLCB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIGNvbmRpdGlvbiBhY3Rpb24gdGVzdHMKIwoKIyBjaGVjayBmb3IgZGVmYXVsdCBjb25kaXRpb24gYWN0aW9ucwpteSBAQWN0aW9uVGVzdHMgPSAoCiAgICB7CiAgICAgICAgQWN0aW9uU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICAgPT4gewogICAgICAgICAgICBBY3Rpb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkQ2hhbmdlSURzWzBdLAogICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gJ05ldyBDaGFuZ2UgVGl0bGUnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIGJ1ZyMgMTA4NjIKICAgIHsKICAgICAgICBBY3Rpb25TdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgICA9PiB7CiAgICAgICAgICAgIEFjdGlvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdDaGFuZ2VNYW5hZ2VySUQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSURzWzFdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBBY3Rpb25TdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgICA9PiB7CiAgICAgICAgICAgIEFjdGlvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBBY3Rpb25WYWx1ZSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBBY3Rpb25TdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgICA9PiB7CiAgICAgICAgICAgIEFjdGlvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdDaGFuZ2VNYW5hZ2VySUQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRHNbNl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkQ2hhbmdlSURzWzFdLAogICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQWN0aW9uU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICAgPT4gewogICAgICAgICAgICBBY3Rpb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gJ05ldyBXb3JrT3JkZXJUaXRsZSBUaXRsZScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAopOwoKIyBjaGVjayBjb25kaXRpb24gYWN0aW9ucwpteSBAQWN0aW9uSURzOwpBQ1RJT05URVNUOgpmb3IgbXkgJEFjdGlvblRlc3QgKEBBY3Rpb25UZXN0cykgewoKICAgICMgc3RvcmUgZGF0YSBvZiB0ZXN0IGNhc2VzIGxvY2FsbHkKICAgIG15ICVTb3VyY2VEYXRhOwogICAgbXkgJEFjdGlvbklEOwoKICAgICMgZXh0cmFjdCBzb3VyY2UgZGF0YQogICAgaWYgKCAkQWN0aW9uVGVzdC0+e1NvdXJjZURhdGF9ICkgewogICAgICAgICVTb3VyY2VEYXRhID0gJXsgJEFjdGlvblRlc3QtPntTb3VyY2VEYXRhfSB9OwogICAgfQoKICAgICMgY2hlY2sgZm9yIHNvdXIgZGF0YQogICAgbmV4dCBBQ1RJT05URVNUIGlmICElU291cmNlRGF0YTsKCiAgICBDUkVBVEVEQVRBOgogICAgZm9yIG15ICRDcmVhdGVEYXRhICggc29ydCBrZXlzICVTb3VyY2VEYXRhICkgewoKICAgICAgICAjIGFkZCBhY3Rpb24KICAgICAgICBpZiAoICRDcmVhdGVEYXRhIGVxICdBY3Rpb25BZGQnICkgewoKICAgICAgICAgICAgIyBhZGQgYWN0aW9uCiAgICAgICAgICAgICRBY3Rpb25JRCA9IF9BY3Rpb25BZGQoICRTb3VyY2VEYXRheyRDcmVhdGVEYXRhfSApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgYWN0aW9uIGlkCiAgICAgICAgICAgIG5leHQgQ1JFQVRFREFUQSBpZiAhJEFjdGlvbklEOwoKICAgICAgICAgICAgIyBzYXZlIGNyZWF0ZWQgSUQgZm9yIGRlbGV0aW5nIGFjdGlvbnMKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSURzLCAkQWN0aW9uSUQ7CiAgICAgICAgfQogICAgfQp9CgojIGNoZWNrIGV4ZWN1dGlvbiBvZiBhY3Rpb25zCkFDVElPTkNPVU5URVI6CmZvciBteSAkQWN0aW9uQ291bnRlciAoIDAgLi4gKCAoIHNjYWxhciBAQWN0aW9uVGVzdHMgKSAtIDEgKSApIHsKCiAgICBteSAkQWN0aW9uSUQgPSAkQWN0aW9uSURzWyRBY3Rpb25Db3VudGVyXSB8fCAwOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBY3Rpb25JRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gQWN0aW9uSUQ6ICRBY3Rpb25JRCIsCiAgICApOwoKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJEFjdGlvbklEOwoKICAgICMgc2VsZWN0IGFzc2VydCBmdW5jdGlvbgogICAgbXkgJFRlc3RTdWIgPSAnRmFsc2UnOwogICAgaWYgKCAkQWN0aW9uVGVzdHNbJEFjdGlvbkNvdW50ZXJdLT57QWN0aW9uU3VjY2Vzc30gKSB7CiAgICAgICAgJFRlc3RTdWIgPSAnVHJ1ZSc7CiAgICB9CgogICAgIyB0ZXN0IGZvciByZXN1bHQKICAgICRTZWxmLT4kVGVzdFN1YigKICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25FeGVjdXRlKAogICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICkKICAgICAgICAgICAgfHwgMCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gQWN0aW9uSUQ6ICRBY3Rpb25JRCIsCiAgICApOwoKICAgICMgZG8gbm90IGV4ZWN1dGUgZnVydGhlciBjaGVja3MgaWYgYWN0aW9uCiAgICAjIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBzdWNjZXNzZnVsbHkKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJEFjdGlvblRlc3RzWyRBY3Rpb25Db3VudGVyXS0+e0FjdGlvblN1Y2Nlc3N9OwoKICAgICMgY2hlY2sgZm9yIHVwZGF0ZWQgYWN0aW9uCiAgICBteSAkQWN0aW9uID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBY3Rpb24sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25FeGVjdXRlIC0+IEFjdGlvbkdldDogJEFjdGlvbklEIiwKICAgICk7CiAgICBuZXh0IEFDVElPTkNPVU5URVIgaWYgISRBY3Rpb247CgogICAgIyBnZXQgb2JqZWN0IG5hbWUKICAgIG15ICRPYmplY3ROYW1lID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TG9va3VwKAogICAgICAgIE9iamVjdElEID0+ICRBY3Rpb24tPntPYmplY3RJRH0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT2JqZWN0TmFtZSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gT2JqZWN0TG9va3VwOiAkT2JqZWN0TmFtZSIsCiAgICApOwogICAgbmV4dCBBQ1RJT05DT1VOVEVSIGlmICEkT2JqZWN0TmFtZTsKCiAgICAjIGdldCBhdHRyaWJ1dGUgbmFtZQogICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgQXR0cmlidXRlSUQgPT4gJEFjdGlvbi0+e0F0dHJpYnV0ZUlEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRyaWJ1dGVOYW1lLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uRXhlY3V0ZSAtPiBBdHRyaWJ1dGVMb29rdXA6ICRBdHRyaWJ1dGVOYW1lIiwKICAgICk7CiAgICBuZXh0IEFDVElPTkNPVU5URVIgaWYgISRPYmplY3ROYW1lOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YTsKICAgIGlmICggJE9iamVjdE5hbWUgZXEgJ0lUU01DaGFuZ2UnICkgewogICAgICAgICRPYmplY3REYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQWN0aW9uLT57U2VsZWN0b3J9LAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRPYmplY3ROYW1lIGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAkT2JqZWN0RGF0YSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJEFjdGlvbi0+e1NlbGVjdG9yfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dHJpYnV0ZU5hbWUsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25FeGVjdXRlIC0+IGdldCBPYmplY3REYXRhOiAkT2JqZWN0TmFtZSIsCiAgICApOwogICAgbmV4dCBBQ1RJT05DT1VOVEVSIGlmICEkT2JqZWN0RGF0YTsKCiAgICAjIGNoZWNrIGZvciB1cGRhdGVkIHZhbHVlCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJE9iamVjdERhdGEtPnskQXR0cmlidXRlTmFtZX0sCiAgICAgICAgJEFjdGlvbi0+e0FjdGlvblZhbHVlfSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gZ2V0IGNoYW5nZWQgZGF0YTogJE9iamVjdE5hbWUiLAogICAgKTsKfQoKIyB0ZXN0IGZvciBtYXRjaCBzdGF0ZSBsb2NrCiRTZWxmLT5GYWxzZSgKICAgICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbk1hdGNoU3RhdGVMb2NrKAogICAgICAgIE9iamVjdE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNlbGVjdG9yICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICBTdGF0ZUlEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICkKICAgICAgICB8fCAwLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25NYXRjaFN0YXRlTG9jayIsCik7CgojIGNoZWNrIGZvciBleHByZXNzaW9uIGRlbGV0ZQpmb3IgbXkgJEV4cHJlc3Npb25JRCAoQEV4cHJlc3Npb25JRHMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25EZWxldGUoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gRXhwcmVzc2lvbkRlbGV0ZSAtPiBFeHByZXNzaW9uSUQ6ICRFeHByZXNzaW9uSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBleHByZXNzaW9uIGlzIHJlYWxseSBkZWxldGVkCiAgICBteSAkRXhwcmVzc2lvbkRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uR2V0KAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgdW5kZWYsCiAgICAgICAgJEV4cHJlc3Npb25EYXRhLT57RXhwcmVzc2lvbklEfSwKICAgICAgICAnVGVzdCcgLiAkVGVzdENvdW50KysgLiAnOiBFeHByZXNzaW9uRGVsZXRlKCkgLSBkb3VibGUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3IgYWN0aW9uIGRlbGV0ZQpmb3IgbXkgJEFjdGlvbklEIChAQWN0aW9uSURzKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25EZWxldGUoCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uRGVsZXRlIC0+IEFjdGlvbklEOiAkQWN0aW9uSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBhY3Rpb24gaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRBY3Rpb25EYXRhID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgdW5kZWYsCiAgICAgICAgJEFjdGlvbkRhdGEtPntBY3Rpb25JRH0sCiAgICAgICAgJ1Rlc3QnIC4gJFRlc3RDb3VudCsrIC4gJzogQWN0aW9uRGVsZXRlKCkgLSBkb3VibGUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3IgY29uZGl0aW9uIGRlbGV0ZQpmb3IgbXkgJENvbmRpdGlvbklEIChAQ29uZGl0aW9uSURzKSB7CgogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25EZWxldGUoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVTdWNjZXNzLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uRGVsZXRlIC0+IENvbmRpdGlvbklEOiAkQ29uZGl0aW9uSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjb25kaXRpb24gaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDb25kaXRpb25EYXRhID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgdW5kZWYsCiAgICAgICAgJENvbmRpdGlvbkRhdGEtPntDb25kaXRpb25JRH0sCiAgICAgICAgJ1Rlc3QnIC4gJFRlc3RDb3VudCsrIC4gJzogQ29uZGl0aW9uRGVsZXRlKCkgLSBkb3VibGUgY2hlY2snLAogICAgKTsKfQoKIyBzZXQgU2VuZE5vdGlmaWNhdGlvbnMgdG8gaXQncyBvcmlnaW5hbCB2YWx1ZQokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSVRTTUNoYW5nZTo6U2VuZE5vdGlmaWNhdGlvbnMnLAogICAgVmFsdWUgPT4gJFNlbmROb3RpZmljYXRpb25zT3JnLAopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgpzdWIgX0FjdGlvbkFkZCB7CiAgICBteSAkQWN0aW9uRGF0YSA9IHNoaWZ0OwoKICAgIHJldHVybiBpZiAhJEFjdGlvbkRhdGE7CiAgICByZXR1cm4gaWYgcmVmICRBY3Rpb25EYXRhIG5lICdIQVNIJzsKCiAgICAjIGhhc2ggZm9yIGFkZGluZwogICAgbXkgJUFjdGlvbkFkZDsKCiAgICAjIHNldCBzdGF0aWMgZmllbGRzCiAgICBteSBAU3RhdGljRmllbGRzID0gcXcoIFNlbGVjdG9yIEFjdGlvblZhbHVlIFVzZXJJRCBDb25kaXRpb25JRCApOwoKICAgIFNUQVRJQ0ZJRUxEOgogICAgZm9yIG15ICRTdGF0aWNGaWVsZCAoQFN0YXRpY0ZpZWxkcykgewoKICAgICAgICAjIG9taXQgc3RhdGljIGZpZWxkIGlmIGl0IGlzIG5vdCBzZXQKICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICFleGlzdHMgJEFjdGlvbkRhdGEtPnskU3RhdGljRmllbGR9OwogICAgICAgIG5leHQgU1RBVElDRklFTEQgaWYgIWRlZmluZWQgJEFjdGlvbkRhdGEtPnskU3RhdGljRmllbGR9OwoKICAgICAgICAjIHNhZmUgZGF0YQogICAgICAgICRBY3Rpb25BZGR7JFN0YXRpY0ZpZWxkfSA9ICRBY3Rpb25EYXRhLT57JFN0YXRpY0ZpZWxkfTsKICAgIH0KCiAgICAjIGdldCBhbGwgZmllbGRzIGZvciBBY3Rpb25BZGQKICAgIEFDVElPTkFERFZBTFVFOgogICAgZm9yIG15ICRBY3Rpb25BZGRWYWx1ZSAoIHNvcnQga2V5cyAleyRBY3Rpb25EYXRhfSApIHsKCiAgICAgICAgIyBvbWl0IHN0YXRpYyBmaWVsZHMKICAgICAgICBuZXh0IEFDVElPTkFERFZBTFVFIGlmIGdyZXAgeyAkXyBlcSAkQWN0aW9uQWRkVmFsdWUgfSBAU3RhdGljRmllbGRzOwoKICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIGZpZWxkcwogICAgICAgIGZvciBteSAkRmllbGRWYWx1ZSAoIHNvcnQga2V5cyAleyAkQWN0aW9uRGF0YS0+eyRBY3Rpb25BZGRWYWx1ZX0gfSApIHsKCiAgICAgICAgICAgICMgc3RvcmUgZ2F0aGVyZWQgaW5mb3JtYXRpb24gaW4gaGFzaCBmb3IgYWRkaW5nCiAgICAgICAgICAgICRBY3Rpb25BZGR7JEFjdGlvbkFkZFZhbHVlfSA9ICRDb25kaXRpb25PYmplY3QtPiRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgJXsgJEFjdGlvbkRhdGEtPnskQWN0aW9uQWRkVmFsdWV9LT57JEZpZWxkVmFsdWV9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGFjdGlvbgogICAgbXkgJEFjdGlvbklEID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uQWRkKAogICAgICAgICVBY3Rpb25BZGQsCiAgICApIHx8IDA7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFjdGlvbklELAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uQWRkIC0+ICRBY3Rpb25JRCIsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIEFjdGlvbklECiAgICByZXR1cm4gaWYgISRBY3Rpb25JRDsKCiAgICAjIGNoZWNrIHRoZSBhZGRlZCBhY3Rpb24KICAgIG15ICRBY3Rpb25HZXQgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgIFVzZXJJRCAgID0+ICRBY3Rpb25BZGR7VXNlcklEfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQWN0aW9uR2V0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gQWN0aW9uQWRkKCk6IEFjdGlvbkdldCcsCiAgICApOwoKICAgICMgZGVsZXRlIFVzZXJJRCwgaXQgaXMgbm90IHJldHVybmVkCiAgICBkZWxldGUgJEFjdGlvbkFkZHtVc2VySUR9OwoKICAgICMgdGVzdCB2YWx1ZXMKICAgIGZvciBteSAkVGVzdFZhbHVlICggc29ydCBrZXlzICVBY3Rpb25BZGQgKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQWN0aW9uR2V0LT57JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICRBY3Rpb25BZGR7JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uQWRkKCk6IEFjdGlvbkdldCAtPiAkVGVzdFZhbHVlIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkQWN0aW9uSUQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAkU3RhdGVNYWNoaW5lT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpOwpteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiMgdGVzdCBpZiBzdGF0ZW1hY2hpbmUgb2JqZWN0IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQokU2VsZi0+VHJ1ZSgKICAgICRTdGF0ZU1hY2hpbmVPYmplY3QsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNvbnN0cnVjdGlvbiBvZiBzdGF0ZW1hY2hpbmUgb2JqZWN0JywKKTsKJFNlbGYtPklzKAogICAgcmVmICRTdGF0ZU1hY2hpbmVPYmplY3QsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBjbGFzcyBvZiBzdGF0ZW1hY2hpbmUgb2JqZWN0JywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IFN0YXRlTWFjaGluZSBBUEkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwp7CgogICAgIyBkZWZpbmUgcHVibGljIGludGVyZmFjZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyKQogICAgbXkgQE9iamVjdE1ldGhvZHMgPSBxdygKICAgICAgICBTdGF0ZUxpc3QKICAgICAgICBTdGF0ZUxvb2t1cAogICAgICAgIFN0YXRlVHJhbnNpdGlvbkFkZAogICAgICAgIFN0YXRlVHJhbnNpdGlvbkRlbGV0ZQogICAgICAgIFN0YXRlVHJhbnNpdGlvbkRlbGV0ZUFsbAogICAgICAgIFN0YXRlVHJhbnNpdGlvbkdldAogICAgICAgIFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcwogICAgICAgIFN0YXRlVHJhbnNpdGlvbkxpc3QKICAgICAgICBTdGF0ZVRyYW5zaXRpb25VcGRhdGUKICAgICk7CgogICAgIyBjaGVjayBpZiBzdWJzIGFyZSBhdmFpbGFibGUKICAgIGZvciBteSAkT2JqZWN0TWV0aG9kIChAT2JqZWN0TWV0aG9kcykgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3RhdGVNYWNoaW5lT2JqZWN0LT5jYW4oJE9iamVjdE1ldGhvZCksCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgJ2NhbiAkT2JqZWN0TWV0aG9kJyIsCiAgICAgICAgKTsKICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBkZWZhdWx0IHRyYW5zaXRpb25zIGZvciBjaGFuZ2Ugc3RhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRoZSBjaGFuZ2Ugc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwpteSAlTmFtZTJDaGFuZ2VTdGF0ZUlEID0gcmV2ZXJzZSAlewogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgKQp9OwoKIyBhZGQgemVybyBlbnRyeSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKJE5hbWUyQ2hhbmdlU3RhdGVJRHswfSA9IDA7CgojIGJ1aWxkIHJldmVyc2UgbG9va3VwIGhhc2gKbXkgJUNoYW5nZVN0YXRlSUQyTmFtZSA9IHJldmVyc2UgJU5hbWUyQ2hhbmdlU3RhdGVJRDsKCiMgZGVmYXVsdCBDaGFuZ2VTdGF0ZSBUcmFuc2l0aW9ucwpteSAlRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnMgPSAoCiAgICAwICAgICAgICAgICAgICAgICAgPT4gWydyZXF1ZXN0ZWQnXSwKICAgICdyZXF1ZXN0ZWQnICAgICAgICA9PiBbICdyZWplY3RlZCcsICdyZXRyYWN0ZWQnLCAncGVuZGluZyBhcHByb3ZhbCcsICdpbiBwcm9ncmVzcycgXSwKICAgICdwZW5kaW5nIGFwcHJvdmFsJyA9PiBbICdyZWplY3RlZCcsICdyZXRyYWN0ZWQnLCAnYXBwcm92ZWQnIF0sCiAgICAnYXBwcm92ZWQnICAgICAgICAgPT4gWyAncmV0cmFjdGVkJywgJ2luIHByb2dyZXNzJyBdLAogICAgJ2luIHByb2dyZXNzJyAgICAgID0+IFsgJ3BlbmRpbmcgcGlyJywgJ3JldHJhY3RlZCcsICdmYWlsZWQnLCAnc3VjY2Vzc2Z1bCcsICdjYW5jZWxlZCcgXSwKICAgICdwZW5kaW5nIHBpcicgICAgICA9PiBbICdmYWlsZWQnLCAnc3VjY2Vzc2Z1bCcgXSwKICAgICdyZWplY3RlZCcgICAgICAgICA9PiBbMF0sCiAgICAncmV0cmFjdGVkJyAgICAgICAgPT4gWzBdLAogICAgJ2ZhaWxlZCcgICAgICAgICAgID0+IFswXSwKICAgICdzdWNjZXNzZnVsJyAgICAgICA9PiBbMF0sCiAgICAnY2FuY2VsZWQnICAgICAgICAgPT4gWzBdLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBkZWZhdWx0IHRyYW5zaXRpb25zIGZvciB3b3Jrb3JkZXIgc3RhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRoZSB3b3Jrb3JkZXIgc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwpteSAlTmFtZTJXb3JrT3JkZXJTdGF0ZUlEID0gcmV2ZXJzZSAlewogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgKQp9OwoKIyBhZGQgemVybyBlbnRyeSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKJE5hbWUyV29ya09yZGVyU3RhdGVJRHswfSA9IDA7CgojIGJ1aWxkIHJldmVyc2UgbG9va3VwIGhhc2gKbXkgJVdvcmtPcmRlclN0YXRlSUQyTmFtZSA9IHJldmVyc2UgJU5hbWUyV29ya09yZGVyU3RhdGVJRDsKCiMgZGVmYXVsdCBXb3JrT3JkZXJTdGF0ZSBUcmFuc2l0aW9ucwpteSAlRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgPSAoCiAgICAwICAgICAgICAgICAgID0+IFsnY3JlYXRlZCddLAogICAgJ2NyZWF0ZWQnICAgICA9PiBbICdhY2NlcHRlZCcsICdjYW5jZWxlZCcgXSwKICAgICdhY2NlcHRlZCcgICAgPT4gWyAncmVhZHknLCAnY2FuY2VsZWQnIF0sCiAgICAncmVhZHknICAgICAgID0+IFsgJ2luIHByb2dyZXNzJywgJ2NhbmNlbGVkJyBdLAogICAgJ2luIHByb2dyZXNzJyA9PiBbICdjbG9zZWQnLCAnY2FuY2VsZWQnIF0sCiAgICAnY2FuY2VsZWQnICAgID0+IFswXSwKICAgICdjbG9zZWQnICAgICAgPT4gWzBdLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHN0YXRlIHRyYW5zaXRpb24gZ2V0IGVuZCBzdGF0ZXMgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgICMgZ2V0IG5leHQgZW5kIHN0YXRlcyBmb3IgJ2FwcHJvdmVkJwogICAgbXkgJE5leHRFbmRTdGF0ZUlEc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygKICAgICAgICBTdGF0ZUlEID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7YXBwcm92ZWR9LAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgIG15ICVOZXh0RW5kU3RhdGVMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQHskTmV4dEVuZFN0YXRlSURzUmVmfTsKCiAgICAjICdyZXRyYWN0ZWQnIGlzIGEgbmV4dCBlbmQgc3RhdGUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICROZXh0RW5kU3RhdGVMb29rdXB7ICROYW1lMkNoYW5nZVN0YXRlSUR7cmV0cmFjdGVkfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwoKICAgICMgJ2luIHByb2dyZXNzJyBpcyBub3QgYSBuZXh0IGVuZCBzdGF0ZQogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICROZXh0RW5kU3RhdGVMb29rdXB7ICROYW1lMkNoYW5nZVN0YXRlSUR7J2luIHByb2dyZXNzJ30gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKCkgLSBHZXQgdGhlIG5leHQgZW5kIHN0YXRlcy4iLAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgZ2V0IG5leHQgZW5kIHN0YXRlcyBmb3IgJ3JlcXVlc3RlZCcKICAgICROZXh0RW5kU3RhdGVJRHNSZWYgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoCiAgICAgICAgU3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe3JlcXVlc3RlZH0sCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJU5leHRFbmRTdGF0ZUxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyROZXh0RW5kU3RhdGVJRHNSZWZ9OwoKICAgICMgJ3JlamVjdGVkJyBpcyBhIG5leHQgZW5kIHN0YXRlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTmV4dEVuZFN0YXRlTG9va3VweyAkTmFtZTJDaGFuZ2VTdGF0ZUlEe3JlamVjdGVkfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwoKICAgICMgJ3JldHJhY3RlZCcgaXMgYSBuZXh0IGVuZCBzdGF0ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZXRyYWN0ZWR9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygpIC0gR2V0IHRoZSBuZXh0IGVuZCBzdGF0ZXMuIiwKICAgICk7CgogICAgIyAncGVuZGluZyBhcHByb3ZhbCcgaXMgbm90IGEgbmV4dCBlbmQgc3RhdGUKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkTmV4dEVuZFN0YXRlTG9va3VweyAkTmFtZTJDaGFuZ2VTdGF0ZUlEeydwZW5kaW5nIGFwcHJvdmFsJ30gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKCkgLSBHZXQgdGhlIG5leHQgZW5kIHN0YXRlcy4iLAogICAgKTsKCiAgICAjICdpbiBwcm9ncmVzcycgaXMgbm90IGEgbmV4dCBlbmQgc3RhdGUKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkTmV4dEVuZFN0YXRlTG9va3VweyAkTmFtZTJDaGFuZ2VTdGF0ZUlEeydpbiBwcm9ncmVzcyd9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygpIC0gR2V0IHRoZSBuZXh0IGVuZCBzdGF0ZXMuIiwKICAgICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIGdldCBuZXh0IGVuZCBzdGF0ZXMgZm9yICdyZXRyYWN0ZWQnCiAgICAkTmV4dEVuZFN0YXRlSURzUmVmID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgIFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZXRyYWN0ZWR9LAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKCiAgICAjICdyZXRyYWN0ZWQnIGhhcyBubyBuZXh0IGVuZCBzdGF0ZXMsIGJlY2F1c2UgaXQgaXMgYW4gZW5kIHN0YXRlIGl0c2VsZgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgIHNjYWxhciBAeyROZXh0RW5kU3RhdGVJRHNSZWZ9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc3RhdGUgdHJhbnNpdGlvbiBhZGQsIHVwZGF0ZSBhbmQgZGVsZXRlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICAjIGFkZCBhIHNlY29uZCBzdGFydCB0cmFuc2l0aW9uICggbXVzdCBmYWlsICkKICAgIG15ICRUcmFuc2l0aW9uSUQgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gMCwKICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRUcmFuc2l0aW9uSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IFN0YXRlVHJhbnNpdGlvbkFkZCgpIC0gQWRkIGFub3RoZXIgc3RhcnQgc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKCiAgICAjIGFkZCBhIG5ldyBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbgogICAgJFRyYW5zaXRpb25JRCA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkFkZCgKICAgICAgICBTdGF0ZUlEICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRyYW5zaXRpb25JRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogU3RhdGVUcmFuc2l0aW9uQWRkKCkgLSBBZGQgYSBuZXcgY2hhbmdlIHN0YXRlIHRyYW5zaXRpb24uIiwKICAgICk7CgogICAgIyB0cnkgdG8gc2V0IHRoZSBzdGF0ZSB0byBiZSBhbiBlbmQgc3RhdGUgKG11c3QgZmFpbCwgYmVjYXVzZSBvdGhlciBmb2xsb3dpbmcgc3RhdGVzIGV4aXN0KQogICAgJFRyYW5zaXRpb25JRCA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkFkZCgKICAgICAgICBTdGF0ZUlEICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXh0U3RhdGVJRCA9PiAwLAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFRyYW5zaXRpb25JRCwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uQWRkKCkgLSBBZGQgYSBuZXcgY2hhbmdlIHN0YXRlIHRyYW5zaXRpb24gbXVzdCBmYWlsLCBiZWNhdXNlIG9mIGV4aXN0aW5nIGZvbGxvd2luZyBzdGF0ZXMuIiwKICAgICk7CgogICAgIyB1cGRhdGUgYSBzdGF0ZSB0cmFuc2l0aW9uCiAgICBteSAkU3VjY2VzcyA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXh0U3RhdGVJRCAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXdOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2ZhaWxlZH0sCiAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUoKSAtIFVwZGF0ZSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKCiAgICAjIGdldCB0aGUgdXBkYXRlZCBzdGF0ZSB0cmFuc2l0aW9uCiAgICBteSAkTmV4dFN0YXRlSURzUmVmID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgIFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHthcHByb3ZlZH0sCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgbXkgJU5leHRTdGF0ZUxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyROZXh0U3RhdGVJRHNSZWZ9OwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5leHRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHtmYWlsZWR9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkdldCgpIC0gR2V0IHRoZSB1cGRhdGVkIGNoYW5nZSBzdGF0ZSB0cmFuc2l0aW9uLiIsCiAgICApOwoKICAgICMgdXBkYXRlIGEgc3RhdGUgdHJhbnNpdGlvbgogICAgIyAobXVzdCBmYWlsLCBiZWNhdXNlIG5ldyBuZXh0IHN0YXRlIGlzIGFuIGVuZCBzdGF0ZSBhbmQgb3RoZXIgZm9sbG93aW5nIHN0YXRlcyBhbHJlYWR5IGV4aXN0cykKICAgICRTdWNjZXNzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uVXBkYXRlKAogICAgICAgIFN0YXRlSUQgICAgICAgID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7cmVxdWVzdGVkfSwKICAgICAgICBOZXh0U3RhdGVJRCAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe3JlamVjdGVkfSwKICAgICAgICBOZXdOZXh0U3RhdGVJRCA9PiAwLAogICAgICAgIENsYXNzICAgICAgICAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvblVwZGF0ZSgpIC0gVXBkYXRlIGNoYW5nZSBzdGF0ZSB0cmFuc2l0aW9uIChzZXQgZW5kIHN0YXRlIG11c3QgZmFpbCkuIiwKICAgICk7CgogICAgIyB1cGRhdGUgYSBzdGF0ZSB0cmFuc2l0aW9uIChtdXN0IGZhaWwsIGJlY2F1c2UgYm90aCBzdGF0ZXMgYXJlIHplcm8pCiAgICAkU3VjY2VzcyA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAwLAogICAgICAgIE5leHRTdGF0ZUlEICAgID0+IDAsCiAgICAgICAgTmV3TmV4dFN0YXRlSUQgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUoKSAtIFVwZGF0ZSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbiAoYm90aCBzdGF0ZXMgemVybyB0ZXN0KS4iLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgdHJhbnNpdGlvbiB0aGF0IHdhcyBhZGRlZCBiZWZvcmUKICAgIG15ICREZWxldGVTdWNjZXNzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uRGVsZXRlKAogICAgICAgIFN0YXRlSUQgICAgID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7YXBwcm92ZWR9LAogICAgICAgIE5leHRTdGF0ZUlEID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7ZmFpbGVkfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlU3VjY2VzcywKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogU3RhdGVUcmFuc2l0aW9uRGVsZXRlKCkgLSBEZWxldGUgYSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIHRoZSBkZWZhdWx0IFN0YXRlTWFjaGluZSB0cmFuc2l0aW9ucyBmb3IgY2hhbmdlIHN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBkZWZhdWx0IGNoYW5nZSBzdGF0ZSB0cmFuc2l0aW9ucyBmcm9tIGRhdGFiYXNlCm15ICRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKKTsKCiMgY2hlY2sgU3RhdGVUcmFuc2l0aW9uTGlzdCBmb3IgY2hhbmdlIHN0YXRlcwokU2VsZi0+SXMoCiAgICBzY2FsYXIga2V5cyAleyRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zfSB8fCAwLAogICAgc2NhbGFyIGtleXMgJURlZmF1bHRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zLAogICAgJ1Rlc3QgJwogICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25MaXN0KCkgLSBudW1iZXIgb2YgZGVmYXVsdCBzdGFydCBzdGF0ZXMgZm9yIGNoYW5nZSBzdGF0ZXMuIiwKKTsKCmZvciBteSAkRGVmYXVsdFN0YXRlICggc29ydCBrZXlzICVEZWZhdWx0Q2hhbmdlU3RhdGVUcmFuc2l0aW9ucyApIHsKCiAgICAjIGNvbnZlcnQgdGhlIGRlZmF1bHQgc3RhdGUgdG8gYSBzdGF0ZUlECiAgICBteSAkRGVmYXVsdFN0YXRlSUQgPSAkTmFtZTJDaGFuZ2VTdGF0ZUlEeyREZWZhdWx0U3RhdGV9OwoKICAgICMgY2hlY2sgaWYgYWxsIHN0YXJ0IHN0YXRlcyBhcmUgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQKICAgICMgYW5kIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG5leHQgc3RhdGVzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7ICRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zLT57ICROYW1lMkNoYW5nZVN0YXRlSUR7JERlZmF1bHRTdGF0ZX0gfSB9LAogICAgICAgIHNjYWxhciBAeyAkRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnN7JERlZmF1bHRTdGF0ZX0gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gbnVtYmVyIG9mIGRlZmF1bHQgbmV4dCBzdGF0ZXMgZm9yIGNoYW5nZSBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICk7CgogICAgIyBnZXQgbG9va3VwIGhhc2ggb2YgYWN0dWFsIG5leHQgc3RhdGVzCiAgICBteSBATmV4dFN0YXRlcyA9IHNvcnQgbWFwIHsgJENoYW5nZVN0YXRlSUQyTmFtZXskX30gfSBAeyAkQ2hhbmdlU3RhdGVUcmFuc2l0aW9ucy0+eyREZWZhdWx0U3RhdGVJRH0gfTsKCiAgICBteSAkSW5kZXggPSAwOwogICAgZm9yIG15ICREZWZhdWx0TmV4dFN0YXRlICggc29ydCBAeyAkRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnN7JERlZmF1bHRTdGF0ZX0gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZXh0IHN0YXRlIGlzIHRoZSB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJE5leHRTdGF0ZXNbICRJbmRleCsrIF0sCiAgICAgICAgICAgICREZWZhdWx0TmV4dFN0YXRlLAogICAgICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgICAgICAuICRUZXN0Q291bnQKICAgICAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBjaGFuZ2Ugc3RhdGUgJyREZWZhdWx0U3RhdGUnLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRlc3QgdGhlIHN0YXRlIGxvb2t1cCBmdW5jdGlvbiBmb3IgdGhlIHN0YXRlCiAgICBteSAkTG9va2VkVXBTdGF0ZUlEID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGUgPT4gJERlZmF1bHRTdGF0ZSwKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJERlZmF1bHRTdGF0ZUlELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFN0YXRlTG9va3VwKCkgZm9yIGNoYW5nZSBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICk7CgogICAgIyB0ZXN0IHRoZSBzdGF0ZSBsb29rdXAgZnVuY3Rpb24gZm9yIHRoZSBzdGF0ZSBpZAogICAgbXkgJExvb2tlZFVwU3RhdGUgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICBTdGF0ZUlEID0+ICREZWZhdWx0U3RhdGVJRCwKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwU3RhdGUsCiAgICAgICAgJERlZmF1bHRTdGF0ZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTdGF0ZUxvb2t1cCgpIGZvciBjaGFuZ2Ugc3RhdGUgaWQgJyREZWZhdWx0U3RhdGVJRCcuIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjaGVjayB0aGUgZGVmYXVsdCBTdGF0ZU1hY2hpbmUgdHJhbnNpdGlvbnMgZm9yIHdvcmtvcmRlciBzdGF0ZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZGVmYXVsdCB3b3Jrb3JkZXIgc3RhdGUgdHJhbnNpdGlvbnMgZnJvbSBkYXRhYmFzZQpteSAkV29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucyA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCik7CgojIGNoZWNrIFN0YXRlVHJhbnNpdGlvbkxpc3QgZm9yIHdvcmtvcmRlciBzdGF0ZXMKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJXskV29ya09yZGVyU3RhdGVUcmFuc2l0aW9uc30gfHwgMCwKICAgIHNjYWxhciBrZXlzICVEZWZhdWx0V29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucywKICAgICdUZXN0ICcKICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gTnVtYmVyIG9mIGRlZmF1bHQgc3RhcnQgc3RhdGVzIGZvciB3b3Jrb3JkZXIgc3RhdGVzLiIsCik7Cgpmb3IgbXkgJERlZmF1bHRTdGF0ZSAoIHNvcnQga2V5cyAlRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgIyBjb252ZXJ0IHRoZSBkZWZhdWx0IHN0YXRlIHRvIGEgc3RhdGVJRAogICAgbXkgJERlZmF1bHRTdGF0ZUlEID0gJE5hbWUyV29ya09yZGVyU3RhdGVJRHskRGVmYXVsdFN0YXRlfTsKCiAgICAjIGNoZWNrIGlmIGFsbCBzdGFydCBzdGF0ZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0CiAgICAjIGFuZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBuZXh0IHN0YXRlcwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyAkV29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucy0+eyAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyREZWZhdWx0U3RhdGV9IH0gfSwKICAgICAgICBzY2FsYXIgQHsgJERlZmF1bHRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zeyREZWZhdWx0U3RhdGV9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkxpc3QoKSAtIE51bWJlciBvZiBkZWZhdWx0IG5leHQgc3RhdGVzIGZvciB3b3Jrb3JkZXIgc3RhdGUgJyREZWZhdWx0U3RhdGUnLiIsCiAgICApOwoKICAgICMgZ2V0IGxvb2t1cCBoYXNoIG9mIGFjdHVhbCBuZXh0IHN0YXRlcwogICAgbXkgQE5leHRTdGF0ZXMgPSBzb3J0IG1hcCB7ICRXb3JrT3JkZXJTdGF0ZUlEMk5hbWV7JF99IH0KICAgICAgICBAeyAkV29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucy0+eyREZWZhdWx0U3RhdGVJRH0gfTsKCiAgICBteSAkSW5kZXggPSAwOwogICAgZm9yIG15ICREZWZhdWx0TmV4dFN0YXRlICggc29ydCBAeyAkRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnN7JERlZmF1bHRTdGF0ZX0gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZXh0IHN0YXRlIGlzIHRoZSB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJE5leHRTdGF0ZXNbICRJbmRleCsrIF0sCiAgICAgICAgICAgICREZWZhdWx0TmV4dFN0YXRlLAogICAgICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgICAgICAuICRUZXN0Q291bnQKICAgICAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gRGVmYXVsdCBuZXh0IHN0YXRlIGZvciB3b3Jrb3JkZXIgc3RhdGUgJyREZWZhdWx0U3RhdGUnLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRlc3QgdGhlIHN0YXRlIGxvb2t1cCBmdW5jdGlvbiBmb3IgdGhlIHN0YXRlCiAgICBteSAkTG9va2VkVXBTdGF0ZUlEID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGUgPT4gJERlZmF1bHRTdGF0ZSwKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJERlZmF1bHRTdGF0ZUlELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFN0YXRlTG9va3VwKCkgZm9yIHdvcmtvcmRlciBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICk7CgogICAgIyB0ZXN0IHRoZSBzdGF0ZSBsb29rdXAgZnVuY3Rpb24gZm9yIHRoZSBzdGF0ZSBpZAogICAgbXkgJExvb2tlZFVwU3RhdGUgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICBTdGF0ZUlEID0+ICREZWZhdWx0U3RhdGVJRCwKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwU3RhdGUsCiAgICAgICAgJERlZmF1bHRTdGF0ZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTdGF0ZUxvb2t1cCgpIGZvciB3b3Jrb3JkZXIgc3RhdGUgaWQgJyREZWZhdWx0U3RhdGVJRCcuIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzdGF0ZSB0cmFuc2l0aW9uIGdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSBTdGF0ZVRyYW5zaXRpb25MaXN0KCkgYW5kIFN0YXRlVHJhbnNpdGlvbkdldCgpCmZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAleyRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zfSApIHsKCiAgICAjIGdldCB0aGUgbmV4dCBzdGF0ZSBpZHMgZnJvbSBTdGF0ZVRyYW5zaXRpb25MaXN0KCkKICAgIG15IEBOZXh0U3RhdGVJRHNGcm9tTGlzdCA9IHNvcnQgQHsgJENoYW5nZVN0YXRlVHJhbnNpdGlvbnMtPnskU3RhdGVJRH0gfTsKCiAgICAjIGdldCB0aGUgbmV4dCBzdGF0ZSBpZHMgZnJvbSBTdGF0ZVRyYW5zaXRpb25HZXQoKQogICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICBTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgIG15IEBOZXh0U3RhdGVJRHNGcm9tR2V0ID0gc29ydCBAeyROZXh0U3RhdGVJRHNSZWZ9OwoKICAgICMgY2hlY2sgaWYgdGhlIG51bWJlciBvZiBuZXh0IHN0YXRlcyBpcyB0aGUgc2FtZQogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBATmV4dFN0YXRlSURzRnJvbUdldCwKICAgICAgICBzY2FsYXIgQE5leHRTdGF0ZUlEc0Zyb21MaXN0LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXQoKSAtIE51bWJlciBvZiBuZXh0IHN0YXRlcyBmb3IgY2hhbmdlIHN0YXRlICckQ2hhbmdlU3RhdGVJRDJOYW1leyRTdGF0ZUlEfScuIiwKICAgICk7CgogICAgbXkgJEluZGV4ID0gMDsKICAgIGZvciBteSAkTmV4dFN0YXRlIChATmV4dFN0YXRlSURzRnJvbUdldCkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBuZXh0IHN0YXRlcyBhcmUgYWxsIHRoZSBzYW1lCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ2hhbmdlU3RhdGVJRDJOYW1leyROZXh0U3RhdGV9LAogICAgICAgICAgICAkQ2hhbmdlU3RhdGVJRDJOYW1leyAkTmV4dFN0YXRlSURzRnJvbUxpc3RbICRJbmRleCsrIF0gfSwKICAgICAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0KCkgLSBOZXh0IHN0YXRlIGZvciBjaGFuZ2Ugc3RhdGUgJyRDaGFuZ2VTdGF0ZUlEMk5hbWV7JFN0YXRlSUR9Jy4iLAogICAgICAgICk7CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjaGVjayBTdGF0ZUxpc3QoKSBmb3IgY2hhbmdlIHN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CiAgICBteSAkU3RhdGVMaXN0ID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgIENsYXNzICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApIHx8IFtdOwoKICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBjaGFuZ2Ugc3RhdGVzLiBUaGUgc3RhcnQgc3RhdGUgaXMgbm90IHJldHVybmVkIGJ5IFN0YXRlTGlzdCgpLgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciggQHskU3RhdGVMaXN0fSApLAogICAgICAgIHNjYWxhcigga2V5cyAlRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnMgKSAtIDEsCiAgICAgICAgJ1N0YXRlTGlzdCgpIC0gQ2hhbmdlIC0gbnVtYmVyIG9mIHN0YXRlcycsCiAgICApOwoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgZGVmYXVsdCBzdGF0ZXMgYXJlIGluIHRoZSBTdGF0ZUxpc3QKICAgIERFRkFVTFRfU1RBVEU6CiAgICBmb3IgbXkgJERlZmF1bHRTdGF0ZSAoIHNvcnQga2V5cyAlRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgICAgICMgc2tpcCB0aGUgZGVmYXVsdCBzdGF0ZSAnMCcKICAgICAgICBuZXh0IERFRkFVTFRfU1RBVEUgaWYgISREZWZhdWx0U3RhdGU7CgogICAgICAgIG15IEBNYXRjaGVzID0gZ3JlcCB7ICRfLT57VmFsdWV9IGVxICREZWZhdWx0U3RhdGUgfSBAeyRTdGF0ZUxpc3R9OwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyKEBNYXRjaGVzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlN0YXRlTGlzdCgpIC0gQ2hhbmdlIC0gZm91bmQgJERlZmF1bHRTdGF0ZSIsCiAgICAgICAgKTsKICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIFN0YXRlTGlzdCgpIGZvciB3b3Jrb3JkZXIgc3RhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKICAgIG15ICRTdGF0ZUxpc3QgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxpc3QoCiAgICAgICAgQ2xhc3MgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICkgfHwgW107CgogICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIHN0YXRlcy4gVGhlIHN0YXJ0IHN0YXRlIGlzIG5vdCByZXR1cm5lZCBieSBTdGF0ZUxpc3QoKS4KICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIoIEB7JFN0YXRlTGlzdH0gKSwKICAgICAgICBzY2FsYXIoIGtleXMgJURlZmF1bHRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zICkgLSAxLAogICAgICAgICdTdGF0ZUxpc3QoKSAtIFdvcmtPcmRlciAtIG51bWJlciBvZiBzdGF0ZXMnLAogICAgKTsKCiAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIGRlZmF1bHQgc3RhdGVzIGFyZSBpbiB0aGUgU3RhdGVMaXN0CiAgICBERUZBVUxUX1NUQVRFOgogICAgZm9yIG15ICREZWZhdWx0U3RhdGUgKCBzb3J0IGtleXMgJURlZmF1bHRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zICkgewoKICAgICAgICAjIHNraXAgdGhlIGRlZmF1bHQgc3RhdGUgJzAnCiAgICAgICAgbmV4dCBERUZBVUxUX1NUQVRFIGlmICEkRGVmYXVsdFN0YXRlOwoKICAgICAgICBteSBATWF0Y2hlcyA9IGdyZXAgeyAkXy0+e1ZhbHVlfSBlcSAkRGVmYXVsdFN0YXRlIH0gQHskU3RhdGVMaXN0fTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhcihATWF0Y2hlcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJTdGF0ZUxpc3QoKSAtIFdvcmtPcmRlciAtIGZvdW5kICREZWZhdWx0U3RhdGUiLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgTGlzdDo6VXRpbCBxdyhtYXgpOwoKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpUZXN0U3VicykKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTm90ZSBmb3IgZGV2ZWxvcGVyczoKIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBrZXlzIGluICVDaGFuZ2VEZWZpbml0aW9ucyAocmVzcC4gV29ya09yZGVyRGVmaW5pdGlvbnMgKQojIGhhdmUgdG8gYmUgaWRlbnRpY2FsIHdpdGggdGhlIGtleSBuYW1lcyBpbiAlVGVtcGxhdGVEZWZpbml0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKbXkgJFZhbGlkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwpteSAkQ2hhbmdlT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKbXkgJENvbmRpdGlvbk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyk7Cm15ICRXb3JrT3JkZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwpteSAkVGVtcGxhdGVPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7Cm15ICRIVE1MVXRpbHNPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIHRlc3QgaWYgY2hhbmdlIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVPYmplY3QsCiAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNvbnN0cnVjdGlvbiBvZiB0ZW1wbGF0ZSBvYmplY3QnLAopOwokU2VsZi0+SXMoCiAgICByZWYgJFRlbXBsYXRlT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScsCiAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNsYXNzIG9mIHRlbXBsYXRlIG9iamVjdCcsCik7CgojIGRlZmluZSBuZWVkZWQgdmFyaWFibGUKbXkgJFJhbmRvbUlEICAgICA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRSYW5kb21OdW1iZXIgPSAkSGVscGVyLT5HZXRSYW5kb21OdW1iZXIoKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjcmVhdGUgbmVlZGVkIHVzZXJzIGFuZCBjdXN0b21lciB1c2VycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15IEBDdXN0b21lclVzZXJJRHM7ICAgICMgYSBsaXN0IG9mIGV4aXN0aW5nIGFuZCB2YWxpZCBjdXN0b21lciB1c2VyIGlkcywgYSBsaXN0IG9mIHN0cmluZ3MKCiMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCm15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAjIGNyZWF0ZSBuZXcgY3VzdG9tZXJzIGZvciB0aGUgdGVzdHMKICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICBTb3VyY2UgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnSVRTTUNoYW5nZUN1c3RvbWVyJyAuICRDb3VudGVyLAogICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICdVbml0VGVzdEN1c3RvbWVyJywKICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAnVUNUJyAuICRDb3VudGVyIC4gJFJhbmRvbUlELAogICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICdVbml0VGVzdC1JVFNNVGVtcGxhdGUtQ3VzdG9tZXItJyAuICRDb3VudGVyIC4gJFJhbmRvbUlELAogICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICdVbml0VGVzdC1JVFNNVGVtcGxhdGUtQ3VzdG9tZXItJwogICAgICAgICAgICAuICRDb3VudGVyCiAgICAgICAgICAgIC4gJFJhbmRvbUlECiAgICAgICAgICAgIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CiAgICBwdXNoIEBDdXN0b21lclVzZXJJRHMsICRDdXN0b21lclVzZXJJRDsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgVGVtcGxhdGUgQVBJCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIHB1YmxpYyBpbnRlcmZhY2UgKGluIGFscGhhYmV0aWNhbCBvcmRlcikKbXkgQE9iamVjdE1ldGhvZHMgPSBxdygKICAgIFRlbXBsYXRlQWRkCiAgICBUZW1wbGF0ZURlbGV0ZQogICAgVGVtcGxhdGVVcGRhdGUKICAgIFRlbXBsYXRlU2VhcmNoCiAgICBUZW1wbGF0ZVNlcmlhbGl6ZQogICAgVGVtcGxhdGVEZVNlcmlhbGl6ZQogICAgVGVtcGxhdGVUeXBlTG9va3VwCiAgICBUZW1wbGF0ZUxpc3QKICAgIFRlbXBsYXRlR2V0Cik7CgojIGNoZWNrIGlmIHN1YnMgYXJlIGF2YWlsYWJsZQpmb3IgbXkgJE9iamVjdE1ldGhvZCAoQE9iamVjdE1ldGhvZHMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUZW1wbGF0ZU9iamVjdC0+Y2FuKCRPYmplY3RNZXRob2QpLAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgJ2NhbiAkT2JqZWN0TWV0aG9kJyIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc2VhcmNoIGZvciBkZWZhdWx0IFRlbXBsYXRlIHR5cGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIGRlZmF1bHQgVGVtcGxhdGUgdHlwZXMKbXkgQERlZmF1bHRUeXBlcyA9IHF3KAogICAgSVRTTUNoYW5nZQogICAgSVRTTVdvcmtPcmRlcgogICAgSVRTTUNvbmRpdGlvbgogICAgQ0FCCik7CgojIGludmVzdGlnYXRlIHRoZSBkZWZhdWx0IHR5cGVzCmZvciBteSAkVHlwZSAoQERlZmF1bHRUeXBlcykgewoKICAgICMgbG9vayB1cCB0aGUgc3RhdGUgbmFtZQogICAgbXkgJExvb2tlZFVwVHlwZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRUeXBlLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTG9va2VkVXBUeXBlSUQsCiAgICAgICAgIkxvb2sgdXAgdHlwZSAnJFR5cGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFR5cGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICBUZW1wbGF0ZVR5cGVJRCA9PiAkTG9va2VkVXBUeXBlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBUeXBlLAogICAgICAgICRUeXBlLAogICAgICAgICJMb29rIHVwIHR5cGUgaWQgJyRMb29rZWRVcFR5cGVJRCciLAogICAgKTsKfQoKIyBub3cgc29tZSBwYXJhbSBjaGVja3MgZm9yIENoYW5nZVN0YXRlTG9va3VwCm15ICRMb29rdXBPayA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVUeXBlTG9va3VwKCk7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnTm8gcGFyYW1zIHBhc3NlZCB0byBUZW1wbGF0ZVR5cGVMb29rdXAoKScsCik7CgokTG9va3VwT2sgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgIFRlbXBsYXRlVHlwZSAgID0+ICdhcHByb3ZlZCcsCiAgICBUZW1wbGF0ZVR5cGVJRCA9PiAyLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ0V4Y2x1c2l2ZSBwYXJhbXMgcGFzc2VkIHRvIFRlbXBsYXRlVHlwZUxvb2t1cCgpJywKKTsKCiRMb29rdXBPayA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgVGVtcGxhdGVUeXBlcyA9PiAnSVRTTUFueXRoaW5nJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPaywKICAgICJJbmNvcnJlY3QgcGFyYW0gJ1RlbXBsYXRlVHlwZXMnIHBhc3NlZCB0byBUZW1wbGF0ZVR5cGVMb29rdXAoKSIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZ2VuZXJhbCB0ZW1wbGF0ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHN0b3JlIGN1cnJlbnQgVGVzdENvdW50IGZvciBiZXR0ZXIgdGVzdCBjYXNlIHJlY29nbml0aW9uCm15ICRUZXN0Q291bnRNaXNjID0gJFRlc3RDb3VudDsKCiMgQW4gdW5pcXVlIGlkZW50aWZpZXIsIHNvIHRoYXQgZGF0YSBmcm9tIGRpZmZlcmVudCB0ZXN0IHJ1bnMKIyB3b24ndCBiZSBtaXhlZCB1cC4gVGhlIHN0cmluZyBpcyBmb3JtYXRlZCB0byBhIGNvbnN0YW50IGxlbmd0aCwKIyBhcyB0aGUgY29udmVyc2lvbiB0byBwbGFpbiB0ZXh0IHdpdGggVG9Bc2NpaSgpIGRlcGVuZHMgb24gdGhlIHN0cmluZyBsZW5ndGguCm15ICRVbmlxdWVTaWduYXR1cmUgPSBzcHJpbnRmICdVbml0VGVzdC1JVFNNVGVtcGxhdGUtJTA2ZF8lMDEwZCcsCiAgICAkUmFuZG9tTnVtYmVyLAogICAgdGltZSgpOwoKbXkgJUNoYW5nZURlZmluaXRpb25zID0gKAogICAgQmFzZUNoYW5nZSA9PiB7CiAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdBU0NJSSBDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQVNDSUkgQ2hhbmdlIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ0FTQ0lJIENoYW5nZSAtIEp1c3RpZmljYXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gMSwKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gMSwKICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAxLAogICAgICAgIF0sCiAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgQEN1c3RvbWVyVXNlcklEcywKICAgICAgICBdLAogICAgfSwKICAgIFVuaWNvZGVDaGFuZ2UgPT4gewogICAgICAgIENoYW5nZVRpdGxlICAgPT4gIlVuaWNvZGUgQ2hhbmdlIC0gVGl0bGUgw6TDtsO8IC0gJFVuaXF1ZVNpZ25hdHVyZSIsCiAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnVW5pY29kZSBDaGFuZ2UgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlVuaWNvZGUgQ2hhbmdlIC0gSnVzdGlmaWNhdGlvbiAiCiAgICAgICAgICAgIC4gIlx4ezE2N31ceHtiNn1ceHsyMGFjfVxAXHh7MTQyfVx4ezE0Mn1ceHsxMzh9alx4e2YwfVx4e2I1fVx4e2FifVx4e2RmfVx4e2JifSAiCiAgICAgICAgICAgIC4gIi0gJFVuaXF1ZVNpZ25hdHVyZSIsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IDEsCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+IDEsCiAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsKICAgICAgICAgICAgMSwKICAgICAgICBdLAogICAgfSwKICAgIEVudGl0eUNoYW5nZSA9PiB7CiAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0VudGl0eSBDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdFbnRpdHkgQ2hhbmdlIC0gRGVzY3JpcHRpb24gLSByZWdpc3RlcmVkOiImcmVnOyIgLSBub24tYmxvY2tpbmctc3BhY2U6IiZuYnNwOyIgLSAnCiAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBKdXN0aWZpY2F0aW9uID0+CiAgICAgICAgICAgICdFbnRpdHkgQ2hhbmdlIC0gSnVzdGlmaWNhdGlvbiAtIHJlZ2lzdGVyZWQ6IiZyZWc7IiAtIG5vbi1ibG9ja2luZy1zcGFjZToiJm5ic3A7IiAtICcKICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAxLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAxLAogICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbCiAgICAgICAgICAgIDEsCiAgICAgICAgXSwKICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICBAQ3VzdG9tZXJVc2VySURzLAogICAgICAgIF0sCiAgICB9LAogICAgQ29udGFpbmVyQ2hhbmdlID0+IHsKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ0NvbnRhaW5lciBDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ29udGFpbmVyIENoYW5nZSAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICdDb250YWluZXIgQ2hhbmdlIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAxLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAxLAogICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbCiAgICAgICAgICAgIDEsCiAgICAgICAgXSwKICAgIH0sCiAgICBUYXJnZXRDaGFuZ2UgPT4gewogICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGFyZ2V0IENoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdUYXJnZXQgQ2hhbmdlIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ1RhcmdldCBDaGFuZ2UgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IDEsCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+IDEsCiAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsKICAgICAgICAgICAgMSwKICAgICAgICBdLAogICAgfSwKKTsKCiMgY3JlYXRlIGNoYW5nZSB0aGF0IHNob3VsZCBhY3QgYXMgdGhlIGJhc2UgZm9yIHRoZSB0ZW1wbGF0ZSB0ZXN0Cm15ICVDcmVhdGVkQ2hhbmdlSUQ7Cgpmb3IgbXkgJENoYW5nZU5hbWUgKCBzb3J0IGtleXMgJUNoYW5nZURlZmluaXRpb25zICkgewogICAgJENyZWF0ZWRDaGFuZ2VJRHskQ2hhbmdlTmFtZX0gPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgJXsgJENoYW5nZURlZmluaXRpb25zeyRDaGFuZ2VOYW1lfSB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZENoYW5nZUlEeyRDaGFuZ2VOYW1lfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9IGNyZWF0ZWQgKCRDaGFuZ2VOYW1lKSIsCiAgICApOwp9Cgpmb3IgbXkgJENoYW5nZU5hbWUgKCBzb3J0IGtleXMgJUNyZWF0ZWRDaGFuZ2VJRCApIHsKICAgIG15ICRDaGFuZ2VJRCA9ICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtICRDaGFuZ2VJRCBjcmVhdGVkICgkQ2hhbmdlTmFtZSkiLAogICAgKTsKCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlTmFtZX0gfSApIHsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpIGFuZCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENoYW5nZS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CiAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkQ2hhbmdlRGVmaW5pdGlvbnN7JENoYW5nZU5hbWV9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIGFkZCB3b3Jrb3JkZXJzCm15ICVXb3JrT3JkZXJEZWZpbml0aW9ucyA9ICgKICAgIEFTQ0lJV29ya09yZGVyID0+IHsKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ3JlYXRlZENoYW5nZUlEe0NvbnRhaW5lckNoYW5nZX0sCiAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ0p1c3QgYW4gQVNDSUkgd29ya29yZGVyIHRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICB9LAogICAgVW1sYXV0c1dvcmtPcmRlciA9PiB7CiAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtDb250YWluZXJDaGFuZ2V9LAogICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3Jrb3JkZXIgdGl0bGUgd2l0aCBnZXJtYW4gdW1sYXV0cyDDpMO2w7wtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgfSwKICAgIFVuaWNvZGVXb3JrT3JkZXIgPT4gewogICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7Q29udGFpbmVyQ2hhbmdlfSwKICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya29yZGVyIHRpdGxlIHdpdGggdW5pY29kZSBjaGFycyBceHsxNjd9XHh7YjZ9XHh7MjBhY30gLSAnCiAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgIH0sCik7CgpteSAlQ3JlYXRlZFdvcmtPcmRlcklEOwpmb3IgbXkgJFdvcmtPcmRlck5hbWUgKCBzb3J0IGtleXMgJVdvcmtPcmRlckRlZmluaXRpb25zICkgewoKICAgICMgYWRkIHdvcmtvcmRlcgogICAgJENyZWF0ZWRXb3JrT3JkZXJJRHskV29ya09yZGVyTmFtZX0gPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgJXsgJFdvcmtPcmRlckRlZmluaXRpb25zeyRXb3JrT3JkZXJOYW1lfSB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICBteSAkV29ya09yZGVySUQgPSAkQ3JlYXRlZFdvcmtPcmRlcklEeyRXb3JrT3JkZXJOYW1lfTsKCiAgICAjIGdldCB3b3Jrb3JkZXIKICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgd29ya29yZGVyIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRXb3JrT3JkZXJEZWZpbml0aW9uc3skV29ya09yZGVyTmFtZX0gfSApIHsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpIGFuZCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgIG15ICRXb3JrT3JkZXJBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFdvcmtPcmRlci0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CiAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkV29ya09yZGVyRGVmaW5pdGlvbnN7JFdvcmtPcmRlck5hbWV9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFdvcmtPcmRlckF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoV29ya09yZGVySUQ6ICRXb3JrT3JkZXJJRCkiLAogICAgICAgICk7CgogICAgICAgICRUZXN0Q291bnQrKzsKICAgIH0KfQoKIyBhZGQgY29uZGl0aW9ucwpteSAlQ29uZGl0aW9uRGVmaW5pdGlvbnMgPSAoCiAgICBTaW1wbGVDb25kaXRpb24gPT4gewogICAgICAgIENvbmRpdGlvbkFkZCA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICA9PiAkQ3JlYXRlZENoYW5nZUlEe0Jhc2VDaGFuZ2V9LAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1NpbXBsZSBDb25kaXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICdhbGwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICNDb25kaXRpb25JRCAgPT4gLi4uLCAjIFRoaXMgaXMgZmlsbGVkIGJ5IGZvbGxvd2luZyBjb2RlCiAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkQ3JlYXRlZENoYW5nZUlEe0Jhc2VDaGFuZ2V9LAogICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ0R1bW15Q29tcGFyZVZhbHVlMScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWN0aW9uQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnc2V0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgI0NvbmRpdGlvbklEICA9PiAuLi4sICMgVGhpcyBpcyBmaWxsZWQgYnkgZm9sbG93aW5nIGNvZGUKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtCYXNlQ2hhbmdlfSwKICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gJ05ldyBDaGFuZ2UgVGl0bGUnIC4gJFVuaXF1ZVNpZ25hdHVyZSAuICRSYW5kb21JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgfQogICAgfSwKKTsKCm15ICVDcmVhdGVkQ29uZGl0aW9uSUQ7CgpDT05ESVRJT05OQU1FOgpmb3IgbXkgJENvbmRpdGlvbk5hbWUgKCBzb3J0IGtleXMgJUNvbmRpdGlvbkRlZmluaXRpb25zICkgewogICAgbXkgJENvbmRpdGlvbkRhdGEgPSAkQ29uZGl0aW9uRGVmaW5pdGlvbnN7JENvbmRpdGlvbk5hbWV9LT57Q29uZGl0aW9uQWRkfTsKICAgIG15ICRDb25kaXRpb25JRCAgID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uQWRkKAogICAgICAgICV7JENvbmRpdGlvbkRhdGF9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZGl0aW9uSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQWRkIENvbmRpdGlvbiAkQ29uZGl0aW9uTmFtZSIsCiAgICApOwoKICAgIG5leHQgQ09ORElUSU9OTkFNRSBpZiAhJENvbmRpdGlvbklEOwoKICAgICRDcmVhdGVkQ29uZGl0aW9uSUR7JENvbmRpdGlvbk5hbWV9ID0gJENvbmRpdGlvbklEOwoKICAgIG15ICRFeHByZXNzaW9uRGF0YSA9ICRDb25kaXRpb25EZWZpbml0aW9uc3skQ29uZGl0aW9uTmFtZX0tPntFeHByZXNzaW9uQWRkfTsKICAgIG15ICRFeHByZXNzaW9uSUQgPSBfRXhwcmVzc2lvbkFkZCggJEV4cHJlc3Npb25EYXRhLCAkQ29uZGl0aW9uSUQgKTsKCiAgICBteSAkQWN0aW9uRGF0YSA9ICRDb25kaXRpb25EZWZpbml0aW9uc3skQ29uZGl0aW9uTmFtZX0tPntBY3Rpb25BZGR9OwogICAgbXkgJEFjdGlvbklEID0gX0FjdGlvbkFkZCggJEFjdGlvbkRhdGEsICRDb25kaXRpb25JRCApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjcmVhdGUgdGVtcGxhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICVUZXN0ZWRUZW1wbGF0ZUlEOwpteSAlVGVzdGVkVGVtcGxhdGVTdHJpbmdzOwoKbXkgJVRlbXBsYXRlRGVmaW5pdGlvbnMgPSAoCiAgICBCYXNlQ2hhbmdlID0+IHsKICAgICAgICBOYW1lICAgICA9PiAnQmFzZSBDaGFuZ2UgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVmFsaWRJRCAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIENoYW5nZUlEID0+ICRDcmVhdGVkQ2hhbmdlSUR7QmFzZUNoYW5nZX0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgIH0sCiAgICBVbmljb2RlQ2hhbmdlID0+IHsKICAgICAgICBOYW1lICAgICA9PiAnVW5pY29kZSBDaGFuZ2UgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVmFsaWRJRCAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIENoYW5nZUlEID0+ICRDcmVhdGVkQ2hhbmdlSUR7VW5pY29kZUNoYW5nZX0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgIH0sCiAgICBFbnRpdHlDaGFuZ2UgPT4gewogICAgICAgIE5hbWUgICAgID0+ICdFbnRpdHkgQ2hhbmdlIFRlbXBsYXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgVHlwZSAgICAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFZhbGlkSUQgID0+ICRWYWxpZE9iamVjdC0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ3JlYXRlZENoYW5nZUlEe0VudGl0eUNoYW5nZX0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgIH0sCiAgICBBU0NJSVdvcmtPcmRlciA9PiB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FzY2lpIFdvcmtPcmRlciBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgICAgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBWYWxpZElEICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgV29ya09yZGVySUQgPT4gJENyZWF0ZWRXb3JrT3JkZXJJRHtBU0NJSVdvcmtPcmRlcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgIH0sCiAgICBVbWxhdXRzV29ya09yZGVyID0+IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVW1sYXV0cyBXb3JrT3JkZXIgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIFdvcmtPcmRlcklEID0+ICRDcmVhdGVkV29ya09yZGVySUR7VW1sYXV0c1dvcmtPcmRlcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgIH0sCiAgICBVbmljb2RlV29ya09yZGVyID0+IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVW5pY29kZSBXb3JrT3JkZXIgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIFdvcmtPcmRlcklEID0+ICRDcmVhdGVkV29ya09yZGVySUR7VW5pY29kZVdvcmtPcmRlcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgIH0sCiAgICBDQUJDdXN0b21lckFnZW50ID0+IHsKICAgICAgICBOYW1lICAgICA9PiAnQ3VzdG9tZXIgYW5kIEFnZW50IENBQiBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgID0+ICdDQUInLAogICAgICAgIFZhbGlkSUQgID0+ICRWYWxpZE9iamVjdC0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ3JlYXRlZENoYW5nZUlEe0Jhc2VDaGFuZ2V9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICB9LAogICAgU2ltcGxlQ29uZGl0aW9uID0+IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnU2ltcGxlIENvbmRpdGlvbiBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgICAgID0+ICdJVFNNQ29uZGl0aW9uJywKICAgICAgICBWYWxpZElEICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENyZWF0ZWRDb25kaXRpb25JRHtTaW1wbGVDb25kaXRpb259LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZW1wbGF0ZURlZmluaXRpb25OYW1lICggc29ydCBrZXlzICVUZW1wbGF0ZURlZmluaXRpb25zICkgewoKICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+e0NvbnRlbnR9ID0KICAgICAgICAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICV7ICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfSB9LAogICAgICAgIFRlbXBsYXRlVHlwZSA9PiAkVGVtcGxhdGVEZWZpbml0aW9uc3skVGVtcGxhdGVEZWZpbml0aW9uTmFtZX0tPntUeXBlfSwKICAgICAgICApOwoKICAgICMgY2hlY2sgc2VyaWFsaXphdGlvbgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRlbXBsYXRlRGVmaW5pdGlvbnN7JFRlbXBsYXRlRGVmaW5pdGlvbk5hbWV9LT57Q29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVTZXJpYWxpemUgZm9yICRUZW1wbGF0ZURlZmluaXRpb25OYW1lIiwKICAgICk7CgogICAgIyBhZGQgdGVtcGxhdGUKICAgICRUZXN0ZWRUZW1wbGF0ZUlEeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgJXsgJFRlbXBsYXRlRGVmaW5pdGlvbnN7JFRlbXBsYXRlRGVmaW5pdGlvbk5hbWV9IH0sCiAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+e1R5cGV9LAogICAgKTsKCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIElECiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGVtcGxhdGVJRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBUZW1wbGF0ZUFkZCBmb3IgJFRlbXBsYXRlRGVmaW5pdGlvbk5hbWUiLAogICAgKTsKCiAgICAjIGdldCBjcmVhdGVkIHRlbXBsYXRlCiAgICBteSAkVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGF0dHJpYnV0ZXMgbmFtZSwgdHlwZSBhbmQgY29udGVudAogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KE5hbWUgVHlwZSBDb250ZW50KSkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFRlbXBsYXRlLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSAkQXR0cmlidXRlIChUZW1wbGF0ZUlEOiAkVGVtcGxhdGVJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIGNyZWF0ZSBvYmplY3RzIGJhc2VkIG9uIHRlbXBsYXRlcwpteSBAQ2hhbmdlSURzOwoKQ0hBTkdFVEVNUExBVEVOQU1FOgpmb3IgbXkgJENoYW5nZVRlbXBsYXRlTmFtZSAoIHNvcnQga2V5cyAlQ3JlYXRlZENoYW5nZUlEICkgewoKICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRDaGFuZ2VUZW1wbGF0ZU5hbWV9OwoKICAgIG5leHQgQ0hBTkdFVEVNUExBVEVOQU1FIGlmICEkVGVtcGxhdGVJRDsKCiAgICAjIGRlc2VyaWFsaXplIHRlbXBsYXRlCiAgICBteSAkQ2hhbmdlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGlkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3JlYXRlIGNoYW5nZSBiYXNlZCBvbiB0ZW1wbGF0ZSAoVGVtcGxhdGVJRDogJFRlbXBsYXRlSUQpIiwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlVGVtcGxhdGVOYW1lfSB9ICkgewoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkgYW5kIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgbXkgJENoYW5nZUF0dHJpYnV0ZSAgICA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkQ2hhbmdlLT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoCiAgICAgICAgICAgICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlVGVtcGxhdGVOYW1lfS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9CiAgICAgICAgKTsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwbGFpbiB2ZXJzaW9uIG9mIHNvbWUgYXJndW1lbnRzLCBlc3BlY2lhbGx5IHdoZXRoZXIgdGhlIHJlc3VsdCBvZiBUb0FzY2lpCiAgICAjIGlzIGNvcnJlY3RseSBzYXZlZCBpbnRvIHRoZSBkYXRhYmFzZQogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoRGVzY3JpcHRpb24gSnVzdGlmaWNhdGlvbikpIHsKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICEkQ2hhbmdlRGVmaW5pdGlvbnN7JENoYW5nZVRlbXBsYXRlTmFtZX0tPnskQXR0cmlidXRlfTsKCiAgICAgICAgbXkgJENoYW5nZUF0dHJpYnV0ZSA9ICRDaGFuZ2UtPnsiJHtBdHRyaWJ1dGV9UGxhaW4ifSB8fCAnJzsKICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gJEhUTUxVdGlsc09iamVjdC0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlVGVtcGxhdGVOYW1lfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJHtBdHRyaWJ1dGV9UGxhaW4gKENoYW5nZUlEOiAkQ2hhbmdlSUQpIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENoYW5nZUlEcywgJENoYW5nZUlEOwoKICAgICRUZXN0Q291bnQrKzsKfQoKV09SS09SREVSVEVNUExBVEVOQU1FOgpmb3IgbXkgJFdvcmtPcmRlclRlbXBsYXRlTmFtZSAoIHNvcnQga2V5cyAlQ3JlYXRlZFdvcmtPcmRlcklEICkgewoKICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRXb3JrT3JkZXJUZW1wbGF0ZU5hbWV9OwoKICAgIG5leHQgV09SS09SREVSVEVNUExBVEVOQU1FIGlmICEkVGVtcGxhdGVJRDsKCiAgICAjIGRlc2VyaWFsaXplIHRlbXBsYXRlCiAgICBteSAkV29ya09yZGVySUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBDaGFuZ2VJRCAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7VGFyZ2V0Q2hhbmdlfSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgd29ya29yZGVyIGlkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3JlYXRlIHdvcmtvcmRlciBiYXNlZCBvbiB0ZW1wbGF0ZSAoVGVtcGxhdGVJRDogJFRlbXBsYXRlSUQpIiwKICAgICk7CgogICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgIG15ICRXb3JrT3JkZXIgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgd29ya29yZGVyIGF0dHJpYnV0ZXMKICAgIFJFUVVFU1RFREFUVFJJQlVURToKICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRXb3JrT3JkZXJEZWZpbml0aW9uc3skV29ya09yZGVyVGVtcGxhdGVOYW1lfSB9ICkgewoKICAgICAgICBuZXh0IFJFUVVFU1RFREFUVFJJQlVURSBpZiAkUmVxdWVzdGVkQXR0cmlidXRlIGVxICdDaGFuZ2VJRCc7CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKSBhbmQgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICBteSAkV29ya09yZGVyQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRXb3JrT3JkZXItPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwogICAgICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigKICAgICAgICAgICAgJFdvcmtPcmRlckRlZmluaXRpb25zeyRXb3JrT3JkZXJUZW1wbGF0ZU5hbWV9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0KICAgICAgICApOwogICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkV29ya09yZGVyQXR0cmlidXRlLAogICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSAkUmVxdWVzdGVkQXR0cmlidXRlIChXb3JrT3JkZXI6ICRXb3JrT3JkZXJJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgJENyZWF0ZWRDaGFuZ2VJRHtUYXJnZXRDaGFuZ2V9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUlEIChXb3JrT3JkZXI6ICRXb3JrT3JkZXJJRCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCkNPTkRJVElPTlRFTVBMQVRFTkFNRToKZm9yIG15ICRDb25kaXRpb25UZW1wbGF0ZU5hbWUgKCBzb3J0IGtleXMgJUNyZWF0ZWRDb25kaXRpb25JRCApIHsKCiAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskQ29uZGl0aW9uVGVtcGxhdGVOYW1lfTsKCiAgICBuZXh0IENPTkRJVElPTlRFTVBMQVRFTkFNRSBpZiAhJFRlbXBsYXRlSUQ7CgogICAgIyBkZXNlcmlhbGl6ZSB0ZW1wbGF0ZQogICAgbXkgJENvbmRpdGlvbklEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgQ2hhbmdlSUQgICA9PiAkQ3JlYXRlZENoYW5nZUlEe1RhcmdldENoYW5nZX0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNoYW5nZSBpZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENvbmRpdGlvbklELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENyZWF0ZSBjb25kaXRpb24gYmFzZWQgb24gdGVtcGxhdGUgKFRlbXBsYXRlSUQ6ICRUZW1wbGF0ZUlEKSIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyBnZXQgbmFtZXMgb2YgQ0FCIHRlbXBsYXRlcwpteSBAQ0FCVGVtcGxhdGVOYW1lcyA9IGdyZXAgeyAkVGVtcGxhdGVEZWZpbml0aW9uc3skX30tPntUeXBlfSBlcSAnQ0FCJyB9IGtleXMgJVRlc3RlZFRlbXBsYXRlSUQ7CgpDQUJURU1QTEFURU5BTUU6CmZvciBteSAkQ0FCVGVtcGxhdGVOYW1lIChAQ0FCVGVtcGxhdGVOYW1lcykgewoKICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRDQUJUZW1wbGF0ZU5hbWV9OwoKICAgIG5leHQgQ0FCVEVNUExBVEVOQU1FIGlmICEkVGVtcGxhdGVJRDsKCiAgICAjIGRlc2VyaWFsaXplIHRlbXBsYXRlCiAgICBteSAkQ2hhbmdlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgQ2hhbmdlSUQgICA9PiAkQ3JlYXRlZENoYW5nZUlEe1RhcmdldENoYW5nZX0sCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGlkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3JlYXRlIENBQiBiYXNlZCBvbiB0ZW1wbGF0ZSAoVGVtcGxhdGVJRDogJFRlbXBsYXRlSUQpIiwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IG9yaWdpbmFsIGNoYW5nZQogICAgbXkgJE9yaWdDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENyZWF0ZWRDaGFuZ2VJRHtCYXNlQ2hhbmdlfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkgYW5kIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAjIyBubyBjcml0aWMKICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSwgICAgICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IF0gKTsKICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyAkT3JpZ0NoYW5nZS0+e0NBQkFnZW50c30sICRPcmlnQ2hhbmdlLT57Q0FCQ3VzdG9tZXJzfSBdICk7CiAgICAjIyB1c2UgY3JpdGljCgogICAgJFNlbGYtPklzKAogICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDQUIgZnJvbSB0ZW1wbGF0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgdGVzdCBUZW1wbGF0ZUxpc3QoKQpteSAkQ2hhbmdlVGVtcGxhdGVMaXN0ID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgpteSBAQ2hhbmdlVGVtcGxhdGVOYW1lcyA9IGdyZXAgewogICAgJFRlbXBsYXRlRGVmaW5pdGlvbnN7JF99LT57VHlwZX0gZXEgJ0lUU01DaGFuZ2UnCn0ga2V5cyAlVGVzdGVkVGVtcGxhdGVJRDsKCmZvciBteSAkQ2hhbmdlVGVtcGxhdGVOYW1lIChAQ2hhbmdlVGVtcGxhdGVOYW1lcykgewogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskQ2hhbmdlVGVtcGxhdGVOYW1lfTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBleGlzdHMgJENoYW5nZVRlbXBsYXRlTGlzdC0+eyRUZW1wbGF0ZUlEfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGVjayBDaGFuZ2VUZW1wbGF0ZSAkVGVtcGxhdGVJRCBpbiBUZW1wbGF0ZUxpc3QiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCm15IEBXb3JrT3JkZXJUZW1wbGF0ZU5hbWVzID0gZ3JlcCB7CiAgICAkVGVtcGxhdGVEZWZpbml0aW9uc3skX30tPntUeXBlfSBlcSAnSVRTTVdvcmtPcmRlcicKfSBrZXlzICVUZXN0ZWRUZW1wbGF0ZUlEOwoKbXkgJFdvcmtPcmRlclRlbXBsYXRlTGlzdCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKZm9yIG15ICRXb3JrT3JkZXJUZW1wbGF0ZU5hbWUgKEBXb3JrT3JkZXJUZW1wbGF0ZU5hbWVzKSB7CiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRXb3JrT3JkZXJUZW1wbGF0ZU5hbWV9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIGV4aXN0cyAkV29ya09yZGVyVGVtcGxhdGVMaXN0LT57JFRlbXBsYXRlSUR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIFdvcmtPcmRlclRlbXBsYXRlICRUZW1wbGF0ZUlEIGluIFRlbXBsYXRlTGlzdCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKbXkgQENvbmRpdGlvblRlbXBsYXRlTmFtZXMgPSBncmVwIHsKICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRffS0+e1R5cGV9IGVxICdJVFNNQ29uZGl0aW9uJwp9IGtleXMgJVRlc3RlZFRlbXBsYXRlSUQ7CgpteSAkQ29uZGl0aW9uVGVtcGxhdGVMaXN0ID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Db25kaXRpb24nLAogICAgVXNlcklEICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENvbmRpdGlvblRlbXBsYXRlTmFtZSAoQENvbmRpdGlvblRlbXBsYXRlTmFtZXMpIHsKICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlc3RlZFRlbXBsYXRlSUR7JENvbmRpdGlvblRlbXBsYXRlTmFtZX07CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgZXhpc3RzICRDb25kaXRpb25UZW1wbGF0ZUxpc3QtPnskVGVtcGxhdGVJRH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hlY2sgQ29uZGl0aW9uVGVtcGxhdGUgJFRlbXBsYXRlSUQgaW4gVGVtcGxhdGVMaXN0IiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgpteSAkQ0FCVGVtcGxhdGVMaXN0ID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBUZW1wbGF0ZVR5cGUgPT4gJ0NBQicsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCmZvciBteSAkQ0FCVGVtcGxhdGVOYW1lIChAQ0FCVGVtcGxhdGVOYW1lcykgewogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskQ0FCVGVtcGxhdGVOYW1lfTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBleGlzdHMgJENBQlRlbXBsYXRlTGlzdC0+eyRUZW1wbGF0ZUlEfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGVjayBDQUJUZW1wbGF0ZSAkVGVtcGxhdGVJRCBpbiBUZW1wbGF0ZUxpc3QiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgdGVzdCBUZW1wbGF0ZVNlYXJjaCgpCgojIHRlc3QgVGVtcGxhdGVVcGRhdGUoKQpteSAlTmV3VmFsdWVzOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNsZWFuIHRoZSBzeXN0ZW0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAopOwoKIyBkZWxldGUgdGhlIHRlc3QgdGVtcGxhdGVzCmZvciBteSAkVGVtcGxhdGVOYW1lICggc29ydCBrZXlzICVUZXN0ZWRUZW1wbGF0ZUlEICkgewogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskVGVtcGxhdGVOYW1lfTsKCiAgICBteSAkRGVsZXRlT2sgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIgogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgLSBkb3VibGUgY2hlY2siLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZQoKc3ViIF9BY3Rpb25BZGQgewogICAgbXkgKCAkQWN0aW9uRGF0YSwgJENvbmRpdGlvbklEICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRBY3Rpb25EYXRhOwogICAgcmV0dXJuIGlmIHJlZiAkQWN0aW9uRGF0YSBuZSAnSEFTSCc7CgogICAgIyBoYXNoIGZvciBhZGRpbmcKICAgIG15ICVBY3Rpb25BZGQ7CgogICAgIyBzZXQgc3RhdGljIGZpZWxkcwogICAgbXkgQFN0YXRpY0ZpZWxkcyA9IHF3KCBTZWxlY3RvciBBY3Rpb25WYWx1ZSBVc2VySUQgQ29uZGl0aW9uSUQgKTsKCiAgICBTVEFUSUNGSUVMRDoKICAgIGZvciBteSAkU3RhdGljRmllbGQgKEBTdGF0aWNGaWVsZHMpIHsKCiAgICAgICAgIyBvbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgbmV4dCBTVEFUSUNGSUVMRCBpZiAhZXhpc3RzICRBY3Rpb25EYXRhLT57JFN0YXRpY0ZpZWxkfTsKICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICFkZWZpbmVkICRBY3Rpb25EYXRhLT57JFN0YXRpY0ZpZWxkfTsKCiAgICAgICAgIyBzYWZlIGRhdGEKICAgICAgICAkQWN0aW9uQWRkeyRTdGF0aWNGaWVsZH0gPSAkQWN0aW9uRGF0YS0+eyRTdGF0aWNGaWVsZH07CiAgICB9CgogICAgIyBnZXQgYWxsIGZpZWxkcyBmb3IgQWN0aW9uQWRkCiAgICBBQ1RJT05BRERWQUxVRToKICAgIGZvciBteSAkQWN0aW9uQWRkVmFsdWUgKCBzb3J0IGtleXMgJXskQWN0aW9uRGF0YX0gKSB7CgogICAgICAgICMgb21pdCBzdGF0aWMgZmllbGRzCiAgICAgICAgbmV4dCBBQ1RJT05BRERWQUxVRSBpZiBncmVwIHsgJF8gZXEgJEFjdGlvbkFkZFZhbHVlIH0gQFN0YXRpY0ZpZWxkczsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGZvciBmaWVsZHMKICAgICAgICBmb3IgbXkgJEZpZWxkVmFsdWUgKCBzb3J0IGtleXMgJXsgJEFjdGlvbkRhdGEtPnskQWN0aW9uQWRkVmFsdWV9IH0gKSB7CgogICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAkQWN0aW9uQWRkeyRBY3Rpb25BZGRWYWx1ZX0gPSAkQ29uZGl0aW9uT2JqZWN0LT4kRmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgICV7ICRBY3Rpb25EYXRhLT57JEFjdGlvbkFkZFZhbHVlfS0+eyRGaWVsZFZhbHVlfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24KICAgIG15ICRBY3Rpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkFkZCgKICAgICAgICAlQWN0aW9uQWRkLAogICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICkgfHwgMDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQWN0aW9uSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25BZGQgLT4gJEFjdGlvbklEIiwKICAgICk7CgogICAgIyBjaGVjayBmb3IgQWN0aW9uSUQKICAgIHJldHVybiBpZiAhJEFjdGlvbklEOwoKICAgICMgY2hlY2sgdGhlIGFkZGVkIGFjdGlvbgogICAgbXkgJEFjdGlvbkdldCA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkdldCgKICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgVXNlcklEICAgPT4gJEFjdGlvbkFkZHtVc2VySUR9LAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBY3Rpb25HZXQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBBY3Rpb25BZGQoKTogQWN0aW9uR2V0JywKICAgICk7CgogICAgIyBkZWxldGUgVXNlcklELCBpdCBpcyBub3QgcmV0dXJuZWQKICAgIGRlbGV0ZSAkQWN0aW9uQWRke1VzZXJJRH07CgogICAgIyB0ZXN0IHZhbHVlcwogICAgZm9yIG15ICRUZXN0VmFsdWUgKCBzb3J0IGtleXMgJUFjdGlvbkFkZCApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBY3Rpb25HZXQtPnskVGVzdFZhbHVlfSwKICAgICAgICAgICAgJEFjdGlvbkFkZHskVGVzdFZhbHVlfSwKICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25BZGQoKTogQWN0aW9uR2V0IC0+ICRUZXN0VmFsdWUiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRBY3Rpb25JRDsKfQoKc3ViIF9FeHByZXNzaW9uQWRkIHsKICAgIG15ICggJEV4cHJlc3Npb25EYXRhLCAkQ29uZGl0aW9uSUQgKSA9IEBfOwogICAgbXkgJUV4cHJlc3Npb25BZGRTb3VyY2VEYXRhID0gJXskRXhwcmVzc2lvbkRhdGF9OwoKICAgIG15ICVFeHByZXNzaW9uQWRkRGF0YTsKCiAgICAjIHNldCBzdGF0aWMgZmllbGRzCiAgICBteSBAU3RhdGljRmllbGRzID0gcXcoIFNlbGVjdG9yIENvbXBhcmVWYWx1ZSBVc2VySUQgQ29uZGl0aW9uSUQgKTsKCiAgICBTVEFUSUNGSUVMRDoKICAgIGZvciBteSAkU3RhdGljRmllbGQgKEBTdGF0aWNGaWVsZHMpIHsKCiAgICAgICAgIyBvbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgbmV4dCBTVEFUSUNGSUVMRCBpZiAhZXhpc3RzICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskU3RhdGljRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskU3RhdGljRmllbGR9OwoKICAgICAgICAjIHNhZmUgZGF0YQogICAgICAgICRFeHByZXNzaW9uQWRkRGF0YXskU3RhdGljRmllbGR9ID0gJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH07CiAgICB9CgogICAgIyBnZXQgYWxsIGZpZWxkcyBmb3IgRXhwcmVzc2lvbkFkZAogICAgRVhQUkVTU0lPTkFERFZBTFVFOgogICAgZm9yIG15ICRFeHByZXNzaW9uQWRkVmFsdWUgKCBzb3J0IGtleXMgJUV4cHJlc3Npb25BZGRTb3VyY2VEYXRhICkgewoKICAgICAgICAjIG9taXQgc3RhdGljIGZpZWxkcwogICAgICAgIG5leHQgRVhQUkVTU0lPTkFERFZBTFVFIGlmIGdyZXAgeyAkXyBlcSAkRXhwcmVzc2lvbkFkZFZhbHVlIH0gQFN0YXRpY0ZpZWxkczsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGZvciBmaWVsZHMKICAgICAgICBmb3IgbXkgJEZpZWxkVmFsdWUgKCBzb3J0IGtleXMgJXsgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRFeHByZXNzaW9uQWRkVmFsdWV9IH0gKSB7CgogICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAkRXhwcmVzc2lvbkFkZERhdGF7JEV4cHJlc3Npb25BZGRWYWx1ZX0gPQogICAgICAgICAgICAgICAgJENvbmRpdGlvbk9iamVjdC0+JEZpZWxkVmFsdWUoCiAgICAgICAgICAgICAgICAleyAkRXhwcmVzc2lvbkFkZFNvdXJjZURhdGF7JEV4cHJlc3Npb25BZGRWYWx1ZX0tPnskRmllbGRWYWx1ZX0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGV4cHJlc3Npb24KICAgIG15ICRFeHByZXNzaW9uSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uQWRkKAogICAgICAgICVFeHByZXNzaW9uQWRkRGF0YSwKICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICApIHx8IDA7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEV4cHJlc3Npb25JRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtICRFeHByZXNzaW9uSUQiLAogICAgKTsKCiAgICBuZXh0IENSRUFURURBVEEgaWYgISRFeHByZXNzaW9uSUQ7CgogICAgIyBjaGVjayB0aGUgYWRkZWQgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb25HZXREYXRhID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gRXhwcmVzc2lvbkFkZCgpOiBFeHByZXNzaW9uR2V0JywKICAgICk7CgogICAgIyB0ZXN0IHZhbHVlcwogICAgZGVsZXRlICRFeHByZXNzaW9uQWRkRGF0YXtVc2VySUR9OwogICAgZm9yIG15ICRUZXN0VmFsdWUgKCBzb3J0IGtleXMgJUV4cHJlc3Npb25BZGREYXRhICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLT57JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICRFeHByZXNzaW9uQWRkRGF0YXskVGVzdFZhbHVlfSwKICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBFeHByZXNzaW9uQWRkKCk6IEV4cHJlc3Npb25HZXQgLT4gJFRlc3RWYWx1ZSIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEV4cHJlc3Npb25JRDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgTGlzdDo6VXRpbCBxdyhtYXgpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7Cm15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRHcm91cE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVmFsaWRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDaGFuZ2VPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7Cm15ICRXb3JrT3JkZXJPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7Cm15ICRIZWxwZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIHRlc3QgaWYgd29ya29yZGVyIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkV29ya09yZGVyT2JqZWN0LAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2Ygd29ya29yZGVyIG9iamVjdCcsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkV29ya09yZGVyT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAnIC0gY2xhc3Mgb2Ygd29ya29yZGVyIG9iamVjdCcsCik7CgojIHRlc3QgaWYgY2hhbmdlIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkQ2hhbmdlT2JqZWN0LAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2YgY2hhbmdlIG9iamVjdCcsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkQ2hhbmdlT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJywKICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAnIC0gY2xhc3Mgb2YgY2hhbmdlIG9iamVjdCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY3JlYXRlIG5lZWRlZCB1c2VycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15IEBVc2VySURzOyAgICAgICAgICAgICAgICMgYSBsaXN0IG9mIGV4aXN0aW5nIGFuZCB2YWxpZCB1c2VyIGlkcwpteSBASW52YWxpZFVzZXJJRHM7ICAgICAgICAjIGEgbGlzdCBvZiBleGlzdGluZyBidXQgaW52YWxpZCB1c2VyIGlkcwpteSBATm9uRXhpc3RpbmdVc2VySURzOyAgICAjIGEgbGlzdCBvZiBub24tZXhpc3Rpb24gdXNlciBpZHMKCiMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCm15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyQWRkKAogICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0lUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInIC4gJENvdW50ZXIsCiAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUlUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItJyAuICRDb3VudGVyIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tTnVtYmVyKCksCiAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgKTsKICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7Cn0KCiMgc29ydCB0aGUgdXNlciBhbmQgY3VzdG9tZXIgdXNlciBhcnJheXMKQFVzZXJJRHMgPSBzb3J0IEBVc2VySURzOwoKIyBjcmVhdGUgbm9uIGV4aXN0aW5nIHVzZXIgSURzCmZvciAoIDEgLi4gMiApIHsKICAgIExQQzoKICAgIGZvciBteSAkTG9vcFByb3RlY3Rpb25Db3VudGVyICggMSAuLiAxMDAgKSB7CgogICAgICAgICMgY3JlYXRlIGEgcmFuZG9tIHVzZXIgaWQKICAgICAgICBteSAkVGVtcE5vbkV4aXN0aW5nVXNlcklEID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tTnVtYmVyKCk7CgogICAgICAgICMgY2hlY2sgaWYgcmFuZG9tIHVzZXIgaWQgZXhpc3RzIGFscmVhZHkKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVGVtcE5vbkV4aXN0aW5nVXNlcklELAogICAgICAgICk7CiAgICAgICAgbmV4dCBMUEMgaWYgJVVzZXJEYXRhOwoKICAgICAgICAjIHdlIGdvdCBhbiB1bnVzZWQgdXNlciBJRAogICAgICAgIHB1c2ggQE5vbkV4aXN0aW5nVXNlcklEcywgJFRlbXBOb25FeGlzdGluZ1VzZXJJRDsKICAgICAgICBsYXN0IExQQzsKICAgIH0KfQoKIyBzZXQgM3JkIHVzZXIgaW52YWxpZAokVXNlck9iamVjdC0+VXNlclVwZGF0ZSgKICAgICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMl0sCiAgICApLAogICAgVmFsaWRJRCAgICAgID0+ICRWYWxpZE9iamVjdC0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICdpbnZhbGlkJyApLAogICAgQ2hhbmdlVXNlcklEID0+IDEsCik7CnB1c2ggQEludmFsaWRVc2VySURzLCBwb3AgQFVzZXJJRHM7CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCik7CgojIHR1cm4gb2ZmIFNlbmROb3RpZmljYXRpb25zLCBpbiBvcmRlciB0byBhdm9pZCBhIGxvdCBvZiB1c2VsZXNzIG1haWxzCm15ICRTZW5kTm90aWZpY2F0aW9uc09yZyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNoYW5nZTo6U2VuZE5vdGlmY2F0aW9ucycpOwokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSVRTTUNoYW5nZTo6U2VuZE5vdGlmaWNhdGlvbnMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgc2F2ZSBvcmlnaW5hbCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb24KbXkgJE9yaWdpbmFsRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICBWYWxpZCA9PiAwLAopOwoKbXkgJFVuaXF1ZU5hbWVQcmVmaXggPSAnVW5pdFRlc3RXb3Jrb3JkZXInIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tTnVtYmVyKCk7CgojIGNyZWF0ZSBzb21lIGR5bmFtaWMgZmllbGRzIGZvciB3b3Jrb3JkZXJzCm15IEBEeW5hbWljRmllbGRzID0gKAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnLAogICAgICAgIExhYmVsICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnLAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRGVzY3JpcHRpb24gZm9yIER5bmFtaWMgRmllbGQuJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJywKICAgICAgICBMYWJlbCAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJywKICAgICAgICBGaWVsZE9yZGVyID0+IDEwMDAwLAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0Rlc2NyaXB0aW9uIGZvciBEeW5hbWljIEZpZWxkLicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MycsCiAgICAgICAgTGFiZWwgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MycsCiAgICAgICAgRmllbGRPcmRlciA9PiAxMDAwMCwKICAgICAgICBGaWVsZFR5cGUgID0+ICdUZXh0JywKICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdEZXNjcmlwdGlvbiBmb3IgRHluYW1pYyBGaWVsZC4nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDQnLAogICAgICAgIExhYmVsICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDQnLAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRGVzY3JpcHRpb24gZm9yIER5bmFtaWMgRmllbGQuJywKICAgICAgICB9LAogICAgfSwKKTsKCm15IEBEeW5hbWljRmllbGRJRHM7CmZvciBteSAkVGVzdCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAjIGFkZCBkeW5hbWljIGZpZWxkCiAgICBteSAkRHluYW1pY0ZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgJXskVGVzdH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREeW5hbWljRmllbGRJRCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIER5bmFtaWNGaWVsZEFkZCgpIiwKICAgICk7CgogICAgIyByZW1lbWJlciBpZCB0byBkZWxldGUgaXQgbGF0ZXIKICAgIHB1c2ggQER5bmFtaWNGaWVsZElEcywgJER5bmFtaWNGaWVsZElEOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBJVFNNV29ya09yZGVyIEFQSQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSBwdWJsaWMgaW50ZXJmYWNlIChpbiBhbHBoYWJldGljYWwgb3JkZXIpCm15IEBPYmplY3RNZXRob2RzID0gcXcoCiAgICBQZXJtaXNzaW9uCiAgICBXb3JrT3JkZXJBZGQKICAgIFdvcmtPcmRlckF0dGFjaG1lbnRBZGQKICAgIFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGUKICAgIFdvcmtPcmRlckF0dGFjaG1lbnRFeGlzdHMKICAgIFdvcmtPcmRlckF0dGFjaG1lbnRHZXQKICAgIFdvcmtPcmRlckF0dGFjaG1lbnRMaXN0CiAgICBXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0CiAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0CiAgICBXb3JrT3JkZXJEZWxldGUKICAgIFdvcmtPcmRlckdldAogICAgV29ya09yZGVyTGlzdAogICAgV29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQKICAgIFdvcmtPcmRlclNlYXJjaAogICAgV29ya09yZGVyU3RhdGVJRHNDaGVjawogICAgV29ya09yZGVyU3RhdGVMb29rdXAKICAgIFdvcmtPcmRlclR5cGVMaXN0CiAgICBXb3JrT3JkZXJUeXBlTG9va3VwCiAgICBXb3JrT3JkZXJVcGRhdGUKKTsKCiMgY2hlY2sgaWYgc3VicyBhcmUgYXZhaWxhYmxlCmZvciBteSAkT2JqZWN0TWV0aG9kIChAT2JqZWN0TWV0aG9kcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFdvcmtPcmRlck9iamVjdC0+Y2FuKCRPYmplY3RNZXRob2QpLAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgJ2NhbiAkT2JqZWN0TWV0aG9kJyIKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzZWFyY2ggZm9yIGRlZmF1bHQgSVRTTVdvcmtPcmRlciBTdGF0ZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBkZWZhdWx0IElUU01Xb3JrT3JkZXIgU3RhdGVzCiMgY2FuJ3QgdXNlIHF3IGR1ZSB0byBzcGFjZXMgaW4gc3RhdGVzCm15IEBEZWZhdWx0V29ya09yZGVyU3RhdGVzID0gKAogICAgJ2NyZWF0ZWQnLAogICAgJ2FjY2VwdGVkJywKICAgICdyZWFkeScsCiAgICAnaW4gcHJvZ3Jlc3MnLAogICAgJ2Nsb3NlZCcsCiAgICAnY2FuY2VsZWQnLAopOwoKIyBnZXQgaXRlbSBsaXN0IG9mIHRoZSB3b3Jrb3JkZXIgc3RhdGVzIHdpdGggc3dhcHBlZCBrZXlzIGFuZCB2YWx1ZXMKbXkgJVdvcmtPcmRlclN0YXRlSUQyTmFtZSA9ICV7CiAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICkgfHwge30KfTsKbXkgJVdvcmtPcmRlclN0YXRlTmFtZTJJRCAgID0gcmV2ZXJzZSAlV29ya09yZGVyU3RhdGVJRDJOYW1lOwpteSBAU29ydGVkV29ya09yZGVyU3RhdGVJRHMgPSBzb3J0IGtleXMgJVdvcmtPcmRlclN0YXRlSUQyTmFtZTsKCiMgY2hlY2sgaWYgc3RhdGVzIGFyZSBpbiBHZW5lcmFsQ2F0YWxvZwpmb3IgbXkgJERlZmF1bHRXb3JrT3JkZXJTdGF0ZSAoQERlZmF1bHRXb3JrT3JkZXJTdGF0ZXMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7JERlZmF1bHRXb3JrT3JkZXJTdGF0ZX0sCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayBzdGF0ZSAnJERlZmF1bHRXb3JrT3JkZXJTdGF0ZSciCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCB0aGUgc3RhdGUgbG9va3VwIG1ldGhvZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGludmVzdGlnYXRlIHRoZSBkZWZhdWx0IHN0YXRlcwpmb3IgbXkgJFN0YXRlIChARGVmYXVsdFdvcmtPcmRlclN0YXRlcykgewoKICAgICMgbG9vayB1cCB0aGUgc3RhdGUgbmFtZQogICAgbXkgJExvb2tlZFVwU3RhdGVJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRTdGF0ZSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJFdvcmtPcmRlclN0YXRlTmFtZTJJRHskU3RhdGV9LAogICAgICAgICJMb29rIHVwIHN0YXRlICckU3RhdGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFN0YXRlID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkTG9va2VkVXBTdGF0ZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwU3RhdGUsCiAgICAgICAgJFN0YXRlLAogICAgICAgICJMb29rIHVwIHN0YXRlIGlkICckTG9va2VkVXBTdGF0ZUlEJyIsCiAgICApOwp9CgojIG5vdyBzb21lIHBhcmFtIGNoZWNrcwpteSAkTG9va3VwT0sgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgpOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9LLAogICAgJ05vIHBhcmFtcyBwYXNzZWQgdG8gV29ya09yZGVyU3RhdGVMb29rdXAoKScsCik7CgokTG9va3VwT0sgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgIFdvcmtPcmRlclN0YXRlICAgPT4gJ2FwcHJvdmVkJywKICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gMiwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPSywKICAgICdFeGNsdXNpdmUgcGFyYW1zIHBhc3NlZCB0byBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpJywKKTsKCiRMb29rdXBPSyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgU3RhdGUgPT4gJ2FwcHJvdmVkJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPSywKICAgICJJbmNvcnJlY3QgcGFyYW0gJ1N0YXRlJyBwYXNzZWQgdG8gV29ya09yZGVyU3RhdGVMb29rdXAoKSIsCik7CgokTG9va3VwT0sgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgIFN0YXRlSUQgPT4gMiwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPSywKICAgICJJbmNvcnJlY3QgcGFyYW0gJ1N0YXRlSUQnIHBhc3NlZCB0byBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzZWFyY2ggZm9yIGRlZmF1bHQgSVRTTVdvcmtPcmRlci10eXBlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGRlZmF1bHQgSVRTTVdvcmtPcmRlci1zdGF0ZXMKIyBjYW4ndCB1c2UgcXcgZHVlIHRvIHNwYWNlcyBpbiB0eXBlcwpteSBARGVmYXVsdFdvcmtPcmRlclR5cGVzID0gKAogICAgJ2FwcHJvdmFsJywKICAgICd3b3Jrb3JkZXInLAogICAgJ2JhY2tvdXQnLAogICAgJ2RlY2lzaW9uJywKICAgICdwaXInLAopOwoKIyBnZXQgY2xhc3MgbGlzdCB3aXRoIHN3YXBwZWQga2V5cyBhbmQgdmFsdWVzCm15ICVXb3JrT3JkZXJUeXBlSUQyTmFtZSA9ICV7CiAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgKSB8fCB7fQp9OwpteSAlV29ya09yZGVyVHlwZU5hbWUySUQgPSByZXZlcnNlICVXb3JrT3JkZXJUeXBlSUQyTmFtZTsKbXkgQFNvcnRlZFR5cGVJRHMgICAgICAgID0gc29ydCBrZXlzICVXb3JrT3JkZXJUeXBlSUQyTmFtZTsKCiMgY2hlY2sgaWYgdHlwZXMgYXJlIGluIEdlbmVyYWxDYXRhbG9nCmZvciBteSAkRGVmYXVsdFdvcmtPcmRlclR5cGUgKEBEZWZhdWx0V29ya09yZGVyVHlwZXMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRXb3JrT3JkZXJUeXBlTmFtZTJJRHskRGVmYXVsdFdvcmtPcmRlclR5cGV9LAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgdHlwZSAnJERlZmF1bHRXb3JrT3JkZXJUeXBlJyIKICAgICk7Cn0KCiMgdGVzdCBsb29rdXAgbWV0aG9kCmZvciBteSAkRGVmYXVsdFdvcmtPcmRlclR5cGUgKEBEZWZhdWx0V29ya09yZGVyVHlwZXMpIHsKICAgIG15ICRUeXBlSUQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclR5cGUgPT4gJERlZmF1bHRXb3JrT3JkZXJUeXBlLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFR5cGVJRCwKICAgICAgICAkV29ya09yZGVyVHlwZU5hbWUySUR7JERlZmF1bHRXb3JrT3JkZXJUeXBlfSwKICAgICAgICAiTG9va3VwICREZWZhdWx0V29ya09yZGVyVHlwZSIsCiAgICApOwoKICAgIG15ICRUeXBlTmFtZSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRUeXBlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkVHlwZU5hbWUsCiAgICAgICAgJERlZmF1bHRXb3JrT3JkZXJUeXBlLAogICAgICAgICJMb29rdXAgJFR5cGVJRCIsCiAgICApOwp9CgojIHRlc3QgdGhlIG1ldGhvZCBXb3JrT3JkZXJUeXBlTGlzdCgpLiBJdCBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiBhbGwgdHlwZXMuCm15ICRUeXBlc0xpc3RVbmRlclRlc3QgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJUeXBlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopIHx8IHt9OwoKIyBkbyB0aGUgY2hlY2tzCmZvciBteSAkVHlwZUlEIChAU29ydGVkVHlwZUlEcykgewogICAgbXkgKCAkRmlyc3RIYXNoUmVmLCAkU2Vjb25kSGFzaFJlZiApID0gZ3JlcCB7ICRfLT57S2V5fSA9PSAkVHlwZUlEIH0gQHskVHlwZXNMaXN0VW5kZXJUZXN0fTsKCiAgICAjIGEgbWF0Y2ggaXMgZXhwZWN0ZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRGaXJzdEhhc2hSZWYsCiAgICAgICAgIkNoZWNrIGZvciB0eXBlIGlkICRUeXBlSUQiLAogICAgKTsKCiAgICAjIHRoZSBuYW1lIHNob3VsZCBhbHNvIG1hdGNoCiAgICAkRmlyc3RIYXNoUmVmIHx8PSB7fTsKICAgIG15ICRUeXBlTmFtZSA9ICRXb3JrT3JkZXJUeXBlSUQyTmFtZXskVHlwZUlEfTsKICAgICRTZWxmLT5JcygKICAgICAgICAkRmlyc3RIYXNoUmVmLT57VmFsdWV9LAogICAgICAgICRUeXBlTmFtZSwKICAgICAgICAiQ2hlY2sgZm9yIHR5cGUgbmFtZSAkVHlwZUlEIiwKICAgICk7CgogICAgIyBvbmx5IG9uZSBtYXRjaCBpcyBleHBlY3RlZAogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTZWNvbmRIYXNoUmVmLAogICAgICAgICJDaGVjayB0aGF0IHRoZSB0eXBlIGlkICRUeXBlSUQgaXMgcmV0dXJuZWQgb25seSBvbmNlLiIsCiAgICApOwoKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIERlZmluZSB0aGUgY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIHRlc3Rpbmcgd29ya29yZGVycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHN0b3JlIGN1cnJlbnQgVGVzdENvdW50IGZvciBiZXR0ZXIgdGVzdCBjYXNlIHJlY29nbml0aW9uCm15ICRUZXN0Q291bnRNaXNjID0gJFRlc3RDb3VudDsKCiMgQW4gdW5pcXVlIGluZGVudGlmaWVyLCBzbyB0aGF0IGRhdGEgZnJvbSBkaWZmZXJlbnQgdGVzdCBydW5zCiMgd29uJ3QgYmUgbWl4ZWQgdXAuIFRoZSBzdHJpbmcgaXMgZm9ybWF0ZWQgdG8gYSBjb25zdGFudCBsZW5ndGgsCiMgYXMgdGhlIGNvbnZlcnNpb24gdG8gcGxhaW4gdGV4dCB3aXRoIFRvQXNjaWkoKSBkZXBlbmRzIG9uIHRoZSBzdHJpbmcgbGVuZ3RoLgpteSAkVW5pcXVlU2lnbmF0dXJlID0gc3ByaW50ZiAnVW5pdFRlc3QtSVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0lLjZzLSUwMTBkJywKICAgICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbU51bWJlcigpLAogICAgdGltZSgpOwoKbXkgQENoYW5nZVRlc3RzID0gKAoKICAgICMgYSBjaGFuZ2UgZm9yIGdlbmVyYWwgd29ya29yZGVyIHRlc3RpbmcKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlIGZvciBnZW5lcmFsIHRlc3Rpbmcgb2Ygd29ya29yZGVycy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGEgY2hhbmdlIGZvciBPcmRlckJ5IHdvcmtvcmRlciBzZWFyY2hlcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2UgZm9yIHRlc3RpbmcgT3JkZXJCeSB3b3Jrb3JkZXIgc2VhcmNoZXMuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQ2hhbmdlIDIgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgMiAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhIGNoYW5nZSBmb3IgdGVzdGluZyBzdHJpbmcgc2VhcmNoZXMgaW4gdGhlIGFzc29jaWF0ZWQgY2hhbmdlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZSBmb3IgdGVzdGluZyBzdHJpbmcgc2VhcmNoZXMgaW4gY2hhbmdlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnQ2hhbmdlIDMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnQ2hhbmdlIDMgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdDaGFuZ2UgMyAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdDaGFuZ2UgMyAtIEp1c3RpZmljYXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGEgY2hhbmdlIGZvciB0ZXN0aW5nIHRpbWUgc2VhcmNoZXMgaW4gd29ya29yZGVycwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2UgZm9yIHRlc3RpbmcgdGltZSBzZWFyY2hlcyBpbiB3b3Jrb3JkZXJzIC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgNCBmb3IgdGVzdGluZyB0aW1lIHNlYXJjaGVzIGluIHdvcmtvcmRlciAtIFRpdGxlIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSA0IGZvciB0ZXN0aW5nIHRpbWUgc2VhcmNoZXMgaW4gd29ya29yZGVyIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYSBjaGFuZ2UgZm9yIHRlc3RpbmcgdGhlIFBlcm1pc3Npb24oKSBtZXRob2QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlIGZvciB0ZXN0aW5nIHRoZSBQZXJtaXNzaW9uKCkgbWV0aG9kJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQ2hhbmdlIDUgZm9yIHRlc3RpbmcgdGhlIFBlcm1pc3Npb24oKSBtZXRob2QnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQ2hhbmdlIDUgZm9yIHRlc3RpbmcgdGhlIFBlcm1pc3Npb24oKSBtZXRob2QnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ3JlYXRlIHRoZSBjaGFuZ2VzIHRoYXQgYXJlIG5lZWRlZCBmb3IgdGVzdGluZyB3b3Jrb3JkZXJzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY2hhbmdlIGlkcyBvZiBjcmVhdGVkIGNoYW5nZXMKbXkgJVRlc3RlZENoYW5nZUlEOwoKVEVTVDoKZm9yIG15ICRUZXN0IChAQ2hhbmdlVGVzdHMpIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdCAodGVzdCBjYXNlOiAiCiAgICAgICAgICAgICAgICAuICggJFRlc3RDb3VudCAtICRUZXN0Q291bnRNaXNjICkgLiAiKS4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHByaW50IHRlc3QgY2FzZSBkZXNjcmlwdGlvbgogICAgaWYgKCAkVGVzdC0+e0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRlc3QtPntEZXNjcmlwdGlvbn0gKHRlc3QgY2FzZTogIgogICAgICAgICAgICAgICAgLiAoICRUZXN0Q291bnQgLSAkVGVzdENvdW50TWlzYyApIC4gIikuIiwKICAgICAgICApOwogICAgfQoKICAgICMgZXh0cmFjdCB0ZXN0IGRhdGEKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICAjIHRoZSBjaGFuZ2UgaWQgd2lsbCBiZSB1c2VkIGZvciBzZXZlcmFsIGNhbGxzCiAgICBteSAkQ2hhbmdlSUQ7CgogICAgIyBhZGQgYSBuZXcgY2hhbmdlCiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIGNoYW5nZQogICAgICAgICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0KICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIGN1cnJlbnQgQ2hhbmdlSUQKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZUFkZCgpIC0gQWRkIGNoYW5nZS4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYSBjaGFuZ2UgYW5kIGNvbXBhcmUgdGhlIHJldHJpZXZlZCBkYXRhIHdpdGggdGhlIHJlZmVyZW5jZQogICAgaWYgKCBleGlzdHMgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewoKICAgICAgICBteSAkQ2hhbmdlR2V0UmVmZXJlbmNlRGF0YSA9ICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fTsKCiAgICAgICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZUdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJENoYW5nZUF0dHJpYnV0ZXMgKAogICAgICAgICAgICBxdyhDaGFuZ2VJRCBDaGFuZ2VOdW1iZXIgQ2hhbmdlQnVpbGRlcklEIENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YS0+eyRDaGFuZ2VBdHRyaWJ1dGVzfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIGhhcyAkQ2hhbmdlQXR0cmlidXRlcy4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9IH0gKSB7CgogICAgICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkgYW5kIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICBteSAkQ2hhbmdlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRDaGFuZ2VEYXRhLT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKQogICAgICAgICAgICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjcml0aWMKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlZmVyZW5jZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSAgICAjIGVuZCBpZiAnQ2hhbmdlR2V0Jwp9CmNvbnRpbnVlIHsKCiAgICAjIGluY3JlYXNlIHRoZSB0ZXN0IGNvdW50LCBldmVuIG9uIG5leHQKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIERlZmluZSB0aGUgd29ya29yZGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgKAogICAgJFdvcmtPcmRlckFkZFRlc3RJRCwgJE9yZGVyQnlUZXN0SUQsICRTdHJpbmdTZWFyY2hUZXN0SUQsCiAgICAkVGltZVNlYXJjaFRlc3RJRCwgJFBlcm1pc3Npb25UZXN0SUQKKSA9IHNvcnQga2V5cyAlVGVzdGVkQ2hhbmdlSUQ7CgojIHRlc3RzIHdpdGggb25seSBXb3JrT3JkZXJBZGQoKTsKbXkgQFdvcmtPcmRlclRlc3RzID0gKAoKICAgICMgVGVzdHMgd2hlcmUgdGhlIHdvcmtvcmRlciBkb2Vzbid0IGNvbnRhaW4gYWxsIGRhdGEgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgbm8gcGFyYW1zIGZvciBXb3JrT3JkZXJBZGQoKS4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGV4cGVjdCB0aGlzIHRlc3QgdG8gZmFpbAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHt9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VySUQgYW5kIENoYW5nZUlEIGFyZSBtaXNzaW5nCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNvbnRhaW5zIG5vIFVzZXJJRCBmb3IgV29ya09yZGVyQWRkKCkuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlcklEIGlzIG1pc3NpbmcKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNvbnRhaW5zIG5vIENoYW5nZUlEIGZvciBXb3JrT3JkZXJBZGQoKS4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHRoaXMgdGVzdCB0byBmYWlsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hhbmdlSUQgaXMgbWlzc2luZwogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRmlyc3QgdGVzdCBvZiBXb3JrT3JkZXJBZGQoKSB3aXRoIGFsbCByZXF1aXJlZCBhcmd1bWVudHMuCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgQ2hhbmdlSUQgYW5kIENoYW5nZUlEIGZvciBXb3JrT3JkZXJBZGQoKS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgIyBGaXJzdCB0ZXN0IG9mIFdvcmtPcmRlckFkZCgpIHdpdGggYWxsIHJlcXVpcmVkIGFyZ3VtZW50cywgbm90IFVzZXJJRCA9PiAxLgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGNvbnRhaW5zIENoYW5nZUlEIGFuZCBDaGFuZ2VJRCBmb3IgV29ya09yZGVyQWRkKCksIG90aGVyIHVzZXIgdGhhbiBVc2VySUQgPT4gMS4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXQogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJBZGQoKSB3aXRoIHN0cmluZyBwYXJhbWV0ZXJzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyIDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1dvcmtPcmRlciAxIC0gSW5zdHJ1Y3Rpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdXb3JrT3JkZXIgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXIgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICdXb3JrT3JkZXIgMSAtIEluc3RydWN0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvblBsYWluID0+ICJXb3JrT3JkZXIgMSAtIEluc3RydWN0aW9uIC1cbiRVbmlxdWVTaWduYXR1cmVcbiIsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgID0+ICdXb3JrT3JkZXIgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0UGxhaW4gICAgICA9PiAnV29ya09yZGVyIDEgLSBSZXBvcnQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCAzLCA0LCA1LCA2LCA4LCAxMSBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtvcmRlciBjb250YWlucyBIVE1MIGluc3RydWN0aW9uIGFuZCByZXBvcnQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJzxiPlRoaXMgaW5zdHJ1Y3Rpb24gPHU+aXM8L3U+IGJvbGQ8L2I+IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICA9PiAnPGI+VGhpcyByZXBvcnQgPHU+aXM8L3U+IGJvbGQ8L2I+IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICc8Yj5UaGlzIGluc3RydWN0aW9uIDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb25QbGFpbiA9PiAiVGhpcyBpbnN0cnVjdGlvbiBpcyBib2xkIC1cbiRVbmlxdWVTaWduYXR1cmVcbiIsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgID0+ICc8Yj5UaGlzIHJlcG9ydCA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydFBsYWluICAgICAgPT4gJ1RoaXMgcmVwb3J0IGlzIGJvbGQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzJdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtPcmRlckFkZCgpIHdpdGggV29ya09yZGVyU3RhdGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtyZWFkeX0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJTdGF0ZUlEIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBSZXBvcnQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDgsIDI3LCAyOCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya09yZGVyQWRkKCkgd2l0aCBXb3JrT3JkZXJUeXBlSUQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHthcHByb3ZhbH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHthcHByb3ZhbH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCwgMTMsIDIzLCAyNCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya09yZGVyQWRkKCkgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHtwaXJ9LAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2Nsb3NlZH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PgogICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PgogICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe3Bpcn0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2xvc2VkfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+CiAgICAgICAgICAgICAgICAgICAgJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRCAtIFRpdGxlIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uID0+CiAgICAgICAgICAgICAgICAgICAgJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlEIC0gUmVwb3J0IC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCA4LCAxMywgMjMsIDI0LCAyNywgMjggXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ1dvcmtPcmRlckFkZCgpIGFuZCBXb3JrT3JkZXJVcGRhdGUoKSB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkV29ya09yZGVyVHlwZU5hbWUySUR7cGlyfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHsnaW4gcHJvZ3Jlc3MnfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkV29ya09yZGVyVHlwZU5hbWUySUR7ZGVjaXNpb259LAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2NhbmNlbGVkfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkV29ya09yZGVyVHlwZU5hbWUySUR7ZGVjaXNpb259LAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2NhbmNlbGVkfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJBZGQoKSB3aXRoIGVtcHR5IHN0cmluZyBwYXJhbWV0ZXJzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFN0YXRlcyAobm8gaWRzKSBpbiBXT0FkZCgpJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlclN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSAgID0+ICdjbG9zZWQnLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2Nsb3NlZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMjcsIDI4IF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgaW52YWxpZCBzdGF0ZSBuYW1lcyBpbiBXT0FkZCgpIGFuZCBXT1VwZGF0ZSgpJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnY2xvc2VkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdjYW5jZWxlZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgICA9PiAnY2xvc2VkJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjbG9zZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDI3LCAyOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHZhbGlkIHN0YXRlIG5hbWVzIGluIFdPQWRkKCkgYW5kIFdPVXBkYXRlKCknLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2NhbmNlbGVkJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlclN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSAgID0+ICdjYW5jZWxlZCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2FuY2VsZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgVHlwZXMgKG5vIGlkcykgaW4gV09BZGQoKScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyVHlwZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZSAgPT4gJ3BpcicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1dvcmtPcmRlclR5cGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgICA9PiAncGlyJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCA9PiAkV29ya09yZGVyVHlwZU5hbWUySUR7cGlyfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAxMywgMjMsIDI0IF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgVHlwZXMgKG5vIGlkcykgaW4gV09BZGQoKSBhbmQgV09VcGRhdGUoKScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyVHlwZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZSAgPT4gJ3BpcicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICdkZWNpc2lvbicsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnV29ya09yZGVyVHlwZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZSAgID0+ICdkZWNpc2lvbicsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe2RlY2lzaW9ufSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFdvcmtPcmRlclVwZGF0ZSgpIHdpdGggbm90IGFsbG93ZWQgd29ya29yZGVyIHN0YXRlJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclVwZGF0ZSgpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclVwZGF0ZSgpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnY3JlYXRlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGZvciBXb3JrT3JkZXJVcGRhdGUoKSB3aXRoIG5vdCBhbGxvd2VkIHdvcmtvcmRlciBzdGF0ZSBidXQgQnlwYXNzU3RhdGVNYWNoaW5lIHBhcmFtZXRlci4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyVXBkYXRlKCkgQnlwYXNzU3RhdGVNYWNoaW5lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSAgICAgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAgICAgICAgIEJ5cGFzc1N0YXRlTWFjaGluZSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyVXBkYXRlKCkgQnlwYXNzU3RhdGVNYWNoaW5lIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKKTsKCiMgdGVzdHMgZm9yIFdvcmtPcmRlclVwZGF0ZSgpOwpwdXNoIEBXb3JrT3JkZXJUZXN0cywgKAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNvbnRhaW5zIG5vIHBhcmFtcyBmb3IgV29ya09yZGVyVXBkYXRlKCkuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7fSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXggc3RyaW5nIGxlbmd0aCBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1MCwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJyB4IDE3OTk5OTksCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAxNzk5OTk5LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdUJyB4IDI1MCwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJ0knIHggMTc5OTk5OSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uUGxhaW4gPT4gJ0knIHggMTc5OTk5OSAuICJcbiIsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgID0+ICdSJyB4IDE3OTk5OTksCiAgICAgICAgICAgICAgICBSZXBvcnRQbGFpbiAgICAgID0+ICdSJyB4IDE3OTk5OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAxLCA4IF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIGxlbmd0aCBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnIHggMjUxLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knIHggMTgwMDAwMCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJyB4IDE4MDAwMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMSwgOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsyIHN0cmluZyBsZW5ndGggZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1MiwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJyB4IDE4MDAwMDAsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAxODAwMDAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjcmVhdGVfYnkgYW5kIGNoYW5nZV9ieSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1LAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knIHggMzgsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAzOCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnIHggMjUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAzOCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJyB4IDM4LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNyZWF0ZV9ieSBhbmQgY2hhbmdlX2J5IGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnIHggMjUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAzOCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJyB4IDM4LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcgeCAyNSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJyB4IDM4LAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InIHggMzgsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyBsZW5ndGggLSB0aXRsZSAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcgeCAyNTEsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyBsZW5ndGggLSBJbnN0cnVjdGlvbiAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAxODAwMDAwLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0gUmVwb3J0IC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJyB4IDE4MDAwMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHVuZGVmIHBhcmFtIC0gVGl0bGUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHVuZGVmIHBhcmFtIC0gSW5zdHJ1Y3Rpb24gLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHVuZGVmIHBhcmFtIC0gUmVwb3J0IC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBUaW1lQ2hhbmdlcyAtIGp1c3QgUGxhbm5lZFN0YXJ0VGltZSAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgID0+ICdSZXBvcnQgLSBqdXN0IFBsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdUZXN0JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSZXBvcnQgLSBqdXN0IFBsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFRpbWVDaGFuZ2VzIC0ganVzdCBQbGFubmVkRW5kVGltZSAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgID0+ICdSZXBvcnQgLSBqdXN0IFBsYW5uZWRFbmRUaW1lJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUmVwb3J0IC0ganVzdCBQbGFubmVkRW5kVGltZScsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgVGltZUNoYW5nZXMgLSBqdXN0IEFjdHVhbFN0YXJ0VGltZSAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0ganVzdCBBY3R1YWxTdGFydFRpbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICdUZXN0JywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICA9PiAnUmVwb3J0IC0ganVzdCBBY3R1YWxTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgVGltZUNoYW5nZXMgLSBqdXN0IEFjdHVhbEVuZFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0ganVzdCBBY3R1YWxFbmRUaW1lJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUmVwb3J0IC0ganVzdCBBY3R1YWxFbmRUaW1lJywKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGZvciBUaW1lQ2hhbmdlcyAtIEFjdHVhbFN0YXJ0VGltZSA+IEFjdHVhbEVuZFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0gQWN0dWFsU3RhcnRUaW1lID4gQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJzIwMDktMDMtMjAgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIxIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSZXBvcnQgLSBBY3R1YWxTdGFydFRpbWUgPiBBY3R1YWxFbmRUaW1lJywKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGZvciBUaW1lQ2hhbmdlcyAtIEFjdHVhbFN0YXJ0VGltZSA8IEFjdHVhbEVuZFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0gQWN0dWFsU3RhcnRUaW1lIDwgQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJzIwMDktMDMtMjIgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIxIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICdUZXN0JywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICA9PiAnUmVwb3J0IC0gQWN0dWFsU3RhcnRUaW1lIDwgQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0wMy0yMiAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgPT4gJzIwMDktMDMtMjEgMTM6MjU6MDknLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiVGVzdCBmb3IgJzAnIHN0cmluZyBoYW5kbGluZyBmb3IgV29ya09yZGVyVXBkYXRlLiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJzAnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJzAnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnMCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgIyBUZXN0IHRpdGxlIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHRpdGxlIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICIgIFx0IFxuICBUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIlRpdGxlIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFszMl0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiVGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIgogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZQogICAgICAgICAgICAgICAgICAgIC4gIiAgXHQgXG4gICIsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICJUaXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzMzXSwKICAgIH0sCgogICAgIyBUZXN0IHRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIiAgXHQgXG4gIFRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUKICAgICAgICAgICAgICAgICAgICAuICIgIFx0IFxuICAiLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIlRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFszNF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIG9ubHkgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIG9ubHkgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiICBcdCBcbiAgIiwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IGZvciBhY2NvdW50ZWQgdGltZSBhbmQgcGxhbm5lZCBlZmZvcnQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCAxIGZvciBBY2NvdW50ZWRUaW1lIGFuZCBQbGFubmVkRWZmb3J0JywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVGVzdCAxIGZvciBBY2NvdW50ZWRUaW1lIGFuZCBQbGFubmVkRWZmb3J0JywKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgUGxhbm5lZEVmZm9ydCA9PiAnNS41JywKICAgICAgICAgICAgICAgIEFjY291bnRlZFRpbWUgPT4gJzEuNScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgPT4gJzUuNTAnLCAgICAjIG91dHB1dCBpcyBhbHdheXMgZm9ybWF0dGVkIHdpdGggMiBkZWNpbWFsIHBsYWNlcwogICAgICAgICAgICAgICAgQWNjb3VudGVkVGltZSA9PiAnMS41MCcsICAgICMgb3V0cHV0IGlzIGFsd2F5cyBmb3JtYXR0ZWQgd2l0aCAyIGRlY2ltYWwgcGxhY2VzCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIFRlc3RzIGZvciBXb3Jrb3JkZXIgRHluYW1pYyBmaWVsZHMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgdGVzdCBzb21lIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyBXb3JrT3JkZXJBZGQgYW5kIFdvcmtPcmRlclVwZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlckFkZCBhbmQgV29ya09yZGVyVXBkYXRlIHdpdGggd29ya29yZGVyIGR5bmFtaWMgZmllbGRzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgYWRkIHdvcmtvcmRlciB3aXRoIGR5bmFtaWMgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0FBQUEnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCQkJCJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnQ0NDQycsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ0REREQnLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnR0dHRycsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ0hISEgnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBkeW5hbWljIGZpZWxkcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBQUFBJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQkJCQicsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MycgPT4gJ0dHR0cnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDQnID0+ICdISEhIJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgOCwgMzUgXSwKICAgIH0sCgogICAgIyB0ZXN0IHNvbWUgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzIFdvcmtPcmRlckFkZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlckFkZCBhbmQgV29ya09yZGVyVXBkYXRlIHdpdGggd29ya29yZGVyIGR5bmFtaWMgZmllbGRzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgYWRkIHdvcmtvcmRlciB3aXRoIGR5bmFtaWMgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0FBQUEnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCQkJCJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnWFhYWCcsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ1lZWVknLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgYWRkIHdvcmtvcmRlciB3aXRoIGR5bmFtaWMgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0FBQUEnLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCQkJCJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiAnWFhYWCcsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gJ1lZWVknLAogICAgICAgICAgICB9LAogICAgICAgIH0sCgogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA4LCAzNSwgMzYgXSwKICAgIH0sCgogICAgIyB0ZXN0IHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyB3aXRoIG1heGltdW0gbGVuZ3RoCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgV29ya09yZGVyQWRkIGR5bmFtaWMgZmllbGRzIHdpdGggMzgwMCBjaGFyYWN0ZXJzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgYWRkIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyB3aXRoIDM4MDAgY2hhcmFjdGVycyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0EnIHggMzgwMCwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQicgeCAzODAwLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBJyB4IDM4MDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgIyB0ZXN0IHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGxlbmd0aCBpbiBXb3JrT3JkZXJBZGQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBXb3JrT3JkZXJBZGQgZHluYW1pYyBmaWVsZHMgd2l0aCAzODAxIGNoYXJhY3RlcnMuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMgd2l0aCAyNTEgY2hhcmFjdGVycyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gJ0EnIHggMzgwMSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQicgeCAzODAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMgbGFyZ2VyIHRoYW4gbWF4aW11bSBsZW5ndGggaW4gV29ya09yZGVyVXBkYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgV29ya09yZGVyVXBkYXRlIGR5bmFtaWMgZmllbGRzIHdpdGggMzgwMSBjaGFyYWN0ZXJzLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVGVzdCB1cGRhdGUgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzIHdpdGggMzgwMSBjaGFyYWN0ZXJzIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QxJyA9PiAnQScgeCAzODAwLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+ICdCJyB4IDM4MDAsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDMnID0+ICdDJyB4IDM4MDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBJyB4IDM4MDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJ0InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgIyB0ZXN0IHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcyB3aXRoIHplcm8gYW5kIGVtcHR5IHN0cmluZ3MKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBXb3JrT3JkZXJVcGRhdGUgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmcuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PgogICAgICAgICAgICAgICAgICAgICdUZXN0IHVwZGF0ZSB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+ICdBQUFBJywKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QyJyA9PiAnQkJCQicsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+IDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDEnID0+IDAsCiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MicgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKKTsKCiMgd29ya29yZGVycyB0ZXN0cyBmb3IgV29ya09yZGVyU2VhcmNoKCkgd2l0aCBPcmRlckJ5CnB1c2ggQFdvcmtPcmRlclRlc3RzLCAoCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkT3JkZXJCeVRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFNvcnRlZFR5cGVJRHNbMl0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ0FBQSBXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJE9yZGVyQnlUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRTb3J0ZWRUeXBlSURzWzJdLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkU29ydGVkV29ya09yZGVyU3RhdGVJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdBQUEgV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCgogICAgICAgICMgOTk5OTk5IGlzIGEgc3BlY2lhbCB0ZXN0IGNhc2UuCiAgICAgICAgIyBXb3Jrb3JkZXJzIHdpdGggc2VhcmNodGVzdCA5OTk5OTkgYXJlIHVzZWQgaW4gJ09yZGVyQnknIHNlYXJjaCB0ZXN0cy4KICAgICAgICBTZWFyY2hUZXN0ID0+IFs5OTk5OTldLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ1dvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlELicsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRPcmRlckJ5VGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkU29ydGVkVHlwZUlEc1sxXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFNvcnRlZFdvcmtPcmRlclN0YXRlSURzWzFdLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnQkJCIFdvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkT3JkZXJCeVRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFNvcnRlZFR5cGVJRHNbMV0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ0JCQiBXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs5OTk5OTldLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ1dvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlELicsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRPcmRlckJ5VGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkU29ydGVkVHlwZUlEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFNvcnRlZFdvcmtPcmRlclN0YXRlSURzWzJdLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnQ0NDIFdvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkT3JkZXJCeVRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFNvcnRlZFR5cGVJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ0NDQyBXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs5OTk5OTldLAogICAgfSwKKTsKCiMgd29ya29yZGVycyB0ZXN0cyBmb3IgV29ya09yZGVyU2VhcmNoKCkgd2l0aCBzdHJpbmcgc2VhcmNoZXMgaW4gY2hhbmdlCnB1c2ggQFdvcmtPcmRlclRlc3RzLCAoCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBmb3Igc3RyaW5nIHNlYXJjaCBpbiBjaGFuZ2UuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkU3RyaW5nU2VhcmNoVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlckFkZCgpIGZvciBzdHJpbmcgc2VhcmNoIGluIGNoYW5nZSAtIFRpdGxlIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFN0cmluZ1NlYXJjaFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJBZGQoKSBmb3Igc3RyaW5nIHNlYXJjaCBpbiBjaGFuZ2UgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMTUsIDE3LCAxOSwgMjEsIDIyIF0sCiAgICB9LAopOwoKIyB3b3Jrb3JkZXJzIHRlc3RzIGZvciB0ZXN0aW5nIHRoZSBQZXJtaXNzaW9uKCkgbWV0aG9kCnB1c2ggQFdvcmtPcmRlclRlc3RzLCAoCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBmb3IgdGVzdGluZyB0aGUgUGVybWlzc2lvbigpIG1ldGhvZCcsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRQZXJtaXNzaW9uVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnV29ya09yZGVyQWRkKCkgZm9yIFBlcm1pc3Npb24oKSAgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkUGVybWlzc2lvblRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCgpIGZvciBQZXJtaXNzaW9uKCkgIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZXhlY3V0ZSB0aGUgd29ya29yZGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVUZXN0ZWRXb3JrT3JkZXJJRDsgICAgICAgICAgICMgaWRzIG9mIGFsbCBjcmVhdGVkIHdvcmtvcmRlcnMKbXkgJVdvcmtPcmRlcklERm9yQ2hhbmdlSUQ7ICAgICAgIyBrZWVwIHRyYWNrIG9mIHRoZSB3b3Jrb3JkZXJzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGEgY2hhbmdlCm15ICVXb3JrT3JkZXJJREZvclNlYXJjaFRlc3Q7ICAgICMgd29ya29yZGVyIGlkcyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBmb3VuZCBpbiBhIHNlYXJjaAoKVEVTVDoKZm9yIG15ICRUZXN0IChAV29ya09yZGVyVGVzdHMpIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdCAodGVzdCBjYXNlOiAiCiAgICAgICAgICAgICAgICAuICggJFRlc3RDb3VudCAtICRUZXN0Q291bnRNaXNjICkgLiAiKS4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHByaW50IHRlc3QgY2FzZSBkZXNjcmlwdGlvbgogICAgaWYgKCAkVGVzdC0+e0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRlc3QtPntEZXNjcmlwdGlvbn0gKHRlc3QgY2FzZTogIgogICAgICAgICAgICAgICAgLiAoICRUZXN0Q291bnQgLSAkVGVzdENvdW50TWlzYyApIC4gIikuIiwKICAgICAgICApOwogICAgfQoKICAgICMgZXh0cmFjdCB0ZXN0IGRhdGEKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICAjIHRoZSBjaGFuZ2UgaWQgd2lsbCBiZSB1c2VkIGZvciBzZXZlcmFsIGNhbGxzCiAgICBteSAkV29ya09yZGVySUQ7CgogICAgIyBhZGQgYSBuZXcgQ2hhbmdlCiAgICBpZiAoICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIHdvcmtvcmRlcgogICAgICAgICRXb3JrT3JkZXJJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1lbWJlciBjdXJyZW50IFdvcmtPcmRlcklECiAgICAgICAgaWYgKCRXb3JrT3JkZXJJRCkgewogICAgICAgICAgICBteSAkQ2hhbmdlSUQgPSAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0tPntDaGFuZ2VJRH07CgogICAgICAgICAgICAjIGtlZXAgdHJhY2sgb2YgYWxsIGNyZWF0ZWQgd29ya29yZGVycwogICAgICAgICAgICAkVGVzdGVkV29ya09yZGVySUR7JFdvcmtPcmRlcklEfSA9IDE7CgogICAgICAgICAgICAjIGtlZXAgdHJhY2sgb2YgdGhlIHdvcmtvcmRlcnMgYXR0YWNoZWQgdG8gYSBjaGFuZ2UKICAgICAgICAgICAgJFdvcmtPcmRlcklERm9yQ2hhbmdlSUR7JENoYW5nZUlEfSB8fD0ge307CiAgICAgICAgICAgICRXb3JrT3JkZXJJREZvckNoYW5nZUlEeyRDaGFuZ2VJRH0tPnskV29ya09yZGVySUR9ID0gMTsKCiAgICAgICAgICAgICMgc2F2ZSB3b3Jrb3JkZXIgaWQgZm9yIHVzZSBpbiBzZWFyY2ggdGVzdHMKICAgICAgICAgICAgaWYgKCBleGlzdHMgJFRlc3QtPntTZWFyY2hUZXN0fSApIHsKICAgICAgICAgICAgICAgIG15IEBTZWFyY2hUZXN0cyA9IEB7ICRUZXN0LT57U2VhcmNoVGVzdH0gfTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFNlYXJjaFRlc3ROciAoQFNlYXJjaFRlc3RzKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlcklERm9yU2VhcmNoVGVzdHskU2VhcmNoVGVzdE5yfS0+eyRXb3JrT3JkZXJJRH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJBZGQoKSAtIEFkZCB3b3Jrb3JkZXIgc2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogV29ya09yZGVyQWRkKCkgLSBBZGQgd29ya29yZGVyLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSAgICAjIGVuZCBpZiAnV29ya09yZGVyQWRkJwoKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJVcGRhdGV9ICkgewoKICAgICAgICAjIHVwZGF0ZSB0aGUgd29ya29yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclVwZGF0ZVN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJVcGRhdGV9IH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkVGVzdC0+e0ZhaWxzfQogICAgICAgICAgICB8fCAkVGVzdC0+e1VwZGF0ZUZhaWxzfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkV29ya09yZGVyVXBkYXRlU3VjY2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlclVwZGF0ZSgpIGlzIGV4cGVjdGVkIHRvIGZhaWwiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkV29ya09yZGVyVXBkYXRlU3VjY2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlclVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYSB3b3Jrb3JkZXIgYW5kIGNvbXBhcmUgdGhlIHJldHJpZXZlZCBkYXRhIHdpdGggdGhlIHJlZmVyZW5jZQogICAgaWYgKCBleGlzdHMgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJHZXR9ICkgewoKICAgICAgICBteSAkV29ya09yZGVyR2V0UmVmZXJlbmNlRGF0YSA9ICRSZWZlcmVuY2VEYXRhLT57V29ya09yZGVyR2V0fTsKCiAgICAgICAgbXkgJFdvcmtPcmRlckRhdGEgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFdvcmtPcmRlckdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkV29ya09yZGVyRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRXb3JrT3JkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57V29ya09yZGVyRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlckF0dHJpYnV0ZXMgKAogICAgICAgICAgICBxdyhXb3JrT3JkZXJJRCBXb3JrT3JkZXJOdW1iZXIgQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhLT57JFdvcmtPcmRlckF0dHJpYnV0ZXN9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gaGFzICRXb3JrT3JkZXJBdHRyaWJ1dGVzLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkUmVmZXJlbmNlRGF0YS0+e1dvcmtPcmRlckdldH0gfSApIHsKCiAgICAgICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBXb3JrT3JkZXJHZXQoKSBhbmQgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFdvcmtPcmRlckRhdGEtPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOyAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkUmVmZXJlbmNlRGF0YS0+e1dvcmtPcmRlckdldH0tPnskUmVxdWVzdGVkQXR0cmlidXRlfSApCiAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgIyMgdXNlIGNyaXRpYwoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlckF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSAkUmVxdWVzdGVkQXR0cmlidXRlIChXb3JrT3JkZXJJRDogJFdvcmtPcmRlcklEKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSAgICAjIGVuZCBpZiAnV29ya09yZGVyR2V0Jwp9CmNvbnRpbnVlIHsKCiAgICAjIGluY3JlYXNlIHRoZSB0ZXN0IGNvdW50LCBldmVuIG9uIG5leHQKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgV29ya09yZGVyTGlzdCgpIGFuZCBDaGFuZ2VHZXQoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIFRlc3Qgd2hldGhlciBXb3JrT3JkZXJMaXN0KCkgYW5kIENoYW5nZUdldCgpIHJldHVybiB0aGUgc2FtZSB3b3Jrb3JkZXJzIGFzIHdlIGNyZWF0ZWQuCmZvciBteSAkQ2hhbmdlSUQgKCBzb3J0IGtleXMgJVdvcmtPcmRlcklERm9yQ2hhbmdlSUQgKSB7CgogICAgIyBhc2sgdGhlIFdvcmtPcmRlciBvYmplY3QgZm9yIGEgbGlzdCBvZiB3b3Jrb3JkZXJzCiAgICBteSAkTGlzdEZyb21Xb3JrT3JkZXJPYmplY3QgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJMaXN0KAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgKSB8fCBbXTsKICAgIG15ICVNYXBGcm9tV29ya09yZGVyT2JqZWN0ID0gbWFwIHsgJF8gPT4gMSB9IEB7JExpc3RGcm9tV29ya09yZGVyT2JqZWN0fTsKCiAgICAjIGFzayB0aGUgQ2hhbmdlIG9iamVjdCBmb3IgYSBsaXN0IG9mIHdvcmtvcmRlcnMKICAgIG15ICRDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICApIHx8IHt9OwogICAgbXkgJExpc3RGcm9tQ2hhbmdlT2JqZWN0ID0gJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfHwgW107CiAgICBteSAlTWFwRnJvbUNoYW5nZU9iamVjdCA9IG1hcCB7ICRfID0+IDEgfSBAeyRMaXN0RnJvbUNoYW5nZU9iamVjdH07CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBjcmVhdGVkIHdvcmtvcmRlcnMgd2VyZSBmb3VuZCBieSBXb3JrT3JkZXJMaXN0KCkKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBzb3J0IGtleXMgJXsgJFdvcmtPcmRlcklERm9yQ2hhbmdlSUR7JENoYW5nZUlEfSB9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTWFwRnJvbVdvcmtPcmRlck9iamVjdHskV29ya09yZGVySUR9LAogICAgICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAgICAgLiAiOiBXb3JrT3JkZXJMaXN0KCkgLSBXb3JrT3JkZXJJRCAkV29ya09yZGVySUQgaW4gbGlzdCBmcm9tIFdvcmtPcmRlciBvYmplY3QuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTWFwRnJvbUNoYW5nZU9iamVjdHskV29ya09yZGVySUR9LAogICAgICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAgICAgLiAiOiBDaGFuZ2VHZXQoKSAtIFdvcmtPcmRlcklEICRXb3JrT3JkZXJJRCBpbiBsaXN0IGZyb20gQ2hhbmdlIG9iamVjdC4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayB0aGUgbnVtYmVyIG9mIHdvcmtvcmRlcnMgZm9yIGEgY2hhbmdlCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JExpc3RGcm9tV29ya09yZGVyT2JqZWN0fSwKICAgICAgICBzY2FsYXIga2V5cyAleyAkV29ya09yZGVySURGb3JDaGFuZ2VJRHskQ2hhbmdlSUR9IH0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IFdvcmtPcmRlckxpc3QoKSAtIG51bWJlciBvZiB3b3Jrb3JkZXJzIGZvciBhIGNoYW5nZS4iLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskTGlzdEZyb21DaGFuZ2VPYmplY3R9LAogICAgICAgIHNjYWxhciBrZXlzICV7ICRXb3JrT3JkZXJJREZvckNoYW5nZUlEeyRDaGFuZ2VJRH0gfSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlR2V0KCkgLSBudW1iZXIgb2Ygd29ya29yZGVycyBmb3IgYSBjaGFuZ2UuIiwKICAgICk7CgogICAgIyBzZXQgZWZmb3J0cyB0ZXN0Li4uCiAgICBteSAkRWZmb3J0c0Zyb21Xb3JrT3JkZXJPYmplY3QgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0KAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgKTsKCiAgICBmb3IgbXkgJEVmZm9ydEtleSAoIHNvcnQga2V5cyAleyRFZmZvcnRzRnJvbVdvcmtPcmRlck9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ2hhbmdlLT57JEVmZm9ydEtleX0sCiAgICAgICAgICAgICRFZmZvcnRzRnJvbVdvcmtPcmRlck9iamVjdC0+eyRFZmZvcnRLZXl9LAogICAgICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAgICAgLiAiOiBXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0KCkgYW5kIENoYW5nZUdldCgpIC0gJEVmZm9ydEtleSBtYXRjaCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aW1lIHRlc3QuLi4KICAgIG15ICRUaW1lRnJvbVdvcmtPcmRlck9iamVjdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckNoYW5nZVRpbWVHZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICApOwoKICAgIGZvciBteSAkVGltZUtleSAoIHNvcnQga2V5cyAleyRUaW1lRnJvbVdvcmtPcmRlck9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ2hhbmdlLT57JFRpbWVLZXl9LAogICAgICAgICAgICAkVGltZUZyb21Xb3JrT3JkZXJPYmplY3QtPnskVGltZUtleX0sCiAgICAgICAgICAgICdUZXN0ICcKICAgICAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgICAgICAuICI6IFdvcmtPcmRlckNoYW5nZVRpbWVHZXQoKSBhbmQgQ2hhbmdlR2V0KCkgLSAkVGltZUtleSBtYXRjaCIsCiAgICAgICAgKTsKICAgIH0KCn0KCiMgY291bnQgYWxsIHRlc3RzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGFuZCBwbGFubmVkIGZvciBmYWlsCm15ICRGYWlscyA9IHNjYWxhciBncmVwIHsgJF8tPntGYWlsc30gfSBAV29ya09yZGVyVGVzdHM7Cm15ICROckNyZWF0ZVdvcmtPcmRlcnMgPSAoIHNjYWxhciBAV29ya09yZGVyVGVzdHMgKSAtICRGYWlsczsKCiMgdGVzdCBpZiB0aGUgd29ya29yZGVycyB3ZXJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJVRlc3RlZFdvcmtPcmRlcklEIHx8IDAsCiAgICAkTnJDcmVhdGVXb3JrT3JkZXJzLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IGFtb3VudCBvZiB3b3Jrb3JkZXIgb2JqZWN0cyBhbmQgdGVzdCBjYXNlcy4nLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHdvcmtvcmRlciBzZWFyY2ggdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFN0cmluZ1NlYXJjaFRlc3RDaGFuZ2UgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICBDaGFuZ2VJRCA9PiAkU3RyaW5nU2VhcmNoVGVzdElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCm15IEBXb3JrT3JkZXJTZWFyY2hUZXN0cyA9ICgKCiAgICAjIE5yIDEgLSBhIHNpbXBsZSBjaGVjayBpZiB0aGUgc2VhcmNoIGZ1bmN0aW9ucyB0YWtlcyBjYXJlIG9mICJMaW1pdCIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnTGltaXQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgTGltaXQgPT4gMywgICAgIyBleHBlY3Qgb25seSAzIHJlc3VsdHMKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwgICAgIyBmbGFnIGZvciBjaGVjayByZXN1bHQgYW1vdW50CiAgICAgICAgICAgIENvdW50ICAgICA9PiAzLCAgICAjIGNoZWNrIG9uIDMgcmVzdWx0cwogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMiAtIGEgc2ltcGxlIGNoZWNrIHRoYXQgc2hvdWxkIGZpbmQgYWxsIHdvcmtvcmRlcnMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnTGltaXQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsICAgICMgZmxhZyBmb3IgY2hlY2sgcmVzdWx0cyB0aGF0IHdlcmUgbWFya2VkIHdpdGggJ1NlYXJjaFRlc3QnCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzIC0gc2VhcmNoIGZvciB0aXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyIDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQgLSBzZWFyY2ggZm9yIGluc3RydWN0aW9uCiAgICAjIE5vdGUgdGhlIGV4dHJhIG5ld2xpbmVzIGluamVjdGVkIGJ5IFRvQXNjaWkoKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdJbnN0cnVjdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAiV29ya09yZGVyIDEgLSBJbnN0cnVjdGlvbiAtXG4kVW5pcXVlU2lnbmF0dXJlXG4iLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDUgLSBzZWFyY2ggZm9yIHJlcG9ydAogICAgIyBUb0FzY2lpKCkgYWRkcyBubyBuZXdsaW5lcywgYXMgdGhlIHN0cmluZyBsZW5ndGggaXMgbGVzcyB0aGFuIDc4LgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdSZXBvcnQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUmVwb3J0ID0+ICdXb3JrT3JkZXIgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYgLSBzZWFyY2ggZm9yIHRpdGxlLCBpbnN0cnVjdGlvbiBhbmQgcmVwb3J0CiAgICAjIE5vdGUgdGhlIGV4dHJhIG5ld2xpbmVzIGluamVjdGVkIGJ5IFRvQXNjaWkoKS4KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya09yZGVyVGl0bGUsIEluc3RydWN0aW9uLCBSZXBvcnQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlciAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gIldvcmtPcmRlciAxIC0gSW5zdHJ1Y3Rpb24gLVxuJFVuaXF1ZVNpZ25hdHVyZVxuIiwKICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gIldvcmtPcmRlciAxIC0gUmVwb3J0IC0gJFVuaXF1ZVNpZ25hdHVyZSIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNyAtIHNlYXJjaCBmb3IgdGl0bGUsIHdoaWNoIGlzIG5vdCBpbiBkYXRhYmFzZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJUaXRsZSBkb2VzIG5vdCBleGlzdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnTk9UIElOIERBVEFCQVNFICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICBDb3VudCAgICAgPT4gMCwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDggLSBzZWFyY2ggZm9yIENoYW5nZUlECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUlEIGRvZXMgZXhpc3QnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA5IC0gc2VhcmNoIGZvciBjaGFuZ2UgaWQsIHdoaWNoIGlzIG5vdCBpbiBkYXRhYmFzZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBbGwgV29ya09yZGVycyBmb3IgQ2hhbmdlIDFfMDAwXzAwMCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgPT4gWzFfMDAwXzAwMF0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgIENvdW50ICAgICA9PiAwLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTAgLSBzZWFyY2ggZm9yIG5vbi1leGlzdGluZyBjaGFuZ2UgaWQgYW5kIGV4aXN0aW5nIHRpdGxlIHdoaWNoIGlzIG5vdCBpbiBkYXRhYmFzZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBbGwgV29ya09yZGVycyBmb3IgQ2hhbmdlIDFfMDAwXzAwMCBhbmQgYW4gZXhpc3RpbmcgdGl0bGUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgPT4gWzFfMDAwXzAwMF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXIgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgIENvdW50ICAgICA9PiAwLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTEgLSBzZWFyY2ggZm9yIGV4aXN0aW5nIENoYW5nZUlEIGFuZCBleGlzdGluZyBXb3JrT3JkZXJUaXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VJRCBkb2VzIGV4aXN0LCBXb3JrT3JkZXJUaXRsZSBkb2VzIGV4aXN0JywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlciAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMiAtIHNlYXJjaCBmb3IgZXhpc3RpbmcgY2hhbmdlIGlkIGFuZCBmb3IgdGl0bGUsIHdoaWNoIGlzIG5vdCBpbiBkYXRhYmFzZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VJRCBkb2VzIGV4aXN0LCBXb3JrT3JkZXJUaXRsZSBkb2VzIG5vdCBleGlzdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdOT1QgSU4gREFUQUJBU0UgJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgIENvdW50ICAgICA9PiAwLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTMgLSBzZWFyY2ggZm9yIHdvcmtvcmRlciB0eXBlcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciB0eXBlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlSURzID0+IFsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJUeXBlTmFtZTJJRHthcHByb3ZhbH0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVyVHlwZU5hbWUySUR7cGlyfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE0IC0gc2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UgdGl0bGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UgdGl0bGUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgPT4gWyRTdHJpbmdTZWFyY2hUZXN0SURdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnTk9ORVhJU1RFTlQgQ2hhbmdlIDMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTUgLSBzZWFyY2ggZm9yIGNoYW5nZSB0aXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSB0aXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxNiAtIHNlYXJjaCBmb3Igbm9uZXhpc3RlbnQgY2hhbmdlIGRlc2NyaXB0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uZXhpc3RlbnQgY2hhbmdlIGRlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgICAgID0+IFskU3RyaW5nU2VhcmNoVGVzdElEXSwKICAgICAgICAgICAgQ2hhbmdlRGVzY3JpcHRpb24gPT4gJ05PTkVYSVNURU5UIENoYW5nZSAzIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE3IC0gc2VhcmNoIGZvciBjaGFuZ2UgZGVzY3JpcHRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UgZGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICAgPT4gWyRTdHJpbmdTZWFyY2hUZXN0SURdLAogICAgICAgICAgICBDaGFuZ2VEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlIDMgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTggLSBzZWFyY2ggZm9yIG5vbmV4aXN0ZW50IGNoYW5nZSBqdXN0aWZpY2F0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uZXhpc3RlbnQgY2hhbmdlIGp1c3RpZmljYXRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZUp1c3RpZmljYXRpb24gPT4gJ05PTkVYSVNURU5UIENoYW5nZSAzIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTkgLSBzZWFyY2ggZm9yIGNoYW5nZSBqdXN0aWZpY2F0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2hhbmdlIGp1c3RpZmljYXRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZUp1c3RpZmljYXRpb24gPT4gIkNoYW5nZSAzIC0gSnVzdGlmaWNhdGlvbiAtXG4kVW5pcXVlU2lnbmF0dXJlXG4iLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjAgLSBzZWFyY2ggZm9yIG5vbmV4aXN0ZW50IGNoYW5nZSBudW1iZXIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UgbnVtYmVyJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAnTk9ORVhJU1RFTlQgJyAuICRTdHJpbmdTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDIxIC0gc2VhcmNoIGZvciBjaGFuZ2UgbnVtYmVyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2hhbmdlIG51bWJlcicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgPT4gWyRTdHJpbmdTZWFyY2hUZXN0SURdLAogICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJFN0cmluZ1NlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjIgLSBzZWFyY2ggZm9yIGNoYW5nZSB0aXRsZSwgY2hhbmdlIG51bWJlciwgZGVzY3JpcHRpb24gYW5kIGp1c3RpZmljYXRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UgdGl0bGUsIGNoYW5nZSBudW1iZXIsIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgICAgICAgPT4gWyRTdHJpbmdTZWFyY2hUZXN0SURdLAogICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgID0+ICRTdHJpbmdTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICA9PiAnQ2hhbmdlIDMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBDaGFuZ2VEZXNjcmlwdGlvbiAgID0+ICJDaGFuZ2UgMyAtIERlc2NyaXB0aW9uIC0gJFVuaXF1ZVNpZ25hdHVyZSIsCiAgICAgICAgICAgIENoYW5nZUp1c3RpZmljYXRpb24gPT4gIkNoYW5nZSAzIC0gSnVzdGlmaWNhdGlvbiAtXG4kVW5pcXVlU2lnbmF0dXJlXG4iLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjMgLSBzZWFyY2ggZm9yIHdvcmtvcmRlciB0eXBlcyAiYXBwcm92YWwiIGFuZCAicGlyIicsCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHR5cGVzICJhcHByb3ZhbCIgYW5kICJwaXIiJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVHlwZXMgPT4gWyAnYXBwcm92YWwnLCAncGlyJyBdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjQgLSBzZWFyY2ggZm9yIHdvcmtvcmRlciB0eXBlcyAoc2FtZSB0eXBlcyBzZXZlcmFsIHRpbWVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciB0eXBlcyAoc2FtZSB0eXBlcyBzZXZlcmFsIHRpbWVzKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGVzID0+IFsgJ2FwcHJvdmFsJywgJ3BpcicsICdhcHByb3ZhbCcsICdwaXInIF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyNSAtIHNlYXJjaCBmb3Igd29ya29yZGVyIHR5cGVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHR5cGUgKG5vbi1leGlzdGVudCB0eXBlKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGVzID0+IFsgJ2FwcHJvdmFsJywgJ3BpcicsICdub24tZXhpc3RlbnQnIF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDI2IC0gc2VhcmNoIGZvciB3b3Jrb3JkZXIgc3RhdGUgKG5vbi1leGlzdGVudCBzdGF0ZSkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgc3RhdGUgKG5vbi1leGlzdGVudCBzdGF0ZSknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzID0+IFsnbm9uLWV4aXN0ZW50J10sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciAyNyAtIHNlYXJjaCBmb3Igd29ya29yZGVyIHN0YXRlcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciBzdGF0ZXMgImNsb3NlZCIgYW5kICJyZWFkeSInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzID0+IFsgJ2Nsb3NlZCcsICdyZWFkeScgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOCAtIFNlYXJjaCBmb3IgV29ya09yZGVyIHN0YXRlcyAiY2xvc2VkIiBhbmQgInJlYWR5IiAodHdvIHRpbWVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciBzdGF0ZXMgImNsb3NlZCIgYW5kICJyZWFkeSIgKHR3byB0aW1lcyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzID0+IFsgJ2Nsb3NlZCcsICdyZWFkeScsICdjbG9zZWQnLCAncmVhZHknIF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjkgLSBTZWFyY2ggZm9yIFdvcmtPcmRlciBzdGF0ZXMgImNsb3NlZCIsICJyZWFkeSIgYW5kICJub24tZXhpc3RlbnQiCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHN0YXRlcyAiY2xvc2VkIiwgInJlYWR5IiBhbmQgIm5vbi1leGlzdGVudCInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzID0+IFsgJ2Nsb3NlZCcsICdyZWFkeScsICdub24tZXhpc3RlbnQnIF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciAzMCAtIFNlYXJjaCBmb3IgYW4gaW52YWxpZCBXb3JrT3JkZXIgc3RhdGUgaWQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBhbiBpbnZhbGlkIFdvcmtPcmRlciBzdGF0ZSBpZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFstMTFdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciAzMSAtIFNlYXJjaCBmb3IgYW4gaW52YWxpZCBXb3JrT3JkZXIgdHlwZSBpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIGludmFsaWQgV29ya09yZGVyIHR5cGUgaWQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRHMgPT4gWy0xMV0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgMzIgLSBTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiVGl0bGUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDMzIC0gU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgdHJhaWxpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiVGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNCAtIFNlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIlRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzUgLSBTZWFyY2ggZm9yIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdBQUFBJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAnQkJCQicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDIsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNiAtIFNlYXJjaCBmb3Igd29ya29yZGVyIGR5bmFtaWMgZmllbGRzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igd29ya29yZGVyIGR5bmFtaWMgZmllbGRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBkeW5hbWljIGZpZWxkcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0MScgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdBQUFBJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJFVuaXF1ZU5hbWVQcmVmaXggLiAnVGVzdDInID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAnQkJCQicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICRVbmlxdWVOYW1lUHJlZml4IC4gJ1Rlc3QzJyA9PiB7CiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ1hYWFgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkVW5pcXVlTmFtZVByZWZpeCAuICdUZXN0NCcgPT4gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICdZWVlZJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCik7CgpteSAkU2VhcmNoVGVzdENvdW50ID0gMTsKClRFU1Q6CmZvciBteSAkVGVzdCAoQFdvcmtPcmRlclNlYXJjaFRlc3RzKSB7CgogICAgIyBjaGVjayBTZWFyY2hEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTZWFyY2hEYXRhfSB8fCByZWYoICRUZXN0LT57U2VhcmNoRGF0YX0gKSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZWFyY2hEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAnY2FsbCBXb3JrT3JkZXJTZWFyY2ggd2l0aCBwYXJhbXM6ICcKICAgICAgICAgICAgLiAkVGVzdC0+e0Rlc2NyaXB0aW9ufQogICAgICAgICAgICAuICIgKFNlYXJjaFRlc3RDYXNlOiAkU2VhcmNoVGVzdENvdW50KSIsCiAgICApOwoKICAgICMgZ2V0IGEgcmVmIHRvIGFuIGFycmF5IG9mIGZvdW5kIGlkcwogICAgbXkgJFdvcmtPcmRlcklEcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICApOwoKICAgICMgZ2V0IGEgY291bnQgb2YgZm91bmQgaWRzCiAgICBteSAkQ291bnRXb3JrT3JkZXJJRHMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgJXsgJFRlc3QtPntTZWFyY2hEYXRhfSB9LAogICAgICAgIFJlc3VsdCAgID0+ICdDT1VOVCcsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U2VhcmNoRmFpbHN9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCgkV29ya09yZGVySURzKSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogV29ya09yZGVyU2VhcmNoKCkgaXMgZXhwZWN0ZWQgdG8gZmFpbCAoUmVzdWx0ID0+ICdBUlJBWScpIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCgkQ291bnRXb3JrT3JkZXJJRHMpLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJTZWFyY2goKSBpcyBleHBlY3RlZCB0byBmYWlsIChSZXN1bHQgPT4gJ0NPVU5UJykiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCgkV29ya09yZGVySURzKSAmJiByZWYoJFdvcmtPcmRlcklEcykgZXEgJ0FSUkFZJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gYXJyYXkgcmVmZXJlbmNlIGZvciBXb3JrT3JkZXJJRHMuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBkZWZpbmVkKCRDb3VudFdvcmtPcmRlcklEcykgJiYgcmVmICRDb3VudFdvcmtPcmRlcklEcyBlcSAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gc2NhbGFyIGZvciBDb3VudFdvcmtPcmRlcklEcy4iLAogICAgICAgICk7CiAgICB9CgogICAgJFdvcmtPcmRlcklEcyB8fD0gW107CiAgICAkQ291bnRXb3JrT3JkZXJJRHMgfHw9IDA7CgogICAgaWYgKCAkVGVzdC0+e1Jlc3VsdERhdGF9LT57VGVzdENvdW50fSApIHsKCiAgICAgICAgIyBnZXQgbnVtYmVyIG9mIHdvcmtvcmRlciBpZHMgV29ya09yZGVyU2VhcmNoIHNob3VsZCByZXR1cm4KICAgICAgICBteSAkRXhwZWN0ZWRDb3VudCA9IHNjYWxhciBrZXlzICV7ICRXb3JrT3JkZXJJREZvclNlYXJjaFRlc3R7JFNlYXJjaFRlc3RDb3VudH0gfTsKCiAgICAgICAgIyBnZXQgZGVmaW5lZCBleHBlY3RlZCByZXN1bHQgY291bnQgKGRlZmluZWQgaW4gc2VhcmNoIHRlc3QgY2FzZSEpCiAgICAgICAgaWYgKCBleGlzdHMgJFRlc3QtPntSZXN1bHREYXRhfS0+e0NvdW50fSApIHsKICAgICAgICAgICAgJEV4cGVjdGVkQ291bnQgPSAkVGVzdC0+e1Jlc3VsdERhdGF9LT57Q291bnR9OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgbnVtYmVyIG9mIElEcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXlyZWYKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRXb3JrT3JkZXJJRHN9LAogICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gTnVtYmVyIG9mIGZvdW5kIHdvcmtvcmRlcnMuIiwKICAgICAgICApOwoKICAgICAgICAjIFdoZW4gYSAnTGltaXQnIGhhcyBiZWVuIHBhc3NlZCwgdGhlbiB0aGUgcmV0dXJuZWQgY291bnQgbm90IG5lY2Vzc2FyaWx5IG1hdGNoZXMKICAgICAgICAjIHRoZSBudW1iZXIgb2YgSURzIGluIHRoZSByZXR1cm5lZCBhcnJheS4gSW4gdGhhdCBjYXNlIHRlc3RpbmcgaXMgZnV0aWxlLgogICAgICAgIGlmICggISRUZXN0LT57U2VhcmNoRGF0YX0tPntMaW1pdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDb3VudFdvcmtPcmRlcklEcywKICAgICAgICAgICAgICAgICRFeHBlY3RlZENvdW50LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gTnVtYmVyIG9mIGZvdW5kIHdvcmtvcmRlcnMgKFJlc3VsdCA9PiAnQ09VTlQnKS4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRUZXN0LT57UmVzdWx0RGF0YX0tPntUZXN0RXhpc3RlbmNlfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBhbGwgaWRzIHRoYXQgYmVsb25ncyB0byB0aGlzIHNlYXJjaHRlc3QgYXJlIHJldHVybmVkCiAgICAgICAgbXkgQFdvcmtPcmRlcklEcyA9IGtleXMgJXsgJFdvcmtPcmRlcklERm9yU2VhcmNoVGVzdHskU2VhcmNoVGVzdENvdW50fSB9OwoKICAgICAgICBteSAlUmV0dXJuZWRXb3JrT3JkZXJJRCA9IG1hcCB7ICRfID0+IDEgfSBAeyRXb3JrT3JkZXJJRHN9OwogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKEBXb3JrT3JkZXJJRHMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmV0dXJuZWRXb3JrT3JkZXJJRHskV29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVySUQgJFdvcmtPcmRlcklEIGZvdW5kIGluIHJldHVybmVkIGxpc3QuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwogICAgJFNlYXJjaFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIHdvcmtvcmRlciBzZWFyY2ggdGVzdHMgZm9yICdPcmRlckJ5JyBzZWFyY2hlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0aHJlZSBjaGFuZ2UgaWRzLiBUaGVuIGdldCB0aGUgZGF0YS4gVGhhdCBpcyBuZWVkZWQgZm9yIHNvcnRpbmcKbXkgQFdvcmtPcmRlcklEc0Zvck9yZGVyQnlUZXN0cyA9IGtleXMgJXsgJFdvcmtPcmRlcklERm9yU2VhcmNoVGVzdHs5OTk5OTl9IH07Cm15IEBXb3JrT3JkZXJzRm9yT3JkZXJCeVRlc3RzOwoKZm9yIG15ICRXb3JrT3JkZXJJREZvck9yZGVyQnlUZXN0cyAoQFdvcmtPcmRlcklEc0Zvck9yZGVyQnlUZXN0cykgewogICAgbXkgJFdvcmtPcmRlckRhdGEgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkV29ya09yZGVyRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHMsICRXb3JrT3JkZXJEYXRhOwp9CgpteSBAT3JkZXJCeUNvbHVtbnMgPSBxdygKICAgIFdvcmtPcmRlcklECiAgICBXb3JrT3JkZXJOdW1iZXIKICAgIFdvcmtPcmRlclRpdGxlCiAgICBXb3JrT3JkZXJTdGF0ZUlECiAgICBXb3JrT3JkZXJUeXBlSUQKICAgIENyZWF0ZUJ5CiAgICBDaGFuZ2VCeQogICAgQ3JlYXRlVGltZQogICAgQ2hhbmdlVGltZQopOwoKZm9yIG15ICRPcmRlckJ5Q29sdW1uIChAT3JkZXJCeUNvbHVtbnMpIHsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICMgV29ya09yZGVyU2VhcmNoKCkgc29ydHMgdGhlIElELUZpZWxkcyBudW1lcmljYWxseSwgdGhlIHN0cmluZyBmaWVsZHMgYWxwaGFiZXRpY2FsbHkuCiAgICAjIHRoZSBzb3J0aW5nIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2Vjb25kIGNvbXBhcmlzb24KICAgIG15IEBTb3J0ZWRXb3JrT3JkZXJzOwogICAgaWYgKCAkT3JkZXJCeUNvbHVtbiBlcSAnV29ya09yZGVyVGl0bGUnICkgewogICAgICAgIEBTb3J0ZWRXb3JrT3JkZXJzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IGNtcCAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntXb3JrT3JkZXJJRH0gPD0+ICRhLT57V29ya09yZGVySUR9CiAgICAgICAgfSBAV29ya09yZGVyc0Zvck9yZGVyQnlUZXN0czsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBTb3J0ZWRXb3JrT3JkZXJzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IDw9PiAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntXb3JrT3JkZXJJRH0gPD0+ICRhLT57V29ya09yZGVySUR9CiAgICAgICAgfSBAV29ya09yZGVyc0Zvck9yZGVyQnlUZXN0czsKICAgIH0KICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e1dvcmtPcmRlcklEfSB9IEBTb3J0ZWRXb3JrT3JkZXJzOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHMgKTsgICAgIyMgbm8gY3JpdGljCgogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclNlYXJjaCgKICAgICAgICBDaGFuZ2VJRHMgICAgICAgID0+IFskT3JkZXJCeVRlc3RJRF0sCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJE9yZGVyQnlDb2x1bW5dLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydVcCddLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBXb3JrT3JkZXJHZXQoKQogICAgbXkgJFNlYXJjaExpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0KTsgICAgICAgIyMgbm8gY3JpdGljCgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBXb3JrT3JkZXJTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkuIgogICAgKTsKCiAgICAjIHNvcnQgaW4gdGhlIG90aGVyIGRpcmVjdGlvbgoKICAgICMgV29ya09yZGVyU2VhcmNoKCkgc29ydHMgdGhlIElELUZpZWxkcyBudW1lcmljYWxseSwgdGhlIHN0cmluZyBmaWVsZHMgYWxwaGFiZXRpY2FsbHkuCiAgICAjIHRoZSBzb3J0aW5nIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2Vjb25kIGNvbXBhcmlzb24KICAgIGlmICggJE9yZGVyQnlDb2x1bW4gZXEgJ1dvcmtPcmRlclRpdGxlJyApIHsKICAgICAgICBAU29ydGVkV29ya09yZGVycyA9IHNvcnQgewogICAgICAgICAgICAkYi0+eyRPcmRlckJ5Q29sdW1ufSBjbXAgJGEtPnskT3JkZXJCeUNvbHVtbn0KICAgICAgICAgICAgICAgIHx8ICRiLT57V29ya09yZGVySUR9IDw9PiAkYS0+e1dvcmtPcmRlcklEfQogICAgICAgIH0gQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAU29ydGVkV29ya09yZGVycyA9IHNvcnQgewogICAgICAgICAgICAkYi0+eyRPcmRlckJ5Q29sdW1ufSA8PT4gJGEtPnskT3JkZXJCeUNvbHVtbn0KICAgICAgICAgICAgICAgIHx8ICRiLT57V29ya09yZGVySUR9IDw9PiAkYS0+e1dvcmtPcmRlcklEfQogICAgICAgIH0gQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHM7CiAgICB9CiAgICBteSBAU29ydGVkSURzRG93biA9IG1hcCB7ICRfLT57V29ya09yZGVySUR9IH0gQFNvcnRlZFdvcmtPcmRlcnM7CgogICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICBteSAkUmVmZXJlbmNlTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHNEb3duICk7ICAgICMjIG5vIGNyaXRpYwoKICAgIG15ICRTZWFyY2hSZXN1bHREb3duID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU2VhcmNoKAogICAgICAgIENoYW5nZUlEcyA9PiBbJE9yZGVyQnlUZXN0SURdLAogICAgICAgIE9yZGVyQnkgICA9PiBbJE9yZGVyQnlDb2x1bW5dLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIFdvcmtPcmRlckdldCgpCiAgICBteSAkU2VhcmNoTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0RG93bik7ICAgICAgICMjIG5vIGNyaXRpYwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoTGlzdERvd24sCiAgICAgICAgJFJlZmVyZW5jZUxpc3REb3duLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBXb3JrT3JkZXJTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChEb3duKS4iCiAgICApOwoKICAgICMgY2hlY2sgaWYgV29ya09yZGVyLnBtIGhhbmRsZXMgbm9uLWV4aXN0ZW50IE9yZGVyQnlEaXJlY3Rpb24gY3JpdGVyaWEgY29ycmVjdAogICAgbXkgJFNlYXJjaFJlc3VsdFNpZGV3YXlzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyU2VhcmNoKAogICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFskT3JkZXJCeUNvbHVtbl0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ1NpZGV3YXlzJ10sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaFJlc3VsdFNpZGV3YXlzLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBXb3JrT3JkZXJTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChTaWRld2F5cykuIgogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3Qgc29ydGluZyBvZiBjaGFuZ2VzIChzb21lIGhhdmUgbm8gd29ya29yZGVyLCBvdGhlcnMgaGF2ZSBzZXZlcmFsIHdvcmtvcmRlcnMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJUlEc1RvRGVsZXRlID0gKAogICAgQ2hhbmdlICAgID0+IFtdLAogICAgV29ya09yZGVyID0+IFtdLAopOwpteSAkQ2hhbmdlc1RpdGxlICAgICAgID0gJ0NoYW5nZVNlYXJjaE9yZGVyQnlUaW1lcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlOwpteSBAQ2hhbmdlc0ZvclNvcnRUZXN0ID0gKAogICAgewogICAgICAgIENoYW5nZSA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRDaGFuZ2VzVGl0bGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBXb3Jrb3JkZXJzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTA2LTMwIDA5OjMzOjEyJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0wOS0wMSAwMToxMjo1NScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBDaGFuZ2UgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkQ2hhbmdlc1RpdGxlLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgV29ya29yZGVycyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMDItMjEgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0xMyAyMjoxNTo1NicsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTA1LTMxIDA5OjMzOjEyJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTAtMDEgMDE6MTI6NTUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTAzLTI1IDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMDktMTMgMjI6MTU6NTYnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMjAwOS0wNi0wMSAwOTozMzoxMicsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcyMDA5LTExLTAxIDAxOjEyOjU1JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBDaGFuZ2UgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkQ2hhbmdlc1RpdGxlLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgV29ya29yZGVycyA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgQ2hhbmdlID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJENoYW5nZXNUaXRsZSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFdvcmtvcmRlcnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIxIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMTMgMjI6MTU6NTYnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMjAwOS0wNi0zMCAwOTozMzoxMicsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcyMDA5LTA5LTAxIDAxOjEyOjU1JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTEyIDIyOjE1OjU2JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMiAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTExIDIyOjE1OjU2JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKKTsKCm15IEBDaGFuZ2VJRHNGb3JTb3J0VGVzdDsKZm9yIG15ICRDaGFuZ2UgKEBDaGFuZ2VzRm9yU29ydFRlc3QpIHsKCiAgICAjIGNyZWF0ZSBjaGFuZ2UKICAgIG15ICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCggJXsgJENoYW5nZS0+e0NoYW5nZX0gfSApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2UgZm9yIHNvcnQgdGVzdCBjcmVhdGVkIiwKICAgICk7CgogICAgIyBzdG9yZSBDaGFuZ2VJRAogICAgcHVzaCBAQ2hhbmdlSURzRm9yU29ydFRlc3QsICRDaGFuZ2VJRDsKICAgIHB1c2ggQHsgJElEc1RvRGVsZXRle0NoYW5nZX0gfSwgJENoYW5nZUlEOwoKICAgICMgYWRkIHRoZSB3b3Jrb3JkZXJzIGZvciB0aGUgY2hhbmdlCiAgICBteSAkV29ya09yZGVyQ291bnQgPSAxOwogICAgZm9yIG15ICRXb3JrT3JkZXIgKCBAeyAkQ2hhbmdlLT57V29ya29yZGVyc30gfSApIHsKICAgICAgICBteSAkV29ya09yZGVySUQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXIgJFdvcmtPcmRlckNvdW50IGZvciBDaGFuZ2UgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAeyAkSURzVG9EZWxldGV7V29ya09yZGVyfSB9LCAkV29ya09yZGVySUQ7CgogICAgICAgICRXb3JrT3JkZXJDb3VudCsrOwogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgd29ya29yZGVycyB3ZXJlIGFkZGVkCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZURhdGEtPntXb3JrT3JkZXJDb3VudH0sCiAgICAgICAgc2NhbGFyIEB7ICRDaGFuZ2UtPntXb3Jrb3JkZXJzfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUdldCgpOiB3b3Jrb3JkZXJzIHdlcmUgYWRkZWQiCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKbXkgQFRlc3RwbGFuID0gKAogICAgWyAwLCAzLCAxLCAyIF0sICAgICMgaW5kZXggb2YgY2hhbmdlcyBpbiBAQ2hhbmdlSURzRm9yU29ydFRlc3QKICAgIFsgMCwgMSwgMywgMiBdLAogICAgWyAwLCAzLCAxLCAyIF0sCiAgICBbIDMsIDEsIDAsIDIgXSwKKTsKCiMgRG8gdGhlIHRlc3RpbmcKbXkgJE9yZGVyQnlUZXN0Q291bnQgPSAwOwpmb3IgbXkgJE9yZGVyQnlDb2x1bW4gKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CgogICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAjIGdldCB0aGUgY3VycmVudCByZWZlcmVuY2UgYXJyYXkKICAgIG15IEBUZXN0cGxhbkFsdGVybmF0aXZlID0gQHsgJFRlc3RwbGFuWyRPcmRlckJ5VGVzdENvdW50XSB9OwoKICAgICMgcGxhY2UgdGhlIGxhc3QgZWxlbWVudCBhdCBmcm9udCBvZiB0aGUgYXJyYXkKICAgICMgc29tZSBEQnMgc29ydCB0aGUgTlVMTHMgdmFsdWVzIGF0IGZyb250IG9mIHRoZSByZXN1bHQgc2V0CiAgICBteSAkTGFzdCA9IHBvcCBAVGVzdHBsYW5BbHRlcm5hdGl2ZTsKICAgIHVuc2hpZnQgQFRlc3RwbGFuQWx0ZXJuYXRpdmUsICRMYXN0OwoKICAgICMgcmVzdWx0IHdoYXQgd2UgZXhwZWN0CiAgICBteSBAUmVzdWx0UmVmZXJlbmNlICAgICAgICAgICAgPSBtYXAgeyAkQ2hhbmdlSURzRm9yU29ydFRlc3RbJF9dIH0gQHsgJFRlc3RwbGFuWyRPcmRlckJ5VGVzdENvdW50XSB9OwogICAgbXkgQFJlc3VsdFJlZmVyZW5jZUFsdGVybmF0aXZlID0gbWFwIHsgJENoYW5nZUlEc0ZvclNvcnRUZXN0WyRfXSB9IEBUZXN0cGxhbkFsdGVybmF0aXZlOwoKICAgICMgc2VhcmNoIHdpdGggZGlyZWN0aW9uICdET1dOJwogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICRDaGFuZ2VzVGl0bGUsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbICRPcmRlckJ5Q29sdW1uLCAnQ2hhbmdlSUQnIF0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgaWYgKAogICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpICAgICAgICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgIGVxIERhdGE6OkR1bXBlcjo6RHVtcGVyKCBcQFJlc3VsdFJlZmVyZW5jZSApICAgICMjIG5vIGNyaXRpYwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpLCAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAUmVzdWx0UmVmZXJlbmNlICksICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2ggT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoRG93bikiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoCiAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICBlcSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSApICAgICMjIG5vIGNyaXRpYwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpLCAgICAgICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSApLCAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlU2VhcmNoIE9yZGVyQnkgJE9yZGVyQnlDb2x1bW4gKERvd24pIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0KSwgICAgICAgICAgICAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChEb3duKSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB3aXRoIGRpcmVjdGlvbiAnVVAnCiAgICBteSAkU2VhcmNoUmVzdWx0VXAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAkQ2hhbmdlc1RpdGxlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyAkT3JkZXJCeUNvbHVtbiwgJ0NoYW5nZUlEJyBdLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnVXAnLCAnRG93bicgXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgIGlmICgKICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0VXApICAgICMjIG5vIGNyaXRpYwogICAgICAgIGVxIERhdGE6OkR1bXBlcjo6RHVtcGVyKCBbIHJldmVyc2UgQFJlc3VsdFJlZmVyZW5jZSBdICkgICAgIyMgbm8gY3JpdGljCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdFVwKSwgICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYwogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyByZXZlcnNlIEBSZXN1bHRSZWZlcmVuY2UgXSApLCAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoCiAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdFVwKSAgICAgICAgICAgICAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICBlcSBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyByZXZlcnNlIEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSBdICkgICAgIyMgbm8gY3JpdGljCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdFVwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgbm8gY3JpdGljCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCBbIHJldmVyc2UgQFJlc3VsdFJlZmVyZW5jZUFsdGVybmF0aXZlIF0gKSwgICMjIG5vIGNyaXRpYwogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2ggT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoVXApIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0VXApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkiLAogICAgICAgICk7CiAgICB9CgogICAgJE9yZGVyQnlUZXN0Q291bnQrKzsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGFkdmFuY2VkIHNlYXJjaCBieSB0ZXN0cyBmb3IgdGltZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgQFRpbWVTZWFyY2hUZXN0cyA9ICgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRmlyc3Qgd29ya29yZGVyIGluIHRoZSAxOXRoIGNlbnR1cnkuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2Vjb25kIHdvcmtvcmRlciBpbiB0aGUgMTl0aCBjZW50dXJ5LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhpcmQgY2hhbmdlIHdpdGggb25lIHdvcmtvcmRlciBpbiB0aGUgMTl0aCBjZW50dXJ5LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDItMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnRm91cnRoIHdvcmtvcmRlciBpbiB0aGUgMTl0aCBjZW50dXJ5LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDQtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBwbGFubmVkIHN0YXJ0IHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMCwgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBwbGFubmVkIGVuZCB0aW1lCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDItMjcgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDIsIDMsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAxLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0wMS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgdGVzdCBmb3IgYWN0dWFsIHN0YXJ0IHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDIsIDMsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAwLCAxLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0wMS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBhY3R1YWwgZW5kIHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDEtMjggMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMCwgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCik7CgpteSAkVFNUQ291bnRlciA9IDE7Cm15IEBUU1RXb3JrT3JkZXJJRHM7ClRTVEVTVDoKZm9yIG15ICRUU1Rlc3QgKEBUaW1lU2VhcmNoVGVzdHMpIHsKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRTVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVFNUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgbXkgJFdvcmtPcmRlcklEOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRTVGVzdC0+e0Rlc2NyaXB0aW9ufSAoVFNUZXN0IGNhc2U6ICRUU1RDb3VudGVyKSIsCiAgICApOwoKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9ICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRUaW1lU2VhcmNoVGVzdElELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVFNUV29ya09yZGVySURzLCAkV29ya09yZGVySUQ7CiAgICAgICAgcHVzaCBAeyAkSURzVG9EZWxldGV7V29ya09yZGVyfSB9LCAkV29ya09yZGVySUQ7CiAgICB9CgogICAgbXkgJFNlYXJjaFJlc3VsdDsKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJTZWFyY2h9ICkgewogICAgICAgICRTZWFyY2hSZXN1bHQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57V29ya09yZGVyU2VhcmNofSB9LAogICAgICAgICAgICBDaGFuZ2VJRHMgPT4gWyRUaW1lU2VhcmNoVGVzdElEXSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUU1RFU1QgaWYgISRTZWFyY2hSZXN1bHQ7CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGZvdW5kZWQgY2hhbmdlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgbWFwIGFycmF5IGluZGV4IHRvIFdvcmtPcmRlcklECiAgICAgICAgbXkgQFJlc3VsdFdvcmtPcmRlcklEczsKICAgICAgICBmb3IgbXkgJFJlc3VsdFdvcmtPcmRlcklEICggQHskUmVmZXJlbmNlRGF0YX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdFdvcmtPcmRlcklEcywgJFRTVFdvcmtPcmRlcklEc1skUmVzdWx0V29ya09yZGVySURdOwogICAgICAgIH0KCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIFdvcmtPcmRlclNlYXJjaCgpCiAgICAgICAgbXkgJFNlYXJjaFJlc3VsdER1bXAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggc29ydCBAeyRTZWFyY2hSZXN1bHR9ICk7ICAgICMjIG5vIGNyaXRpYwoKICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICBteSAkUmVmZXJlbmNlRHVtcCA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCBzb3J0IEBSZXN1bHRXb3JrT3JkZXJJRHMgKTsgICAgIyMgbm8gY3JpdGljCgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdER1bXAsCiAgICAgICAgICAgICRSZWZlcmVuY2VEdW1wLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJTZWFyY2goKTogIgogICAgICAgICAgICAgICAgLiBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJTZWFyY2h9ICkgICAgICAgICAjIyBubyBjcml0aWMKICAgICAgICAgICAgICAgIC4gJFNlYXJjaFJlc3VsdER1bXAsCiAgICAgICAgKTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7CiAgICAkVFNUQ291bnRlcisrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgQFdPQ1RHVGVzdHMgPSAoCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgd2l0aG91dCB0aW1lcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMiAyMzo1OTo1OScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTAxIDAwOjA4OjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTAtMDIgMDA6MTg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJzIwMDktMTAtMDIgMjM6NTk6NTknLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcyMDA5LTEwLTAyIDAwOjE4OjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIHBsYW5uZWQgdGltZXMnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggcGxhbm5lZCB0aW1lcyBQbGFubmVkU3RhcnRUaW1lID0gUGxhbm5lZEVuZFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IG9ubHkgd2l0aCBwbGFubmVkIHRpbWVzIFBsYW5uZWRTdGFydFRpbWUgPiBQbGFubmVkRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMScsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIFBsYW5uZWRTdGFydFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGRGYWlscyA9PiAxLAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgICAgICA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIFBsYW5uZWRFbmRUaW1lJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIEFjdHVhbFN0YXJ0VGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggQWN0dWFsRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggYWN0dWFsIHRpbWVzJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMiAyMzo1OTo1OScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIEFjdHVhbFN0YXJ0VGltZSA9IEFjdHVhbEVuZFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGRGYWlscyA9PiAxLAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgICAgICA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggQWN0dWFsU3RhcnRUaW1lID4gQWN0dWFsRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAxJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzICh3aXRoIHJlc2VydmVkIHRpbWUgUGxhbm5lZFN0YXJ0VGltZSknLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzk5OTktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnOTk5OS0wMS0wMSAwMDowMDowMScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTAxIDAwOjA4OjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTAtMDIgMDA6MTg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCB3aXRoIGFsbCB0aW1lcyAod2l0aCByZXNlcnZlZCB0aW1lIFBsYW5uZWRFbmRUaW1lKScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMTowMTowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICc5OTk5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzIwMDktMTAtMDEgMDA6MDg6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMjAwOS0xMC0wMiAwMDoxODowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzICh3aXRoIHJlc2VydmVkIHRpbWUgQWN0dWFsU3RhcnRUaW1lKScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMTowMTowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzk5OTktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzICh3aXRoIHJlc2VydmVkIHRpbWUgQWN0dWFsRW5kVGltZSknLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMDEgMDE6MDE6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMSAwMTowMTowMScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTAxIDAxOjAxOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzk5OTktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCm15ICRXT0NUR1Rlc3RDb3VudCA9IDE7CmZvciBteSAkV09DVEdUZXN0IChAV09DVEdUZXN0cykgewogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkV09DVEdUZXN0LT57U291cmNlRGF0YX07CiAgICBteSAkUmVmZXJlbmNlRGF0YSA9ICRXT0NUR1Rlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICBteSAkQ2hhbmdlSUQ7CiAgICBteSAkV29ya09yZGVySUQ7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkV09DVEdUZXN0LT57RGVzY3JpcHRpb259IChXT0NUR1Rlc3QgY2FzZTogJFdPQ1RHVGVzdENvdW50KSIsCiAgICApOwoKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9ICkgewogICAgICAgICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQWRkIiwKICAgICAgICApOwoKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gKSB7CiAgICAgICAgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gfSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGRGYWlsc30gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQHsgJElEc1RvRGVsZXRle1dvcmtPcmRlcn0gfSwgJFdvcmtPcmRlcklEOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRSZWZlcmVuY2VEYXRhLT57V29ya09yZGVyQ2hhbmdlVGltZUdldH0gKSB7CiAgICAgICAgbXkgJFRpbWUgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJDaGFuZ2VUaW1lR2V0KAogICAgICAgICAgICAleyAkUmVmZXJlbmNlRGF0YS0+e1dvcmtPcmRlckNoYW5nZVRpbWVHZXR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHJlZiAkVGltZSwKICAgICAgICAgICAgJ0hBU0gnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0KCkiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICByZWYgJFRpbWUgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgJiYgJXskVGltZX0KICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQ2hhbmdlVGltZUdldCgpIC0gSGFzaFJlZiB3aXRoIGNvbnRlbnQiLAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgcmVmICRUaW1lIGVxICdIQVNIJwogICAgICAgICAgICAmJiAleyRUaW1lfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBUZXN0IGZvciByaWdodCB2YWx1ZXMgaW4gcmVzdWx0CiAgICAgICAgICAgIFRJTUVWQUxVRToKICAgICAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAoIHNvcnQga2V5cyAleyRUaW1lfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkVGltZS0+eyRUaW1lVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0fS0+e1Jlc3VsdERhdGF9LT57JFRpbWVUeXBlfSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBjaGVjayBUaW1lUmVzdWx0ICgkVGltZVR5cGUpIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwogICAgJFdPQ1RHVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0aW5nIHRoZSBtZXRob2QgUGVybWlzc2lvbigpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICgkUGVybWlzc2lvblRlc3RXb3JrT3JkZXJJRCkgPSBrZXlzICV7ICRXb3JrT3JkZXJJREZvckNoYW5nZUlEeyRQZXJtaXNzaW9uVGVzdElEfSB9OwoKIyBnZXQgbWFwcGluZyBvZiB0aGUgZ3JvdXAgbmFtZSB0byB0aGUgZ3JvdXAgaWQKbXkgJUdyb3VwTmFtZTJJRCA9IHJldmVyc2UgJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoIFZhbGlkID0+IDEgKTsKCm15IEBQZXJtaXNzaW9uVGVzdHMgPSAoCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDEKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5pdGlhbGx5IG5vIHByaXYgaW4gYW55IGdyb3VwJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiAyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3JvIGluIGl0c20tY2hhbmdlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gMwogICAgIyBUaGUgdHlwZSAncncnIGltcGxpZXMgYWxsIG90aGVyIHR5cGVzLiBTZWUgS2VybmVsOjpTeXN0ZW06Okdyb3VwX0dldFR5cGVTdHJpbmcoKQogICAgIyBUaGVyZWZvcmUgVXNlcjEgZWZmZWN0aXZlbHkgaGFzICdybycgaW4gJ2l0c20tY2hhbmdlJyBhbmQKICAgICMgdGhlIENoYW5nZUFnZW50Q2hlY2sgUGVybWlzc2lvbiBtb2R1bGUgZ2l2ZXMgJ3JvJyBhY2Nlc3MuCiAgICAjIE5vdGUgdGhhdCBXb3JrT3JkZXJBZ2VudENoZWNrIGdpdmVzICdydycgYWNjZXNzIG9ubHkgdG8gdGhlIHdvcmtvcmRlciBhZ2VudC4KICAgIHsKCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3J3IGluIGl0c20tY2hhbmdlIGdyYW50cyBybywgZ3JhbnRzIHJ3IHRvIHdvcmtvcmRlciBhZ2VudCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICBydyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDQKICAgICMgcmVzZXQgVXNlcjEgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncmV2b2tlIHByaXZzIGZvciB1c2VyIDEnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgR3JvdXBNZW1iZXJBZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA1CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3JvIGluIGl0c20tY2hhbmdlLW1hbmFnZXInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgR3JvdXBNZW1iZXJBZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtbWFuYWdlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDYKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncncgaW4gaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gNwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdybyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCBVc2VyIDAgaXMgdGhlIGJ1aWxkZXInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgR3JvdXBNZW1iZXJBZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtbWFuYWdlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAxLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gOAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCBBZ2VudCBpcyB0aGUgYnVpbGRlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gInJvIGluIGl0c20tY2hhbmdlLWJ1aWxkZXIsIHVzZXIgMSBpc24ndCB0aGUgYnVpbGRlciIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDEwCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gInJ3IGluIGl0c20tY2hhbmdlLWJ1aWxkZXIsIHVzZXIgMSBpc24ndCB0aGUgYnVpbGRlciIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBybyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ3ID0+IDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcm8gPT4gMCwKICAgICAgICAgICAgICAgICAgICBydyA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgICAgIHJvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgcncgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgpteSAkUGVybWlzc2lvblRlc3RDb3VudGVyID0gMTsKZm9yIG15ICRUZXN0IChAUGVybWlzc2lvblRlc3RzKSB7CgogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRlc3QtPntEZXNjcmlwdGlvbn0gKFBlcm1pc3Npb24gVGVzdCBjYXNlOiAkUGVybWlzc2lvblRlc3RDb3VudGVyKSIsCiAgICApOwoKICAgICMgZXhlY3V0ZSB0aGUgc291cmNlIG1vZGlmaWNhdGlvbnMKICAgICRTb3VyY2VEYXRhLT57R3JvdXBNZW1iZXJBZGR9IHx8PSBbXTsKICAgIGZvciBteSAkUGFyYW1zICggQHsgJFNvdXJjZURhdGEtPntHcm91cE1lbWJlckFkZH0gfSApIHsKCiAgICAgICAgIyBtb2RpZnkgdGhlIGdyb3VwIG1lbWJlcnNoaXAKICAgICAgICBteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgICAgICV7JFBhcmFtc30sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IEdyb3VwTWVtYmVyQWRkKCkiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayB0aGUgcmVzdWx0CiAgICBpZiAoICRSZWZlcmVuY2VEYXRhLT57UGVybWlzc2lvbnN9ICkgewogICAgICAgIGZvciBteSAkVXNlckluZGV4ICggc29ydCBrZXlzICV7ICRSZWZlcmVuY2VEYXRhLT57UGVybWlzc2lvbnN9IH0gKSB7CiAgICAgICAgICAgIG15ICRQcml2cyA9ICRSZWZlcmVuY2VEYXRhLT57UGVybWlzc2lvbnN9LT57JFVzZXJJbmRleH07CiAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIHNvcnQga2V5cyAleyRQcml2c30gKSB7CiAgICAgICAgICAgICAgICAkV29ya09yZGVyT2JqZWN0LT57RGVidWd9ID0gMTA7CiAgICAgICAgICAgICAgICBteSAkQWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGVybWlzc2lvblRlc3RXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1skVXNlckluZGV4XSwKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgICAgICA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFByaXZzLT57JFR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IFVzZXIgJFVzZXJJbmRleCwgd2l0aCBVc2VySUQgJFVzZXJJRHNbJFVzZXJJbmRleF0sIGhhcyAkVHlwZSBhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICJQZXJtaXNzaW9uIHRlc3QgJFBlcm1pc3Npb25UZXN0Q291bnRlcjogVXNlciAkVXNlckluZGV4LCB3aXRoIFVzZXJJRCAkVXNlcklEc1skVXNlckluZGV4XSwgaGFzIG5vICRUeXBlIGFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CiAgICAkUGVybWlzc2lvblRlc3RDb3VudGVyKys7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0aW5nIHRoZSBtZXRob2QgV29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBjaGFuZ2UgZm9yIHRoaXMgdGVzdApteSAkQ2hhbmdlSURGb3JQb3NzaWJsZVN0YXRlc1Rlc3QgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY3JlYXRlIHdvcmtvcmRlciBmb3IgdGhpcyB0ZXN0Cm15ICRXb3JrT3JkZXJJREZvclBvc3NpYmxlU3RhdGVzVGVzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgIENoYW5nZUlEICAgICAgID0+ICRDaGFuZ2VJREZvclBvc3NpYmxlU3RhdGVzVGVzdCwKICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnYWNjZXB0ZWQnLAopOwoKIyBXaGVuIG5vIFdvcmtPcmRlcklEIGlzIGdpdmVuIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHN0YXRlcy4KbXkgJFBvc3NpYmxlU3RhdGVzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoCgogICAgIyAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JQb3NzaWJsZVN0YXRlc1Rlc3QsCiAgICBVc2VySUQgPT4gMSwKKSB8fCB7fTsKCiMgZG8gdGhlIGNoZWNrcwpteSBAUG9zc2libGVTdGF0ZUlEc1JlZmVyZW5jZSA9IEBTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEczsKZm9yIG15ICRQb3NzaWJsZVN0YXRlSUQgKEBQb3NzaWJsZVN0YXRlSURzUmVmZXJlbmNlKSB7CiAgICBteSAoICRGaXJzdEhhc2hSZWYsICRTZWNvbmRIYXNoUmVmICkgPSBncmVwIHsgJF8tPntLZXl9ID09ICRQb3NzaWJsZVN0YXRlSUQgfSBAeyRQb3NzaWJsZVN0YXRlc307CgogICAgIyBhIG1hdGNoIGlzIGV4cGVjdGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmlyc3RIYXNoUmVmLAogICAgICAgICJDaGVjayBmb3IgcG9zc2libGUgc3RhdGUgaWQgJFBvc3NpYmxlU3RhdGVJRCIsCiAgICApOwoKICAgICMgdGhlIG5hbWUgc2hvdWxkIGFsc28gbWF0Y2gKICAgICRGaXJzdEhhc2hSZWYgfHw9IHt9OwogICAgbXkgJFBvc3NpYmxlU3RhdGVOYW1lID0gJFdvcmtPcmRlclN0YXRlSUQyTmFtZXskUG9zc2libGVTdGF0ZUlEfTsKICAgICRTZWxmLT5JcygKICAgICAgICAkRmlyc3RIYXNoUmVmLT57VmFsdWV9LAogICAgICAgICRQb3NzaWJsZVN0YXRlTmFtZSwKICAgICAgICAiQ2hlY2sgZm9yIHBvc3NpYmxlIHN0YXRlIG5hbWUgJFBvc3NpYmxlU3RhdGVJRCIsCiAgICApOwoKICAgICMgb25seSBvbmUgbWF0Y2ggaXMgZXhwZWN0ZWQKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU2Vjb25kSGFzaFJlZiwKICAgICAgICAiQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaWQgJFBvc3NpYmxlU3RhdGVJRCBpcyByZXR1cm5lZCBvbmx5IG9uY2UuIiwKICAgICk7Cgp9CgojIHRoZXNlIG9iamVjdHMgc2hvdWxkIGJlIGRlbGV0ZWQKcHVzaCBAeyAkSURzVG9EZWxldGV7Q2hhbmdlfSB9LCAgICAkQ2hhbmdlSURGb3JQb3NzaWJsZVN0YXRlc1Rlc3Q7CnB1c2ggQHsgJElEc1RvRGVsZXRle1dvcmtPcmRlcn0gfSwgJFdvcmtPcmRlcklERm9yUG9zc2libGVTdGF0ZXNUZXN0OwoKIyBUT0RPOiBhZGQgdGVzdHMgZm9yIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkgd2l0aCBhIFdvcmtPcmRlcklEIGFzIGFyZ3VtZW50CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyBzdXBwb3J0IGZvciBhdHRhY2htZW50cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBjaGFuZ2UgZm9yIHRoaXMgdGVzdApteSAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjcmVhdGUgd29ya29yZGVyIGZvciB0aGlzIHRlc3QKbXkgJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCwKICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnYWNjZXB0ZWQnLAopOwoKIyB0aGVzZSBvYmplY3RzIHNob3VsZCBiZSBkZWxldGVkIGxhdGVyIG9uCnB1c2ggQHsgJElEc1RvRGVsZXRle0NoYW5nZX0gfSwgICAgJENoYW5nZUlERm9yQXR0YWNobWVudFRlc3Q7CnB1c2ggQHsgJElEc1RvRGVsZXRle1dvcmtPcmRlcn0gfSwgJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3Q7CgojIHZlcmlmeSB0aGF0IGluaXRpYWx5IG5vIGF0dGFjaG1lbnQgZXhpc3RzCm15IEBBdHRhY2htZW50TGlzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBdHRhY2htZW50TGlzdCwKICAgIDAsCiAgICAnTm8gYXR0YWNobWVudHMgaW5pdGlhbGx5JywKKTsKCiMgZGVmaW5lIGxpc3Qgb2YgdGVzdCBhdHRhY2htZW50cwpteSBAVGVzdEZpbGVMaXN0ID0gKAogICAgewogICAgICAgIEZpbGVuYW1lICAgICAgID0+ICdmaXJzdCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICAgICA9PiAnRmlyc3QgYXR0YWNobWVudCBmcm9tIElUU01Xb3JrT3JkZXIudCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXInLAogICAgfSwKICAgIHsKICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAnc2Vjb25kIGF0dGFjaG1lbnQnLAogICAgICAgIENvbnRlbnQgICAgICAgID0+ICdTZWNvbmQgYXR0YWNobWVudCBmcm9tIElUU01Xb3JrT3JkZXIudCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXInLAogICAgfSwKICAgIHsKICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAnZmlyc3QgcmVwb3J0IGF0dGFjaG1lbnQnLAogICAgICAgIENvbnRlbnQgICAgICAgID0+ICdGaXJzdCByZXBvcnQgYXR0YWNobWVudCBmcm9tIElUU01Xb3JrT3JkZXIudCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXJSZXBvcnQnLAogICAgfSwKICAgIHsKICAgICAgICBGaWxlbmFtZSAgICAgICA9PiAnc2Vjb25kIHJlcG9ydCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICAgICA9PiAnU2Vjb25kIHJlcG9ydCBhdHRhY2htZW50IGZyb20gSVRTTVdvcmtPcmRlci50JywKICAgICAgICBDb250ZW50VHlwZSAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQXR0YWNobWVudFR5cGUgPT4gJ1dvcmtPcmRlclJlcG9ydCcsCiAgICB9LAopOwoKbXkgJUZpbGVDb3VudDsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9Kys7CgogICAgIyBhZGQgdGhlIGF0dGFjaG1lbnQKICAgIG15ICRBZGRPayA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskVGVzdEZpbGV9LAogICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFkZE9rLAogICAgICAgICJBdHRhY2htZW50ICgkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0pICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9OiBhdHRhY2htZW50IGFkZGVkIiwKICAgICk7CgogICAgbXkgQEF0dGFjaG1lbnRMaXN0OwogICAgaWYgKCAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0gZXEgJ1dvcmtPcmRlcicgKSB7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgbGlzdAogICAgICAgIEBBdHRhY2htZW50TGlzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0gZXEgJ1dvcmtPcmRlclJlcG9ydCcgKSB7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgbGlzdAogICAgICAgIEBBdHRhY2htZW50TGlzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclJlcG9ydEF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQEF0dGFjaG1lbnRMaXN0LAogICAgICAgICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9LAogICAgICAgICJBdHRhY2htZW50ICgkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0pICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgYWRkaW5nIiwKICAgICk7CgogICAgIyBnZXQgdGhlIGxhc3QgYWRkZWQgYXR0YWNobWVudCBmaWxlIG5hbWUKICAgIG15ICVBdHRhY2htZW50TG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEBBdHRhY2htZW50TGlzdDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0YWNobWVudExvb2t1cHsgJFRlc3RGaWxlLT57RmlsZW5hbWV9IH0sCiAgICAgICAgIkF0dGFjaG1lbnQgKCRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSkgJEZpbGVDb3VudHsgJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9IH06IGZpbGVuYW1lIGZyb20gV29ya09yZGVyQXR0YWNobWVudExpc3QoKSAvIFdvcmtPcmRlclJlcG9ydEF0dGFjaG1lbnRMaXN0KCkiLAogICAgKTsKCiAgICAjIGdldCB0aGUgYXR0YWNobWVudAogICAgbXkgJEF0dGFjaG1lbnQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgIEZpbGVuYW1lICAgICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dGFjaG1lbnQsCiAgICAgICAgIkF0dGFjaG1lbnQgKCRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSkgJEZpbGVDb3VudHsgJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9IH06IFdvcmtPcmRlckF0dGFjaG1lbnRHZXQoKSByZXR1cm5lZCB0cnVlIiwKICAgICk7CgogICAgIyBjaGVjayBhdHRhY2htZW50IGZpbGUgYXR0cmlidXRlcwogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KEZpbGVuYW1lIENvbnRlbnQgQ29udGVudFR5cGUgQXR0YWNobWVudFR5cGUpKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQXR0YWNobWVudC0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAkVGVzdEZpbGUtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgIkF0dGFjaG1lbnQgKCRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSkgJEZpbGVDb3VudHsgJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9IH06ICRBdHRyaWJ1dGUgZnJvbSBXb3JrT3JkZXJBdHRhY2htZW50R2V0IiwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZXhpc3RlbmNlIG9mIGF0dGFjaG1lbnQKICAgIG15ICRBdHRhY2htZW50RXhpc3RzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudEV4aXN0cygKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0sCiAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEF0dGFjaG1lbnRFeGlzdHMsCiAgICAgICAgIkF0dGFjaG1lbnQgKCRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSkgJEZpbGVDb3VudHsgJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9IH06IGF0dGFjaG1lbnQgZXhpc3RzIiwKICAgICk7Cn0KCiMgbm93IGRlbGV0ZSB0aGUgYXR0YWNobWVudHMKbXkgJU1heFRlc3RGaWxlcyA9ICVGaWxlQ291bnQ7CiVGaWxlQ291bnQgPSAoKTsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9Kys7CgogICAgbXkgJERlbGV0ZU9rID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudERlbGV0ZSgKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0sCiAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJERlbGV0ZU9rLAogICAgICAgICJBdHRhY2htZW50ICgkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0pICRGaWxlQ291bnR7ICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSB9OiBhdHRhY2htZW50IGRlbGV0ZWQiLAogICAgKTsKCiAgICBteSBAQXR0YWNobWVudExpc3Q7CiAgICBpZiAoICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSBlcSAnV29ya09yZGVyJyApIHsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBsaXN0CiAgICAgICAgQEF0dGFjaG1lbnRMaXN0ID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRUZXN0RmlsZS0+e0F0dGFjaG1lbnRUeXBlfSBlcSAnV29ya09yZGVyUmVwb3J0JyApIHsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBsaXN0CiAgICAgICAgQEF0dGFjaG1lbnRMaXN0ID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAQXR0YWNobWVudExpc3QsCiAgICAgICAgJE1heFRlc3RGaWxlc3sgJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9IH0gLSAkRmlsZUNvdW50eyAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0gfSwKICAgICAgICAiQXR0YWNobWVudCAoJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9KSAkRmlsZUNvdW50eyAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0gfTogbnVtYmVyIG9mIGF0dGFjaG1lbnRzIGFmdGVyIGRlbGV0aW9uIiwKICAgICk7CgogICAgbXkgJEF0dGFjaG1lbnRFeGlzdHMgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50RXhpc3RzKAogICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0LAogICAgICAgIEZpbGVuYW1lICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQXR0YWNobWVudEV4aXN0cywKICAgICAgICAiQXR0YWNobWVudCAoJFRlc3RGaWxlLT57QXR0YWNobWVudFR5cGV9KSAkRmlsZUNvdW50eyAkVGVzdEZpbGUtPntBdHRhY2htZW50VHlwZX0gfTogYXR0YWNobWVudCBpcyBnb25lIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY2hhbmdlIHRoZSBuZXdseSBhZGRlZCB1c2VycwokQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpOwppZiAoICFkZWZpbmVkICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnICkgewogICAgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAxOwp9CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgojIHNldCB1bml0dGVzdCB1c2VycyBpbnZhbGlkCmZvciBteSAkVW5pdHRlc3RVc2VySUQgKEBVc2VySURzKSB7CgogICAgIyBnZXQgdXNlciBkYXRhCiAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVuaXR0ZXN0VXNlcklELAogICAgKTsKCiAgICAjIHVwZGF0ZSB1c2VyCiAgICAkVXNlck9iamVjdC0+VXNlclVwZGF0ZSgKICAgICAgICAlVXNlciwKICAgICAgICBWYWxpZElEICAgICAgPT4gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ2ludmFsaWQnICksCiAgICAgICAgQ2hhbmdlVXNlcklEID0+IDEsCiAgICApOwp9CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gJENoZWNrRW1haWxBZGRyZXNzZXNPcmcsCik7CgojIGRlbGV0ZSB0aGUgdGVzdCB3b3Jrb3JkZXJzCm15ICREZWxldGVUZXN0Q291bnQgPSAxOwpmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJElEc1RvRGVsZXRle1dvcmtPcmRlcn0gfSwga2V5cyAlVGVzdGVkV29ya09yZGVySUQgKSB7CiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gV29ya09yZGVyRGVsZXRlKCkgKFdvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCkiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBXb3JrT3JkZXIgaXQgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgdW5kZWYsCiAgICAgICAgJFdvcmtPcmRlckRhdGEtPntXb3JrT3JkZXJJRH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogV29ya09yZGVyRGVsZXRlKCkgLSBkb3VibGUgY2hlY2siLAogICAgICAgICJEZWxldGVUZXN0ICREZWxldGVUZXN0Q291bnQgLSBkb3VibGUgY2hlY2sgKFdvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCkiLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkRGVsZXRlVGVzdENvdW50Kys7Cn0KCiMgZGVsZXRlIHRoZSB0ZXN0IGNoYW5nZXMKZm9yIG15ICRDaGFuZ2VJRCAoIEB7ICRJRHNUb0RlbGV0ZXtDaGFuZ2V9IH0sIGtleXMgJVRlc3RlZENoYW5nZUlEICkgewogICAgbXkgJERlbGV0ZU9rID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gQ2hhbmdlRGVsZXRlKCkgKENoYW5nZUlEPSRDaGFuZ2VJRCkiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDaGFuZ2VEYXRhID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENhY2hlICAgID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gZG91YmxlIGNoZWNrIChDaGFuZ2VJRD0kQ2hhbmdlSUQpIiwKICAgICk7Cn0KY29udGludWUgewogICAgJERlbGV0ZVRlc3RDb3VudCsrOwp9CgojIGRlbGV0ZSBkeW5hbWljIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGlzIHRlc3QKZm9yIG15ICREeW5hbWljRmllbGRJRCAoQER5bmFtaWNGaWVsZElEcykgewoKICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJEeW5hbWljRmllbGREZWxldGUoKSBkZWxldGVkIER5bmFtaWNGaWVsZCAkRHluYW1pY0ZpZWxkSUQiLAogICAgKTsKfQoKIyByZXN0b3JlIG9yaWdpbmFsIGR5bmFtaWMgZmllbGRzIG9yZGVyCmZvciBteSAkRHluYW1pY0ZpZWxkICggQHskT3JpZ2luYWxEeW5hbWljRmllbGRzfSApIHsKCiAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgdXBkYXRlIChyZXN0b3JlKSB3YXMgc3VjY2Vzc2Z1bAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlJlc3RvcmVkIE9yaWdpbmFsIER5bmFtaWMgRmllbGQgIC0gZm9yIEZpZWxkSUQgJER5bmFtaWNGaWVsZC0+e0lEfSIsCiAgICApOwp9CgojIHNldCBTZW5kTm90aWZpY2F0aW9ucyB0byBpdCdzIG9yaWdpbmFsIHZhbHVlCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlOjpTZW5kTm90aWZpY2F0aW9ucycsCiAgICBWYWx1ZSA9PiAkU2VuZE5vdGlmaWNhdGlvbnNPcmcsCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgdGVzdCBjaGFuZ2UgZm9yIGVhY2ggc3RhdGUgaW4gQWdlbnRJVFNNQ2hhbmdlIHNjcmVlbgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKAogICAgICAgICAgICAncmVxdWVzdGVkJywgICAncGVuZGluZyBhcHByb3ZhbCcsICdyZWplY3RlZCcsICdhcHByb3ZlZCcsICdpbiBwcm9ncmVzcycsCiAgICAgICAgICAgICdwZW5kaW5nIHBpcicsICdzdWNjZXNzZnVsJywgICAgICAgJ2ZhaWxlZCcsICAgJ2NhbmNlbGVkJywgJ3JldHJhY3RlZCcKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSAnIC4gJENoYW5nZVN0YXRlIC4gJyAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICJDaGFuZ2UgaW4gJENoYW5nZVN0YXRlIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2Ugc2NyZWVuCiAgICAgICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZTtTb3J0Qnk9Q2hhbmdlTnVtYmVyO09yZGVyQnk9RG93biIpOwoKICAgICAgICAgICAgaWYgKCAkQ2hhbmdlU3RhdGUgZXEgJ3BlbmRpbmcgYXBwcm92YWwnICkgewoKICAgICAgICAgICAgICAgICMgY2xpY2sgb24gYXBwcm9wcmlhdGUgZmlsdGVyCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdGaWx0ZXI9cGVuZGluZyUyMGFwcHJvdmFsJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENoYW5nZVN0YXRlIGVxICdpbiBwcm9ncmVzcycgKSB7CgogICAgICAgICAgICAgICAgIyBjbGljayBvbiBhcHByb3ByaWF0ZSBmaWx0ZXIKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0ZpbHRlcj1pbiUyMHByb2dyZXNzJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENoYW5nZVN0YXRlIGVxICdwZW5kaW5nIHBpcicgKSB7CgogICAgICAgICAgICAgICAgIyBjbGljayBvbiBhcHByb3ByaWF0ZSBmaWx0ZXIKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0ZpbHRlcj1wZW5kaW5nJTIwcGlyJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2xpY2sgb24gYXBwcm9wcmlhdGUgZmlsdGVyCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdGaWx0ZXI9JENoYW5nZVN0YXRlJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgc2NyZWVuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRoZWFkIHRyIHRoIiwgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0Ym9keSB0ciB0ZCIsICdjc3MnICk7CgogICAgICAgICAgICAjIGNoZWNrIGZvciB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDaGFuZ2VUaXRsZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIGNyZWF0ZWQgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2VBZGQgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQWRkIik7CgogICAgICAgICMgY2hlY2sgcGFnZQogICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICBxdyhDaGFuZ2VUaXRsZSBSaWNoVGV4dDEgUmljaFRleHQyIENhdGVnb3J5SUQgSW1wYWN0SUQgUHJpb3JpdHlJRCBSZXF1ZXN0ZWRUaW1lVXNlZAogICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lTW9udGggUmVxdWVzdGVkVGltZURheSBSZXF1ZXN0ZWRUaW1lWWVhciBSZXF1ZXN0ZWRUaW1lSG91ciBSZXF1ZXN0ZWRUaW1lTWludXRlCiAgICAgICAgICAgIEZpbGVVcGxvYWQgU3VibWl0Q2hhbmdlQWRkKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgICAgICBteSAkR2VuZXJhQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCBjYXRlZ29yeSBJRCAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgbXkgJENhdGVnb3J5RGF0YVJlZiA9ICRHZW5lcmFDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2F0ZWdvcnknLAogICAgICAgICAgICBOYW1lICA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGltcGFjdCBJRCAnNCB2ZXJ5IGhpZ2gnCiAgICAgICAgbXkgJEltcGFjdERhdGFSZWYgPSAkR2VuZXJhQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkltcGFjdCcsCiAgICAgICAgICAgIE5hbWUgID0+ICc0IGhpZ2gnLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gIlNlbGVuaXVtQ2hhbmdlICIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NoYW5nZVRpdGxlIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRDaGFuZ2VUaXRsZVJhbmRvbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQxIiwgICAnY3NzJyApLT5zZW5kX2tleXMoJ1NlbGVuaXVtRGVzY3JpcHRpb24nKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSaWNoVGV4dDIiLCAgICdjc3MnICktPnNlbmRfa2V5cygnU2VsZW5pdW1KdXN0aWZpY2F0aW9uJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2F0ZWdvcnlJRCcpLnZhbCgnJENhdGVnb3J5RGF0YVJlZi0+e0l0ZW1JRH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0ltcGFjdElEJykudmFsKCckSW1wYWN0RGF0YVJlZi0+e0l0ZW1JRH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdENoYW5nZUFkZCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayBjcmVhdGVkIHRlc3QgY2hhbmdlIHZhbHVlcwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ3A6Y29udGFpbnMoNSB2ZXJ5IGhpZ2gpJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAiVGVzdCBDaGFuZ2UgdmFsdWUgY2F0ZWdvcnkgNSB2ZXJ5IGhpZ2ggaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdwOmNvbnRhaW5zKDQgaGlnaCknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJUZXN0IENoYW5nZSB2YWx1ZSBpbXBhY3QgNCBoaWdoIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBnZXQgY3JlYXRlZCB0ZXN0IGNoYW5nZSBJRAogICAgICAgIG15ICRDaGFuZ2VRdW90ZWQgPSAkREJPYmplY3QtPlF1b3RlKCRDaGFuZ2VUaXRsZVJhbmRvbSk7CiAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfaXRlbSBXSEVSRSB0aXRsZSA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGFuZ2VRdW90ZWQgXQogICAgICAgICk7CiAgICAgICAgbXkgJENoYW5nZUlEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ2hhbmdlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdzdWNjZXNzZnVsJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJDaGFuZ2UgaW4gc3VjY2Vzc2Z1bCBzdGF0ZSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgICAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAgICAgIyBjcmVhdGUgc2ltcGxlIGNoYW5nZSB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZU5hbWVSYW5kb20gPSAnVGVtcGxhdGUgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUNvbnRlbnQgICAgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHRlbXBsYXRlIGZyb20gdGVzdCBjaGFuZ2UKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENoYW5nZUNvbnRlbnQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgIkNoYW5nZSBUZW1wbGF0ZSAkVGVtcGxhdGVJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZUFkZEZyb21UZW1wbGF0ZSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUiKTsKCiAgICAgICAgIyBjaGVjayBwYWdlCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KFRlbXBsYXRlSUQgTW92ZVRpbWVUeXBlIE1vdmVUaW1lTW9udGggTW92ZVRpbWVEYXkgTW92ZVRpbWVZZWFyIE1vdmVUaW1lSG91ciBNb3ZlVGltZU1pbnV0ZSBTdWJtaXRBZGRUZW1wbGF0ZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgY2hhbmdlIGZyb20gdGVzdCB0ZW1wbGF0ZQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RlbXBsYXRlSUQnKS52YWwoJyRUZW1wbGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRBZGRUZW1wbGF0ZSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayBjaGFuZ2UgdmFsdWVzIGNyZWF0ZWQgZnJvbSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hhbmdlVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBnZXQgY3JlYXRlZCB0ZXN0IGNoYW5nZSBJRAogICAgICAgIG15ICRDaGFuZ2VRdW90ZWQgPSAkREJPYmplY3QtPlF1b3RlKCRDaGFuZ2VUaXRsZVJhbmRvbSk7CiAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZAogICAgICAgICAgICAgICAgRlJPTSBjaGFuZ2VfaXRlbQogICAgICAgICAgICAgICAgV0hFUkUgdGl0bGUgPSA/CiAgICAgICAgICAgICAgICBBTkQgaWQgIT0gJENoYW5nZUlEIiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2hhbmdlUXVvdGVkIF0KICAgICAgICApOwogICAgICAgIG15ICRDcmVhdGVkQ2hhbmdlSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRDcmVhdGVkQ2hhbmdlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgdGVzdCB0ZW1wbGF0ZQogICAgICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlbXBsYXRlTmFtZVJhbmRvbSBpcyBkZWxldGVkIgogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY2hhbmdlcwogICAgICAgIGZvciBteSAkQ2hhbmdlRGVsZXRlICggJENoYW5nZUlELCAkQ3JlYXRlZENoYW5nZUlEICkgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VEZWxldGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIklUU01DaGFuZ2UgJENoYW5nZURlbGV0ZSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwoKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAjIEdldCBjaGFuZ2Ugc3RhdGUgZGF0YS4KICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2hhbmdlLgogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gIlRlc3QgRGVzY3JpcHRpb24iLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICJUZXN0IEp1c3RpZmljYXRpb24iLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiQ2hhbmdlIGluIHN1Y2Nlc3NmdWwgc3RhdGUgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgYW5kIGxvZ2luIGFzIHRlc3QgdXNlci4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtYnVpbGRlcicsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIEdldCB0ZXN0IHVzZXIgSUQuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW5JRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgbmV3IHRlc3QgQ0FCIHVzZXJzLgogICAgICAgIG15ICRUZXN0Q0FCVXNlciA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtYnVpbGRlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgQ0FCIHVzZXIgSUQuCiAgICAgICAgbXkgJFRlc3RDQUJVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0Q0FCVXNlciwKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlWm9vbSBvZiBjcmVhdGVkIHRlc3QgY2hhbmdlLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgQ2xpY2sgb24gJ0ludm9sdmVkIFBlcnNvbnMnIGFuZCBzd2l0Y2ggc2NyZWVucy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zO0NoYW5nZUlEPSRDaGFuZ2VJRCcgKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZihDb3JlKSA9PSAib2JqZWN0IiAmJiB0eXBlb2YoQ29yZS5BcHApID09ICJvYmplY3QiICYmIENvcmUuQXBwLlBhZ2VMb2FkQ29tcGxldGUnCiAgICAgICAgKTsKCiAgICAgICAgIyBQcmVwYXJlIENBQiBmb3IgdGVzdCB0ZW1wbGF0ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDaGFuZ2VNYW5hZ2VyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDaGFuZ2VNYW5hZ2VyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0VXNlckxvZ2luKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdFVzZXJMb2dpbiknKS5jbGljaygpIik7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05ld0NBQk1lbWJlciIsICdjc3MnICktPnNlbmRfa2V5cygiIik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmV3Q0FCTWVtYmVyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0Q0FCVXNlcik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCdsaS51aS1tZW51LWl0ZW06Y29udGFpbnMoJFRlc3RDQUJVc2VyKScpLmNsaWNrKCkiKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQWRkQ0FCTWVtYmVyQnV0dG9uIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjQ0FCQWdlbnRzLSRUZXN0Q0FCVXNlcklEJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IENBQiB1c2VyLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlc3RDQUJVc2VyICkgPiAtMSwKICAgICAgICAgICAgIiRUZXN0Q0FCVXNlciBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayAnU2F2ZSB0aGlzIENBQiBhcyB0ZW1wbGF0ZScuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J05ld1RlbXBsYXRlJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgcGFnZS4KICAgICAgICBmb3IgbXkgJElEIChxdyhUZW1wbGF0ZU5hbWUgQ29tbWVudCBWYWxpZElEIFN1Ym1pdEFkZFRlbXBsYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLgogICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGVtcGxhdGVOYW1lIiwgJ2NzcycgKTsKICAgICAgICAkRWxlbWVudC0+c2VuZF9rZXlzKCIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRBZGRUZW1wbGF0ZSIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUZW1wbGF0ZU5hbWUuRXJyb3IiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNUZW1wbGF0ZU5hbWUnKS5oYXNDbGFzcygnRXJyb3InKSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAnQ2xpZW50IHNpZGUgdmFsaWRhdGlvbiBjb3JyZWN0bHkgZGV0ZWN0ZWQgbWlzc2luZyBpbnB1dCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBDQUIgdGVtcGxhdGUuCiAgICAgICAgbXkgJENBQlRlbXBsYXRlTmFtZSA9ICJDQUIgVGVtcGxhdGUgIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGVtcGxhdGVOYW1lIiwgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJENBQlRlbXBsYXRlTmFtZSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICAgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtVGVzdCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdEFkZFRlbXBsYXRlIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIERlbGV0ZSBwcmV2aW91cyBDQUIgdXNlciBmaXJzdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDaGFuZ2VNYW5hZ2VyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0VXNlckxvZ2luKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdFVzZXJMb2dpbiknKS5jbGljaygpIik7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NBQkFnZW50cy0kVGVzdENBQlVzZXJJRCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJyNDQUJBZ2VudHMtJFRlc3RDQUJVc2VySUQnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgQ0FCIHVzZXIgZGVsZXRpb24uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGVzdENBQlVzZXIgKSA9PSAtMSwKICAgICAgICAgICAgIiRUZXN0Q0FCVXNlciBpcyBub3QgZm91bmQiLAogICAgICAgICk7CgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIEdldCB0ZXN0IENBQiB0ZW1wbGF0ZSBJRC4KICAgICAgICBteSAkQ0FCVGVtcGxhdGVRdW90ZWQgPSAkREJPYmplY3QtPlF1b3RlKCRDQUJUZW1wbGF0ZU5hbWUpOwogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAiU0VMRUNUIGlkIEZST00gY2hhbmdlX3RlbXBsYXRlIFdIRVJFIG5hbWUgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ0FCVGVtcGxhdGVRdW90ZWQgXQogICAgICAgICk7CiAgICAgICAgbXkgJENBQlRlbXBsYXRlSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRDQUJUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgSW1wb3J0IENBQiBmcm9tIHRlbXBsYXRlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RlbXBsYXRlSUQnKS52YWwoJyRDQUJUZW1wbGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nQXBwbHkgVGVtcGxhdGUnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBWZXJpZnkgQ0FCIHVzZXIgYXBwbGllZCBmcm9tIHRlbXBsYXRlLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlc3RDQUJVc2VyICkgPiAtMSwKICAgICAgICAgICAgIiRUZXN0Q0FCVXNlciBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDbG9zZSBwb3B1cC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5DYW5jZWxDbG9zZVBvcHVwIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBjcmVhdGVkIHRlbXBsYXRlLgogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyktPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRDQUJUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ0FCVGVtcGxhdGVOYW1lIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UuCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBHZXQgY2hhbmdlIHN0YXRlIGRhdGEuCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncGVuZGluZyBwaXInLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2hhbmdlLgogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gIlRlc3QgRGVzY3JpcHRpb24iLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICJUZXN0IEp1c3RpZmljYXRpb24iLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiQ2hhbmdlIGluIFBlbmRpbmcgUElSIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4uCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gb2YgY3JlYXRlZCB0ZXN0IGNoYW5nZS4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIENsaWNrIG9uICdDb25kaXRpb25zJyBhbmQgc3dpdGNoIHNjcmVlbnMuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCdhW2hyZWYqPVwiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbjtDaGFuZ2VJRD0kQ2hhbmdlSURcIl0nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoICYmICQoImJ1dHRvbltuYW1lPUFkZENvbmRpdGlvbl0iKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayAnQWRkIG5ldyBjb25kaXRpb24nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQG5hbWU9J0FkZENvbmRpdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI05hbWUiKS5sZW5ndGggJiYgJCgiI0NvbW1lbnQiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBjb25kaXRpb24uCiAgICAgICAgbXkgJENvbmRpdGlvbk5hbWVSYW5kb20gPSAiQ29uZGl0aW9uICIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAgICAnY3NzJyApLT5zZW5kX2tleXMoJENvbmRpdGlvbk5hbWVSYW5kb20pOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NvbW1lbnQiLCAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtQ29uZGl0aW9uIik7CgogICAgICAgIG15ICRDb25kaXRpb25PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpOwoKICAgICAgICAjIEdldCBuZWVkZWQgSURzLgogICAgICAgIG15ICRFeHByZXNpb25BdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0SUQnLAogICAgICAgICk7CiAgICAgICAgbXkgJEltcGFjdERhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpJbXBhY3QnLAogICAgICAgICAgICBOYW1lICA9PiAnNCBoaWdoJywKICAgICAgICApOwogICAgICAgIG15ICRBY3Rpb25BdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlU3RhdGVJRCcKICAgICAgICApOwogICAgICAgIG15ICRBY3Rpb25PcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJ3NldCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ29uZGl0aW9uQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdzdWNjZXNzZnVsJywKICAgICAgICApOwoKICAgICAgICAjIEFkZCBuZXcgZXhwcmVzc2lvbi4KICAgICAgICAjIEluIGNoYW5nZSBvYmplY3QgZm9yIHRlc3QgY2hhbmdlLCBsb29rIGZvciBpbXBhY3QgdmFsdWUgb2YgJzQgaGlnaCcuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAbmFtZT0nQWRkRXhwcmVzc2lvbkJ1dHRvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0V4cHJlc3Npb25JRC1ORVctT2JqZWN0SUQgb3B0aW9uW3ZhbHVlPTFdIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0V4cHJlc3Npb25JRC1ORVctT2JqZWN0SUQgb3B0aW9uW3ZhbHVlPScxJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctU2VsZWN0b3Igb3B0aW9uJykubGVuZ3RoID4gMTsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRXhwcmVzc2lvbklELU5FVy1TZWxlY3RvciBvcHRpb25bdmFsdWU9JyRDaGFuZ2VJRCddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyBXYWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNFeHByZXNzaW9uSUQtTkVXLUF0dHJpYnV0ZUlEIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0V4cHJlc3Npb25JRC1ORVctQXR0cmlidXRlSUQgb3B0aW9uW3ZhbHVlPSckRXhwcmVzaW9uQXR0cmlidXRlSUQnXSIsICdjc3MnICkKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctT3BlcmF0b3JJRCBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNFeHByZXNzaW9uSUQtTkVXLU9wZXJhdG9ySUQgb3B0aW9uW3ZhbHVlPScxJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctQ29tcGFyZVZhbHVlIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0V4cHJlc3Npb25JRC1ORVctQ29tcGFyZVZhbHVlIG9wdGlvblt2YWx1ZT0nJEltcGFjdERhdGFSZWYtPntJdGVtSUR9J10iLCAnY3NzJyApCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgIyBBZGQgbmV3IGFjdGlvbi4KICAgICAgICAjIEluIGNoYW5nZSBvYmplY3QgZm9yIHRlc3QgY2hhbmdlLCBzZXQgY2hhbmdlIHN0YXRlIG9uIHN1Y2Nlc3NmdWwuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAbmFtZT0nQWRkQWN0aW9uQnV0dG9uJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQWN0aW9uSUQtTkVXLU9iamVjdElEIG9wdGlvblt2YWx1ZT0xXSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctT2JqZWN0SUQgb3B0aW9uW3ZhbHVlPScxJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0FjdGlvbklELU5FVy1TZWxlY3RvciBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctU2VsZWN0b3Igb3B0aW9uW3ZhbHVlPSckQ2hhbmdlSUQnXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgV2FpdCBmb3IgYWpheCByZXNwb25zZSB0byBmaWxsIG5leHQgZHJvcGRvd24gbGlzdCB3aXRoIG1vcmUgdGhhbiAxIHZhbHVlLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQWN0aW9uSUQtTkVXLUF0dHJpYnV0ZUlEIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0FjdGlvbklELU5FVy1BdHRyaWJ1dGVJRCBvcHRpb25bdmFsdWU9JyRBY3Rpb25BdHRyaWJ1dGVJRCddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyBXYWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBY3Rpb25JRC1ORVctT3BlcmF0b3JJRCBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctT3BlcmF0b3JJRCBvcHRpb25bdmFsdWU9JyRBY3Rpb25PcGVyYXRvcklEJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIFdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0FjdGlvbklELU5FVy1BY3Rpb25WYWx1ZSBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgIiNBY3Rpb25JRC1ORVctQWN0aW9uVmFsdWUgb3B0aW9uW3ZhbHVlPSckQ29uZGl0aW9uQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSddIiwKICAgICAgICAgICAgJ2NzcycKICAgICAgICApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTYXZlQnV0dG9uIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5XaWRnZXRTaW1wbGUgLkhlYWRlciBoMiIpLnRleHQoKSA9PT0gIkNvbmRpdGlvbnMgYW5kIEFjdGlvbnMiJwogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIFZlcmlmeSBjcmVhdGVkIGNvbmRpdGlvbiBuYW1lIHZhbHVlLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENvbmRpdGlvbk5hbWVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiJENvbmRpdGlvbk5hbWVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgYW5kIHN3aXRjaCB3aW5kb3cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuQ2FuY2VsQ2xvc2VQb3B1cCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PSAiZnVuY3Rpb24iICYmICQoIi5WYWx1ZTpjb250YWlucyhcJ3BlbmRpbmcgcGlyXCcpIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgdGVzdCBjaGFuZ2Ugc3RhdGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJ3JldHVybiAkKCIuVmFsdWU6Y29udGFpbnMoXCdwZW5kaW5nIHBpclwnKSIpLmxlbmd0aCA9PT0gMScpLAogICAgICAgICAgICAiUGVuZGluZyBQSVIgc3RhdGUgaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGdlbmVyYWwgY2F0YWxvZyBpbXBhY3QgSUQgJzQgdmVyeSBoaWdoJy4KICAgICAgICBteSAkQ2F0YWxvZ0ltcGFjdERhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpJbXBhY3QnLAogICAgICAgICAgICBOYW1lICA9PiAnNCBoaWdoJywKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIHRvIGVkaXQgY2hhbmdlIGFuZCBzZXQgaXRzIGltcGFjdCBvbiAnNCBoaWdoJyB0byB0cmlnZ2VyIGNvbmRpdGlvbi4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJ2FbaHJlZio9XCJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlRWRpdDtDaGFuZ2VJRD0kQ2hhbmdlSURcIl0nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiYm9keSIpLmxlbmd0aCAmJiAkKCIjSW1wYWN0SUQiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjSW1wYWN0SUQnKS52YWwoJyRDYXRhbG9nSW1wYWN0RGF0YVJlZi0+e0l0ZW1JRH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0ltcGFjdElEJykudmFsKCkgPT0gJyRDYXRhbG9nSW1wYWN0RGF0YVJlZi0+e0l0ZW1JRH0nIgogICAgICAgICk7CgogICAgICAgICMgU3VibWl0IGFuZCBjaGFuZ2Ugd2luZG93LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTdWJtaXQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZihDb3JlKSA9PSAib2JqZWN0IiAmJiB0eXBlb2YoQ29yZS5BcHApID09ICJvYmplY3QiICYmIENvcmUuQXBwLlBhZ2VMb2FkQ29tcGxldGUnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gJCgiLlZhbHVlOmNvbnRhaW5zKFwnc3VjY2Vzc2Z1bFwnKSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCBjaGFuZ2Ugc3RhdGUgdG8gdmVyaWZ5IHRlc3QgY29uZGl0aW9uLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiLlZhbHVlOmNvbnRhaW5zKFwnc3VjY2Vzc2Z1bFwnKSIpLmxlbmd0aCA9PT0gMScpLAogICAgICAgICAgICAiU3VjY2Vzc2Z1bCBzdGF0ZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCdhW2hyZWYqPVwiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbjtDaGFuZ2VJRD0kQ2hhbmdlSURcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnLkNhbmNlbENsb3NlUG9wdXAnKS5sZW5ndGggJiYgXCQoJ2FbaHJlZio9XCJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uO0NoYW5nZUlEPSRDaGFuZ2VJRFwiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGRlbGV0ZSBpY29uCiAgICAgICAgbXkgJENoZWNrQ29uZmlybUpTID0gPDwiSkFWQVNDUklQVCI7CihmdW5jdGlvbiAoKSB7CiAgICB3aW5kb3cuY29uZmlybSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Owp9KCkpOwpKQVZBU0NSSVBUCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgkQ2hlY2tDb25maXJtSlMpOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJ2FbaHJlZio9XCJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uO0NoYW5nZUlEPSRDaGFuZ2VJRFwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdidXR0b25bdmFsdWU9QWRkXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENsb3NlIHBvcHVwLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkNhbmNlbENsb3NlUG9wdXAiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlLgogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgZGF0YQogICAgICAgIG15ICRDaGFuZ2VTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3BlbmRpbmcgcGlyJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJDaGFuZ2UgaW4gUGVuZGluZyBQSVIgc3RhdGUgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtYnVpbGRlcicsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlWm9vbSBvZiBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnRWRpdCcgYW5kIHN3aXRjaCBzY3JlZW5zCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZUVkaXQ7Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ2hhbmdlVGl0bGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBjYXRlZ29yeSwgaW1wYWN0IGFuZCBwcmlvcml0eSBJRCBmb3IgJzMgbm9ybWFsJwogICAgICAgIG15IEBTdG9yZWRJRHM7CiAgICAgICAgZm9yIG15ICRHZW5lcmFsQ2F0YWxvZ1N0b3JlZCAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgICAgICAgICBteSAkQ2F0YWxvZ0RhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAiSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6JEdlbmVyYWxDYXRhbG9nU3RvcmVkIiwKICAgICAgICAgICAgICAgIE5hbWUgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFN0b3JlZElEcywgJENhdGFsb2dEYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBjYXRlZ29yeSwgaW1wYWN0IGFuZCBwcmlvcml0eSBJRCBmb3IgJzQgaGlnaCcKICAgICAgICBteSBARWRpdElEczsKICAgICAgICBmb3IgbXkgJEdlbmVyYWxDYXRhbG9nRWRpdCAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgICAgICAgICBteSAkQ2F0YWxvZ0RhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAiSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6JEdlbmVyYWxDYXRhbG9nRWRpdCIsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAnNCBoaWdoJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBARWRpdElEcywgJENhdGFsb2dEYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc3RvcmVkIHZhbHVlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ2hhbmdlVGl0bGUnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICAiI0NoYW5nZVRpdGxlIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1JpY2hUZXh0MScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAnVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICIjRGVzY3JpcHRpb24gc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUmljaFRleHQyJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICdUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICAiI0p1c3RpZmljYXRpb24gc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ2F0ZWdvcnlJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkU3RvcmVkSURzWzBdLAogICAgICAgICAgICAiI0NhdGVnb3J5SUQgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjSW1wYWN0SUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJFN0b3JlZElEc1sxXSwKICAgICAgICAgICAgIiNJbXBhY3RJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNQcmlvcml0eUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRTdG9yZWRJRHNbMl0sCiAgICAgICAgICAgICIjUHJpb3JpdHlJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZWRpdCBmaWVsZHMgYW5kIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NoYW5nZVRpdGxlIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCIgZWRpdCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0MSIsICAgJ2NzcycgKS0+c2VuZF9rZXlzKCIgZWRpdCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0MiIsICAgJ2NzcycgKS0+c2VuZF9rZXlzKCIgZWRpdCIpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0NhdGVnb3J5SUQnKS52YWwoJyRFZGl0SURzWzBdJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0ltcGFjdElEJykudmFsKCckRWRpdElEc1sxXScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUHJpb3JpdHlJRCcpLnZhbCgnJEVkaXRJRHNbMl0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTdWJtaXQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIGJhY2sgd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiYm9keSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiAnRWRpdCcgYW5kIHN3aXRjaCBzY3JlZW5zCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZUVkaXQ7Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ2hhbmdlVGl0bGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgZWRpdGVkIHZhbHVlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ2hhbmdlVGl0bGUnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJENoYW5nZVRpdGxlUmFuZG9tIC4gJyBlZGl0JywKICAgICAgICAgICAgIiNDaGFuZ2VUaXRsZSBlZGl0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNSaWNoVGV4dDEnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJ1Rlc3QgRGVzY3JpcHRpb24gZWRpdCcsCiAgICAgICAgICAgICIjRGVzY3JpcHRpb24gZWRpdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUmljaFRleHQyJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICdUZXN0IEp1c3RpZmljYXRpb24gZWRpdCcsCiAgICAgICAgICAgICIjSnVzdGlmaWNhdGlvbiBlZGl0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNDYXRlZ29yeUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRFZGl0SURzWzBdLAogICAgICAgICAgICAiI0NhdGVnb3J5SUQgZWRpdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjSW1wYWN0SUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJEVkaXRJRHNbMV0sCiAgICAgICAgICAgICIjSW1wYWN0SUQgZWRpdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUHJpb3JpdHlJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkRWRpdElEc1syXSwKICAgICAgICAgICAgIiNQcmlvcml0eUlEIGVkaXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gZWRpdCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQoKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdwZW5kaW5nIHBpcicsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gIlRlc3QgRGVzY3JpcHRpb24iLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICJUZXN0IEp1c3RpZmljYXRpb24iLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiQ2hhbmdlIGluIFBlbmRpbmcgUElSIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gb2YgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gJ0VkaXQnIGFuZCBzd2l0Y2ggc2NyZWVucwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VIaXN0b3J5O0NoYW5nZUlEPSRDaGFuZ2VJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSIsICAgICAgICAgICAgICdjc3MnICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0aGVhZCB0ciB0aCIsICdjc3MnICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0Ym9keSB0ciB0ZCIsICdjc3MnICk7CgogICAgICAgICMgY2hlY2sgZm9yIGhpc3RvcnkgdmFsdWVzIHVwb24gdGVzdCBjaGFuZ2UgY3JlYXRpb24KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJOZXcgQ2hhbmdlIChJRD0kQ2hhbmdlSUQpIiApID4gLTEsCiAgICAgICAgICAgICJOZXcgQ2hhbmdlIChJRD1cIiRDaGFuZ2VJRCkgaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkRlc2NyaXB0aW9uOiAobmV3PVRlc3QgRGVzY3JpcHRpb24sIG9sZD0pIgogICAgICAgICAgICApID4gLTEsCiAgICAgICAgICAgICJEZXNjcmlwdGlvbjogKG5ldz1UZXN0IERlc2NyaXB0aW9uLCBvbGQ9KSBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiSnVzdGlmaWNhdGlvbjogKG5ldz1UZXN0IEp1c3RpZmljYXRpb24sIG9sZD0pIgogICAgICAgICAgICApID4gLTEsCiAgICAgICAgICAgICJKdXN0aWZpY2F0aW9uOiAobmV3PVRlc3QgSnVzdGlmaWNhdGlvbiwgb2xkPSkgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIEdldCBjaGFuZ2Ugc3RhdGUgZGF0YS4KICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3BlbmRpbmcgcGlyJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGNoYW5nZSwgd2UgbmVlZCBhIGxvbmcgZGVzY3JpcHRpb24gYW5kIGp1c3RpZmljYXRpb24gdG8gc2hvdyB0aGUgaGlzdG9yeSBkZXRhaWxzLgogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAgICAgIlRlc3QgRGVzY3JpcHRpb24gd2l0aCBhIHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgbG9uZyB0ZXh0IiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PgogICAgICAgICAgICAgICAgIlRlc3QgSnVzdGlmaWNhdGlvbiB3aXRoIGEgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSBsb25nIHRleHQiLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiQ2hhbmdlIGluIFBlbmRpbmcgUElSIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2Vab29tIG9mIGNyZWF0ZWQgdGVzdCBjaGFuZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSUQiKTsKCiAgICAgICAgIyBDbGljayBvbiAnRWRpdCcgYW5kIHN3aXRjaCBzY3JlZW5zLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VIaXN0b3J5O0NoYW5nZUlEPSRDaGFuZ2VJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAjIENsaWNrIG9uIGhpc3Rvcnkgc2hvdyBkZXRhaWxzIHRvIGNoZWNrIEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb207SGlzdG9yeUVudHJ5SUQ9JyApXSIpCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tIHZhbHVlcy4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJEZXRhaWxlZCBoaXN0b3J5IGluZm9ybWF0aW9uIG9mIENoYW5nZVVwZGF0ZSIgKSA+IC0xLAogICAgICAgICAgICAiRGV0YWlsZWQgaGlzdG9yeSBpbmZvcm1hdGlvbiBvZiBDaGFuZ2VVcGRhdGUgaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hhbmdlVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlLgogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbklUU01DaGFuZ2VDSVBBbGxvY2F0ZSBzY3JlZW4KICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUiKTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCBDYXRlZ29yeSBhbmQgSW1wYWN0IElEcwogICAgICAgIG15IEBWYWx1ZSA9ICggJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnMyBub3JtYWwnLCAnNCBoaWdoJywgJzUgdmVyeSBoaWdoJyApOwogICAgICAgIG15IEBJbXBhY3RJRHM7CiAgICAgICAgbXkgQENhdGVnb3J5SURzOwogICAgICAgIGZvciBteSAkQ2F0ZWdvcnlOYW1lIChAVmFsdWUpIHsKICAgICAgICAgICAgbXkgJENhdGVnb3J5RGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDYXRlZ29yeScsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ2F0ZWdvcnlOYW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDYXRlZ29yeUlEcywgJENhdGVnb3J5RGF0YVJlZi0+e0l0ZW1JRH07CiAgICAgICAgfQogICAgICAgIGZvciBteSAkSW1wYWN0TmFtZSAoQFZhbHVlKSB7CiAgICAgICAgICAgIG15ICRJbXBhY3REYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkltcGFjdCcsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkSW1wYWN0TmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBASW1wYWN0SURzLCAkSW1wYWN0RGF0YVJlZi0+e0l0ZW1JRH07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBDYXRlZ29yeSDihpQgSW1wYWN0IGZpZWxkcwogICAgICAgIGZvciBteSAkSW1wYWN0IChASW1wYWN0SURzKSB7CiAgICAgICAgICAgIGZvciBteSAkQ2F0ZWdvcnkgKEBDYXRlZ29yeUlEcykgewogICAgICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNQcmlvcml0eUlEJEltcGFjdC0kQ2F0ZWdvcnkiLCAnY3NzJyApOwogICAgICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbklUU01TdGF0ZU1hY2hpbmUgc2NyZWVuCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluSVRTTVN0YXRlTWFjaGluZSIpOwoKICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGdldCBzdGF0ZSBtYWNoaW5lIG9iamVjdAogICAgICAgIG15ICRTdGF0ZU1hY2hpbmVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpOwoKICAgICAgICAjIGNoZWNrIGZvciBkZWZhdWx0IGNsYXNzIHN0YXRlIG1hY2hpbmUKICAgICAgICBmb3IgbXkgJFN0YXRlTWFjaGluZSAocXcoQ2hhbmdlIFdvcmtPcmRlcikpIHsKCiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdDbGFzcz1JVFNNJTNBJTNBQ2hhbmdlTWFuYWdlbWVudCUzQSUzQSRTdGF0ZU1hY2hpbmUlM0ElM0FTdGF0ZScgKV0iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmNsaWNrKCk7CgogICAgICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0aGVhZCB0ciB0aCIsICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAgICAgbXkgJFN0YXRlVHJhbnNpdGlvbnNSZWYgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OicgLiAkU3RhdGVNYWNoaW5lIC4gJzo6U3RhdGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBkZWZhdWx0IHN0YXRlcyBhbmQgdGhlcmUgbGlua3MKICAgICAgICAgICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICV7JFN0YXRlVHJhbnNpdGlvbnNSZWZ9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICROZXh0U3RhdGVJRCAoIEB7ICRTdGF0ZVRyYW5zaXRpb25zUmVmLT57JFN0YXRlSUR9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ1N0YXRlSUQ9JFN0YXRlSUQ7TmV4dFN0YXRlSUQ9JE5leHRTdGF0ZUlEJyApXSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJldHVybiBiYWNrIHRvIEFkbWluSVRTTVN0YXRlTWFjaGluZSBvdmVydmlldyBzY3JyZWVuCiAgICAgICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluSVRTTVN0YXRlTWFjaGluZSIpOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCB0ZXN0IGNoYW5nZSBmb3IgZWFjaCBzdGF0ZSBpbiBBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIHNjcmVlbgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCAncmVxdWVzdGVkJywgJ3BlbmRpbmcgYXBwcm92YWwnLCAnYXBwcm92ZWQnLCAnaW4gcHJvZ3Jlc3MnLCAncGVuZGluZyBwaXInICkgewoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkQ2hhbmdlU3RhdGUgLiAnICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgICA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICJDaGFuZ2UgaW4gJENoYW5nZVN0YXRlIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZU1hbmFnZXI7U29ydEJ5PUNoYW5nZU51bWJlcjtPcmRlckJ5PURvd24iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgJ3NwYWNlJyB3aXRoICclMjAnIGluIHN0cmluZywgc28gd2UgY2FuIHVzZSBpdCBhcyBhIGZpbHRlciBwYXJhbQogICAgICAgICAgICBteSAkRmlsdGVyQ2hhbmdlU3RhdGUgPSAkQ2hhbmdlU3RhdGU7CiAgICAgICAgICAgICRGaWx0ZXJDaGFuZ2VTdGF0ZSA9fiBzLyAvJTIwL2c7CgogICAgICAgICAgICAjIGNsaWNrIG9uIGFwcHJvcHJpYXRlIGZpbHRlcgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdGaWx0ZXI9JEZpbHRlckNoYW5nZVN0YXRlJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0aGVhZCB0ciB0aCIsICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hhbmdlVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCB0ZXN0IGNoYW5nZSBmb3IgZWFjaCBzdGF0ZSBpbiBBZ2VudElUU01DaGFuZ2VNeUNBQiBzY3JlZW4KICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggJ3JlcXVlc3RlZCcsICdwZW5kaW5nIGFwcHJvdmFsJywgJ2FwcHJvdmVkJywgJ2luIHByb2dyZXNzJywgJ3BlbmRpbmcgcGlyJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSAnIC4gJENoYW5nZVN0YXRlIC4gJyAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICA9PiBbJFRlc3RVc2VySURdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICJDaGFuZ2UgaW4gJENoYW5nZVN0YXRlIHN0YXRlIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2VNeUNBQiBzY3JlZW4KICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2VNeUNBQjtTb3J0Qnk9Q2hhbmdlTnVtYmVyO09yZGVyQnk9RG93biIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAnc3BhY2UnIHdpdGggJyUyMCcgaW4gc3RyaW5nLCBpZiBuZWVkZWQsIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBmaWx0ZXIgcGFyYW0KICAgICAgICAgICAgbXkgJEZpbHRlckNoYW5nZVN0YXRlID0gJENoYW5nZVN0YXRlOwogICAgICAgICAgICAkRmlsdGVyQ2hhbmdlU3RhdGUgPX4gcy8gLyUyMC9nOwoKICAgICAgICAgICAgIyBjbGljayBvbiBhcHByb3ByaWF0ZSBmaWx0ZXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnRmlsdGVyPSRGaWx0ZXJDaGFuZ2VTdGF0ZScgKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSIsICAgICAgICAgICAgICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRib2R5IHRyIHRkIiwgJ2NzcycgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9CgopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCB0ZXN0IGNoYW5nZSBmb3IgZWFjaCBzdGF0ZSBpbiBBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMgc2NyZWVuCiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoICdyZXF1ZXN0ZWQnLCAncGVuZGluZyBhcHByb3ZhbCcsICdhcHByb3ZlZCcsICdpbiBwcm9ncmVzcycsICdwZW5kaW5nIHBpcicgKSB7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgZGF0YQogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgJyAuICRDaGFuZ2VTdGF0ZSAuICcgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAgICAgIkNoYW5nZSBpbiAkQ2hhbmdlU3RhdGUgc3RhdGUgaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyBzY3JlZW4KICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2VNeUNoYW5nZXM7U29ydEJ5PUNoYW5nZU51bWJlcjtPcmRlckJ5PURvd24iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgJ3NwYWNlJyB3aXRoICclMjAnIGluIHN0cmluZywgaWYgbmVlZGVkLCBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgZmlsdGVyIHBhcmFtCiAgICAgICAgICAgIG15ICRGaWx0ZXJDaGFuZ2VTdGF0ZSA9ICRDaGFuZ2VTdGF0ZTsKICAgICAgICAgICAgJEZpbHRlckNoYW5nZVN0YXRlID1+IHMvIC8lMjAvZzsKCiAgICAgICAgICAgICMgY2xpY2sgb24gYXBwcm9wcmlhdGUgZmlsdGVyCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0ZpbHRlcj0kRmlsdGVyQ2hhbmdlU3RhdGUnICldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgY2hlY2sgc2NyZWVuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRoZWFkIHRyIHRoIiwgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0Ym9keSB0ciB0ZCIsICdjc3MnICk7CgogICAgICAgICAgICAjIGNoZWNrIGZvciB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDaGFuZ2VUaXRsZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIGNyZWF0ZWQgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQoKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCB0ZXN0IGNoYW5nZSBmb3IgZWFjaCBzdGF0ZSBpbiBBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMgc2NyZWVuCiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoICdjcmVhdGVkJywgJ2FjY2VwdGVkJywgJ3JlYWR5JywgJ2luIHByb2dyZXNzJyApIHsKCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgICAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICAgICAgICAgIG15ICRDaGFuZ2VPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgZGF0YQogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBzdGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmtvcmRlciBmb3IgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1dvcmtPcmRlciAnIC4gJFdvcmtPcmRlclN0YXRlIC4gJyAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJ1NlbGVuaXVtIEluc3RydWN0aW9uJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgPT4gJ1NlbGVuaXVtIFJlcG9ydCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzIHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycztTb3J0Qnk9Q2hhbmdlTnVtYmVyO09yZGVyQnk9RG93biIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAnc3BhY2UnIHdpdGggJyUyMCcgaW4gc3RyaW5nLCBpZiBuZWVkZWQsIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBmaWx0ZXIgcGFyYW0KICAgICAgICAgICAgbXkgJEZpbHRlcldvcmtPcmRlclN0YXRlID0gJFdvcmtPcmRlclN0YXRlOwogICAgICAgICAgICAkRmlsdGVyV29ya09yZGVyU3RhdGUgPX4gcy8gLyUyMC9nOwoKICAgICAgICAgICAgIyBjbGljayBvbiBhcHByb3ByaWF0ZSBmaWx0ZXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnRmlsdGVyPSRGaWx0ZXJXb3JrT3JkZXJTdGF0ZScgKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSIsICAgICAgICAgICAgICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRib2R5IHRyIHRkIiwgJ2NzcycgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFdvcmtPcmRlclRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9CgopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgYnVpbGRlciB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IENBQiB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckNBQiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBidWlsZGVyIHVzZXIiOwoKICAgICAgICAjIEdldCB0ZXN0IENBQiB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlckNBQklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJDQUIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgY2hhbmdlIHN0YXRlIGRhdGEuCiAgICAgICAgbXkgJENoYW5nZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGNoYW5nZS4KICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGN1c3RvbWVyIHVzZXIuCiAgICAgICAgbXkgJFRlc3RDdXN0b21lciA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2Vab29tIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIENsaWNrIG9uICdJbnZvbHZlZCBQZXJzb25zJyBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zO0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDaGFuZ2VNYW5hZ2VyIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIHBhZ2UuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KCBDaGFuZ2VNYW5hZ2VyIENoYW5nZUJ1aWxkZXIgVGVtcGxhdGVJRCBOZXdDQUJNZW1iZXIgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQnV0dG9uICgKICAgICAgICAgICAgcXcgKCBBZGRDQUJNZW1iZXJCdXR0b24gU3VibWl0QnV0dG9uIEFkZENBQlRlbXBsYXRlQnV0dG9uICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBuYW1lPSckQnV0dG9uJ10iKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBjbGllbnQgdmFsaWRhdGlvbi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDaGFuZ2VNYW5hZ2VyIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRCdXR0b24iLCAgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0NoYW5nZU1hbmFnZXIuRXJyb3IiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDaGFuZ2VNYW5hZ2VyJykuaGFzQ2xhc3MoJ0Vycm9yJykiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcxJywKICAgICAgICAgICAgJ1ZhbGlkYXRpb24gY29ycmVjdGx5IGRldGVjdGVkIG1pc3NpbmcgaW5wdXQgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgSW5wdXQgY2hhbmdlIG1hbmFnZXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ2hhbmdlTWFuYWdlciIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ2hhbmdlTWFuYWdlciIsICdjc3MnICktPnNlbmRfa2V5cygkVGVzdFVzZXJMb2dpbik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCdsaS51aS1tZW51LWl0ZW06Y29udGFpbnMoJFRlc3RVc2VyTG9naW4pJykuY2xpY2soKSIpOwoKICAgICAgICAjIElucHV0IGNoYW5nZSBhZ2VudCBDQUIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmV3Q0FCTWVtYmVyIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOZXdDQUJNZW1iZXIiLCAnY3NzJyApLT5zZW5kX2tleXMoJFRlc3RVc2VyQ0FCKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdFVzZXJDQUIpJykuY2xpY2soKSIpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBZGRDQUJNZW1iZXJCdXR0b24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNDQUJBZ2VudHMtJFRlc3RVc2VyQ0FCSUQnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBJbnB1dCBjaGFuZ2UgY3VzdG9tZXIgQ0FCLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05ld0NBQk1lbWJlciIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmV3Q0FCTWVtYmVyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0Q3VzdG9tZXIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRUZXN0Q3VzdG9tZXIpJykuY2xpY2soKSIpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBZGRDQUJNZW1iZXJCdXR0b24iLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNDQUJDdXN0b21lcnMtJFRlc3RDdXN0b21lcicpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFNlYXJjaCBpZiBkYXRhIGlzIGluIHRoZSB0YWJsZS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ3RhYmxlLkRhdGFUYWJsZSB0ciB0ZDpjb250YWlucygkVGVzdFVzZXJDQUIpJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRlc3RVc2VyQ0FCIGlzIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndGFibGUuRGF0YVRhYmxlIHRyIHRkOmNvbnRhaW5zKCRUZXN0Q3VzdG9tZXIpJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRlc3RDdXN0b21lciBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBUZXN0IGRlbGV0ZSBDQUIgYnV0dG9uLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NBQkFnZW50cy0kVGVzdFVzZXJDQUJJRCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJyNDQUJBZ2VudHMtJFRlc3RVc2VyQ0FCSUQnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndGFibGUuRGF0YVRhYmxlIHRyIHRkOmNvbnRhaW5zKCRUZXN0VXNlckNBQiknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICIkVGVzdFVzZXJDQUIgaXMgbm90IGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIFN1Ym1pdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwoKICAgICAgICAjIEJhY2sgdG8gcHJldmlvdXMgd2luZG93LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnYVtocmVmKj1cIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VIaXN0b3J5O0NoYW5nZUlEPSRDaGFuZ2VJRFwiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uICdIaXN0b3J5Jy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZUhpc3Rvcnk7Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIKICAgICAgICApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2hlY2sgaGlzdG9yeSBsb2cgdG8gdmVyaWZ5IGNoYW5nZSBpbnZvbHZlZCBwZXJzb25zLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkNBQkFnZW50czogKG5ldz0kVGVzdFVzZXJDQUIiICkgPiAtMSwKICAgICAgICAgICAgIkNoYW5nZSBpbiBhZ2VudCBDQUIgLSBzdWNjZXNzIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkNBQkN1c3RvbWVyczogKG5ldz0kVGVzdEN1c3RvbWVyIiApID4gLTEsCiAgICAgICAgICAgICJDaGFuZ2UgaW4gY3VzdG9tZXIgQ0FCIC0gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDaGFuZ2VNYW5hZ2VyOiAobmV3PSRUZXN0VXNlckxvZ2luIiApID4gLTEsCiAgICAgICAgICAgICJDaGFuZ2UgaW4gbWFuYWdlciAtIHN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgcG9wdXAuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuQ2FuY2VsQ2xvc2VQb3B1cCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBjaGFuZ2UuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9CgopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCB0ZXN0IGNoYW5nZSBmb3IgZWFjaCBzdGF0ZSBpbiBBZ2VudElUU01DaGFuZ2VQSVIgc2NyZWVuCiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoICdhY2NlcHRlZCcsICdyZWFkeScsICdpbiBwcm9ncmVzcycsICdjbG9zZWQnLCAnY2FuY2VsZWQnICkgewoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmtvcmRlciBmb3IgdGVzdCBjaGFuZ2UKICAgICAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1dvcmtPcmRlciAnIC4gJFdvcmtPcmRlclN0YXRlIC4gJyAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJ1NlbGVuaXVtIEluc3RydWN0aW9uJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgPT4gJ1NlbGVuaXVtIFJlcG9ydCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSAgID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgICAgPT4gJ3BpcicsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2VQSVIgc2NyZWVuCiAgICAgICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVBJUjtTb3J0Qnk9Q2hhbmdlTnVtYmVyO09yZGVyQnk9RG93biIpOwoKICAgICAgICAgICAgIyByZXBsYWNlICdzcGFjZScgd2l0aCAnJTIwJyBpbiBzdHJpbmcsIGlmIG5lZWRlZCwgc28gd2UgY2FuIHVzZSBpdCBhcyBhIGZpbHRlciBwYXJhbQogICAgICAgICAgICBteSAkRmlsdGVyV29ya09yZGVyU3RhdGUgPSAkV29ya09yZGVyU3RhdGU7CiAgICAgICAgICAgICRGaWx0ZXJXb3JrT3JkZXJTdGF0ZSA9fiBzLyAvJTIwL2c7CgogICAgICAgICAgICAjIGNsaWNrIG9uIGFwcHJvcHJpYXRlIGZpbHRlcgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdGaWx0ZXI9JEZpbHRlcldvcmtPcmRlclN0YXRlJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0aGVhZCB0ciB0aCIsICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkV29ya09yZGVyVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdhcHByb3ZlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gIlRlc3QgRGVzY3JpcHRpb24iLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICJUZXN0IEp1c3RpZmljYXRpb24iLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVNjaGVkdWxlO0ZpbHRlcj1hcHByb3ZlZDtWaWV3PTs7U29ydEJ5PUNoYW5nZU51bWJlcjtPcmRlckJ5PURvd24iCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRoZWFkIHRyIHRoIiwgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRib2R5IHRyIHRkIiwgJ2NzcycgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSUQiKTsKCiAgICAgICAgIyBjbGljayBvbiB0ZW1wbGF0ZSBhbmQgc3dpdGNoIHNjcmVlbnMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGU7Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1RlbXBsYXRlTmFtZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBwYWdlCiAgICAgICAgZm9yIG15ICRJRCAocXcoVGVtcGxhdGVOYW1lIENvbW1lbnQgU3RhdGVSZXNldCBWYWxpZElEIFN1Ym1pdEFkZFRlbXBsYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0ZW1wbGF0ZSBmcm9tIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFRlbXBsYXRlTmFtZVJhbmRvbSA9ICJDaGFuZ2UgVGVtcGxhdGUgIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGVtcGxhdGVOYW1lIiwgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJFRlbXBsYXRlTmFtZVJhbmRvbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICAgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtQ29tbWVudCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdEFkZFRlbXBsYXRlIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIElUU01DaGFuZ2VUZW1wbGF0ZU92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3O1NvcnRCeT1UZW1wbGF0ZUlEO09yZGVyQnk9VXA7RmlsdGVyPUlUU01DaGFuZ2UiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlbXBsYXRlTmFtZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICIkVGVtcGxhdGVOYW1lUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBnZXQgdGVzdCBjaGFuZ2UgdGVtcGxhdGUgSUQKICAgICAgICBteSAkVGVtcGxhdGVkUXVvdGVkID0gJERCT2JqZWN0LT5RdW90ZSgkVGVtcGxhdGVOYW1lUmFuZG9tKTsKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gIlNFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZSBXSEVSRSBuYW1lID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRlbXBsYXRlZFF1b3RlZCBdCiAgICAgICAgKTsKICAgICAgICBteSAkVGVtcGxhdGVJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRlbXBsYXRlIElEICRUZW1wbGF0ZUlEIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gZm9yIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIHZlcmlmeSBpdHMgcmlnaHQgc2NyZWVuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hhbmdlVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgcGFnZQogICAgICAgIGZvciBteSAkQWN0aW9uICgKICAgICAgICAgICAgcXcoIENoYW5nZUhpc3RvcnkgQ2hhbmdlUHJpbnQgQ2hhbmdlRWRpdCBDaGFuZ2VJbnZvbHZlZFBlcnNvbnMgV29ya09yZGVyQWRkIFdvcmtPcmRlckFkZEZyb21UZW1wbGF0ZSBDaGFuZ2VDb25kaXRpb24gQ2hhbmdlVGVtcGxhdGUpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50CiAgICAgICAgICAgICAgICA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU00kQWN0aW9uO0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdzdWNjZXNzZnVsJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gJ1RlbXBsYXRlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VDb250ZW50ICAgICAgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFRlbXBsYXRlTmFtZVJhbmRvbSwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0ZW1wbGF0ZSBmcm9tIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFRlbXBsYXRlTmFtZVJhbmRvbSwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgQ29udGVudCAgICAgID0+ICRDaGFuZ2VDb250ZW50LAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICJDaGFuZ2UgVGVtcGxhdGUgSUQgJFRlbXBsYXRlSUQgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGUgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXc7U29ydEJ5PVRlbXBsYXRlSUQ7T3JkZXJCeT1Eb3duO0ZpbHRlcj1JVFNNQ2hhbmdlIgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIGNyZWF0ZWQgdGVzdCB0ZW1wbGF0ZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlbXBsYXRlTmFtZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICIkVGVtcGxhdGVOYW1lUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIHRvIGRlbGV0ZSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVsZXRlVGVtcGxhdGVJRCRUZW1wbGF0ZUlEIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBjb25maXJtIGJ1dHRvbiB0byBzaG93IHVwIGFuZCBjb25maXJtIGRlbGV0ZSBhY3Rpb24KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0RpYWxvZ0J1dHRvbjEnKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3O1NvcnRCeT1UZW1wbGF0ZUlEO09yZGVyQnk9RG93bjtGaWx0ZXI9SVRTTUNoYW5nZSIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBkZWxldGUgYWN0aW9uIGZvciB0ZXN0IGNyZWF0ZWQgdGVtcGxhdGUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUZW1wbGF0ZU5hbWVSYW5kb20gKSA9PSAtMSwKICAgICAgICAgICAgIiRUZW1wbGF0ZU5hbWVSYW5kb20gaXMgbm90IGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gJ1RlbXBsYXRlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VDb250ZW50ICAgICAgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFRlbXBsYXRlTmFtZVJhbmRvbSwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICdTZWxlbml1bSBUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHRlbXBsYXRlIGZyb20gdGVzdCBjaGFuZ2UKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENoYW5nZUNvbnRlbnQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBDb21tZW50JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAiQ2hhbmdlIFRlbXBsYXRlIElEICRUZW1wbGF0ZUlEIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldyBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldztTb3J0Qnk9VGVtcGxhdGVJRDtPcmRlckJ5PURvd247RmlsdGVyPUlUU01DaGFuZ2UiCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiB0ZXN0IHRlbXBsYXRlIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWdlbnRJVFNNVGVtcGxhdGVFZGl0O1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQnICldIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUZW1wbGF0ZU5hbWUiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgc3RvcmVkIHZhbHVlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVGVtcGxhdGVOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRUZW1wbGF0ZU5hbWVSYW5kb20sCiAgICAgICAgICAgICIjVGVtcGxhdGVOYW1lIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0NvbW1lbnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJ1NlbGVuaXVtIFRlc3QgQ29tbWVudCcsCiAgICAgICAgICAgICIjQ29tbWVudCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZWRpdCB2YWx1ZXMgYW5kIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RlbXBsYXRlTmFtZSIsICdjc3MnICktPnNlbmRfa2V5cygiIEVkaXQiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIiBFZGl0Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAaWQ9J3N1Ym1pdEVkaXRUZW1wbGF0ZSddW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAjIGNsaWNrIG9uIGVkaXRlZCB0ZXN0IHRlbXBsYXRlIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWdlbnRJVFNNVGVtcGxhdGVFZGl0O1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQnICldIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUZW1wbGF0ZU5hbWUiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgZWRpdGVkIHZhbHVlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVGVtcGxhdGVOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRUZW1wbGF0ZU5hbWVSYW5kb20gLiAnIEVkaXQnLAogICAgICAgICAgICAiI1RlbXBsYXRlTmFtZSBlZGl0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNDb21tZW50JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICdTZWxlbml1bSBUZXN0IENvbW1lbnQgRWRpdCcsCiAgICAgICAgICAgICIjQ29tbWVudCBlZGl0ZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgdGVtcGxhdGUKICAgICAgICBteSAkU3VjY2VzcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZW1wbGF0ZU5hbWVSYW5kb20gZWRpdCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gJ0NBQiBUZW1wbGF0ZSAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlQ29udGVudCAgICAgID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVNlcmlhbGl6ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRUZW1wbGF0ZU5hbWVSYW5kb20sCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnQ0FCJywKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICdTZWxlbml1bSBUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0ZW1wbGF0ZSBmcm9tIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFRlbXBsYXRlTmFtZVJhbmRvbSwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdDQUInLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENoYW5nZUNvbnRlbnQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBDb21tZW50JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAiQ2hhbmdlIFRlbXBsYXRlIElEICRUZW1wbGF0ZUlEIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgQ0FCIHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJDQUIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBvYmplY3QKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgZ2V0IHRlc3QgQ0FCIHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJDQUJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyQ0FCLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgQ0FCIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAkVGVzdEN1c3RvbWVyQ0FCID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3O1NvcnRCeT1UZW1wbGF0ZUlEO09yZGVyQnk9RG93bjtGaWx0ZXI9Q0FCIgogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gJ0VkaXQgQ29udGVudCcgZm9yIHRlc3QgY3JlYXRlZCBDQUIgdGVtcGxhdGUgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBZ2VudElUU01UZW1wbGF0ZUVkaXRDQUI7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI05ld0NBQk1lbWJlciIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBhZGQgdGVzdCBjcmVhdGVkIENBQiB1c2VyIHRvIHRlc3QgQ0FCIHRlbXBsYXRlCiAgICAgICAgbXkgJEF1dG9Db21wbGV0ZVN0cmluZ0NBQlVzZXIKICAgICAgICAgICAgPSAiXCIkVGVzdFVzZXJDQUIgJFRlc3RVc2VyQ0FCXCIgPCRUZXN0VXNlckNBQlxAbG9jYWx1bml0dGVzdC5jb20+ICgkVGVzdFVzZXJDQUJJRCkiOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjTmV3Q0FCTWVtYmVyJykuYXV0b2NvbXBsZXRlKCdzZWFyY2gnLCAnJFRlc3RVc2VyQ0FCJykgIik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vKlt0ZXh0KCk9JyRBdXRvQ29tcGxldGVTdHJpbmdDQUJVc2VyJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0J0bkFkZENBQk1lbWJlcicpLmNsaWNrKCk7Iik7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNDQUJBZ2VudHMkVGVzdFVzZXJDQUJJRCcpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBhZGQgdGVzdCBjcmVhdGVkIENBQiBjdXN0b21lciB0byB0ZXN0IENBQiB0ZW1wbGF0ZQogICAgICAgIG15ICRBdXRvQ29tcGxldGVTdHJpbmdDQUJDdXN0b21lcgogICAgICAgICAgICA9ICJcIiRUZXN0Q3VzdG9tZXJDQUIgJFRlc3RDdXN0b21lckNBQlwiIDwkVGVzdEN1c3RvbWVyQ0FCXEBsb2NhbHVuaXR0ZXN0LmNvbT4gKCRUZXN0Q3VzdG9tZXJDQUIpIjsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI05ld0NBQk1lbWJlcicpLmF1dG9jb21wbGV0ZSgnc2VhcmNoJywgJyRUZXN0Q3VzdG9tZXJDQUInKSAiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ0NBQkN1c3RvbWVyJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0J0bkFkZENBQk1lbWJlcicpLmNsaWNrKCk7Iik7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNDQUJDdXN0b21lcnMkVGVzdEN1c3RvbWVyQ0FCJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgc2F2ZSBlZGl0ZWQgQ0FCIHRlbXBsYXRlIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J11bXEBuYW1lPSdTdWJtaXQnXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgc2xlZXAoMSk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gJ0ludm9sZWQgUGVyc29ucycgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnM7Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0NoYW5nZU1hbmFnZXIiKS5sZW5ndGgnICk7CgogICAgICAgICMgaW5wdXQgY2hhbmdlIG1hbmFnZXIKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nTWFuYWdlcgogICAgICAgICAgICA9ICJcIiRUZXN0VXNlckxvZ2luICRUZXN0VXNlckxvZ2luXCIgPCRUZXN0VXNlckxvZ2luXEBsb2NhbHVuaXR0ZXN0LmNvbT4gKCRUZXN0VXNlcklEKSI7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNDaGFuZ2VNYW5hZ2VyJykuYXV0b2NvbXBsZXRlKCdzZWFyY2gnLCAnJFRlc3RVc2VyTG9naW4nKSAiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ01hbmFnZXInXSIpLT5jbGljaygpOwoKICAgICAgICAjIHRlc3QgZWRpdGVkIENBQiB0ZW1wbGF0ZQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RlbXBsYXRlSUQnKS52YWwoJyRUZW1wbGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXVtcQG5hbWU9J0FkZENBQlRlbXBsYXRlQnV0dG9uJ10iKS0+Y2xpY2soKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCBib3RoIHVzZXIgYW5kIGN1c3RvbWVyIGFyZSBsb2FkZWQgZnJvbSBlZGl0ZWQgdGVzdCBDQUIgdGVtcGxhdGUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIkVGVzdFVzZXJDQUIiICkgPiAtMSwKICAgICAgICAgICAgIkNBQiB1c2VyIGxvYWRlZCBmcm9tIGVkaXRlZCB0ZW1wbGF0ZSAtIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiJFRlc3RDdXN0b21lckNBQiIgKSA+IC0xLAogICAgICAgICAgICAiQ0FCIGN1c3RvbWVyIHVzZXIgbG9hZGVkIGZyb20gZWRpdGVkIHRlbXBsYXRlIC0gc3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCB0ZW1wbGF0ZQogICAgICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlbXBsYXRlTmFtZVJhbmRvbSBlZGl0IGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gJ1RlbXBsYXRlICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VDb250ZW50ICAgICAgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFRlbXBsYXRlTmFtZVJhbmRvbSwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICdTZWxlbml1bSBUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHRlbXBsYXRlIGZyb20gdGVzdCBjaGFuZ2UKICAgICAgICBteSAkVGVtcGxhdGVDb21tZW50ID0gJ1NlbGVuaXVtIFRlc3QgQ29tbWVudCc7CiAgICAgICAgbXkgJFRlbXBsYXRlSUQgICAgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENoYW5nZUNvbnRlbnQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkVGVtcGxhdGVDb21tZW50LAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICJDaGFuZ2UgVGVtcGxhdGUgSUQgJFRlbXBsYXRlSUQgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3O1NvcnRCeT1UZW1wbGF0ZUlEO09yZGVyQnk9RG93bjtGaWx0ZXI9SVRTTUNoYW5nZSIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uICdFZGl0IENvbnRlbnQnIGZvciB0ZXN0IGNyZWF0ZWQgY2hhbmdlIHRlbXBsYXRlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRWRpdENvbnRlbnRUZW1wbGF0ZUlEJFRlbXBsYXRlSUQiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB3aW5kb3cgdG8gbG9hZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNEaWFsb2dCdXR0b24xJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyB2ZXJpZnkgZWRpdCBjb250ZW50IHZhbHVlcwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIiRUZW1wbGF0ZU5hbWVSYW5kb20iICkgPiAtMSwKICAgICAgICAgICAgIiRUZW1wbGF0ZU5hbWVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiJFRlbXBsYXRlQ29tbWVudCIgKSA+IC0xLAogICAgICAgICAgICAiJFRlbXBsYXRlQ29tbWVudCBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLAogICAgICAgICAgICAgICAgIlRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgY2hhbmdlIGZyb20gdGhpcyB0ZW1wbGF0ZSwgc28geW91IGNhbiBlZGl0IGFuZCBzYXZlIGl0LiIKICAgICAgICAgICAgKSA+IC0xLAogICAgICAgICAgICAiJ1RoaXMgd2lsbCBjcmVhdGUgYSBuZXcgY2hhbmdlIGZyb20gdGhpcyB0ZW1wbGF0ZSwgc28geW91IGNhbiBlZGl0IGFuZCBzYXZlIGl0LicgaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwKICAgICAgICAgICAgICAgICJUaGUgbmV3IGNoYW5nZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZCBhcyB0ZW1wbGF0ZS4iCiAgICAgICAgICAgICkgPiAtMSwKICAgICAgICAgICAgIidUaGUgbmV3IGNoYW5nZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZCBhcyB0ZW1wbGF0ZS4nIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgY2hhbmdlIGZyb20gdGVzdCB0ZW1wbGF0ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgZ2V0IG5ldyBjaGFuZ2UgSUQgY3JlYXRlZCBmcm9tIHRlc3QgdGVtcGxhdGUKICAgICAgICBteSAkQ2hhbmdlRnJvbVRlbXBsYXRlSUQgPSAkQ2hhbmdlSUQrKzsKCiAgICAgICAgIyBnZXQgbmV3IGNoYW5nZSBkYXRhIGNyZWF0ZWQgZnJvbSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgbXkgJENoYW5nZUZyb21UZW1wbGF0ZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUZyb21UZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IG5ldyBjaGFuZ2UgdmFsdWVzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkQ2hhbmdlRnJvbVRlbXBsYXRlLT57Q2hhbmdlVGl0bGV9ICkgPiAtMSwKICAgICAgICAgICAgIiRDaGFuZ2VGcm9tVGVtcGxhdGUtPntDaGFuZ2VUaXRsZX0gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgdGVtcGxhdGUKICAgICAgICBteSAkU3VjY2VzcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZW1wbGF0ZU5hbWVSYW5kb20gZWRpdCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlcwogICAgICAgIGZvciBteSAkQ2hhbmdlRGVsZXRlICggJENoYW5nZUlELCAkQ2hhbmdlRnJvbVRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZURlbGV0ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gZm9yIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIGNsaWNrICdBZGQgV29ya09yZGVyJyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJBZGQ7Q2hhbmdlSUQ9JENoYW5nZUlEJyldIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNXb3JrT3JkZXJUaXRsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBwYWdlCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KFdvcmtPcmRlclRpdGxlIFJpY2hUZXh0IFdvcmtPcmRlclR5cGVJRCBQbGFubmVkU3RhcnRUaW1lTW9udGggUGxhbm5lZFN0YXJ0VGltZURheSBQbGFubmVkU3RhcnRUaW1lWWVhciBQbGFubmVkU3RhcnRUaW1lSG91ciBQbGFubmVkU3RhcnRUaW1lTWludXRlCiAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTW9udGggUGxhbm5lZEVuZFRpbWVEYXkgUGxhbm5lZEVuZFRpbWVZZWFyIFBsYW5uZWRFbmRUaW1lSG91ciBQbGFubmVkRW5kVGltZU1pbnV0ZSBQbGFubmVkRWZmb3J0IEZpbGVVcGxvYWQgU3VibWl0V29ya09yZGVyQWRkKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHRlc3Qgd29yayBvcmRlcgogICAgICAgIG15ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSA9ICdXb3JrIE9yZGVyICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1dvcmtPcmRlclRpdGxlIiwgICAgICdjc3MnICktPnNlbmRfa2V5cygkV29ya09yZGVyVGl0bGVSYW5kb20pOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgICAgICAgICAgICdjc3MnICktPnNlbmRfa2V5cygnU2VsZW5pdW0gV29ya09yZGVyIEluc3RydWN0aW9ucycpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdFdvcmtPcmRlckFkZCIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgY3JlYXRlZCB0ZXN0IHdvcmsgb3JkZXIgdmFsdWVzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkV29ya09yZGVyVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgREIgb2JqZWN0CiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgICMgZ2V0IHRlc3Qgd29yayBvcmRlciBJRAogICAgICAgIG15ICRXb3JrT3JkZXJRdW90ZWQgPSAkREJPYmplY3QtPlF1b3RlKCRXb3JrT3JkZXJUaXRsZVJhbmRvbSk7CiAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQgRlJPTSBjaGFuZ2Vfd29ya29yZGVyIFdIRVJFIHRpdGxlID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFdvcmtPcmRlclF1b3RlZCBdCiAgICAgICAgKTsKICAgICAgICBteSAkV29ya09yZGVySUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRXb3JrT3JkZXJJRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnV29ya29yZGVyIEFnZW50JyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJBZ2VudDtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQnKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNVc2VyIikubGVuZ3RoJyApOwoKICAgICAgICAjIGlucHV0IHdvcmsgb3JkZXIgYWdlbnQKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nVXNlcgogICAgICAgICAgICA9ICJcIiRUZXN0VXNlckxvZ2luICRUZXN0VXNlckxvZ2luXCIgPCRUZXN0VXNlckxvZ2luXEBsb2NhbHVuaXR0ZXN0LmNvbT4gKCRUZXN0VXNlcklEKSI7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNVc2VyJykuYXV0b2NvbXBsZXRlKCdzZWFyY2gnLCAnJFRlc3RVc2VyTG9naW4nKSAiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ1VzZXInXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTdWJtaXQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gJ0hpc3RvcnknIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnk7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgd29yayBvcmRlciBhZ2VudCBjaGFuZ2UKICAgICAgICBteSAkSGlzdG9yeUFnZW50TWVzc2FnZQogICAgICAgICAgICA9ICJXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJVcGRhdGVcIiwgXCJXb3Jrb3JkZXIgQWdlbnRcIiwgXCIkVGVzdFVzZXJMb2dpbiAoSUQ9JFRlc3RVc2VySUQpXCIiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFdvcmtPcmRlclRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnRGVsZXRlJwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJEZWxldGU7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGNvbmZpcm0gYnV0dG9uIHRvIHNob3cgdXAgYW5kIGNvbmZpcm0gZGVsZXRlIGFjdGlvbgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjRGlhbG9nQnV0dG9uMScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGlhbG9nQnV0dG9uMSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjbGljayBvbiAnSGlzdG9yeScgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeTtDaGFuZ2VJRD0kQ2hhbmdlSUQnKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgdmVyaWZ5IHdvcmsgb3JkZXIgZGVsZXRpb24KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJXb3Jrb3JkZXIgKElEPSRXb3JrT3JkZXJJRCkgZGVsZXRlZCIgKSA+IC0xLAogICAgICAgICAgICAiV29yayBPcmRlciAkV29ya09yZGVySUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyVGl0bGVSYW5kb20gPSAnU2VsZW5pdW0gV29yayBPcmRlciAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkV29ya09yZGVySW5zdHJ1Y3Rpb24gPSAnU2VsZW5pdW0gVGVzdCBXb3JrIE9yZGVyJzsKICAgICAgICBteSAkV29ya09yZGVySUQgICAgICAgICAgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJFdvcmtPcmRlclRpdGxlUmFuZG9tLAogICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAkV29ya09yZGVySW5zdHJ1Y3Rpb24sCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnRWRpdCcgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyRWRpdDtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQnKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNXb3JrT3JkZXJUaXRsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBzdG9yZWQgdmFsdWVzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNXb3JrT3JkZXJUaXRsZScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkV29ya09yZGVyVGl0bGVSYW5kb20sCiAgICAgICAgICAgICIjV29ya09yZGVyVGl0bGUgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUmljaFRleHQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJFdvcmtPcmRlckluc3RydWN0aW9uLAogICAgICAgICAgICAiI0luc3RydWN0aW9uIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1BsYW5uZWRFZmZvcnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJzEwLjAwJywKICAgICAgICAgICAgIiNQbGFubmVkRWZmb3J0IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBlZGl0IHdvcmsgb3JkZXIgYW5kIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1dvcmtPcmRlclRpdGxlIiwgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIiBFZGl0Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQiLCAgICAgICAgICAgICdjc3MnICktPnNlbmRfa2V5cygiIEVkaXQiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNQbGFubmVkRWZmb3J0IiwgICAgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNQbGFubmVkRWZmb3J0IiwgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCIxMS4wMCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdFdvcmtPcmRlckVkaXQiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHN3aXRjaCBiYWNrIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gJ0VkaXQnIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckVkaXQ7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjV29ya09yZGVyVGl0bGUiKS5sZW5ndGgnICk7CgogICAgICAgIHNsZWVwIDE7CgogICAgICAgICMgY2hlY2sgZWRpdGVkIHZhbHVlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjV29ya09yZGVyVGl0bGUnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJFdvcmtPcmRlclRpdGxlUmFuZG9tIC4gJyBFZGl0JywKICAgICAgICAgICAgIiNXb3JrT3JkZXJUaXRsZSBlZGl0ZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNSaWNoVGV4dCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkV29ya09yZGVySW5zdHJ1Y3Rpb24gLiAnIEVkaXQnLAogICAgICAgICAgICAiI0luc3RydWN0aW9uIGVkaXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1BsYW5uZWRFZmZvcnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJzExLjAwJywKICAgICAgICAgICAgIiNQbGFubmVkRWZmb3J0IGVkaXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlckluc3RydWN0aW9uID0gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcic7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJFdvcmtPcmRlckluc3RydWN0aW9uLAogICAgICAgICAgICBQbGFubmVkRWZmb3J0ICA9PiAxMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01Xb3JrT3JkZXJab29tIGZvciB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9JFdvcmtPcmRlcklEIik7CgogICAgICAgICMgY2xpY2sgb24gJ0hpc3RvcnknIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnk7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRoZWFkIHRyIHRoIiwgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIHRib2R5IHRyIHRkIiwgJ2NzcycgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgaGlzdG9yeSB2YWx1ZXMgdXBvbiB0ZXN0IGNoYW5nZSBjcmVhdGlvbgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIk5ldyBXb3Jrb3JkZXIgKElEPSRXb3JrT3JkZXJJRCkiICkgPiAtMSwKICAgICAgICAgICAgIk5ldyBXb3Jrb3JkZXIgKElEPSRXb3JrT3JkZXJJRCkgaXMgZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiSW5zdHJ1Y3Rpb246IChuZXc9JFdvcmtPcmRlckluc3RydWN0aW9uLCBvbGQ9KSIgKSA+IC0xLAogICAgICAgICAgICAiSW5zdHJ1Y3Rpb246IChuZXc9JFdvcmtPcmRlckluc3RydWN0aW9uLCBvbGQ9KSBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJQbGFubmVkRWZmb3J0OiAobmV3PTEwLCBvbGQ9MC4wMCkiICkgPiAtMSwKICAgICAgICAgICAgIlBsYW5uZWRFZmZvcnQ6IChuZXc9MTAsIG9sZD0wLjAwKSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjdXQgb2ZmIHRoZSB3b3Jrb3JkZXIgdGl0bGUgYWZ0ZXIgMzAgY2hhcmFjdGVycyBhbmQgYWRkIFsuLi5dCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlVHJ1bmNhdGVkID0gc3Vic3RyKCAkV29ya09yZGVyVGl0bGVSYW5kb20sIDAsIDMwICkgLiAnWy4uLl0nOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJXb3JrT3JkZXJUaXRsZTogKG5ldz0kV29ya09yZGVyVGl0bGVUcnVuY2F0ZWQsIG9sZD0pIiApID4gLTEsCiAgICAgICAgICAgICJXb3JrT3JkZXJUaXRsZTogKG5ldz0kV29ya09yZGVyVGl0bGVUcnVuY2F0ZWQsIG9sZD0pIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBkZWxldGUgbWVudSBtb2R1bGUgZGVmYXVsdCBjb25maWcKICAgICAgICBteSAlQ2hhbmdlRGVsZXRlTWVudSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+U2V0dGluZ0dldCgKICAgICAgICAgICAgTmFtZSAgICA9PiAnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxMDAtQ2hhbmdlRGVsZXRlJywKICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1DaGFuZ2VEZWxldGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAkQ2hhbmdlRGVsZXRlTWVudXtFZmZlY3RpdmVWYWx1ZX0sCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgQWdlbnRJVFNNQ2hhbmdlRGVsZXRlIGZyb250ZW5kIG1vZHVsZSBzeXNjb25maWcKICAgICAgICBteSAlQ2hhbmdlRGVsZXRlRnJvbnRlbmRVcGRhdGUgPSAoCiAgICAgICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RlbGV0ZSBhIGNoYW5nZScsCiAgICAgICAgICAgICdHcm91cFJvJyAgICAgPT4gWwogICAgICAgICAgICAgICAgJ2l0c20tY2hhbmdlLW1hbmFnZXInCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdOYXZCYXJOYW1lJyA9PiAnSVRTTSBDaGFuZ2UnLAogICAgICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0RlbGV0ZScKICAgICAgICApOwoKICAgICAgICAjIHNldCBBZ2VudElUU01DaGFuZ2VEZWxldGUgZnJvbnRlbmQgbW9kdWxlIG9uIHZhbGlkCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VEZWxldGUnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNoYW5nZURlbGV0ZUZyb250ZW5kVXBkYXRlLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtYnVpbGRlcicsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlIHNjcmVlbiB3aXRoIHJlcXVlc3RlZCBmaWx0ZXIgYW5kIG9yZGVyZWQgZG93bgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2U7U29ydEJ5PUNoYW5nZU51bWJlcjtPcmRlckJ5PURvd247Vmlldz07RmlsdGVyPXJlcXVlc3RlZCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IHRlc3QgY3JlYXRlZCBjaGFuZ2UgaXMgcHJlc2VudAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEJyldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2xpY2sgb24gJ0RlbGV0ZScKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlRGVsZXRlO0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIHNlcnZlciBzaWRlIGVycm9yCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnZGl2LkRpYWxvZyBidXR0b24jRGlhbG9nQnV0dG9uMScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9rIHRvIGRpc21pc3MKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Rpdi5EaWFsb2cgYnV0dG9uI0RpYWxvZ0J1dHRvbjEnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IHRoYXQgdGVzdCBjcmVhdGVkIGNoYW5nZSBpcyBub3QgcHJlc2VudAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVRpdGxlUmFuZG9tICkgPT0gLTEsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgbm90IGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSByZXNldCBtZW51IG1vZHVsZSBkZWZhdWx0IGNvbmZpZwogICAgICAgIG15ICVDaGFuZ2VSZXNldE1lbnUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyktPlNldHRpbmdHZXQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTEwLUNoYW5nZVJlc2V0JywKICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzExMC1DaGFuZ2VSZXNldCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRDaGFuZ2VSZXNldE1lbnV7RWZmZWN0aXZlVmFsdWV9LAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IEFnZW10SVRTTUNoYW5nZVJlc2V0IGZyb250ZW5kIG1vZHVsZSBzeXNjb25maWcKICAgICAgICBteSAlQ2hhbmdlUmVzZXRGcm9udGVuZFVwZGF0ZSA9ICgKICAgICAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnUmVzZXQgYSBjaGFuZ2UgYW5kIGl0cyB3b3Jrb3JkZXJzJywKICAgICAgICAgICAgJ0dyb3VwUm8nICAgICA9PiBbCiAgICAgICAgICAgICAgICAnaXRzbS1jaGFuZ2UtYnVpbGRlcicKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ05hdkJhck5hbWUnID0+ICdJVFNNIENoYW5nZScsCiAgICAgICAgICAgICdUaXRsZScgICAgICA9PiAnUmVzZXQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IEFnZW10SVRTTUNoYW5nZVJlc2V0IGZyb250ZW5kIG1vZHVsZSBvbiB2YWxpZAogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlUmVzZXQnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNoYW5nZVJlc2V0RnJvbnRlbmRVcGRhdGUsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgZGF0YQogICAgICAgIG15IEBDaGFuZ2VTdGF0ZUlEczsKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlIChxdyhyZXF1ZXN0ZWQgYXBwcm92ZWQpKSB7CiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENoYW5nZVN0YXRlSURzLCAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBBcHByb3ZlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBzdGF0ZSBkYXRhCiAgICAgICAgbXkgQFdvcmtPcmRlclN0YXRlSURzOwogICAgICAgIGZvciBteSAkV29ya09yZGVyU3RhdGUgKHF3KGNyZWF0ZWQgYWNjZXB0ZWQpKSB7CiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlclN0YXRlSURzLCAkV29ya09yZGVyU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmsgb3JkZXIgb2JqZWN0CiAgICAgICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgd29yayBvcmRlcgogICAgICAgIG15ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSA9ICdTZWxlbml1bSBXb3JrIE9yZGVyICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRXb3JrT3JkZXJJRCAgICAgICAgICA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJFdvcmtPcmRlclRpdGxlUmFuZG9tLAogICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICdTZWxlbml1bSBUZXN0IFdvcmsgT3JkZXInLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZUlEc1sxXSwKICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAyNy0xMC0xMiAwMDowMDowMScsCiAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMjctMTAtMTUgMTU6MDA6MDAnLAogICAgICAgICAgICBQbGFubmVkRWZmb3J0ICAgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gb2YgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gJ1Jlc2V0JwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VSZXNldDtDaGFuZ2VJRD0kQ2hhbmdlSUQnKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBjb25maXJtIGJ1dHRvbiB0byBzaG93IHVwIGFuZCBjb25maXJtIHJlc2V0IGFjdGlvbgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcuRGlhbG9nIGJ1dHRvbi5QcmltYXJ5LkNhbGxGb3JBY3Rpb246dmlzaWJsZScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuRGlhbG9nIGJ1dHRvbi5QcmltYXJ5LkNhbGxGb3JBY3Rpb24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAjICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uICdIaXN0b3J5JyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VIaXN0b3J5O0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCBjaGFuZ2Ugc3RhdGUgaXMgcmVzZXRlZAogICAgICAgIG15ICRXb3JrT3JkZXJSZXNldE1lc3NhZ2UKICAgICAgICAgICAgPSAiKElEPSRXb3JrT3JkZXJJRCkgV29ya09yZGVyU3RhdGU6IChuZXc9Y3JlYXRlZCAoSUQ9JFdvcmtPcmRlclN0YXRlSURzWzBdKSwgb2xkPWFjY2VwdGVkIChJRD0kV29ya09yZGVyU3RhdGVJRHNbMV0pKSI7CiAgICAgICAgbXkgJENoYW5nZVJlc2V0TWVzc2FnZQogICAgICAgICAgICA9ICJDaGFuZ2VTdGF0ZTogKG5ldz1yZXF1ZXN0ZWQgKElEPSRDaGFuZ2VTdGF0ZUlEc1swXSksIG9sZD1hcHByb3ZlZCAoSUQ9JENoYW5nZVN0YXRlSURzWzFdKSkiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFdvcmtPcmRlclJlc2V0TWVzc2FnZSApID4gLTEsCiAgICAgICAgICAgICIkV29ya09yZGVyUmVzZXRNZXNzYWdlIGlzIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENoYW5nZVJlc2V0TWVzc2FnZSApID4gLTEsCiAgICAgICAgICAgICIkQ2hhbmdlUmVzZXRNZXNzYWdlIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnSGlzdG9yeScgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQnKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uIGhpc3Rvcnkgc2hvdyBkZXRhaWxzIHRvIGNoZWNrIEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5Wm9vbTtIaXN0b3J5RW50cnlJRD0nICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20gdmFsdWVzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiRGV0YWlsZWQgaGlzdG9yeSBpbmZvcm1hdGlvbiBvZiBXb3JrT3JkZXJVcGRhdGUiICkgPiAtMSwKICAgICAgICAgICAgIkRldGFpbGVkIGhpc3RvcnkgaW5mb3JtYXRpb24gb2YgV29ya09yZGVyVXBkYXRlIGlzIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIldvcmtPcmRlclRpdGxlIiApID4gLTEsCiAgICAgICAgICAgICJXb3JrT3JkZXJUaXRsZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRXb3JrT3JkZXJUaXRsZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIERvIG5vdCBjaGVjayBSaWNoVGV4dC4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlJpY2hUZXh0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIEdldCBjaGFuZ2Ugc3RhdGUgZGF0YS4KICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2hhbmdlLgogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICJUZXN0IERlc2NyaXB0aW9uIiwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVGVzdCBKdXN0aWZpY2F0aW9uIiwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHdvcmsgb3JkZXIuCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlci4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudElUU01Xb3JrT3JkZXJab29tIGZvciB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlci4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCIpOwoKICAgICAgICAjIEdldCB3b3JrIG9yZGVyIHN0YXRlcy4KICAgICAgICBteSBAV29ya09yZGVyU3RhdGVzID0gKCAnYWNjZXB0ZWQnLCAncmVhZHknLCAnaW4gcHJvZ3Jlc3MnLCAnY2xvc2VkJyApOwoKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlclN0YXRlIChAV29ya09yZGVyU3RhdGVzKSB7CgogICAgICAgICAgICAjIENsaWNrIG9uICdSZXBvcnQnIGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIgogICAgICAgICAgICApLT5jbGljaygpOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1N1Ym1pdFdvcmtPcmRlckVkaXRSZXBvcnQiKS5sZW5ndGg7JwogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgd29yayBvcmRlciBzdGF0ZSBkYXRhLgogICAgICAgICAgICBteSAkSXRlbUdldFN0YXRlICAgICAgICAgID0gbGMgJFdvcmtPcmRlclN0YXRlOwogICAgICAgICAgICBteSAkV29ya09yZGVyU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICAgICAgICAgTmFtZSAgPT4gJEl0ZW1HZXRTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSW5wdXQgdGV4dCBpbiByZXBvcnQgYW5kIHNlbGVjdCBuZXh0IHdvcmsgb3JkZXIgc3RhdGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQiLCAnY3NzJyApLT5zZW5kX2tleXMoIiRXb3JrT3JkZXJTdGF0ZSIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjV29ya09yZGVyU3RhdGVJRCcpLnZhbCgnJFdvcmtPcmRlclN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU3VibWl0IGFuZCBzd2l0Y2ggYmFjayB3aW5kb3cuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdFdvcmtPcmRlckVkaXRSZXBvcnQiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnYVtocmVmKj1cIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5O1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRFwiXScpLmxlbmd0aCIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gJ0hpc3RvcnknIGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5O1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCcpXSIKICAgICAgICAgICAgKS0+Y2xpY2soKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGg7JyApOwoKICAgICAgICAgICAgIyBWZXJpZnkgcmVwb3J0IGNoYW5nZS4KICAgICAgICAgICAgbXkgJFJlcG9ydFVwZGF0ZU1lc3NhZ2UKICAgICAgICAgICAgICAgID0gIldvcmtPcmRlclN0YXRlOiAobmV3PSRXb3JrT3JkZXJTdGF0ZSAoSUQ9JFdvcmtPcmRlclN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0pLCBvbGQ9IjsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFJlcG9ydFVwZGF0ZU1lc3NhZ2UgKSA+IC0xLAogICAgICAgICAgICAgICAgIiRSZXBvcnRVcGRhdGVNZXNzYWdlIGlzIGZvdW5kIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xvc2UgaGlzdG9yeSBwb3AgdXAgYW5kIHN3aXRjaCB3aW5kb3cuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkNhbmNlbENsb3NlUG9wdXAiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlci4KICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UuCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlckluc3RydWN0aW9uID0gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcic7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJFdvcmtPcmRlckluc3RydWN0aW9uLAogICAgICAgICAgICBQbGFubmVkRWZmb3J0ICA9PiAxMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYW5kIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAnaXRzbS1jaGFuZ2UnLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01Xb3JrT3JkZXJab29tIGZvciB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9JFdvcmtPcmRlcklEIik7CgogICAgICAgICMgY2xpY2sgb24gJ1RlbXBsYXRlJyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQnKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUZW1wbGF0ZU5hbWUiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgcGFnZQogICAgICAgIGZvciBteSAkSUQgKHF3KFRlbXBsYXRlTmFtZSBDb21tZW50IFN0YXRlUmVzZXQgVmFsaWRJRCBTdWJtaXRBZGRUZW1wbGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHRlc3QgdGVtcGxhdGUgZnJvbSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gIldvcmsgT3JkZXIgVGVtcGxhdGUgIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGVtcGxhdGVOYW1lIiwgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJFRlbXBsYXRlTmFtZVJhbmRvbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICAgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtQ29tbWVudCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdEFkZFRlbXBsYXRlIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiYm9keSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBJVFNNQ2hhbmdlVGVtcGxhdGVPdmVydmlldyBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldztTb3J0Qnk9VGVtcGxhdGVJRDtPcmRlckJ5PVVwO0ZpbHRlcj1JVFNNV29ya09yZGVyIgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyIHRlbXBsYXRlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGVtcGxhdGVOYW1lUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRUZW1wbGF0ZU5hbWVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBnZXQgdGVzdCBjaGFuZ2UgdGVtcGxhdGUgSUQKICAgICAgICBteSAkVGVtcGxhdGVkUXVvdGVkID0gJERCT2JqZWN0LT5RdW90ZSgkVGVtcGxhdGVOYW1lUmFuZG9tKTsKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gIlNFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZSBXSEVSRSBuYW1lID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRlbXBsYXRlZFF1b3RlZCBdCiAgICAgICAgKTsKICAgICAgICBteSAkVGVtcGxhdGVJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAiVGVzdCBEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gIlRlc3QgSnVzdGlmaWNhdGlvbiIsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyB2ZXJpZnkgaXRzIHJpZ2h0IHNjcmVlbgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFdvcmtPcmRlclRpdGxlUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHBhZ2UKICAgICAgICBmb3IgbXkgJEFjdGlvbiAoCiAgICAgICAgICAgIHF3KCBXb3JrT3JkZXJIaXN0b3J5IENoYW5nZVByaW50IFdvcmtPcmRlckVkaXQgV29ya09yZGVyQWdlbnQgV29ya09yZGVyUmVwb3J0IFdvcmtPcmRlclRlbXBsYXRlIFdvcmtPcmRlckRlbGV0ZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQKICAgICAgICAgICAgICAgID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTSRBY3Rpb247V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIik7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIGJ1aWxkZXIgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IGJ1aWxkZXIgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB1c2VyIG9iamVjdAogICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgQ0FCIHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJDQUIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgYnVpbGRlciB1c2VyIjsKCiAgICAgICAgIyBnZXQgdGVzdCBDQUIgdXNlciBJRAogICAgICAgIG15ICRUZXN0VXNlckNBQklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJDQUIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCiAgICAgICAgbXkgJFRlc3RDdXN0b21lckNBQiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnSW52b2x2ZWQgUGVyc29ucycgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zO0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0NoYW5nZU1hbmFnZXIiKS5sZW5ndGgnICk7CgogICAgICAgICMgaW5wdXQgY2hhbmdlIG1hbmFnZXIKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nTWFuYWdlcgogICAgICAgICAgICA9ICJcIiRUZXN0VXNlckxvZ2luICRUZXN0VXNlckxvZ2luXCIgPCRUZXN0VXNlckxvZ2luXEBsb2NhbHVuaXR0ZXN0LmNvbT4gKCRUZXN0VXNlcklEKSI7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNDaGFuZ2VNYW5hZ2VyJykuYXV0b2NvbXBsZXRlKCdzZWFyY2gnLCAnJFRlc3RVc2VyTG9naW4nKSAiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ01hbmFnZXInXSIpLT5jbGljaygpOwoKICAgICAgICAjIGlucHV0IGNoYW5nZSBhZ2VudCBDQUIKICAgICAgICBteSAkQXV0b0NvbXBsZXRlU3RyaW5nQ0FCID0gIlwiJFRlc3RVc2VyQ0FCICRUZXN0VXNlckNBQlwiIDwkVGVzdFVzZXJDQUJcQGxvY2FsdW5pdHRlc3QuY29tPiAoJFRlc3RVc2VyQ0FCSUQpIjsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI05ld0NBQk1lbWJlcicpLmF1dG9jb21wbGV0ZSgnc2VhcmNoJywgJyRUZXN0VXNlckNBQicpICIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbdGV4dCgpPSckQXV0b0NvbXBsZXRlU3RyaW5nQ0FCJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXVtcQG5hbWU9J0FkZENBQk1lbWJlckJ1dHRvbiddIiktPmNsaWNrKCk7CgogICAgICAgICMgaW5wdXQgY2hhbmdlIGN1c3RvbWVyIENBQgogICAgICAgIG15ICRBdXRvQ29tcGxldGVTdHJpbmdDdXN0b21lcgogICAgICAgICAgICA9ICJcIiRUZXN0Q3VzdG9tZXJDQUIgJFRlc3RDdXN0b21lckNBQlwiIDwkVGVzdEN1c3RvbWVyQ0FCXEBsb2NhbHVuaXR0ZXN0LmNvbT4gKCRUZXN0Q3VzdG9tZXJDQUIpIjsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI05ld0NBQk1lbWJlcicpLmF1dG9jb21wbGV0ZSgnc2VhcmNoJywgJyRUZXN0Q3VzdG9tZXJDQUInKSAiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ0N1c3RvbWVyJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXVtcQG5hbWU9J0FkZENBQk1lbWJlckJ1dHRvbiddIiktPmNsaWNrKCk7CgogICAgICAgICMgc2VhcmNoIGlmIGRhdGEgaXMgaW4gdGhlIHRhYmxlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0YWJsZS5EYXRhVGFibGUgdHIgdGQ6Y29udGFpbnMoJFRlc3RVc2VyQ0FCKScpLmxlbmd0aCIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIkNBQiBhdXRvY29tcGxldGVkICRUZXN0VXNlckNBQiBpcyBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ3RhYmxlLkRhdGFUYWJsZSB0ciB0ZDpjb250YWlucygkVGVzdEN1c3RvbWVyQ0FCKScpLmxlbmd0aCIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIkNBQiBhdXRvY29tcGxldGVkICRUZXN0Q3VzdG9tZXJDQUIgaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGNyZWF0ZWQgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgR2V0IFNlbGVuaXVtIG9iamVjdC4KbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgR2V0IGNoYW5nZSBzdGF0ZSBkYXRhLgogICAgICAgIG15ICRDaGFuZ2VEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBjaGFuZ2UuCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIEdldCB0ZXN0IGNyZWF0ZWQgY2hhbmdlIGRhdGEuCiAgICAgICAgbXkgJENoYW5nZURhdGEgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhbmQgbG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IGJ1aWxkZXIgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIEdldCBzY3JpcHQgYWxpYXMuCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVNlYXJjaC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2VTZWFyY2giKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTZWFyY2hQcm9maWxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIENoZWNrIGNoYW5nZSBzZWFyY2ggcGFnZS4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoU2VhcmNoUHJvZmlsZSBTZWFyY2hQcm9maWxlTmV3IEF0dHJpYnV0ZSBSZXN1bHRGb3JtIFNlYXJjaEZvcm1TdWJtaXQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBJbnB1dCBjaGFuZ2UgdGl0bGUgYW5kIG51bWJlciBhcyBzZWFyY2ggcGFyYW0gYW5kIHJ1biBpdC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNBdHRyaWJ1dGUnKS52YWwoJ0NoYW5nZVRpdGxlJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdpbnB1dFtuYW1lPVwiQ2hhbmdlVGl0bGVcIl0nKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJDaGFuZ2VOdW1iZXIiLCAgICAgICduYW1lJyApLT5zZW5kX2tleXMoICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiQ2hhbmdlVGl0bGUiLCAgICAgICAnbmFtZScgKS0+c2VuZF9rZXlzKCAkQ2hhbmdlRGF0YS0+e0NoYW5nZVRpdGxlfSApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlYXJjaEZvcm1TdWJtaXQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkIHJlc3VsdC4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDaGFuZ2VUaXRsZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVNlYXJjaCIpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1NlYXJjaFByb2ZpbGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgSW5wdXQgd3Jvbmcgc2VhcmNoIHBhcmFtZXRlcnMsIHJlc3VsdCBzaG91bGQgYmUgJ05vIGRhdGEgZm91bmQnLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiQ2hhbmdlTnVtYmVyIiwgICAgICAnbmFtZScgKS0+c2VuZF9rZXlzKCIxMjM0NTU2NzgiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2hGb3JtU3VibWl0IiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCByZXN1bHQuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiTm8gZGF0YSBmb3VuZC4iICkgPiAtMSwKICAgICAgICAgICAgIkNoYW5nZSBpcyBub3QgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBjaGFuZ2UuCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyVGl0bGVSYW5kb20gPSAnU2VsZW5pdW0gV29yayBPcmRlciAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkV29ya09yZGVySUQgICAgICAgICAgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAnU2VsZW5pdW0gVGVzdCBXb3JrIE9yZGVyJywKICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0xMiAwMDowMDowMScsCiAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMTUgMTU6MDA6MDAnLAogICAgICAgICAgICBQbGFubmVkRWZmb3J0ICAgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlWm9vbSBmb3IgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gJ01vdmUgVGltZSBTbG90JyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VUaW1lU2xvdDtDaGFuZ2VJRD0kQ2hhbmdlSUQnKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI01vdmVUaW1lVHlwZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBwYWdlCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KE1vdmVUaW1lVHlwZSBNb3ZlVGltZU1vbnRoIE1vdmVUaW1lRGF5IE1vdmVUaW1lWWVhciBNb3ZlVGltZUhvdXIgTW92ZVRpbWVNaW51dGUgU3VibWl0TW92ZVRpbWVTbG90KQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgc3VibWl0IGRlZmF1bHQgc2VsZWN0ZWQgdmFsdWUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRNb3ZlVGltZVNsb3QiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgc2xlZXAoMSk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uICdIaXN0b3J5JyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VIaXN0b3J5O0NoYW5nZUlEPSRDaGFuZ2VJRCcpXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgbW92ZSB0aW1lIHNsb3QgY2hhbmdlCiAgICAgICAgbXkgJEV4cGVjdGVkU3RhcnRNZXNzYWdlID0gIihJRD0kV29ya09yZGVySUQpIFBsYW5uZWRTdGFydFRpbWU6IChuZXc9MjAwOS0xMC0xMiAwMDowMDowMSwgb2xkPSkiOwogICAgICAgIG15ICRFeHBlY3RlZEVuZE1lc3NhZ2UgICA9ICIoSUQ9JFdvcmtPcmRlcklEKSBQbGFubmVkRW5kVGltZTogKG5ldz0yMDA5LTEwLTE1IDE1OjAwOjAwLCBvbGQ9KSI7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkRXhwZWN0ZWRTdGFydE1lc3NhZ2UgKSA+IC0xLAogICAgICAgICAgICAiJEV4cGVjdGVkU3RhcnRNZXNzYWdlIGlzIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJEV4cGVjdGVkRW5kTWVzc2FnZSApID4gLTEsCiAgICAgICAgICAgICIkRXhwZWN0ZWRFbmRNZXNzYWdlIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9CgopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IENBQiB1c2VyIGFuZCB0ZXN0IGN1c3RvbWVyIHVzZXIgYW5kIGdldCB0aGVyZSBJRHMKICAgICAgICBteSAkVGVzdFVzZXJDQUIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKTsKICAgICAgICBteSAkVGVzdFVzZXJDQUJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJDQUIsCiAgICAgICAgKTsKICAgICAgICBteSAkVGVzdEN1c3RvbWVyQ0FCICAgID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwogICAgICAgIG15IEBUZXN0Q3VzdG9tZXJDQUJJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVySURzKAogICAgICAgICAgICBVc2VyID0+ICRUZXN0Q3VzdG9tZXJDQUIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBDQUJBZ2VudHMgICAgID0+IFskVGVzdFVzZXJDQUJJRF0sCiAgICAgICAgICAgIENBQkN1c3RvbWVycyAgPT4gWyAkVGVzdEN1c3RvbWVyQ0FCSURzWzBdIF0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgb2JqZWN0CiAgICAgICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlJyk7CgogICAgICAgICMgY3JlYXRlIGNoYW5nZSBhbmQgQ0FCIHRlbXBsYXRlCiAgICAgICAgbXkgQFRlbXBsYXRlSURzOwogICAgICAgIG15IEBUZW1wbGF0ZU5hbWVzOwogICAgICAgIGZvciBteSAkVGVtcGxhdGUgKHF3KElUU01DaGFuZ2UgQ0FCKSkgewoKICAgICAgICAgICAgIyBjcmVhdGUgc2ltcGxlIHRlbXBsYXRlIGNoYW5nZSBhbmQgQ0FCCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZU5hbWVSYW5kb20gPSAnVGVtcGxhdGUgJyAuICRUZW1wbGF0ZSAuICcgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgICAgIG15ICRDb250ZW50ICAgICAgICAgICAgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRUZW1wbGF0ZU5hbWVSYW5kb20sCiAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJFRlbXBsYXRlLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBDb21tZW50JywKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIHRlc3QgdGVtcGxhdGUgZnJvbSB0ZXN0IGNoYW5nZSBhbmQgQ0FCCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRUZW1wbGF0ZSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgQ29tbWVudCcsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIkNoYW5nZSBUZW1wbGF0ZSBJRCAkVGVtcGxhdGVJRCBpcyBjcmVhdGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQFRlbXBsYXRlSURzLCAgICRUZW1wbGF0ZUlEOwogICAgICAgICAgICBwdXNoIEBUZW1wbGF0ZU5hbWVzLCAkVGVtcGxhdGVOYW1lUmFuZG9tOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICBteSAkVGVtcGxhdGVOYW1lUmFuZG9tID0gJ1RlbXBsYXRlIElUU01Xb3JrT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENvbnRlbnQgICAgICAgICAgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMQogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdGVtcGxhdGUgZnJvbSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBDb21tZW50JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAiQ2hhbmdlIFRlbXBsYXRlIElEICRUZW1wbGF0ZUlEIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFRlbXBsYXRlSURzLCAgICRUZW1wbGF0ZUlEOwogICAgICAgIHB1c2ggQFRlbXBsYXRlTmFtZXMsICRUZW1wbGF0ZU5hbWVSYW5kb207CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgIG15ICRJbmRleCA9IDA7CiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUNoZWNrIChxdyhJVFNNQ2hhbmdlIENBQiBJVFNNV29ya09yZGVyKSkgewoKICAgICAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IG9yZGVyIGRvd24gd2l0aCBhcHByb3ByaWF0ZSBmaWx0ZXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3O1NvcnRCeT1UZW1wbGF0ZUlEO09yZGVyQnk9RG93bjtGaWx0ZXI9JFRlbXBsYXRlQ2hlY2siCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRhYmxlIiwgICAgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJ0YWJsZSB0aGVhZCB0ciB0aCIsICdjc3MnICk7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXhwZWN0ZWQgdGVzdCB0ZW1wbGF0ZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGVtcGxhdGVOYW1lc1skSW5kZXhdICkgPiAtMSwKICAgICAgICAgICAgICAgICIkVGVtcGxhdGVOYW1lc1skSW5kZXhdIGlzIGZvdW5kIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGVkaXQgdGVtcGxhdGUgbGluawogICAgICAgICAgICBteSAkVGVtcGxhdGVFZGl0OwogICAgICAgICAgICBpZiAoICRUZW1wbGF0ZUNoZWNrIGVxICdDQUInICkgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlRWRpdCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01UZW1wbGF0ZUVkaXRDQUI7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRHNbJEluZGV4XScpXSIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGVtcGxhdGVFZGl0ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRWRpdENvbnRlbnRUZW1wbGF0ZUlEJFRlbXBsYXRlSURzWyRJbmRleF0iLCAnY3NzJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRUZW1wbGF0ZUVkaXQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJFRlbXBsYXRlRWRpdC0+aXNfZGlzcGxheWVkKCk7CgogICAgICAgICAgICAjIGNsaWNrIHRvIGRlbGV0ZSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RlbGV0ZVRlbXBsYXRlSUQkVGVtcGxhdGVJRHNbJEluZGV4XSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICAgICAjIHdhaXQgZm9yIGNvbmZpcm0gYnV0dG9uIHRvIHNob3cgdXAgYW5kIGNvbmZpcm0gZGVsZXRlIGFjdGlvbgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0RpYWxvZ0J1dHRvbjEnKS5sZW5ndGg7IiApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEaWFsb2dCdXR0b24xIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgJEluZGV4Kys7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1bSBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIGJ1aWxkZXIgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IGJ1aWxkZXIgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZXN0IHVzZXIgSUQKICAgICAgICBteSAkVGVzdFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNQ2hhbmdlWm9vbSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIGNsaWNrIG9uICdJbnZvbHZlZCBQZXJzb25zJyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VJbnZvbHZlZFBlcnNvbnM7Q2hhbmdlSUQ9JENoYW5nZUlEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ2hhbmdlTWFuYWdlciIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBpbnB1dCBjaGFuZ2UgbWFuYWdlcgogICAgICAgIG15ICRBdXRvQ29tcGxldGVTdHJpbmdNYW5hZ2VyCiAgICAgICAgICAgID0gIlwiJFRlc3RVc2VyTG9naW4gJFRlc3RVc2VyTG9naW5cIiA8JFRlc3RVc2VyTG9naW5cQGxvY2FsdW5pdHRlc3QuY29tPiAoJFRlc3RVc2VySUQpIjsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0NoYW5nZU1hbmFnZXInKS5hdXRvY29tcGxldGUoJ3NlYXJjaCcsICckVGVzdFVzZXJMb2dpbicpICIpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy8qW3RleHQoKT0nJEF1dG9Db21wbGV0ZVN0cmluZ01hbmFnZXInXSIpLT5jbGljaygpOwoKICAgICAgICAjIHN1Ym1pdCBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHR5cGU9J3N1Ym1pdCddW1xAdmFsdWU9J1N1Ym1pdCddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgIHNsZWVwKDEpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiYm9keSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiAnSGlzdG9yeScgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeTtDaGFuZ2VJRD0kQ2hhbmdlSUQnKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgbWFuYWdlciBjaGFuZ2UKICAgICAgICBteSAkRXhwZWN0ZWRNYW5hZ2VyTWVzc2FnZSA9ICJDaGFuZ2VNYW5hZ2VyOiAobmV3PSRUZXN0VXNlckxvZ2luIjsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkRXhwZWN0ZWRNYW5hZ2VyTWVzc2FnZSApID4gLTEsCiAgICAgICAgICAgICIkRXhwZWN0ZWRNYW5hZ2VyTWVzc2FnZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZURhdGFSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHR3byB0ZXN0IGNoYW5nZXMKICAgICAgICBteSBAQ2hhbmdlSURzOwogICAgICAgIGZvciBteSAkQ2hhbmdlQ3JlYXRlICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDaGFuZ2VJRHMsICRDaGFuZ2VJRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmsgb3JkZXIgb2JqZWN0CiAgICAgICAgbXkgJFdvcmtPcmRlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgd29yayBvcmRlcgogICAgICAgIG15ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSA9ICdTZWxlbml1bSBXb3JrIE9yZGVyICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRXb3JrT3JkZXJJRCAgICAgICAgICA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkQ2hhbmdlSURzWzBdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAnU2VsZW5pdW0gVGVzdCBXb3JrIE9yZGVyJywKICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAyNy0xMC0xMiAwMDowMDowMScsCiAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMjctMTAtMTUgMTU6MDA6MDAnLAogICAgICAgICAgICBQbGFubmVkRWZmb3J0ICAgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIElEICRXb3JrT3JkZXJJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBvYmplY3QKICAgICAgICBteSAkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnKTsKCiAgICAgICAgIyBjcmVhdGUgc2ltcGxlIGNoYW5nZSB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZU5hbWVSYW5kb20gPSAnVGVtcGxhdGUgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlckNvbnRlbnQgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVGVtcGxhdGVOYW1lUmFuZG9tLAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0ZW1wbGF0ZSBmcm9tIHRlc3Qgd29yayBvcmRlcgogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRUZW1wbGF0ZU5hbWVSYW5kb20sCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgIFdvcmtPcmRlcklEICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIENvbnRlbnQgICAgICA9PiAkV29ya09yZGVyQ29udGVudCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAiV29yayBPcmRlciBUZW1wbGF0ZSBJRCAkVGVtcGxhdGVJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyBdLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gZm9yIHNlY29uZCB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbTtDaGFuZ2VJRD0kQ2hhbmdlSURzWzFdIik7CgogICAgICAgICMgY2xpY2sgb24gJ0FkZCBXb3Jrb3JkZXIgKGZyb20gdGVtcGxhdGUpJyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyQWRkRnJvbVRlbXBsYXRlO0NoYW5nZUlEPSRDaGFuZ2VJRHNbMV0nKV0iCiAgICAgICAgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1RlbXBsYXRlSUQiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgcGFnZQogICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICBxdyhUZW1wbGF0ZUlEIE1vdmVUaW1lVHlwZSBNb3ZlVGltZU1vbnRoIE1vdmVUaW1lRGF5IE1vdmVUaW1lWWVhciBNb3ZlVGltZUhvdXIgTW92ZVRpbWVNaW51dGUgU3VibWl0VGVtcGxhdGUpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBzZWxlY3QgdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIgdGVtcGxhdGUgYW5kIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1RlbXBsYXRlSUQnKS52YWwoJyRUZW1wbGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXRUZW1wbGF0ZSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICBzbGVlcCgxKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgd29yayBvcmRlciB2YWx1ZXMgY3JlYXRlZCBmcm9tIHRlc3QgdGVtcGxhdGUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRXb3JrT3JkZXJUaXRsZVJhbmRvbSApID4gLTEsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVycwogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGZvciBteSAkV29ya09yZGVyRGVsZXRlICggJFdvcmtPcmRlcklELCAkV29ya09yZGVySUQrKyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyRGVsZXRlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJXb3JrIE9yZGVyIElEICRXb3JrT3JkZXJEZWxldGUgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgZm9yIG15ICRDaGFuZ2VEZWxldGUgKEBDaGFuZ2VJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlRGVsZXRlLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDaGFuZ2UgSUQgJENoYW5nZURlbGV0ZSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB0ZW1wbGF0ZQogICAgICAgICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGVtcGxhdGUgSUQgJFRlbXBsYXRlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICBOYW1lICA9PiAncmVxdWVzdGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgbXkgJENoYW5nZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgY2hhbmdlCiAgICAgICAgbXkgJENoYW5nZVRpdGxlUmFuZG9tID0gJ0lUU01DaGFuZ2UgUmVxdWVzdGVkICcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDaGFuZ2VJRCAgICAgICAgICA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1NlbGVuaXVtIFRlc3QgRGVzY3JpcHRpb24nLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdTZWxlbml1biBUZXN0IEp1c3RpZmljYXRpb24nLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTUNoYW5nZVpvb20gb2YgY3JlYXRlZCB0ZXN0IGNoYW5nZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9JENoYW5nZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gJ0NvbmRpdGlvbnMnIGFuZCBzd2l0Y2ggc2NyZWVucwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb247Q2hhbmdlSUQ9JENoYW5nZUlEJyApXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgJ0FkZCBuZXcgY29uZGl0aW9uJwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQG5hbWU9J0FkZENvbmRpdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNvbmRpdGlvbgogICAgICAgIG15ICRDb25kaXRpb25OYW1lUmFuZG9tID0gIkNvbmRpdGlvbiAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRDb25kaXRpb25OYW1lUmFuZG9tKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCJTZWxlbml1bUNvbmRpdGlvbiIpOwoKICAgICAgICAjIGdldCBjb25kaXRpb24gb2JqZWN0CiAgICAgICAgbXkgJENvbmRpdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uJyk7CgogICAgICAgICMgZ2V0IG5lZWRlZCBJRHMKICAgICAgICBteSAkRXhwcmVzaW9uQXR0cmlidXRlSUQgPSAkQ29uZGl0aW9uT2JqZWN0LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICk7CiAgICAgICAgbXkgJFByaW9yaXR5RGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OlByaW9yaXR5JywKICAgICAgICAgICAgTmFtZSAgPT4gJzIgbG93JywKICAgICAgICApOwogICAgICAgIG15ICRBY3Rpb25BdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlU3RhdGVJRCcKICAgICAgICApOwogICAgICAgIG15ICRBY3Rpb25PcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJ3NldCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ29uZGl0aW9uQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdhcHByb3ZlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgbmV3IGV4cHJlc3Npb24KICAgICAgICAjIGluIGNoYW5nZSBvYmplY3QgZm9yIHRlc3QgY2hhbmdlLCBsb29rIGZvciBwcmlvcml0eSB2YWx1ZSBvZiAnMiBsb3cnCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAbmFtZT0nQWRkRXhwcmVzc2lvbkJ1dHRvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNFeHByZXNzaW9uSUQtTkVXLU9iamVjdElEIG9wdGlvblt2YWx1ZT0nMSddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctU2VsZWN0b3Igb3B0aW9uJykubGVuZ3RoID4gMTsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRXhwcmVzc2lvbklELU5FVy1TZWxlY3RvciBvcHRpb25bdmFsdWU9JyRDaGFuZ2VJRCddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctQXR0cmlidXRlSUQgb3B0aW9uJykubGVuZ3RoID4gMTsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRXhwcmVzc2lvbklELU5FVy1BdHRyaWJ1dGVJRCBvcHRpb25bdmFsdWU9JyRFeHByZXNpb25BdHRyaWJ1dGVJRCddIiwgJ2NzcycgKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgYWpheCByZXNwb25zZSB0byBmaWxsIG5leHQgZHJvcGRvd24gbGlzdCB3aXRoIG1vcmUgdGhhbiAxIHZhbHVlCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNFeHByZXNzaW9uSUQtTkVXLU9wZXJhdG9ySUQgb3B0aW9uJykubGVuZ3RoID4gMTsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRXhwcmVzc2lvbklELU5FVy1PcGVyYXRvcklEIG9wdGlvblt2YWx1ZT0nMSddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0V4cHJlc3Npb25JRC1ORVctQ29tcGFyZVZhbHVlIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0V4cHJlc3Npb25JRC1ORVctQ29tcGFyZVZhbHVlIG9wdGlvblt2YWx1ZT0nJFByaW9yaXR5RGF0YVJlZi0+e0l0ZW1JRH0nXSIsICdjc3MnICkKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAjIGFkZCBuZXcgYWN0aW9uIGluIGNoYW5nZSBvYmplY3QgZm9yIHRlc3QgY2hhbmdlLCBzZXQgY2hhbmdlIHN0YXRlIG9uICdBcHByb3ZlZCcKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBuYW1lPSdBZGRBY3Rpb25CdXR0b24nXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctT2JqZWN0SUQgb3B0aW9uW3ZhbHVlPScxJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQWN0aW9uSUQtTkVXLVNlbGVjdG9yIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0FjdGlvbklELU5FVy1TZWxlY3RvciBvcHRpb25bdmFsdWU9JyRDaGFuZ2VJRCddIiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBhamF4IHJlc3BvbnNlIHRvIGZpbGwgbmV4dCBkcm9wZG93biBsaXN0IHdpdGggbW9yZSB0aGFuIDEgdmFsdWUKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI0FjdGlvbklELU5FVy1BdHRyaWJ1dGVJRCBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctQXR0cmlidXRlSUQgb3B0aW9uW3ZhbHVlPSckQWN0aW9uQXR0cmlidXRlSUQnXSIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgYWpheCByZXNwb25zZSB0byBmaWxsIG5leHQgZHJvcGRvd24gbGlzdCB3aXRoIG1vcmUgdGhhbiAxIHZhbHVlCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJyNBY3Rpb25JRC1ORVctT3BlcmF0b3JJRCBvcHRpb24nKS5sZW5ndGggPiAxOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNBY3Rpb25JRC1ORVctT3BlcmF0b3JJRCBvcHRpb25bdmFsdWU9JyRBY3Rpb25PcGVyYXRvcklEJ10iLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGFqYXggcmVzcG9uc2UgdG8gZmlsbCBuZXh0IGRyb3Bkb3duIGxpc3Qgd2l0aCBtb3JlIHRoYW4gMSB2YWx1ZQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjQWN0aW9uSUQtTkVXLUFjdGlvblZhbHVlIG9wdGlvbicpLmxlbmd0aCA+IDE7IiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAiI0FjdGlvbklELU5FVy1BY3Rpb25WYWx1ZSBvcHRpb25bdmFsdWU9JyRDb25kaXRpb25DaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9J10iLAogICAgICAgICAgICAnY3NzJwogICAgICAgICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NhdmVCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IGNyZWF0ZWQgY29uZGl0aW9uIG5hbWUgdmFsdWUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDb25kaXRpb25OYW1lUmFuZG9tICkgPiAtMSwKICAgICAgICAgICAgIiRDb25kaXRpb25OYW1lUmFuZG9tIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IHdvcmsgb3JkZXIgZW1wdHkgYWdlbnQgZGVmYXVsdCBjb25maWcKICAgICAgICBteSAlV29ya09yZGVyRW1wdHlBZ2VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+U2V0dGluZ0dldCgKICAgICAgICAgICAgTmFtZSAgICA9PiAnSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb24jIyMxMC1FbXB0eUFnZW50JywKICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNV29ya09yZGVyOjpUYWtlUGVybWlzc2lvbiMjIzEwLUVtcHR5QWdlbnQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkV29ya09yZGVyRW1wdHlBZ2VudHtFZmZlY3RpdmVWYWx1ZX0sCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBsaXN0IGFnZW50IGRlZmF1bHQgc3lzY29uZmlnCiAgICAgICAgbXkgJVdvcmtPcmRlckxpc3RBZ2VudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+U2V0dGluZ0dldCgKICAgICAgICAgICAgTmFtZSAgICA9PiAnSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb24jIyMyMC1MaXN0QWdlbnQnLAogICAgICAgICAgICBEZWZhdWx0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uIyMjMjAtTGlzdEFnZW50JywKICAgICAgICAgICAgVmFsdWUgPT4gJFdvcmtPcmRlckxpc3RBZ2VudHtFZmZlY3RpdmVWYWx1ZX0sCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnU2VsZW5pdW4gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyVGl0bGVSYW5kb20gPSAnU2VsZW5pdW0gV29yayBPcmRlciAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkV29ya09yZGVySUQgICAgICAgICAgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJFdvcmtPcmRlclRpdGxlUmFuZG9tLAogICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnU2VsZW5pdW0gVGVzdCBXb3JrIE9yZGVyJywKICAgICAgICAgICAgUGxhbm5lZEVmZm9ydCAgPT4gMTAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gZm9yIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjbGljayBvbiAnVGFrZSBXb3Jrb3JkZXInCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclRha2U7V29ya09yZGVySUQ9JFdvcmtPcmRlcklEJyldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGNvbmZpcm0gYnV0dG9uIHRvIHNob3cgdXAgYW5kIGNvbmZpcm0gZGVsZXRlIGFjdGlvbgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjRGlhbG9nQnV0dG9uMScpLmxlbmd0aDsiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGlhbG9nQnV0dG9uMSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjbGljayBvbiAnSGlzdG9yeScgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQnICldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgdGFrZSB3b3JrIG9yZGVyIGhpc3RvcnkgbWVzc2FnZQogICAgICAgIG15ICRFeHBlY3RlZFRha2VXb3JrT3JkZXJNZXNzYWdlID0gIldvcmtPcmRlckFnZW50OiAobmV3PSRUZXN0VXNlckxvZ2luIjsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkRXhwZWN0ZWRUYWtlV29ya09yZGVyTWVzc2FnZSApID4gLTEsCiAgICAgICAgICAgICIkRXhwZWN0ZWRUYWtlV29ya09yZGVyTWVzc2FnZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2Vab29tIG9mIGNyZWF0ZWQgdGVzdCBjaGFuZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIGNyZWF0ZSBtZW51IG1vZHVsZSB0ZXN0IHBhcmFtcwogICAgICAgIG15IEBNZW51TW9kdWxlID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gIkJhY2siLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01DaGFuZ2UiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gIkhpc3RvcnkiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01DaGFuZ2VIaXN0b3J5IiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJQcmludCIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTUNoYW5nZVByaW50IiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJFZGl0IiwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAiQWdlbnRJVFNNQ2hhbmdlRWRpdCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiSW52b2x2ZWQgUGVyc29ucyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiQWRkIFdvcmtvcmRlciIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTVdvcmtPcmRlckFkZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiQWRkIFdvcmtvcmRlciAoZnJvbSB0ZW1wbGF0ZSkiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01Xb3JrT3JkZXJBZGRGcm9tVGVtcGxhdGUiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gIkNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbiIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiTGluayIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50TGlua09iamVjdCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiTW92ZSBUaW1lIFNsb3QiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01DaGFuZ2VUaW1lU2xvdCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01DaGFuZ2VUZW1wbGF0ZSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBjaGFuZ2UgbWVudSBtb2R1bGVzCiAgICAgICAgZm9yIG15ICRDaGFuZ2Vab29tTWVudU1vZHVsZSAoQE1lbnVNb2R1bGUpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249JENoYW5nZVpvb21NZW51TW9kdWxlLT57QWN0aW9ufScgKV0iKSwKICAgICAgICAgICAgICAgICJDaGFuZ2UgbWVudSAkQ2hhbmdlWm9vbU1lbnVNb2R1bGUtPntOYW1lfSBpcyBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01Xb3JrT3JkZXJab29tIG9mIGNyZWF0ZWQgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD0kV29ya09yZGVySUQiKTsKCiAgICAgICAgIyBjcmVhdGUgbWVudSBtb2R1bGUgdGVzdCBwYXJhbXMKICAgICAgICBteSBATWVudU1vZHVsZSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJCYWNrIiwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAiQWdlbnRJVFNNQ2hhbmdlWm9vbSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiSGlzdG9yeSIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gIlByaW50IiwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAiQWdlbnRJVFNNQ2hhbmdlUHJpbnQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gIkVkaXQiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01Xb3JrT3JkZXJFZGl0IiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJXb3Jrb3JkZXIgQWdlbnQiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01Xb3JrT3JkZXJBZ2VudCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiUmVwb3J0IiwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAiQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJMaW5rIiwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAiQWdlbnRMaW5rT2JqZWN0IiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gIkFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICJEZWxldGUiLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICJBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUiLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgd29yayBvcmRlciBtZW51IG1vZHVsZXMKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlclpvb21NZW51TW9kdWxlIChATWVudU1vZHVsZSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj0kV29ya09yZGVyWm9vbU1lbnVNb2R1bGUtPntBY3Rpb259JyApXSIpLAogICAgICAgICAgICAgICAgIkNoYW5nZSBtZW51ICRXb3JrT3JkZXJab29tTWVudU1vZHVsZS0+e05hbWV9IGlzIGZvdW5kIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFdvcmtPcmRlclRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZU51bWJlcigpOwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFROICAgICAgICAgICA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgVGlja2V0JywKICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJ1Rlc3QgU2VsZW5pdW0gQ3VzdG9tZXInLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJ1Rlc3QgU2VsZW5pdW0gQ3VzdG9tZXInLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IElEICRUaWNrZXRJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01DaGFuZ2Vab29tIG9mIGNyZWF0ZWQgdGVzdCBjaGFuZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPSRDaGFuZ2VJRCIpOwoKICAgICAgICAjIGNsaWNrIG9uICdMaW5rJyBhbmQgc3dpdGNoIHNjcmVlbnMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNQ2hhbmdlJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjU3VibWl0U2VhcmNoIikubGVuZ3RoJyApOwoKICAgICAgICAjIHNlbGVjdCB0ZXN0IGNyZWF0ZWQgdGlja2V0IHRvIGxpbmsgd2l0aCB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdTRUFSQ0g6OlRpY2tldE51bWJlciddIiktPnNlbmRfa2V5cygkVGlja2V0TnVtYmVyKTsKCiAgICAgICAgc2xlZXAoMik7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTZWFyY2gnXVtcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJ2lucHV0I0xpbmtUYXJnZXRLZXlzJykubGVuZ3RoIiApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQGlkPSdMaW5rVGFyZ2V0S2V5cyddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAaWQ9J0FkZExpbmtzJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTGlua0FkZENsb3NlTGluayIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICBzbGVlcCgyKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImJvZHkiKS5sZW5ndGgnICk7CgogICAgICAgICMgdmVyaWZ5IHRlc3QgY2hhbmdlIGlzIGxpbmtlZCB3aXRoIHRlc3QgdGlja2V0CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0TnVtYmVyICkgPiAtMSwKICAgICAgICAgICAgIlRlc3QgdGlja2V0IG51bWJlciAkVGlja2V0TnVtYmVyIGlzIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uICdMaW5rJyBhbmQgc3dpdGNoIHNjcmVlbnMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNQ2hhbmdlJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjU3VibWl0U2VhcmNoIikubGVuZ3RoJyApOwoKICAgICAgICBzbGVlcCgyKTsKCiAgICAgICAgIyBkZWxldGUgbGluayByZWxhdGlvbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbXEBocmVmPScjTWFuYWdlTGlua3MnXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAaWQ9J0xpbmtEZWxldGVJZGVudGlmaWVyJ10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0aXRsZT0nRGVsZXRlIGxpbmtzJ10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRMaW5rT2JqZWN0O1N1YmFjdGlvbj1DbG9zZScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IGxpbmsgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpY2tldE51bWJlciApID09IC0xLAogICAgICAgICAgICAiVGVzdCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB0aWNrZXQKICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0IElEICRUaWNrZXRJRCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZVN0YXRlRGF0YVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgIE5hbWUgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNoYW5nZSBvYmplY3QKICAgICAgICBteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjaGFuZ2UKICAgICAgICBteSAkQ2hhbmdlVGl0bGVSYW5kb20gPSAnSVRTTUNoYW5nZSBSZXF1ZXN0ZWQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJENoYW5nZUlEICAgICAgICAgID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQWRkKAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICRDaGFuZ2VUaXRsZVJhbmRvbSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ1NlbGVuaXVtIFRlc3QgSnVzdGlmaWNhdGlvbicsCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlRGF0YVJlZi0+e0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgd29yayBvcmRlciBvYmplY3QKICAgICAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlclRpdGxlUmFuZG9tID0gJ1NlbGVuaXVtIFdvcmsgT3JkZXIgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEICAgICAgICAgID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1NlbGVuaXVtIFRlc3QgV29yayBPcmRlcicsCiAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgID0+IDEwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB0aWNrZXQKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlTnVtYmVyKCk7CiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVE4gICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBUaWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAnVGVzdCBTZWxlbml1bSBDdXN0b21lcicsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAnVGVzdCBTZWxlbml1bSBDdXN0b21lcicsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgSUQgJFRpY2tldElEIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tY2hhbmdlJywgJ2l0c20tY2hhbmdlLWJ1aWxkZXInLCAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgXQogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVdvcmtPcmRlclpvb20gb2YgY3JlYXRlZCB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCIpOwoKICAgICAgICAjIGNsaWNrIG9uICdMaW5rJyBhbmQgc3dpdGNoIHNjcmVlbnMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRMaW5rT2JqZWN0O1NvdXJjZU9iamVjdD1JVFNNV29ya09yZGVyJyApXSIpCiAgICAgICAgICAgIC0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1N1Ym1pdFNlYXJjaCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBzZWxlY3QgdGVzdCBjcmVhdGVkIHRpY2tldCB0byBsaW5rIHdpdGggdGVzdCBjcmVhdGVkIHdvcmsgb3JkZXIKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNUYXJnZXRJZGVudGlmaWVyJykudmFsKCdUaWNrZXQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICBzbGVlcCgyKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBuYW1lPSdTRUFSQ0g6OlRpY2tldE51bWJlciddIiktPnNlbmRfa2V5cygkVGlja2V0TnVtYmVyKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU2VhcmNoJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCdpbnB1dCNMaW5rVGFyZ2V0S2V5cycpLmxlbmd0aCIgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBpZD0nTGlua1RhcmdldEtleXMnXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQGlkPSdBZGRMaW5rcyddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0xpbmtBZGRDbG9zZUxpbmsiLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgc2xlZXAoMSk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIHZlcmlmeSB0ZXN0IHdvcmsgb3JkZXIgaXMgbGlua2VkIHdpdGggdGVzdCB0aWNrZXQKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUaWNrZXROdW1iZXIgKSA+IC0xLAogICAgICAgICAgICAiVGVzdCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gJ0xpbmsnIGFuZCBzd2l0Y2ggc2NyZWVucwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudExpbmtPYmplY3Q7U291cmNlT2JqZWN0PUlUU01Xb3JrT3JkZXInICldIikKICAgICAgICAgICAgLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjU3VibWl0U2VhcmNoIikubGVuZ3RoJyApOwoKICAgICAgICAjIGRlbGV0ZSBsaW5rIHJlbGF0aW9uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtcQGhyZWY9JyNNYW5hZ2VMaW5rcyddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEBpZD0nTGlua0RlbGV0ZUlkZW50aWZpZXInXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHRpdGxlPSdEZWxldGUgbGlua3MnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudExpbmtPYmplY3Q7U3ViYWN0aW9uPUNsb3NlJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgc2xlZXAoMSk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IGxpbmsgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpY2tldE51bWJlciApID09IC0xLAogICAgICAgICAgICAiVGVzdCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgaXMgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCB3b3JrIG9yZGVyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgdGlja2V0CiAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBJRCAkVGlja2V0SUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAkQ2hhbmdlVGl0bGVSYW5kb20sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnU2VsZW5pdW0gVGVzdCBEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCAgID0+ICRDaGFuZ2VTdGF0ZURhdGFSZWYtPntJdGVtSUR9LAogICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCB0b29sIGJhciBDaGFuZ2VNYW5hZ2VyIGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZAogICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZU1hbmFnZXInKV0iKTsKICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgQ0FCQWdlbnRzICAgICA9PiBbJFRlc3RVc2VySURdLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbG9nIGluIHRlc3QgdXNlcgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IHRvb2wgYmFyIE15Q0FCIGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZAogICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZU15Q0FCJyldIik7CiAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY3JlYXRlZCBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJENoYW5nZVRpdGxlUmFuZG9tIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnSVRTTUNoYW5nZSonICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IHRoYXQgdG9vbCBiYXIgTXlDaGFuZ2VzIGlzIGVuYWJsZWQgYW5kIGRpc3BsYXllZAogICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcycpXSIpOwogICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgY2hhbmdlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ0lUU01DaGFuZ2UqJyApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNoYW5nZScsICdpdHNtLWNoYW5nZS1idWlsZGVyJywgJ2l0c20tY2hhbmdlLW1hbmFnZXInIF0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIHN0YXRlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlU3RhdGVEYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRDaGFuZ2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VUaXRsZVJhbmRvbSA9ICdJVFNNQ2hhbmdlIFJlcXVlc3RlZCAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2hhbmdlSUQgICAgICAgICAgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJENoYW5nZVRpdGxlUmFuZG9tLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdTZWxlbml1bSBUZXN0IERlc2NyaXB0aW9uJywKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnU2VsZW5pdW0gVGVzdCBKdXN0aWZpY2F0aW9uJywKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVEYXRhUmVmLT57SXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRDaGFuZ2VUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCB3b3JrIG9yZGVyIG9iamVjdAogICAgICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHdvcmsgb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyVGl0bGVSYW5kb20gPSAnU2VsZW5pdW0gV29yayBPcmRlciAnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkV29ya09yZGVySUQgICAgICAgICAgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZVJhbmRvbSwKICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAnU2VsZW5pdW0gVGVzdCBXb3JrIE9yZGVyJywKICAgICAgICAgICAgUGxhbm5lZEVmZm9ydCAgICA9PiAxMCwKICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIiRXb3JrT3JkZXJUaXRsZVJhbmRvbSBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIGxvZyBpbiB0ZXN0IHVzZXIKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCB0b29sIGJhciBNeVdvcmtPcmRlciBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQKICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcicpXSIpOwogICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNyZWF0ZWQgd29yayBvcmRlcgogICAgICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkV29ya09yZGVyVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBjcmVhdGVkIGNoYW5nZQogICAgICAgICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkQ2hhbmdlVGl0bGVSYW5kb20gaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdJVFNNQ2hhbmdlKicgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJENvbW1hbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6QWRtaW46OklUU006OkNoYW5nZTo6RGVsZXRlJyk7CgojIGNoZWNrIGNvbW1hbmQgd2l0aG91dCBvcHRpb24KbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiQWRtaW46OklUU006OkNoYW5nZTo6Q2hlY2sgLSBObyBvcHRpb25zIiwKKTsKCiNjaGVjayBjb21tYW5kIHdpdGggb3B0aW9uIC0tYWxsIGFuZCBhcmd1bWVudCAtLWFjY2VwdCBuICggY2FuY2VsIGNvbW1hbmQgKQokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tYWxsJywgJ24nICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAnLS1hbGwnIG4iLAopOwoKIyBnZXQgY2hhbmdlIG9iamVjdApteSAkQ2hhbmdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKTsKbXkgQENoYW5nZU51bWJlcnM7CgojIGFkZCB0ZXN0IGNoYW5nZXMKZm9yICggMSAuLiAzICkgewoKICAgIG15ICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgY2hhbmdlIGlzIGNyZWF0ZWQgLSAkQ2hhbmdlLT57Q2hhbmdlTnVtYmVyfSIsCiAgICApOwoKICAgIHB1c2ggQENoYW5nZU51bWJlcnMsICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9Owp9CgojIGNoZWNrIGNvbW1hbmQgd2l0aCBvcHRpb24gLS1jaGFuZ2UtbnVtYmVyIHdpdGhvdXQgc3BlY2lmaWVkIGNoYW5nZSBudW1iZXIKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoJy0tY2hhbmdlLW51bWJlcicpOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMSwKICAgICJPcHRpb24gJy0tY2hhbmdlLW51bWJlcicgd2l0aG91dCBzcGVjaWZpZWQgY2hhbmdlIG51bWJlci4iLAopOwoKIyBjaGVjayBjb21tYW5kIHdpdGggb3B0aW9uIC0tY2hhbmdlLW51bWJlciB3aXRoIHNwZWNpZmllZCBjaGFuZ2UgbnVtYmVycwokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgKICAgICctLWNoYW5nZS1udW1iZXInLCAkQ2hhbmdlTnVtYmVyc1swXSwgJy0tY2hhbmdlLW51bWJlcicsICRDaGFuZ2VOdW1iZXJzWzFdLAogICAgJy0tY2hhbmdlLW51bWJlcicsICRDaGFuZ2VOdW1iZXJzWzJdLAopOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJPcHRpb24gJy0tY2hhbmdlLW51bWJlcicgd2l0aCBzcGVjaWZpZWQgY2hhbmdlIG51bWJlcnMuIiwKKTsKCiMgdHJ5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgb25jZSBtb3JlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycwojIHRoZSBjaGFuZ2VzIGhhdmUgYWxyZWR5IGJlZW4gZGVsZXRlZCwgYW5kIHRoaXMgb25lcyBkbyBub3QgZXhpc3QgYW55bW9yZQokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgKICAgICctLWNoYW5nZS1udW1iZXInLCAkQ2hhbmdlTnVtYmVyc1swXSwgJy0tY2hhbmdlLW51bWJlcicsICRDaGFuZ2VOdW1iZXJzWzFdLAogICAgJy0tY2hhbmdlLW51bWJlcicsICRDaGFuZ2VOdW1iZXJzWzJdLAopOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJPcHRpb24gJy0tY2hhbmdlLW51bWJlcicgd2l0aCBzcGVjaWZpZWQgY2hhbmdlIG51bWJlcnMsIHdoaWNoIGRvIG5vdCBleGlzdHMuIiwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJENvbW1hbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6QWRtaW46OklUU006OkNoYW5nZTo6Q2hlY2snKTsKCiMgY2hlY2sgY29tbWFuZCB3aXRob3V0IG9wdGlvbgpteSAkRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSgpOwoKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMCwKICAgICJBZG1pbjo6SVRTTTo6Q2hhbmdlOjpDaGVjayAtIE5vIG9wdGlvbnMiLAopOwoKIyBjaGVjayBjb21tYW5kIHdpdGggb3B0aW9uIC0tZm9yY2UKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoJy0tZm9yY2UtcGlkJyk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAnLS1mb3JjZS1waWQnIiwKKTsKCjE7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFkbWluID0gSVRTTS5BZG1pbiB8fCB7fTsKSVRTTS5BZG1pbi5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZG1pbi5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWRtaW4uQ2hhbmdlTWFuYWdlbWVudC5DaGFuZ2VOb3RpZmljYXRpb24KICogQG1lbWJlcm9mIElUU00uQWRtaW4uQ2hhbmdlTWFuYWdlbWVudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIENoYW5nZSBOb3RpZmljYXRpb24KICovCklUU00uQWRtaW4uQ2hhbmdlTWFuYWdlbWVudC5DaGFuZ2VOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgSVRTTS5BZG1pbi5DaGFuZ2VNYW5hZ2VtZW50LkNoYW5nZU5vdGlmaWNhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1Jlc3VsdCcpKSB7CiAgICAgICAgICAgICQoJy5Ob3RpZmljYXRpb25EZWxldGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKCiAgICAgICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBub3RpZmljYXRpb24/JykpKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG9uJ3QgaW50ZXJmZXJlIHdpdGggTWFzdGVyQWN0aW9uCiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdVcGRhdGUnKSkgewogICAgICAgICAgICBpZiAoSVRTTS5BZ2VudCAmJiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQgJiYgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkV2ZW50KSB7CiAgICAgICAgICAgICAgICBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRXZlbnQuSW5pdCh7CiAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vdGlmaWNhdGlvbkxhbmd1YWdlTXNnOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIG5vdGlmaWNhdGlvbiBsYW5ndWFnZT8nKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWRtaW4uQ2hhbmdlTWFuYWdlbWVudC5DaGFuZ2VOb3RpZmljYXRpb24gfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQWRkRWRpdAogKiBAbWVtYmVyb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY2hhbmdlLW1hbmFnZW1lbnQgYWRkL2VkaXQgc2NyZWVuLgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkFkZEVkaXQgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5BZGRFZGl0CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNvbWUgYmVoYXZpb3VycyBmb3IgdGhlIGFkZC9lZGl0IHNjcmVlbi4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjQ2F0ZWdvcnlJRCcpLm9uKCdjaGFuZ2UuSVRTTUNoYW5nZU1hbmFnZW1lbnQuQ2F0ZWdvcnlJRCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NoYW5nZUZvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnQ2F0ZWdvcnlJRCcsIFsnSW1wYWN0SUQnLCAnUHJpb3JpdHlJRCddKTsKICAgICAgICB9KTsKICAgICAgICAkKCcjSW1wYWN0SUQnKS5vbignY2hhbmdlLklUU01DaGFuZ2VNYW5hZ2VtZW50LkltcGFjdElEJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ2hhbmdlRm9ybScpLCAnQUpBWFVwZGF0ZScsICdJbXBhY3RJRCcsIFsnUHJpb3JpdHlJRCddKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKCn0oSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkFkZEVkaXQgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNBQk1lbWJlclNlYXJjaAogKiBAbWVtYmVyb2YgSVRTTS5BZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIENBQiBzZWFyY2guCiAqLwpJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ0FCTWVtYmVyU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5DQUJNZW1iZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgJCgnLkNBQk1lbWJlclNlYXJjaCcpLmVhY2goZnVuY3Rpb24oaWR4LCBFbGVtZW50KXsKCiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQoRWxlbWVudCk7CgogICAgICAgICAgICBDb3JlLlVJLkF1dG9jb21wbGV0ZS5Jbml0KAogICAgICAgICAgICAgICAgJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVxdWVzdCwgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudElUU01DQUJNZW1iZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwczogQ29yZS5Db25maWcuR2V0KCdDQUJBdXRvY29tcGxldGUuR3JvdXBzJykgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IENvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgnQXV0b0NvbXBsZXRlWEhSJywgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZhbHVlRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5yZW1vdmVEYXRhKCdBdXRvQ29tcGxldGVYSFInKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLlVzZXJWYWx1ZSArICIgKCIgKyB0aGlzLlVzZXJLZXkgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVXNlclZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuVXNlclR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoVmFsdWVEYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgVXNlcktleSA9IFVJLml0ZW0ubGFiZWwucmVwbGFjZSgvLipcKCguKilcKSQvLCAnJDEnKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoVUkuaXRlbS52YWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgVXNlclNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigkRWxlbWVudC5hdHRyKCdpZCcpKSArICdTZWxlY3RlZCcpLnZhbChVc2VyS2V5KTsKICAgICAgICAgICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCRFbGVtZW50LmF0dHIoJ2lkJykpICsgJ1R5cGUnKS52YWwoVUkuaXRlbS50eXBlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdDdXN0b21lclNlYXJjaCcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIC8vIE9uIHVubG9hZCByZW1vdmUgb2xkIHNlbGVjdGVkIGRhdGEuIElmIHRoZSBwYWdlIGlzIHJlbG9hZGVkICh3aXRoIEY1KSB0aGlzIGRhdGEgc3RheXMgaW4gdGhlIGZpZWxkIGFuZCBpbnZva2VzIGFuIGFqYXggcmVxdWVzdCBvdGhlcndpc2UKICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdiZWZvcmV1bmxvYWQuQ0FCTWVtYmVyU2VhcmNoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gZXNjYXBlIHBvc3NpYmxlIGNvbG9ucyAoOikgaW4gZWxlbWVudCBpZCBiZWNhdXNlIGpRdWVyeSBjYW4gbm90IGhhbmRsZSBpdCBpbiBpZCBhdHRyaWJ1dGUgc2VsZWN0b3JzCiAgICAgICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCRFbGVtZW50LmF0dHIoJ2lkJykpICsgJ1NlbGVjdGVkJykudmFsKCcnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSk7CgogICAgICAgIH0pOwogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5DQUJNZW1iZXJTZWFyY2ggfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5BZGQKICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIGNoYW5nZS1tYW5hZ2VtZW50IGFkZCBzY3JlZW4uCiAqLwpJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ0FCVGVtcGxhdGVFZGl0ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIERlbGV0ZUNBQk1lbWJlcgogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtmYWxzZX0gUmV0dXJucyBmYWxzZSB0byBjYW5jZWwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGFuY2hvciBlbGVtZW50cy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGNhYiBtZW1iZXIgdG8gZGVsZXRlIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLgogICAgICovCiAgICBmdW5jdGlvbiBEZWxldGVDQUJNZW1iZXIoKSB7CiAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKTsKICAgICAgICB2YXIgJEZvcm0gPSAkVGhpcy5jbG9zZXN0KCdmb3JtJyk7CgogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CgogICAgICAgICQoJ2lucHV0W25hbWU9RGVsZXRlQ0FCTWVtYmVyXScsICRGb3JtKS52YWwoJFRoaXMuYXR0cignaWQnKSk7CgogICAgICAgICRGb3JtLnN1Ym1pdCgpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5DQUJUZW1wbGF0ZUVkaXQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgc29tZSBiZWhhdmlvdXJzIGZvciB0aGUgYWRkIHNjcmVlbi4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gQmluZCBlbGVtZW50cyB3aXRoIGNsYXNzICcuRGVsZXRlQ0FCTWVtYmVyJyB0byBkZWxldGUgdGhlIGNhYiBtZW1iZXIuCiAgICAgICAgJCgnLkRlbGV0ZUNBQk1lbWJlcicpLm9mZignY2xpY2suQ0FCLlRlbXBsYXRlRWRpdCcpLm9uKCdjbGljay5DQUIuVGVtcGxhdGVFZGl0JywgRGVsZXRlQ0FCTWVtYmVyKTsKCiAgICAgICAgJCgnI0J0bkFkZENBQk1lbWJlcicpLm9mZignY2xpY2suQWdlbnRJVFNNVGVtcGxhdGVFZGl0Q0FCQWRkQ0FCTWVtYmVyJykub24oJ2NsaWNrLkFnZW50SVRTTVRlbXBsYXRlRWRpdENBQkFkZENBQk1lbWJlcicsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciAkRm9ybSA9ICQoJyNBZGRDQUJNZW1iZXInKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CgogICAgICAgICAgICAkKCdpbnB1dFtuYW1lPUFkZENBQk1lbWJlcl0nLCAkRm9ybSkudmFsKCdBZGQnKTsKCiAgICAgICAgfSk7CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cgp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5DQUJUZW1wbGF0ZUVkaXQgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZGl0aW9uCiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBjaGFuZ2UtbWFuYWdlbWVudCBjb25kaXRpb24gc2NyZWVuLgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmRpdGlvbiA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBFeHByZXNzaW9uQWN0aW9uRHJvcGRvd24KICAgICAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZGl0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBFdmVudCBvYmplY3Qgb2YgbW91c2UgY2xpY2suCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBiZWhhdmlvdXJzIG9mIHRoZSBjb25kaXRpb24gYWN0aW9uL2V4cHJlc3Npb24gZHJvcGRvd25zLgogICAgICovCiAgICAgZnVuY3Rpb24gRXhwcmVzc2lvbkFjdGlvbkRyb3Bkb3duKEV2ZW50KSB7CiAgICAgICAgdmFyIEF0dHJJRCAgID0gJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgICAgIHZhciBTZWN0aW9ucyA9IEF0dHJJRC5tYXRjaCgvXiguKi1cdyspLShcdyspJC9pKTsKICAgICAgICB2YXIgSUQgICAgICAgPSBTZWN0aW9uc1sxXTsKICAgICAgICB2YXIgRHJvcGRvd24gPSBTZWN0aW9uc1syXTsKCiAgICAgICAgdmFyIFZhbGlkRHJvcGRvd25zID0gWwogICAgICAgICAgICAnT2JqZWN0SUQnLAogICAgICAgICAgICAnU2VsZWN0b3InLAogICAgICAgICAgICAnQXR0cmlidXRlSUQnLAogICAgICAgIF07CgogICAgICAgIHZhciBSZWZyZXNoRHJvcGRvd25zID0gWwogICAgICAgICAgICBJRCArICctT3BlcmF0b3JJRCcKICAgICAgICBdOwoKICAgICAgICB2YXIgTm90U2VyaWFsaXplLAogICAgICAgICAgICBGb3JtU2VyaWFsaXplZCwKICAgICAgICAgICAgVVJMU3RyaW5nOwoKICAgICAgICBpZiAoVmFsaWREcm9wZG93bnMuaW5kZXhPZihEcm9wZG93bikgPT09IC0xKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChEcm9wZG93biA9PT0gJ09iamVjdElEJykgewogICAgICAgICAgICBSZWZyZXNoRHJvcGRvd25zLnVuc2hpZnQoSUQgKyAnLUF0dHJpYnV0ZUlEJyk7CiAgICAgICAgICAgIFJlZnJlc2hEcm9wZG93bnMudW5zaGlmdChJRCArICctU2VsZWN0b3InKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoRHJvcGRvd24gPT09ICdTZWxlY3RvcicpIHsKICAgICAgICAgICAgUmVmcmVzaERyb3Bkb3ducy51bnNoaWZ0KElEICsgJy1BdHRyaWJ1dGVJRCcpOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoCiAgICAgICAgICAgICQoJyNOZXdDb25kaXRpb24nKSwKICAgICAgICAgICAgJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICBBdHRySUQsCiAgICAgICAgICAgIFJlZnJlc2hEcm9wZG93bnMKICAgICAgICApOwoKICAgICAgICBpZiAoRHJvcGRvd24gPT09ICdBdHRyaWJ1dGVJRCcpIHsKCiAgICAgICAgICAgIE5vdFNlcmlhbGl6ZSA9IEFycmF5OwogICAgICAgICAgICBOb3RTZXJpYWxpemUuU3ViYWN0aW9uID0gJ1N1YmFjdGlvbic7CiAgICAgICAgICAgIEZvcm1TZXJpYWxpemVkICAgICAgICAgPSBDb3JlLkFKQVguU2VyaWFsaXplRm9ybSgkKCcjTmV3Q29uZGl0aW9uJyksIE5vdFNlcmlhbGl6ZSk7CiAgICAgICAgICAgIFVSTFN0cmluZyA9IFsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICc/JywKICAgICAgICAgICAgICAgIEZvcm1TZXJpYWxpemVkLAogICAgICAgICAgICAgICAgJ1N1YmFjdGlvbj1BSkFYQ29udGVudFVwZGF0ZTsnLAogICAgICAgICAgICAgICAgJ1VwZGF0ZURpdk5hbWU9JyArIElEICsgJy0nICsgRXZlbnQuZGF0YS5BdHRyaWJ1dGVJRFVwZGF0ZURpdk5hbWUgKyAnOycsCiAgICAgICAgICAgICAgICAnRWxlbWVudENoYW5nZWQ9JyArIElEICsgJy1BdHRyaWJ1dGVJRDsnCiAgICAgICAgICAgIF0uam9pbignJyk7CgogICAgICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICQoJyMnICsgSUQgKyAnLScgKyBFdmVudC5kYXRhLkF0dHJpYnV0ZUlEVXBkYXRlRGl2TmFtZSksCiAgICAgICAgICAgICAgICBVUkxTdHJpbmcsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7fQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5uZXh0KCd0ZCcpLmZpbmQoJ3NlbGVjdCcpLmZvY3VzKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2V0U3VibWl0QWN0aW9uCiAgICAgKiBAbWVtYmVyb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmRpdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRXZlbnQgb2JqZWN0IG9mIG1vdXNlIGNsaWNrLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYWN0aW9uIG9mIHRoZSBjbGlja2VkIGJ1dHRvbiBiZWZvcmUgdGhlIGZvcm0gaXMgc3VibWl0dGVkLgogICAgICovCiAgICBmdW5jdGlvbiBTZXRTdWJtaXRBY3Rpb24oKSB7CiAgICAgICAgdmFyICRUaGlzICAgPSAkKHRoaXMpOwogICAgICAgIHZhciBBY3Rpb25zID0gewogICAgICAgICAgICAnQWRkRXhwcmVzc2lvbic6ICcwJywKICAgICAgICAgICAgJ0FkZEFjdGlvbicgICAgOiAnMCcsCiAgICAgICAgICAgICdTYXZlJyAgICAgICAgIDogJzAnCiAgICAgICAgfTsKCiAgICAgICAgdmFyIFNldEFjdGlvbiA9ICRUaGlzLmF0dHIoJ2lkJyk7CiAgICAgICAgU2V0QWN0aW9uID0gU2V0QWN0aW9uLnJlcGxhY2UoL0J1dHRvbiQvaSwgJycpOwogICAgICAgIGlmICghQWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShTZXRBY3Rpb24pKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIEFjdGlvbnNbU2V0QWN0aW9uXSA9ICcxJzsKCiAgICAgICAgJC5lYWNoKEFjdGlvbnMsIGZ1bmN0aW9uKEFjdGlvbiwgVmFsdWUpIHsKICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT0nICsgQWN0aW9uICsgJ10nKS52YWwoVmFsdWUpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZGl0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNvbWUgYmVoYXZpb3VycyBmb3IgdGhlIGFkZCBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gQmluZCBFeHByZXNzaW9uIGRyb3Bkb3ducwogICAgICAgICQoJ3NlbGVjdFtuYW1lXj0iRXhwcmVzc2lvbklELSJdJykub24oCiAgICAgICAgICAgICdjaGFuZ2UuQ29uZGl0aW9uRXhwcmVzc2lvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICdBdHRyaWJ1dGVJRFVwZGF0ZURpdk5hbWUnOiAnQ29tcGFyZVZhbHVlLURpdicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwcmVzc2lvbkFjdGlvbkRyb3Bkb3duCiAgICAgICAgKTsKCiAgICAgICAgLy8gQmluZCBBY3Rpb24gZHJvcGRvd25zCiAgICAgICAgJCgnc2VsZWN0W25hbWVePSJBY3Rpb25JRC0iXScpLm9uKAogICAgICAgICAgICAnY2hhbmdlLkNvbmRpdGlvbkFjdGlvbicsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICdBdHRyaWJ1dGVJRFVwZGF0ZURpdk5hbWUnOiAnQWN0aW9uVmFsdWUtRGl2JwogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHByZXNzaW9uQWN0aW9uRHJvcGRvd24KICAgICAgICApOwoKICAgICAgICAkKCcuQ2FsbEZvckFjdGlvbicpLm9uKCdjbGljay5TdWJtaXRBY3Rpb24nLCBTZXRTdWJtaXRBY3Rpb24pOwoKICAgICAgICAkKCcuRGVsZXRlRXhwcmVzc2lvbicpLm9uKCdjbGljay5Db25kaXRpb25EZWxldGVFeHByZXNzaW9uJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBpZiAoIXdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgZXhwcmVzc2lvbj8nKSkpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKCcjRGVsZXRlRXhwcmVzc2lvbklEJykudmFsKCQodGhpcykuYXR0cignaWQnKS5yZXBsYWNlKC9EZWxldGVFeHByZXNzaW9uSUQtLywgJycpKTsKICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkRlbGV0ZUFjdGlvbicpLm9uKCdjbGljay5Db25kaXRpb25EZWxldGVBY3Rpb24nLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGlmICghd2luZG93LmNvbmZpcm0oQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBhY3Rpb24/JykpKSB7CiAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJCgnI0RlbGV0ZUFjdGlvbklEJykudmFsKCQodGhpcykuYXR0cignaWQnKS5yZXBsYWNlKC9EZWxldGVBY3Rpb25JRC0vLCAnJykpOwogICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCcuRGVsZXRlQ29uZGl0aW9uJykub24oJ2NsaWNrLkNvbmRpdGlvbkRlbGV0ZScsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbmRpdGlvbj8nKSkpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKCiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cgp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Db25kaXRpb24gfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZmlybURpYWxvZwogKiBAbWVtYmVyb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY2hhbmdlLW1hbmFnZW1lbnQgYWRkL2VkaXQgc2NyZWVuLgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LkNvbmZpcm1EaWFsb2cgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Db25maXJtRGlhbG9nCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW51IGl0ZW1zIHRoYXQgc2hvdWxkIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nCiAgICAgKiAgICAgIGluIFpvb20gYW5kIFdvcmtPcmRlciBab29tLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBJVFNNU2hvd0NvbmZpcm1EaWFsb2cgPSBDb3JlLkNvbmZpZy5HZXQoJ0lUU01TaG93Q29uZmlybURpYWxvZycpIHx8IHt9OwogICAgICAgICQuZWFjaChJVFNNU2hvd0NvbmZpcm1EaWFsb2csIGZ1bmN0aW9uKEtleSwgRGF0YSkgewogICAgICAgICAgICBJVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cuQmluZENvbmZpcm1EaWFsb2coewogICAgICAgICAgICAgICAgRWxlbWVudElEOiAgICAgICAgICAgICAgICAgIERhdGEuTWVudUlELAogICAgICAgICAgICAgICAgRWxlbWVudFNlbGVjdG9yOiAgICAgICAgICAgIERhdGEuRWxlbWVudFNlbGVjdG9yLAogICAgICAgICAgICAgICAgRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nOiAgIERhdGEuRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nLAogICAgICAgICAgICAgICAgQ29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmc6IERhdGEuQ29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmcsCiAgICAgICAgICAgICAgICBEaWFsb2dUaXRsZTogICAgICAgICAgICAgICAgRGF0YS5EaWFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0ZWRUZXh0OiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgWWVzOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgiWWVzIiksCiAgICAgICAgICAgICAgICAgICAgTm86ICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgiTm8iKSwKICAgICAgICAgICAgICAgICAgICBPazogIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCJPayIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwoKfShJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuQ29uZmlybURpYWxvZyB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lkludm9sdmVkUGVyc29ucwogKiBAbWVtYmVyb2YgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgSW52b2x2ZWQgUGVyc29ucyBtb2R1bGUuCiAqLwpJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuSW52b2x2ZWRQZXJzb25zID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNldEZvcm1BY3Rpb24KICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lkludm9sdmVkUGVyc29ucwogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmb3JtIGFjdGlvbiB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC4KICAgICAqLwogICAgZnVuY3Rpb24gU2V0Rm9ybUFjdGlvbigpIHsKICAgICAgICB2YXIgJFRoaXMgPSAkKHRoaXMpOwogICAgICAgIHZhciAkRm9ybSA9ICRUaGlzLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICB2YXIgQWN0aW9ucyA9IHsKICAgICAgICAgICAgJ1N1Ym1pdCcgICAgICAgIDogJzAnLAogICAgICAgICAgICAnQWRkQ0FCVGVtcGxhdGUnOiAnMCcsCiAgICAgICAgICAgICdOZXdUZW1wbGF0ZScgICA6ICcwJywKICAgICAgICAgICAgJ0FkZENBQk1lbWJlcicgIDogJzAnCiAgICAgICAgfTsKCiAgICAgICAgdmFyIFNldEFjdGlvbiA9ICRUaGlzLmF0dHIoJ2lkJyk7CiAgICAgICAgU2V0QWN0aW9uID0gU2V0QWN0aW9uLnJlcGxhY2UoL0J1dHRvbiQvaSwgJycpOwogICAgICAgIGlmIChTZXRBY3Rpb24gIT09ICdTdWJtaXQnKSB7CiAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGlvbnMuaGFzT3duUHJvcGVydHkoU2V0QWN0aW9uKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBBY3Rpb25zW1NldEFjdGlvbl0gPSAnMSc7CgogICAgICAgICQuZWFjaChBY3Rpb25zLCBmdW5jdGlvbihBY3Rpb24sIFZhbHVlKSB7CiAgICAgICAgICAgICQoJ2lucHV0W25hbWU9JyArIEFjdGlvbiArICddJywgJEZvcm0pLnZhbChWYWx1ZSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgRGVsZXRlQ0FCTWVtYmVyCiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5JbnZvbHZlZFBlcnNvbnMKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge2ZhbHNlfSBSZXR1cm5zIGZhbHNlIHRvIGNhbmNlbCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgYW5jaG9yIGVsZW1lbnRzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY2FiIG1lbWJlciB0byBkZWxldGUgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIERlbGV0ZUNBQk1lbWJlcigpIHsKICAgICAgICB2YXIgJFRoaXMgPSAkKHRoaXMpOwogICAgICAgIHZhciAkRm9ybSA9ICRUaGlzLmNsb3Nlc3QoJ2Zvcm0nKTsKCiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkKCdpbnB1dFtuYW1lPURlbGV0ZUNBQk1lbWJlcl0nLCAkRm9ybSkudmFsKCRUaGlzLmF0dHIoJ2lkJykpOwogICAgICAgICRGb3JtLnN1Ym1pdCgpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lkludm9sdmVkUGVyc29ucwogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBzb21lIGJlaGF2aW91cnMgZm9yIHRoZSBpbnZvbHZlZC1wZXJzb25zIHNjcmVlbi4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gQmluZCBlbGVtZW50cyB3aXRoIGNsYXNzICcuQ2FsbEZvckFjdGlvbicgdG8gc2V0IHRoZSBwcm9wZXIgZm9ybSBhY3Rpb24KICAgICAgICAvLyBiZWZvcmUgdGhlIGZvcm0gc3VibWl0cy4KICAgICAgICAkKCcuQ2FsbEZvckFjdGlvbicpLm9mZignY2xpY2suRm9ybUFjdGlvbi5JbnZvbHZlZFBlcnNvbnMnKS5vbignY2xpY2suRm9ybUFjdGlvbi5JbnZvbHZlZFBlcnNvbnMnLCBTZXRGb3JtQWN0aW9uKTsKCiAgICAgICAgLy8gQmluZCBlbGVtZW50cyB3aXRoIGNsYXNzICcuRGVsZXRlQ0FCTWVtYmVyJyB0byBkZWxldGUgdGhlIGNhYiBtZW1iZXIuCiAgICAgICAgJCgnLkRlbGV0ZUNBQk1lbWJlcicpLm9mZignY2xpY2suQ0FCLkludm9sdmVkUGVyc29ucycpLm9uKCdjbGljay5DQUIuSW52b2x2ZWRQZXJzb25zJywgRGVsZXRlQ0FCTWVtYmVyKTsKCiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cgp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5JbnZvbHZlZFBlcnNvbnMgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkV2ZW50CiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBOb3RpZmljYXRpb24gRXZlbnQgbW9kdWxlLgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkV2ZW50ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Ob3RpZmljYXRpb25FdmVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSW5pdGlhbGl6YXRpb24gYW5kIGludGVybmF0aW9uYWxpemF0aW9uIHBhcmFtZXRlcnMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGNvcnJlY3RseSBhbGwgb3RoZXIgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBsYW5ndWFnZS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uIChQYXJhbXMpIHsKCiAgICAgICAgVGFyZ2V0TlMuTG9jYWxpemF0aW9uID0gUGFyYW1zLkxvY2FsaXphdGlvbjsKCiAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byBhZGQgYnV0dG9uCiAgICAgICAgJCgnLkxhbmd1YWdlQWRkJykub2ZmKCdjaGFuZ2UuTGFuZ3VhZ2VBZGQnKS5vbignY2hhbmdlLkxhbmd1YWdlQWRkJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgVGFyZ2V0TlMuQWRkTGFuZ3VhZ2UoJCh0aGlzKSwgJCh0aGlzKS52YWwoKSwgJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS50ZXh0KCkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGJpbmQgY2xpY2sgZnVuY3Rpb24gdG8gcmVtb3ZlIGJ1dHRvbgogICAgICAgICQoJy5MYW5ndWFnZVJlbW92ZScpLm9mZignY2xpY2suTGFuZ3VhZ2VSZW1vdmUnKS5vbignY2xpY2suTGFuZ3VhZ2VSZW1vdmUnLCBmdW5jdGlvbigpewogICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oVGFyZ2V0TlMuTG9jYWxpemF0aW9uLkRlbGV0ZU5vdGlmaWNhdGlvbkxhbmd1YWdlTXNnKSkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVtb3ZlTGFuZ3VhZ2UoJCh0aGlzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfTsKCiAgIC8qKgogICAgICogQG5hbWUgQWRkTGFuZ3VhZ2UKICAgICAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRXZlbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IE9iamVjdCAtIEpRdWVyeSBvYmplY3QgdXNlZCB0byByZW1vdmUgdGhlIGxhbmd1YWdlIGJsb2NrCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gTGFuZ3VhZ2VJRCAtIHNob3J0IG5hbWUgb2YgdGhlIGxhbmd1YWdlIGxpa2UgZXNfTVguCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gTGFuZ3VhZ2UgLSBmdWxsIG5hbWUgb2YgdGhlIGxhbmd1YWdlIGxpa2UgU3BhbmlzaCAoTWV4aWNvKS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUeXBlIC0gQWdlbnQgb3IgQ3VzdG9tZXIuCiAgICAgKiBAcmV0dXJucyB7Qm9vbH0gUmV0dXJucyBmYWxzZSB0byBwcmV2ZW50IGV2ZW50IGJ1YmJsaW5nLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgbmV3IG5vdGlmaWNhdGlvbiBldmVudCBsYW5ndWFnZS4KICAgICAqLwogICAgVGFyZ2V0TlMuQWRkTGFuZ3VhZ2UgPSBmdW5jdGlvbihPYmplY3QsIExhbmd1YWdlSUQsIExhbmd1YWdlKXsKCiAgICAgICAgdmFyICRDbG9uZSA9ICQoJy5UZW1wbGF0ZScpLmNsb25lKCksCiAgICAgICAgICAgIFR5cGU7CgogICAgICAgIGlmIChMYW5ndWFnZSA9PT0gJy0nKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKE9iamVjdC5hdHRyKCdpZCcpID09PSAnQWdlbnRMYW5ndWFnZUFkZCcpIHsKICAgICAgICAgICAgVHlwZSA9ICdBZ2VudCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKE9iamVjdC5hdHRyKCdpZCcpID09PSAnQ3VzdG9tZXJMYW5ndWFnZUFkZCcpIHsKICAgICAgICAgICAgVHlwZSA9ICdDdXN0b21lcic7CiAgICAgICAgfQoKICAgICAgICAvLyByZW1vdmUgdW5uZWNlc3NhcnkgY2xhc3NlcwogICAgICAgICRDbG9uZS5yZW1vdmVDbGFzcygnSGlkZGVuIFRlbXBsYXRlJyk7CgogICAgICAgIC8vIGFkZCB0aXRsZQogICAgICAgICRDbG9uZS5maW5kKCcuVGl0bGUnKS5odG1sKExhbmd1YWdlKTsKCiAgICAgICAgLy8gdXBkYXRlIHJlbW92ZSBsaW5rCiAgICAgICAgJENsb25lLmZpbmQoJyNUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUnKS5hZGRDbGFzcyhUeXBlICsgJ0xhbmd1YWdlUmVtb3ZlJyk7CiAgICAgICAgJENsb25lLmZpbmQoJyNUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUnKS5hdHRyKCduYW1lJywgVHlwZSArICdfJyArIExhbmd1YWdlSUQgKyAnX0xhbmd1YWdlX1JlbW92ZScpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfTGFuZ3VhZ2VfUmVtb3ZlJykuYXR0cignaWQnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfTGFuZ3VhZ2VfUmVtb3ZlJyk7CgogICAgICAgIC8vIHNldCBoaWRkZW4gbGFuZ3VhZ2UgZmllbGQKICAgICAgICAkQ2xvbmUuZmluZCgnLkxhbmd1YWdlSUQnKS5hdHRyKCduYW1lJywgVHlwZSArICdfJyArICdMYW5ndWFnZUlEJyk7CiAgICAgICAgJENsb25lLmZpbmQoJy5MYW5ndWFnZUlEJykudmFsKExhbmd1YWdlSUQpOwoKICAgICAgICAvLyB1cGRhdGUgc3ViamVjdCBsYWJlbAogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfTGFiZWxfU3ViamVjdCcpLmF0dHIoJ2ZvcicsIFR5cGUgKyAnXycgKyBMYW5ndWFnZUlEICsgJ19TdWJqZWN0Jyk7CiAgICAgICAgJENsb25lLmZpbmQoJyNUZW1wbGF0ZV9MYWJlbF9TdWJqZWN0JykuYXR0cignaWQnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfTGFiZWxfU3ViamVjdCcpOwoKICAgICAgICAvLyB1cGRhdGUgc3ViamVjdCBmaWVsZAogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfU3ViamVjdCcpLmF0dHIoJ25hbWUnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfU3ViamVjdCcpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfU3ViamVjdCcpLmFkZENsYXNzKCdWYWxpZGF0ZV9SZXF1aXJlZCcpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfU3ViamVjdCcpLmF0dHIoJ2lkJywgVHlwZSArICdfJyArIExhbmd1YWdlSUQgKyAnX1N1YmplY3QnKTsKICAgICAgICAkQ2xvbmUuZmluZCgnI1RlbXBsYXRlX1N1YmplY3RFcnJvcicpLmF0dHIoJ2lkJywgVHlwZSArICdfJyArIExhbmd1YWdlSUQgKyAnX1N1YmplY3RFcnJvcicpOwoKICAgICAgICAvLyB1cGRhdGUgYm9keSBsYWJlbAogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfTGFiZWxfQm9keScpLmF0dHIoJ2ZvcicsIFR5cGUgKyAnXycgKyBMYW5ndWFnZUlEICsgJ19Cb2R5Jyk7CiAgICAgICAgJENsb25lLmZpbmQoJyNUZW1wbGF0ZV9MYWJlbF9Cb2R5JykuYXR0cignaWQnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfTGFiZWxfQm9keScpOwoKICAgICAgICAvLyB1cGRhdGUgYm9keSBmaWVsZAogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfQm9keScpLmF0dHIoJ25hbWUnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfQm9keScpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfQm9keScpLmFkZENsYXNzKCdSaWNoVGV4dCcpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfQm9keScpLmFkZENsYXNzKCdWYWxpZGF0ZV9SZXF1aXJlZFJpY2hUZXh0Jyk7CiAgICAgICAgJENsb25lLmZpbmQoJyNUZW1wbGF0ZV9Cb2R5JykuYXR0cignaWQnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfQm9keScpOwogICAgICAgICRDbG9uZS5maW5kKCcjVGVtcGxhdGVfQm9keUVycm9yJykuYXR0cignaWQnLCBUeXBlICsgJ18nICsgTGFuZ3VhZ2VJRCArICdfQm9keUVycm9yJyk7CgogICAgICAgIC8vIGFwcGVuZCB0byBjb250YWluZXIKICAgICAgICAkKCcjJyArIFR5cGUgKyAnTm90aWZpY2F0aW9uTGFuZ3VhZ2VDb250YWluZXInKS5hcHBlbmQoJENsb25lKTsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmljaCB0ZXh0IGVkaXRvciBpZiBzZXQKICAgICAgICBpZiAocGFyc2VJbnQoQ29yZS5Db25maWcuR2V0KCdSaWNoVGV4dFNldCcpLCAxMCkgPT09IDEpIHsKICAgICAgICAgICAgQ29yZS5VSS5SaWNoVGV4dEVkaXRvci5Jbml0QWxsRWRpdG9ycygpOwogICAgICAgIH0KCiAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uCiAgICAgICAgJCgnLkxhbmd1YWdlUmVtb3ZlJykub2ZmKCdjbGljay5MYW5ndWFnZVJlbW92ZScpLm9uKCdjbGljay5MYW5ndWFnZVJlbW92ZScsIGZ1bmN0aW9uKCl7CgogICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oVGFyZ2V0TlMuTG9jYWxpemF0aW9uLkRlbGV0ZU5vdGlmaWNhdGlvbkxhbmd1YWdlTXNnKSkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVtb3ZlTGFuZ3VhZ2UoJCh0aGlzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBUYXJnZXROUy5MYW5ndWFnZVNlbGVjdGlvblJlYnVpbGQoVHlwZSk7CgogICAgICAgIENvcmUuVUkuSW5pdFdpZGdldEFjdGlvblRvZ2dsZSgpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVtb3ZlTGFuZ3VhZ2UKICAgICAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRXZlbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IE9iamVjdCAtIEpRdWVyeSBvYmplY3QgdXNlZCB0byByZW1vdmUgdGhlIGxhbmd1YWdlIGJsb2NrCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGEgbm90aWZpY2F0aW9uIGV2ZW50IGxhbmd1YWdlLgogICAgICovCiAgICBUYXJnZXROUy5SZW1vdmVMYW5ndWFnZSA9IGZ1bmN0aW9uIChPYmplY3QpIHsKCiAgICAgICAgdmFyIFR5cGU7CgogICAgICAgIE9iamVjdC5jbG9zZXN0KCcuTm90aWZpY2F0aW9uTGFuZ3VhZ2UnKS5yZW1vdmUoKTsKCiAgICAgICAgaWYgKE9iamVjdC5oYXNDbGFzcygnQWdlbnRMYW5ndWFnZVJlbW92ZScpKSB7CiAgICAgICAgICAgIFR5cGUgPSAnQWdlbnQnOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChPYmplY3QuaGFzQ2xhc3MoJ0N1c3RvbWVyTGFuZ3VhZ2VSZW1vdmUnKSkgewogICAgICAgICAgICBUeXBlID0gJ0N1c3RvbWVyJzsKICAgICAgICB9CgogICAgICAgIFRhcmdldE5TLkxhbmd1YWdlU2VsZWN0aW9uUmVidWlsZChUeXBlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBMYW5ndWFnZVNlbGVjdGlvblJlYnVpbGQKICAgICAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRXZlbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IFR5cGUgLSBBZ2VudCBvciBDdXN0b21lci4KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIHRydWUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZWJ1aWxkcyBsYW5ndWFnZSBzZWxlY3Rpb24sIG9ubHkgc2hvdyBhdmFpbGFibGUgbGFuZ3VhZ2VzLgogICAgICovCiAgICBUYXJnZXROUy5MYW5ndWFnZVNlbGVjdGlvblJlYnVpbGQgPSBmdW5jdGlvbiAoVHlwZSkgewoKICAgICAgICB2YXIgJE9yaWdPcHRpb25zID0gJCgnIycgKyBUeXBlICsgJ0xhbmd1YWdlT3JpZyBvcHRpb24nKS5jbG9uZSgpOwoKICAgICAgICAvLyBSZW1vdmUgdGhlIGV4aXN0aW5nIG9wdGlvbnMgaW4gb3JkZXIgdG8gcmVidWlsZCBpdCBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0IG9mIG9wdGlvbnMuCiAgICAgICAgJCgnIycgKyBUeXBlICsgJ0xhbmd1YWdlQWRkIG9wdGlvbicpLnJlbW92ZSgpOwogICAgICAgICQuZWFjaCgkT3JpZ09wdGlvbnMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoISQoJyMnICsgVHlwZSArICdOb3RpZmljYXRpb25MYW5ndWFnZUNvbnRhaW5lciBsYWJlbCMnICsgVHlwZSArICdfJyArICQodGhpcykudmFsKCkgKyAnX0xhYmVsX1N1YmplY3QnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICQoJyMnICsgVHlwZSArICdMYW5ndWFnZUFkZCcpLmFwcGVuZCgkKHRoaXMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAkKCcjJyArIFR5cGUgKyAnTGFuZ3VhZ2VBZGQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Ob3RpZmljYXRpb25FdmVudCB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuT3ZlcnZpZXcKICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbmZpZyBpdGVtIG92ZXJ2aWV3IG5hdmJhci4KICovCklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5PdmVydmlldyA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Lk92ZXJ2aWV3CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNvbWUgYmVoYXZpb3VycyBmb3IgdGhlIHNlcmNoIGFuZCBvdmVydmlldyBzY3JlZW5zLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBJVFNNQ2hhbmdlTWdtdENoYW5nZVNlYXJjaCA9IENvcmUuQ29uZmlnLkdldCgnSVRTTUNoYW5nZU1nbXRDaGFuZ2VTZWFyY2gnKTsKCiAgICAgICAgLy8gQmluZCBidXR0b24gdG8gb3BlbiB0aGUgY29udGV4dCBzZXR0aW5ncyBkaWFsb2cuCiAgICAgICAgJCgnI1Nob3dDb250ZXh0U2V0dGluZ3NEaWFsb2cnKS5vbignY2xpY2suQ29udGV4dFNldHRpbmdzJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCQoJyNDb250ZXh0U2V0dGluZ3NEaWFsb2dDb250YWluZXInKSwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoIlNldHRpbmdzIiksICcyMCUnLCAnQ2VudGVyJywgdHJ1ZSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgiU3VibWl0IiksCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdTdWJtaXQnLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApOwogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBPbiByb3cgY2xpY2sgZ28gdGhlIGNoYW5nZSB6b29tLgogICAgICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgdmFyICRNYXN0ZXJBY3Rpb25MaW5rID0gJCh0aGlzKS5maW5kKCcuTWFzdGVyQWN0aW9uTGluaycpOwogICAgICAgICAgICAvLyBvbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkKICAgICAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gSW4gc2VhcmNoIHJlc3VsdHMgYmluZCB0aGUgYnV0dG9uICdDaGFuZ2Ugc2VhcmNoIG9wdGlvbnMnIHRvIG9wZW4gdGhlIHNlYXJjaCBkaWFsb2cuCiAgICAgICAgaWYgKElUU01DaGFuZ2VNZ210Q2hhbmdlU2VhcmNoKSB7CiAgICAgICAgICAgICQoJyNDaGFuZ2VTZWFyY2gnKS5vbignY2xpY2suQ2hhbmdlU2VhcmNoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaC5PcGVuU2VhcmNoRGlhbG9nKAogICAgICAgICAgICAgICAgICAgICdBZ2VudElUU01DaGFuZ2VTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKElUU01DaGFuZ2VNZ210Q2hhbmdlU2VhcmNoLlByb2ZpbGUpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cgp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5PdmVydmlldyB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5TZWFyY2gKICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIENoYW5nZU1hbmFnZW1lbnQgc2VhcmNoLgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIEFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkCiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5TZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJlYnVpbGRzIHRoZSBzZWxlY3Rpb24gZHJvcGRvd24gYWZ0ZXIgY2hvb3Npbmcgb3IgZGVsZXRpbmcgYW4gYWRkaXRpb25hbCBzZWxlY3Rpb24uCiAgICAgKi8KICAgIFRhcmdldE5TLkFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAvLyBnZXQgb3JpZ2luYWwgc2VsZWN0aW9uIHdpdGggYWxsIHBvc3NpYmxlIGZpZWxkcyBhbmQgY2xvbmUgaXQKICAgICAgICB2YXIgJEF0dHJpYnV0ZUNsb25lID0gJCgnI0F0dHJpYnV0ZU9yaWcgb3B0aW9uJykuY2xvbmUoKSwKICAgICAgICAgICAgJEF0dHJpYnV0ZVNlbGVjdGlvbiA9ICQoJyNBdHRyaWJ1dGUnKS5lbXB0eSgpLAogICAgICAgICAgICBWYWx1ZTsKCiAgICAgICAgLy8gc3RyaXAgYWxsIGFscmVhZHkgdXNlZCBhdHRyaWJ1dGVzCiAgICAgICAgJEF0dHJpYnV0ZUNsb25lLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBWYWx1ZSA9IENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCQodGhpcykuYXR0cigndmFsdWUnKSk7CiAgICAgICAgICAgIGlmICghJCgnI1NlYXJjaEluc2VydCBsYWJlbCNMYWJlbCcgKyBWYWx1ZSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkQXR0cmlidXRlU2VsZWN0aW9uLmFwcGVuZCgkKHRoaXMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAkQXR0cmlidXRlU2VsZWN0aW9uLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFNlYXJjaEF0dHJpYnV0ZUFkZAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBBdHRyaWJ1dGUgdG8gYWRkLgogICAgICogQHJldHVybnMge0Jvb2x9IHJldHVybnMgRmFsc2UgdG8gY2FuY2VsIGRlZmF1bHQgbGluayBiZWhhdmlvdXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgb25lIGF0dHJpYnV0ZXMgZm9yIHRoZSBzZWFyY2guCiAgICAgKi8KICAgIFRhcmdldE5TLlNlYXJjaEF0dHJpYnV0ZUFkZCA9IGZ1bmN0aW9uIChBdHRyaWJ1dGUpIHsKICAgICAgICB2YXIgJExhYmVsID0gJCgnI1NlYXJjaEF0dHJpYnV0ZXNIaWRkZW4gbGFiZWwjTGFiZWwnICsgQXR0cmlidXRlKTsKCiAgICAgICAgaWYgKCRMYWJlbC5sZW5ndGgpIHsKICAgICAgICAgICAgJExhYmVsLnByZXYoKS5jbG9uZSgpLmFwcGVuZFRvKCcjU2VhcmNoSW5zZXJ0Jyk7CiAgICAgICAgICAgICRMYWJlbC5jbG9uZSgpLmFwcGVuZFRvKCcjU2VhcmNoSW5zZXJ0Jyk7CiAgICAgICAgICAgICRMYWJlbC5uZXh0KCkuY2xvbmUoKS5hcHBlbmRUbygnI1NlYXJjaEluc2VydCcpCgogICAgICAgICAgICAgICAgLy8gYmluZCBjbGljayBmdW5jdGlvbiB0byByZW1vdmUgYnV0dG9uIG5vdwogICAgICAgICAgICAgICAgLmZpbmQoJy5SZW1vdmVCdXR0b24nKS5vZmYoJ2NsaWNrLlJlbW92ZVNlYXJjaEF0dHJpYnV0ZScpLm9uKCdjbGljay5SZW1vdmVTZWFyY2hBdHRyaWJ1dGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRFbGVtZW50ID0gJCh0aGlzKS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TZWFyY2hBdHRyaWJ1dGVSZW1vdmUoJEVsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gc2V0IGF1dG9jb21wbGUgdG8gY3VzdG9tZXIgdHlwZSBmaWVsZHMKICAgICAgICAgICAgJCgnI1NlYXJjaEluc2VydCcpLmZpbmQoJy5JVFNNQ3VzdG9tZXJTZWFyY2gnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgSW5wdXRJRCA9ICQodGhpcykuYXR0cignbmFtZScpICsgJ0N1c3RvbWVyQXV0b2NvbXBsZXRlJzsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ0lUU01DdXN0b21lclNlYXJjaCcpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdpZCcsIElucHV0SUQpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5wcmV2KCkuYXR0cignaWQnLCBJbnB1dElEICsgJ1NlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICBJVFNNLkFnZW50LkN1c3RvbWVyU2VhcmNoLkluaXQoJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihJbnB1dElEKSkpOwoKICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZGlhbG9nIGNsb3N1cmUgd2hlbiBzZWxlY3QgYSBjdXN0b21lciBmcm9tIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAkKCd1bC51aS1hdXRvY29tcGxldGUnKS5vZmYoJ2NsaWNrLklUU01DdXN0b21lclNlYXJjaCcpLm9uKCdjbGljay5JVFNNQ3VzdG9tZXJTZWFyY2gnLCBmdW5jdGlvbihFdmVudCl7CiAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gc2V0IGF1dG9jb21wbGUgdG8gdXNlciB0eXBlIGZpZWxkcwogICAgICAgICAgICAkKCcjU2VhcmNoSW5zZXJ0JykuZmluZCgnLklUU01Vc2VyU2VhcmNoJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIElucHV0SUQgPSAkKHRoaXMpLmF0dHIoJ25hbWUnKSArICdVc2VyQXV0b2NvbXBsZXRlJzsKICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ0lUU01Vc2VyU2VhcmNoJyk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2lkJywgSW5wdXRJRCk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnByZXYoKS5hdHRyKCdpZCcsIElucHV0SUQgKyAnU2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Vc2VyU2VhcmNoLkluaXQoJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihJbnB1dElEKSkpOwoKICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZGlhbG9nIGNsb3N1cmUgd2hlbiBzZWxlY3QgYSBjdXN0b21lciBmcm9tIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAkKCd1bC51aS1hdXRvY29tcGxldGUnKS5vZmYoJ2NsaWNrLklUU01Vc2VyU2VhcmNoJykub24oJ2NsaWNrLklUU01Vc2VyU2VhcmNoJywgZnVuY3Rpb24oRXZlbnQpewogICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIE1vZGVybml6ZSBmaWVsZHMKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcjU2VhcmNoSW5zZXJ0JykpOwoKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQgZm9yIHRyZWUgc2VsZWN0aW9uIGRpYWxvZwogICAgICAgICAgICBDb3JlLlVJLlRyZWVTZWxlY3Rpb24uSW5pdFRyZWVTZWxlY3Rpb24oKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxseSBkaXNwbGF5IGR5bmFtaWMgZmllbGRzIHdpdGggVHJlZU1vZGUgPSAxIGNvcnJlY3RseQogICAgICAgICAgICBDb3JlLlVJLlRyZWVTZWxlY3Rpb24uSW5pdER5bmFtaWNGaWVsZFRyZWVWaWV3UmVzdG9yZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFNlYXJjaEF0dHJpYnV0ZVJlbW92ZQogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgZm9ybSAgb3IgYW55IGVsZW1lbnQKICAgICAqICAgICAgd2l0aGluIHRoaXMgZm9ybSBjaGVjay4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZSBhdHRyaWJ1dGVzIGZyb20gYW4gZWxlbWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuU2VhcmNoQXR0cmlidXRlUmVtb3ZlID0gZnVuY3Rpb24gKCRFbGVtZW50KSB7CiAgICAgICAgJEVsZW1lbnQucHJldigpLnByZXYoKS5yZW1vdmUoKTsKICAgICAgICAkRWxlbWVudC5wcmV2KCkucmVtb3ZlKCk7CiAgICAgICAgJEVsZW1lbnQucmVtb3ZlKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNlYXJjaFByb2ZpbGVEZWxldGUKICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUHJvZmlsZSBUaGUgcHJvZmlsZSBuYW1lIHRoYXQgd2lsbCBiZSBkZWxldGUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgRGVsZXRlIGEgcHJvZmlsZSB2aWEgYW4gYWpheCByZXF1ZXN0LgogICAgICovCiAgICBmdW5jdGlvbiBTZWFyY2hQcm9maWxlRGVsZXRlKFByb2ZpbGUpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAnQUpBWFByb2ZpbGVEZWxldGUnLAogICAgICAgICAgICBQcm9maWxlOiBQcm9maWxlCiAgICAgICAgfTsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBmdW5jdGlvbiAoKSB7fQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcwogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtJbnR9IDAgaWYgbm8gdmFsdWVzIHdlcmUgZm91bmQsIDEgaWYgdmFsdWVzIHdoZXJlIHRoZXJlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2tzIGlmIGFueSB2YWx1ZXMgd2VyZSBlbnRlcmVkIGluIHRoZSBzZWFyY2guCiAgICAgKiAgICAgIElmIG5vdGhpbmcgYXQgYWxsIGV4aXN0cywgaXQgYWxlcnRzIHdpdGggdHJhbnNsYXRlZDoKICAgICAqICAgICAgIlBsZWFzZSBlbnRlciBhdCBsZWFzdCBvbmUgc2VhcmNoIHZhbHVlIG9yICogdG8gZmluZCBhbnl0aGluZyIKICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcygpIHsKICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIFNlYXJjaEZvcm0gbGFiZWxzCiAgICAgICAgdmFyIFNlYXJjaFZhbHVlRmxhZyA9IGZhbHNlOwogICAgICAgICQoJyNTZWFyY2hGb3JtIGxhYmVsJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBFbGVtZW50TmFtZSwKICAgICAgICAgICAgICAgICRFbGVtZW50OwoKICAgICAgICAgICAgLy8gdGhvc2Ugd2l0aCBJRCdzIGFyZSB1c2VkIGZvciBzZWFyY2hpbmcKICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cignaWQnKSkgewogICAgICAgICAgICAgICAgICAgIC8vIHN1YnN0cmluZyAiTGFiZWwiIChlLmcuIGZpcnN0IGZpdmUgY2hhcmFjdGVycyApIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gbGFiZWwgaWQsIHVzZSB0aGUgcmVtYWluaW5nIG5hbWUgYXMgbmFtZSBzdHJpbmcgZm9yIGFjY2Vzc2luZwogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb3JtIGlucHV0J3MgdmFsdWUKICAgICAgICAgICAgICAgICAgICBFbGVtZW50TmFtZSA9ICQodGhpcykuYXR0cignaWQnKS5zdWJzdHJpbmcoNSk7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQgPSAkKCcjU2VhcmNoRm9ybSBpbnB1dFtuYW1lPScgKyBFbGVtZW50TmFtZSArICddJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBpbnB1dCBlbGVtZW50IHdpdGggdGhlIHNlbGVjdGVkIG5hbWUKICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBuZXh0ICJzZWxlY3QiIGVsZW1lbnQgYW5kIHVzZSB0aGF0IG9uZSBmb3IgY2hlY2tpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoISRFbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudCA9ICQodGhpcykubmV4dCgpLmZpbmQoJ3NlbGVjdCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC52YWwoKSAmJiAkRWxlbWVudC52YWwoKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFZhbHVlRmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoIVNlYXJjaFZhbHVlRmxhZykgewogICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQbGVhc2UgZW50ZXIgYXQgbGVhc3Qgb25lIHNlYXJjaCB2YWx1ZSBvciAqIHRvIGZpbmQgYW55dGhpbmcuJykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU2VhcmNoVmFsdWVGbGFnOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dXYWl0aW5nRGlhbG9nCiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5TZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nIHVudGlsIHNlYXJjaCBzY3JlZW4gaXMgcmVhZHkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dXYWl0aW5nRGlhbG9nKCkgewogICAgICAgIHZhciBDb250ZW50ID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoCiAgICAgICAgICAgICdBZ2VudC9JVFNNQ29yZS9Mb2FkaW5nRGlhbG9nJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3BhblRpdGxlOiBDb3JlLkNvbmZpZy5HZXQoJ0xvYWRpbmdNc2cnKQogICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coCiAgICAgICAgICAgIENvbnRlbnQsCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnTG9hZGluZ01zZycpLAogICAgICAgICAgICAnMTBweCcsCiAgICAgICAgICAgICdDZW50ZXInLAogICAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIE9wZW5TZWFyY2hEaWFsb2cKICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQWN0aW9uIHdoaWNoIGlzIHVzZWQgaW4gZnJhbWV3b3JrIHJpZ2h0IG5vdy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQcm9maWxlIG5hbWUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1wdHlTZWFyY2ggZW1wdHkgc2VhcmNoLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgc2VhcmNoIGRpYWxvZyBhZnRlciBjbGlja2luZyBvbiAic2VhcmNoIiBidXR0b24gaW4gbmF2IGJhci4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlblNlYXJjaERpYWxvZyA9IGZ1bmN0aW9uIChBY3Rpb24sIFByb2ZpbGUsIEVtcHR5U2VhcmNoKSB7CgogICAgICAgIHZhciBSZWZlcnJlciA9IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJyksCiAgICAgICAgICAgIERhdGE7CgogICAgICAgIGlmICghQWN0aW9uKSB7CiAgICAgICAgICAgIEFjdGlvbiA9ICdBZ2VudFNlYXJjaCc7CiAgICAgICAgfQoKICAgICAgICBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246IEFjdGlvbiwKICAgICAgICAgICAgUmVmZXJyZXI6IFJlZmVycmVyLAogICAgICAgICAgICBQcm9maWxlOiBQcm9maWxlLAogICAgICAgICAgICBFbXB0eVNlYXJjaDogRW1wdHlTZWFyY2gsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0FKQVgnCiAgICAgICAgfTsKCiAgICAgICAgU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgICAgIHZhciBBdHRyaWJ1dGVzOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB3YWl0aW5nIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBkbyBub3Qgc2hvdyB0aGUgc2VhcmNoCiAgICAgICAgICAgICAgICAvLyAgZGlhbG9nIGFzIHdlbGwKICAgICAgICAgICAgICAgIGlmICghJCgnLkRpYWxvZzp2aXNpYmxlJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKEhUTUwsIENvcmUuQ29uZmlnLkdldCgnU2VhcmNoTXNnJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CgogICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBzZWFyY2ggYXR0cmlidXRlIGZpZWxkcwogICAgICAgICAgICAgICAgQXR0cmlidXRlcyA9IENvcmUuQ29uZmlnLkdldCgnSVRTTUNoYW5nZU1hbmFnZW1lbnRTZWFyY2guQXR0cmlidXRlJykgfHwge307CiAgICAgICAgICAgICAgICAkLmVhY2goQXR0cmlidXRlcywgZnVuY3Rpb24oQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICAgICAgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaC5TZWFyY2hBdHRyaWJ1dGVBZGQoQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoQXR0cmlidXRlKSk7CiAgICAgICAgICAgICAgICAgICAgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaC5BZGRpdGlvbmFsQXR0cmlidXRlU2VsZWN0aW9uUmVidWlsZCgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gaGlkZSBhZGQgdGVtcGxhdGUgYmxvY2sKICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQWRkQmxvY2snKS5oaWRlKCk7CgogICAgICAgICAgICAgICAgLy8gaGlkZSBzYXZlIGNoYW5nZXMgaW4gdGVtcGxhdGUgYmxvY2sKICAgICAgICAgICAgICAgICQoJyNTYXZlUHJvZmlsZScpLnBhcmVudCgpLmhpZGUoKS5wcmV2KCkuaGlkZSgpLnByZXYoKS5oaWRlKCk7CgogICAgICAgICAgICAgICAgLy8gc2VhcmNoIHByb2ZpbGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgICAgIGlmICgkKCcjU2VhcmNoUHJvZmlsZScpLnZhbCgpICYmICQoJyNTZWFyY2hQcm9maWxlJykudmFsKCkgIT09ICdsYXN0LXNlYXJjaCcpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVEZWxldGUnKS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNob3cgcHJvZmlsZSBsaW5rCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBc0xpbmsnKS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNob3cgc2F2ZSBjaGFuZ2VzIGluIHRlbXBsYXRlIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgJCgnI1NhdmVQcm9maWxlJykucGFyZW50KCkuc2hvdygpLnByZXYoKS5zaG93KCkucHJldigpLnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IFNhdmVQcm9maWxlIHRvIDAKICAgICAgICAgICAgICAgICAgICAkKCcjU2F2ZVByb2ZpbGUnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGFkZCBvZiBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICQoJyNBdHRyaWJ1dGUnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgQXR0cmlidXRlID0gJCgnI0F0dHJpYnV0ZScpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNlYXJjaEF0dHJpYnV0ZUFkZChBdHRyaWJ1dGUpOwogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGZvciB0cmVlIHNlbGVjdGlvbiBkaWFsb2cKICAgICAgICAgICAgICAgICAgICAkKCcuU2hvd1RyZWVTZWxlY3Rpb24nKS5vZmYoJ2NsaWNrLlRyZWVTZWxlY3Rpb24nKS5vbignY2xpY2suVHJlZVNlbGVjdGlvbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5UcmVlU2VsZWN0aW9uLlNob3dUcmVlU2VsZWN0aW9uKCQodGhpcykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHJldHVybiBrZXkKICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykub2ZmKCdrZXlwcmVzcy5GaWx0ZXJJbnB1dCcpLm9uKCdrZXlwcmVzcy5GaWx0ZXJJbnB1dCcsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICgoRXZlbnQuY2hhckNvZGUgfHwgRXZlbnQua2V5Q29kZSkgPT09IDEzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoRm9ybVN1Ym1pdCcpLnRyaWdnZXIoJ2NsaWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHN1Ym1pdAogICAgICAgICAgICAgICAgJCgnI1NlYXJjaEZvcm1TdWJtaXQnKS5vZmYoJ2NsaWNrLkRvU2VhcmNoJykub24oJ2NsaWNrLkRvU2VhcmNoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBTaG93bkF0dHJpYnV0ZXMgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgc2hvd24gYXR0cmlidXRlcwogICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hJbnNlcnQgbGFiZWwnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cignaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25BdHRyaWJ1dGVzID0gU2hvd25BdHRyaWJ1dGVzICsgJzsnICsgJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaEZvcm0gI1Nob3duQXR0cmlidXRlcycpLnZhbChTaG93bkF0dHJpYnV0ZXMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWwgcmVzdWx0cyBtb2RlIHdpbGwgcmV0dXJuIEhUTUwgaW4gdGhlIHNhbWUgd2luZG93CiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNTZWFyY2hGb3JtICNSZXN1bHRGb3JtJykudmFsKCkgPT09ICdOb3JtYWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIFByaW50IGFuZCBDU1Ygc2hvdWxkIG9wZW4gaW4gYSBuZXcgd2luZG93LCBubyB3YWl0aW5nIGRpYWxvZwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoRm9ybScpLmF0dHIoJ3RhcmdldCcsICdTZWFyY2hSZXN1bHRQYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2hlY2tGb3JTZWFyY2hlZFZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykuc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hGb3JtJykuYXR0cigndGFyZ2V0JywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGxvYWQgcHJvZmlsZQogICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGUnKS5vZmYoJ2NoYW5nZS5Mb2FkUHJvZmlsZScpLm9uKCdjaGFuZ2UuTG9hZFByb2ZpbGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSAkKCcjU2VhcmNoUHJvZmlsZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICBFbXB0eVNlYXJjaCA9ICQoJyNFbXB0eVNlYXJjaCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPSAkKCcjU2VhcmNoQWN0aW9uJykudmFsKCk7CgogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5TZWFyY2hEaWFsb2coQWN0aW9uLCBQcm9maWxlLCBFbXB0eVNlYXJjaCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gc2hvdyBhZGQgcHJvZmlsZSBibG9jayBvciBub3QKICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlTmV3Jykub2ZmKCdjbGljay5Qcm9maWxlJykub24oJ2NsaWNrLlByb2ZpbGUnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZUFkZEJsb2NrJykudG9nZ2xlKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBZGROYW1lJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgcHJvZmlsZQogICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBZGRBY3Rpb24nKS5vZmYoJ2NsaWNrLkFkZFByb2ZpbGUnKS5vbignY2xpY2suQWRkUHJvZmlsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgTmFtZSwgJEVsZW1lbnQxOwoKICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbmFtZQogICAgICAgICAgICAgICAgICAgIE5hbWUgPSAkKCcjU2VhcmNoUHJvZmlsZUFkZE5hbWUnKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5hbWUgdG8gcHJvZmlsZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAkRWxlbWVudDEgPSAkKCcjU2VhcmNoUHJvZmlsZScpLmNoaWxkcmVuKCkuZmlyc3QoKS5jbG9uZSgpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50MS50ZXh0KE5hbWUpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50MS5hdHRyKCd2YWx1ZScsIE5hbWUpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50MS5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlJykuYXBwZW5kKCRFbGVtZW50MSkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlucHV0IGJveCB0byBlbXB0eQogICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQWRkTmFtZScpLnZhbCgnJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYWRkIHRlbXBsYXRlIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBZGRCbG9jaycpLmhpZGUoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBzYXZlIGNoYW5nZXMgaW4gdGVtcGxhdGUgYmxvY2sKICAgICAgICAgICAgICAgICAgICAkKCcjU2F2ZVByb2ZpbGUnKS5wYXJlbnQoKS5oaWRlKCkucHJldigpLmhpZGUoKS5wcmV2KCkuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgU2F2ZVByb2ZpbGUgdG8gMQogICAgICAgICAgICAgICAgICAgICQoJyNTYXZlUHJvZmlsZScpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVEZWxldGUnKS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNob3cgcHJvZmlsZSBsaW5rCiAgICAgICAgICAgICAgICAgICAgJCgnI1NlYXJjaFByb2ZpbGVBc0xpbmsnKS5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGRpcmVjdCBsaW5rIHRvIHByb2ZpbGUKICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQXNMaW5rJykub2ZmKCdjbGljay5TaG93UHJvZmlsZScpLm9uKCdjbGljay5TaG93UHJvZmlsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgUHJvZmlsZSA9ICQoJyNTZWFyY2hQcm9maWxlJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9ICQoJyNTZWFyY2hBY3Rpb24nKS52YWwoKTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAnQWN0aW9uPScgKyBBY3Rpb24gKwogICAgICAgICAgICAgICAgICAgICc7U3ViYWN0aW9uPVNlYXJjaDtUYWtlTGFzdFNlYXJjaD0xO1NhdmVQcm9maWxlPTE7UHJvZmlsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBwcm9maWxlCiAgICAgICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZURlbGV0ZScpLm9mZignY2xpY2suRGVsZXRlUHJvZmlsZScpLm9uKCdjbGljay5EZWxldGVQcm9maWxlJywgZnVuY3Rpb24gKEV2ZW50KSB7CgogICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIGFsbCBhbHJlYWR5IHVzZWQgYXR0cmlidXRlcwogICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlJykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ3ZhbHVlJykgIT09ICdsYXN0LXNlYXJjaCcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hJbnNlcnQnKS50ZXh0KCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVtb3RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hQcm9maWxlRGVsZXRlKCQodGhpcykudmFsKCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IGZ1bGx0ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TZWFyY2hBdHRyaWJ1dGVBZGQoJ0Z1bGx0ZXh0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVidWlsZCBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZGl0aW9uYWxBdHRyaWJ1dGVTZWxlY3Rpb25SZWJ1aWxkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNTZWFyY2hQcm9maWxlJykudmFsKCkgJiYgJCgnI1NlYXJjaFByb2ZpbGUnKS52YWwoKSA9PT0gJ2xhc3Qtc2VhcmNoJykgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBkZWxldGUgbGluawogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2VhcmNoUHJvZmlsZURlbGV0ZScpLmhpZGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgcHJvZmlsZSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWFyY2hQcm9maWxlQXNMaW5rJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0sICdodG1sJwogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNvbWUgYmVoYXZpb3VycyBmb3IgdGhlIHNlYXJjaCBkaWFsb2cuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIE9wZW5EaWFsb2cgPSBDb3JlLkNvbmZpZy5HZXQoJ0lUU01DaGFuZ2VNYW5hZ2VtZW50U2VhcmNoLk9wZW4nKTsKICAgICAgICBpZiAoT3BlbkRpYWxvZykgewogICAgICAgICAgICBUYXJnZXROUy5PcGVuU2VhcmNoRGlhbG9nKCdBZ2VudElUU01DaGFuZ2VTZWFyY2gnKTsKICAgICAgICB9CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlNlYXJjaCB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuVGVtcGxhdGUKICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIGNoYW5nZSB0ZW1wbGF0ZSBvdmVydmlldy4KICovCklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5UZW1wbGF0ZU92ZXJ2aWV3ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuVGVtcGxhdGVPdmVydmlldwogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBzb21lIGJlaGF2aW91cnMgZm9yIHRoZSB0ZW1wbGF0ZSBvdmVydmlldyBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIElUU01DaGFuZ2VUZW1wbGF0ZU92ZXJ2aWV3Q29uZmlybURpYWxvZyA9IENvcmUuQ29uZmlnLkdldCgKICAgICAgICAgICAgJ0lUU01DaGFuZ2VUZW1wbGF0ZU92ZXJ2aWV3Q29uZmlybURpYWxvZycKICAgICAgICApOwoKICAgICAgICAvLyBiaW5kICdEZWxldGUnIGFuZCAnRWRpdENvbnRlbnQnIGJ1dHRvbnMKICAgICAgICAkLmVhY2goSVRTTUNoYW5nZVRlbXBsYXRlT3ZlcnZpZXdDb25maXJtRGlhbG9nLCBmdW5jdGlvbihLZXksIERhdGEpIHsKICAgICAgICAgICAgRGF0YSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBEYXRhLCB7CiAgICAgICAgICAgICAgICBEaWFsb2dUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoRGF0YS5EaWFsb2dUaXRsZSksCiAgICAgICAgICAgICAgICBUcmFuc2xhdGVkVGV4dDogewogICAgICAgICAgICAgICAgICAgIFllczogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoIlllcyIpLAogICAgICAgICAgICAgICAgICAgIE5vOiAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoIk5vIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBJVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cuQmluZENvbmZpcm1EaWFsb2coRGF0YSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGJpbmQgbGlua3MgdG8gb3BlbiB0aGUgdGVtcGxhdGUgZWRpdCBwb3B1cAogICAgICAgICQoJ3Rib2R5IHRyIHRkIGEuQXNQb3B1cCcpLm9uKCdjbGljay5JVFNNQ2hhbmdlTWFuZ2VtZW50LlRlbXBsYXRlRWRpdCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwoKfShJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuT3ZlcnZpZXcgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlRpbWVTbG90CiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgQ2hhbmdlIFRpbWVTbG90LgogKi8KSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LlRpbWVTbG90ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5UaW1lU2xvdAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAkKCcjTW92ZVRpbWVUeXBlJykub2ZmKCdjaGFuZ2UuSVRTTUFnZW50Q2hhbmdlTWFuYWdlbWVudFRpbWVTbG90Jykub24oJ2NoYW5nZS5JVFNNQWdlbnRDaGFuZ2VNYW5hZ2VtZW50VGltZVNsb3QnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI01vdmVUaW1lU2xvdEZvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnTW92ZVRpbWVUeXBlJywgWydNb3ZlVGltZU1pbnV0ZScsICdNb3ZlVGltZUhvdXInLCAnTW92ZVRpbWVEYXknLCAnTW92ZVRpbWVNb250aCcsICdNb3ZlVGltZVllYXInXSk7CiAgICAgICAgICAgICQoJyNBSkFYTG9hZGVyTW92ZVRpbWVEYXksICNBSkFYTG9hZGVyTW92ZVRpbWVNb250aCwgI0FKQVhMb2FkZXJNb3ZlVGltZVllYXIsICNBSkFYTG9hZGVyTW92ZVRpbWVIb3VyJykucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkZXInKTsKICAgICAgICB9KQoKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5UaW1lU2xvdCB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Vc2VyU2VhcmNoCiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSB1c2VyIHNlYXJjaC4KICovCklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Vc2VyU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuVXNlckFnZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkVXNlclNlYXJjaGVzIGVsZW1lbnRzIHRvIGFkZCBhdXRvY29tcGxldGUgYmVoYXZpb3VyIChvcHRpb25hbCkKICAgICAqICAgICAgaWYgbm90IGdpdmVuLCB3aWxsIHNlYXJjaCBmb3IgYWxsIGlucHV0cyB3aXRoIHRoZSBjbGFzcyAnLlVzZXJTZWFyY2gnCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoJFVzZXJTZWFyY2hlcykgewogICAgICAgICRVc2VyU2VhcmNoZXMgPSAkVXNlclNlYXJjaGVzIHx8ICQoJ2lucHV0LlVzZXJTZWFyY2gnKTsKCiAgICAgICAgJFVzZXJTZWFyY2hlcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgJEVsZW1lbnQgPSAkKHRoaXMpOwoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgKICAgICAgICAgICAgICAgICRFbGVtZW50LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRJVFNNVXNlclNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSArICcqJywKICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBzIDogJEVsZW1lbnQuZGF0YSgnYXV0b2NvbXBsZXRlZ3JvdXBzJyksCiAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IENvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgnQXV0b0NvbXBsZXRlWEhSJywgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5Vc2VyVmFsdWUgKyAiICgiICsgdGhpcy5Vc2VyS2V5ICsgIikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLlVzZXJLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyA6IHRoaXMuVXNlclZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKFVJLml0ZW0uc2hvdyk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRVc2VyCiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigkRWxlbWVudC5hdHRyKCdpZCcpKSArICdTZWxlY3RlZCcpLnZhbChVSS5pdGVtLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdDdXN0b21lclNlYXJjaCcKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gT24gdW5sb2FkIHJlbW92ZSBvbGQgc2VsZWN0ZWQgZGF0YS4gSWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgKHdpdGggRjUpCiAgICAgICAgLy8gdGhpcyBkYXRhIHN0YXlzIGluIHRoZSBmaWVsZCBhbmQgaW52b2tlcyBhbiBhamF4IHJlcXVlc3Qgb3RoZXJ3aXNlCiAgICAgICAgJCh3aW5kb3cpLm9uKCdiZWZvcmV1bmxvYWQuVXNlclNlYXJjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnaW5wdXQuVXNlclNlYXJjaFNlbGVjdGVkJykudmFsKCcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0pOwogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Vc2VyU2VhcmNoIHx8IHt9KSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50ID0gSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50LldvcmtvcmRlckdyYXBoCiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSB3b3Jrb3JkZXIgZ3JhcGguCiAqLwpJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuV29ya29yZGVyR3JhcGggPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5Xb3Jrb3JkZXJHcmFwaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgd29ya29yZGVyIGdyYXBoCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gR2V0RGV0YWlsUG9zaXRpb24oRWxlbWVudCwgRXZlbnQpIHsKICAgICAgICAgICAgdmFyICREZXRhaWxzID0gJChFbGVtZW50KS5uZXh0KCcuV29ya29yZGVyRGV0YWlscycpLAogICAgICAgICAgICAgICAgTW91c2VQb3NpdGlvbkxlZnQgPSBwYXJzZUludChFdmVudC5wYWdlWCwgMTApLAogICAgICAgICAgICAgICAgTW91c2VQb3NpdGlvblRvcCA9IHBhcnNlSW50KEV2ZW50LnBhZ2VZLCAxMCksCiAgICAgICAgICAgICAgICBCb3hQb3NpdGlvbiA9ICQoRWxlbWVudCkuY2xvc2VzdCgnZGl2LldvcmtvcmRlckdyYXBoJykub2Zmc2V0KCksCiAgICAgICAgICAgICAgICBCb3hXaWR0aCA9ICQoRWxlbWVudCkuY2xvc2VzdCgnZGl2LldvcmtvcmRlckdyYXBoJykud2lkdGgoKSwKICAgICAgICAgICAgICAgIERldGFpbFdpZHRoID0gJERldGFpbHMud2lkdGgoKSwKICAgICAgICAgICAgICAgIERldGFpbFBvc2l0aW9uTGVmdCA9IE1vdXNlUG9zaXRpb25MZWZ0IC0gcGFyc2VJbnQoQm94UG9zaXRpb24ubGVmdCwgMTApICsgMTUsCiAgICAgICAgICAgICAgICBEZXRhaWxQb3NpdGlvblRvcCA9IE1vdXNlUG9zaXRpb25Ub3AgLSBwYXJzZUludChCb3hQb3NpdGlvbi50b3AsIDEwKSArIDE1OwoKICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSB0byB0aGUgcmlnaHQgdG8gc2hvdyB0aGUgZGV0YWlsIGJveCwKICAgICAgICAgICAgLy8gc2hvdyBpdCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBtb3VzZSBjdXJzb3IKICAgICAgICAgICAgaWYgKERldGFpbFBvc2l0aW9uTGVmdCArIERldGFpbFdpZHRoICsgMTUgPiBCb3hXaWR0aCkgewogICAgICAgICAgICAgICAgRGV0YWlsUG9zaXRpb25MZWZ0ID0gRGV0YWlsUG9zaXRpb25MZWZ0IC0gNDAwIC0gMzA7IC8vIDMwIGJlY2F1c2Ugd2UgYWRkZWQgMTUgdG8gdGhlIHJpZ2h0IGFuZCBub3cgd2FudCAxNSB0byB0aGUgbGVmdAogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgTGVmdDogRGV0YWlsUG9zaXRpb25MZWZ0LAogICAgICAgICAgICAgICAgVG9wOiBEZXRhaWxQb3NpdGlvblRvcAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgJCgnZGl2LldvcmtvcmRlciBhJykKICAgICAgICAub2ZmKCdtb3VzZWVudGVyLklUU01DaGFuZ2VNYW5hZ2VtZW50LldPR3JhcGgnKS5vbignbW91c2VlbnRlci5JVFNNQ2hhbmdlTWFuYWdlbWVudC5XT0dyYXBoJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIHZhciBEZXRhaWxQb3NpdGlvbiA9IEdldERldGFpbFBvc2l0aW9uKHRoaXMsIEV2ZW50KTsKICAgICAgICAgICAgJCh0aGlzKS5uZXh0KCcuV29ya29yZGVyRGV0YWlscycpCiAgICAgICAgICAgICAgICAuY3NzKCdsZWZ0JywgRGV0YWlsUG9zaXRpb24uTGVmdCkKICAgICAgICAgICAgICAgIC5jc3MoJ3RvcCcsIERldGFpbFBvc2l0aW9uLlRvcCkKICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgfSkKICAgICAgICAub2ZmKCdtb3VzZWxlYXZlLklUU01DaGFuZ2VNYW5hZ2VtZW50LldPR3JhcGgnKS5vbignbW91c2VsZWF2ZS5JVFNNQ2hhbmdlTWFuYWdlbWVudC5XT0dyYXBoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKHRoaXMpLm5leHQoJy5Xb3Jrb3JkZXJEZXRhaWxzJykuaGlkZSgpOwogICAgICAgIH0pCiAgICAgICAgLm9mZignbW91c2Vtb3ZlLklUU01DaGFuZ2VNYW5hZ2VtZW50LldPR3JhcGgnKS5vbignbW91c2Vtb3ZlLklUU01DaGFuZ2VNYW5hZ2VtZW50LldPR3JhcGgnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgdmFyIERldGFpbFBvc2l0aW9uID0gR2V0RGV0YWlsUG9zaXRpb24odGhpcywgRXZlbnQpOwogICAgICAgICAgICAkKHRoaXMpLm5leHQoJy5Xb3Jrb3JkZXJEZXRhaWxzJykKICAgICAgICAgICAgICAgIC5jc3MoJ2xlZnQnLCBEZXRhaWxQb3NpdGlvbi5MZWZ0KQogICAgICAgICAgICAgICAgLmNzcygndG9wJywgRGV0YWlsUG9zaXRpb24uVG9wKTsKICAgICAgICB9KTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuV29ya29yZGVyR3JhcGggfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlL1xuIjsKLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBJVFNNID0gSVRTTSB8fCB7fTsKSVRTTS5BZ2VudCA9IElUU00uQWdlbnQgfHwge307CklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCA9IElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5ab29tCiAqIEBtZW1iZXJvZiBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBab29tIChjaGFuZ2UgYW5kIHdvcmtvcmRlciB6b29tKS4KICovCklUU00uQWdlbnQuQ2hhbmdlTWFuYWdlbWVudC5ab29tID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG5hbWVzcGFjZSBJVFNNLkFnZW50LkNoYW5nZU1hbmFnZW1lbnQuWm9vbQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gaW5pdCBicm93c2VyIGxpbmsgbWVzc2FnZSBjbG9zZSBidXR0b24KICAgICAgICBpZiAoJCgnLklUU01NZXNzYWdlQnJvd3NlcicpLmxlbmd0aCkgewogICAgICAgICAgICAkKCcuSVRTTU1lc3NhZ2VCcm93c2VyIGEuQ2xvc2UnKS5vZmYoJ0lUU01NZXNzYWdlQnJvd3NlcicpLm9uKCdjbGljay5JVFNNTWVzc2FnZUJyb3dzZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCcuSVRTTU1lc3NhZ2VCcm93c2VyJykuZmFkZU91dCgic2xvdyIpOwogICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5QcmVmZXJlbmNlc1VwZGF0ZSgnVXNlckFnZW50RG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlJywgMSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gY29weSBkYXRhLXNyYyBhdHRyaWJ1dGUgdG8gc3JjIGF0dHJpYnV0ZSBmb3IgYWxsIGlmcmFtZXMgdG8KICAgICAgICAvLyAgY29ycmVjdGx5IGRpc3BsYXkgaXRzIGNvbnRlbnRzIGFmdGVyIEpTIGlzIGZ1bGx5IGxvYWRlZAogICAgICAgICQoJ2lmcmFtZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJzcmMiLCAkKHRoaXMpLmF0dHIoImRhdGEtc3JjIikpOwogICAgICAgIH0pOwoKICAgICAgICAkKCd1bC5BY3Rpb25zIGEuQXNQb3B1cCcpCiAgICAgICAgLm9mZignY2xpY2suSVRTTUNoYW5nZU1hbmFnZW1lbnRab29tLkFjdGlvblBvcHVwJykKICAgICAgICAub24oJ2NsaWNrLklUU01DaGFuZ2VNYW5hZ2VtZW50Wm9vbS5BY3Rpb25Qb3B1cCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkKCd1bC5BY3Rpb25zIGEuSGlzdG9yeUJhY2snKQogICAgICAgIC5vZmYoJ2NsaWNrLklUU01DaGFuZ2VNYW5hZ2VtZW50Wm9vbS5IaXN0b3J5QmFjaycpCiAgICAgICAgLm9uKCdjbGljay5JVFNNQ2hhbmdlTWFuYWdlbWVudFpvb20uSGlzdG9yeUJhY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSByZWZlcnJlciB3ZSB1c2UgaXQsIHNvIHRoZSBwcmV2aW91cyBwYWdlIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIHNlcnZlcgogICAgICAgICAgICAvLyBhbmQgaWYgdGhlIHJlZmVyZXIgaXMgbm90IHRoZSBjdXJyZW50IHBhZ2UgKEFnZW50SVRTTVdvcmtPcmRlclpvb20pCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWZlcnJlciAmJiAhZG9jdW1lbnQucmVmZXJyZXIubWF0Y2goL0FnZW50SVRTTVdvcmtPcmRlclpvb20vKSkgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5yZWZlcnJlcjsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2Ugd2FzIGxvYWRlZCBmcm9tIGNsaWNraW5nIGEgbGluayBpbiBhbiBlbWFpbCB0aGVyZSBpcyBubyByZWZlcmVyCiAgICAgICAgICAgIC8vIGFuZCB0aGVuIHdlIHdhbnQgdG8gZm9sbG93IHRoZSBvcmlnaW5hbCBsaW5rIHRhcmdldCAod2hpY2ggaXMgdGhlIGNoYW5nZSB6b29tICkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgYWxsb2NhdGlvbiBsaXN0IGZvciBsaW5rIG9iamVjdCB0YWJsZS4KICAgICAgICBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5TZXRBbGxvY2F0aW9uTGlzdCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIElmcmFtZUF1dG9IZWlnaHQKICAgICAqIEBuYW1lc3BhY2UgSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Llpvb20KICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRJZnJhbWUgVGhlIGlmcmFtZSB3aGljaCBzaG91bGQgYmUgYXV0by1oZWlnaHRlZAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucwogICAgICovCiAgICBUYXJnZXROUy5JZnJhbWVBdXRvSGVpZ2h0ID0gZnVuY3Rpb24gKCRJZnJhbWUpIHsKICAgICAgICB2YXIgTmV3SGVpZ2h0OwoKICAgICAgICBpZiAoIWlzSlF1ZXJ5T2JqZWN0KCRJZnJhbWUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIE5ld0hlaWdodCA9ICRJZnJhbWUKICAgICAgICAgICAgLmNvbnRlbnRzKCkKICAgICAgICAgICAgLmZpbmQoJ2h0bWwnKQogICAgICAgICAgICAuaGVpZ2h0KCk7CgogICAgICAgIC8vIElFOCBuZWVkcyBzb21lIG1vcmUgc3BhY2UgZHVlIHRvIGluY29ycmVjdCBoZWlnaHQgY2FsY3VsYXRpb24KICAgICAgICBpZiAoTmV3SGVpZ2h0ID4gMCAmJiAkLmJyb3dzZXIubXNpZSAmJiAkLmJyb3dzZXIudmVyc2lvbiA9PT0gJzguMCcpIHsKICAgICAgICAgICAgTmV3SGVpZ2h0ID0gTmV3SGVpZ2h0ICsgNDsKICAgICAgICB9CgogICAgICAgIC8vIGlmIHRoZSBpRnJhbWVzIGhlaWdodCBpcyAwLCB3ZSBjb2xsYXBzZSB0aGUgd2lkZ2V0CiAgICAgICAgaWYgKE5ld0hlaWdodCA9PT0gMCkgewogICAgICAgICAgICAkSWZyYW1lLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKS5yZW1vdmVDbGFzcygnRXhwYW5kZWQnKS5hZGRDbGFzcygnQ29sbGFwc2VkJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIU5ld0hlaWdodCB8fCBpc05hTihOZXdIZWlnaHQpKSB7CiAgICAgICAgICAgIE5ld0hlaWdodCA9IENvcmUuQ29uZmlnLkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0RGVmYXVsdCcpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKE5ld0hlaWdodCA+IENvcmUuQ29uZmlnLkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0TWF4JykpIHsKICAgICAgICAgICAgICAgIE5ld0hlaWdodCA9IENvcmUuQ29uZmlnLkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SFRNTEZpZWxkSGVpZ2h0TWF4Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJElmcmFtZS5oZWlnaHQoTmV3SGVpZ2h0ICsgJ3B4Jyk7CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZ2VudC5DaGFuZ2VNYW5hZ2VtZW50Llpvb20gfHwge30pKTsK
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiAqICAtLQogKiBAcHJvamVjdCBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSA8aHR0cDovL3d3dy5vdHJzLm9yZz4gLSBBZ2VudCBGcm9udGVuZAogKiBAY29weXJpZ2h0IE9UUlMgQUcKICogQGxpY2Vuc2UgICAgIEFHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dCkKICovCgovKioKICogQHBhY2thZ2UgICAgIFNraW4gIkRlZmF1bHQiCiAqIEBzZWN0aW9uICAgICBJVFNNIGRlZmF1bHQKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uICBTdGFuZGFyZCBXaWR0aHMKICovCgouVzMwMHB4IHsKICAgIHdpZHRoOiAzMDBweDsKfQoKLlNwYWNpbmdCb3R0b21TbWFsbCB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgTGF5b3V0IGZpeAogKi8KLyoqCiAqIEBub3RlICAgICBCZWNhdXNlIG9mIHNvbWUgb3ZlcmZsb3cgaGlkZGVuLCB3b3Jrb3JkZXIgdG9vbHRpcHMgYXJlIG5vdCBhbHdheXMKICogICAgICAgICAgIGNvbXBsZXRlbHkgdmlzaWJsZS4KICogICAgICAgICAgIFRoZSBvdmVyZmxvdyBoaWRkZW4gaXMgbmVjZXNzYXJ5IGluIHRoZSBsYXlvdXQgYW5kIGNhbid0IGJlIGNoYW5nZWQuCiAqICAgICAgICAgICBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmdWxseSBzaG93IHRoZSB3b3Jrb3JkZXIgdG9vbHRpcC4KICovCi5MYXlvdXRGaXhlZFNpZGViYXIgPiAuQ29udGVudENvbHVtbiB7CiAgICBtaW4taGVpZ2h0OiA0NTBweDsKfQoKLkZpeGVkTGFiZWxTbWFsbCBpZnJhbWUuRmllbGQgewogICAgd2lkdGg6IDgwJTsKfQoKLklUU01NZXNzYWdlQnJvd3NlciB7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgcGFkZGluZzogMHB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouSVRTTU1lc3NhZ2VCcm93c2VyIHAgewogICAgIHBhZGRpbmc6IDVweDsKICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OwogICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5JVFNNTWVzc2FnZUJyb3dzZXIgYS5DbG9zZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDRweDsKICAgIHRvcDogNnB4OwogICAgY29sb3I6ICM1RDVENUQ7Cn0KCi5JVFNNTWVzc2FnZUJyb3dzZXIgYS5DbG9zZTpob3ZlciB7CiAgICBjb2xvcjogIzAwMDsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICBUYWJsZVNtYWxsCiAqLwoKLlRhYmxlU21hbGwgdGJvZHkgdHIuSW52YWxpZCB7CiAgICBjb2xvcjogI0NDQzsKfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyogIEFsbCBkZXZpY2VzIGNhcGFibGUgb2YgT1RSUyBtaW5pbXVtIHNvbHV0aW9uLiBVc2VkIHRvIGhpZGUgZWxlbWVudHMgZm9yIG1vYmlsZSBkZXZpY2VzLiAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjVweCkgewoKfQoKLyogIEFsbCBkZXZpY2VzIHdpdGggYSBzbWFsbGVyIHJlc29sdXRpb24gdGhhbiB0aGUgY3VycmVudCBPVFJTIG1pbmltdW0gc29sdXRpb24gKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCiAgICAuV29ya29yZGVyRGV0YWlscyB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQp9CgovKiAgfiBUYWJsZXQgbGFuZHNjYXBlICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCn0KCi8qICBBbGwgZGV2aWNlcyBzbWFsbGVyIHRoYW4gdGFibGV0IGxhbmRzY2FwZSAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDBweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7Cgp9CgovKiAgfiBUYWJsZXQgcG9ydHJhaXQgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0ODBweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7Cgp9CgovKiAgfiBTbWFydHBob25lIGxhbmRzY2FwZSAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDMyMHB4KSBhbmQgKG1heC13aWR0aDogNDc5cHgpIHsKCn0KCi8qICB+IFNtYXJ0cGhvbmUgcG9ydHJhaXQgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMTlweCkgewoKfQo=
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiAqICAtLQogKiBAcHJvamVjdCBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSA8aHR0cDovL3d3dy5vdHJzLm9yZz4gLSBBZ2VudCBGcm9udGVuZAogKiBAY29weXJpZ2h0IE9UUlMgQUcKICogQGxpY2Vuc2UgICAgIEFHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dCkKICovCgovKioKICogQHBhY2thZ2UgICAgIFNraW4gIkRlZmF1bHQiCiAqIEBzZWN0aW9uICAgICBJVFNNIGRlZmF1bHQKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uICBUYWJsZXMsIGxpc3RzCiAqLwoKLlJURUNvbnRlbnQsIC5SVEVDb250ZW50ICogewogICAgbGluZS1oZWlnaHQ6IDEzMCUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBBcmlhbCxIZWx2ZXRpY2EsVGFob21hLFZlcmRhbmEsU2Fucy1TZXJpZjsKfQoKLlJURUNvbnRlbnQgdGFibGUgewogICAgYm9yZGVyOiAxcHggb3V0c2V0ICMyMjI7CiAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOwogICAgYm9yZGVyLXNwYWNpbmc6IDFweDsKfQoKLlJURUNvbnRlbnQgdGFibGUgdGQsIC5SVEVDb250ZW50IHRhYmxlIHRoIHsKICAgIGJvcmRlcjogMXB4IGluc2V0ICMwMDA7CiAgICBwYWRkaW5nOiAxcHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouUlRFQ29udGVudCB0YWJsZSB0aCB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KCi5SVEVDb250ZW50IHAgewogICAgbWFyZ2luOiAxMHB4IDBweDsKfQoKLlJURUNvbnRlbnQgdWwgewogICAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOwogICAgbWFyZ2luOiAxMHB4IDBweDsKICAgIHBhZGRpbmctbGVmdDogNDVweDsKfQoKLlJURUNvbnRlbnQgb2wgewogICAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwogICAgbWFyZ2luOiAxMHB4IDBweDsKICAgIHBhZGRpbmctbGVmdDogNDVweDsKfQoKLlJURUNvbnRlbnQgc3Ryb25nLCAuUlRFQ29udGVudCBlbSAgewogICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCgp9IC8qIGVuZCBAbWVkaWEgKi8K
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiAqICAtLQogKiBAcHJvamVjdCBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSA8aHR0cDovL3d3dy5vdHJzLm9yZz4gLSBBZ2VudCBGcm9udGVuZAogKiBAY29weXJpZ2h0IE9UUlMgQUcKICogQGxpY2Vuc2UgICAgIEFHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dCkKICovCgovKioKICogQHBhY2thZ2UgICAgIFNraW4gIkRlZmF1bHQiCiAqIEBzZWN0aW9uICAgICBXb3Jrb3JkZXIgR3JhcGgKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uICBXb3Jrb3JkZXIgR3JhcGgKICovCgpkaXYuV29ya29yZGVyR3JhcGhCb3ggewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDMwcHg7CiAgICBwYWRkaW5nOiAxcHg7CiAgICB6LWluZGV4OiAxMDA7Cn0KCmRpdi5Xb3Jrb3JkZXJHcmFwaCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLWJvdHRvbTogNXB4Owp9CgpkaXYuTGluZXNTY2FsZUJveCB7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgdG9wOiAwcHg7CiAgICBsZWZ0OiAwcHg7Cn0KCmRpdi5MaW5lc1NjYWxlIHsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKZGl2LlRpbWVsaW5lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtc2l6ZTogMXB4OwogICAgei1pbmRleDogMjsKfQoKZGl2LlNjYWxlVmVydGljYWxMaW5lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTsKICAgIGhlaWdodDogMTAwJTsKICAgIHdpZHRoOiAxcHg7CiAgICBmb250LXNpemU6IDFweDsKICAgIHotaW5kZXg6IDE7Cn0KCmRpdi5Xb3Jrb3JkZXJMYWJlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIGZsb2F0OiBsZWZ0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGhlaWdodDogMTVweDsKICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi5SVEwgZGl2LldvcmtvcmRlckxhYmVsIHsKICAgIG1hcmdpbi1yaWdodDogYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICBmbG9hdDogcmlnaHQ7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKZGl2LldvcmtvcmRlckxhYmVsIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgouUlRMIGRpdi5Xb3Jrb3JkZXJMYWJlbCAuRmxhZyB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCmRpdi5Xb3Jrb3JkZXJMYWJlbCAuRmxhZyBzcGFuIHsKICAgIGN1cnNvcjogYXV0bzsKfQoKZGl2LldvcmtvcmRlciB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCmRpdi5Xb3Jrb3JkZXIgYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgaGVpZ2h0OiAxNXB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgpkaXYuV29ya29yZGVyIGEgc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA1cHg7CiAgICBtYXJnaW46IDFweCBhdXRvIDJweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKZGl2LldvcmtvcmRlciBhIHNwYW4gPiBzcGFuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgaGVpZ2h0OiA1cHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDBweDsKICAgIGZvbnQtc2l6ZTogM3B4OwogICAgei1pbmRleDogNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLldvcmtvcmRlckluYWN0aXZlIHsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eSA9IDUwKTsKICAgIG9wYWNpdHk6IDAuNTsKfQoKZGl2LldvcmtvcmRlckRldGFpbHMgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMnB4OwogICAgbGVmdDogMnB4OwogICAgei1pbmRleDogNTsKICAgIHdpZHRoOiA0MDBweDsKICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwogICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgIHBhZGRpbmc6IDZweDsKICAgIC1tb3otYm94LXNoYWRvdzogNHB4IDRweCA0cHggIzY2NjsKICAgIC13ZWJraXQtYm94LXNoYWRvdzogNHB4IDRweCA0cHggIzY2NjsKICAgIGJveC1zaGFkb3c6IDRweCA0cHggNHB4ICM2NjY7Cn0KCmRpdi5TY2FsZUhvcml6b250YWwgewogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGxpZ2h0Z3JleTsKICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKfQoKZGl2LlNjYWxlRW50cnkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDhwdDsKICAgIHdpZHRoOiAxMCU7Cn0KCmRpdi5TY2FsZUVudHJ5VGFpbCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpkaXYuU2NhbGVFbnRyeVRyYWlsIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouUlRMIGRpdi5TY2FsZUVudHJ5VGFpbCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLlJUTCBkaXYuU2NhbGVFbnRyeVRyYWlsIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmRpdi5TY2FsZTAgewogICAgbGVmdDogMCU7Cn0KCmRpdi5TY2FsZTE1IHsKICAgIGxlZnQ6IDE1JTsKfQoKZGl2LlNjYWxlMjAgewogICAgbGVmdDogMjAlOwp9CgpkaXYuU2NhbGUzNSB7CiAgICBsZWZ0OiAzNSU7Cn0KCmRpdi5TY2FsZTQwIHsKICAgIGxlZnQ6IDQwJTsKfQoKZGl2LlNjYWxlNTUgewogICAgbGVmdDogNTUlOwp9CgpkaXYuU2NhbGU2MCB7CiAgICBsZWZ0OiA2MCU7Cn0KCmRpdi5TY2FsZTc1IHsKICAgIGxlZnQ6IDc1JTsKfQoKZGl2LlNjYWxlODAgewogICAgbGVmdDogODAlOwp9CgpkaXYuU2NhbGU5MCB7CiAgICBsZWZ0OiA5MCU7Cn0KCmRpdi5TY2FsZTEwMCB7CiAgICBsZWZ0OiA5OS45JTsKfQoKLlJUTCBkaXYuU2NhbGUwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMCU7Cn0KCi5SVEwgZGl2LlNjYWxlMTUgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiAxNSU7Cn0KCi5SVEwgZGl2LlNjYWxlMjAgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiAyMCU7Cn0KCi5SVEwgZGl2LlNjYWxlMzUgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiAzNSU7Cn0KCi5SVEwgZGl2LlNjYWxlNDAgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA0MCU7Cn0KCi5SVEwgZGl2LlNjYWxlNTUgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA1NSU7Cn0KCi5SVEwgZGl2LlNjYWxlNjAgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA2MCU7Cn0KCi5SVEwgZGl2LlNjYWxlNzUgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA3NSU7Cn0KCi5SVEwgZGl2LlNjYWxlODAgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA4MCU7Cn0KCi5SVEwgZGl2LlNjYWxlOTAgewogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiA5MCU7Cn0KCi5SVEwgZGl2LlNjYWxlMTAwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogOTkuOSU7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLw==
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvXG4iOwogKiAgLS0KICogQHByb2plY3QgT1RSUyAoaHR0cDovL3d3dy5vdHJzLm9yZykgPGh0dHA6Ly93d3cub3Rycy5vcmc+IC0gQWdlbnQgRnJvbnRlbmQKICogQGNvcHlyaWdodCBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSVRTTSBkZWZhdWx0CiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgU3RhbmRhcmQgV2lkdGhzCiAqLwoKLlczMDBweCB7CiAgICB3aWR0aDogMzAwcHg7Cn0KCi5TcGFjaW5nQm90dG9tU21hbGwgewogICAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgovKioKICogQHN1YnNlY3Rpb24gIExheW91dCBmaXgKICovCi8qKgogKiBAbm90ZSAgICAgQmVjYXVzZSBvZiBzb21lIG92ZXJmbG93IGhpZGRlbiwgd29ya29yZGVyIHRvb2x0aXBzIGFyZSBub3QgYWx3YXlzCiAqICAgICAgICAgICBjb21wbGV0ZWx5IHZpc2libGUuCiAqICAgICAgICAgICBUaGUgb3ZlcmZsb3cgaGlkZGVuIGlzIG5lY2Vzc2FyeSBpbiB0aGUgbGF5b3V0IGFuZCBjYW4ndCBiZSBjaGFuZ2VkLgogKiAgICAgICAgICAgVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZnVsbHkgc2hvdyB0aGUgd29ya29yZGVyIHRvb2x0aXAuCiAqLwouTGF5b3V0Rml4ZWRTaWRlYmFyID4gLkNvbnRlbnRDb2x1bW4gewogICAgbWluLWhlaWdodDogNDUwcHg7Cn0KCi5GaXhlZExhYmVsU21hbGwgaWZyYW1lLkZpZWxkIHsKICAgIHdpZHRoOiA4MCU7Cn0KCi5JVFNNTWVzc2FnZUJyb3dzZXIgewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgIHBhZGRpbmc6IDBweDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLklUU01NZXNzYWdlQnJvd3NlciBwIHsKICAgICBwYWRkaW5nOiA1cHg7CiAgICAgYmFja2dyb3VuZC1jb2xvcjogI0U4RThFODsKICAgICBmb250LXNpemU6IDExcHg7CiAgICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouSVRTTU1lc3NhZ2VCcm93c2VyIGEuQ2xvc2UgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiA0cHg7CiAgICB0b3A6IDZweDsKICAgIGNvbG9yOiAjNUQ1RDVEOwp9CgouSVRTTU1lc3NhZ2VCcm93c2VyIGEuQ2xvc2U6aG92ZXIgewogICAgY29sb3I6ICMwMDA7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgVGFibGVTbWFsbAogKi8KCi5UYWJsZVNtYWxsIHRib2R5IHRyLkludmFsaWQgewogICAgY29sb3I6ICNDQ0M7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyogIEFsbCBkZXZpY2VzIGNhcGFibGUgb2YgT1RSUyBtaW5pbXVtIHNvbHV0aW9uLiBVc2VkIHRvIGhpZGUgZWxlbWVudHMgZm9yIG1vYmlsZSBkZXZpY2VzLiAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjVweCkgewoKfQoKLyogIEFsbCBkZXZpY2VzIHdpdGggYSBzbWFsbGVyIHJlc29sdXRpb24gdGhhbiB0aGUgY3VycmVudCBPVFJTIG1pbmltdW0gc29sdXRpb24gKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCiAgICAuV29ya29yZGVyRGV0YWlscyB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQp9CgovKiAgfiBUYWJsZXQgbGFuZHNjYXBlICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKCn0KCi8qICBBbGwgZGV2aWNlcyBzbWFsbGVyIHRoYW4gdGFibGV0IGxhbmRzY2FwZSAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDBweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7Cgp9CgovKiAgfiBUYWJsZXQgcG9ydHJhaXQgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0ODBweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7Cgp9CgovKiAgfiBTbWFydHBob25lIGxhbmRzY2FwZSAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDMyMHB4KSBhbmQgKG1heC13aWR0aDogNDc5cHgpIHsKCn0KCi8qICB+IFNtYXJ0cGhvbmUgcG9ydHJhaXQgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMTlweCkgewoKfQo=
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvXG4iOwogKiAgLS0KICogQHByb2plY3QgT1RSUyAoaHR0cDovL3d3dy5vdHJzLm9yZykgPGh0dHA6Ly93d3cub3Rycy5vcmc+IC0gQWdlbnQgRnJvbnRlbmQKICogQGNvcHlyaWdodCBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSVRTTSBkZWZhdWx0CiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgVGFibGVzLCBsaXN0cwogKi8KCi5SVEVDb250ZW50LCAuUlRFQ29udGVudCAqIHsKICAgIGxpbmUtaGVpZ2h0OiAxMzAlICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogQXJpYWwsSGVsdmV0aWNhLFRhaG9tYSxWZXJkYW5hLFNhbnMtU2VyaWY7Cn0KCi5SVEVDb250ZW50IHRhYmxlIHsKICAgIGJvcmRlcjogMXB4IG91dHNldCAjMjIyOwogICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICAgIGJvcmRlci1zcGFjaW5nOiAxcHg7Cn0KCi5SVEVDb250ZW50IHRhYmxlIHRkLCAuUlRFQ29udGVudCB0YWJsZSB0aCB7CiAgICBib3JkZXI6IDFweCBpbnNldCAjMDAwOwogICAgcGFkZGluZzogMXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLlJURUNvbnRlbnQgdGFibGUgdGggewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwp9CgouUlRFQ29udGVudCBwIHsKICAgIG1hcmdpbjogMTBweCAwcHg7Cn0KCi5SVEVDb250ZW50IHVsIHsKICAgIGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKICAgIG1hcmdpbjogMTBweCAwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDQ1cHg7Cn0KCi5SVEVDb250ZW50IG9sIHsKICAgIGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKICAgIG1hcmdpbjogMTBweCAwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDQ1cHg7Cn0KCi5SVEVDb250ZW50IHN0cm9uZywgLlJURUNvbnRlbnQgZW0gIHsKICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50Owp9CgoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvXG4iOwogKiAgLS0KICogQHByb2plY3QgT1RSUyAoaHR0cDovL3d3dy5vdHJzLm9yZykgPGh0dHA6Ly93d3cub3Rycy5vcmc+IC0gQWdlbnQgRnJvbnRlbmQKICogQGNvcHlyaWdodCBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgV29ya29yZGVyIEdyYXBoCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgV29ya29yZGVyIEdyYXBoCiAqLwoKZGl2LldvcmtvcmRlckdyYXBoQm94IHsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAzMHB4OwogICAgcGFkZGluZzogMXB4OwogICAgei1pbmRleDogMTAwOwp9CgpkaXYuV29ya29yZGVyR3JhcGggewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1ib3R0b206IDVweDsKfQoKZGl2LkxpbmVzU2NhbGVCb3ggewogICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHRvcDogMHB4OwogICAgbGVmdDogMHB4Owp9CgpkaXYuTGluZXNTY2FsZSB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCmRpdi5UaW1lbGluZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBmb250LXNpemU6IDFweDsKICAgIHotaW5kZXg6IDI7Cn0KCmRpdi5TY2FsZVZlcnRpY2FsTGluZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMXB4OwogICAgZm9udC1zaXplOiAxcHg7CiAgICB6LWluZGV4OiAxOwp9CgpkaXYuV29ya29yZGVyTGFiZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBmbG9hdDogbGVmdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBoZWlnaHQ6IDE1cHg7CiAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4Owp9CgouUlRMIGRpdi5Xb3Jrb3JkZXJMYWJlbCB7CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgZmxvYXQ6IHJpZ2h0OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCmRpdi5Xb3Jrb3JkZXJMYWJlbCAuRmxhZyB7CiAgICBmbG9hdDogbGVmdDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLlJUTCBkaXYuV29ya29yZGVyTGFiZWwgLkZsYWcgewogICAgZmxvYXQ6IHJpZ2h0Owp9CgpkaXYuV29ya29yZGVyTGFiZWwgLkZsYWcgc3BhbiB7CiAgICBjdXJzb3I6IGF1dG87Cn0KCmRpdi5Xb3Jrb3JkZXIgewogICAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgpkaXYuV29ya29yZGVyIGEgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIGhlaWdodDogMTVweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKZGl2LldvcmtvcmRlciBhIHNwYW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNXB4OwogICAgbWFyZ2luOiAxcHggYXV0byAycHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCmRpdi5Xb3Jrb3JkZXIgYSBzcGFuID4gc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogNXB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwcHg7CiAgICBmb250LXNpemU6IDNweDsKICAgIHotaW5kZXg6IDQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5Xb3Jrb3JkZXJJbmFjdGl2ZSB7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHkgPSA1MCk7CiAgICBvcGFjaXR5OiAwLjU7Cn0KCmRpdi5Xb3Jrb3JkZXJEZXRhaWxzIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDJweDsKICAgIGxlZnQ6IDJweDsKICAgIHotaW5kZXg6IDU7CiAgICB3aWR0aDogNDAwcHg7CiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsKICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI0NDQzsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUU7CiAgICBwYWRkaW5nOiA2cHg7CiAgICAtbW96LWJveC1zaGFkb3c6IDRweCA0cHggNHB4ICM2NjY7CiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDRweCA0cHggNHB4ICM2NjY7CiAgICBib3gtc2hhZG93OiA0cHggNHB4IDRweCAjNjY2Owp9CgpkaXYuU2NhbGVIb3Jpem9udGFsIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBsaWdodGdyZXk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7Cn0KCmRpdi5TY2FsZUVudHJ5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogM3B4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiA4cHQ7CiAgICB3aWR0aDogMTAlOwp9CgpkaXYuU2NhbGVFbnRyeVRhaWwgewogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKZGl2LlNjYWxlRW50cnlUcmFpbCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLlJUTCBkaXYuU2NhbGVFbnRyeVRhaWwgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5SVEwgZGl2LlNjYWxlRW50cnlUcmFpbCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpkaXYuU2NhbGUwIHsKICAgIGxlZnQ6IDAlOwp9CgpkaXYuU2NhbGUxNSB7CiAgICBsZWZ0OiAxNSU7Cn0KCmRpdi5TY2FsZTIwIHsKICAgIGxlZnQ6IDIwJTsKfQoKZGl2LlNjYWxlMzUgewogICAgbGVmdDogMzUlOwp9CgpkaXYuU2NhbGU0MCB7CiAgICBsZWZ0OiA0MCU7Cn0KCmRpdi5TY2FsZTU1IHsKICAgIGxlZnQ6IDU1JTsKfQoKZGl2LlNjYWxlNjAgewogICAgbGVmdDogNjAlOwp9CgpkaXYuU2NhbGU3NSB7CiAgICBsZWZ0OiA3NSU7Cn0KCmRpdi5TY2FsZTgwIHsKICAgIGxlZnQ6IDgwJTsKfQoKZGl2LlNjYWxlOTAgewogICAgbGVmdDogOTAlOwp9CgpkaXYuU2NhbGUxMDAgewogICAgbGVmdDogOTkuOSU7Cn0KCi5SVEwgZGl2LlNjYWxlMCB7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDAlOwp9CgouUlRMIGRpdi5TY2FsZTE1IHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTUlOwp9CgouUlRMIGRpdi5TY2FsZTIwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMjAlOwp9CgouUlRMIGRpdi5TY2FsZTM1IHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMzUlOwp9CgouUlRMIGRpdi5TY2FsZTQwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogNDAlOwp9CgouUlRMIGRpdi5TY2FsZTU1IHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogNTUlOwp9CgouUlRMIGRpdi5TY2FsZTYwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogNjAlOwp9CgouUlRMIGRpdi5TY2FsZTc1IHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogNzUlOwp9CgouUlRMIGRpdi5TY2FsZTgwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogODAlOwp9CgouUlRMIGRpdi5TY2FsZTkwIHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogOTAlOwp9CgouUlRMIGRpdi5TY2FsZTEwMCB7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDk5LjklOwp9Cgp9IC8qIGVuZCBAbWVkaWEgKi8=
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiAqICAtLQogKiBAcHJvamVjdCBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSA8aHR0cDovL3d3dy5vdHJzLm9yZz4gLSBDdXN0b21lciBGcm9udGVuZAogKiBAY29weXJpZ2h0IE9UUlMgQUcKICogQGxpY2Vuc2UgICAgIEFHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dCkKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBwYWNrYWdlICAgICBPVFJTIEZyYW1ld29yayAtIFNraW4gIkRlZmF1bHQiCiAqIEBzZWN0aW9uICAgICBDdXN0b21lcgogKi8KCnRhYmxlLklUU01PdmVydmlldyB7CiAgICB0b3A6IC0xcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIGNvbG9yOiAjNDQ0OwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI0ZGRjsKICAgIHpvb206IDE7CiAgICBjbGVhcjogYm90aDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouSVRTTU92ZXJ2aWV3IHRoZWFkIHsKICAgIGJhY2tncm91bmQ6ICNBN0FBQUEgdXJsKCIuLi9pbWcvR3JhZGllbnRTbWFsbC5wbmciKSByZXBlYXQteCAwIC0zMXB4OwogICAgZGlzcGxheTogbm9uZTsKfQouU29ydGFibGUgdGhlYWQgewogICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwOwp9Ci5TZWFyY2hSZXN1bHRzIHRoZWFkIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTU0cHg7Cn0KLklUU01PdmVydmlldyB0aGVhZCB0aCB7CiAgICBwYWRkaW5nOiAwOwogICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM5OTk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTsKfQouUlRMIC5JVFNNT3ZlcnZpZXcgdGhlYWQgdGggewogICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNjY2Owp9Ci5JVFNNT3ZlcnZpZXcgdGhlYWQgLlN0YXR1cyB7CiAgICBwYWRkaW5nLWxlZnQ6IDA7Cn0KLklUU01PdmVydmlldyB0aGVhZCBhIHsKICAgIHBhZGRpbmc6IDFweCAxM3B4IDRweCA4cHg7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICBjb2xvcjogIzQ0NDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNFRUU7Cn0KCi5JVFNNT3ZlcnZpZXcgdGhlYWQgc3BhbiB7CiAgICBwYWRkaW5nOiAxcHggMTNweCA0cHggOHB4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgY29sb3I6ICM3Nzc7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjRUVFOwp9CgouSVRTTU92ZXJ2aWV3IHRoZWFkIC5Tb3J0QXNjZW5kaW5nIGEsCi5JVFNNT3ZlcnZpZXcgdGhlYWQgLlNvcnREZXNjZW5kaW5nIGEgewogICAgY29sb3I6ICMyMjI7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGJhY2tncm91bmQ6IHVybCguLi9pbWcvc29ydGFibGVfYmcucG5nKSBuby1yZXBlYXQgdG9wIHJpZ2h0OwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI0JCQjsKfQouSVRTTU92ZXJ2aWV3IHRoZWFkIC5Tb3J0RGVzY2VuZGluZyBhIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGJvdHRvbSByaWdodDsKfQoKLklUU01PdmVydmlldyB0Ym9keSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKfQouSVRTTU92ZXJ2aWV3IHRib2R5IHRyIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGOwp9Ci5JVFNNT3ZlcnZpZXcgdGJvZHkgdHI6YWN0aXZlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNEREQ7Cn0KLklUU01PdmVydmlldyB0Ym9keSB0cjpmaXJzdC1jaGlsZCB7CiAgICBib3JkZXItdG9wOiBub25lOwp9Ci5JVFNNT3ZlcnZpZXcgdGJvZHkgdHIuRXZlbiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGM0YzOwp9Ci5JVFNNT3ZlcnZpZXcgdGJvZHkgdGQgewogICAgcGFkZGluZzogNnB4IDhweCAzcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyOiAwcHggc29saWQ7Cn0KLklUU01PdmVydmlldyB0Ym9keSBhIHsKICAgIGNvbG9yOiAjNDQ0OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgb3V0bGluZTogbm9uZTsKfQouSVRTTU92ZXJ2aWV3IHRhYmxlIGE6aG92ZXIgewogICAgY29sb3I6ICMwMDA7Cn0KLyoqCiAqIEBzdWJzZWN0aW9uICBUYWJsZURhdGEgU3R5bGVzCiAqLwouQ2hhbmdlU3RhdGVJRCB7CiAgICBwYWRkaW5nLWxlZnQ6IDhweDsKfQoKLk92ZXJ2aWV3IHRoZWFkIHRoLkFnZSB7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KLlJUTCAuT3ZlcnZpZXcgdGhlYWQgdGguQWdlIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9Ci8qKgogKiBAc3Vic2VjdGlvbiAgVGFibGUgU3R5bGUgQWN0aXZlCiAqLwoKLklUU01PdmVydmlldyB0Ym9keSB0cjphY3RpdmUgdGQgewogICAgcGFkZGluZzogN3B4IDhweCAycHg7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBib3R0b207Cn0KLklUU01PdmVydmlldyB0Ym9keSB0cjpmb2N1cyArIHRyIHRkLAouSVRTTU92ZXJ2aWV3IHRib2R5IHRyOmFjdGl2ZSArIHRyIHRkIHsKICAgIGJhY2tncm91bmQ6IG5vbmUKfQoKfSAvKiBlbmQgQG1lZGlhICov
LyoqCiAqIFRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCwgaHR0cHM6Ly9vZm9yay5kZS8KICogIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6IENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL29mb3JrLmRlLwogKiAgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiAqICAtLQogKiBAcHJvamVjdCBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSA8aHR0cDovL3d3dy5vdHJzLm9yZz4gLSBDdXN0b21lciBGcm9udGVuZAogKiBAY29weXJpZ2h0IE9UUlMgQUcKICogQGxpY2Vuc2UgICAgIEFHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dCkKICovCgovKioKICogQHBhY2thZ2UgICAgIFNraW4gIkRlZmF1bHQiCiAqIEBzZWN0aW9uICAgICBEZWZhdWx0IFNldHRpbmdzCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgRmxhZwogKi8KCi5GbGFnIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWcvZmxhZ19zaGFkb3cucG5nKSBuby1yZXBlYXQgc2Nyb2xsIDAgMDsKICAgIGhlaWdodDogMThweDsKICAgIHdpZHRoOiAyNHB4Owp9CgouRmxhZy5TbWFsbCB7CiAgICB3aWR0aDogMTdweDsKICAgIGhlaWdodDogMTBweDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGJvdHRvbSByaWdodDsKfQoKLkZsYWcgc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMTZweDsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgdGV4dC1pbmRlbnQ6IC05OTk5cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAvKiBzZXQgYSBkZWZhdWx0IGNvbG9yIGZvciBwcmlvcml0aWVzICovCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2RjZGNkOwp9CgouRmxhZy5TbWFsbCBzcGFuIHsKICAgIGhlaWdodDogOHB4Owp9CgoKCnVsLklUU01GbGFnIHsKICAgIG1hcmdpbi10b3A6IDVweDsKfQoKdWwuSVRTTUZsYWcgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCi5JVFNNT3ZlcnZpZXcgLkZsYWcgewogICAgcG9zaXRpb246IHN0YXRpYzsKfQoKLlJUTCBmaWVsZHNldC5UYWJsZUxpa2UgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7Cn0KCi5GbGFnIHNwYW4uZ3JheWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNjZGNkY2Q7Cn0KCi5GbGFnIHNwYW4uZ3JlZW5sZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzhiZWY0ZDsKfQoKLkZsYWcgc3Bhbi55ZWxsb3dsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZGQ1MDsKfQoKLkZsYWcgc3Bhbi5yZWRsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojZmY1MDVlOwp9CgouRmxhZyBzcGFuLnB1cnBsZWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNiMjNhZWU7Cn0KCi5GbGFnIHNwYW4ub3JhbmdlbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6I2ZmOGMwMDsKfQoKLkZsYWcgc3Bhbi5jeWFubGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6Izc5Y2RjZDsKfQoKLkZsYWcgc3Bhbi53aGl0ZWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7Cn0KCi5GbGFnIHNwYW4uYmxhY2tsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOwp9CgovKioKICogQG5vdGUgICAgIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgZm9yIGEgTGFiZWwgYW5kIGEgRGl2IHdpdGggY2xhc3MgJ0ZpZWxkJywKICogICAgICAgICAgIHRoYXQgYXJlIGluc2lkZSBhIEZpZWxkIERpdiAuCiAqLwoKbGFiZWwuU3ViRWxlbWVudCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7Cn0KCmRpdi5TdWJFbGVtZW50IHsKICAgIHdpZHRoOjM1JTsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uIE5vRG91YmxlQm9yZGVycwogKi8KCi5Db250ZW50Lk5vRG91YmxlQm9yZGVycyB7CiAgICBib3JkZXItbGVmdDogMCBub25lICMwMDAwMDA7CiAgICBib3JkZXItcmlnaHQ6IDAgbm9uZSAjMDAwMDAwOwp9CgovKioKICogQHN1YnNlY3Rpb24gIFN0YW5kYXJkIFdpZHRocwogKi8KLlc1cGMgewogICAgd2lkdGg6IDUlOwp9CgouVzE1cGMgewogICAgd2lkdGg6IDE1JTsKfQoKLlczMHBjIHsKICAgIHdpZHRoOiAzMCU7Cn0KCn0vKiBlbmQgbWVkaWEgKi8KCgo=
iVBORw0KGgoAAAANSUhEUgAAABgAAAASBAMAAACzwgOtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAASUExURf///wAAAAAAAAAAAAAAAAAAAGScwJoAAAAGdFJOUwAKHSZWc59IcHQAAAAfSURBVAhbY2BAAEUkNoMTMid46HBUQuHAiUHIGA4UAaNuCtd5VfraAAAAAElFTkSuQmCC
IyAtLQojIHZhci9wYWNrYWdlc2V0dXAvSVRTTUNoYW5nZU1hbmFnZW1lbnQucG0KIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSx2IDEuNCAyMDE4LzEwLzMwIDE0OjQwOjE4IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ2hhbmdlTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Ok91dHB1dDo6VGVtcGxhdGU6OlByb3ZpZGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZFZhbHVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlhNTCcsCik7Cgo9aGVhZDEgTkFNRQoKdmFyOjpwYWNrYWdlc2V0dXA6OklUU01DaGFuZ2VNYW5hZ2VtZW50IC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIERFU0NSSVBUSU9OCgpGdW5jdGlvbnMgZm9yIGluc3RhbGxpbmcgdGhlIElUU01DaGFuZ2VNYW5hZ2VtZW50IHBhY2thZ2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWN1dAoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0LgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUNoYW5nZU1hbmFnZW1lbnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBGb3JjZSBhIHJlbG9hZCBvZiBaWlpBdXRvLnBtIGFuZCBaWlpBQXV0by5wbSB0byBnZXQgdGhlIGZyZXNoIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJUlOQyApIHsKICAgICAgICBpZiAoICRNb2R1bGUgPX4gbS9aWlpBQT91dG9cLnBtJC8gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSU5DeyRNb2R1bGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIENyZWF0ZSBjb21tb24gb2JqZWN0cyB3aXRoIGZyZXNoIGRlZmF1bHQgY29uZmlnLgogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCk7CgogICAgIyBkZWZpbmUgVXNlcklEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGF0cyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZGVmaW5lIGZpbGUgcHJlZml4IGZvciBzdGF0cwogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdJVFNNU3RhdHMnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvZGVJbnN0YWxsKCkKClJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY2hhbmdlCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLWNoYW5nZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENoYW5nZSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLWNoYW5nZS1idWlsZGVyCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLWNoYW5nZS1idWlsZGVyJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ2hhbmdlIEJ1aWxkZXJzLicsCiAgICApOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLWNoYW5nZS1tYW5hZ2VyCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICdpdHNtLWNoYW5nZS1tYW5hZ2VyJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ2hhbmdlIE1hbmFnZXJzLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgc2V0IGRlZmF1bHQgU3RhdGVNYWNoaW5lIHNldHRpbmdzCiAgICAkU2VsZi0+X1N0YXRlTWFjaGluZURlZmF1bHRTZXQoKTsKCiAgICAjIGFkZCBub3RpZmljYXRpb25zCiAgICAkU2VsZi0+X0FkZE5vdGlmaWNhdGlvbnMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVSZWluc3RhbGwoKQoKUnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0LgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jaGFuZ2UKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tY2hhbmdlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ2hhbmdlIG1hc2sgYWNjZXNzIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJywKICAgICk7CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY2hhbmdlLWJ1aWxkZXIKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDaGFuZ2UgQnVpbGRlcnMuJywKICAgICk7CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY2hhbmdlLW1hbmFnZXIKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tY2hhbmdlLW1hbmFnZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDaGFuZ2UgTWFuYWdlcnMuJywKICAgICk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgc2V0IGRlZmF1bHQgQ0lQIG1hdHJpeAogICAgJFNlbGYtPl9DSVBEZWZhdWx0TWF0cml4U2V0KCk7CgogICAgIyBzZXQgZGVmYXVsdCBTdGF0ZU1hY2hpbmUgc2V0dGluZ3MKICAgICRTZWxmLT5fU3RhdGVNYWNoaW5lRGVmYXVsdFNldCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVwZ3JhZGUoKQoKUnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydC4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cycpLT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBzZXQgZGVmYXVsdCBDSVAgbWF0cml4ICh0aGlzIGlzIG9ubHkgZG9uZSBpZiBubyBtYXRyaXggZXhpc3RzKQogICAgJFNlbGYtPl9DSVBEZWZhdWx0TWF0cml4U2V0KCk7CgogICAgIyBjaGFuZ2Ugbm90aWZpY2F0aW9ucwogICAgJFNlbGYtPl9DaGFuZ2VOb3RpZmljYXRpb25zKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18zXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAzLjMuOTEgKDQuMC4wIEJldGEgMSkuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzNfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18zXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgTWlncmF0ZSBjaGFuZ2UgYW5kIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgdG8gZHluYW1pYyBmaWVsZHMuCiAgICAkU2VsZi0+X01pZ3JhdGVGcmVlVGV4dFRvRHluYW1pY0ZpZWxkcygpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuMi4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSB0aGUgRFRMIENvbnRlbnQgaW4gdGhlIFN5c0NvbmZpZwogICAgJFNlbGYtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDQuMC45MSAoNS4wLjAgQmV0YSAxKS4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtaWdyYXRlIG5vdGlmaWNhdGlvbnMKICAgICRTZWxmLT5fTWlncmF0ZU5vdGlmaWNhdGlvbnMoKTsKCiAgICAjIGNoYW5nZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgbmV3IG1vZHVsZSBsb2NhdGlvbi4KICAgICRTZWxmLT5fTWlncmF0ZUNvbmZpZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl81XzBfMTIoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDUuMC4xMi4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzVfMF8xMigpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl81XzBfMTIgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGFuZ2UgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggYSBuZXcgSmF2YVNjcmlwdCBmaWxlIGxvY2F0aW9uCiAgICAkU2VsZi0+X01pZ3JhdGVDb25maWdzRnJvbUxvd2VyVGhhbl81XzBfMTIoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVbmluc3RhbGwoKQoKUnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0LgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBhbGwgbGlua3Mgd2l0aCBjaGFuZ2UgYW5kIHdvcmtvcmRlciBvYmplY3RzCiAgICAkU2VsZi0+X0xpbmtEZWxldGUoKTsKCiAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgYXR0YWNobWVudHMgZm9yIGNoYW5nZXMgYW5kIHdvcmtvcmRlcnMKICAgICRTZWxmLT5fQXR0YWNobWVudERlbGV0ZSgpOwoKICAgICMgZGVsZXRlIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgY2hhbmdlcyBhbmQgd29ya29yZGVycwogICAgJFNlbGYtPl9EeW5hbWljRmllbGRzRGVsZXRlKCk7CgogICAgIyBkZWFjdGl2YXRlIHRoZSBncm91cCBpdHNtLWNoYW5nZQogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAnaXRzbS1jaGFuZ2UnLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIGl0c20tY2hhbmdlLWJ1aWxkZXIKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIGl0c20tY2hhbmdlLW1hbmFnZXIKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tY2hhbmdlLW1hbmFnZXInLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9NaWdyYXRlRnJlZVRleHRUb0R5bmFtaWNGaWVsZHMoKQoKTWlncmF0ZXMgdGhlIGNoYW5nZSBhbmQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyB0byBkeW5hbWljIGZpZWxkcy4KCiAgICBteSAkU3VjY2VzcyA9ICRQYWNrYWdlU2V0dXAtPl9NaWdyYXRlRnJlZVRleHRUb0R5bmFtaWNGaWVsZHMoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZUZyZWVUZXh0VG9EeW5hbWljRmllbGRzIHsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBNaWdyYXRlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGZpZWxkcyB0byBkeW5hbWljIGZpZWxkcyAoanVzdCB0aGUgZmllbGRzLCB0aGUgZGF0YSBjb21lcyBsYXRlcikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKICAgICMgZ2V0IGFsbCBjb25maWd1cmVkIGNoYW5nZSBhbmQgd29ya29yZGVyIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IG51bWJlcnMgZnJvbSBzeXNjb25maWcKICAgIG15IEBEeW5hbWljRmllbGRzOwogICAgZm9yIG15ICRUeXBlIChxdyhDaGFuZ2UgV29ya09yZGVyKSkgewoKICAgICAgICBGUkVFVEVYVE5VTUJFUjoKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNTAwICkgewoKICAgICAgICAgICAgIyBnZXQgZnJlZWtleSBhbmQgZnJlZXRleHQgY29uZmlnCiAgICAgICAgICAgIG15ICRGcmVlS2V5Q29uZmlnICA9ICRDb25maWdPYmplY3QtPkdldCggJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyICk7CiAgICAgICAgICAgIG15ICRGcmVlVGV4dENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCggJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciApOwoKICAgICAgICAgICAgIyBvbmx5IGlmIGEgS0VZIGNvbmZpZyBleGlzdHMKICAgICAgICAgICAgbmV4dCBGUkVFVEVYVE5VTUJFUiBpZiAhJEZyZWVLZXlDb25maWc7CgogICAgICAgICAgICAjIGRlZmF1bHQgbGFiZWwsIHNhbWUgbGlrZSB0aGUgbmFtZQogICAgICAgICAgICBteSAkTGFiZWwgPSAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyOwoKICAgICAgICAgICAgIyB0aGUgZnJlZWtleSBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeSwgdGhlbiB3ZSB3YW50IHRvIGNyZWF0ZQogICAgICAgICAgICAjIGl0IGFzIGl0J3Mgb3duIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgaWYgKCByZWYgJEZyZWVLZXlDb25maWcgZXEgJ0hBU0gnICYmIHNjYWxhciBrZXlzICV7JEZyZWVLZXlDb25maWd9ID4gMSApIHsKCiAgICAgICAgICAgICAgICAjIGZpbmQgb3V0IGlmIHBvc3NpYmxlIG5vbmUgbXVzdCBiZSBzZXQgb3Igbm90CiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgICAgICAgICAgICAgIGlmICggJEZyZWVLZXlDb25maWctPnsnJ30gJiYgJEZyZWVLZXlDb25maWctPnsnJ30gZXEgJy0nICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRnJlZUtleUNvbmZpZy0+eycnfTsKICAgICAgICAgICAgICAgICAgICAkUG9zc2libGVOb25lID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRzLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU00nIC4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgLiAnOjpEZWZhdWx0U2VsZWN0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRnJlZUtleUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhlIGtleSBoYXMgb25seSBvbmUgcG9zc2libGUgdmFsdWUgZm9yIHRoaXMgZW50cnkgd2UgdXNlIGl0IGFzIHRoZSBsYWJlbAogICAgICAgICAgICAjIGFuZCB3ZSBkbyBOT1QgY3JlYXRlIGFuIG93biBGcmVlS0VZIGZpZWxkLCBvbmx5IHRoZSBGcmVlVEVYVCBmaWVsZCEKICAgICAgICAgICAgZWxzaWYgKCByZWYgJEZyZWVLZXlDb25maWcgZXEgJ0hBU0gnICYmIHNjYWxhciBrZXlzICV7JEZyZWVLZXlDb25maWd9ID09IDEgKSB7CgogICAgICAgICAgICAgICAgIyBidXQgd2UgdHJ5IHRvIHRha2UgdGhlIG9ubHkgZW50cnkgb2YgdGhlIEtFWSBhcyBsYWJlbCEKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEZyZWVLZXlDb25maWd9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEZyZWVLZXlDb25maWctPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExhYmVsID0gJEZyZWVLZXlDb25maWctPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZnJlZXRleHQgY29uZmlnIGlzIGEgaGFzaCAtPiB3ZSBuZWVkIGEgZHJvcGRvd24KICAgICAgICAgICAgaWYgKCAkRnJlZVRleHRDb25maWcgJiYgcmVmICRGcmVlVGV4dENvbmZpZyBlcSAnSEFTSCcgJiYgJXskRnJlZVRleHRDb25maWd9ICkgewoKICAgICAgICAgICAgICAgICMgZmluZCBvdXQgaWYgcG9zc2libGUgbm9uZSBtdXN0IGJlIHNldCBvciBub3QKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICAgICAgaWYgKCAkRnJlZVRleHRDb25maWctPnsnJ30gJiYgJEZyZWVUZXh0Q29uZmlnLT57Jyd9IGVxICctJyApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEZyZWVUZXh0Q29uZmlnLT57Jyd9OwogICAgICAgICAgICAgICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZHMsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU00nIC4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgLiAnOjpMaW5rJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG5vIGZyZWV0ZXh0IGNvbmZpZyAtPiB3ZSBuZWVkIGEgdGV4dCBmaWVsZAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRzLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIExhYmVsICAgICAgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0lUU00nIC4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgLiAnOjpMaW5rJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhbGwgY3VycmVudCBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyBnZXQgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBvcmRlciBsaXN0IGFuZCBhZGQgMQogICAgbXkgJE5leHRPcmRlck51bWJlciA9IDE7CiAgICBpZiAoQER5bmFtaWNmaWVsZE9yZGVyTGlzdCkgewogICAgICAgICROZXh0T3JkZXJOdW1iZXIgPSAkRHluYW1pY2ZpZWxkT3JkZXJMaXN0Wy0xXSArIDE7CiAgICB9CgogICAgIyBnZXQgdGhlIHZhbGlkIGlkIGZvciAidmFsaWQiCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICAjIHJlbWVtYmVyIGN1cnJlbnQgc2V0dGluZyBmb3IgZXZlbnQgbW9kdWxlIGNvbmZpZ3VyYXRpb20KICAgIG15ICRFdmVudE1vZHVsZUNvbmZpZwogICAgICAgID0gJENvbmZpZ09iamVjdC0+eydEeW5hbWljRmllbGQ6OkV2ZW50TW9kdWxlUG9zdCd9LT57JzEwMC1VcGRhdGVJVFNNQ2hhbmdlQ29uZGl0aW9ucyd9OwoKICAgICMgdGVtcG9yYXJ5IGRlbGV0ZSBldmVudCBtb2R1bGUgY29uZmlndXJhdGlvbgogICAgZGVsZXRlICRDb25maWdPYmplY3QtPnsnRHluYW1pY0ZpZWxkOjpFdmVudE1vZHVsZVBvc3QnfS0+eycxMDAtVXBkYXRlSVRTTUNoYW5nZUNvbmRpdGlvbnMnfTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgZmllbGQKICAgICAgICBteSAkRmllbGRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TGFiZWx9LAogICAgICAgICAgICBGaWVsZE9yZGVyID0+ICROZXh0T3JkZXJOdW1iZXIsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0sCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9LAogICAgICAgICAgICBDb25maWcgICAgID0+ICREeW5hbWljRmllbGQtPntDb25maWd9LAogICAgICAgICAgICBWYWxpZElEICAgID0+ICRWYWxpZElELAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJEZpZWxkSUQ7CgogICAgICAgICMgaW5jcmVhc2UgdGhlIG9yZGVyIG51bWJlcgogICAgICAgICROZXh0T3JkZXJOdW1iZXIrKzsKICAgIH0KCiAgICAjIHJlLWFjdGl2YXRlIHRoZSBjb25maWcgc2V0dGluZyBhZ2FpbgogICAgJENvbmZpZ09iamVjdC0+eydEeW5hbWljRmllbGQ6OkV2ZW50TW9kdWxlUG9zdCd9LT57JzEwMC1VcGRhdGVJVFNNQ2hhbmdlQ29uZGl0aW9ucyd9CiAgICAgICAgPSAkRXZlbnRNb2R1bGVDb25maWc7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgTWlncmF0ZSB0aGUgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZGF0YSBmcm9tIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGZpZWxkcyB0byBkeW5hbWljIGZpZWxkcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjIGdldCB0aGUgbGlzdCBvZiBjaGFuZ2UgYW5kIHdvcmtvcmRlciBkeW5hbWljIGZpZWxkcwogICAgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+IFsgJ0lUU01DaGFuZ2UnLCAnSVRTTVdvcmtPcmRlcicgXSwKICAgICk7CgogICAgIyBtaWdyYXRlIHRoZSBmcmVla2V5IGFuZCBmcmVldGV4dCBkYXRhCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewoKICAgICAgICAjIGdldCB0aGUgdGFibGUgcHJlZml4IGFuZCBjb2x1bW4gbmFtZSBiYXNlZCBvbiBjaGFuZ2Ugb3Igd29ya29yZGVyCiAgICAgICAgbXkgJFRhYmxlUHJlZml4OwogICAgICAgIG15ICRDb2x1bW5OYW1lOwogICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdJVFNNQ2hhbmdlJyApIHsKICAgICAgICAgICAgJFRhYmxlUHJlZml4ID0gJ2NoYW5nZV9mcmVlJzsKICAgICAgICAgICAgJENvbHVtbk5hbWUgID0gJ2NoYW5nZV9pZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAgICAgJFRhYmxlUHJlZml4ID0gJ2NoYW5nZV93b19mcmVlJzsKICAgICAgICAgICAgJENvbHVtbk5hbWUgID0gJ3dvcmtvcmRlcl9pZCc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgdHlwZSAoa2V5IG9yIHRleHQpIGFuZCB0aGUgbnVtYmVyIGZyb20gdGhlIG5hbWUKICAgICAgICBteSAkTnVtYmVyOwogICAgICAgIG15ICRUYWJsZU5hbWU7CiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gPX4gbXsgXEEgKENoYW5nZXxXb3JrT3JkZXIpRnJlZShLZXl8VGV4dCkoXGQrKSBceiB9eG1zICkgewogICAgICAgICAgICAkVGFibGVOYW1lID0gJFRhYmxlUHJlZml4IC4gbGMoJDIpOwogICAgICAgICAgICAkTnVtYmVyICAgID0gJDM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBvbGQgZGF0YQogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgJENvbHVtbk5hbWUsIGZpZWxkX3ZhbHVlCiAgICAgICAgICAgICAgICAgICAgRlJPTSAkVGFibGVOYW1lCiAgICAgICAgICAgICAgICAgICAgV0hFUkUgZmllbGRfaWQgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkTnVtYmVyIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgQERhdGE7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGluc2VydCBkYXRhIGludG8gZHluYW1pY19maWVsZF92YWx1ZSB0YWJsZQogICAgICAgIFJFQ09SRDoKICAgICAgICBmb3IgbXkgJFJlY29yZCAoQERhdGEpIHsKCiAgICAgICAgICAgIG5leHQgUkVDT1JEIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGR5bmFtaWNfZmllbGRfdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkX2lkLCBvYmplY3RfaWQsIHZhbHVlX3RleHQpCiAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgXCREeW5hbWljRmllbGQtPntJRH0sCiAgICAgICAgICAgICAgICAgICAgXCRSZWNvcmQtPntPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgXCRSZWNvcmQtPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBEZWxldGUgb2Jzb2xldGUgZnJlZWtleSBhbmQgZnJlZXRleHQgZmllbGQgYXR0cmlidXRlcyBmcm9tIGNvbmRpdGlvbnMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoIGZvciBhbGwgbmV3IGNyZWF0ZWQgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZHluYW1pYyBmaWVsZHMKICAgIG15ICVEeW5hbWljRmllbGROYW1lOwogICAgZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CiAgICAgICAgJER5bmFtaWNGaWVsZE5hbWV7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhbGwgY29uZGl0aW9uIGF0dHJpYnV0ZXMKICAgIG15ICRDb25kaXRpb25BdHRyaWJ1dGVzCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbicpLT5BdHRyaWJ1dGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgIyByZXZlcnNlIHRoZSBsaXN0IHRvIGxvb2t1cCBhdHRyaWJ1dGUgbmFtZXMKICAgIG15ICVBdHRyaWJ1dGUySUQgPSByZXZlcnNlICV7JENvbmRpdGlvbkF0dHJpYnV0ZXN9OwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVBdHRyaWJ1dGUySUQgKSB7CgogICAgICAgICMgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvbGQgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZnJlZWtleSBhbmQgZnJlZXRleHQgYXR0cmlidXRlcwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICRBdHRyaWJ1dGUgIX4gbXsgXEEgKENoYW5nZXxXb3JrT3JkZXIpRnJlZShLZXl8VGV4dCkoXGQrKSBceiB9eG1zOwoKICAgICAgICAjIHJlbmFtZSB0aGUgYXR0cmlidXRlIChhZGQgYSBwcmVmaXggdG8gdGhlIGF0dHJpYnV0ZSkKICAgICAgICBpZiAoICREeW5hbWljRmllbGROYW1leyRBdHRyaWJ1dGV9ICkgewoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MKICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24nKS0+QXR0cmlidXRlVXBkYXRlKAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJEF0dHJpYnV0ZTJJRHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICRBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGhpcyBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QgYXMgZHluYW1pYyBmaWVsZAogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBkZWxldGUgdGhpcyBhdHRyaWJ1dGUgZnJvbSBleHByZXNzaW9uIHRhYmxlCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNvbmRpdGlvbl9leHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGF0dHJpYnV0ZV9pZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgXCRBdHRyaWJ1dGUySUR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgdGhpcyBhdHRyaWJ1dGUgZnJvbSBhY3Rpb24gdGFibGUKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2FjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBhdHRyaWJ1dGVfaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkQXR0cmlidXRlMklEeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoaXMgYXR0cmlidXRlIGZyb20gYXR0cmlidXRlIHRhYmxlCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNvbmRpdGlvbl9hdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkQXR0cmlidXRlMklEeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgTWlncmF0ZSBmcmVldGV4dCBzY3JlZW4gY29uZmlnCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgQE5ld1NldHRpbmdzOwoKICAgICMgbWlncmF0ZSBjaGFuZ2UgZnJlZXRleHQgZnJvbnRlbmQgY29uZmlnCiAgICBDT05GSUdOQU1FOgogICAgZm9yIG15ICRDb25maWdOYW1lICgKICAgICAgICBxdygKICAgICAgICBJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlQWRkCiAgICAgICAgSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUVkaXQKICAgICAgICBJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2VhcmNoCiAgICAgICAgSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlckFkZAogICAgICAgIElUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJFZGl0CiAgICAgICAgSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydAogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRGaWVsZFR5cGU7CiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgkQ29uZmlnTmFtZSk7CiAgICAgICAgaWYgKCAkQ29uZmlnTmFtZSA9fiBteyBBZ2VudElUU01Xb3JrT3JkZXIgfXhtcyApIHsKICAgICAgICAgICAgJEZpZWxkVHlwZSA9ICdXb3JrT3JkZXJGcmVlVGV4dCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRmllbGRUeXBlID0gJ0NoYW5nZUZyZWVUZXh0JzsKICAgICAgICB9CiAgICAgICAgJENvbmZpZyA9ICRDb25maWctPnskRmllbGRUeXBlfTsKCiAgICAgICAgbXkgJVNldHRpbmdOZXc7CiAgICAgICAgTlVNQkVSOgogICAgICAgIGZvciBteSAkTnVtYmVyICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkQ29uZmlnLT57JE51bWJlcn07CgogICAgICAgICAgICBuZXh0IE5VTUJFUiBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgJFNldHRpbmdOZXd7ICRGaWVsZFR5cGUgLiAkTnVtYmVyIH0gPSAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IENPTkZJR05BTUUgaWYgISVTZXR0aW5nTmV3OwoKICAgICAgICAjIEJ1aWxkIG5ldyBzZXR0aW5nLgogICAgICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICRDb25maWdOYW1lIC4gJyMjI0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+IFwlU2V0dGluZ05ldywKICAgICAgICB9OwogICAgfQoKICAgIG15ICVDaGFuZ2VEeW5hbWljRmllbGRDb25maWc7CiAgICBteSAlV29ya29yZGVyRHluYW1pY0ZpZWxkQ29uZmlnOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdJVFNNQ2hhbmdlJyApIHsKICAgICAgICAgICAgJENoYW5nZUR5bmFtaWNGaWVsZENvbmZpZ3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnSVRTTVdvcmtPcmRlcicgKSB7CiAgICAgICAgICAgICRXb3Jrb3JkZXJEeW5hbWljRmllbGRDb25maWd7ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjRHluYW1pY0ZpZWxkJywKICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiBcJUNoYW5nZUR5bmFtaWNGaWVsZENvbmZpZywKICAgIH07CgogICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0lUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJab29tIyMjRHluYW1pY0ZpZWxkJywKICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiBcJVdvcmtvcmRlckR5bmFtaWNGaWVsZENvbmZpZywKICAgIH07CgogICAgIyBXcml0ZSBuZXcgc2V0dGluZy4KICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdzU2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIENvbW1lbnRzID0+CiAgICAgICAgICAgICdJVFNNQ2hhbmdlTWFuYWdlbWVudCAtIHBhY2thZ2Ugc2V0dXAgZnVuY3Rpb246IF9NaWdyYXRlRnJlZVRleHRUb0R5bmFtaWNGaWVsZHMnLAogICAgICAgIFNldHRpbmdzID0+IFxATmV3U2V0dGluZ3MsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIERlbGV0ZSBjaGFuZ2UgYW5kIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCB0YWJsZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBteSBARHJvcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwoKICAgICAgICAgICAgIyBkcm9wIHRhYmxlIGNoYW5nZV9mcmVla2V5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlRHJvcCcsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdjaGFuZ2VfZnJlZWtleScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlRHJvcCcsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdFbmQnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBkcm9wIHRhYmxlIGNoYW5nZV9mcmVldGV4dAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZURyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnY2hhbmdlX2ZyZWV0ZXh0JywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVEcm9wJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ0VuZCcsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIGRyb3AgdGFibGUgY2hhbmdlX3dvX2ZyZWVrZXkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVEcm9wJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2NoYW5nZV93b19mcmVla2V5JywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVEcm9wJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ0VuZCcsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIGRyb3AgdGFibGUgY2hhbmdlX3dvX2ZyZWV0ZXh0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlRHJvcCcsCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdjaGFuZ2Vfd29fZnJlZXRleHQnLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnU3RhcnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZURyb3AnLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICBmb3IgbXkgJFNRTCAoQERyb3ApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAkU1FMLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfR3JvdXBBZGQoKQoKQWRkIGEgZ3JvdXAuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGdyb3VwIGRlc2NyaXB0aW9uLicsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIERlc2NyaXB0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGdldCBsaXN0IG9mIGFsbCBncm91cHMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KCk7CgogICAgIyByZXZlcnNlIHRoZSBncm91cCBsaXN0IGZvciBlYXNpZXIgbG9va3VwCiAgICBteSAlR3JvdXBMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJUdyb3VwTGlzdDsKCiAgICAjIGNoZWNrIGlmIGdyb3VwIGFscmVhZHkgZXhpc3RzCiAgICBteSAkR3JvdXBJRCA9ICRHcm91cExpc3RSZXZlcnNleyAkUGFyYW17TmFtZX0gfTsKCiAgICAjIHJlYWN0aXZhdGUgdGhlIGdyb3VwCiAgICBpZiAoJEdyb3VwSUQpIHsKCiAgICAgICAgIyBnZXQgY3VycmVudCBncm91cCBkYXRhCiAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJlYWN0aXZhdGUgZ3JvdXAKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBVcGRhdGUoCiAgICAgICAgICAgICVHcm91cERhdGEsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBhZGQgdGhlIGdyb3VwCiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgbG9va3VwIHRoZSBuZXcgZ3JvdXAgaWQKICAgIG15ICROZXdHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgYWRkIHVzZXIgcm9vdCB0byB0aGUgZ3JvdXAKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckFkZCgKICAgICAgICBHSUQgICAgICAgID0+ICROZXdHcm91cElELAogICAgICAgIFVJRCAgICAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgICAgICBydyAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9Hcm91cERlYWN0aXZhdGUoKQoKRGVhY3RpdmF0ZSBhIGdyb3VwLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cERlYWN0aXZhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgZ3JvdXAgaWQKICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICRQYXJhbXtOYW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGdldCBjdXJyZW50IGdyb3VwIGRhdGEKICAgIG15ICVHcm91cERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBHZXQoCiAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgZ3JvdXAKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cFVwZGF0ZSgKICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7aW52YWxpZH0sCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9DSVBEZWZhdWx0TWF0cml4U2V0KCkKClNldCB0aGUgZGVmYXVsdCBDSVAgbWF0cml4LgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCj1jdXQKCnN1YiBfQ0lQRGVmYXVsdE1hdHJpeFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgYWxsb2NhdGlvbiBsaXN0CiAgICBteSAkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnKS0+QWxsb2NhdGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTGlzdCBuZSAnSEFTSCc7CgogICAgIyBzZXQgbm8gbWF0cml4IGlmIGFscmVhZHkgZGVmaW5lZAogICAgcmV0dXJuIGlmICV7JExpc3R9OwoKICAgICMgZGVmaW5lIHRoZSBhbGxvY2F0aW9ucwogICAgIyAkQWxsb2NhdGlvbntJbXBhY3R9LT57Q2F0ZWdvcnl9ID0gUHJpb3JpdHkKICAgIG15ICVBbGxvY2F0aW9uOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eycxIHZlcnkgbG93J30gICA9ICcxIHZlcnkgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnMiBsb3cnfSAgICAgICAgPSAnMSB2ZXJ5IGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzMgbm9ybWFsJ30gICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnNCBoaWdoJ30gICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eyc1IHZlcnkgaGlnaCd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eycxIHZlcnkgbG93J30gICAgICAgID0gJzEgdmVyeSBsb3cnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnMiBsb3cnfSAgICAgICAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzQgaGlnaCd9ICAgICAgICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnMSB2ZXJ5IGxvdyd9ICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eycyIGxvdyd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzMgbm9ybWFsJ30gICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNCBoaWdoJ30gICAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzEgdmVyeSBsb3cnfSAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnMiBsb3cnfSAgICAgICAgICAgID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc1IHZlcnkgaGlnaCd9ICAgICAgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnMSB2ZXJ5IGxvdyd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eycyIGxvdyd9ICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgID0gJzUgdmVyeSBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzUgdmVyeSBoaWdoJ30gPSAnNSB2ZXJ5IGhpZ2gnOwoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6SW1wYWN0JywKICAgICk7CiAgICBteSAlSW1wYWN0TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEltcGFjdExpc3R9OwoKICAgICMgZ2V0IGNhdGVnb3J5IGxpc3QKICAgIG15ICRDYXRlZ29yeUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNhdGVnb3J5JywKICAgICk7CiAgICBteSAlQ2F0ZWdvcnlMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskQ2F0ZWdvcnlMaXN0fTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAkUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpQcmlvcml0eScsCiAgICApOwogICAgbXkgJVByaW9yaXR5TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JFByaW9yaXR5TGlzdH07CgogICAgIyBjcmVhdGUgdGhlIGFsbG9jYXRpb24gbWF0cml4CiAgICBteSAlQWxsb2NhdGlvbk1hdHJpeDsKICAgIElNUEFDVDoKICAgIGZvciBteSAkSW1wYWN0ICggc29ydCBrZXlzICVBbGxvY2F0aW9uICkgewoKICAgICAgICBuZXh0IElNUEFDVCBpZiAhJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICAjIGV4dHJhY3QgaW1wYWN0IGlkCiAgICAgICAgbXkgJEltcGFjdElEID0gJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICBDQVRFR09SWToKICAgICAgICBmb3IgbXkgJENhdGVnb3J5ICggc29ydCBrZXlzICV7ICRBbGxvY2F0aW9ueyRJbXBhY3R9IH0gKSB7CgogICAgICAgICAgICBuZXh0IENBVEVHT1JZIGlmICEkQ2F0ZWdvcnlMaXN0UmV2ZXJzZXskQ2F0ZWdvcnl9OwoKICAgICAgICAgICAgIyBleHRyYWN0IHByaW9yaXR5CiAgICAgICAgICAgIG15ICRQcmlvcml0eSA9ICRBbGxvY2F0aW9ueyRJbXBhY3R9LT57JENhdGVnb3J5fTsKCiAgICAgICAgICAgIG5leHQgQ0FURUdPUlkgaWYgISRQcmlvcml0eUxpc3RSZXZlcnNleyRQcmlvcml0eX07CgogICAgICAgICAgICAjIGV4dHJhY3QgY3JpdGljYWxpdHkgaWQgYW5kIHByaW9yaXR5IGlkCiAgICAgICAgICAgIG15ICRDYXRlZ29yeUlEID0gJENhdGVnb3J5TGlzdFJldmVyc2V7JENhdGVnb3J5fTsKICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkUHJpb3JpdHlMaXN0UmV2ZXJzZXskUHJpb3JpdHl9OwoKICAgICAgICAgICAgJEFsbG9jYXRpb25NYXRyaXh7JEltcGFjdElEfS0+eyRDYXRlZ29yeUlEfSA9ICRQcmlvcml0eUlEOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNhdmUgdGhlIG1hdHJpeAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZScpLT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gXCVBbGxvY2F0aW9uTWF0cml4LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9TdGF0ZU1hY2hpbmVEZWZhdWx0U2V0KCkKClNldCB0aGUgZGVmYXVsdCBzdGF0ZSBtYWNoaW5lLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1N0YXRlTWFjaGluZURlZmF1bHRTZXQoKTsKCj1jdXQKCnN1YiBfU3RhdGVNYWNoaW5lRGVmYXVsdFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBjaGFuZ2Ugc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgbXkgJU5hbWUyQ2hhbmdlU3RhdGVJRCA9IHJldmVyc2UgJXsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgKQogICAgfTsKCiAgICAjIGdldCB0aGUgd29ya29yZGVyIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgIG15ICVOYW1lMldvcmtPcmRlclN0YXRlSUQgPSByZXZlcnNlICV7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICkKICAgIH07CgogICAgIyBkZWZpbmUgQ2hhbmdlU3RhdGUgdHJhbnNpdGlvbnMKICAgIG15ICVDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zID0gKAogICAgICAgIDAgICAgICAgICAgICAgICAgICA9PiBbJ3JlcXVlc3RlZCddLAogICAgICAgICdyZXF1ZXN0ZWQnICAgICAgICA9PiBbICdyZWplY3RlZCcsICdyZXRyYWN0ZWQnLCAncGVuZGluZyBhcHByb3ZhbCcsICdpbiBwcm9ncmVzcycgXSwKICAgICAgICAncGVuZGluZyBhcHByb3ZhbCcgPT4gWyAncmVqZWN0ZWQnLCAncmV0cmFjdGVkJywgJ2FwcHJvdmVkJyBdLAogICAgICAgICdhcHByb3ZlZCcgICAgICAgICA9PiBbICdyZXRyYWN0ZWQnLCAnaW4gcHJvZ3Jlc3MnIF0sCiAgICAgICAgJ2luIHByb2dyZXNzJyAgICAgID0+IFsgJ3BlbmRpbmcgcGlyJywgJ3JldHJhY3RlZCcsICdmYWlsZWQnLCAnc3VjY2Vzc2Z1bCcsICdjYW5jZWxlZCcgXSwKICAgICAgICAncGVuZGluZyBwaXInICAgICAgPT4gWyAnZmFpbGVkJywgJ3N1Y2Nlc3NmdWwnIF0sCiAgICAgICAgJ3JlamVjdGVkJyAgICAgICAgID0+IFswXSwKICAgICAgICAncmV0cmFjdGVkJyAgICAgICAgPT4gWzBdLAogICAgICAgICdmYWlsZWQnICAgICAgICAgICA9PiBbMF0sCiAgICAgICAgJ3N1Y2Nlc3NmdWwnICAgICAgID0+IFswXSwKICAgICAgICAnY2FuY2VsZWQnICAgICAgICAgPT4gWzBdLAogICAgKTsKCiAgICAjIGRlZmluZSBXb3JrT3JkZXJTdGF0ZSB0cmFuc2l0aW9ucwogICAgbXkgJVdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgPSAoCiAgICAgICAgMCAgICAgICAgICAgICA9PiBbJ2NyZWF0ZWQnXSwKICAgICAgICAnY3JlYXRlZCcgICAgID0+IFsgJ2FjY2VwdGVkJywgJ2NhbmNlbGVkJyBdLAogICAgICAgICdhY2NlcHRlZCcgICAgPT4gWyAncmVhZHknLCAnY2FuY2VsZWQnIF0sCiAgICAgICAgJ3JlYWR5JyAgICAgICA9PiBbICdpbiBwcm9ncmVzcycsICdjYW5jZWxlZCcgXSwKICAgICAgICAnaW4gcHJvZ3Jlc3MnID0+IFsgJ2Nsb3NlZCcsICdjYW5jZWxlZCcgXSwKICAgICAgICAnY2FuY2VsZWQnICAgID0+IFswXSwKICAgICAgICAnY2xvc2VkJyAgICAgID0+IFswXSwKICAgICk7CgogICAgIyBpbnNlcnQgQ2hhbmdlU3RhdGUgdHJhbnNpdGlvbnMgaW50byBkYXRhYmFzZQogICAgZm9yIG15ICRTdGF0ZSAoIHNvcnQga2V5cyAlQ2hhbmdlU3RhdGVUcmFuc2l0aW9ucyApIHsKCiAgICAgICAgZm9yIG15ICROZXh0U3RhdGUgKCBAeyAkQ2hhbmdlU3RhdGVUcmFuc2l0aW9uc3skU3RhdGV9IH0gKSB7CgogICAgICAgICAgICAjIGFkZCBzdGF0ZSB0cmFuc2l0aW9uCiAgICAgICAgICAgIG15ICRUcmFuc2l0aW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScpCiAgICAgICAgICAgICAgICAtPlN0YXRlVHJhbnNpdGlvbkFkZCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7JFN0YXRlfSAgICAgfHwgMCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7JE5leHRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaW5zZXJ0IFdvcmtPcmRlclN0YXRlIHRyYW5zaXRpb25zIGludG8gZGF0YWJhc2UKICAgIGZvciBteSAkU3RhdGUgKCBzb3J0IGtleXMgJVdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgICAgIGZvciBteSAkTmV4dFN0YXRlICggQHsgJFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnN7JFN0YXRlfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgc3RhdGUgdHJhbnNpdGlvbgogICAgICAgICAgICBteSAkVHJhbnNpdGlvbklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUnKQogICAgICAgICAgICAgICAgLT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICA9PiAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyRTdGF0ZX0gICAgIHx8IDAsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyROZXh0U3RhdGV9IHx8IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9MaW5rRGVsZXRlKCkKCkRlbGV0ZSBhbGwgZXhpc3RpbmcgbGlua3Mgd2l0aCBjaGFuZ2UgYW5kIHdvcmtvcmRlciBvYmplY3RzLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0xpbmtEZWxldGUoKTsKCj1jdXQKCnN1YiBfTGlua0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjaGFuZ2Ugb2JqZWN0IGlkcwogICAgbXkgJENoYW5nZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBjaGFuZ2UgbGlua3MKICAgIGlmICggJENoYW5nZUlEcyAmJiByZWYgJENoYW5nZUlEcyBlcSAnQVJSQVknICkgewoKICAgICAgICBDSEFOR0VJRDoKICAgICAgICBmb3IgbXkgJENoYW5nZUlEICggQHskQ2hhbmdlSURzfSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBsaW5rcyB0byB0aGlzIGNoYW5nZQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rRGVsZXRlQWxsKAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgaWRzIGZvciB0aGlzIGNoYW5nZQogICAgICAgICAgICBteSAkV29ya09yZGVySURzCiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJyktPldvcmtPcmRlckxpc3QoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0hBTkdFSUQgaWYgISRXb3JrT3JkZXJJRHM7CiAgICAgICAgICAgIG5leHQgQ0hBTkdFSUQgaWYgcmVmICRXb3JrT3JkZXJJRHMgbmUgJ0FSUkFZJzsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCB3b3Jrb3JkZXIgbGlua3MKICAgICAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc30gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rRGVsZXRlQWxsKAogICAgICAgICAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfQXR0YWNobWVudERlbGV0ZSgpCgpEZWxldGUgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzIGZvciBjaGFuZ2VzIGFuZCB3b3Jrb3JkZXJzLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0F0dGFjaG1lbnREZWxldGUoKTsKCj1jdXQKCnN1YiBfQXR0YWNobWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjaGFuZ2Ugb2JqZWN0IGlkcwogICAgbXkgJENoYW5nZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlJyktPkNoYW5nZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIGZvciBteSAkQ2hhbmdlSUQgKCBAeyRDaGFuZ2VJRHN9ICkgewoKICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiBhbGwgY2hhbmdlIGF0dGFjaG1lbnRzCiAgICAgICAgbXkgQENoYW5nZUF0dGFjaG1lbnRzCiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYWxsIGNoYW5nZSBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBDaGFuZ2VBdHRhY2htZW50cykgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UnKS0+Q2hhbmdlQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgd29ya29yZGVyIGlkcyBmb3IgdGhpcyBjaGFuZ2UKICAgICAgICBteSAkV29ya09yZGVySURzCiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKS0+V29ya09yZGVyTGlzdCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHskV29ya09yZGVySURzfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGFsbCB3b3Jrb3JkZXIgYXR0YWNobWVudHMKICAgICAgICAgICAgbXkgQFdvcmtPcmRlckF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJykKICAgICAgICAgICAgICAgIC0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHdvcmtvcmRlciBhdHRhY2htZW50cwogICAgICAgICAgICBmb3IgbXkgJEZpbGVuYW1lIChAV29ya09yZGVyQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicpCiAgICAgICAgICAgICAgICAgICAgLT5Xb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlID0+ICdXb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIHdvcmtvcmRlciByZXBvcnQgYXR0YWNobWVudHMKICAgICAgICAgICAgbXkgQFJlcG9ydEF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyJykKICAgICAgICAgICAgICAgIC0+V29ya09yZGVyUmVwb3J0QXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHdvcmtvcmRlciByZXBvcnQgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQFJlcG9ydEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInKQogICAgICAgICAgICAgICAgICAgIC0+V29ya09yZGVyQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50VHlwZSA9PiAnV29ya09yZGVyUmVwb3J0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfRHluYW1pY0ZpZWxkc0RlbGV0ZSgpCgpEZWxldGUgYWxsIGV4aXN0aW5nIGR5bmFtaWMgZmllbGRzIGZvciBjaGFuZ2VzIGFuZCB3b3Jrb3JkZXJzLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0R5bmFtaWNGaWVsZHNEZWxldGUoKTsKCj1jdXQKCnN1YiBfRHluYW1pY0ZpZWxkc0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScpOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIGNoYW5nZSBhbmQgd29ya29yZGVyIGR5bmFtaWMgZmllbGRzICh2YWxpZCBhbmQgaW52YWxpZCBvbmVzKQogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbICdJVFNNQ2hhbmdlJywgJ0lUU01Xb3JrT3JkZXInIF0sCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBkeW5hbWljIGZpZWxkcwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKCiAgICAgICAgIyBkZWxldGUgYWxsIGZpZWxkIHZhbHVlcwogICAgICAgIG15ICRWYWx1ZXNEZWxldGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZFZhbHVlT2JqZWN0LT5BbGxWYWx1ZXNEZWxldGUoCiAgICAgICAgICAgIEZpZWxkSUQgPT4gJER5bmFtaWNGaWVsZC0+e0lEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgdmFsdWVzIGNvdWxkIGJlIGRlbGV0ZWQKICAgICAgICBpZiAoJFZhbHVlc0RlbGV0ZVN1Y2Nlc3MpIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGZpZWxkCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgICAgICAgICAgSUQgICAgID0+ICREeW5hbWljRmllbGQtPntJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIGR5bmFtaWMgZmllbGQgJyREeW5hbWljRmllbGQtPntOYW1lfSchIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdmFsdWVzIGNvdWxkIG5vdCBiZSBkZWxldGVkCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIHZhbHVlcyBmb3IgZHluYW1pYyBmaWVsZCAnJER5bmFtaWNGaWVsZC0+e05hbWV9JyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9DaGFuZ2VOb3RpZmljYXRpb25zKCkKCmNoYW5nZSBDaGFuZ2VNYW5hZ2VtZW50IHNwZWNpZmljIG5vdGlmaWNhdGlvbnMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2V0dXBPYmplY3QtPl9DaGFuZ2VOb3RpZmljYXRpb25zOwoKPWN1dAoKc3ViIF9DaGFuZ2VOb3RpZmljYXRpb25zIHsKICAgIG15ICgkU2VsZikgPSBAXzsKCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgaWQsIHN1YmplY3QgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiLAogICAgICAgIExpbWl0ID0+IDEwMDAwLAogICAgKTsKCiAgICBteSAlT2xkSW5zZXJ0czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9sZEluc2VydHN7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgbXkgJE5ld1N1YmplY3QgPSAnJzsKICAgIGZvciBteSAkSW5zZXJ0c0lEICgga2V5cyAlT2xkSW5zZXJ0cyApIHsKCiAgICAgICAgJE5ld1N1YmplY3QgPSAkT2xkSW5zZXJ0c3skSW5zZXJ0c0lEfTsKICAgICAgICAkTmV3U3ViamVjdCA9fiBzL09UUlNfL09GT1JLXy9nOwoKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgY2hhbmdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIFNFVCBzdWJqZWN0ID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCROZXdTdWJqZWN0LCBcJEluc2VydHNJRCwgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gIlNFTEVDVCBpZCwgdGV4dCBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fbWVzc2FnZSIsCiAgICAgICAgTGltaXQgPT4gMTAwMDAsCiAgICApOwoKICAgIG15ICVPbGRJbnNlcnRzVGV4dDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9sZEluc2VydHNUZXh0eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIG15ICROZXdUZXh0ID0gJyc7CiAgICBmb3IgbXkgJEluc2VydHNUZXh0SUQgKCBrZXlzICVPbGRJbnNlcnRzVGV4dCApIHsKCiAgICAgICAgJE5ld1RleHQgPSAkT2xkSW5zZXJ0c1RleHR7JEluc2VydHNUZXh0SUR9OwogICAgICAgICROZXdUZXh0ID1+IHMvT1RSU18vT0ZPUktfL2c7CgogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjaGFuZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UgU0VUIHRleHQgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJE5ld1RleHQsIFwkSW5zZXJ0c1RleHRJRCwgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0FkZE5vdGlmaWNhdGlvbnMoKQoKQWRkIENoYW5nZU1hbmFnZW1lbnQgc3BlY2lmaWMgbm90aWZpY2F0aW9ucy4KCiAgICBteSAkU3VjY2VzcyA9ICRTZXR1cE9iamVjdC0+X0FkZE5vdGlmaWNhdGlvbnM7Cgo9Y3V0CgpzdWIgX0FkZE5vdGlmaWNhdGlvbnMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKIyBTZXQgdXAgc29tZSBzdGFuZGFyZCB0ZXh0cyBmb3IgRW5nbGlzaCwgR2VybWFuLCBIdW5nYXJpYW4gYW5kIER1dGNoLCBDaGFuZ2UgYW5kIFdvcmtPcmRlciwgYWdlbnQgYW5kIGN1c3RvbWVyCiMgVGhlIGN1c3RvbWVyIHRleHRzIHByb3ZpZGUgbm8gbGluay4KCiAgICAjIENoYW5nZSBpbmZvIGZvciBhZ2VudHMgKGVuKQogICAgbXkgJENoYW5nZUluZm9BZ2VudEVuID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSB0aXRsZTogPE9GT1JLX0NIQU5HRV9DaGFuZ2VUaXRsZT5cbiIKICAgICAgICAuICJDaGFuZ2UgYnVpbGRlcjogPE9GT1JLX0NIQU5HRV9DaGFuZ2VCdWlsZGVyPlxuIgogICAgICAgIC4gIkNoYW5nZSBtYW5hZ2VyOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZU1hbmFnZXI+XG4iCiAgICAgICAgLiAiQ3VycmVudCBjaGFuZ2Ugc3RhdGU6IDxPRk9SS19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiPE9GT1JLX0NPTkZJR19IdHRwVHlwZT46Ly88T0ZPUktfQ09ORklHX0ZRRE4+LzxPRk9SS19DT05GSUdfU2NyaXB0QWxpYXM+aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb207Q2hhbmdlSUQ9PE9GT1JLX0NIQU5HRV9DaGFuZ2VJRD5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICItLSA8T0ZPUktfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWU+XG4iOwoKICAgICMgQ2hhbmdlIGluZm8gZm9yIGN1c3RvbWVycyAoZW4pCiAgICBteSAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4gPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgY2hhbmdlIHN0YXRlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiI7CgogICAgIyBDaGFuZ2UgaW5mbyBmb3IgYWdlbnRzIChkZSkKICAgIG15ICRDaGFuZ2VJbmZvQWdlbnREZSA9ICJcbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJDaGFuZ2UgVGl0ZWw6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgLiAiQ2hhbmdlLUJ1aWxkZXI6IDxPRk9SS19DSEFOR0VfQ2hhbmdlQnVpbGRlcj5cbiIKICAgICAgICAuICJDaGFuZ2UtTWFuYWdlcjogPE9GT1JLX0NIQU5HRV9DaGFuZ2VNYW5hZ2VyPlxuIgogICAgICAgIC4gIkFrdHVlbGxlciBDaGFuZ2UgU3RhdHVzOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPTxPRk9SS19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiLS0gPE9GT1JLX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lPlxuIjsKCiAgICAjIENoYW5nZSBpbmZvIGZvciBjdXN0b21lcnMgKGRlKQogICAgbXkgJENoYW5nZUluZm9DdXN0b21lckRlID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSBUaXRlbDogPE9GT1JLX0NIQU5HRV9DaGFuZ2VUaXRsZT5cbiIKICAgICAgICAuICJBa3R1ZWxsZXIgQ2hhbmdlIFN0YXR1czogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICItLSA8T0ZPUktfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWU+XG4iOwoKICAgICMgV29ya29yZGVyIGluZm8gZm9yIGN1c3RvbWVycyAoZW4pCiAgICBteSAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4gPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgY2hhbmdlIHN0YXRlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIldvcmtvcmRlciB0aXRsZTogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJUaXRsZT5cbiIKICAgICAgICAuICJXb3Jrb3JkZXIgdHlwZTogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJUeXBlPlxuIgogICAgICAgIC4gIldvcmtvcmRlciBhZ2VudDogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJBZ2VudD5cbiIKICAgICAgICAuICJDdXJyZW50IHdvcmtvcmRlciBzdGF0ZTogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICItLSA8T0ZPUktfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWU+XG4iOwoKICAgICMgV29ya29yZGVyIGluZm8gZm9yIGFnZW50cyAoZW4pCiAgICBteSAkV29ya09yZGVySW5mb0FnZW50RW4gPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgY2hhbmdlIHN0YXRlOiA8T0ZPUktfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIldvcmtvcmRlciB0aXRsZTogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJUaXRsZT5cbiIKICAgICAgICAuICJXb3Jrb3JkZXIgdHlwZTogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJUeXBlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgd29ya29yZGVyIHN0YXRlOiA8T0ZPUktfV09SS09SREVSX1dvcmtPcmRlclN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tO1dvcmtPcmRlcklEPTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVySUQ+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiLS0gPE9GT1JLX0NPTkZJR19Ob3RpZmljYXRpb25TZW5kZXJOYW1lPlxuIjsKCiAgICAjIFdvcmtvcmRlciBpbmZvIGZvciBhZ2VudHMgKGRlKQogICAgbXkgJFdvcmtPcmRlckluZm9BZ2VudERlID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSBUaXRlbDogPE9GT1JLX0NIQU5HRV9DaGFuZ2VUaXRsZT5cbiIKICAgICAgICAuICJBa3R1ZWxsZXIgQ2hhbmdlIFN0YXR1czogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJXb3Jrb3JkZXIgVGl0ZWw6IDxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyVGl0bGU+XG4iCiAgICAgICAgLiAiV29ya29yZGVyIFR5cDogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJUeXBlPlxuIgogICAgICAgIC4gIldvcmtvcmRlciBBZ2VudDogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJBZ2VudD5cbiIKICAgICAgICAuICJBa3R1ZWxsZXIgV29ya29yZGVyIFN0YXR1czogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICI8T0ZPUktfQ09ORklHX0h0dHBUeXBlPjovLzxPRk9SS19DT05GSUdfRlFETj4vPE9GT1JLX0NPTkZJR19TY3JpcHRBbGlhcz5pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbTtXb3JrT3JkZXJJRD08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlcklEPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiI7CgogICAgIyBXb3Jrb3JkZXIgaW5mbyBmb3IgY3VzdG9tZXJzIChkZSkKICAgIG15ICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJEZSA9ICJcbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJDaGFuZ2UgVGl0ZWw6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgLiAiQWt0dWVsbGVyIENoYW5nZSBTdGF0dXM6IDxPRk9SS19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiV29ya29yZGVyIFRpdGVsOiA8T0ZPUktfV09SS09SREVSX1dvcmtPcmRlclRpdGxlPlxuIgogICAgICAgIC4gIldvcmtvcmRlciBUeXA6IDxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyVHlwZT5cbiIKICAgICAgICAuICJBa3R1ZWxsZXIgV29ya29yZGVyIFN0YXR1czogPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICItLSA8T0ZPUktfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWU+XG4iOwoKICAgICMgZGVmaW5lIG5vdGlmaWNhdGlvbnMgYW5kIHJlY2lwaWVudHMKICAgIG15IEBOb3RpZmljYXRpb25zID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdyZXF1ZXN0ZWQgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VBZGQnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhcyByZXF1ZXN0ZWQnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJycsCiAgICAgICAgICAgIE1lc3NhZ2UgICA9PiB7CiAgICAgICAgICAgICAgICBBZ2VudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIG5ldSBlcnN0ZWxsdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIG5ldSBlcnN0ZWxsdC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGNyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgY3JlYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBuZXUgZXJzdGVsbHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBuZXUgZXJzdGVsbHQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBjcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGNyZWF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbICdDaGFuZ2VNYW5hZ2VyJywgJ0NoYW5nZUJ1aWxkZXInIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAncGVuZGluZyBhcHByb3ZhbCBjaGFuZ2VzJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdDaGFuZ2VTdGF0ZScsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSB3YWl0cyBmb3IgYXBwcm92YWwnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWyAnQ2hhbmdlTWFuYWdlcicsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJyBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3BlbmRpbmcgUElSIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhaXRzIGZvciBQSVInLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJ3BlbmRpbmcgcGlyJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsnQ2hhbmdlTWFuYWdlciddLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3JlamVjdGVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhcyByZWplY3RlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAncmVqZWN0ZWQnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnYXBwcm92ZWQgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2Ugd2FzIGFwcHJvdmVkJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICdhcHByb3ZlZCcsCiAgICAgICAgICAgIE1lc3NhZ2UgICA9PiB7CiAgICAgICAgICAgICAgICBBZ2VudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VJbml0aWF0b3JzJywgJ0NBQkN1c3RvbWVycycsICdDQUJBZ2VudHMnLAogICAgICAgICAgICAgICAgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnY2hhbmdlcyBpbiBwcm9ncmVzcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsgJ0NoYW5nZU1hbmFnZXInLCAnV29ya09yZGVyQWdlbnRzJyBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3N1Y2Nlc3NmdWwgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2Ugd2FzIHN1Y2Nlc3NmdWwnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnZmFpbGVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGZhaWxlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnZmFpbGVkJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZUluaXRpYXRvcnMnLCAnQ0FCQ3VzdG9tZXJzJywgJ0NBQkFnZW50cycsICdXb3JrT3JkZXJBZ2VudHMnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2NhbmNlbGVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhcyBjYW5jZWxlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnY2FuY2VsZWQnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWyAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VNYW5hZ2VyJyBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3JldHJhY3RlZCBjaGFuZ2VzJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdDaGFuZ2VTdGF0ZScsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSB3YXMgcmV0cmFjdGVkJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICdyZXRyYWN0ZWQnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2hhbmdlTWFuYWdlciB1cGRhdGUnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZU1hbmFnZXJJRCcsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCB0aGUgY2hhbmdlbWFuYWdlciB3YXMgcmVwbGFjZWQnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJy4qJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VNYW5hZ2VyJywgJ09sZENoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NoYW5nZUJ1aWxkZXIgdXBkYXRlJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdDaGFuZ2VCdWlsZGVySUQnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgdGhlIGNoYW5nZWJ1aWxkZXIgd2FzIHJlcGxhY2VkJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcuKicsCiAgICAgICAgICAgIE1lc3NhZ2UgICA9PiB7CiAgICAgICAgICAgICAgICBBZ2VudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlTWFuYWdlcicsICdDaGFuZ2VCdWlsZGVyJywgJ09sZENoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ25ldyB3b3Jrb3JkZXInLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnV29ya09yZGVyQWRkJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIHdvcmtvcmRlciB3YXMgYWRkZWQnLAogICAgICAgICAgICBSdWxlICAgICAgPT4gJycsCiAgICAgICAgICAgIE1lc3NhZ2UgICA9PiB7CiAgICAgICAgICAgICAgICBBZ2VudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBuZXUgZXJzdGVsbHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgbmV1IGVyc3RlbGx0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGNyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIGNyZWF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIG5ldSBlcnN0ZWxsdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3dXJkZSBuZXUgZXJzdGVsbHQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gY3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3YXMgY3JlYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ1dvcmtPcmRlckFnZW50JywgJ1dvcmtPcmRlckdyb3VwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgID0+ICd1cGRhdGVkIHN0YXRlIGZvciB3b3Jrb3JkZXInLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ1dvcmtPcmRlclN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdXb3JrT3JkZXJVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgdGhlIHN0YXRlIG9mIGEgd29ya29yZGVyIHdhcyBjaGFuZ2VkJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcuKicsCiAgICAgICAgICAgIE1lc3NhZ2UgICA9PiB7CiAgICAgICAgICAgICAgICBBZ2VudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gdXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3YXMgdXBkYXRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ1dvcmtPcmRlckFnZW50cycsICdXb3JrT3JkZXJHcm91cCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAndXBkYXRlZCB3b3Jrb3JkZXIgYWdlbnQgZm9yIHdvcmtvcmRlcicsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnV29ya09yZGVyQWdlbnRJRCcsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnV29ya09yZGVyVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCB0aGUgd29ya29yZGVyIGFnZW50IHdhcyByZXBsYWNlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnLionLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgYWt0dWFsaXNpZXJ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdXb3JrT3JkZXJBZ2VudCcsICdPbGRXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAndGlja2V0IGxpbmtlZCB0byBjaGFuZ2UnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQ2hhbmdlTGlua0FkZCcsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSB0aWNrZXQgd2FzIGxpbmtlZCB0byB0aGUgY2hhbmdlJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSA8T0ZPUktfTElOS19PYmplY3Q+IHZlcmtuw7xwZnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBtaXQgZWluZW0gPE9GT1JLX0xJTktfT2JqZWN0PiB2ZXJrbsO8cGZ0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gPE9GT1JLX0xJTktfT2JqZWN0PiBsaW5rZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgbGlua2VkIHRvIGEgPE9GT1JLX0xJTktfT2JqZWN0PiAuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gPE9GT1JLX0xJTktfT2JqZWN0PiB2ZXJrbsO8cGZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgbWl0IGVpbmVtIDxPRk9SS19MSU5LX09iamVjdD4gdmVya27DvHBmdC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIDxPRk9SS19MSU5LX09iamVjdD4gbGlua2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGxpbmtlZCB0byBhIDxPRk9SS19MSU5LX09iamVjdD4gLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAncGxhbm5lZCBzdGFydCB0aW1lIG9mIGNoYW5nZSByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSBoYXMgcmVhY2hlZCB0aGUgcGxhbm5lZCBzdGFydCB0aW1lJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIFBsYW5uZWQgU3RhcnQgVGltZSByZWFjaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIHJlYWNoZWQgaXRzIFBsYW5uZWQgU3RhcnQgVGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIFBsYW5uZWQgU3RhcnQgVGltZSByZWFjaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIHJlYWNoZWQgaXRzIFBsYW5uZWQgU3RhcnQgVGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3BsYW5uZWQgZW5kIHRpbWUgb2YgY2hhbmdlIHJlYWNoZWQnLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQ2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSBoYXMgcmVhY2hlZCB0aGUgcGxhbm5lZCBlbmQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhdCBkaWUgZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIFBsYW5uZWQgRW5kIFRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyByZWFjaGVkIGl0cyBQbGFubmVkIEVuZCBUaW1lLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBQbGFubmVkIEVuZCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgcmVhY2hlZCBpdHMgUGxhbm5lZCBFbmQgVGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2FjdHVhbCBzdGFydCB0aW1lIG9mIGNoYW5nZSByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZUFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSBhY3R1YWwgc3RhcnQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYmVnb25uZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBiZWdvbm5lbi4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgc3RhcnRlZC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBiZWdvbm5lbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gc3RhcnRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyBzdGFydGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlcicsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnYWN0dWFsIGVuZCB0aW1lIG9mIGNoYW5nZSByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0NoYW5nZUFjdHVhbEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSBoYXMgcmVhY2hlZCB0aGUgYWN0dWFsIGVuZCB0aW1lJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBhYmdlc2NobG9zc2VuJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWJnZXNjaGxvc3Nlbi4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGZpbmlzaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGZpbmlzaGVkLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFiZ2VzY2hsb3NzZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBhYmdlc2NobG9zc2VuLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gZmluaXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgZmluaXNoZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdyZXF1ZXN0ZWQgdGltZSBvZiBjaGFuZ2UgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdDaGFuZ2VSZXF1ZXN0ZWRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2UgaGFzIHJlYWNoZWQgdGhlIHJlcXVlc3RlZCB0aW1lJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBHZXfDvG5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGF0IGRpZSBnZXfDvG5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gcmVxdWVzdGVkIHRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyByZWFjaGVkIGl0cyByZXF1ZXN0ZWQgdGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBHZXfDvG5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGF0IGRpZSBnZXfDvG5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gcmVxdWVzdGVkIHRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyByZWFjaGVkIGl0cyByZXF1ZXN0ZWQgdGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ3BsYW5uZWQgc3RhcnQgdGltZSBvZiB3b3Jrb3JkZXIgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSB3b3Jrb3JkZXIgaGFzIHJlYWNoZWQgdGhlIHBsYW5uZWQgc3RhcnQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBQbGFubmVkIFN0YXJ0IFRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXMgcmVhY2hlZCB0aGUgUGxhbm5lZCBTdGFydCBUaW1lLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGF0IGRpZSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gUGxhbm5lZCBTdGFydCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHJlYWNoZWQgdGhlIFBsYW5uZWQgU3RhcnQgVGltZS4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICA9PiAncGxhbm5lZCBlbmQgdGltZSBvZiB3b3Jrb3JkZXIgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgd29ya29yZGVyIGhhcyByZWFjaGVkIHRoZSBwbGFubmVkIGVuZCB0aW1lJywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICcnLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gUGxhbm5lZCBFbmQgVGltZSByZWFjaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IGhhcyByZWFjaGVkIHRoZSBQbGFubmVkIEVuZCBUaW1lLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudEVuLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBnZXBsYW50ZSBFbmR6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IGhhdCBkaWUgZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBQbGFubmVkIEVuZCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHJlYWNoZWQgdGhlIFBsYW5uZWQgRW5kIFRpbWUuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnV29ya09yZGVyQWdlbnQnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2FjdHVhbCBzdGFydCB0aW1lIG9mIHdvcmtvcmRlciByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ1dvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgd29ya29yZGVyIGhhcyByZWFjaGVkIHRoZSBhY3R1YWwgc3RhcnQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGJlZ29ubmVuJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHN0YXJ0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGJlZ29ubmVuJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckRlLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHN0YXJ0ZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnV29ya09yZGVyQWdlbnQnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2FjdHVhbCBlbmQgdGltZSBvZiB3b3Jrb3JkZXIgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgID0+ICdXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSB3b3Jrb3JkZXIgaGFzIHJlYWNoZWQgdGhlIGFjdHVhbCBlbmQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAnJywKICAgICAgICAgICAgTWVzc2FnZSAgID0+IHsKICAgICAgICAgICAgICAgIEFnZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGFiZ2VzY2hsb3NzZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgYWJnZXNjaGxvc3Nlbi4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBmaW5pc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3YXMgZmluaXNoZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGFiZ2VzY2hsb3NzZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T0ZPUktfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgYWJnZXNjaGxvc3Nlbi4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJEZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWzxPRk9SS19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T0ZPUktfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9GT1JLX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBmaW5pc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPRk9SS19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3YXMgZmluaXNoZWQuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnV29ya09yZGVyQWdlbnQnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2FjdGlvbiBleGVjdXRpb24gc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdBY3Rpb25SZXN1bHQnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJ0FjdGlvbkV4ZWN1dGUnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGFuIGFjdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgUnVsZSAgICAgID0+ICdzdWNjZXNzZnVsbHknLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBa3Rpb25zLUF1c2bDvGhydW5nIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0PicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFrdGlvbnMtQXVzZsO8aHJ1bmcgPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDaGFuZ2UgVGl0ZWw6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJBa3R1ZWxsZXIgQ2hhbmdlIFN0YXR1czogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0NvbmRpdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIE5hbWU6IDxPRk9SS19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWt0aW9ucy1BdXNmw7xocnVuZzogPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPTxPRk9SS19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBY3Rpb24gZXhlY3V0aW9uIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0PicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFjdGlvbiBleGVjdXRpb24gPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDaGFuZ2UgdGl0bGU6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDdXJyZW50IGNoYW5nZSBzdGF0ZTogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0NvbmRpdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIG5hbWU6IDxPRk9SS19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIGV4ZWN1dGlvbjogPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPTxPRk9SS19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQWt0aW9ucy1BdXNmw7xocnVuZyA8T0ZPUktfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBBa3Rpb25zLUF1c2bDvGhydW5nIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQWN0aW9uIGV4ZWN1dGlvbiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBBY3Rpb24gZXhlY3V0aW9uIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgPT4gJ2FjdGlvbiBleGVjdXRpb24gdW5zdWNjZXNzZnVsbHknLAogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0FjdGlvblJlc3VsdCcsCiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQWN0aW9uRXhlY3V0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYW4gYWN0aW9uIHdhcyBleGVjdXRlZCB1bnN1Y2Nlc3NmdWxseScsCiAgICAgICAgICAgIFJ1bGUgICAgICA9PiAndW5zdWNjZXNzZnVsbHknLAogICAgICAgICAgICBNZXNzYWdlICAgPT4gewogICAgICAgICAgICAgICAgQWdlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIGRlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBa3Rpb25zLUF1c2bDvGhydW5nIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0PicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFrdGlvbnMtQXVzZsO8aHJ1bmcgPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDaGFuZ2UgVGl0ZWw6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJBa3R1ZWxsZXIgQ2hhbmdlIFN0YXR1czogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0NvbmRpdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIE5hbWU6IDxPRk9SS19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWt0aW9ucy1BdXNmw7xocnVuZzogPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPTxPRk9SS19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1s8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBY3Rpb24gZXhlY3V0aW9uIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0PicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8T0ZPUktfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9GT1JLX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFjdGlvbiBleGVjdXRpb24gPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+LicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDaGFuZ2UgdGl0bGU6IDxPRk9SS19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDdXJyZW50IGNoYW5nZSBzdGF0ZTogPE9GT1JLX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0NvbmRpdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIG5hbWU6IDxPRk9SS19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvbklEPlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiQWN0aW9uIGV4ZWN1dGlvbjogPE9GT1JLX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjxPRk9SS19DT05GSUdfSHR0cFR5cGU+Oi8vPE9GT1JLX0NPTkZJR19GUUROPi88T0ZPUktfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tO0NoYW5nZUlEPTxPRk9SS19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIi0tIDxPRk9SS19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZT5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBkZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQWt0aW9ucy1BdXNmw7xocnVuZyA8T0ZPUktfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBBa3Rpb25zLUF1c2bDvGhydW5nIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQWN0aW9uIGV4ZWN1dGlvbiA8T0ZPUktfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPE9GT1JLX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPRk9SS19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBBY3Rpb24gZXhlY3V0aW9uIDxPRk9SS19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIG5vdGlmaWNhdGlvbnMKICAgIGZvciBteSAkTm90aWZpY2F0aW9uIChATm90aWZpY2F0aW9ucykgewoKICAgICAgICAjIGZpbmQgcmVjaXBpZW50cwogICAgICAgIG15IEBSZWNpcGllbnRJRHM7CiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKCBAeyAkTm90aWZpY2F0aW9uLT57UmVjaXBpZW50c30gfSApIHsKICAgICAgICAgICAgbXkgJFJlY2lwaWVudElECiAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24nKS0+UmVjaXBpZW50TG9va3VwKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkUmVjaXBpZW50SUQpIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudElEcywgJFJlY2lwaWVudElEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBldmVudCBpZAogICAgICAgIG15ICRFdmVudElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnknKS0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICROb3RpZmljYXRpb24tPntFdmVudH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBpbnNlcnQgbm90aWZpY2F0aW9uCiAgICAgICAgbXkgJFJ1bGVJRAogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24nKS0+Tm90aWZpY2F0aW9uUnVsZUFkZCgKICAgICAgICAgICAgJXskTm90aWZpY2F0aW9ufSwKICAgICAgICAgICAgRXZlbnRJRCAgICAgID0+ICRFdmVudElELAogICAgICAgICAgICBSZWNpcGllbnRJRHMgPT4gXEBSZWNpcGllbnRJRHMsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfTWlncmF0ZU5vdGlmaWNhdGlvbnMoKQoKTWlncmF0ZSBvbGQgc3lzdGVtIG5vdGlmaWNhdGlvbnMgaW50byBDaGFuZ2VNYW5hZ2VtZW50IGV2ZW50IGJhc2VkIG5vdGlmaWNhdGlvbnMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2V0dXBPYmplY3QtPl9NaWdyYXRlTm90aWZpY2F0aW9uczsKCj1jdXQKCnN1YiBfTWlncmF0ZU5vdGlmaWNhdGlvbnMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjaGFuZ2Ugbm90aWZpY2F0aW9uIHJ1bGVzCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNuLmlkLCBjbi5uYW1lLCBpdGVtX2F0dHJpYnV0ZSwgY2h0Lm5hbWUKICAgICAgICAgICAgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uIGNuLCBjaGFuZ2VfaGlzdG9yeV90eXBlIGNodAogICAgICAgICAgICBXSEVSRSBldmVudF9pZCA9IGNodC5pZCcsCiAgICApOwoKICAgICMgZmV0Y2ggbm90aWZpY2F0aW9uIHJ1bGVzCiAgICBteSBATm90aWZpY2F0aW9uUnVsZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBwdXNoIEBOb3RpZmljYXRpb25SdWxlcywgewogICAgICAgICAgICBJRCAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAkUm93WzJdIC8vICcnLAogICAgICAgICAgICBFdmVudCAgICAgPT4gJFJvd1szXSwKICAgICAgICB9OwogICAgfQoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uUnVsZSAoQE5vdGlmaWNhdGlvblJ1bGVzKSB7CgogICAgICAgICMgcmVhZCBub3RpZmljYXRpb25zIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0eXBlCiAgICAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1Qgbm90aWZpY2F0aW9uX3R5cGUsIG5vdGlmaWNhdGlvbl9sYW5ndWFnZSwgc3ViamVjdCwgdGV4dCwgY29udGVudF90eXBlCiAgICAgICAgICAgICAgICBGUk9NIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICAgICAgIFdIRVJFIG5vdGlmaWNhdGlvbl90eXBlID0gJ0FnZW50OjpDaGFuZ2U6OiROb3RpZmljYXRpb25SdWxlLT57RXZlbnR9JwogICAgICAgICAgICAgICAgT1Igbm90aWZpY2F0aW9uX3R5cGUgICAgPSAnQWdlbnQ6OldvcmtPcmRlcjo6JE5vdGlmaWNhdGlvblJ1bGUtPntFdmVudH0nCiAgICAgICAgICAgICAgICBPUiBub3RpZmljYXRpb25fdHlwZSAgICA9ICdDdXN0b21lcjo6Q2hhbmdlOjokTm90aWZpY2F0aW9uUnVsZS0+e0V2ZW50fScKICAgICAgICAgICAgICAgIE9SIG5vdGlmaWNhdGlvbl90eXBlICAgID0gJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OiROb3RpZmljYXRpb25SdWxlLT57RXZlbnR9JyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQE1lc3NhZ2VzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGlmIHRoZSBub3RpZmljYXRpb24gaXMgZm9yIGFnZW50cyBvciBjdXN0b21lcnMKICAgICAgICAgICAgJFJvd1swXSA9fiBzeyBcQSAoIEFnZW50IHwgQ3VzdG9tZXIgKSA6OiAuKyB9eyQxfXhtczsKCiAgICAgICAgICAgICMgZ2V0IG1lc3NhZ2UgYXR0cmlidXRlcwogICAgICAgICAgICBwdXNoIEBNZXNzYWdlcywgewogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVHlwZSA9PiAkUm93WzBdLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRNZXNzYWdlIChATWVzc2FnZXMpIHsKCiAgICAgICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAobm90aWZpY2F0aW9uX2lkLCBzdWJqZWN0LCB0ZXh0LCBjb250ZW50X3R5cGUsIGxhbmd1YWdlLCBub3RpZmljYXRpb25fdHlwZSkKICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8pJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkTm90aWZpY2F0aW9uUnVsZS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICBcJE1lc3NhZ2UtPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBcJE1lc3NhZ2UtPntCb2R5fSwKICAgICAgICAgICAgICAgICAgICBcJE1lc3NhZ2UtPntDb250ZW50VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgXCRNZXNzYWdlLT57TGFuZ3VhZ2V9LAogICAgICAgICAgICAgICAgICAgIFwkTWVzc2FnZS0+e05vdGlmaWNhdGlvblR5cGV9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgYWxsIG9sZCBub3RpZmljYXRpb25zIGZvciB0aGUgY2hhbmdlIG1hbmFnZW1lbnQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gbm90aWZpY2F0aW9ucwogICAgICAgICAgICBXSEVSRSBub3RpZmljYXRpb25fdHlwZSBMSUtFICJBZ2VudDo6Q2hhbmdlOjolIgogICAgICAgICAgICBPUiBub3RpZmljYXRpb25fdHlwZSBMSUtFICJBZ2VudDo6V29ya09yZGVyOjolIgogICAgICAgICAgICBPUiBub3RpZmljYXRpb25fdHlwZSBMSUtFICJDdXN0b21lcjo6Q2hhbmdlOjolIgogICAgICAgICAgICBPUiBub3RpZmljYXRpb25fdHlwZSBMSUtFICJDdXN0b21lcjo6V29ya09yZGVyOjolIicsCiAgICApOwoKICAgICMgZ2V0IG51bWJlciBvZiByZW1haW5pbmcgZW50cmllcwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBDT1VOVChpZCkgRlJPTSBub3RpZmljYXRpb25zJywKICAgICk7CgogICAgbXkgJENvdW50OwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgfQoKICAgICMgZGVsZXRlIHRhYmxlIGJ1dCBvbmx5IGlmIHRhYmxlIGlzIGVtcHR5CiAgICAjIGlmIHRoZXJlIGFyZSBzb21lIGVudHJpZXMgbGVmdCwgdGhlc2UgbXVzdCBiZSBkZWxldGVkIGJ5IG90aGVyIG1vZHVsZXMKICAgICMgc28gd2UgZ2l2ZSB0aGVtIGEgY2hhbmNlIHRvIGJlIG1pZ3JhdGVkIGZyb20gdGhlc2UgbW9kdWxlcwogICAgaWYgKCAhJENvdW50ICkgewoKICAgICAgICAjIGRyb3AgdGFibGUgJ25vdGlmaWNhdGlvbnMnCiAgICAgICAgbXkgJFhNTFN0cmluZyA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KICAgICAgICAgICAgPGRhdGFiYXNlIE5hbWU9Im9mb3JrIj4KICAgICAgICAgICAgICAgIDxUYWJsZURyb3AgTmFtZT0ibm90aWZpY2F0aW9ucyIvPgogICAgICAgICAgICA8L2RhdGFiYXNlPic7CgogICAgICAgIG15IEBTUUw7CiAgICAgICAgbXkgQFNRTFBvc3Q7CgogICAgICAgIG15ICRYTUxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WE1MJyk7CgogICAgICAgICMgY3JlYXRlIGRhdGFiYXNlIHNwZWNpZmljIFNRTCBhbmQgUG9zdFNRTCBjb21tYW5kcwogICAgICAgIG15IEBYTUxBUlJBWSA9ICRYTUxPYmplY3QtPlhNTFBhcnNlKCBTdHJpbmcgPT4gJFhNTFN0cmluZyApOwoKICAgICAgICAjIGNyZWF0ZSBkYXRhYmFzZSBzcGVjaWZpYyBTUUwKICAgICAgICBwdXNoIEBTUUwsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TUUxQcm9jZXNzb3IoCiAgICAgICAgICAgIERhdGFiYXNlID0+IFxAWE1MQVJSQVksCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgZGF0YWJhc2Ugc3BlY2lmaWMgUG9zdFNRTAogICAgICAgIHB1c2ggQFNRTFBvc3QsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TUUxQcm9jZXNzb3JQb3N0KCk7CgogICAgICAgICMgZXhlY3V0ZSBTUUwKICAgICAgICBmb3IgbXkgJFNRTCAoIEBTUUwsIEBTUUxQb3N0ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbyggU1FMID0+ICRTUUwgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciBkdXJpbmcgZXhlY3V0aW9uIG9mICckU1FMJyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9EZWxldGVUZW1wbGF0ZXMoKQoKRGVsZXRlcyBhbGwgdGVtcGxhdGVzLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0RlbGV0ZVRlbXBsYXRlcygpOwoKPWN1dAoKc3ViIF9EZWxldGVUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhbGwgdGVtcGxhdGVzLCBhbHNvIGludmFsaWQgb25lcwogICAgbXkgJFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpLT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCB0ZW1wbGF0ZXMKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIHNvcnQga2V5cyAleyRUZW1wbGF0ZXN9ICkgewoKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScpLT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX01pZ3JhdGVEVExJblN5c0NvbmZpZygpCgpDb252ZXJ0cyBEVEwgc2V0dGluZ3MgaW4gc3lzY29uZmlnIHRvIFRULgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X01pZ3JhdGVEVExJblN5c0NvbmZpZygpOwoKPWN1dAoKc3ViIF9NaWdyYXRlRFRMSW5TeXNDb25maWcgewoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CiAgICBteSAkUHJvdmlkZXJPYmplY3QgID0gS2VybmVsOjpPdXRwdXQ6OlRlbXBsYXRlOjpQcm92aWRlci0+bmV3KCk7CgogICAgbXkgQE5ld1NldHRpbmdzOwoKICAgICMgaGFuZGxlIGhhc2ggc2V0dGluZ3MKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHF3KAogICAgICAgIFRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUKICAgICAgICBJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZQogICAgICAgIElUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlCiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBnZXQgc2V0dGluZydzIGNvbnRlbnQKICAgICAgICBteSAkU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCgkTmFtZSk7CiAgICAgICAgbmV4dCBOQU1FIGlmICEkU2V0dGluZzsKCiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJE1lbnVNb2R1bGUgKCBzb3J0IGtleXMgJXskU2V0dGluZ30gKSB7CgogICAgICAgICAgICAjIFNldHRpbmcgaXMgYSBoYXNoLgogICAgICAgICAgICBTRVRUSU5HSVRFTToKICAgICAgICAgICAgZm9yIG15ICRTZXR0aW5nSXRlbSAoIHNvcnQga2V5cyAleyAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTZXR0aW5nQ29udGVudCA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57JFNldHRpbmdJdGVtfTsKCiAgICAgICAgICAgICAgICAjIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIG1pZ3JhdGluZy4KICAgICAgICAgICAgICAgIG5leHQgU0VUVElOR0lURU0gaWYgISRTZXR0aW5nQ29udGVudDsKCiAgICAgICAgICAgICAgICBteSAkVFRDb250ZW50OwogICAgICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAgICAgJFRUQ29udGVudCA9ICRQcm92aWRlck9iamVjdC0+TWlncmF0ZURUTHRvVFQoIENvbnRlbnQgPT4gJFNldHRpbmdDb250ZW50ICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkTWVudU1vZHVsZS0+JFNldHRpbmdJdGVtIDogJEAhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnskU2V0dGluZ0l0ZW19ID0gJFRUQ29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgICAgICAgICAgcHVzaCBATmV3U2V0dGluZ3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICROYW1lIC4gJyMjIycgLiAkTWVudU1vZHVsZSwKICAgICAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAhQE5ld1NldHRpbmdzOwoKICAgICMgV3JpdGUgbmV3IHNldHRpbmcuCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nc1NldCgKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENvbW1lbnRzID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCAtIHBhY2thZ2Ugc2V0dXAgZnVuY3Rpb246IF9NaWdyYXRlRFRMSW5TeXNDb25maWcnLAogICAgICAgIFNldHRpbmdzID0+IFxATmV3U2V0dGluZ3MsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX01pZ3JhdGVDb25maWdzKCkKCkNoYW5nZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgbmV3IG1vZHVsZSBsb2NhdGlvbi4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlQ29uZmlncygpOwoKPWN1dAoKc3ViIF9NaWdyYXRlQ29uZmlncyB7CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKCiAgICBteSBATmV3U2V0dGluZ3M7CgogICAgIyBtaWdyYXRlIE5hdkJhciBtb2R1bGVzCiAgICAjIGdldCBzZXR0aW5nIGNvbnRlbnQgZm9yIE5hdkJhciBtb2R1bGVzCiAgICBteSAkU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUnKTsKCiAgICBOQVZCQVJNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZUFkbWluICggc29ydCBrZXlzICV7JFNldHRpbmd9ICkgewoKICAgICAgICAjIHVwZGF0ZSBtb2R1bGUgbG9jYXRpb24KICAgICAgICBteSAkTW9kdWxlID0gJFNldHRpbmctPnskTW9kdWxlQWRtaW59LT57J01vZHVsZSd9IC8vICcnOwoKICAgICAgICBpZiAoICRNb2R1bGUgIX4gbXtLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyKFx3Kyl9ICkgewogICAgICAgICAgICBuZXh0IE5BVkJBUk1PRFVMRTsKICAgICAgICB9CiAgICAgICAgJFNldHRpbmctPnskTW9kdWxlQWRtaW59LT57J01vZHVsZSd9ID0gIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXI6Ok1vZHVsZUFkbWluIjsKCiAgICAgICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgICAgICBwdXNoIEBOZXdTZXR0aW5ncywgewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUjIyMnIC4gJE1vZHVsZUFkbWluLAogICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiAkU2V0dGluZy0+eyRNb2R1bGVBZG1pbn0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIG1pZ3JhdGUgSVRTTSBtZW51IG1vZHVsZXMKICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgSVRTTSBtZW51IG1vZHVsZXMKICAgIGZvciBteSAkVHlwZSAocXcoSVRTTUNoYW5nZSBJVFNNV29ya09yZGVyKSkgewoKICAgICAgICAkU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCggJFR5cGUgLiAnOjpGcm9udGVuZDo6TWVudU1vZHVsZScgKTsKCiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJE1lbnVNb2R1bGUgKCBzb3J0IGtleXMgJXskU2V0dGluZ30gKSB7CgogICAgICAgICAgICAjIHVwZGF0ZSBtb2R1bGUgbG9jYXRpb24KICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57J01vZHVsZSd9OwoKICAgICAgICAgICAgaWYgKCAkTW9kdWxlICF+IG17S2VybmVsOjpPdXRwdXQ6OkhUTUw6OiRUeXBlKFx3Kyl9ICkgewogICAgICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTmV3TWVudSA9ICRUeXBlIC4gIjo6JDEiOwogICAgICAgICAgICAkTW9kdWxlID1+IHN7S2VybmVsOjpPdXRwdXQ6OkhUTUw6OiRUeXBlKFx3Kyl9e0tlcm5lbDo6T3V0cHV0OjpIVE1MOjokTmV3TWVudX14bXNnOwoKICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnsnTW9kdWxlJ30gPSAkTW9kdWxlOwoKICAgICAgICAgICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgICAgICAgICAgcHVzaCBATmV3U2V0dGluZ3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICRUeXBlIC4gJzo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnIC4gJyMjIycgLiAkTWVudU1vZHVsZSwKICAgICAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIG1pZ3JhdGUgSVRTTSBwcmVmZXJlbmNlcwogICAgIyBnZXQgc2V0dGluZyBjb250ZW50IGZvciBwcmVmZXJlbmNlcwogICAgJFNldHRpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1ByZWZlcmVuY2VzR3JvdXBzJyk7CgogICAgUFJFRkVSRU5DRU1PRFVMRToKICAgIGZvciBteSAkUHJlZmVyZW5jZU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgIyB1cGRhdGUgbW9kdWxlIGxvY2F0aW9uCiAgICAgICAgbXkgJE1vZHVsZSA9ICRTZXR0aW5nLT57JFByZWZlcmVuY2VNb2R1bGV9LT57J01vZHVsZSd9OwogICAgICAgIGlmICggJE1vZHVsZSAhfiBte0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlcyhcdyspfSApIHsKICAgICAgICAgICAgbmV4dCBQUkVGRVJFTkNFTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgJE1vZHVsZQogICAgICAgICAgICA9fiBze0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlcyhcdyspfXtLZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXM6OiQxfXhtc2c7CiAgICAgICAgJFNldHRpbmctPnskUHJlZmVyZW5jZU1vZHVsZX0tPnsnTW9kdWxlJ30gPSAkTW9kdWxlOwoKICAgICAgICAjIEJ1aWxkIG5ldyBzZXR0aW5nLgogICAgICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdQcmVmZXJlbmNlc0dyb3VwcyMjIycgLiAkUHJlZmVyZW5jZU1vZHVsZSwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgPT4gJFNldHRpbmctPnskUHJlZmVyZW5jZU1vZHVsZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhQE5ld1NldHRpbmdzOwoKICAgICMgV3JpdGUgbmV3IHNldHRpbmcuCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nc1NldCgKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENvbW1lbnRzID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCAtIHBhY2thZ2Ugc2V0dXAgZnVuY3Rpb246IF9NaWdyYXRlQ29uZmlncycsCiAgICAgICAgU2V0dGluZ3MgPT4gXEBOZXdTZXR0aW5ncywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfTWlncmF0ZUNvbmZpZ3NGcm9tTG93ZXJUaGFuXzVfMF8xMigpCgpDaGFuZ2UgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggdGhlIG5ldyBmaWxlIGxvY2F0aW9uLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X01pZ3JhdGVDb25maWdzRnJvbUxvd2VyVGhhbl81XzBfMTIoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZUNvbmZpZ3NGcm9tTG93ZXJUaGFuXzVfMF8xMiB7ICAgICMjIG5vIGNyaXRpYwoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CgogICAgbXkgQE5ld1NldHRpbmdzOwoKICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgYWxsIGZyb250ZW5kIG1vZHVsZXMKICAgIG15ICRGcm9udGVuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpOwoKICAgIEZST05URU5ETU9EVUxFOgogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskRnJvbnRlbmRDb25maWd9ICkgewoKICAgICAgICBuZXh0IEZST05URU5ETU9EVUxFIGlmICEkRnJvbnRlbmRDb25maWctPnskTW9kdWxlfS0+e0xvYWRlcn07CiAgICAgICAgbmV4dCBGUk9OVEVORE1PRFVMRSBpZiAhJEZyb250ZW5kQ29uZmlnLT57JE1vZHVsZX0tPntMb2FkZXJ9LT57SmF2YVNjcmlwdH07CiAgICAgICAgbmV4dCBGUk9OVEVORE1PRFVMRSBpZiAhQHsgJEZyb250ZW5kQ29uZmlnLT57JE1vZHVsZX0tPntMb2FkZXJ9LT57SmF2YVNjcmlwdH0gfTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXR0aW5nIGNvbnRhaW5zIHRoZSBmaWxlIElUU00uQWdlbnQuQ29uZmlybWF0aW9uRGlhbG9nLmpzCiAgICAgICAgbmV4dCBGUk9OVEVORE1PRFVMRQogICAgICAgICAgICBpZiAhZ3JlcCB7ICRfIGVxICdJVFNNLkFnZW50LkNvbmZpcm1hdGlvbkRpYWxvZy5qcycgfQogICAgICAgICAgICBAeyAkRnJvbnRlbmRDb25maWctPnskTW9kdWxlfS0+e0xvYWRlcn0tPntKYXZhU2NyaXB0fSB9OwoKICAgICAgICAjIGJ1aWxkIG5ldyBzZXR0aW5ncyB3aXRoIHJlbmFtZWQgSmF2YXNjcmlwdCBmaWxlCiAgICAgICAgbXkgQE5ld0phdmFzY3JpcHRMb2FkZXJTZXR0aW5nczsKICAgICAgICBmb3IgbXkgJExvYWRlclNldHRpbmcgKCBAeyAkRnJvbnRlbmRDb25maWctPnskTW9kdWxlfS0+e0xvYWRlcn0tPntKYXZhU2NyaXB0fSB9ICkgewogICAgICAgICAgICBpZiAoICRMb2FkZXJTZXR0aW5nIGVxICdJVFNNLkFnZW50LkNvbmZpcm1hdGlvbkRpYWxvZy5qcycgKSB7CgogICAgICAgICAgICAgICAgIyBjaGFuZ2UgdGhlIHNldHRpbmcgKHJlbmFtZSB0aGUgZmlsZSkKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0phdmFzY3JpcHRMb2FkZXJTZXR0aW5ncywgJ0lUU00uQWdlbnQuQ29uZmlybURpYWxvZy5qcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIHVzZSB0aGUgb3JpZ2luYWwgc2V0dGluZwogICAgICAgICAgICAgICAgcHVzaCBATmV3SmF2YXNjcmlwdExvYWRlclNldHRpbmdzLCAkTG9hZGVyU2V0dGluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2UgdGhlIEpTIGxvYWRlciBzZXR0aW5ncwogICAgICAgICRGcm9udGVuZENvbmZpZy0+eyRNb2R1bGV9LT57TG9hZGVyfS0+e0phdmFTY3JpcHR9ID0gXEBOZXdKYXZhc2NyaXB0TG9hZGVyU2V0dGluZ3M7CgogICAgICAgICMgQnVpbGQgbmV3IHNldHRpbmcuCiAgICAgICAgcHVzaCBATmV3U2V0dGluZ3MsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Zyb250ZW5kOjpNb2R1bGUjIyMnIC4gJE1vZHVsZSwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgPT4gJEZyb250ZW5kQ29uZmlnLT57JE1vZHVsZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIG1pZ3JhdGUgSVRTTSBtZW51IG1vZHVsZXMKICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgSVRTTSBtZW51IG1vZHVsZXMKICAgIGZvciBteSAkVHlwZSAocXcoSVRTTUNoYW5nZSBJVFNNV29ya09yZGVyKSkgewoKICAgICAgICAjIGdldCBtZW51IG1vZHVsZSBzZXR0aW5nCiAgICAgICAgbXkgJFNldHRpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRUeXBlIC4gJzo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnICk7CgogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51TW9kdWxlICggc29ydCBrZXlzICV7JFNldHRpbmd9ICkgewoKICAgICAgICAgICAgIyBnZXQgdGFyZ2V0IHNldHRpbmcKICAgICAgICAgICAgbXkgJFRhcmdldCA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57J1RhcmdldCd9OwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdGhlIG9sZCBuYW1lCiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAkVGFyZ2V0IG5lICdDb25maXJtYXRpb25EaWFsb2cnOwoKICAgICAgICAgICAgIyB1cGRhdGUgdG8gbmV3IG5hbWUKICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnsnVGFyZ2V0J30gPSAnQ29uZmlybURpYWxvZyc7CgogICAgICAgICAgICAjIEJ1aWxkIG5ldyBzZXR0aW5nLgogICAgICAgICAgICBwdXNoIEBOZXdTZXR0aW5ncywgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJFR5cGUgLiAnOjpGcm9udGVuZDo6TWVudU1vZHVsZScgLiAnIyMjJyAuICRNZW51TW9kdWxlLAogICAgICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgPT4gJFNldHRpbmctPnskTWVudU1vZHVsZX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICFATmV3U2V0dGluZ3M7CgogICAgIyBXcml0ZSBuZXcgc2V0dGluZy4KICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdzU2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIENvbW1lbnRzID0+CiAgICAgICAgICAgICdJVFNNQ2hhbmdlTWFuYWdlbWVudCAtIHBhY2thZ2Ugc2V0dXAgZnVuY3Rpb246IF9NaWdyYXRlQ29uZmlnc0Zyb21Mb3dlclRoYW5fNV8wXzEyJywKICAgICAgICBTZXR0aW5ncyA9PiBcQE5ld1NldHRpbmdzLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
ITSM::ChangeManagement::Category
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
requested
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
pending approval
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
rejected
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
approved
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
in progress
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
pending pir
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
successful
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
failed
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
canceled
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
retracted
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
created
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
accepted
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
ready
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
in progress
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
closed
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
canceled
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
approval
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
workorder
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
backout
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
decision
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
pir
1
current_timestamp
1
current_timestamp
1
ChangeAdd
1
current_timestamp
1
current_timestamp
1
ChangeUpdate
1
current_timestamp
1
current_timestamp
1
ChangeDelete
1
current_timestamp
1
current_timestamp
1
ChangeCABUpdate
1
current_timestamp
1
current_timestamp
1
ChangeCABDelete
1
current_timestamp
1
current_timestamp
1
ChangeLinkAdd
1
current_timestamp
1
current_timestamp
1
ChangeLinkDelete
1
current_timestamp
1
current_timestamp
1
ChangeAttachmentAdd
1
current_timestamp
1
current_timestamp
1
ChangeAttachmentDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderUpdate
1
current_timestamp
1
current_timestamp
1
WorkOrderDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderLinkAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderLinkDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderAttachmentAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderAttachmentDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderReportAttachmentAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderReportAttachmentDelete
1
current_timestamp
1
current_timestamp
1
ChangePlannedStartTimeReached
1
current_timestamp
1
current_timestamp
1
ChangePlannedEndTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeActualStartTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeActualEndTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderPlannedStartTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderPlannedEndTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderActualStartTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderActualEndTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeRequestedTimeReached
1
current_timestamp
1
current_timestamp
1
ConditionAdd
1
current_timestamp
1
current_timestamp
1
ConditionUpdate
1
current_timestamp
1
current_timestamp
1
ConditionDelete
1
current_timestamp
1
current_timestamp
1
ConditionDeleteAll
1
current_timestamp
1
current_timestamp
1
ExpressionAdd
1
current_timestamp
1
current_timestamp
1
ExpressionUpdate
1
current_timestamp
1
current_timestamp
1
ExpressionDelete
1
current_timestamp
1
current_timestamp
1
ExpressionDeleteAll
1
current_timestamp
1
current_timestamp
1
ActionAdd
1
current_timestamp
1
current_timestamp
1
ActionUpdate
1
current_timestamp
1
current_timestamp
1
ActionDelete
1
current_timestamp
1
current_timestamp
1
ActionDeleteAll
1
current_timestamp
1
current_timestamp
1
ActionExecute
1
current_timestamp
1
current_timestamp
1
ChangeNotificationSent
1
current_timestamp
1
current_timestamp
1
WorkOrderNotificationSent
1
current_timestamp
1
current_timestamp
1
RfC
1
current_timestamp
1
current_timestamp
1
ITSMChange
ITSMWorkOrder
ChangeStateID
ChangeTitle
CategoryID
ImpactID
PriorityID
ChangeManagerID
ChangeBuilderID
RequestedTime
PlannedStartTime
PlannedEndTime
ActualStartTime
ActualEndTime
PlannedEffort
AccountedTime
WorkOrderNumber
WorkOrderStateID
WorkOrderTypeID
WorkOrderTitle
WorkOrderAgentID
WorkOrderGroupID
is
is not
is empty
is not empty
is greater than
is less than
is before
is after
contains
not contains
begins with
ends with
set
lock
ChangeBuilder
OldChangeBuilder
ChangeManager
OldChangeManager
CABCustomers
CABAgents
WorkOrderAgents
WorkOrderGroup
WorkOrderAgent
OldWorkOrderAgent
ChangeInitiators
GroupITSMChange
GroupITSMChangeBuilder
GroupITSMChangeManager
ITSMChange
1
current_timestamp
1
current_timestamp
1
ITSMWorkOrder
1
current_timestamp
1
current_timestamp
1
CAB
1
current_timestamp
1
current_timestamp
1
ITSMCondition
1
current_timestamp
1
current_timestamp
1
WorkOrderGroup
WorkOrderGroup