ImportExport
2.1.91
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.0.0 beta1.
The ImportExport package.
Das ImportExport Paket.
El paquete ImportExport.
3.0.x
</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>
((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>
((enjoy))</br>
</br>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos que se crearon durante la instalación
del mismo, se eliminarán. ¡La totalidad de los datos que contenían dichas tablas, se perderá irrevocablemente!
<br/>
<br/>
((enjoy))<br/>
<br/>
# define function name
my $FunctionName = 'CodeUpgradeFromBefore_2_0_3';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2010-12-22 22:28:26
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBJbXBvcnRFeHBvcnQucGwgLSBpbXBvcnQvZXhwb3J0IHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBsLHYgMS4xNCAyMDEwLzAyLzIzIDEyOjA4OjQ2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OICRSZWFsQmluKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTQgJCkgWzFdOwoKIyBnZXQgb3B0aW9ucwpteSAlT3B0czsKZ2V0b3B0cyggJ2huOmE6aTpvOicsIFwlT3B0cyApOwoKaWYgKCAkT3B0c3tofSApIHsKCiAgICBwcmludCBTVERPVVQgIkltcG9ydEV4cG9ydC5wbCA8UmV2aXNpb24gJFZFUlNJT04+IC0gYW4gaW1wb3J0L2V4cG9ydCB0b29sXG4iOwogICAgcHJpbnQgU1RET1VUICJDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvXG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgInVzYWdlOkltcG9ydEV4cG9ydC5wbCAtbiA8VGVtcGxhdGVOdW1iZXI+IC1hIGltcG9ydHxleHBvcnQgIjsKICAgIHByaW50IFNURE9VVCAiWy1pIDxTb3VyY2VGaWxlPl0gWy1vIDxEZXN0aW5hdGlvbkZpbGU+XVxuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICIgICBleGFtcGxlczpcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBJbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgaW1wb3J0IC1pIC90bXAvaW1wb3J0LmNzdlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgICAgIEltcG9ydEV4cG9ydC5wbCAtbiAwMDAwNCAtYSBleHBvcnQgLW8gL3RtcC9leHBvcnQuY3N2XG4iOwoKICAgIGV4aXQgMTsKfQoKIyBjaGVjayB0ZW1wYWx0ZSBudW1iZXIKaWYgKCAhJE9wdHN7bn0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1uIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9CmlmICggJE9wdHN7bn0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBJbnZhbGlkIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9Cm15ICRUZW1wbGF0ZUlEID0gaW50ICRPcHRze259OwoKIyBjaGVjayBhY3Rpb24gbW9kZQppZiAoICEkT3B0c3thfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IE5lZWQgLWEgaW1wb3J0fGV4cG9ydFxuIjsKICAgIGV4aXQgMTsKfQppZiAoIGxjICRPcHRze2F9IG5lICdpbXBvcnQnICYmIGxjICRPcHRze2F9IG5lICdleHBvcnQnICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBhY3Rpb25cbiI7CiAgICBleGl0IDE7Cn0KCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3Q7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgTG9nUHJlZml4ID0+ICdPVFJTLUltcG9ydEV4cG9ydCcsCiAgICAlQ29tbW9uT2JqZWN0LAopOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIGdldCB0ZW1wbGF0ZSBkYXRhCm15ICRUZW1wbGF0ZURhdGEgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCmlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IFRlbXBsYXRlICRPcHRze259IG5vdCBmb3VuZCFcbiI7CiAgICBwcmludCBTVERFUlIgIkV4cG9ydCBhYm9ydGVkLlxuIjsKICAgIGV4aXQgMTsKfQoKIyB0aW1lIHRvIHN0YXJ0CmlmICggbGMgJE9wdHN7YX0gZXEgJ2ltcG9ydCcgKSB7CgogICAgbXkgJFNvdXJjZUNvbnRlbnQgPSBcZG8geycnfTsKICAgIGlmICggJE9wdHN7aX0gKSB7CgogICAgICAgIHByaW50IFNURE9VVCAiUmVhZCBGaWxlICRPcHRze2l9LlxuIjsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgJFNvdXJjZUNvbnRlbnQgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJE9wdHN7aX0sCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgZGllICJDYW4ndCByZWFkIGZpbGUgJE9wdHN7aX0uXG5JbXBvcnQgYWJvcnRlZC5cbiIgaWYgISRTb3VyY2VDb250ZW50OwogICAgfQoKICAgIHByaW50IFNURE9VVCAiSW1wb3J0IGluIHByb2Nlc3MuLi5cbiI7CgogICAgIyBpbXBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+SW1wb3J0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU291cmNlQ29udGVudCwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKICAgIGRpZSAiXG5FcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSB0aGUgT1RSUyBsb2cgZm9yIGRldGFpbHMuXG4iIGlmICFkZWZpbmVkICRSZXN1bHQ7CgogICAgIyBQcmludCByZXN1bHQKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUCiAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0LT57Q291bnRlcn0gJFJlc3VsdC0+e09iamVjdH0gcmVjb3JkczogIgogICAgICAgIC4gIiRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZCwgJFJlc3VsdC0+e1N1Y2Nlc3N9IHN1Y2NlZWRlZFxuIjsKICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0LT57UmV0Q29kZX0gfSApIHsKICAgICAgICBteSAkQ291bnQgPSAkUmVzdWx0LT57UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICBwcmludCBTVERPVVQKICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0LT57Q291bnRlcn0gJFJlc3VsdC0+e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlXG4iLAogICAgfQogICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICBwcmludCBTVERPVVQKICAgICAgICAgICAgIkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlOiAkUmVzdWx0LT57Q291bnRlcn1cbiI7CiAgICB9Cn0KZWxzaWYgKCBsYyAkT3B0c3thfSBlcSAnZXhwb3J0JyApIHsKCiAgICBwcmludCBTVERPVVQgIkV4cG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgZXhwb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgZGllICJcbkVycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy5cbiIgaWYgIWRlZmluZWQgJFJlc3VsdDsKCiAgICBwcmludCBTVERPVVQKICAgICAgICAiXG4iLAogICAgICAgICJTdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc31cbiIsCiAgICAgICAgIkZhaWxlZCA6ICRSZXN1bHQtPntGYWlsZWR9XG4iLAogICAgICAgICJcbiI7CgogICAgaWYgKCAkT3B0c3tvfSApIHsKCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICAjIHNhdmUgZGVzdGluYXRpb24gY29udGVudCB0byBmaWxlCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29tbW9uT2JqZWN0e01haW5PYmplY3R9LT5GaWxlV3JpdGUoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze299LAogICAgICAgICAgICBDb250ZW50ICA9PiBcJEZpbGVDb250ZW50LAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3Qgd3JpdGUgZmlsZSAkT3B0c3tvfS5cbkV4cG9ydCBhYm9ydGVkLlxuIiBpZiAhJFN1Y2Nlc3M7CgogICAgICAgIHByaW50IFNURE9VVCAiRmlsZSAkT3B0c3tvfSBzYXZlZC5cbiI7CiAgICB9CgogICAgcHJpbnQgU1RET1VUICJFeHBvcnQgY29tcGxldGUuXG4iOwp9CgpleGl0IDA7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTQgJCAkRGF0ZTogMjAxMC8wMi8yMyAxMjowODo0NiAkCgo9Y3V0Cg==
iVBORw0KGgoAAAANSUhEUgAABh8AAAQACAYAAADx1EgnAAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2gkIFBcB3n5g2wAAIABJREFUeJzs3T9sG3ea//HPyP9iJd712knuNomye7ukEDg8N24MDm5rk7YBbaNCLlwEIAEXIRsDd4AKFQL2ADcc4xoSyAEp3LCJAMOkuwMWJuEr3PjkYH8id7FrZTeJ4zix41h2bGl+xcyQQ4mkKInkDKX3CxBgc/58nxkqgef7zPN9DNu2bQEAAAAAAAAAAPTH/f1BRwAAALCXPH36VF9//bUOHz6sd955J+hwOvrhhx/05MkTHT58WMeOHQs6HAAAAADAiCH5AAAAMES2bWttbU1hLz599eqVnj17pn379gUdCgAAAABgBI0FHQAAAMBe4iUdDMMIOJLejI3xz0UAAAAAwNbxNAkAADBEYa948KytrQUdAgAAAABghJF8AAAACEDYKx9GrUIDAAAAABAuJB8AAACGaNQm9UclTgAAAABAuJB8AAAAGCKWXQIAAAAA7AUkHwAAAAIwKhUFNJwGAAAAAGwHT5MAAABDNCrLLnmVD2GPEwAAAAAQTiQfAAAAhojljAAAAAAAe8H+oAMAAADYS37+859rfHxc+/eH+59hBw8e1Pj4uA4ePBh0KAAAAACAEWTYo9L1EAAAAAAAAAAAjIL7LLsEAAAAAAAAAAD6iuQDAAAAAAAAAADoK5IPAAAAAAAAAACgr8Ld6RAAAGCX+eqrr/TDDz/ozTff1C9+8Yugw+nou+++0+rqqn72s5/RdBoAAAAAsGU0nAYAABiytbU1GYYhwzCCDqWjJ0+eaHV1Va+//jrJBwAAAADAVt0n+QAAAAAAAAAAAPrpPj0fAAAAAAAAAABAX5F8AAAAAAAAAAAAfUXyAQAAYIhevHihZ8+eaXV1NehQAAAAAAAYGJIPAAAAQ/TNN9/o73//u549exZ0KF198cUXun//vl6+fBl0KAAAAACAEbQ/6AAAAAAQPi9evNDa2pps2w46FAAAAADACKLyAQAAIABjY+H+Z5iXdAh7nAAAAACAcOJpEgAAYIjW1taCDqEnVDwAAAAAAHaC5AMAAAA6Mgwj6BAAAAAAACOI5AMAAEAAwryckb86g+QDAAAAAGA7wvvUCwAAsAuN2nJGJB8AAAAAANtB8gEAAGCI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qpwAAAGCSURBVAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAAABolfAAAAAAA4OtajlIURYretP6+maa3930z7aUoeplu8uT6Iw/Xm77+ixA+AAAAAADwhR1nUVWZ5CbLJJv/3ORkXaU6O8gySWt8lfWks7v64fpyVNThxTageLie9U06iyrrk5tMN6+7/isTPgAAAAAA8HX1+/nVK/Lz5DT9vR9vfl3m1+bZu3br/VmVqqpSVVcZt564v3+cDIq0y+Sg9brrvzLhAwAAAAAAX9ZyVKRcJavyou50OEjKdpH2z8OMW/WxS+1ynrJddyo8XH/o0fryMvPfvP+1138VRVVV1WcXAQAAAAAAfBn/6HwAAAAAAAAaJXwAAAAAAAAaJXwAAAAAAAAaJXwAAAAAAAAaJXwAAAAAAAAa9VeSk88uAgAAAAAA+DL++z8W4DZrQvElpAAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBJbXBvcnRFeHBvcnQueG1sLHYgMS44IDIwMTAvMDkvMTQgMjA6NTg6MjEgZHogRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkltcG9ydC9FeHBvcnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQvRXhwb3J0PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5TeXN0ZW08L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjcxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPklUU00uSW1wb3J0RXhwb3J0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogYmdfSW1wb3J0RXhwb3J0LnBtLHYgMS4xNCAyMDEwLzA5LzE0IDIxOjQ5OjE0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJExhbmctPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKICAgICRMYW5nLT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY2F0YWxhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IFNpc3RlbWVzIE9USUMgKGlic2FsdXQpIC0gQW50b25pbyBMaW5kZQojIC0tCiMgJElkOiBjdF9JbXBvcnRFeHBvcnQucG0sdiAxLjcgMjAxMC8wOS8xNCAyMTo0OToxNCBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdHZXN0afIgZGUgSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdBZmVnaXIgcGxhbnRpbGxhIGRlIG1hcGF0Z2UnOwogICAgJExhbmctPnsnU3RhcnQgSW1wb3J0J30gICAgICAgICAgICAgICA9ICdDb21lbudhciBpbXBvcnRhY2nzJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnQ29tZW7nYXIgZXhwb3J0YWNp8yc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Bhcyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGNvbXVuYSc7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzIGRcJ29iamVjdGUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBmb3JtYXQnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdFZGl0YXIgaW5mb3JtYWNp8yBkZSBtYXBhdGdlJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWFjafMgZGUgcmVjZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyIGluZm9ybWFjafMnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nzIHBlciByZWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnRml0eGVyIGZvbnQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdTZXBhcmFkb3IgZGUgY29sdW1uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYWRvciAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnQgaSBjb21hICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0RvcyBwdW50cyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW50ICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0Nvbmp1bnQgZGUgY2Fy4GN0ZXJzJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJExhbmctPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKICAgICRMYW5nLT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JbXBvcnRFeHBvcnQucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAxMCBPMkJTLmNvbSwgcyByLm8uIEpha3ViIEhhbnVzCiMgLS0KIyAkSWQ6IGN6X0ltcG9ydEV4cG9ydC5wbSx2IDEuMTIgMjAxMC8wOS8xNCAyMTo0OToxNCBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9FeHBvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdJbXBvcnQvRXhwb3J0IFNwcuF2YSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ05vduEguWFibG9uYSB6b2JyYXplbu0nOwogICAgJExhbmctPnsnU3RhcnQgSW1wb3J0J30gICAgICAgICAgICAgICA9ICdaYWjhaml0IEltcG9ydCc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ1phaOFqaXQgRXhwb3J0JzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnS3Jvayc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhY2Ugb2JlY279Y2ggaW5mb3JtYWPtJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFjZSBpbmZvcm1hY+0gbyBvYmpla3R1JzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFjZSBmb3Jt4XR1JzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnRWRpdGFjZSBtYXBvduFu7Sc7CiAgICAkTGFuZy0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhY2UgdnlobGVk4Xbhbu0nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbmZvcm1hY2UgbyBJbXBvcnR1JzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnU2xvdXBlYyc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ09tZXppdCBFeHBvcnQgdnlobGVk4Xbhbu1tJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnWmRyb2pvdv0gU291Ym9yJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnT2Rk7GxvdmHoIFNsb3VwY/knOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bOF0b3IgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdTdPhlZG7tayAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEdm9qdGXoa2EgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnVGXoa2EgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnWm5ha2924SBzYWRhJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJExhbmctPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKICAgICRMYW5nLT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBkYSAoRGFuaXNoKSBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGFfSW1wb3J0RXhwb3J0LnBtLHYgMS40IDIwMTAvMDkvMTQgMjE6NDk6MTQgZHogRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9Fa3BvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdJbXBvcnQvRWtwb3J0IHN0eXJpbmcnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICdUaWxm+GogTWFwcGluZy1UZW1wbGF0ZSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ1N0YXJ0IGltcG9ydCc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ1N0YXJ0IGVrcG9ydCc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RyaW4nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdSZXQgZuZsbGVzIGluZm9ybWF0aW9uJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnUmV0IG9iamVrdCBpbmZvcm1hdGlvbic7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ1JldCBmb3JtYXQgaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdSZXQgbWFwcGluZyBpbmZvcm1hdGlvbic7CiAgICAkTGFuZy0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ICAgID0gJ1JldCBz+GdlaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQgaW5mb3JtYXRpb24nOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb2xvbm5lJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVncuZucyBla3BvcnQgcHIuIHP4Z25pbmcnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICdLaWxkZSBmaWwnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdLb2xvbm5lIGFkc2tpbGxlbHNlJzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkTGFuZy0+eydDb2xvbiAoOiknfSAgICAgICAgICAgICAgICAgID0gJ0tvbG9uICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bmt0dW0gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnVGVnbnPmdCc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4yNSAyMDEwLzA5LzE0IDIxOjQ5OjE0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ01hcHBpbmctVGVtcGxhdGUgaGluenVm77+9Z2VuJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW1wb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdFeHBvcnQgc3RhcnRlbic7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjaHJpdHQnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVrdC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdGb3JtYXQtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnTWFwcGluZy1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdTdWNoLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydCBJbmZvcm1hdGlvbmVuJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnU3BhbHRlJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IHBlciBTdWNoZSBlaW5zY2hy77+9bmtlbic7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ1F1ZWxsLURhdGVpJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdTZW1pY29sb24gKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9wcGVscHVua3QgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVua3QgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnWmVpY2hlbnNhdHonOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0gJ0Zvcm1hdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JbXBvcnRFeHBvcnQucG0gLSB0aGUgc3BhbmlzaCB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEFxdWlsZXMgQ29oZW4KIyAtLQojICRJZDogZXNfSW1wb3J0RXhwb3J0LnBtLHYgMS4xMiAyMDEwLzEwLzAxIDIxOjU5OjU1IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdHZXN0afNuIGRlIEltcG9ydGFjafNuL0V4cG9ydGFjafNuJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnQfFhZGlyIHBsYW50aWxsYSBkZSBtYXBlbyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0luaWNpYXIgSW1wb3J0YWNp824nOwogICAgJExhbmctPnsnU3RhcnQgRXhwb3J0J30gICAgICAgICAgICAgICA9ICdJbmljaWFyIEV4cG9ydGFjafNuJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzbyc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBjb236bic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1hY2nzbiBkZSBvYmpldG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYWNp824gZGVsIGZvcm1hdG8nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdFZGl0YXIgaW5mb3JtYWNp824gZGUgbWFwZW8nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYWNp824gZGUgYvpzcXVlZGEnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnRhciBpbmZvcm1hY2nzbic7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ0NvbHVtbmEnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGFjafNuIHBvciBi+nNxdWVkYSc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ0FyY2hpdm8gb3JpZ2VuJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnU2VwYXJhZG9yIGRlIENvbHVtbmEnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGFkb3IgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQdW50byB5IENvbWEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9zIHB1bnRvcyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQdW50byAoLiknOwogICAgJExhbmctPnsnQ29tbWEgKCwpJ30gICAgICAgICAgICAgICAgICA9ICdDb21hICgsKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0p1ZWdvIGRlIGNhcmFjdGVyZXMnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdSZWdpc3RybyBkZSBt82R1bG8gZnJvbnRlbmQgcGFyYSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnUmVnaXN0cm8gZGUgbfNkdWxvIGRlIGZvcm1hdG8gYmFja2VuZCBwYXJhIGVsIG3zZHVsbyBpbXBvcnQvZXhwb3J0Lic7CiAgICAkTGFuZy0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0YXIgeSBleHBvcnRhciBpbmZvcm1hY2nzbiBkZSBvYmpldG9zLic7CiAgICAkTGFuZy0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnoURlYmUgZXNwZWNpZmljYXIgT2JqZXRvISc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnoURlYmUgZXNwZWNpZmljYXIgRm9ybWF0byEnOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnoURlYmUgZXNwZWNpZmljYXIgQ2xhc2UhJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnoURlYmUgZXNwZWNpZmljYXIgU2VwYXJhZG9yIGRlIENvbHVtbmEhJzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdObyBzZSBlbmNvbnRyYXJvbiBlbGVtZW50b3MgZGUgbWFwZW8uJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ0xvcyBjYW1wb3MgdmFj7W9zIGluZGljYW4gcXVlIGxvcyB2YWxvcmVzIGFjdHVhbGVzIHNlIG1hbnRpZW5lbic7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0FncmVndWUgdW5hIHBsYW50aWxsYSBudWV2YSBwYXJhIHBvZGVyIGltcG9ydGFyIHkgZXhwb3J0YXIuJzsKICAgICRMYW5nLT57J0dvIGJhY2snfSAgICAgICAgICAgICAgICAgICAgPSAnUmVncmVzYXInOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcGVyc2lhbiAoZmFyc2kpIHRyYW5zbGF0aW9uIG9mIGZhX0ltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBBZnNoYXIgTW9oZWJiaSA8YWZzaGFyLm1vaGViYmkgYXQgZ21haWwuY29tPgojIC0tCiMgJElkOiBmYV9JbXBvcnRFeHBvcnQucG0sdiAxLjUgMjAxMC8wOS8xNCAyMTo0OToxNCBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAn2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICfZhdiv24zYsduM2Kog2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2YLYp9mE2Kgg2Ybar9in2LTYqic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDZiNix2YjYryc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDYtdiv2YjYsSc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9qv2KfZhSc7CiAgICAkTGFuZy0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINii2KjYrNqp2KrbjCc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDZgtin2YTYqOKAjNio2YbYr9uMJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINmG2q/Yp9i02KonOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ9mI2LHZiNivINin2LfZhNin2LnYp9iqJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2LPYqtmI2YYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfZhdit2K/ZiNiv2LPYp9iy24wg2LnZhdmE24zYp9iqINi12K/ZiNixINio2Ycg2KfYstin24wg2KzYs9iq2KzZiCc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ9mB2KfbjNmEINmF2YbYqNi5JzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAn2KzYr9in2qnZhtmG2K/ZhyDYs9iq2YjZhuKAjNmH2KcnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICfYrNiv2YjZhCDYs9in2LIgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICfYs9mF24wg2qnYp9mE2YYgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAn2K/ZiNmG2YLYt9mHICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ9mG2YLYt9mHICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ9qp2K/YqNmG2K/bjCDYp9i32YTYp9i52KfYqic7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgZnJlbmNoIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9saXZpZXIgU2FsbG91IDxvbGl2aWVyLnNhbGxvdSBhdCBpcmlzYS5mcj4KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGZyX0ltcG9ydEV4cG9ydC5wbSx2IDEuNiAyMDEwLzA5LzE0IDIxOjQ5OjE0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnRlci9FeHBvcnRlcic7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0dlc3Rpb24gZGUgbFwnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0Fqb3V0ZXIgdW4gdGVtcGxhdGUgZGUgbWFwcGFnZSc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0TpbWFycmVyIEltcG9ydCc7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ0TpbWFycmVyIEV4cG9ydCc7CiAgICAkTGFuZy0+eydTdGVwJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YXBlJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgY29tbXVuZXMnOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBsXCdvYmpldCc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIGZvcm1hdCc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIG1hcHBhZ2UnOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSByZWNoZXJjaGUnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbmZvcm1hdGlvbnMgZFwnaW1wb3J0JzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ29sb25uZSc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyZWluZHJlIGxcJ2V4cG9ydCBwYXIgcmVjaGVyY2hlJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnRmljaGllciBTb3VyY2UnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdT6XBhcmF0ZXVyIGRlIGNvbG9ubmUnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGF0aW9uIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnUG9pbnQgdmlyZ3VsZSAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEZXV4IHBvaW50cyAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICdQb2ludCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdKZXUgZGUgY2FyYWN06HJlcyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgaXRhbGlhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGl0X0ltcG9ydEV4cG9ydC5wbSx2IDEuNSAyMDEwLzA5LzE0IDIxOjQ5OjE0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCd9ICAgICAgICAgICAgICA9ICdJbXBvcnRhcmUvRXNwb3J0YXJlJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAnR2VzdGlvbmUgSW1wb3J0YXppb25lL0VzcG9ydGF6aW9uZSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ0FnZ2l1bmdpIG1hcHBhdHVyYSBtb2RlbGxvJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgSW1wb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pemlhcmUgRXNwb3J0YXppb25lJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzc28nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgY29tdW5pJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnTW9kaWZpY2EgaW5mb3JtYXppb25pIG9nZ2V0dG8nOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBmb3JtYXRvIGluZm9ybWF6aW9uZSc7CiAgICAkTGFuZy0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSAgID0gJ01vZGlmaWNhIG1hcHBhdHVyYSBpbmZvcm1hemlvbmknOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgZGkgcmljZXJjYSc7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ0ltcG9ydGFyZSBpbmZvcm1hemlvbmUnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDb2xvbm5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdlcmUgZXNwb3J0YXppb25lIHBlciByaWNlcmNhJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQXJjaGl2aW8gb3JpZ2luZSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvcmUgZGkgY29sb25uYSc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYnVsYXRvcmUgKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQdW50byBlIHZpcmdvbGEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRHVlIHB1bnRpICg6KSc7CiAgICAkTGFuZy0+eydEb3QgKC4pJ30gICAgICAgICAgICAgICAgICAgID0gJ1B1bnRvICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0NoYXJzZXQnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDbGFzcyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkTGFuZy0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICcnOwogICAgJExhbmctPnsnQ3JlYXRlIGEgdGVtcGxhdGUgaW4gb3JkZXIgdG8gY2FuIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgRHV0Y2ggdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hpZWwgQmVpamVuIDxtaWNoaWVsICdhdCcgYmVlZnJlZWl0Lm5sPgojIC0tCiMgJElkOiBubF9JbXBvcnRFeHBvcnQucG0sdiAxLjcgMjAxMC8wOS8yNCAwODo1ODoxNSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAnSW1wb3J0L0V4cG9ydCc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0ltcG9ydC9FeHBvcnQgYmVoZWVyJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnTWFwcGluZ3RlbXBsYXRlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGFwJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnQWxnZW1lbmUgaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkTGFuZy0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ICAgID0gJ09iamVjdC1pbmZvcm1hdGllIGJld2Vya2VuJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnRm9ybWF0LWluZm9ybWF0aW9uZW4gYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICdNYXBwaW5nLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdab2VrLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbXBvcnQtaW5mb3JtYXRpZSc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ0tvbG9tJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVwZXJrIGV4cG9ydCB0b3Qgem9la29wZHJhY2h0JzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnQnJvbmJlc3RhbmQnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICdLb2xvbXNjaGVpZGluZ3N0ZWtlbic7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ1RhYic7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ1B1bnRrb21tYSAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEdWJiZWxlIHB1bnQgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUHVudCAoLiknOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdLYXJha3RlcnNldCc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnQgZW4gZXhwb3J0IG9iamVjdGluZm9ybWF0aWUnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamVjdCBpcyB2ZXJwbGljaHQuJzsKICAgICRMYW5nLT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYWF0IGlzIHZlcnBsaWNodC4nOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnS2xhc3NlIGlzIHZlcnBsaWNodC4nOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICdTY2hlaWRpbmdzdGVrZW4gaXMgdmVycGxpY2h0JzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdHZWVuIGVsZW1lbnRlbiBnZXZvbmRlbi4nOwogICAgJExhbmctPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnQmlqIGxlZ2UgdmVsZGVuIHdvcmR0IGRlIGh1aWRpZ2Ugd2FhcmRlIGJlaG91ZGVuJzsKICAgICRMYW5nLT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnTWFhayBlZW4gdGVtcGxhdGUgYWFuIG9tIG9iamVjdGVuIHRlIGltcG9ydGVyZW4gb2YgZXhwb3J0ZXJlbi4nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcG9saXNoIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggTWFjaWVqIExvc3phamMKIyAtLQojICRJZDogcGxfSW1wb3J0RXhwb3J0LnBtLHYgMS44IDIwMTAvMDkvMTQgMjE6NDk6MTQgZHogRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydC9FeHBvcnQnOwogICAgJExhbmctPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gICA9ICdaYXJ6MWR6YW5pZSBJbXBvcnRlbS9FeHBvcnRlbSc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ1JvenBvY3puaWogSW1wb3J0JzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnUm96cG9jem5paiBFeHBvcnQnOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICcnOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb2x1bW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRMYW5nLT57J1NvdXJjZSBGaWxlJ30gICAgICAgICAgICAgICAgPSAnUGxpayBZcvNkM293eSc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yJ30gICAgICAgICAgID0gJ1NlcGFyYXRvciBrb2x1bW55JzsKICAgICRMYW5nLT57J1RhYnVsYXRvciAoVEFCKSd9ICAgICAgICAgICAgPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRMYW5nLT57J1NlbWljb2xvbiAoOyknfSAgICAgICAgICAgICAgPSAnT3JlZG5payAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICdEd3Vrcm9wZWsgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnS3JvcGthICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ0tvZG93YW5pZSc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgQnJhemlsaWFuIHRyYW5zbGF0aW9uIG9mIEltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ3Jpc3RpYW5vIEtvcm5k9nJmZXIsIGh0dHA6Ly93d3cuZG9yZmVyLmNvbS5ici8KIyAtLQojICRJZDogcHRfQlJfSW1wb3J0RXhwb3J0LnBtLHYgMS41IDIwMTAvMDkvMTQgMjE6NDk6MTQgZHogRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ0ltcG9ydGHn428vRXhwb3J0Yefjbyc7CiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSAgID0gJ0dlcmVuY2lhbWVudG8gZGUgSW1wb3J0Yefjby9FeHBvcnRh5+NvJzsKICAgICRMYW5nLT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gICAgICAgPSAnQWRpY2lvbmFyIE1vZGVsbyBkZSBNYXBlYW1lbnRvJzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pY2lhciBJbXBvcnRh5+NvJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnSW5pY2lhciBFeHBvcnRh5+NvJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFzc28nOwogICAgJExhbmctPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYef1ZXMgY29tdW5zJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnRWRpdGFyIGluZm9ybWHn9WVzIGRvIG9iamV0byc7CiAgICAkTGFuZy0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ICAgID0gJ0VkaXRhciBpbmZvcm1h5/VlcyBkbyBmb3JtYXRvJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnRWRpdGFyIGluZm9ybWHn9WVzIGRvIG1hcGVhbWVudG8nOwogICAgJExhbmctPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSAgICA9ICdFZGl0YXIgaW5mb3JtYef1ZXMgZGUgcGVzcXVpc2EnOwogICAgJExhbmctPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gICAgICAgICA9ICdJbmZvcm1h5/VlcyBkZSBpbXBvcnRh5+NvJzsKICAgICRMYW5nLT57J0NvbHVtbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ29sdW5hJzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRh5+NvIHBvciBwZXNxdWlzYSc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ0FycXVpdm8gZGUgT3JpZ2VtJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3InfSAgICAgICAgICAgPSAnU2VwYXJhZG9yIGRlIENvbHVuYXMnOwogICAgJExhbmctPnsnVGFidWxhdG9yIChUQUIpJ30gICAgICAgICAgICA9ICdUYWJ1bGHn428gKFRBQiknOwogICAgJExhbmctPnsnU2VtaWNvbG9uICg7KSd9ICAgICAgICAgICAgICA9ICdQb250byBlIFbtcmd1bGEgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnRG9pcyBQb250b3MgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAnUG9udG8gKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnQ29kaWZpY2Hn428gZGUgQ2FyYWN0ZXJlcyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRMYW5nLT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JbXBvcnRFeHBvcnQucG0gLSB0aGUgcnVzc2lhbiB0cmFuc2xhdGlvbiBvZiBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IEVnb3IgVHNpbGVua28gPGJnOHMgYXQgc3ltbGluay5ydT4KIyAtLQojICRJZDogcnVfSW1wb3J0RXhwb3J0LnBtLHYgMS42IDIwMTAvMDkvMTQgMjE6NDk6MTQgZHogRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydJbXBvcnQvRXhwb3J0J30gICAgICAgICAgICAgID0gJ8js7+7w8i/d6vHv7vDyJzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAn0+/w4OLr5e3o5SDI7O/u8PLu7C/d6vHv7vDy7uwnOwogICAgJExhbmctPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSAgICAgICA9ICfE7uHg4uvl7ejlIPjg4evu7eAg8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J1N0YXJ0IEltcG9ydCd9ICAgICAgICAgICAgICAgPSAnzeD34PL8IOjs7+7w8ic7CiAgICAkTGFuZy0+eydTdGFydCBFeHBvcnQnfSAgICAgICAgICAgICAgID0gJ83g9+Dy/CD96vHv7vDyJzsKICAgICRMYW5nLT57J1N0ZXAnfSAgICAgICAgICAgICAgICAgICAgICAgPSAn2ODjJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDu4fnz/iDo7fTu8Ozg9uj+JzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDo7fTu8Ozg9uj+IO7hIO7h+uXq8uUnOwogICAgJExhbmctPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSAgICA9ICfQ5eTg6vLo8O7i4PL8IPTu8Ozg8iDk4O3t+/UnOwogICAgJExhbmctPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gICA9ICfQ5eTg6vLo8O7i4PL8IOjt9O7w7OD26P4g8e7u8uLl8vHy4uj/JzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAn0OXk4Ory6PDu4uDy/CDv7ujx6u7i8/4g6O307vDs4Pbo/ic7CiAgICAkTGFuZy0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSAgICAgICAgID0gJ8jt9O7w7OD26P8g6Ozv7vDy4Cc7CiAgICAkTGFuZy0+eydDb2x1bW4nfSAgICAgICAgICAgICAgICAgICAgID0gJ9Hy7uvh5fYnOwogICAgJExhbmctPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfO4/Dg7ej36PL8IP3q8e/u8PIg7+7o8eru7Cc7CiAgICAkTGFuZy0+eydTb3VyY2UgRmlsZSd9ICAgICAgICAgICAgICAgID0gJ8jx9e7k7fvpIPTg6esnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICfQ4Ofk5evo8uXr/Cc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ9Lg4fPr//bo/yAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ9Lu9+rgIPEg5+Dv//Lu6SAoOyknOwogICAgJExhbmctPnsnQ29sb24gKDopJ30gICAgICAgICAgICAgICAgICA9ICfE4u7l8u736OUgKDopJzsKICAgICRMYW5nLT57J0RvdCAoLiknfSAgICAgICAgICAgICAgICAgICAgPSAn0u736uAgKC4pJzsKICAgICRMYW5nLT57J0NoYXJzZXQnfSAgICAgICAgICAgICAgICAgICAgPSAnyu7k6PDu4urgJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICcnOwogICAgJExhbmctPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRMYW5nLT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJExhbmctPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnJzsKICAgICRMYW5nLT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JbXBvcnRFeHBvcnQucG0gLSB0aGUgQ2hpbmVzZSBzaW1wbGUgdHJhbnNsYXRpb24gb2YgSW1wb3J0RXhwb3J0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiB6aF9DTl9JbXBvcnRFeHBvcnQucG0sdiAxLjYgMjAxMC8wOS8xNCAyMTo0OToxNCBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQnfSAgICAgICAgICAgICAgPSAntbzI6y+1vLP2JzsKICAgICRMYW5nLT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ICAgPSAntbzI6y+1vLP2udzA7Sc7CiAgICAkTGFuZy0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ICAgICAgID0gJ9T2vNPTs8nkxKOw5ic7CiAgICAkTGFuZy0+eydTdGFydCBJbXBvcnQnfSAgICAgICAgICAgICAgID0gJ7+qyry1vMjrJzsKICAgICRMYW5nLT57J1N0YXJ0IEV4cG9ydCd9ICAgICAgICAgICAgICAgPSAnv6rKvLW8s/YnOwogICAgJExhbmctPnsnU3RlcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICeyvdboJzsKICAgICRMYW5nLT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbmy08PQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbbUz/HQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gICAgPSAnseC8rbjxyr3Qxc+iJzsKICAgICRMYW5nLT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ICAgPSAnseC8rdOzyeTQxc+iJzsKICAgICRMYW5nLT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gICAgPSAnseC8rcvRy/fQxc+iJzsKICAgICRMYW5nLT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ICAgICAgICAgPSAntbzI69DFz6InOwogICAgJExhbmctPnsnQ29sdW1uJ30gICAgICAgICAgICAgICAgICAgICA9ICfB0Cc7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ8/e1sa1vLP2w7+49svR0bAnOwogICAgJExhbmctPnsnU291cmNlIEZpbGUnfSAgICAgICAgICAgICAgICA9ICfUtM7EvP4nOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvcid9ICAgICAgICAgICA9ICfB0LfWuPS3+yc7CiAgICAkTGFuZy0+eydUYWJ1bGF0b3IgKFRBQiknfSAgICAgICAgICAgID0gJ9bGse28/CAoVEFCKSc7CiAgICAkTGFuZy0+eydTZW1pY29sb24gKDspJ30gICAgICAgICAgICAgID0gJ7fWusUgKDspJzsKICAgICRMYW5nLT57J0NvbG9uICg6KSd9ICAgICAgICAgICAgICAgICAgPSAnw7C6xSAoOiknOwogICAgJExhbmctPnsnRG90ICguKSd9ICAgICAgICAgICAgICAgICAgICA9ICe+5LrFICguKSc7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ9fWt/u8ryc7CiMgYWRkIGJ5IE5ldmVyCiAgICAkTGFuZy0+eydUZW1wbGF0ZSd9ICAgICAgICAgICAgICAgICAgID0gJ8SjsOYnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkTGFuZy0+eydDbGFzcyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJExhbmctPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkTGFuZy0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICcnOwogICAgJExhbmctPnsnQ3JlYXRlIGEgdGVtcGxhdGUgaW4gb3JkZXIgdG8gY2FuIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4yNiAyMDEwLzEwLzIwIDE5OjI2OjA0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoY29tbW9uKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDEnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAkU2F2ZUNvbnRpbnVlOwogICAgICAgICRTYXZlQ29udGludWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU2F2ZUNvbnRpbnVlICkgewoKICAgICAgICAgICAgIyBpZiBuZWVkZWQgbmV3IGZvcm0KICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSggTmV3ID0+IDEsICVQYXJhbSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIHRoZXJlIGlzIHRlbXBsYXRlIGlkCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgZWRpdAogICAgICAgICAgICBpZiAoICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQxKCAlUGFyYW0sICV7JFRlbXBsYXRlRGF0YX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgaWYgc2F2ZSAmIGNvbnRpbnVlCiAgICAgICAgbXkgJVNlcnZlckVycm9yOwoKICAgICAgICAjIGdldCBhbGwgZGF0YSBmb3IgcGFyYW1zIGFuZCBjaGVjayBmb3IgZXJyb3JzCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ29tbWVudCBPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBUZW1wbGF0ZUlEKSkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGlzIGEgbmV3IHRlbXBsYXRlPwogICAgICAgIG15ICROZXc7CiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkTmV3ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGZpZWxkcwogICAgICAgICMgZm9yIG5ldyB0ZW1wbGF0ZXMKICAgICAgICBpZiAoJE5ldykgewoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7T2JqZWN0fSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9ye0Zvcm1hdH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBmb3IgYWxsIHRlbXBsYXRlcwogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntOYW1lfSApIHsKICAgICAgICAgICAgJFNlcnZlckVycm9ye05hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgc29tZSBlcnJvcgogICAgICAgIGlmICggJFNlcnZlckVycm9ye0Zvcm1hdH0gfHwgJFNlcnZlckVycm9ye09iamVjdH0gfHwgJFNlcnZlckVycm9ye05hbWV9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSgKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yID0+IFwlU2VydmVyRXJyb3IsCiAgICAgICAgICAgICAgICBOZXcgICAgICAgICA9PiAkTmV3LAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwoKICAgICAgICBpZiAoJE5ldykgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJDYW4ndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG9iamVjdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQyJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTmVlZGVkIFRlbXBsYXRlSUQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkU3VibWl0TmV4dCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdE5leHQnICk7CgogICAgICAgIGlmICggISRTdWJtaXROZXh0ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MiggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRlbXBsYXRlIHN0YXJ0cyBoZXJlCgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CgogICAgICAgIG15ICRFcnJvciA9IDA7CiAgICAgICAgbXkgJVNlcnZlckVycm9yOwogICAgICAgIG15ICVEYXRhVHlwZUVycm9yOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkIGFuZCBpcyBub3QgdGhlcmUKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ICkgewoKICAgICAgICAgICAgICAgICMgbG9vayBmb3IgcmVnZXhwIGZvciBkYXRhIHR5cGUgYWxsb3dlZAogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRJdGVtLT57SW5wdXR9LT57UmVnZXh9CiAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAhJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPX4gJEl0ZW0tPntJbnB1dH0tPntSZWdleH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICREYXRhVHlwZUVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICRFcnJvciA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIHJlbG9hZCB3aXRoIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQyKAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgICAgICA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgRGF0YVR5cGVFcnJvciAgICA9PiBcJURhdGFUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZURhdGFGb3JtID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBPYmplY3REYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDM7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChmb3JtYXQpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MycgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWRlZCBUZW1wbGF0ZUlEIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Ym1pdE5leHQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU3VibWl0TmV4dCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDMoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBzdGFydGluZyBoZXJlCgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJEZvcm1hdEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICAgICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRFcnJvciA9IDA7CiAgICAgICAgbXkgJVNlcnZlckVycm9yOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbG9hZCB3aXRoIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQzKAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0NDtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAobWFwcGluZykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ0JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBoZWFkZXJzIGZvciBvYmplY3QgYW5kIGFkZCBjb21tb24gaGVhZGVycwogICAgICAgIG15IEBIZWFkZXJzOwoKICAgICAgICBmb3IgbXkgJEhlYWRlciAoIEB7JE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzfSApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGVycywgJEhlYWRlci0+e05hbWV9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRDb21tb25IZWFkZXIgKCAnQ29sdW1uJywgJ1VwJywgJ0Rvd24nLCAnRGVsZXRlJyApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGVycywgJENvbW1vbkhlYWRlcjsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSGVhZGVyIChASGVhZGVycykgewoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NFRhYmxlSGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEhlYWRlciA9PiAkSGVhZGVyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdG8gdXNlIGluIGNvbHNwYW4gZm9yICdubyBkYXRhIGZvdW5kJyBtZXNzYWdlCiAgICAgICAgbXkgJEhlYWRlckNvdW50ZXIgPSBASGVhZGVyczsKCiAgICAgICAgbXkgJEVtcHR5TWFwICAgICAgICAgICAgPSAxOwogICAgICAgIG15ICRBdHJpYnV0dGVSb3dDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICRFbXB0eU1hcCA9IDA7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdPYmplY3Q6OicgLiAkQXRyaWJ1dHRlUm93Q291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgID0+ICRNYXBwaW5nT2JqZWN0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgICAgICAgICBJRCAgICAgPT4gJEl0ZW0tPntLZXl9IC4gJEF0cmlidXR0ZVJvd0NvdW50ZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NENvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgPT4gJ09iamVjdDo6JyAuICRBdHJpYnV0dGVSb3dDb3VudGVyIC4gJzo6JyAuICRJdGVtLT57S2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRBdHJpYnV0dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJEF0cmlidXR0ZVJvd0NvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTWFwcGluZ0Zvcm1hdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NE1hcE51bWJlckNvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJEF0cmlidXR0ZVJvd0NvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGlkZSB0aGUgdXAgYnV0dG9uIGZvciBmaXJzdCBlbGVtZW50IGFuZCBkb3duIGJ1dHRvbiBmb3IgdGhlIGxhc3QgZWxlbWVudAogICAgICAgICAgICBteSAkVXBCbG9jazsKICAgICAgICAgICAgbXkgJERvd25CbG9jazsKICAgICAgICAgICAgbXkgJE51bWJlck9mRWxlbWVudHMgPSBAeyRNYXBwaW5nTGlzdH07CgogICAgICAgICAgICBpZiAoICRBdHJpYnV0dGVSb3dDb3VudGVyID09IDAgKSB7CiAgICAgICAgICAgICAgICAkVXBCbG9jayA9ICdUZW1wbGF0ZUVkaXQ0Tm9VcEJ1dHRvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVXBCbG9jayA9ICdUZW1wbGF0ZUVkaXQ0VXBCdXR0b24nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgZWxlbWVudAogICAgICAgICAgICBpZiAoICRBdHJpYnV0dGVSb3dDb3VudGVyID09ICggJE51bWJlck9mRWxlbWVudHMgLSAxICkgKSB7CiAgICAgICAgICAgICAgICAkRG93bkJsb2NrID0gJ1RlbXBsYXRlRWRpdDROb0Rvd25CdXR0b24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERvd25CbG9jayA9ICdUZW1wbGF0ZUVkaXQ0RG93bkJ1dHRvbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXAgYnV0dG9uIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRVcEJsb2NrLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lEIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvd24gYnV0dG9uIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICREb3duQmxvY2ssCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRBdHJpYnV0dGVSb3dDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbiBlbXB0eSBsaXN0CiAgICAgICAgaWYgKCRFbXB0eU1hcCkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NE5vTWFwRm91bmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyA9PiAkSGVhZGVyQ291bnRlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlNCcgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBNYXBwaW5nQWRkID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiAgICA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICBteSAkU3VibWl0QnV0dG9uID0gJyc7CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gICAgPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICAkU3VibWl0QnV0dG9uID0gJFN1Ym1pdEtleTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJE9iamVjdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU9iamVjdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtYXQgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkRm9ybWF0QXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdGb3JtYXQ6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+IFwlRm9ybWF0QXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIE1BUFBJTkdJRDoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoaXMgbWFwcGluZyByb3cKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRGVsZXRlOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgdXAKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nVXA6OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdVcCgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IGRvd24KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRG93bjo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Rvd24oCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhIG5ldyBtYXBwaW5nIHJvdwogICAgICAgIGlmICggJFN1Ym1pdEJ1dHRvbiBlcSAnTWFwcGluZ0FkZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDUnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGRhdGEKICAgICAgICBteSAkU2VhcmNoRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlc2NyaWN0IGV4cG9ydCBzdHJpbmcKICAgICAgICBteSAkUmVzdHJpY3RFeHBvcnRTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1Jlc3RyaWN0RXhwb3J0JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWx1ZSA9PiBzY2FsYXIga2V5cyAleyRTZWFyY2hEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFJlc3RyaWN0RXhwb3J0U3RyZyA9PiAkUmVzdHJpY3RFeHBvcnRTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlYXJjaERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1RWxlbWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgPT4gJEl0ZW0tPntLZXl9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICgga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICBsYXN0IFBBUkFNOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCByZXN0cmljdGlvbnMKICAgICAgICBpZiAoICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXN0cmljdEV4cG9ydCcgKSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj0kU3ViYWN0aW9uJlRlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBteSAkU2VhcmNoQXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBzZWFyY2ggZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249JFN1YmFjdGlvbiZUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVEZWxldGUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBkZWxldGUgdGVtcGxhdGUgZnJvbSBkYXRhYmFzZQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQgaW5mb3JtYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnRJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0SW5mb3JtYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNvdXJjZSBmaWxlCiAgICAgICAgbXkgJVNvdXJjZUZpbGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgJFNvdXJjZUZpbGV7Q29udGVudH0gfHw9ICcnOwoKICAgICAgICAjIGltcG9ydCBkYXRhCiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+SW1wb3J0KAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcJFNvdXJjZUZpbGV7Q29udGVudH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZUZW1wbGF0ZUlEPSRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBleHBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICBteSAkRW1wdHlEYXRhYmFzZSA9IDE7CgogICAgICAgIENMQVNTOgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7ICRPYmplY3RMaXN0LT57JGF9IGNtcCAkT2JqZWN0TGlzdC0+eyRifSB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0FSUkFZJyB8fCAhQHskVGVtcGxhdGVMaXN0fSApIHsKICAgICAgICAgICAgICAgIG5leHQgQ0xBU1M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbXB0eURhdGFiYXNlID0gMDsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCAgICAgID0+ICRWYWxpZExpc3R7ICRUZW1wbGF0ZURhdGEtPntWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbiBlbXB0eSBsaXN0CiAgICAgICAgaWYgKCRFbXB0eURhdGFiYXNlKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAnVGVtcGxhdGUgTGlzdCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2tUZW1wbGF0ZUVkaXQxIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNlcnZlckVycm9yOwogICAgaWYgKCAkUGFyYW17U2VydmVyRXJyb3J9ICkgewogICAgICAgICVTZXJ2ZXJFcnJvciA9ICV7ICRQYXJhbXtTZXJ2ZXJFcnJvcn0gfTsKICAgIH0KCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICApOwoKICAgIG15ICRDbGFzcyA9ICcgVmFsaWRhdGVfUmVxdWlyZWQgJzsKCiAgICBpZiAoICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAkQ2xhc3MgLj0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICBOYW1lQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRPYmplY3RGb3JtYXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRQYXJhbXtGb3JtYXR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17TmV3fSApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ2xhc3MgPSAnIFZhbGlkYXRlX1JlcXVpcmVkICc7CgogICAgICAgIGlmICggJFNlcnZlckVycm9ye09iamVjdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtPYmplY3R9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgKTsKCiAgICAgICAgJENsYXNzID0gJyBWYWxpZGF0ZV9SZXF1aXJlZCAnOwogICAgICAgIGlmICggJFNlcnZlckVycm9ye0Zvcm1hdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtGb3JtYXR9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTmV3T2JqZWN0Rm9ybWF0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb24gPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb24gPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJURhdGFUeXBlRXJyb3I7CiAgICBpZiAoICRQYXJhbXtEYXRhVHlwZUVycm9yfSApIHsKICAgICAgICAlRGF0YVR5cGVFcnJvciA9ICV7ICRQYXJhbXtEYXRhVHlwZUVycm9yfSB9OwogICAgfQoKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUGFyYW17VGVtcGxhdGVJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWRlZCBUZW1wbGF0ZUlEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YTsKICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtCYWNrVVJMfSA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAjIG91dHB1dCBsaXN0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgIERhdGEgPT4gJFRlbXBsYXRlRGF0YSwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgamF2YXNjcmlwdCB2YWxpZGF0aW9uIGNsYXNzIHBlciBkYXRhdHlwZQogICAgbXkgJUpTQ2xhc3M7CiAgICBteSAlUHJlZGVmaW5lZEVycm9yTWVzc2FnZXM7CgogICAgJEpTQ2xhc3N7TnVtYmVyfSAgICAgICAgICAgICAgICA9ICdWYWxpZGF0ZV9OdW1iZXInOwogICAgJEpTQ2xhc3N7TnVtYmVyQmlnZ2VyVGhhblplcm99ICA9ICdWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyc7CiAgICAkSlNDbGFzc3tJbnRlZ2VyfSAgICAgICAgICAgICAgID0gJ1ZhbGlkYXRlX051bWJlckludGVnZXInOwogICAgJEpTQ2xhc3N7SW50ZWdlckJpZ2dlclRoYW5aZXJvfSA9ICdWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyQmlnZ2VyVGhhblplcm8nOwoKICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3tOdW1iZXJ9ICAgICAgICAgICAgICAgID0gJ251bWJlcic7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7TnVtYmVyQmlnZ2VyVGhhblplcm99ICA9ICdudW1iZXIgYmlnZ2VyIHRoYW4gemVybyc7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7SW50ZWdlcn0gICAgICAgICAgICAgICA9ICdpbnRlZ2VyJzsKICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3tJbnRlZ2VyQmlnZ2VyVGhhblplcm99ID0gJ2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyc7CgogICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICBteSAkQ2xhc3MgPSAnICc7CiAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICBteSAkRGF0YVR5cGVFcnJvcjsKICAgICAgICBteSAkRXJyb3JNZXNzYWdlOwoKICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAkQ2xhc3MgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICdFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICIgJEpTQ2xhc3N7ICRJdGVtLT57SW5wdXR9LT57RGF0YVR5cGV9IH0iOwogICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gJ0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICc7CiAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgLj0gIiRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3skSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfX0iOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGZvcm0gb3IgZnJvbSBkYXRhYmFzZQogICAgICAgICMgU2VydmVyRXJyb3IgPSBzaG93IHRoZSB3cm9uZyBkYXRhIGluIGZvcm0KICAgICAgICAjICFTZXJ2ZXJFcnJvciA9IHNob3cgZGF0YWJhc2UgZGF0YSBvciBuZXcgZmllbGRzCgogICAgICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSB8fCAkUGFyYW17RGF0YVR5cGVFcnJvcn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtUZW1wbGF0ZURhdGFGb3JtfS0+eyAkSXRlbS0+e0tleX0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgIyBlcnJvciBhcmVhCgogICAgICAgICMgcHJlcGFyZSBkaWZmZXJlbnQgZGF0YSAmIG1lc3NhZ2UgcGVyIGVycm9yCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSB8fCAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGlkCiAgICAgICAgbXkgJElEOwogICAgICAgIGlmICggJEl0ZW0tPntQcmVmaXh9ICkgewogICAgICAgICAgICAkSUQgPSAiJEl0ZW0tPntQcmVmaXh9JEl0ZW0tPntLZXl9IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRJRCA9ICRJdGVtLT57S2V5fTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgSW5wdXRTdHJnICAgID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIElEICAgICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEVycm9yTWVzc2FnZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0OwoKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRQYXJhbXtUZW1wbGF0ZUlEfTsKICAgIH0KCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17QmFja1VSTH0gPSAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIjsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBvdXRwdXQgbGlzdAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZURhdGEsCiAgICApOwoKICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRm9ybWF0RGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ0Zvcm1hdCBub3QgZm91bmQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG91dHB1dCBmb3JtYXQgYXR0cmlidXRlcwogICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICMgYnVpbGQgaWQKICAgICAgICBteSAkSUQ7CiAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJRCA9ICIkSXRlbS0+e1ByZWZpeH0kSXRlbS0+e0tleX0iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJElEID0gIiRJdGVtLT57S2V5fSI7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2xhc3MgPSAnICc7CiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJENsYXNzID0gJ1ZhbGlkYXRlX1JlcXVpcmVkICc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbHVlID0+ICRGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgcmVxdWlyZWQgbm90aWNlCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0OwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gucG0sdiAxLjYgMjAxMC8wOS8xNCAyMDo1ODoyMCBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMgaW4gaW1wb3J0L2V4cG9ydC4KCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgbXkgJENoZWNrZWQgPSAkUGFyYW17VmFsdWV9ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnOwoKICAgIHJldHVybgogICAgICAgIHFxezxpbnB1dCBpZD0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiB0eXBlPSJjaGVja2JveCIgbmFtZT0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiAkQ2hlY2tlZCAvPn07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAxMC8wOS8xNCAyMDo1ODoyMCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dERUTC5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjQyOjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIGRpc3BsYXkgRFRMIGNvZGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0RFRMLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMDUvMTggMDk6NDI6NTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi5wbSx2IDEuOSAyMDEwLzA5LzE0IDIwOjU4OjIwIGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHNlbGVjdGlvbiBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24tPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKICAgICRQYXJhbXtWYWx1ZX0gIHx8PSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiAkUGFyYW17VmFsdWV9ID1+IG17ICMjIyMjIH14bXMgKSB7CiAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9IFxAVmFsdWVzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3B0aW9uIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgSUQgICAgICAgICAgID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntQb3NzaWJsZU5vbmV9LAogICAgICAgIE11bHRpcGxlICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNdWx0aXBsZX0sCiAgICAgICAgU2l6ZSAgICAgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBARm9ybURhdGFzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgbXkgJEZvcm1EYXRhID0gam9pbiAnIyMjIyMnLCBARm9ybURhdGFzOwoKICAgIHJldHVybiAkRm9ybURhdGEgaWYgJEZvcm1EYXRhOwogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAhJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9OwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAxMC8wOS8xNCAyMDo1ODoyMCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtLHYgMS4xMSAyMDEwLzEwLzIwIDE5OjI2OjA1IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHRleHQgZWxlbWVudHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIG15ICRTaXplID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNDA7CiAgICBteSAkU2l6ZUNsYXNzOwogICAgaWYgKCAkU2l6ZSA8IDE1ICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzEwcGMnOwogICAgfQogICAgZWxzaWYgKCAkU2l6ZSA8IDM1ICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzMzcGMnOwogICAgfQogICAgZWxzaWYgKCAkU2l6ZSA8IDUwICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzUwcGMnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXNzVwYyc7CiAgICB9CgogICAgIyBwcmVwYXJlIGRhdGEKICAgIG15ICRJRCA9ICggJFBhcmFte1ByZWZpeH0gfHwgJycgKSAuICggJFBhcmFte0l0ZW19LT57S2V5fSApOwogICAgbXkgJE5hbWUgPSAoICRQYXJhbXtQcmVmaXh9IHx8ICcnICkgLiAoICRQYXJhbXtOYW1lfSB8fCAkSUQgKTsKICAgIG15ICRDbGFzcyA9ICggJFNpemVDbGFzcyB8fCAnJyApIC4gKCAkUGFyYW17Q2xhc3N9IHx8ICcnICk7CgogICAgbXkgJFN0cmluZwogICAgICAgID0gIjxpbnB1dCBpZD1cIiRJRFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIiROYW1lXCIgY2xhc3M9XCIkQ2xhc3NcIiAiOwoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU3RyaW5nIC49ICJ2YWx1ZT1cIiRWYWx1ZVwiICI7CiAgICB9CgogICAgIyBhZGQgbWF4aW11bSBsZW5ndGgKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofSApIHsKICAgICAgICAkU3RyaW5nIC49ICJtYXhsZW5ndGg9XCIkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9XCIgIjsKICAgIH0KCiAgICAkU3RyaW5nIC49ICIvPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgICMgcmVnZXggY2hlY2sKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnZXh9ICYmICRGb3JtRGF0YSAhfiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gKSB7CgogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwogICAgICAgIHJldHVybiAkRm9ybURhdGE7CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTEgJCAkRGF0ZTogMjAxMC8xMC8yMCAxOToyNjowNSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dEltcG9ydEV4cG9ydC5wbSx2IDEuNiAyMDEwLzAyLzI0IDEyOjU3OjM5IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1pdGVtIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgpCgpyZXR1cm5zIGEgaW5wdXQgZmllbGQgaHRtbCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+ICdWYWx1ZScsICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaHRtbCBmb3JtIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aXRlbSBfSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgogICAgbXkgJEJhY2tlbmQgPSAkTGF5b3V0T2JqZWN0LT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICk7CgpBbiBpbnN0YW5jZSBvZiB0aGUgbG9hZGVkIGJhY2tlbmQgbW9kdWxlIGlzIHJldHVybmVkLgoKPWN1dAoKc3ViIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsK
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LmR0bCx2IDEuMjUgMjAxMC8xMi8wOSAyMjozMzo1NCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+Cgo8IS0tIGR0bDpibG9jazpBY3Rpb25MaXN0IC0tPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkFjdGlvbnMifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3IC0tPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPiRUZXh0eyJHbyB0byBvdmVydmlldyJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlldyAtLT4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uQWRkIC0tPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyI+PHNwYW4+JFRleHR7IkFkZCB0ZW1wbGF0ZSJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpBY3Rpb25BZGQgLS0+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uTGlzdCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJOb3RlIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uIn0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IiREYXRheyJPYmplY3ROYW1lIn0ifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiTnVtYmVyIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJOYW1lIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJGb3JtYXQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IkRlbGV0ZSJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiU3RhcnQgSW1wb3J0In08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJTdGFydCBFeHBvcnQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOk5vRGF0YUZvdW5kTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5vIGRhdGEgZm91bmQuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk5vRGF0YUZvdW5kTXNnIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MTtUZW1wbGF0ZUlEPSRMUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTnVtYmVyIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiJERhdGF7IkZvcm1hdE5hbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiJERhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlRyYXNoQ2FuIiB0aXRsZT0iRGVsZXRlIFRlbXBsYXRlIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1UZW1wbGF0ZURlbGV0ZTtUZW1wbGF0ZUlEPSRMUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJEZWxldGUgVGVtcGxhdGUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249SW1wb3J0SW5mb3JtYXRpb247VGVtcGxhdGVJRD0kTFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSW1wb3J0In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPUV4cG9ydDtUZW1wbGF0ZUlEPSRMUURhdGF7IlRlbXBsYXRlSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFeHBvcnQifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KCjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDEgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IlN0ZXAifSAxICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBjb21tb24gaW5mb3JtYXRpb24ifTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZUVkaXQxIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOYW1lIj4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCjwhLS0gVmFsaWRhdGVfUmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Ik5hbWUiIGNsYXNzPSIkRGF0YXsiTmFtZUNsYXNzIn0iIHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7Ik5hbWUgaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJOYW1lIGlzIHJlcXVpcmVkISJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6TmV3T2JqZWN0Rm9ybWF0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPYmplY3QiPiRUZXh0eyJPYmplY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik9iamVjdE9wdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPYmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJPYmplY3QgaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik9iamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7Ik9iamVjdCBpcyByZXF1aXJlZCEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZvcm1hdCI+JFRleHR7IkZvcm1hdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiRm9ybWF0T3B0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZvcm1hdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IkZvcm1hdCBpcyByZXF1aXJlZCEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRm9ybWF0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiRm9ybWF0IGlzIHJlcXVpcmVkISJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6TmV3T2JqZWN0Rm9ybWF0IC0tPgo8IS0tIGR0bDpibG9jazpFZGl0T2JqZWN0Rm9ybWF0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik9iamVjdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRRRGF0YXsiT2JqZWN0TmFtZSJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iT2JqZWN0IiB2YWx1ZT0iJFFEYXRheyJPYmplY3QifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiRm9ybWF0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JFFEYXRheyJGb3JtYXROYW1lIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtYXQiIHZhbHVlPSIkUURhdGF7IkZvcm1hdCJ9IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RWRpdE9iamVjdEZvcm1hdCAtLT4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiPiRUZXh0eyJWYWxpZCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJWYWxpZE9wdGlvblN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+JFRleHR7IkNvbW1lbnQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNvbW1lbnQiIHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSJTdWJtaXROZXh0Ij4kVGV4dHsiTmV4dCJ9PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsib3IifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249J092ZXJ2aWV3JyI+JFRleHR7IkNhbmNlbCJ9IDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDEgLS0+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTdGVwIn0gMiAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgb2JqZWN0IGluZm9ybWF0aW9uIn06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MiIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik9iamVjdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiT2JqZWN0In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDJFbGVtZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkRGF0YXsiSUQifSI+JFRleHR7IiREYXRheyJOYW1lIn0ifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IklucHV0U3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSIkRGF0YXsiSUQifUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IiREYXRheyJFcnJvck1lc3NhZ2UifSEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJERhdGF7IklEIn1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyIkRGF0YXsiRXJyb3JNZXNzYWdlIn0hIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDJFbGVtZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkJhY2siIHR5cGU9ImJ1dHRvbiIgbmFtZT0iQmFjayIgPiRUZXh0eyJCYWNrIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiID4kVGV4dHsiTmV4dCJ9PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MyAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiU3RlcCJ9IDMgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbiJ9OjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDMiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJGb3JtYXQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZvcm1hdCJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzRWxlbWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJERhdGF7IklEIn0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbnB1dFN0cmcifQo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzRWxlbWVudFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJERhdGF7IklEIn1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyIkRGF0YXsiTmFtZSJ9IGlzIHJlcXVpcmVkISJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSIkRGF0YXsiSUQifVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IiREYXRheyJOYW1lIn0gaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M0VsZW1lbnRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNFbGVtZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkJhY2siIHR5cGU9ImJ1dHRvbiIgbmFtZT0iQmFjayIgPiRUZXh0eyJCYWNrIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiPiRUZXh0eyJOZXh0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDMgLS0+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTdGVwIn0gNCAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbiJ9OjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1hcEhlYWRlclJvdyBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJPYmplY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik9iamVjdE5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJGb3JtYXQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZvcm1hdE5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNCIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFRhYmxlSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiJERhdGF7IkhlYWRlciJ9In08L3RoPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0VGFibGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDROb01hcEZvdW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkRGF0YXsiQ29sdW1ucyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5vIG1hcCBlbGVtZW50cyBmb3VuZC4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Tm9NYXBGb3VuZCAtLT4KCjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRDb2x1bW4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Q29sdW1uIC0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0TWFwTnVtYmVyQ29sdW1uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IklucHV0U3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NE1hcE51bWJlckNvbHVtbi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFVwQnV0dG9uLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93VXAidHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nVXA6OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiVXAifSI+ICRUZXh0eyJVcCJ9IDwvYnV0dG9uPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0VXBCdXR0b24tLT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NE5vVXBCdXR0b24tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dVcCIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiAkVGV4dHsiVXAifTwvYnV0dG9uPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Tm9VcEJ1dHRvbi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0RG93bkJ1dHRvbi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd0Rvd24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0Rvd246OiRRRGF0YXsiTWFwcGluZ0lEIn0iIHZhbHVlPSIkVGV4dHsiRG93biJ9Ij4gJFRleHR7IkRvd24ifTwvYnV0dG9uPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0RG93bkJ1dHRvbi0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Tm9Eb3duQnV0dG9uLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93RG93biIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiAkVGV4dHsiRG93biJ9PC9idXR0b24+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDROb0Rvd25CdXR0b24tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iVHJhc2hDYW4iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0RlbGV0ZTo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+ICRUZXh0eyJEZWxldGUifSA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlcxMDBwYyBTcGFjaW5nVG9wU21hbGwgUmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiIGlkPSJNYXBwaW5nQWRkIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdBZGQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPjxzcGFuPiAkVGV4dHsiQWRkIE1hcHBpbmcgRWxlbWVudCJ9PC9zcGFuPiA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iU3VibWl0QmFjayI+JFRleHR7IkJhY2sifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSJTdWJtaXROZXh0Ij4kVGV4dHsiTmV4dCJ9PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0IC0tPgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiU3RlcCJ9IDUgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbiJ9OjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTUiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJUZW1wbGF0ZSBOYW1lIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc3RyaWN0RXhwb3J0Ij4kVGV4dHsiUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJSZXN0cmljdEV4cG9ydFN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NUVsZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiREYXRheyJJRCJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDVFbGVtZW50IC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPiRUZXh0eyJCYWNrIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiPiRUZXh0eyJGaW5pc2gifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KCjwhLS0gZHRsOmJsb2NrOkltcG9ydEluZm9ybWF0aW9uIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJJbXBvcnQgaW5mb3JtYXRpb24ifTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJbXBvcnQiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj4kVGV4dHsiU291cmNlIEZpbGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iU291cmNlRmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN0YXJ0IEltcG9ydCJ9Ij4kVGV4dHsiU3RhcnQgSW1wb3J0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkltcG9ydEluZm9ybWF0aW9uIC0tPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICAgICAkKCdidXR0b24uQmFjaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gIiRFbnZ7IkJhc2VsaW5rIn0kUURhdGF7IkJhY2tVUkwifSI7CiAgICAgICAgfSk7CiAgICAvL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRNZXRob2QoIlZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvIiwgZnVuY3Rpb24oVmFsdWUsIEVsZW1lbnQpIHsKICAgICAgICB2YXIgTnVtYmVyID0gcGFyc2VJbnQoVmFsdWUsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoTnVtYmVyID4gMCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIH0pOwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRNZXRob2QoIlZhbGlkYXRlX051bWJlckludGVnZXIiLCBmdW5jdGlvbihWYWx1ZSwgRWxlbWVudCkgewogICAgICAgIHJldHVybiAoVmFsdWUubWF0Y2goL15bMC05XSskLykpID8gdHJ1ZSA6IGZhbHNlOwoKICAgIH0pOwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyIsIHsgVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm86IHRydWUgfSk7CiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVySW50ZWdlciIsIHsgVmFsaWRhdGVfTnVtYmVySW50ZWdlcjogdHJ1ZSB9KTsKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyQmlnZ2VyVGhhblplcm8iLCB7IFZhbGlkYXRlX051bWJlckludGVnZXI6IHRydWUsIFZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvOiB0cnVlIH0pOwoKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgoKPC9kaXY+Cgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnBtLHYgMS40MCAyMDEwLzA5LzA4IDE4OjUxOjEwIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDAgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQgLSBpbXBvcnQsIGV4cG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRlbXBsYXRlTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHRlbXBsYXRlcyBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywgICMgKG9wdGlvbmFsKQogICAgICAgIEZvcm1hdCA9PiAnQ1NWJyAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgMT0xICc7CiAgICBteSBAQklORDsKCiAgICBpZiAoICRQYXJhbXtPYmplY3R9ICkgewogICAgICAgICRTUUwgLj0gJ0FORCBpbWV4cG9ydF9vYmplY3QgPSA/ICc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtPYmplY3R9OwogICAgfQogICAgaWYgKCAkUGFyYW17Rm9ybWF0fSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgaW1leHBvcnRfZm9ybWF0ID0gPyAnOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17Rm9ybWF0fTsKICAgIH0KCiAgICAjIGFkZCBvcmRlciBvcHRpb24KICAgICRTUUwgLj0gJ09SREVSIEJZIGlkJzsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBUZW1wbGF0ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFRlbXBsYXRlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBUZW1wbGF0ZUxpc3Q7Cn0KCj1pdGVtIFRlbXBsYXRlR2V0KCkKCmdldCBhIGltcG9ydCBleHBvcnQgdGVtcGxhdGUKClJldHVybgogICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfQogICAgJFRlbXBsYXRlRGF0YXtOdW1iZXJ9CiAgICAkVGVtcGxhdGVEYXRhe09iamVjdH0KICAgICRUZW1wbGF0ZURhdGF7Rm9ybWF0fQogICAgJFRlbXBsYXRlRGF0YXtOYW1lfQogICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfQogICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9CgogICAgbXkgJFRlbXBsYXRlRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9ICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9ICAgICA9ICRSb3dbMl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbM107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbNF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNV0gfHwgJyc7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbN107CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAgICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOV07CgogICAgICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfSA9IHNwcmludGYgIiUwNmQiLCAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9OwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0gPSBcJVRlbXBsYXRlRGF0YTsKCiAgICByZXR1cm4gXCVUZW1wbGF0ZURhdGE7Cn0KCj1pdGVtIFRlbXBsYXRlQWRkKCkKCmFkZCBhIG5ldyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdUaWNrZXQnLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IHRlbXBsYXRlLCBpZiB0ZW1wbGF0ZSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyB0ZW1wbGF0ZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAnCiAgICAgICAgICAgIC4gJyhpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte0Zvcm1hdH0sIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgdGVtcGxhdGUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUZW1wbGF0ZUlEOwp9Cgo9aXRlbSBUZW1wbGF0ZVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICA9PiAnQ29tbWVudCcsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBvYmplY3Qgb2YgdGhpcyB0ZW1wbGF0ZSBpZAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpbWV4cG9ydF9vYmplY3QgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE9iamVjdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9iamVjdCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAhJE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSB0ZW1wbGF0ZSBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJE9iamVjdCwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFVwZGF0ZSA9IDE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFBhcmFte1RlbXBsYXRlSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIHVwZGF0ZSB0ZW1wbGF0ZQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF90ZW1wbGF0ZSBTRVQgbmFtZSA9ID8sJwogICAgICAgICAgICAuICd2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aXRlbSBUZW1wbGF0ZURlbGV0ZSgpCgpkZWxldGUgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZXMKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgbWFwcGluZyBkYXRhCiAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfSApIHsKICAgICAgICAkU2VsZi0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gT2JqZWN0TGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBvYmplY3RzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7Cgo9Y3V0CgpzdWIgT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBvYmplY3QgbGlzdAogICAgbXkgJE9iamVjdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRPYmplY3RMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRPYmplY3RMaXN0Owp9Cgo9aXRlbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE9iamVjdERhdGFHZXQoKQoKZ2V0IHRoZSBvYmplY3QgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU9iamVjdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPYmplY3REYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU9iamVjdERhdGE7Cn0KCj1pdGVtIE9iamVjdERhdGFTYXZlKCkKCnNhdmUgdGhlIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIE9iamVjdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE9iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17T2JqZWN0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17T2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICcKICAgICAgICAgICAgICAgIC4gJyg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIEZvcm1hdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKPWN1dAoKc3ViIEZvcm1hdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgZm9ybWF0IGxpc3QKICAgIG15ICRGb3JtYXRMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkRm9ybWF0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkRm9ybWF0TGlzdDsKfQoKPWl0ZW0gRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBmb3JtYXQKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEZvcm1hdERhdGFHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkRm9ybWF0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X2Zvcm1hdCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUZvcm1hdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRGb3JtYXREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1hdERhdGE7Cn0KCj1pdGVtIEZvcm1hdERhdGFTYXZlKCkKCnNhdmUgdGhlIGZvcm1hdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIEZvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIEZvcm1hdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17Rm9ybWF0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRm9ybWF0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17Rm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRm9ybWF0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIGZvcm1hdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgbWFwcGluZyBkYXRhIGlkcyBzb3J0ZWQgYnkgcG9zaXRpb24gYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJE1hcHBpbmdMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IE9SREVSIEJZIHBvc2l0aW9uJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBNYXBwaW5nTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWFwcGluZ0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxATWFwcGluZ0xpc3Q7Cn0KCj1pdGVtIE1hcHBpbmdBZGQoKQoKYWRkIGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZmluZCBtYXhpbXVtIHBvc2l0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG1heChwb3NpdGlvbikgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTmV3UG9zaXRpb24gPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbMF0gKSB7CiAgICAgICAgICAgICROZXdQb3NpdGlvbiA9ICRSb3dbMF07CiAgICAgICAgICAgICROZXdQb3NpdGlvbisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluc2VydCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmcgKHRlbXBsYXRlX2lkLCBwb3NpdGlvbikgVkFMVUVTICg/LCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkTmV3UG9zaXRpb24gXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTWFwcGluZ0lEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0lEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE1hcHBpbmdJRDsKfQoKPWl0ZW0gTWFwcGluZ0RlbGV0ZSgpCgpkZWxldGUgZXhpc3RpbmcgbWFwcGluZyBkYXRhIHJvd3MKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17TWFwcGluZ0lEfSApIHsKCiAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgb25lIG1hcHBpbmcgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICAgICApOwoKICAgICAgICAjIHJlYnVpbGQgbWFwcGluZyBwb3NpdGlvbnMKICAgICAgICAkU2VsZi0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYWxsIG1hcHBpbmcgcm93cyBvZiB0aGlzIHRlbXBsYXRlCiAgICAgICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIE1hcHBpbmdVcCgpCgptb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgdXAKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdVcCgKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdVcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bMF07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkUG9zaXRpb247CgogICAgbXkgJFBvc2l0aW9uVXBwZXIgPSAkUG9zaXRpb24gLSAxOwoKICAgICMgdXBkYXRlIHBvc2l0aW9ucwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25VcHBlciBdLAogICAgKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvblVwcGVyLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdEb3duKCkKCm1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyBkb3duCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEb3duIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TWFwcGluZ0lEfSA9PSAkTWFwcGluZ0xpc3QtPlstMV07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIG15ICRQb3NpdGlvbkRvd24gPSAkUG9zaXRpb24gKyAxOwoKICAgICMgdXBkYXRlIHBvc2l0aW9ucwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25Eb3duIF0sCiAgICApOwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uRG93biwgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkKCkKCnJlYnVpbGQgdGhlIHBvc2l0aW9ucyBvZiBhIG1hcHBpbmcgbGlzdAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgcG9zaXRpb24KICAgIG15ICRDb3VudGVyID0gMDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENvdW50ZXIsIFwkTWFwcGluZ0lEIF0sCiAgICAgICAgKTsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBvYmplY3QKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBkZWxldGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nT2JqZWN0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ09iamVjdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgb2JqZWN0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdERhdGFHZXQoKQoKZ2V0IHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nT2JqZWN0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdPYmplY3REYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdPYmplY3REYXRhOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBmb3JtYXQKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkTWFwcGluZ0lEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGRlbGV0ZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0IFdIRVJFIG1hcHBpbmdfaWQgSU4gKCAkTWFwcGluZ0lEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdERhdGFTYXZlKCkKCnNhdmUgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIE1hcHBpbmdGb3JtYXREYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nRm9ybWF0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgbWFwcGluZyBkYXRhCiAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgbWFwcGluZyBmb3JtYXQgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0ICcKICAgICAgICAgICAgICAgIC4gJyhtYXBwaW5nX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0IFdIRVJFIG1hcHBpbmdfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0Zvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ0Zvcm1hdERhdGE7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiBhIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gc2VhcmNoIGF0dHJpYnV0ZSBsaXN0IG9mIGFuIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIFNlYXJjaERhdGFHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkU2VhcmNoRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVNlYXJjaERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZWFyY2hEYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaERhdGE7Cn0KCj1pdGVtIFNlYXJjaERhdGFTYXZlKCkKCnNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFNlYXJjaERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFNlYXJjaERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoRGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIGtleXMgJXsgJFBhcmFte1NlYXJjaERhdGF9IH0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte1NlYXJjaERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgISREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9zZWFyY2ggJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU2VhcmNoRGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9zZWFyY2ggV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIEV4cG9ydCgpCgpleHBvcnQgZnVuY3Rpb24KCiAgICBteSAkUmVzdWx0UmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgpyZXR1cm5zIHNvbWV0aGluZyBsaWtlCgogICAgJFJlc3VsdFJlZiA9IHsKICAgICAgICBTdWNjZXNzICAgPT4gMiwKICAgICAgICBGYWlsZWQgICAgPT4gMCwKICAgICAgICBEZXN0aW5hdGlvbkNvbnRlbnQgPT4gWwogICAgICAgICAgICBbICdBdHRyXzFhJywgJ0F0dHJfMWInLCAnQXR0cl8xYycsIF0sCiAgICAgICAgICAgIFsgJ0F0dHJfMmEnLCAnQXR0cl8yYicsICdBdHRyXzNjJywgXSwKICAgICAgICBdLAogICAgfTsKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57T2JqZWN0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJE9iamVjdEJhY2tlbmQ7CgogICAgIyBsb2FkIGZvcm1hdCBiYWNrZW5kCiAgICBteSAkRm9ybWF0QmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVJlc3VsdCA9ICgKICAgICAgICBTdWNjZXNzICAgICAgICAgICAgPT4gMCwKICAgICAgICBGYWlsZWQgICAgICAgICAgICAgPT4gMCwKICAgICAgICBEZXN0aW5hdGlvbkNvbnRlbnQgPT4gW10sCiAgICApOwoKICAgIEVYUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEV4cG9ydERhdGFSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHBvcnQgb25lIHJvdwogICAgICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRFeHBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJERlc3RpbmF0aW9uQ29udGVudFJvdyApIHsKICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7RmFpbGVkfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IGZhaWxlZCEiLAogICAgKTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3NmdWwhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBJbXBvcnQoKQoKaW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgb2JqZWN0IGJhY2tlbmQKICAgIG15ICRPYmplY3RCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkRm9ybWF0QmFja2VuZDsKCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRQYXJhbXtTb3VyY2VDb250ZW50fSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbXBvcnREYXRhOwoKICAgICMgTnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbmQgbm90IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZCByb3dzCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIE9iamVjdCAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEZhaWxlZCAgPT4gMCwKICAgICAgICBSZXRDb2RlID0+IHt9LAogICAgICAgIENvdW50ZXIgPT4gMCwKICAgICk7CiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRSZXN1bHR7Q291bnRlcn0rKzsKCiAgICAgICAgIyBpbXBvcnQgYSBzaW5nbGUgcm93CiAgICAgICAgbXkgKCAkSUQsICRSZXRDb2RlICkgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRJbXBvcnREYXRhUm93LAogICAgICAgICAgICBDb3VudGVyICAgICAgID0+ICRSZXN1bHR7Q291bnRlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJElEICkgewogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvZyByZXN1bHQKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0e0NvdW50ZXJ9ICRSZXN1bHR7T2JqZWN0fSByZWNvcmRzOiAiCiAgICAgICAgICAgIC4gIiRSZXN1bHR7RmFpbGVkfSBmYWlsZWQsICRSZXN1bHR7U3VjY2Vzc30gc3VjY2VlZGVkIiwKICAgICk7CiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdHtSZXRDb2RlfSB9ICkgewogICAgICAgIG15ICRDb3VudCA9ICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdHtDb3VudGVyfSAkUmVzdWx0e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlIiwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUmVzdWx0e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGU6ICRSZXN1bHR7Q291bnRlcn0iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCcsCiAgICApOwoKQW4gaW5zdGFuY2Ugb2YgdGhlIGxvYWRlZCBiYWNrZW5kIG1vZHVsZSBpcyByZXR1cm5lZC4KCj1jdXQKCnN1YiBfTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtNb2R1bGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFBhcmFte01vZHVsZX0tPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQ+LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40MCAkICREYXRlOiAyMDEwLzA5LzA4IDE4OjUxOjEwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMjggMjAxMC8wNC8xMyAxMjoxODoyOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI4ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGFyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICAgICAgQ29tbWEgICAgID0+ICcsJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRGb3JtYXRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgICAgIE5hbWUgID0+ICdDb2x1bW4gU2VwYXJhdG9yJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiAnQ29sb24gKDopJywKICAgICAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiAnQ29tbWEgKCwpJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBtYXBwaW5nIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEltcG9ydERhdGFHZXQoKQoKZ2V0IGltcG9ydCBkYXRhIGFzIDJELWFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW10gaWYgIWRlZmluZWQgJFBhcmFte1NvdXJjZUNvbnRlbnR9OwoKICAgICMgY2hlY2sgc291cmNlIGNvbnRlbnQKICAgIGlmICggcmVmICRQYXJhbXtTb3VyY2VDb250ZW50fSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvdXJjZUNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgIyBjcmVhdGUgYW4gaW4gbWVtb3J5IHRlbXAgZmlsZSBhbmQgb3BlbiBpdAogICAgbXkgJEZpbGVDb250ZW50ID0gJyc7CiAgICBvcGVuIG15ICRGSCwgJys8JywgXCRGaWxlQ29udGVudDsKCiAgICAjIHdyaXRlIHNvdXJjZSBjb250ZW50CiAgICBwcmludCAkRkggJHsgJFBhcmFte1NvdXJjZUNvbnRlbnR9IH07CgogICAgIyByZXdpbmQgZmlsZSBoYW5kbGUKICAgIHNlZWsgJEZILCAwLCAwOwoKICAgICMgcGFyc2UgdGhlIGNvbnRlbnQKICAgIG15ICRMaW5lQ291bnQgPSAxOwogICAgbXkgQEltcG9ydERhdGE7CiAgICB3aGlsZSAoIG15ICRDb2x1bW4gPSAkUGFyc2VPYmplY3QtPmdldGxpbmUoJEZIKSApIHsKICAgICAgICBwdXNoIEBJbXBvcnREYXRhLCAkQ29sdW1uOwogICAgICAgICRMaW5lQ291bnQrKzsKICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBteSAoICRQYXJzZUVycm9yQ29kZSwgJFBhcnNlRXJyb3JTdHJpbmcgKSA9ICRQYXJzZU9iamVjdC0+ZXJyb3JfZGlhZygpOwogICAgaWYgKCRQYXJzZUVycm9yQ29kZSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RXJyb3IgYXQgbGluZSAkTGluZUNvdW50LCAiCiAgICAgICAgICAgICAgICAuICJFcnJvckNvZGU6ICRQYXJzZUVycm9yQ29kZSAnJFBhcnNlRXJyb3JTdHJpbmcnICIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNsb3NlIHRoZSBpbiBtZW1vcnkgZmlsZSBoYW5kbGUKICAgIGNsb3NlICRGSDsKCiAgICByZXR1cm4gXEBJbXBvcnREYXRhIGlmICRDaGFyc2V0IG5lICdVVEYtOCc7CgogICAgIyBzZXQgdXRmOCBmbGFnCiAgICBmb3IgbXkgJFJvdyAoQEltcG9ydERhdGEpIHsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRSb3d9ICkgewogICAgICAgICAgICBFbmNvZGU6Ol91dGY4X29uKCRDZWxsKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASW1wb3J0RGF0YTsKfQoKPWl0ZW0gRXhwb3J0RGF0YVNhdmUoKQoKZXhwb3J0IG9uZSByb3cgb2YgdGhlIGV4cG9ydCBkYXRhCgogICAgbXkgJERlc3RpbmF0aW9uQ29udGVudCA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRXhwb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZXhwb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17RXhwb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4cG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IHx8PSAnJzsKICAgIG15ICRTZXBhcmF0b3IgPSAkU2VsZi0+e0F2YWlsYWJsZVNlcGFyYXRvcnN9LT57ICRGb3JtYXREYXRhLT57Q29sdW1uU2VwYXJhdG9yfSB9IHx8ICcnOwoKICAgICMgY2hlY2sgdGhlIHNlcGFyYXRvcgogICAgaWYgKCAhJFNlcGFyYXRvciApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBzZXBhcmF0b3IgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgb2JqZWN0CiAgICBteSAkUGFyc2VPYmplY3QgPSBUZXh0OjpDU1YtPm5ldygKICAgICAgICB7CiAgICAgICAgICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICAgICAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAkU2VwYXJhdG9yLAogICAgICAgICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDEsCiAgICAgICAgICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICAgICAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgICAgICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgICAgICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICAgICB9CiAgICApOwoKICAgIGlmICggISRQYXJzZU9iamVjdC0+Y29tYmluZSggQHsgJFBhcmFte0V4cG9ydERhdGFSb3d9IH0gKSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjb21iaW5lIHRoZSBleHBvcnQgZGF0YSB0byBhIHN0cmluZyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBDU1Ygc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFBhcnNlT2JqZWN0LT5zdHJpbmc7CgogICAgcmV0dXJuICRTdHJpbmcgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIEVuY29kZTo6X3V0Zjhfb24oJFN0cmluZyk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI4ICQgJERhdGU6IDIwMTAvMDQvMTMgMTI6MTg6MjggJAoKPWN1dAo=
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW1wb3J0RXhwb3J0LnQsdiAxLjE1IDIwMDkvMDUvMTggMDk6NDI6NTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ltcG9ydEV4cG9ydCcgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSB0ZW1wbGF0ZSBuYW1lcwpteSBAVGVtcGxhdGVOYW1lOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiA1ICkgewoKICAgIHB1c2ggQFRlbXBsYXRlTmFtZSwgJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMDsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBvYmplY3QgbmFtZXMKbXkgQE9iamVjdE5hbWU7CnB1c2ggQE9iamVjdE5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGNyZWF0ZSBuZWVkZWQgZm9ybWF0IG5hbWVzCm15IEBGb3JtYXROYW1lID0gKCdDU1YnKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MUFsbCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFPYmplY3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gIiBcdCBcbiBcciAiIC4gJE9iamVjdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gIiBcdCBcbiBcciAiIC4gJEZvcm1hdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICJVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJyDGlSDGmCAnIC4gJE9iamVjdE5hbWVbMF0gLiAnIMa1IMa7ICcsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJyDHkyDHoyAnIC4gJEZvcm1hdE5hbWVbMF0gLiAnIMelIMeuICcsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDHtyDInCAnIC4gJFRlbXBsYXRlTmFtZVszXSAuICcgyJ4gyKAgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICfGlcaYJyAuICRPYmplY3ROYW1lWzBdIC4gJ8a1xrsnLAogICAgICAgICAgICBGb3JtYXQgICA9PiAnx5PHoycgLiAkRm9ybWF0TmFtZVswXSAuICfHpceuJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8e3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqknLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSBAQWRkZWRUZW1wbGF0ZUlEczsKClRFTVBMQVRFOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgYWRkIG5ldyB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgIHB1c2ggQEFkZGVkVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSAtIFRlbXBsYXRlS2V5OiAkVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSggJFRlbXBsYXRlSUQsICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkiICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGVtcGxhdGUgd2FzIGFkZGVkCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIHRlbXBsYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUdldC0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVHZXQoKSAtICRUZW1wbGF0ZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGV9ICkgewoKICAgICAgICAjIGNoZWNrIGxhc3QgdGVtcGxhdGUgaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkQWRkZWRUZW1wbGF0ZUlEc1stMV0gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIElURU0gSUQgR0lWRU4uIFBsZWFzZSBhZGQgYSB0ZW1wbGF0ZSBmaXJzdC4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGxhc3QgVEVNUExBVEU7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGVtcGxhdGUKICAgICAgICBteSAkVXBkYXRlU3VjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGVtcGxhdGUgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIC0gVGVtcGxhdGVLZXk6ICRBZGRlZFRlbXBsYXRlSURzWy0xXSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUdldCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICgga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewoKICAgICMgaW5jcmVtZW50IHRoZSBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAxIChjaGVjayBhcnJheSByZWZlcmVuY2VzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDFBbGwgZXEgJ0FSUkFZJyAmJiByZWYgJFRlbXBsYXRlTGlzdDFPYmplY3QgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAobGlzdCBtdXN0IGJlIGVtcHR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBsaXN0CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFPYmplY3R9IGVxIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGVtcHR5IGxpc3QiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVMaXN0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDIgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlIiwKKTsKCm15ICRUZW1wbGF0ZUxpc3RDb3VudCA9IHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QyfSAtIHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QxQWxsfTsKCiMgY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlTGlzdENvdW50IGVxIHNjYWxhciBAQWRkZWRUZW1wbGF0ZUlEcywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZURlbGV0ZSB0ZXN0IDEgKGFkZCBvbmUgdGVtcGxhdGUgYW5kIGRlbGV0ZSBpdCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBhZGQgYSB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzRdLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSBvbmUgbW9yZSBlbGVtZW50CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSAoIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0Mn0gKSAtIDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgojIGRlbGV0ZSB0aGUgbmV3IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZTEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEZWxldGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGJlIHN1Y2Nlc3NmdWxsCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlRGVsZXRlMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkiLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGVsZW1lbnRzCiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDN9LAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlRGVsZXRlIHRlc3QgMiAoZGVsZXRlIGFsbCB1bml0dGVzdCB0ZW1wbGF0ZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkVGVtcGxhdGVJRCAoQEFkZGVkVGVtcGxhdGVJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgdGVtcGxhdGUKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBzdWNjZXNzCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIFRlbXBsYXRlSUQgJFRlbXBsYXRlSUQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJE9iamVjdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdE9yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJE9iamVjdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIGtleXMgJXskT2JqZWN0TGlzdDF9ICkgewoKICAgIGlmICggISRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJE9iamVjdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRPYmplY3RMaXN0MS0+eyRLZXl9IG5lICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskT2JqZWN0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBvYmplY3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRGb3JtYXRMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3RPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgojIHNldCB0ZXN0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBrZXlzICV7JEZvcm1hdExpc3QxfSApIHsKCiAgICBpZiAoICEkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkRm9ybWF0TGlzdDEtPnskS2V5fSBuZSAkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JEZvcm1hdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgZm9ybWF0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKJFRlc3RDb3VudCsrOwoKMTsK
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydEZvcm1hdENTVi50LHYgMS4xMSAyMDEwLzA5LzA4IDE1OjMxOjA0IGR6IEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWOwoKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVi0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGhvbWUgZGlyZWN0b3J5CiRTZWxmLT57SG9tZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKIyBhZGQgc29tZSB0ZXN0IHRlbXBsYXRlcyBmb3IgbGF0ZXIgY2hlY2tzCm15IEBUZW1wbGF0ZUlEczsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGNoZWNrIGZvcm1hdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdExpc3QxICYmIHJlZiAkRm9ybWF0TGlzdDEgZXEgJ0hBU0gnICYmICRGb3JtYXRMaXN0MS0+e0NTVn0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBDU1YgZXhpc3RzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ29sdW1uU2VwYXJhdG9yJywKICAgICAgICBOYW1lICA9PiAnQ29sdW1uIFNlcGFyYXRvcicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgIFNlbWljb2xvbiA9PiAnU2VtaWNvbG9uICg7KScsCiAgICAgICAgICAgICAgICBDb2xvbiAgICAgPT4gJ0NvbG9uICg6KScsCiAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgQ29tbWEgICAgID0+ICdDb21tYSAoLCknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICBOYW1lICA9PiAnQ2hhcnNldCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJ1VURi04JywKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMjAsCiAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICB9LAogICAgfSwKXTsKCiMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAokRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKIyBkdW1wIHRoZSBsaXN0IGZyb20gRm9ybWF0QXR0cmlidXRlc0dldCgpCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDEpOwoKIyBkdW1wIHRoZSByZWZlcmVuY2UgdGFibGUKbXkgJEZvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSk7CgokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJEZvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBmYWxzZSByZXR1cm4iLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICA9PiAnRFRMJywKICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRRRGF0YXsiQ291bnRlciJ9JywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICB9LAogICAgfSwKXTsKCiMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAokRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKIyBkdW1wIHRoZSBsaXN0IGZyb20gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEpOwoKIyBkdW1wIHRoZSByZWZlcmVuY2UgdGFibGUKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlKTsKCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gYXR0cmlidXRlcyBvZiB0aGUgcm93IGFyZSBpZGVudGljYWwiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MiwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBmYWxzZSByZXR1cm4iLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEltcG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEltcG9ydERhdGFUZXN0cyA9IFsKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFHZXQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIHNvdXJjZSBjb250ZW50IGFyZSBnaXZlbiAoZW1wdHkgYXJyYXkgcmVmZXJlbmNlIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFtdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGV4aXN0aW5nIHRlbXBsYXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgYW5kIGNoYXJzZXQgYXJlIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gYnV0IHNvdXJjZSBjb250ZW50IGlzIGVtcHR5IChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1szXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IGlzIG9ubHkgYSBzdHJpbmcgd2l0aCBzcGFjZXMgKG9uZSBjZWxsIGFycmF5IHdpdGggdGhlIHNwYWNlcyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzRdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycgICd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsnICAnXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBUYWJ1bGF0b3IgaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsnUm93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMnXSwKICAgICAgICAgICAgWydSb3cyLUNvbDE7Um93Mi1Db2wyO1JvdzItQ29sMyddLAogICAgICAgICAgICBbJ1JvdzMtQ29sMTtSb3czLUNvbDI7Um93My1Db2wzJ10sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuLCBidXQgU2VtaWNvbG9uIGlzIHVzZWQgYXMgU2VwYXJhdG9yIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbIlJvdzEtQ29sMVx0Um93MS1Db2wyXHRSb3cxLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3cyLUNvbDFcdFJvdzItQ29sMlx0Um93Mi1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93My1Db2wxXHRSb3czLUNvbDJcdFJvdzMtQ29sMyJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICdUZXN0IDEgLSAyJywgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChJU08tODg1OSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMTBdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnyqkgyqwgyq4nLCAgICAgJyDKoSDLpCDOjCAnIF0sCiAgICAgICAgICAgIFsgJyAgzpcgz5cgz6AgICcsICfOhiDOmyDOnicgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA2LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDctT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnMFJvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwOC1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnMFJvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRJbXBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlSW1wb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlSW1wb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBJbXBvcnREYXRhR2V0CiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9ID0ge307CiAgICB9CgogICAgIyBzZXQgc291cmNlIGNvbnRlbnQKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX0KICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9IGVxICdTb3VyY2VGaWxlJwogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgJFNvdXJjZUZpbGUgPSAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57U291cmNlRmlsZX07CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgIG15ICRTb3VyY2VDb250ZW50ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRTZWxmLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvSW1wb3J0RXhwb3J0LycgLiAkU291cmNlRmlsZSwKICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ1NDQUxBUicsCiAgICAgICAgICAgIE1vZGUgICAgID0+ICdiaW5tb2RlJywKICAgICAgICApOwoKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fSA9ICRTb3VyY2VDb250ZW50OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkU2VsZi0+e0Zvcm1hdEJhY2tlbmRPYmplY3R9LT5JbXBvcnREYXRhR2V0KAogICAgICAgICV7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSB9LAogICAgKTsKCiAgICBpZiAoICEkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9ICkgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRJbXBvcnREYXRhLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggcmVmICRJbXBvcnREYXRhIG5lICdBUlJBWScgKSB7CgogICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSByZWZlcmVuY2UiLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIG51bWJlciBvZiByb3dzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JEltcG9ydERhdGF9LAogICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9IH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gc2FtZSBudW1iZXIgb2Ygcm93cyIsCiAgICApOwoKICAgICMgY2hlY2sgY29udGVudCBvZiBpbXBvcnQgZGF0YQogICAgbXkgJENvdW50ZXJSb3cgPSAwOwogICAgUk9XOgogICAgZm9yIG15ICRJbXBvcnRSb3cgKCBAeyRJbXBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHRyYWN0IHJlZmVyZW5jZSByb3cKICAgICAgICBteSAkUmVmZXJlbmNlUm93ID0gJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+WyRDb3VudGVyUm93XTsKCiAgICAgICAgaWYgKCByZWYgJEltcG9ydFJvdyBuZSAnQVJSQVknIHx8IHJlZiAkUmVmZXJlbmNlUm93IG5lICdBUlJBWScgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSBpbXBvcnQgcm93IGFuZCByZWZlcmVuY2Ugcm93IG1hdGNoZWQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgY29sdW1ucwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7JEltcG9ydFJvd30sCiAgICAgICAgICAgIHNjYWxhciBAeyRSZWZlcmVuY2VSb3d9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlckNvbHVtbiA9IDA7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHskSW1wb3J0Um93fSApIHsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRDZWxsICkgewogICAgICAgICAgICAgICAgJENlbGwgPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSApIHsKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGNlbGwgZGF0YQogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ2VsbCwKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyQ29sdW1uKys7CiAgICAgICAgfQoKICAgICAgICAkQ291bnRlclJvdysrOwogICAgfQp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIEV4cG9ydERhdGFTYXZlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRFeHBvcnREYXRhVGVzdHMgPSBbCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEV4cG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEV4cG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gJycsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiB7fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGV4aXN0aW5nIHRlbXBsYXRlIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgYW5kIGNoYXJzZXQgYXJlIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjaGFyc2V0IGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIjsiIjsiIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCJcIlx0XCJcIlx0XCJcIiIsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIjoiIjoiIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiIuIiIuIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICc7IiI7JywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXHRcIlwiXHQiLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJzoiIjonLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICcuIiIuJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiOyJSb3cxLUNvbDIiOyJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29tbWEnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIsIlJvdzEtQ29sMiIsIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCJSb3cxLUNvbDFcIlx0XCJSb3cxLUNvbDJcIlx0XCJSb3cxLUNvbDNcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiOiJSb3cxLUNvbDIiOiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiLiJSb3cxLUNvbDIiLiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI7IlRlc3QgXG4gMiI7IlRlc3QgMyBcXG5cXHRcXHJcXHMiOyJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgcXF7IlxuVGVzdCAxIlx0IlRlc3QgXG4gMiJcdCJUZXN0IDMgXFxuXFx0XFxyXFxzIlx0IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI6IlRlc3QgXG4gMiI6IlRlc3QgMyBcXG5cXHRcXHJcXHMiOiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIi4iVGVzdCBcbiAyIi4iVGVzdCAzIFxcblxcdFxcclxccyIuIlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICI7IiAgICBUZXN0IjsiIjsiVGVzdCI7IiI7IiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICJcIiAgVGVzdCAgXCJcdFwiICAgIFwiXHRcIlRlc3QgIFwiXHRcIiAgICBUZXN0XCJcdFwiXCJcdFwiVGVzdFwiXHRcIlwiXHRcIiBcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOiIgICAgIjoiVGVzdCAgIjoiICAgIFRlc3QiOiIiOiJUZXN0IjoiIjoiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICIuIiAgICAiLiJUZXN0ICAiLiIgICAgVGVzdCIuIiIuIlRlc3QiLiIiLiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOyI+PEB+XCd9e1tdXCI7IiI7IiIiIiI7Ozo6Li4tLV9fIyMiJwogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0IicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyI+PEB+XCd9e1tdXFwiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIiInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOiI+PEB+XCd9e1tdXCI6IiI6IiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCIuIj48QH5cJ317W11cXCIuIiIuIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiOyLRryDRtCDRvyI7ItKCINKKINKWICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCIg0aog0awg0bJcIlx0XCLRryDRtCDRv1wiXHRcItKCINKKINKWIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI6ItGvING0ING/Ijoi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIi4i0a8g0bQg0b8iLiLSgiDSiiDSliAiJywKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskRXhwb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUV4cG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUV4cG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgRXhwb3J0RGF0YVNhdmUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSA9IHt9OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGV4cG9ydCBkYXRhIHJvdwogICAgbXkgJEV4cG9ydFN0cmluZyA9ICRTZWxmLT57Rm9ybWF0QmFja2VuZE9iamVjdH0tPkV4cG9ydERhdGFTYXZlKAogICAgICAgICV7ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gfSwKICAgICk7CgogICAgaWYgKCAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRFeHBvcnRTdHJpbmcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAhZGVmaW5lZCAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0tPntFeHBvcnREYXRhUm93fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGRlZmluZWQgJEV4cG9ydFN0cmluZywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayB0aGUgZXhwb3J0IHN0cmluZwogICAgJFNlbGYtPklzKAogICAgICAgICRFeHBvcnRTdHJpbmcsCiAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkiLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVsZXRlIHRoZSB0ZXN0IHRlbXBsYXRlcwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiBcQFRlbXBsYXRlSURzLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKMTsK
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
/Pbk3zvc1sQNCt/k9vw7xNbcDQo=
/Pbk3wnc1sQNCt/k9vwJxNbcDQo=
Ivz25N8iOiLc1sQiDQoi3+T2/CI6IsTW3CINCg==
Ivz25N8iOyLc1sQiDQoi3+T2/CI7IsTW3CINCg==
Ivz25N8iCSLc1sQiDQoi3+T2/CIJIsTW3CINCg==
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiMFJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyIwUm93Mi1Db2wyIjsiUm93Mi1Db2wzIg0KIlJvdzMtQ29sMSI7IlJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IyAtLQojIEltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnQucG0sdiAxLjMgMjAxMC8wNS8yMCAxOToyNDowMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCkltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgRW5jb2RlT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDIuMC4zLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaXggYSB0eXBvIGluIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPl9GaXhEYXRhYmFzZVR5cG8oKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9GaXhEYXRhYmFzZVR5cG8oKQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpeERhdGFiYXNlVHlwbygpOwoKPWN1dAoKc3ViIF9GaXhEYXRhYmFzZVR5cG8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGZpeCB0aGUgQ29sdW1uU2VwZXJhdG9yIHR5cG8gKGNvcnJlY3QgaXMgQ29sdW1uU2VwYXJhdG9yKQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfZm9ybWF0ICIKICAgICAgICAgICAgLiAiU0VUIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGFyYXRvcicgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRhX2tleSA9ICdDb2x1bW5TZXBlcmF0b3InIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAxMC8wNS8yMCAxOToyNDowMCAkCgo9Y3V0Cg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEB2ZXJzaW9uICAgICAkUmV2aXNpb246IDEuNCAkCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9hcnJvd191cC5wbmcpOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXSB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2Fycm93X3VwX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCmJ1dHRvbi5BcnJvd0Rvd24gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2Fycm93X2Rvd25fZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKfSAvKiBlbmQgQG1lZGlhICov
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZlJREFUeNqkUztLA0EQnr3bvEhhI9FC09gJInJiZbAQREHUWhTtbK8ULEWwFVLZaJE/YKWFgn2SQgxBgjYSIoYkEsxxuec6c/FxCXmAGZjbmdmZ7+a1TAgBw5AEQxL3K7OnjxAMhyEQCkEgGARJllfJ7jrOjWWaYBkGmM0mPBzOdAdoIyF2MFD9lkfxmxqYgT/Ysix1fzOukHp59apCq1epgT0QFGya6u56XMnnG0C8vTahkI3u+gJ4wYah7m1NKcWiBrregFqtArlcCTaWxhW66wRpKwEdEjTW5EUmS/riXEzhXMB9upSFdMnzYYwl/KXwjgwOsHEgXBds285oQgYHAQ1dB875PJMkmkz/Jjq2DbqmeXJFDoHDwAMwUI9Eo/0BtHod9EbjVy/zKDgugIkARHSy52uUFroDFM9WgI9NQ2T5qJUBj2AJfwD63QnY73mUznuPkRy022MwcfNsJnlMMtlawYMXadItP8Wst1yhmmz9SVQLBbTRUn0iv1CrfpyZ/zXiiOgYQY72WHDq5QfGuF0B/kNfAgwAlIbWNoRkTzIAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEigB30KkogAAAMpJREFUKM+lkT0OAWEQhp/9ESJKF5FPK1oSCQfYXvvVDuAcCola5w5sKdkL6EQhYv+NYpddSyi8xUwxT2bemTGE7zJ/1LGzNKNBnRrWANJNTEjAvAzkclINtFm+dQAQJ9ZjBWstFIhZlCM9Uh4eQxVpcSqAOKGeqAM+J/b0VfhE8hFRT1i40FEWWxfA6GVjckCmKTeSXcoNH7trYlVNJlwBQQiAZhU4c8k6IfiAT+sVOD52AQJ4xsJk6VrRp1PHWXJXgOGWAePvb94BXKRFykgCmkUAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZBJREFUeNrEU79Lw0AUfpemhZI4CIpCJ92cHE4HJ0HEQcFRQdShIJ0E/5SCOBSkgxZE7CS4iIt06NIMnVxUcKhWCJb+iPl1l/gu1ppKKkIHH1zu3r33ffnu3Tvi+z4MYxIMaXLYWcy/9taEkBxOtOtqqDTzFbtNT0QTeIyFXbq5kgoIzq9rf1PgOk5fsNVyQZTo5/5AgqauQ1JVe75puuB5AI5lfe91OvidiiYwms0gOakogd9ovYPjuuCY5ifYMMC17cEKhDEEGO02yLIMNYsB9wjYSMCwPh7nvx8BK51DzZSjbo5E9biCBBAQoFW6ORpOmegi2nYJEyhNr9EHPOo9qvXAB3V1iY4mAF7OrjS83tLARkJwwbWsbPmoqCkJCXQmwRuPQVyW4Clf1ERM5IQxJNzK6vwWSmcQm1nfxv2Dsb0dyjHcOD4Vf87yu8uCVb2AMKaPAJPEJK5gRF7Y3yCTs7uBsnr1hJUPi7gUd9j2Q6AognEcKRwxMr08FxA83lS6KaLXnxHjRRL8y2v8EGAAqEvNnH+aSSAAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEig6bklNhgAAAMlJREFUKM+lkT0KAjEQhb9IFEE9TToP4BU8gq2exG23FAKCYCmIra25iYL4w/6asVhddlW0cJo3yXy8CS9K+F6NH3N0IVMAVIgBnIwAJlXgVogZGNh8ckgfxzNS9jXgQAeACE8MwLUOnIjpACcyYuBa+uinVc4ZzQVPRI5/XSGhN54cQYhhB+IYVYBkK2ZojkR4+qbNyqltLSixSTBzLRIyNEuXBGJfkhSbBtb16LJwaTmuPBLEZszHoIKmfcvhieR70Ovqnfr7N++lLlCSshf+TwAAAABJRU5ErkJggg==