ImportExport
3.3.3
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.3.3.
Build for OTRS::ITSM 3.3.2.
Build for OTRS::ITSM 3.3.1.
Build for OTRS::ITSM 3.3.0 rc1.
Build for OTRS::ITSM 3.3.0 beta5.
Build for OTRS::ITSM 3.3.0 beta4.
Build for OTRS::ITSM 3.3.0 beta3.
Build for OTRS::ITSM 3.3.0 beta2.
Build for OTRS::ITSM 3.3.0 beta1.
The ImportExport package.
Das ImportExport Paket.
El paquete ImportExport.
3.3.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."
);
}
}
2013-12-05 16:54:25
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsCiMgLS0KIyBvdHJzLkltcG9ydEV4cG9ydC5wbCAtIGltcG9ydC9leHBvcnQgc2NyaXB0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCnVzZSB2YXJzIHF3KCRSZWFsQmluKTsKCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3Q7CiRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgTG9nUHJlZml4ID0+ICdPVFJTLUltcG9ydEV4cG9ydCcsCiAgICAlQ29tbW9uT2JqZWN0LAopOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIGdldCBvcHRpb25zCm15ICVPcHRzOwpnZXRvcHRzKCAnaG46YTppOm86JywgXCVPcHRzICk7CgppZiAoICRPcHRze2h9ICkgewoKICAgIHByaW50IFNURE9VVCAib3Rycy5JbXBvcnRFeHBvcnQucGwgLSBhbiBpbXBvcnQvZXhwb3J0IHRvb2xcbiI7CiAgICBwcmludCBTVERPVVQgIkNvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS9cbiI7CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAidXNhZ2U6IG90cnMuSW1wb3J0RXhwb3J0LnBsIC1uIDxUZW1wbGF0ZU51bWJlcj4gLWEgaW1wb3J0fGV4cG9ydCAiOwogICAgcHJpbnQgU1RET1VUICJbLWkgPFNvdXJjZUZpbGU+XSBbLW8gPERlc3RpbmF0aW9uRmlsZT5dXG4iOwogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQgIiAgIGV4YW1wbGVzOlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgICAgIG90cnMuSW1wb3J0RXhwb3J0LnBsIC1uIDAwMDA0IC1hIGltcG9ydCAtaSAvdG1wL2ltcG9ydC5jc3ZcbiI7CiAgICBwcmludCBTVERPVVQgIiAgICAgICBvdHJzLkltcG9ydEV4cG9ydC5wbCAtbiAwMDAwNCAtYSBleHBvcnQgLW8gL3RtcC9leHBvcnQuY3N2XG4iOwoKICAgIGV4aXQgMTsKfQoKIyBjaGVjayB0ZW1wbGF0ZSBudW1iZXIKaWYgKCAhJE9wdHN7bn0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1uIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9CmlmICggJE9wdHN7bn0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBJbnZhbGlkIFRlbXBsYXRlTnVtYmVyXG4iOwogICAgZXhpdCAxOwp9Cm15ICRUZW1wbGF0ZUlEID0gaW50ICRPcHRze259OwoKIyBjaGVjayBhY3Rpb24gbW9kZQppZiAoICEkT3B0c3thfSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IE5lZWQgLWEgaW1wb3J0fGV4cG9ydFxuIjsKICAgIGV4aXQgMTsKfQppZiAoIGxjICRPcHRze2F9IG5lICdpbXBvcnQnICYmIGxjICRPcHRze2F9IG5lICdleHBvcnQnICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBhY3Rpb25cbiI7CiAgICBleGl0IDE7Cn0KCiMgZ2V0IHRlbXBsYXRlIGRhdGEKbXkgJFRlbXBsYXRlRGF0YSA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogVGVtcGxhdGUgJE9wdHN7bn0gbm90IGZvdW5kIVxuIjsKICAgIHByaW50IFNUREVSUiAiRXhwb3J0IGFib3J0ZWQuXG4iOwogICAgZXhpdCAxOwp9CgojIHRpbWUgdG8gc3RhcnQKaWYgKCBsYyAkT3B0c3thfSBlcSAnaW1wb3J0JyApIHsKCiAgICBteSAkU291cmNlQ29udGVudCA9IFxkbyB7Jyd9OwogICAgaWYgKCAkT3B0c3tpfSApIHsKCiAgICAgICAgcHJpbnQgU1RET1VUICJSZWFkIEZpbGUgJE9wdHN7aX0uXG4iOwoKICAgICAgICAjIHJlYWQgc291cmNlIGZpbGUKICAgICAgICAkU291cmNlQ29udGVudCA9ICRDb21tb25PYmplY3R7TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkT3B0c3tpfSwKICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ1NDQUxBUicsCiAgICAgICAgICAgIE1vZGUgICAgID0+ICdiaW5tb2RlJywKICAgICAgICApOwoKICAgICAgICBkaWUgIkNhbid0IHJlYWQgZmlsZSAkT3B0c3tpfS5cbkltcG9ydCBhYm9ydGVkLlxuIiBpZiAhJFNvdXJjZUNvbnRlbnQ7CiAgICB9CgogICAgcHJpbnQgU1RET1VUICJJbXBvcnQgaW4gcHJvY2Vzcy4uLlxuIjsKCiAgICAjIGltcG9ydCBkYXRhCiAgICBteSAkUmVzdWx0ID0gJENvbW1vbk9iamVjdHtJbXBvcnRFeHBvcnRPYmplY3R9LT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTb3VyY2VDb250ZW50LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgogICAgZGllICJcbkVycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIHRoZSBPVFJTIGxvZyBmb3IgZGV0YWlscy5cbiIgaWYgIWRlZmluZWQgJFJlc3VsdDsKCiAgICAjIFByaW50IHJlc3VsdAogICAgcHJpbnQgU1RET1VUICJcbiI7CiAgICBwcmludCBTVERPVVQKICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHQtPntDb3VudGVyfSAkUmVzdWx0LT57T2JqZWN0fSByZWNvcmRzOiAiCiAgICAgICAgLiAiJFJlc3VsdC0+e0ZhaWxlZH0gZmFpbGVkLCAkUmVzdWx0LT57U3VjY2Vzc30gc3VjY2VlZGVkXG4iOwogICAgZm9yIG15ICRSZXRDb2RlICggc29ydCBrZXlzICV7ICRSZXN1bHQtPntSZXRDb2RlfSB9ICkgewogICAgICAgIG15ICRDb3VudCA9ICRSZXN1bHQtPntSZXRDb2RlfS0+eyRSZXRDb2RlfSB8fCAwOwogICAgICAgIHByaW50IFNURE9VVAogICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHQtPntDb3VudGVyfSAkUmVzdWx0LT57T2JqZWN0fSByZWNvcmRzOiAkQ291bnQgJFJldENvZGVcbiIsCiAgICB9CiAgICBpZiAoICRSZXN1bHQtPntGYWlsZWR9ICkgewogICAgICAgIHByaW50IFNURE9VVAogICAgICAgICAgICAiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGU6ICRSZXN1bHQtPntDb3VudGVyfVxuIjsKICAgIH0KfQplbHNpZiAoIGxjICRPcHRze2F9IGVxICdleHBvcnQnICkgewoKICAgIHByaW50IFNURE9VVCAiRXhwb3J0IGluIHByb2Nlc3MuLi5cbiI7CgogICAgIyBleHBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRDb21tb25PYmplY3R7SW1wb3J0RXhwb3J0T2JqZWN0fS0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBkaWUgIlxuRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLlxuIiBpZiAhZGVmaW5lZCAkUmVzdWx0OwoKICAgIHByaW50IFNURE9VVAogICAgICAgICJcbiIsCiAgICAgICAgIlN1Y2Nlc3M6ICRSZXN1bHQtPntTdWNjZXNzfVxuIiwKICAgICAgICAiRmFpbGVkIDogJFJlc3VsdC0+e0ZhaWxlZH1cbiIsCiAgICAgICAgIlxuIjsKCiAgICBpZiAoICRPcHRze299ICkgewoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgICMgc2F2ZSBkZXN0aW5hdGlvbiBjb250ZW50IHRvIGZpbGUKICAgICAgICBteSAkU3VjY2VzcyA9ICRDb21tb25PYmplY3R7TWFpbk9iamVjdH0tPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJE9wdHN7b30sCiAgICAgICAgICAgIENvbnRlbnQgID0+IFwkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKCiAgICAgICAgZGllICJDYW4ndCB3cml0ZSBmaWxlICRPcHRze299LlxuRXhwb3J0IGFib3J0ZWQuXG4iIGlmICEkU3VjY2VzczsKCiAgICAgICAgcHJpbnQgU1RET1VUICJGaWxlICRPcHRze299IHNhdmVkLlxuIjsKICAgIH0KCiAgICBwcmludCBTVERPVVQgIkV4cG9ydCBjb21wbGV0ZS5cbiI7Cn0KCmV4aXQgMDsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
H4sIAAAAAAACA+1d35ObthZ+z1/BOC/tjKNFP0BQN+ncdtq5nWknd5r0JS8e2Wa93GDwAN6N+3D/9iuBvWswGAzIiXePM/HuGlmfhPUdHenTOf7xpy+rwLj34sSPwrcjjMyR4YXzaOGHy7ejvz/+9sYZ/fTu1Y8LX/wg/y9jsTLkO8JE/fV2dJem6x9ubh4eHlCwTUQaxSjwNyjxbv4ngkDcyEI3o3evDOOwgoVIhXpt96pI09ifbVLPCMXKezuaifnnZRxtwsUoL7UrN4+CKDbuRfB29Po2e4xudtXcFOo5UfdaLL1Z7InP9VWb8uG6Xapee3G52tU6SnxZJN2uj4rU1KOeD8rsSiWyULh89/pf+HXepN0LT3VVNbQWJF2JeOmHxzjy3gT5jSDIIYTIm2G5jmtyxvH+npwPN7ssXHBZuPiycH4yXUdxGgs/PYacRVHgiTBHvRVB4nUHSuYikGPsVL9MZBHqYMuklqO6xynpjnfrp2k0UJfylx8JeC6Zl7G/OM3lQomaWh78RXo3/dJwA7vfsLz+rbb67/3EnwVeVQ/8MM0BcP/qt8NUX/6EMqP+9PaeIyKvrXbWWDie5VnnzxrLjb/wkoahVixTU9PdrthN010vl2t7Y/KXSnN4BhGIrRfvqv/5afY2dh+wnG7ijTcyxDz17/d/HdyTaPZfb57uOvshFeFCxAvjjfHR+5KODnyTkeEv3o7em8W7Ve6frE3ax6PbtY4ex5Q1xqTc/WMDUlf3bFauOpatF+Ey8B6rN5H0IawJsZHDTQWHbIy7QabqJjSM9FKZOnOeeQyFciXn4v3Hvz4YFFHjN/kJew9R/LnG2ThBxTrbHoVpFbR63bgVKz/YyhaKMBkZSbpVY0Y6ovlb/+0F917qz8Xh0D6/BXeev7yrbMPhNG2bhQfuh1kch81jsQtG0TDVmCd+q/71A5LOwDJcedWfoxduVrsZpyVKpdk5jxv3WZPK7HhqCm2gXP5ibn5a2KOfvX98L/7DD70Dq2TurBLua5XMsY01WqU3JsLSS7OdcfYb5nhiOdkvElddsruBz7x/plkv2vetggXW2HJPFuDIdFx7bBHEbdM+WdQZm926Mo/i0Iun6nNP6geVeQReee0cYOlle9Myj49dDKH+9UDI3MXjYfLkKhKz1vqdDZZZ8fq72HECXojkLvDC5al+kGFZ/8lffhLL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+c7OzqSkpPz8fMuqLl68WFlZ+cEHH/zud797//33hRArV66Mj4+X5ii89NJLK1eu/POf/yzvv2DBgqysrPXr18sZAfX19T2auyddB9oe0qN2HZwHIcTatWs3bNhgMBj27ds3d+5cKV/JcT+d7L/ZbL755pv/+te/Sptqtfqpp55Sq9XSZpft2jtvK1as0Ov1JSUlISEhH2iBIegAACAASURBVH74oRT+k+3atausrGz37t3yoHpav2z37t2//vWvux2a5QO4nSkXQkyYMOH5558nuuRevb6/k40fP16K1AghlErl3LlzW1paysrKvv32W2miWf/erNnTZXTGqjA4OHjRokWvvfbaoUOHRowYYTabi4uL/f39Fy1a1GV+iYcMzRN4QXTJ9cLDw3/+859bRSV9fX3nz58/ffr0kpKSs2fP1tTUNDY2fvfdd999993EiRPvvffeXqxX19DQcPDgwfDwcNu1h1xwuD1Tp061LWxsbFSr1RUVFTqdTv7uEUJcunTJduekpCTLzdjYWAfllpnD5eXlQoibbrrJqsJJkybt2rVL/tYJCQmJjo6ura3VaDQjR460nAFXUlJSUVExbdq0qqoqg8EQHR0tT5eVLjJmzJhhVfnMmTPLy8vPnDnjzHmQfPTRR9J36owZM1JTU5nGAqCPTCaTILoEYCDFxcXJaf7SpUtsbKxGo3FwyNNPPy2EuP/++9evXy+9EELs2LHj9ddfl/eJioqSokujR4/+7//+74ceekiv1xcUFIwePdqyqvT09CFDhmRkZCxdulQqef31148fPy69zsrKmjhxohTlkXzwwQfSJZx849pfetFul+fh5MmTTz75pFqt7ujoSEpKkqdxOWYblLFn9erVq1at2rNnjxBi1apVq1evlsodt2vb/7feeuvo0aPSNKX7779f6rxs7dq1fn5+8+fPNxgMvatfdvr0afma3wHp1xTny4UQ8fHxXUYr4Eq9vr+T3XLLLbYlZWVl8h+3H2/W+k6lUs2dO/e99977+OOPpaDw3Llz5VVZrHjX0AaUF0SXgoKCGhsbGxsbbWdvyhobG6U9e9eEFK3s7Oysra3ds2fP6dOn33zzzd/+9rf+/v5We8bExMTExAghzGbzhQsXSktLv/nmm9LS0sjISHlVIGfaamtru3Tp0tGjR7/99ttNmzY9+OCDVt/BA3q4Y7YzvLRa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YGdSUlKyd+/etra29957z7cheY7OJLSQXQIAhDm73R4TE8PAJQAeMplMvq2wt7dXSXN77sKFCwFryz0v7obXwQNhJqQ7E6vVumDBAl+F4R06k9BCdgkAEOY0Gs2oUaPy8vIC33RXV1dLS0tPT0/gmwYi3Oeff953RphSsnXr1pSUlMrKyqNHj6anp5eXlzsOaG5unjJlikajyc7OXrlypePNMD8/X5Kk/Px85ePIkSMlSbr66qsddVZXV3/zm99MT0+/6667DAaDo8Lu7u7FixePHj06Pz9/7ty5XV1dLsG0t7cvW7YsOTn5wQcfVMqvueYaJWzJiSeX7KYtIcS5c+emTp2q1WqXL19uNBqdYxiolYHuhhDiwIEDBQUFSUlJ3/jGN1555ZWxY8deYfBA0IrAzmTEiBEuJ3odxqA3SgixfPny7OzscePGHTx40FFIZxKSZAAA4B/nz5+vqanp6upSOxBfmjZt2vXXX692FHBVXFwcFxendhQDSk5OvnDhQuDb7fusK4TYtGnTyy+/nJGRUVJSsm/fvtjYWMfepUuXvv/++xaLpbu7++DBgz/72c8cu06fPl1aWtrd3W2z2V588cX6+nrnOv/jP/6jsbFRluWnn376Jz/5iWPXypUrP/vsM2X73XffXbFihUswN9100+7duzs7OweNfFBu2hJCPP744+fPn29vb//lL3/pfF1uWhzobuzateu2226rrq7u6elpaWn57//+b51Od4XB+8q8efNeeukltVrHoCoqKq699lqvTz98+PCMGTN8GI/nIqozcXOiF2G4v1GyLBuNRrvd/tFHHyUlJfkq+CukfC9osVhUaT10kV0CAMBfzp07V1NTYzAY1A7El8guBSeyS/3q94XQsWG3212O0el0zt/CZmZmOp/70UcfTZo0ad68eVVVVS51Xrx4Udlub29PT0937MrOzna8n/T09GRnZ7ucaDQaPYx8UG7aEkI43mA7OjpcrmugFge6G6NGjXL/t0l2CQMJs+ySYyPMOhM3J3oRhvsb9eGHH06cODExMXHKlClubnKAkV3yDjPjAADwF7vdLoSIiuJ/WyAY9Z1nMX78eOcH5aamJue9SUlJGo2mvr7+0qVLA1Uly3JcXJyjXJZlpR8QA6wKnJSU5EmoZrN50GMGbUsRGxvrYafk5m44GvKEJ8EDIS3MOhM3rjCMvjdq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eCkmJkav1zc1NV199dWO8Ufbt29/5ZVXRo0aJYTYvHnzddddt2XLFmXXM8884/jGr99znQ2UF3jxxRdfe+21vLw8IcSzzz777W9/+8ovxGg0btu2raysrLe3t6enJzExsaCg4Ne//rXjgA8++MDN6aNGjbr66qu9br22tvZKkmLolyzLZrNZCJGQkKB2LL5XVVU1ceJEtaMAAG98/vnnSg/m/B+98pXAU089tX79+jfffLOnp2fhwoW7du1asGCBckBzc3NxcfEnn3ySlZV1xx13/Pa3v01KShJC5OfnNzQ05OXl1dfXCyFGjhx59uzZq6666ty5c0qdJ06cuOOOOxoaGubPn//73/8+OTlZqbC7u/vee++trKw0m80FBQV79+5NTU11DqatrW316tX79++/++67n3nmGSHENddcU1dXJ746ptv91xiDXpcQYvny5X/605/S09M3bty4cOFC5xP7Dd79dfV7ex1n7dmz58knnzx58qQQYu/evUoYJpPpwQcf3L9//6hRo/74xz+OHz9+0OsCEJwYuwQgVL3yyitHjx6dNGnS2LFjHcOIzp49O378eEmSJEkaPnz4+fPnHcc7p2D6PddZTk5OvzmXhoaG0aNHK9vXXHON8y69Xt/vcKdB9fT0tLe322w2x/Miy2EimH3rW98qLi5WOwoA8MaECRP6Zi6UEpvNtmvXru9973v/9V//tX379pKSEscBpaWlmzdvtlgsdXV1M2fOLC0tVcrr6+tPnz79gx/8wGAw2O32srKy+vr6c+fOOeo8duzY0aNHOzo6Jk+e/MgjjzgqXLdu3bp1686dO3fx4sXS0tJ169a5BPP973//pptu0uv1SmpJCHH69Glll+zE/cUOel1CiOeee66xsfHFF1/80Y9+5HJiv8G7v65+b6/jrDfffPPAgQNms3nv3r2OMNasWaPT6RobGysqKo4cOSJILQGhSwaA4JaQkGA0GpVtZUC481673f7GG28MHz5c+Thu3Lgvv/yybyX9dncu5zq74447du/e3ff0r33taydOnFC2q6qqnKvdtWvX4sWLPb4sV62trevWrUtKSoqLi0tPTzeZTF5XBdXZ7faampqamhqbzaZ2LIgUDz30UGZmptpRAIGTk5NTU1Pj3bl9nwocJUIIu93ucozLb5u6/Fv76KOPJk2aNG/evKqqKpc6L168qGy3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AAAAAGBQePbZZwOBwEUXXdQxWhJC/P73v7/wwgsDgcCzzz7bUzOeeOKJQoi2trboRrfbLYQ47rjjemqWZHR30lmzZjkcji+//PKf//yn0vLVV1999dVXDodj5syZKZdhMBiEEAUFBWm+t7eRLgEAAAAAMChs2rRJCHHNNdfE66Bcev/993tqxi+//FIIEbMSasyYMUKI+fPn//DDDz01UZe6O6nZbFZO9V69erXSojy44oorzGZzCgWEw+E9e/Yo7/CNN96YtnvTg51xAAAAAAAMCg6Ho6WlpampyeFwdNrh8OHDBQUFeXl5hw8f7ni1WzvjDh8+vHXr1jvuuOPAgQOLFy9esmSJ2nPr1q3Tp0/3+XxCiGOOOeakk0765S9/ecYZZ5x55pl6vb7LV5HazrjkJ1UH+frrr0866aTc3NyamhohRHFxcWtr69dffz169OjEb0W8woQQpaWld99996233prkjUd4b9qQLgEAAAAAMCgYjcZQKBQMBpU9Vh0Fg0GTyWQwGILBYMeryaRLHV166aUvvPCC0WiMbvzuu++WLVv21ltvOZ1OtbGsrOzxxx+/8MILE7+K1NKl5CeNHmT8+PGff/75K6+8Isvy5ZdfPn78+M8++6zLieIVJoQwGAxnnHHG0qVLkz9z6kjuTRvSJQAAAAAABoU0rF2KUVZWtn79emVXWkfhcHjnzp27du367LPP3n333b1790qSVFFRcf755yd4FSmnS0lOGj3Is88+e8MNN0yZMkWW5Q8++ODZZ5+97rrrkpwoRigUqqmpefvttxcvXtzW1vb3v/996tSpabg3PUiXAAAAAAAYFCZMmLBjx46NGzdOmzat0w4bN248++yzJ0yY8Omnn3a8mvzOuGAw+OOPPy5duvTFF18sKCj45ptvioqKEtcWiUTuvffehx9+OOZr2rpVRndDn04njR6kra2tpKTE6/UKISwWS21trd1uT2GiaH//+99nzJgxbty4HTt2pPPeXsWp3gAAAAAADArKgpeVK1fG66BcOvJ1MUajccSIEWvXrj377LMbGxvvvffeLm/R6XQLFy4UQuzatesIZ09el5NmZ2dfdNFFsizLsnzxxRcr0dIROuOMMxLM2Hv39irSJQAAAAAABoXrr7/eaDS+8cYbL730UserL7744ptvvmkyma6//voemU6SpCeffNJgMLzwwgt79uzpsr/ybW42m61HZk9Sl5POnz8/5sER+uSTT4QQhYWFab63V5EuAQAAAAAwKAwdOvShhx4SQlx11VXXXnvtjh07PB6P1+v9/PPPr7vuurlz5wohHn744fLy8p6accSIEfPmzQuFQtHLl0aNGnXvvfe+9957lZWVfr/f5/P9+OOP//3f/62cfDRjxoyemj1aypOeccYZytqlyZMnd3fSX//61y+++OK+ffv8fr/b7d6zZ88f//jH2bNnCyHmzJmjdpMkqeOpVUne20dw7hIAAAAAAIPI0qVLFy9eHIlEYtp1Ot2DDz74hz/8Id6NyZ+7FK2mpmb48OE+n++zzz4bN26ciP/tckKIE0444YMPPhgyZEiC+lM7dyn5SZM5UynJc5fiTXrWWWe9/fbbmZmZCUZL8t4+gnQJAAAAAIDBZdeuXU8//fTmzZurq6tlWS4rKzvrrLNuueWWUaNGJbgrtXRJCLFo0aLly5dPnTp106ZNQojdu3e/9dZbW7Zs2bVrV0NDgyzLeXl5o0aNuuCCC66++uqMjIzExaeWLiU/aQ+mSzt27HjppZc+/PDDffv2hUKh/Pz8MWPGXHbZZZdeeqlO9/+byTodLcl7+wjSJQAAAAAAAKSuz8VdAAAAAAAA6EdIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqSNdAgAAAAAAQOpIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqTNoXQAAAAAAAEgHSZJkWda6iv8nSVLHxj5VIZJEugQAAAAAAHpdp9mWtllSX4vb+i92xgEAAAAAACB1pEsAAAAAAAwukiS98sor48ePz8zMtNls06ZN27lz54YNG0477TSr1Zqfn3/ZZZc1NTWpnZ977rnjjjvOZDIde+yxa9eujR7queeeGz58uMlkGj58+MqVK2OmOOWUU2w2m16vVzbBST/pssLrr7/+0ksvjW6ZM2fO9ddfr2FJSEQGAAAAAACDgBoCCCFGjhz5/vvvO53O2traq666yuFw/OIXv9i0aZPactlll6mdhw0b9tFHHzmdzg8//HDo0KHvvfeecmndunVlZWWbN29ub2/fvHlzWVnZ+vXr1btGjBixefNmt9sdM3vHejoKBAKnn376M888ozx9+umnJ0+eHAgEerskpIYdhgAAAAAADArqMUOSJH3++ecnn3yy0t7Y2FhYWPjFF1+MHTtWbTnhhBMOHz6sdF6/fv25556rXHrrrbcef/zxjz76SAhx2mmnLViw4IILLlAuVVRUPProo5988oly15YtWyZPntxx9uiWjkWqfRoaGk477bQ///nPQog5c+b84x//KCwsVG/spZKQGt5HAAAAAAAGheh0KRwO63S66EsdW9TOLS0tOTk5SntLS8vw4cOVfXMOh2Pfvn25ubnqpWOPPba5uVm5y+v1ZmRkdBwwQUuML774Ys6cOQaD4eWXX1aTr14tCanh3CUAAAAAAAad6CApXssRis5xUvPpp5/a7Xa/33/o0KE+UhI6RboEAAAAAAAS2bp1q/r4448//uUvf6k8PuGEE7Zs2RJ96Re/+EW8QQwGQzgcTn7Sr7/++v7773/99ddfe+216667bt++fZqXhHhIlwAAAAAAQCK33HLLxx9/7HK5Pvroo9tuu+2ee+5R2u+6665bb731o48+Ui8tXLgw3iBDhw59//33I5FIMjO63e7Zs2c//vjjxx577Pjx4//zP//zoosu8vl8GpaEBNhhCAAAAADAoBB9lFKXRyBFd/6f//mfFStWHDx4sLy8/L777ps3b57a7dlnn1UuDRs2bOHChddcc028AdetW3fXXXcdOnQoHA6rI3csUrl01VVX6fX6559/Xm2/7LLLLBbL6tWre7UkpIZ0CQAAAAAAxNUHj77ugyUNcuyMAwAAAAAAQOpIlwAAAAAAAJA61pIBAAAAAAAgdaxdAgAAAAAAQOpIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqSNdAgAAAABg0Dl48GBlZaXy2OVyHThwQHns9/ubmpqEELIs79u3b9++fTE3qh1iblR1OhoGNoPWBQAAAAAAgLRav379v/71r+bm5qOPPvqiiy66/fbbTzzxRLPZfN555/3xj39sbGx86623/vWvf23atKmhocFgMCxbtky5ce/evWqH2tpa9cY777xT6RDdGD2adq8V6SDJsqx1DQAAAAAAIN3a29tvuOGGSZMmjRo16t/+7d9mzZq1bt06IcQFF1yg5EGRSOTQoUNLlixZs2ZN9I1Kh6effjrmRiFEx0Z1NAxg7IwDAAAAAGDQkWX57rvvXrBgQWNjY0FBQad9KioqFi1adM455+zfv//zzz/3er3RV6NvVDskGA0DGOkSAAAAAACDzl133XXxxRefdNJJpaWlNTU1QghJkmL6XHjhhX/+859feumlmpqa7777zufzRV+NvlHtkGA0DGD6+++/X+saAAAAAABA+vzpT39644033G733r17L7300gceeOCTTz6ZPHnysGHDFixY8Mknn3i93tbW1jVr1rz55psnnXTSpZdeOnr0aIvF0tzcrHb493//d/XG888/X+lw9NFHdzra6aefrvWLRi/i3CUAAAAAAAY1WZZ9Pp/FYolpdzqdJpPJbDZ368Z4o2EA+1965ho/uMBXfQAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkltcG9ydC9FeHBvcnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQvRXhwb3J0PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5TeXN0ZW08L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjcxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPklUU00uSW1wb3J0RXhwb3J0LmNzczwvQ1NTPgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdOb3bDoSDFoWFibG9uYSB6b2JyYXplbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdabmFrb3bDoSBzYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0R2b2p0ZcSNa2EgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ1Nsb3VwZWMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ09kZMSbbG92YcSNIFNsb3VwY8WvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdUZcSNa2EgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTdMWZZWRuw61rICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bMOhdG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdJbXBvcnQvRXhwb3J0IFNwcsOhdmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdaYWjDoWppdCBJbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnWmFow6FqaXQgRXhwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnS3Jvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhY2Ugb2JlY27DvWNoIGluZm9ybWFjw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFjZSBpbmZvcm1hY8OtIG8gb2JqZWt0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhY2UgZm9ybcOhdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdFZGl0YWNlIG1hcG92w6Fuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFjZSB2eWhsZWTDoXbDoW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ09tZXppdCBFeHBvcnQgdnlobGVkw6F2w6Fuw61tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjZSBvIEltcG9ydHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdaZHJvam92w70gU291Ym9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBZmVnaXIgcGxhbnRpbGxhIGRlIG1hcGF0Z2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0Nvbmp1bnQgZGUgY2Fyw6BjdGVycyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb3MgcHVudHMgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYWRvciBkZSBjb2x1bW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW50ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUHVudCBpIGNvbWEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYWRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnR2VzdGnDsiBkZSBJbXBvcnRhci9FeHBvcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgdGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdDb21lbsOnYXIgaW1wb3J0YWNpw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnQ29tZW7Dp2FyIGV4cG9ydGFjacOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnUGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzIGNvbXVuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7MgZFwnb2JqZWN0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDsyBkZSBmb3JtYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7MgZGUgbWFwYXRnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7MgZGUgcmVjZXJjYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyaW5naXIgZXhwb3J0YWNpw7MgcGVyIHJlY2VyY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0YXIgaW5mb3JtYWNpw7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdGaXR4ZXIgZm9udCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YXIvRXhwb3J0YXInOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdUaWxmw7hqIE1hcHBpbmctVGVtcGxhdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ1RlZ25zw6Z0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0tvbG9uICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdLb2xvbm5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bmt0dW0gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTZW1pa29sb24gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnSW1wb3J0L0VrcG9ydCBzdHlyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnU3RhcnQgaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1N0YXJ0IGVrcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1RyaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdSZXQgZsOmbGxlcyBpbmZvcm1hdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdSZXQgb2JqZWt0IGluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnUmV0IGZvcm1hdCBpbmZvcm1hdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ1JldCBtYXBwaW5nIGluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1JldCBzw7hnZWluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVncsOmbnMgZWtwb3J0IHByLiBzw7hnbmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQgaW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdLaWxkZSBmaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9Fa3BvcnQnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGVyYXRvcid9ID0gJ0tvbG9ubmUgYWRza2lsbGVsc2UnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdNYXBwaW5nLVRlbXBsYXRlIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdaZWljaGVuc2F0eic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb3BwZWxwdW5rdCAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnU3BhbHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTcGFsdGVudHJlbm5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVua3QgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTZW1pY29sb24gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnTWl0IFNwYWx0ZW7DvGJlcnNjaHJpZnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICdJbXBvcnQtQmVyaWNodCBmw7xyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICdJbXBvcnRpZXJ0ZSBEYXRlbnPDpHR6ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnRXhwb3J0aWVydGUgRGF0ZW5zw6R0emUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ0RhdGVuc8OkdHplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICfDnGJlcnNwcnVuZ2VuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnSW1wb3J0L0V4cG9ydC1WZXJ3YWx0dW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdFcnN0ZWxsZW4gZWluZXIgVm9ybGFnZSB6dW0gSW1wb3J0aWVyZW4gdW5kIEV4cG9ydGllcmVuIHZvbiBPYmpla3QtSW5mb3JtYXRpb25lbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW1wb3J0IHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnVGVtcGxhdGUgbMO2c2NoZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1NjaHJpdHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWt0IGlzdCBlcmZvcmRlcmxpY2ghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgaXN0IGVyZm9yZGVybGljaCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdPYmpla3QtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnRm9ybWF0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnIHdpcmQgYmVuw7Z0aWd0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdNYXBwaW5nLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnS2VpbmUgTWFwcGluZy1FbGVtZW50ZSBnZWZ1bmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ01hcHBpbmctRWxlbWVudCBoaW56dWbDvGdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1N1Y2gtSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IHBlciBTdWNoZSBlaW5zY2hyw6Rua2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydC1JbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnUXVlbGwtRGF0ZWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ0VyZm9sZ3JlaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ05pY2h0IGVyZm9sZ3JlaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ0RvcHBlbHRlIE5hbWVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnWnVsZXR6dCB2ZXJhcmJlaXRldGUgWmVpbGUgZGVyIEltcG9ydC1EYXRlaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0LUJhY2tlbmQgTW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBJbXBvcnQvRXhwb3J0IE1vZHVscy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG90aWVyZW4gdW5kIEV4cG9ydGllcmVuIHZvbiBPYmpla3QtSW5mb3JtYXRpb25lbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9FeHBvcnQnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBw7FhZGlyIHBsYW50aWxsYSBkZSBtYXBlbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnSnVlZ28gZGUgY2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb3MgcHVudG9zICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdDb2x1bW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgQ29sdW1uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVudG8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQdW50byB5IENvbWEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYWRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgSW1wb3J0YWNpw7NuL0V4cG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaWNpYXIgSW1wb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0luaWNpYXIgRXhwb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnUGFzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDs24gY29tw7puJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICfCoURlYmUgZXNwZWNpZmljYXIgT2JqZXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnwqFEZWJlIGVzcGVjaWZpY2FyIEZvcm1hdG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzbiBkZSBvYmpldG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7NuIGRlbCBmb3JtYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzbiBkZSBtYXBlbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTm8gc2UgZW5jb250cmFyb24gZWxlbWVudG9zIGRlIG1hcGVvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzbiBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGFjacOzbiBwb3IgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydGFyIGluZm9ybWFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0FyY2hpdm8gb3JpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ1JlZ2lzdHJvIGRlIG3Ds2R1bG8gZGUgZm9ybWF0byBiYWNrZW5kIHBhcmEgZWwgbcOzZHVsbyBpbXBvcnQvZXhwb3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0YXIgeSBleHBvcnRhciBpbmZvcm1hY2nDs24gZGUgb2JqZXRvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydGFyL0V4cG9ydGFyJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJ8KhRGViZSBlc3BlY2lmaWNhciBDbGFzZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICfCoURlYmUgZXNwZWNpZmljYXIgU2VwYXJhZG9yIGRlIENvbHVtbmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ0NvbWEgKCwpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIGluIG9yZGVyIHRvIGNhbiBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPQogICAgICAgICdBZ3JlZ3VlIHVuYSBwbGFudGlsbGEgbnVldmEgcGFyYSBwb2RlciBpbXBvcnRhciB5IGV4cG9ydGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICdMb3MgY2FtcG9zIHZhY8Otb3MgaW5kaWNhbiBxdWUgbG9zIHZhbG9yZXMgYWN0dWFsZXMgc2UgbWFudGllbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dvIGJhY2snfSA9ICdSZWdyZXNhcic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICfYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2YLYp9mE2Kgg2Ybar9in2LTYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn2qnYr9io2YbYr9uMINin2LfZhNin2LnYp9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ9iv2YjZhtmC2LfZhyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn2LPYqtmI2YYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ9is2K/Yp9qp2YbZhtiv2Ycg2LPYqtmI2YbigIzZh9inJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICfZhtmC2LfZhyAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ9iz2YXbjCDaqdin2YTZhiAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAn2KzYr9mI2YQg2LPYp9iyIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ9iz2KfYrtiqINmC2KfZhNio24wg2KjYsdin24wg2YjYsdmI2K8g2Ygg2LXYr9mI2LEg2KfYt9mE2KfYudin2Kog2KLYqNis2qnYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICfYtNix2YjYuSDYudmF2YTbjNin2Kog2YjYsdmI2K8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn2LTYsdmI2Lkg2LnZhdmE24zYp9iqINi12K/ZiNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJ9it2LDZgSDZgtin2YTYqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAn2q/Yp9mFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ9ii2KjYrNqp2Kog2YXZiNix2K8g2YbbjNin2LIg2KfYs9iqISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAn2YLYp9mE2KjigIzYqNmG2K/bjCDZhdmI2LHYryDZhtuM2KfYsiDYp9iz2KohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINii2KjYrNqp2KrbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDZgtin2YTYqOKAjNio2YbYr9uMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcg2YXZiNix2K8g2YbbjNin2LIg2KfYs9iqISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2Ybar9in2LTYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn2YfbjNqGINi52YbYtdixINmG2q/Yp9i02KrbjCDbjNin2YHYqiDZhti02K8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfYp9mB2LLZiNiv2YYg2LnZhti12LEg2Ybar9in2LTYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYrNiz2KrYrNmIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAn2YXYrdiv2YjYr9iz2KfYstuMINi52YXZhNuM2KfYqiDYtdiv2YjYsSDYqNmHINin2LLYp9uMINis2LPYqtis2YgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAn2YjYsdmI2K8g2KfYt9mE2KfYudin2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfZgdin24zZhCDZhdmG2KjYuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICfZgtin2YTYqOKAjNio2YbYr9uMINir2KjYqiDZhdin2pjZiNmEINio2LHYp9uMINmF2KfamNmI2YQg2YjYsdmI2K8v2LXYr9mI2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ9mI2LHZiNivINmIINi12K/ZiNixINin2LfZhNin2LnYp9iqINii2KjYrNqp2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ9mI2LHZiNivL9i12K/ZiNixJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICfZgdmH2LHYs9iqINmC2KfZhNio4oCM2YfYpyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmcl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBam91dGVyIHVuIHRlbXBsYXRlIGRlIG1hcHBhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0pldSBkZSBjYXJhY3TDqHJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEZXV4IHBvaW50cyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sb25uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU8OpcGFyYXRldXIgZGUgY29sb25uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUG9pbnQgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb2ludCB2aXJndWxlICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0aW9uIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGRlIGxcJ0ltcG9ydC9FeHBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdEw6ltYXJyZXIgSW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0TDqW1hcnJlciBFeHBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdFdGFwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGNvbW11bmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIGxcJ29iamV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgZm9ybWF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgbWFwcGFnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSByZWNoZXJjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmVpbmRyZSBsXCdleHBvcnQgcGFyIHJlY2hlcmNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hdGlvbnMgZFwnaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRmljaGllciBTb3VyY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydGVyL0V4cG9ydGVyJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjppdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBZ2dpdW5naSBtYXBwYXR1cmEgbW9kZWxsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnQ2hhcnNldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEdWUgcHVudGkgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbG9ubmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYXRvcmUgZGkgY29sb25uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVudG8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQdW50byBlIHZpcmdvbGEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvcmUgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb25lIEltcG9ydGF6aW9uZS9Fc3BvcnRhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbml6aWFyZSBJbXBvcnRhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pemlhcmUgRXNwb3J0YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnUGFzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgY29tdW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ01vZGlmaWNhIGluZm9ybWF6aW9uaSBvZ2dldHRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnTW9kaWZpY2EgZm9ybWF0byBpbmZvcm1hemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdNb2RpZmljYSBtYXBwYXR1cmEgaW5mb3JtYXppb25pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ01vZGlmaWNhIGluZm9ybWF6aW9uaSBkaSByaWNlcmNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdlcmUgZXNwb3J0YXppb25lIHBlciByaWNlcmNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydGFyZSBpbmZvcm1hemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcmNoaXZpbyBvcmlnaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhcmUvRXNwb3J0YXJlJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpqYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjptc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdUYW1iYWggdGVtcGxhdCBwZXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdTZXQga2FyYWt0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnVGl0aWsgYmVydGluZGloICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdLb2x1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS29sdW0gcGVtaXNhaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnVGl0aWsgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTZW1pa29sb24gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnVGVybWFzdWsgS29sdW0gS2VwYWxhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnUGVuZ3VydXNhbiBJbXBvcnQvRWtzcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnQ2lwdGEgdGVtcGxhdCB1bnR1ayBpbXBvcnQgZGFuIGVrc3BvcnQgaW5mb3JtYXNpIG9iamVrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdNdWxhIGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdNdWxhIGVrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnUGFkYW0gdGVtcGxhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnTGFuZ2thaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0F1ZGl0IGluZm9ybWFzaSBiaWFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWsgYWRhbGFoIGRpcGVybHVrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgYWRhbGFoIGRpcGVybHVrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnQXVkaXQgaW5mb3JtYXNpIG9iamVrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnQXVkaXQgaW5mb3JtYXNpIGZvcm1hdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnIGFkYWxhaCBkaXBlcmx1a2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdBdWRpdCBpbmZvcm1hc2kgcGV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnVGlhZGEgZWxlbWVuIHBldGEgZGl0ZW11aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ1RhbWJhaCBlbGVtZW4gcGV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ0F1ZGl0IGluZm9ybWFzaSBjYXJpYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdEaWxhcmFuZyBla3Nwb3J0IHBlciBjYXJpYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXNpIGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ1N1bWJlciBmYWlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdCBiYWNrZW5kIG1vZHVsIHBlbmRhZnRhcmFuIHVudHVrIG1vZHVsIGltcG9ydC9la3Nwb3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW5mb3JtYXNpIG9iamVrIGltcG9ydCBkYW4gZWtzcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9Fa3Nwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdMZWdnIHRpbCBtYWwgZm9yIG1hcHBpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ1RlZ25zZXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0tvbG9uICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdLb2xvbm5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdLb2xvbm5lc2VwYXJhdG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW5rdHVtICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmFzam9uIGF2IEltcG9ydC9Fa3Nwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdPcHByZXR0IGVuIG1hbCBmb3Igw6UgZWtzcG9ydGVyZSBvZyBpbXBvcnRlcmUgaW5mb3JtYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnU3RhcnQgaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1N0YXJ0IGVrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnU2xldHQgbWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdTdGVnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnRW5kcmUgZmVsbGVzaW5mb3JtYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamVrdCBlciBww6VrcmV2ZCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hdCBlciBww6VrcmV2ZCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdFbmRyZSBvYmpla3RldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VuZHJlIGZvcm1hdGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcgZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VuZHJlIG1hcHBpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ0luZ2VuIGVsZW1lbnRlciBmdW5uZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdMZWdnIHRpbCBtYXBwaW5nLWVsZW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdFbmRyZSBzw7hrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmVncmVucyBla3Nwb3J0IHBlciBzw7hrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydC1pbmZvcm1hc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0tpbGRlZmlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Jha3NpZGVtb2R1bC1yZWdpc3RyZXJpbmcgZm9yIGZvcm1hdGV0IHRpbCBpbXBvcnQvZWtzcG9ydC1tb2R1bGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbmZvcm1hc2pvbiBmb3IgaW1wb3J0LSBvZyBla3Nwb3J0LW9iamVrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0Vrc3BvcnQnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGVyYXRvcid9ID0gJ0tvbG9ubmUgYWRza2lsbGVsc2UnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdNYXBwaW5ndGVtcGxhdGUgdG9ldm9lZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdLYXJha3RlcnNldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEdWJiZWxlIHB1bnQgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbG9tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdLb2xvbXNjaGVpZGluZ3N0ZWtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVudCAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1B1bnRrb21tYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdJbXBvcnQvRXhwb3J0IGJlaGVlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0V4cG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnU3RhcCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0FsZ2VtZW5lIGluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamVjdCBpcyB2ZXJwbGljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYWF0IGlzIHZlcnBsaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdPYmplY3QtaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0Zvcm1hdC1pbmZvcm1hdGlvbmVuIGJld2Vya2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnTWFwcGluZy1pbmZvcm1hdGllIGJld2Vya2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdHZWVuIGVsZW1lbnRlbiBnZXZvbmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1pvZWstaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlcGVyayBleHBvcnQgdG90IHpvZWtvcGRyYWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtaW5mb3JtYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0Jyb25iZXN0YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0IGVuIGV4cG9ydCBvYmplY3RpbmZvcm1hdGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzIGlzIHJlcXVpcmVkISd9ID0gJ0tsYXNzZSBpcyB2ZXJwbGljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnU2NoZWlkaW5nc3Rla2VuIGlzIHZlcnBsaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0KICAgICAgICAnTWFhayBlZW4gdGVtcGxhdGUgYWFuIG9tIG9iamVjdGVuIHRlIGltcG9ydGVyZW4gb2YgZXhwb3J0ZXJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnQmlqIGxlZ2UgdmVsZGVuIHdvcmR0IGRlIGh1aWRpZ2Ugd2FhcmRlIGJlaG91ZGVuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwbF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdEb2RhaiBzemFibG9uIG1hcG93YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnS29kb3dhbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0R3dWtyb3BlayAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sdW1uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU2VwYXJhdG9yIGtvbHVtbnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ0tyb3BrYSAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ8WacmVkbmlrICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ1VtaWXFm8SHIG5hZ8WCw7N3a2kga29sdW1uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJ1BvZHN1bW93YW5pZSBpbXBvcnR1IGRsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnWmFpbXBvcnRvd2FuZSByZWtvcmR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICdXeWVrc3BvcnRvd2FuZSByZWtvcmR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdSZWtvcmR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICdQb21pbmnEmXRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIEltcG9ydGVtL0V4cG9ydGVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdVdHfDs3J6IHN6YWJsb24gZG8gaW1wb3J0dSBpIGVrc3BvcnR1IGRhbnljaCBvYmlla3TDs3cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1JvenBvY3puaWogaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1JvenBvY3puaWogZWtzcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICdVc3XFhCBzemFibG9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdLcm9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnRWR5dHVqIGluZm9ybWFjamUgd3Nww7NsbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iaWVrdCBqZXN0IHd5bWFnYW55ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRm9ybWF0IGplc3Qgd3ltYWdhbnkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRWR5dHVqIGluZm9ybWFjamUgb2JpZWt0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VkeXR1aiBmb3JtYXQgb2JpZWt0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnIGplc3Qgd3ltYWdhbmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VkeXR1aiBpbmZvcm1hY2plIG1hcG93YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTmllIHpuYWxlemlvbm8gZWxlbWVudMOzdyBtYXB5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnRG9kYWogZWxlbWVudCBtYXBvd2FuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdFZHl0dWogaW5mb3JtYWNqZSB3eXN6dWtpd2FuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdPZ3JhbmljeiBla3Nwb3J0IHByemV6IHd5c3p1a2FuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0dWogaW5mb3JtYWNqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ1BsaWsgxbpyw7NkxYJvd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ1Bvd29kemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnTmllcG93b2R6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEdXBsaWthdHkgbmF6dyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ05yIG9zdGFuaWVqIHByemV0d29yem9uZWogbGluaWkgcGxpa3UgaW1wb3J0b3dlZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ01vZHXFgiBmb3JtYXRvd2FuaWEgYmFja2VuZCBkbGEgbW9kdcWCdSBpbXBvcnQvZWtzcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydHVqIGkgZWtzcG9ydHVqIGluZm9ybWFjamUgb2JpZWt0w7N3Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L2Vrc3BvcnQnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xhc3MnfSA9ICdLbGFzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb25maWcgSXRlbSd9ID0gJ0NJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJ0VsZW1lbnQgd3ltYWdhbnksIHBvZGFqIHdhcnRvxZvEhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICdQdXN0ZSBwb2xhIG96bmFjemFqxIUgemFjaG93YW5pZSBiaWXFvMSFY2VqIHdhcnRvxZtjaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ01ha3N5bWFsbmEgbGljemJhIHd5c3TEhXBpZcWEIHBvamVkeW5jemVnbyBlbGVtZW50dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnTGlzdGEgc3phYmxvbsOzdyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBZGljaW9uYXIgbW9kZWxvIGRlIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0NvZGlmaWNhw6fDo28gZGUgQ2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb2lzIFBvbnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sdW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgQ29sdW5hcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUG9udG8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb250byBlIFbDrXJndWxhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGHDp8OjbyAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnR2VyZW5jaWFtZW50byBkZSBJbXBvcnRhw6fDo28vRXhwb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdDcmlhciB1bSBtb2RlbG8gcGFyYSBpbXBvcnRhciBlIGV4cG9ydGFyIGluZm9ybWHDp8O1ZXMgZGUgb2JqZXRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbmljaWFyIEltcG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdJbmljaWFyIEV4cG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICdFeGNsdWlyIE1vZGVsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnUGFzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBjb211bnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamV0byDDqSBuZWNlc3PDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ08gZm9ybWF0byDDqSBuZWNlc3PDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBkbyBvYmpldG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBkbyBmb3JtYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcgw6kgbmVjZXNzw6FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRvIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ07Do28gaMOhIGVsZW1lbnRvcyBtYXBhIGVuY29udHJhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdBZGljaW9uYXIgZWxlbWVudG8gZGUgbWFwZWFtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRlIHBlc3F1aXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhw6fDo28gcG9yIHBlc3F1aXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWHDp8O1ZXMgZGUgaW1wb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnQXJxdWl2byBkZSBPcmlnZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0byBkZSByZWdpc3RybyBiYWNrZW5kIGRvIG3Ds2R1bG8gZGUgaW1wb3J0YcOnw6NvIC8gZXhwb3J0YcOnw6NvIG3Ds2R1bG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRhciBlIGV4cG9ydGFyIGluZm9ybWHDp8O1ZXMgZGUgb2JqZXRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9QVF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIENvcHlyaWdodCAoQykgMjAxMiBGQ0NOIC0gUnVpIEZyYW5jaXNjbyA8cnVpLmZyYW5jaXNjb0BmY2NuLnB0PgojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9QVF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICdBZGljaW9uYXIgbW9kZWxvIGRlIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0NvZGlmaWNhw6fDo28gZGUgQ2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb2lzIFBvbnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sdW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgQ29sdW5hcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUG9udG8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb250byBlIFbDrXJndWxhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGHDp8OjbyAoVEFCKSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3TDo28gZGUgSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgdGVtcGxhdGUnfSA9ICdBZGljaW9uYXIgbW9kZWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdDcmlhciB1bSBtb2RlbG8gcGFyYSBpbXBvcnRhciBlIGV4cG9ydGFyIGluZm9ybWHDp8O1ZXMgZGUgb2JqZXRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbmljaWFyIEltcG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdJbmljaWFyIEV4cG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICdBcGFnYXIgTW9kZWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdQYXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGNvbXVucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZXRvIMOpIG5lY2Vzc8OhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnTyBmb3JtYXRvIMOpIG5lY2Vzc8OhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRvIG9iamV0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRvIGZvcm1hdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyDDqSBuZWNlc3PDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZG8gbWFwZWFtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTsOjbyBmb3JhbSBlbmNvbnRyYWRvcyBlbGVtZW50b3MgbWFwYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0FkaWNpb25hciBlbGVtZW50byBkZSBtYXBlYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZGUgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGHDp8OjbyBwb3IgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw7VlcyBkZSBpbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdGaWNoZWlybyBmb250ZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9ICdGb3JtYXRvIGRlIHJlZ2lzdHJvIGJhY2tlbmQgZG8gbcOzZHVsbyBkZSBpbXBvcnRhw6fDo28gLyBleHBvcnRhw6fDo28gbcOzZHVsby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydGFyIGUgZXhwb3J0YXIgaW5mb3JtYcOnw7VlcyBkZSBvYmpldG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhw6fDo28vRXhwb3J0YcOnw6NvJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpydV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQUltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG1hcHBpbmcgdGVtcGxhdGUnfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDRiNCw0LHQu9C+0L3QsCDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ9Ca0L7QtNC40YDQvtCy0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICfQlNCy0L7QtdGC0L7Rh9C40LUgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ9Ch0YLQvtC70LHQtdGGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfQoNCw0LfQtNC10LvQuNGC0LXQu9GMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICfQotC+0YfQutCwICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn0KLQvtGH0LrQsCDRgSDQt9Cw0L/Rj9GC0L7QuSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAn0KLQsNCx0YPQu9GP0YbQuNGPIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0LvQtdC90LjQtSDQmNC80L/QvtGA0YLQvtC8L9Ct0LrRgdC/0L7RgNGC0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ9Cd0LDRh9Cw0YLRjCDQuNC80L/QvtGA0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn0J3QsNGH0LDRgtGMINGN0LrRgdC/0L7RgNGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAn0KjQsNCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0L7QsdGJ0YPRjiDQuNC90YTQvtGA0LzQsNGG0LjRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQvtCxINC+0LHRitC10LrRgtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0YTQvtGA0LzQsNGCINC00LDQvdC90YvRhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQv9C+0LjRgdC60L7QstGD0Y4g0LjQvdGE0L7RgNC80LDRhtC40Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfQntCz0YDQsNC90LjRh9C40YLRjCDRjdC60YHQv9C+0YDRgiDQv9C+0LjRgdC60L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICfQmNC90YTQvtGA0LzQsNGG0LjRjyDQuNC80L/QvtGA0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ9CY0YHRhdC+0LTQvdGL0Lkg0YTQsNC50LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ9CY0LzQv9C+0YDRgi/QrdC60YHQv9C+0YDRgic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgQ29weXJpZ2h0IChDKSAyMDEzIE1pY2hhZWwgU2hpIDxtaWNzaGkgYXQgMTYzLmNvbT4KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAn5aKe5Yqg5pig5bCE5qih54mIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICflrZfnrKbpm4YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAn5YaS5Y+3ICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICfliJcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAn6YCX5Y+3KCwpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfliJfliIbpmpTnrKYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ+WPpeWPtyAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ+WIhuWPtyAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAn5Yi26KGo6ZSuIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICfljIXmi6zliJfmoIfpopgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAn5a+85YWl5oC757uTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICflr7zlhaXorrDlvZUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJ+WvvOWHuuiusOW9lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAn6K6w5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICfot7Pov4fnmoQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICflr7zlhaUv5a+85Ye6566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfliJvlu7rmqKHmnb/lr7zlhaXlkozlr7zlh7rlr7nosaHkv6Hmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn5byA5aeL5a+85YWlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ+W8gOWni+WvvOWHuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICfliKDpmaTmqKHmnb8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ+atpemqpCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ+e8lui+keWFseeUqOS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGUgbmFtZSBpcyByZXF1aXJlZCEnfSA9ICflkI3np7DmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ+WvueixoeaYr+W/hemcgOeahO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAn5qC85byP5piv5b+F6ZyA55qEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAn57yW6L6R5a+55YOP5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAn57yW6L6R5qC85byP5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICfmmK/lv4XpnIDnmoQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ+e8lui+keaYoOWwhOS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn5rKh5pyJ5om+5Yiw5pig5bCE55qE5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfmt7vliqDmmKDlsITlrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICfnvJbovpHmkJzntKLkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfpmZDliLblr7zlh7rmr4/kuKrmkJzlr7snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAn5a+85YWl5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAn5rqQ5paH5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfmiJDlip8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAn5aSx6LSlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ+mHjeWkjeeahOWQjeensCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ+WvvOWFpeaWh+S7tuacgOWQjuWkhOeQhueahOihjOaVsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAn5qih5p2/5YiX6KGoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ+epuuWtl+auteihqOekuuS/neaMgeW9k+WJjeeahOWAvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJ+W/hemhu+aMh+WumuWIl+WIhumalOespiEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ+WvvOWFpeWSjOWvvOWHuuWvueixoeS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAn5a+85YWlL+WvvOWHuic7CgoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKGNvbW1vbikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQxJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhOwogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJFNhdmVDb250aW51ZTsKICAgICAgICAkU2F2ZUNvbnRpbnVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0TmV4dCcgKTsKCiAgICAgICAgaWYgKCAhJFNhdmVDb250aW51ZSApIHsKCiAgICAgICAgICAgICMgaWYgbmVlZGVkIG5ldyBmb3JtCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoIE5ldyA9PiAxLCAlUGFyYW0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyB0ZW1wbGF0ZSBpZAogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGVkaXQKICAgICAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSggJVBhcmFtLCAleyRUZW1wbGF0ZURhdGF9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIGlmIHNhdmUgJiBjb250aW51ZQogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYWxsIGRhdGEgZm9yIHBhcmFtcyBhbmQgY2hlY2sgZm9yIGVycm9ycwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KENvbW1lbnQgT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgVGVtcGxhdGVJRCkpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+eyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBpcyBhIG5ldyB0ZW1wbGF0ZT8KICAgICAgICBteSAkTmV3OwogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJE5ldyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBmaWVsZHMKICAgICAgICAjIGZvciBuZXcgdGVtcGxhdGVzCiAgICAgICAgaWYgKCROZXcpIHsKCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9ye09iamVjdH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntGb3JtYXR9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgZm9yIGFsbCB0ZW1wbGF0ZXMKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHNvbWUgZXJyb3IKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcntGb3JtYXR9IHx8ICRTZXJ2ZXJFcnJvcntPYmplY3R9IHx8ICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgTmV3ICAgICAgICAgPT4gJE5ldywKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgaWYgKCROZXcpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiQ2FuJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDI7VGVtcGxhdGVJRD0kVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChvYmplY3QpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWRlZCBUZW1wbGF0ZUlEIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Ym1pdE5leHQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU3VibWl0TmV4dCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDIoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0ZW1wbGF0ZSBzdGFydHMgaGVyZQoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgICAgICBteSAlRGF0YVR5cGVFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZCBhbmQgaXMgbm90IHRoZXJlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGxvb2sgZm9yIHJlZ2V4cCBmb3IgZGF0YSB0eXBlIGFsbG93ZWQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0lucHV0fS0+e1JlZ2V4fQogICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgISRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID1+ICRJdGVtLT57SW5wdXR9LT57UmVnZXh9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyByZWxvYWQgd2l0aCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MigKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICAgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIERhdGFUeXBlRXJyb3IgICAgPT4gXCVEYXRhVHlwZUVycm9yLAogICAgICAgICAgICAgICAgVGVtcGxhdGVEYXRhRm9ybSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQzO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoZm9ybWF0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDMnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdOZWVkZWQgVGVtcGxhdGVJRCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRTdWJtaXROZXh0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0TmV4dCcgKTsKCiAgICAgICAgaWYgKCAhJFN1Ym1pdE5leHQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQzKCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgc3RhcnRpbmcgaGVyZQoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWxvYWQgd2l0aCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MygKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yID0+IFwlU2VydmVyRXJyb3IsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBGb3JtYXREYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDQ7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0NCcgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaGVhZGVycyBmb3Igb2JqZWN0IGFuZCBhZGQgY29tbW9uIGhlYWRlcnMKICAgICAgICBteSBASGVhZGVyczsKCiAgICAgICAgZm9yIG15ICRIZWFkZXIgKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRIZWFkZXItPntOYW1lfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQ29tbW9uSGVhZGVyICggJ0NvbHVtbicsICdVcCcsICdEb3duJywgJ0RlbGV0ZScgKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRDb21tb25IZWFkZXI7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEhlYWRlciAoQEhlYWRlcnMpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRUYWJsZUhlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBIZWFkZXIgPT4gJEhlYWRlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRvIHVzZSBpbiBjb2xzcGFuIGZvciAnbm8gZGF0YSBmb3VuZCcgbWVzc2FnZQogICAgICAgIG15ICRIZWFkZXJDb3VudGVyID0gQEhlYWRlcnM7CgogICAgICAgIG15ICRFbXB0eU1hcCAgICAgICAgICAgID0gMTsKICAgICAgICBteSAkQXRyaWJ1dHRlUm93Q291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAkRW1wdHlNYXAgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJEF0cmlidXR0ZVJvd0NvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTWFwcGluZ09iamVjdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJdGVtLT57S2V5fSAuICRBdHJpYnV0dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICdPYmplY3Q6OicgLiAkQXRyaWJ1dHRlUm93Q291bnRlciAuICc6OicgLiAkSXRlbS0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQXRyaWJ1dHRlUm93Q291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ0Zvcm1hdDo6JyAuICRBdHJpYnV0dGVSb3dDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRNYXBOdW1iZXJDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRBdHJpYnV0dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhpZGUgdGhlIHVwIGJ1dHRvbiBmb3IgZmlyc3QgZWxlbWVudCBhbmQgZG93biBidXR0b24gZm9yIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgbXkgJFVwQmxvY2s7CiAgICAgICAgICAgIG15ICREb3duQmxvY2s7CiAgICAgICAgICAgIG15ICROdW1iZXJPZkVsZW1lbnRzID0gQHskTWFwcGluZ0xpc3R9OwoKICAgICAgICAgICAgaWYgKCAkQXRyaWJ1dHRlUm93Q291bnRlciA9PSAwICkgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NE5vVXBCdXR0b24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NFVwQnV0dG9uJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgaWYgKCAkQXRyaWJ1dHRlUm93Q291bnRlciA9PSAoICROdW1iZXJPZkVsZW1lbnRzIC0gMSApICkgewogICAgICAgICAgICAgICAgJERvd25CbG9jayA9ICdUZW1wbGF0ZUVkaXQ0Tm9Eb3duQnV0dG9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREb3duQmxvY2sgPSAnVGVtcGxhdGVFZGl0NERvd25CdXR0b24nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwIGJ1dHRvbiBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkVXBCbG9jaywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb3duIGJ1dHRvbiBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRG93bkJsb2NrLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lEIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQXRyaWJ1dHRlUm93Q291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlNYXApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDROb01hcEZvdW5kJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHVtbnMgPT4gJEhlYWRlckNvdW50ZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTQnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgTWFwcGluZ0FkZCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gICAgPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgbXkgJFN1Ym1pdEJ1dHRvbiA9ICcnOwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIHNvcnQga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+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+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249JFN1YmFjdGlvbjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+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+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICggc29ydCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIHJlc3RyaWN0aW9ucwogICAgICAgIGlmICggISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3RyaWN0RXhwb3J0JyApICkgewoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPSRTdWJhY3Rpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskU2VhcmNoQXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIHNlYXJjaCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj0kU3ViYWN0aW9uO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZURlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGRlbGV0ZSB0ZW1wbGF0ZSBmcm9tIGRhdGFiYXNlCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydCBpbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydEluZm9ybWF0aW9uJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRJbmZvcm1hdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc291cmNlIGZpbGUKICAgICAgICBteSAlU291cmNlRmlsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAkU291cmNlRmlsZXtDb250ZW50fSB8fD0gJyc7CgogICAgICAgICMgaW1wb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5JbXBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFwkU291cmNlRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgaW1wb3J0IHJlc3VsdHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFJlc3VsdH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIHJldHVybiBjb2RlcyBhbmQgY29sbGVjdCB0aGUgZHVwbGljYXRlIG5hbWVzCiAgICAgICAgbXkgQER1cGxpY2F0ZU5hbWVzOwogICAgICAgIFJFVFVSTkNPREU6CiAgICAgICAgZm9yIG15ICRSZXRDb2RlICggc29ydCBrZXlzICV7ICRSZXN1bHQtPntSZXRDb2RlfSB9ICkgewoKICAgICAgICAgICAgIyBqdXN0IGdldCB0aGUgZHVwbGljYXRlIG5hbWUKICAgICAgICAgICAgaWYgKCAkUmV0Q29kZSA9fiBteyBcQSBEdXBsaWNhdGVOYW1lIFxzKyAoLispIH14bXMgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEdXBsaWNhdGVOYW1lcywgJDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydFJlc3VsdFJldHVybkNvZGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlTmFtZSAgPT4gJFJldENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGVDb3VudCA9PiAkUmVzdWx0LT57UmV0Q29kZX0tPnskUmV0Q29kZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGR1cGxpY2F0ZSBuYW1lcyBpZiBuZWNjZXNzYXJ5CiAgICAgICAgaWYgKEBEdXBsaWNhdGVOYW1lcykgewoKICAgICAgICAgICAgbXkgJER1cGxpY2F0ZU5hbWVzU3RyaW5nID0gam9pbiAnLCAnLCBARHVwbGljYXRlTmFtZXM7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0UmVzdWx0RHVwbGljYXRlTmFtZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlTmFtZXMgPT4gJER1cGxpY2F0ZU5hbWVzU3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGxhc3QgcHJvY2Vzc2VkIGxpbmUgbXVtYmVyIG9mIGltcG9ydCBmaWxlCiAgICAgICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhc3RMaW5lTnVtYmVyID0+ICRSZXN1bHQtPntDb3VudGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBleHBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkU2VsZi0+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
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMgaW4gaW1wb3J0L2V4cG9ydC4KCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgbXkgJENoZWNrZWQgPSAkUGFyYW17VmFsdWV9ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnOwoKICAgIHJldHVybgogICAgICAgIHFxezxpbnB1dCBpZD0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiB0eXBlPSJjaGVja2JveCIgbmFtZT0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiAkQ2hlY2tlZCAvPn07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBEVEwgY29kZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3Igc2VsZWN0aW9uIGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwogICAgJFBhcmFte1ZhbHVlfSAgfHw9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICYmICRQYXJhbXtWYWx1ZX0gPX4gbXsgIyMjIyMgfXhtcyApIHsKICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gXEBWYWx1ZXM7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvcHRpb24gc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBJRCAgICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9IHx8IHt9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0sCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1Bvc3NpYmxlTm9uZX0sCiAgICAgICAgTXVsdGlwbGUgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e011bHRpcGxlfSwKICAgICAgICBTaXplICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBGb3JtRGF0YXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoCiAgICAgICAgUGFyYW0gPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgKTsKCiAgICBteSAkRm9ybURhdGEgPSBqb2luICcjIyMjIycsIEBGb3JtRGF0YXM7CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgdGV4dCBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgbXkgJFNpemUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA0MDsKICAgIG15ICRTaXplQ2xhc3M7CiAgICBpZiAoICRTaXplIDwgMTUgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXMTBwYyc7CiAgICB9CiAgICBlbHNpZiAoICRTaXplIDwgMzUgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXMzNwYyc7CiAgICB9CiAgICBlbHNpZiAoICRTaXplIDwgNTAgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXNTBwYyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2l6ZUNsYXNzID0gJ1c3NXBjJzsKICAgIH0KCiAgICAjIHByZXBhcmUgZGF0YQogICAgbXkgJElEID0gKCAkUGFyYW17UHJlZml4fSB8fCAnJyApIC4gKCAkUGFyYW17SXRlbX0tPntLZXl9ICk7CiAgICBteSAkTmFtZSA9ICggJFBhcmFte1ByZWZpeH0gfHwgJycgKSAuICggJFBhcmFte05hbWV9IHx8ICRJRCApOwogICAgbXkgJENsYXNzID0gKCAkU2l6ZUNsYXNzIHx8ICcnICkgLiAoICRQYXJhbXtDbGFzc30gfHwgJycgKTsKCiAgICBteSAkU3RyaW5nCiAgICAgICAgPSAiPGlucHV0IGlkPVwiJElEXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiJE5hbWVcIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKICAgIH0KCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gIi8+ICI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgIyByZWdleCBjaGVjawogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gJiYgJEZvcm1EYXRhICF+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ2V4fSApIHsKCiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgcmV0dXJuICRGb3JtRGF0YTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9b3ZlcgoKPWl0ZW0gSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gJ1ZhbHVlJywgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KCkKCnJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBodG1sIGZvcm0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGEgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCj1pdGVtIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgpCgp0byBsb2FkIGEgaW1wb3J0L2V4cG9ydCBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRMYXlvdXRPYmplY3QtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgKTsKCkFuIGluc3RhbmNlIG9mIHRoZSBsb2FkZWQgYmFja2VuZCBtb2R1bGUgaXMgcmV0dXJuZWQuCgo9Y3V0CgpzdWIgX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dCRQYXJhbXtUeXBlfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICk7CgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWJhY2sK
IyAtLQojIEFBQUltcG9ydEV4cG9ydC5kdGwgLSAkVGV4dCB2YXJpYWJsZSBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyBDb21tb24KJFRleHR7IkFkZCBtYXBwaW5nIHRlbXBsYXRlIn0KJFRleHR7IkNoYXJzZXQifQokVGV4dHsiQ29sb24gKDopIn0KJFRleHR7IkNvbHVtbiJ9CiRUZXh0eyJDb2x1bW4gU2VwYXJhdG9yIn0KJFRleHR7IkRvdCAoLikifQokVGV4dHsiU2VtaWNvbG9uICg7KSJ9CiRUZXh0eyJUYWJ1bGF0b3IgKFRBQikifQokVGV4dHsiSW5jbHVkZSBDb2x1bW4gSGVhZGVycyJ9CiRUZXh0eyJJbXBvcnQgc3VtbWFyeSBmb3IifQokVGV4dHsiSW1wb3J0ZWQgcmVjb3JkcyJ9CiRUZXh0eyJFeHBvcnRlZCByZWNvcmRzIn0KJFRleHR7IlJlY29yZHMifQokVGV4dHsiU2tpcHBlZCJ9Cg==
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+JFRleHR7IkltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KCjwhLS0gZHRsOmJsb2NrOkFjdGlvbkxpc3QgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQWN0aW9ucyJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXcgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIHRvIG92ZXJ2aWV3In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3IC0tPgo8IS0tIGR0bDpibG9jazpBY3Rpb25BZGQgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIj48c3Bhbj4kVGV4dHsiQWRkIHRlbXBsYXRlIn08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbkFkZCAtLT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBY3Rpb25MaXN0IC0tPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7Ik5vdGUifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLiJ9CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyIkRGF0YXsiT2JqZWN0TmFtZSJ9In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7Ik51bWJlciJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiTmFtZSJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiRm9ybWF0In08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJEZWxldGUifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IlN0YXJ0IEltcG9ydCJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiU3RhcnQgRXhwb3J0In08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpOb0RhdGFGb3VuZE1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJObyBkYXRhIGZvdW5kLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpOb0RhdGFGb3VuZE1zZyAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDE7VGVtcGxhdGVJRD0kTFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik51bWJlciJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJGb3JtYXROYW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJWYWxpZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJUcmFzaENhbiIgdGl0bGU9IkRlbGV0ZSBUZW1wbGF0ZSIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249VGVtcGxhdGVEZWxldGU7VGVtcGxhdGVJRD0kTFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGVsZXRlIFRlbXBsYXRlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPUltcG9ydEluZm9ybWF0aW9uO1RlbXBsYXRlSUQ9JExRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkltcG9ydCJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1FeHBvcnQ7VGVtcGxhdGVJRD0kTFFEYXRheyJUZW1wbGF0ZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRXhwb3J0In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQxIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTdGVwIn0gMSAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgY29tbW9uIGluZm9ybWF0aW9uIn06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJERhdGF7IlRlbXBsYXRlSUQifSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmFtZSI+JFRleHR7Ik5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIFZhbGlkYXRlX1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJOYW1lIiBjbGFzcz0iJERhdGF7Ik5hbWVDbGFzcyJ9IiB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjIwMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJOYW1lIGlzIHJlcXVpcmVkISJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiTmFtZSBpcyByZXF1aXJlZCEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOk5ld09iamVjdEZvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT2JqZWN0Ij4kVGV4dHsiT2JqZWN0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJPYmplY3RPcHRpb24ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iT2JqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiT2JqZWN0IGlzIHJlcXVpcmVkISJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPYmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJPYmplY3QgaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGb3JtYXQiPiRUZXh0eyJGb3JtYXQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkZvcm1hdE9wdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGb3JtYXRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJGb3JtYXQgaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZvcm1hdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IkZvcm1hdCBpcyByZXF1aXJlZCEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOk5ld09iamVjdEZvcm1hdCAtLT4KPCEtLSBkdGw6YmxvY2s6RWRpdE9iamVjdEZvcm1hdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJPYmplY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kUURhdGF7Ik9iamVjdE5hbWUifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik9iamVjdCIgdmFsdWU9IiRRRGF0YXsiT2JqZWN0In0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZvcm1hdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRRRGF0YXsiRm9ybWF0TmFtZSJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybWF0IiB2YWx1ZT0iJFFEYXRheyJGb3JtYXQifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVkaXRPYmplY3RGb3JtYXQgLS0+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj4kVGV4dHsiVmFsaWQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVmFsaWRPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPiRUZXh0eyJDb21tZW50In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDb21tZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjIwMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iU3VibWl0TmV4dCI+JFRleHR7Ik5leHQifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Im9yIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPSdPdmVydmlldyciPiRUZXh0eyJDYW5jZWwifSA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQxIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MiAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiU3RlcCJ9IDIgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IG9iamVjdCBpbmZvcm1hdGlvbiJ9OjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDIiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik5hbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJPYmplY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik9iamVjdCJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQyRWxlbWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iJERhdGF7IklEIn0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbnB1dFN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJERhdGF7IklEIn1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyIkRGF0YXsiRXJyb3JNZXNzYWdlIn0ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJERhdGF7IklEIn1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyIkRGF0YXsiRXJyb3JNZXNzYWdlIn0ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MkVsZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQmFjayIgdHlwZT0iYnV0dG9uIiBuYW1lPSJCYWNrIiA+JFRleHR7IkJhY2sifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iU3VibWl0TmV4dCIgPiRUZXh0eyJOZXh0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDIgLS0+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJTdGVwIn0gMyAkVGV4dHsib2YifSA1IC0gJFRleHR7IkVkaXQgZm9ybWF0IGluZm9ybWF0aW9uIn06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MyIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZvcm1hdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRm9ybWF0In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNFbGVtZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkRGF0YXsiSUQifSI+JFRleHR7IiREYXRheyJOYW1lIn0ifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IklucHV0U3RyZyJ9CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSIkRGF0YXsiSUQifUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IiREYXRheyJOYW1lIn0gaXMgcmVxdWlyZWQhIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IiREYXRheyJJRCJ9U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiJERhdGF7Ik5hbWUifSBpcyByZXF1aXJlZCEifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQzRWxlbWVudFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0M0VsZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQmFjayIgdHlwZT0iYnV0dG9uIiBuYW1lPSJCYWNrIiA+JFRleHR7IkJhY2sifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iU3VibWl0TmV4dCI+JFRleHR7Ik5leHQifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0MyAtLT4KCjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDQgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IlN0ZXAifSA0ICRUZXh0eyJvZiJ9IDUgLSAkVGV4dHsiRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uIn06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWFwSGVhZGVyUm93IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik9iamVjdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiT2JqZWN0TmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZvcm1hdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRm9ybWF0TmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU0IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSIgLz4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0VGFibGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIiPiRUZXh0eyIkRGF0YXsiSGVhZGVyIn0ifTwvdGg+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRUYWJsZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NE5vTWFwRm91bmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IiREYXRheyJDb2x1bW5zIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiTm8gbWFwIGVsZW1lbnRzIGZvdW5kLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDROb01hcEZvdW5kIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NENvbHVtbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbnB1dFN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRDb2x1bW4gLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRNYXBOdW1iZXJDb2x1bW4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0TWFwTnVtYmVyQ29sdW1uLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0VXBCdXR0b24tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dVcCJ0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdVcDo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJVcCJ9Ij4gJFRleHR7IlVwIn0gPC9idXR0b24+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDRVcEJ1dHRvbi0tPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Tm9VcEJ1dHRvbi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd1VwIiB0eXBlPSJzdWJtaXQiIGRpc2FibGVkPSJkaXNhYmxlZCI+ICRUZXh0eyJVcCJ9PC9idXR0b24+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDROb1VwQnV0dG9uLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDREb3duQnV0dG9uLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93RG93biIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRG93bjo6JFFEYXRheyJNYXBwaW5nSUQifSIgdmFsdWU9IiRUZXh0eyJEb3duIn0iPiAkVGV4dHsiRG93biJ9PC9idXR0b24+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDREb3duQnV0dG9uLS0+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDROb0Rvd25CdXR0b24tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dEb3duIiB0eXBlPSJzdWJtaXQiIGRpc2FibGVkPSJkaXNhYmxlZCI+ICRUZXh0eyJEb3duIn08L2J1dHRvbj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NE5vRG93bkJ1dHRvbi0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJUcmFzaENhbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRGVsZXRlOjokUURhdGF7Ik1hcHBpbmdJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4gJFRleHR7IkRlbGV0ZSJ9IDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVzEwMHBjIFNwYWNpbmdUb3BTbWFsbCBMZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiBpZD0iTWFwcGluZ0FkZCIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nQWRkIiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij48c3Bhbj4gJFRleHR7IkFkZCBNYXBwaW5nIEVsZW1lbnQifTwvc3Bhbj4gPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPiRUZXh0eyJCYWNrIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iU3VibWl0TmV4dCI+JFRleHR7Ik5leHQifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKCiAgICAvLyBmaW5kIHRoZSBuZXh0IGJ1dHRvbiBhbmQgZ2V0IHRoZSBmaXJzdCBjb2x1bW4gZHJvcGRvd24KICAgIHZhciAkTmV4dEJ1dHRvbiA9ICQoImJ1dHRvbi5QcmltYXJ5W25hbWU9J1N1Ym1pdE5leHQnXSIpLmZpcnN0KCksCiAgICAgICAgJEZpcnN0Q29sdW1uID0gJCgnI09iamVjdFxcOlxcOjBcXDpcXDpLZXknKTsKCiAgICAvLyBoYW5kbGUgY2hhbmdlcyB0byB0aGUgZmlyc3QgY29sdW1uIHNlbGVjdG9yCiAgICAkRmlyc3RDb2x1bW4uYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CgogICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiB3aXRoIGEgdmFsdWUKICAgIGlmICggJEZpcnN0Q29sdW1uLnZhbCgpICkgewogICAgICAgIC8vIHdlIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlCiAgICAgICAgJE5leHRCdXR0b24ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIHdlIGFkZCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlCiAgICAgICAgJE5leHRCdXR0b24uYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKICAgIH0KCn0pLnRyaWdnZXIoJ2NoYW5nZScpOwoKLy9dXT48L3NjcmlwdD4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+Cgo8IS0tIGR0bDpibG9jazpUZW1wbGF0ZUVkaXQ0IC0tPgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiU3RlcCJ9IDUgJFRleHR7Im9mIn0gNSAtICRUZXh0eyJFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbiJ9OjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTUiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJUZW1wbGF0ZSBOYW1lIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc3RyaWN0RXhwb3J0Ij4kVGV4dHsiUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJSZXN0cmljdEV4cG9ydFN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NUVsZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiREYXRheyJJRCJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRlbXBsYXRlRWRpdDVFbGVtZW50IC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPiRUZXh0eyJCYWNrIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiPiRUZXh0eyJGaW5pc2gifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGVtcGxhdGVFZGl0NSAtLT4KCjwhLS0gZHRsOmJsb2NrOkltcG9ydEluZm9ybWF0aW9uIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJJbXBvcnQgaW5mb3JtYXRpb24ifTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJbXBvcnQiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9IiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj4kVGV4dHsiTmFtZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj4kVGV4dHsiU291cmNlIEZpbGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iU291cmNlRmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN0YXJ0IEltcG9ydCJ9Ij4kVGV4dHsiU3RhcnQgSW1wb3J0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkltcG9ydEluZm9ybWF0aW9uIC0tPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICAgICAkKCdidXR0b24uQmFjaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gIiRFbnZ7IkJhc2VsaW5rIn0kUURhdGF7IkJhY2tVUkwifSI7CiAgICAgICAgfSk7CiAgICAvL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRNZXRob2QoIlZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvIiwgZnVuY3Rpb24oVmFsdWUsIEVsZW1lbnQpIHsKICAgICAgICB2YXIgTnVtYmVyID0gcGFyc2VJbnQoVmFsdWUsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoTnVtYmVyID4gMCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIH0pOwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRNZXRob2QoIlZhbGlkYXRlX051bWJlckludGVnZXIiLCBmdW5jdGlvbihWYWx1ZSwgRWxlbWVudCkgewogICAgICAgIHJldHVybiAoVmFsdWUubWF0Y2goL15bMC05XSskLykpID8gdHJ1ZSA6IGZhbHNlOwoKICAgIH0pOwoKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyIsIHsgVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm86IHRydWUgfSk7CiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVySW50ZWdlciIsIHsgVmFsaWRhdGVfTnVtYmVySW50ZWdlcjogdHJ1ZSB9KTsKICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyQmlnZ2VyVGhhblplcm8iLCB7IFZhbGlkYXRlX051bWJlckludGVnZXI6IHRydWUsIFZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvOiB0cnVlIH0pOwoKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgoKPC9kaXY+Cgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KCjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdCAtLT4KPGRpdiBjbGFzcz0iTWFpbkJveCBBcmlhUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iVzUwcGMgU3BhY2luZ1RvcExhcmdlIFNwYWNpbmdCb3R0b21MYXJnZSBDZW50ZXJCb3giPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkltcG9ydCBzdW1tYXJ5IGZvciJ9ICRRRGF0YXsiT2JqZWN0In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ik92ZXJ2aWV3Ii8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJSZWNvcmRzIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPiRRRGF0YXsiQ291bnRlciJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiU3VjY2VzcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiU3VjY2VzcyJ9CjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdFJldHVybkNvZGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJFRleHR7IiREYXRheyJSZXR1cm5Db2RlTmFtZSJ9In06ICRRRGF0YXsiUmV0dXJuQ29kZUNvdW50In0pCjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdFJldHVybkNvZGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZhaWxlZCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4kUURhdGF7IkZhaWxlZCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdER1cGxpY2F0ZU5hbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkR1cGxpY2F0ZSBuYW1lcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4kUURhdGF7IkR1cGxpY2F0ZU5hbWVzIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbXBvcnRSZXN1bHREdXBsaWNhdGVOYW1lcyAtLT4KCjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ikxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPiRRRGF0YXsiTGFzdExpbmVOdW1iZXIifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIC0tPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJDZW50ZXIgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik9rIiB2YWx1ZT0iJFRleHR7Ik9rIn0iPiRUZXh0eyJPayJ9PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW1wb3J0UmVzdWx0IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQgLSBpbXBvcnQsIGV4cG9ydCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+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+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17T2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgJwogICAgICAgICAgICAgICAgLiAnKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gRm9ybWF0TGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7Cgo9Y3V0CgpzdWIgRm9ybWF0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBmb3JtYXQgbGlzdAogICAgbXkgJEZvcm1hdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRGb3JtYXRMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRGb3JtYXRMaXN0Owp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhIGZvcm1hdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICJLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjokVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRGb3JtYXREYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWl0ZW0gRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGb3JtYXREYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtGb3JtYXREYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte0Zvcm1hdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfZm9ybWF0ICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEZvcm1hdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIG1hcHBpbmcgZGF0YSBpZHMgc29ydGVkIGJ5IHBvc2l0aW9uIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPyBPUkRFUiBCWSBwb3NpdGlvbicsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATWFwcGluZ0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQE1hcHBpbmdMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQE1hcHBpbmdMaXN0Owp9Cgo9aXRlbSBNYXBwaW5nQWRkKCkKCmFkZCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CgogICAgbXkgJE1hcHBpbmdJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdBZGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbmQgbWF4aW11bSBwb3NpdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBtYXgocG9zaXRpb24pIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5ld1Bvc2l0aW9uID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIGlmICggZGVmaW5lZCAkUm93WzBdICkgewogICAgICAgICAgICAkTmV3UG9zaXRpb24gPSAkUm93WzBdOwogICAgICAgICAgICAkTmV3UG9zaXRpb24rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBpbnNlcnQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nICh0ZW1wbGF0ZV9pZCwgcG9zaXRpb24pIFZBTFVFUyAoPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCROZXdQb3NpdGlvbiBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE1hcHBpbmdJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRNYXBwaW5nSUQ7Cn0KCj1pdGVtIE1hcHBpbmdEZWxldGUoKQoKZGVsZXRlIGV4aXN0aW5nIG1hcHBpbmcgZGF0YSByb3dzCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte01hcHBpbmdJRH0gKSB7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIG9uZSBtYXBwaW5nIHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWJ1aWxkIG1hcHBpbmcgcG9zaXRpb25zCiAgICAgICAgJFNlbGYtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIHJvd3Mgb2YgdGhpcyB0ZW1wbGF0ZQogICAgICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBNYXBwaW5nVXAoKQoKbW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IHVwCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nVXAoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nVXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+WzBdOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhJFBvc2l0aW9uOwoKICAgIG15ICRQb3NpdGlvblVwcGVyID0gJFBvc2l0aW9uIC0gMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uVXBwZXIgXSwKICAgICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb25VcHBlciwgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nRG93bigpCgptb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgZG93bgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Rvd24oCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRG93biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bLTFdOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uRG93biBdLAogICAgKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvbkRvd24sIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgpCgpyZWJ1aWxkIHRoZSBwb3NpdGlvbnMgb2YgYSBtYXBwaW5nIGxpc3QKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIHBvc2l0aW9uCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDb3VudGVyLCBcJE1hcHBpbmdJRCBdLAogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtNYXBwaW5nSUR9ICkgewogICAgICAgICRQYXJhbXtNYXBwaW5nSUR9ID0gWyAkUGFyYW17TWFwcGluZ0lEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte01hcHBpbmdJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ09iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdPYmplY3REYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nT2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgb2JqZWN0IHJvdwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+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+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17TWFwcGluZ0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17TWFwcGluZ0Zvcm1hdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSBtYXBwaW5nIGZvcm1hdCByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKG1hcHBpbmdfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhR2V0KCkKCmdldCB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgbWFwcGluZ19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlTWFwcGluZ0Zvcm1hdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nRm9ybWF0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVNYXBwaW5nRm9ybWF0RGF0YTsKfQoKPWl0ZW0gU2VhcmNoQXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzIG9mIGEgb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gIktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OiRUZW1wbGF0ZURhdGEtPntPYmplY3R9IiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBzZWFyY2ggYXR0cmlidXRlIGxpc3Qgb2YgYW4gb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gU2VhcmNoRGF0YUdldCgpCgpnZXQgdGhlIHNlYXJjaCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRTZWFyY2hEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VhcmNoRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlYXJjaERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoRGF0YTsKfQoKPWl0ZW0gU2VhcmNoRGF0YVNhdmUoKQoKc2F2ZSB0aGUgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgU2VhcmNoRGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgU2VhcmNoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2hEYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtTZWFyY2hEYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtTZWFyY2hEYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgISREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfc2VhcmNoICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFNlYXJjaERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBFeHBvcnQoKQoKZXhwb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKcmV0dXJucyBzb21ldGhpbmcgbGlrZQoKICAgICRSZXN1bHRSZWYgPSB7CiAgICAgICAgU3VjY2VzcyAgID0+IDIsCiAgICAgICAgRmFpbGVkICAgID0+IDAsCiAgICAgICAgRGVzdGluYXRpb25Db250ZW50ID0+IFsKICAgICAgICAgICAgWyAnQXR0cl8xYScsICdBdHRyXzFiJywgJ0F0dHJfMWMnLCBdLAogICAgICAgICAgICBbICdBdHRyXzJhJywgJ0F0dHJfMmInLCAnQXR0cl8zYycsIF0sCiAgICAgICAgXSwKICAgIH07Cgo9Y3V0CgpzdWIgRXhwb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGV4cG9ydCBkYXRhCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgaWYgY29sdW1uIGhlYWRlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQKICAgIGlmICggJEZvcm1hdERhdGEtPntJbmNsdWRlQ29sdW1uSGVhZGVyc30gKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzICh0aGUgbmFtZSBvZiB0aGUgY29sdW1ucykKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgbG9va3VwIGhhc2ggZm9yIHRoZSBvYmplY3QgYXR0cmlidXRlIG5hbWVzCiAgICAgICAgbXkgJUF0dHJpYnV0ZUxvb2t1cAogICAgICAgICAgICA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcy0+WzBdLT57SW5wdXR9LT57RGF0YX0gfTsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMKICAgICAgICBteSBAQ29sdW1uTmFtZXM7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lCiAgICAgICAgICAgIG15ICRDb2x1bW5OYW1lID0gJEF0dHJpYnV0ZUxvb2t1cHsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9OwoKICAgICAgICAgICAgcHVzaCBAQ29sdW1uTmFtZXMsICRDb2x1bW5OYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY29sdW1uIGhlYWRlcnMgYXMgZmlyc3Qgcm93CiAgICAgICAgdW5zaGlmdCBAeyRFeHBvcnREYXRhfSwgXEBDb2x1bW5OYW1lczsKICAgIH0KCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9PiAwLAogICAgICAgIEZhaWxlZCAgICAgICAgICAgICA9PiAwLAogICAgICAgIERlc3RpbmF0aW9uQ29udGVudCA9PiBbXSwKICAgICk7CgogICAgRVhQT1JUREFUQVJPVzoKICAgIGZvciBteSAkRXhwb3J0RGF0YVJvdyAoIEB7JEV4cG9ydERhdGF9ICkgewoKICAgICAgICAjIGV4cG9ydCBvbmUgcm93CiAgICAgICAgbXkgJERlc3RpbmF0aW9uQ29udGVudFJvdyA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gJEV4cG9ydERhdGFSb3csCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkRGVzdGluYXRpb25Db250ZW50Um93ICkgewogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICAgICAgbmV4dCBFWFBPUlREQVRBUk9XOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgcm93IHRvIGRlc3RpbmF0aW9uIGNvbnRlbnQKICAgICAgICBwdXNoIEB7ICRSZXN1bHR7RGVzdGluYXRpb25Db250ZW50fSB9LCAkRGVzdGluYXRpb25Db250ZW50Um93OwogICAgICAgICRSZXN1bHR7U3VjY2Vzc30rKzsKICAgIH0KCiAgICAjIGxvZyByZXN1bHQKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtGYWlsZWR9IHJlY29yZHMgKCRUZW1wbGF0ZURhdGEtPntPYmplY3R9KTogZmFpbGVkISIsCiAgICApOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e1N1Y2Nlc3N9IHJlY29yZHMgKCRUZW1wbGF0ZURhdGEtPntPYmplY3R9KTogc3VjY2Vzc2Z1bCEiLAogICAgKTsKCiAgICByZXR1cm4gXCVSZXN1bHQ7Cn0KCj1pdGVtIEltcG9ydCgpCgppbXBvcnQgZnVuY3Rpb24KCiAgICBteSAkUmVzdWx0UmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+SW1wb3J0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFN0cmluZ1JlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e09iamVjdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAiS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0iLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRGb3JtYXRCYWNrZW5kOwoKICAgICMgZ2V0IGltcG9ydCBkYXRhCiAgICBteSAkSW1wb3J0RGF0YSA9ICRGb3JtYXRCYWNrZW5kLT5JbXBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFBhcmFte1NvdXJjZUNvbnRlbnR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEltcG9ydERhdGE7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpZiBjb2x1bW4gaGVhZGVycyBhcmUgYWN0aXZhdGVkLCB0aGUgZmlyc3Qgcm93IG11c3QgYmUgcmVtb3ZlZAogICAgaWYgKCAkRm9ybWF0RGF0YS0+e0luY2x1ZGVDb2x1bW5IZWFkZXJzfSApIHsKICAgICAgICBzaGlmdCBAeyRJbXBvcnREYXRhfTsKICAgIH0KCiAgICAjIE51bWJlciBvZiBzdWNjZXNzZnVsbHkgYW5kIG5vdCBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQgcm93cwogICAgbXkgJVJlc3VsdCA9ICgKICAgICAgICBPYmplY3QgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICBGYWlsZWQgID0+IDAsCiAgICAgICAgUmV0Q29kZSA9PiB7fSwKICAgICAgICBDb3VudGVyID0+IDAsCiAgICApOwogICAgSU1QT1JUREFUQVJPVzoKICAgIGZvciBteSAkSW1wb3J0RGF0YVJvdyAoIEB7JEltcG9ydERhdGF9ICkgewoKICAgICAgICAkUmVzdWx0e0NvdW50ZXJ9Kys7CgogICAgICAgICMgaW1wb3J0IGEgc2luZ2xlIHJvdwogICAgICAgIG15ICggJElELCAkUmV0Q29kZSApID0gJE9iamVjdEJhY2tlbmQtPkltcG9ydERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAkSW1wb3J0RGF0YVJvdywKICAgICAgICAgICAgQ291bnRlciAgICAgICA9PiAkUmVzdWx0e0NvdW50ZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRJRCApIHsKCiAgICAgICAgICAgICMgY291bnQgRHVwbGljYXRlTmFtZSBlbnRyaWVzIGFzIGVycm9ycwogICAgICAgICAgICBpZiAoICRSZXRDb2RlICYmICRSZXRDb2RlID1+IG17IFxBIER1cGxpY2F0ZU5hbWUgfXhtcyApIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVzdWx0e0ZhaWxlZH0rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0rKzsKICAgICAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvZyByZXN1bHQKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0e0NvdW50ZXJ9ICRSZXN1bHR7T2JqZWN0fSByZWNvcmRzOiAiCiAgICAgICAgICAgIC4gIiRSZXN1bHR7RmFpbGVkfSBmYWlsZWQsICRSZXN1bHR7U3VjY2Vzc30gc3VjY2VlZGVkIiwKICAgICk7CiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdHtSZXRDb2RlfSB9ICkgewogICAgICAgIG15ICRDb3VudCA9ICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdHtDb3VudGVyfSAkUmVzdWx0e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlIiwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUmVzdWx0e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGU6ICRSZXN1bHR7Q291bnRlcn0iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGltcG9ydC9leHBvcnQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPl9Mb2FkQmFja2VuZCgKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlRpY2tldCcsCiAgICApOwoKQW4gaW5zdGFuY2Ugb2YgdGhlIGxvYWRlZCBiYWNrZW5kIG1vZHVsZSBpcyByZXR1cm5lZC4KCj1jdXQKCnN1YiBfTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtNb2R1bGV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtNb2R1bGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFBhcmFte01vZHVsZX0tPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRTZWxmLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgSW1wb3J0RXhwb3J0T2JqZWN0ID0+ICRJbXBvcnRFeHBvcnRPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBJbXBvcnRFeHBvcnRPYmplY3QpKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGFyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICAgICAgQ29tbWEgICAgID0+ICcsJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRGb3JtYXRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgICAgIE5hbWUgID0+ICdDb2x1bW4gU2VwYXJhdG9yJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiAnQ29sb24gKDopJywKICAgICAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiAnQ29tbWEgKCwpJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSW5jbHVkZUNvbHVtbkhlYWRlcnMnLAogICAgICAgICAgICBOYW1lICA9PiAnSW5jbHVkZSBDb2x1bW4gSGVhZGVycycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgMSA9PiAnWWVzJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBtYXBwaW5nIGF0dHJpYnV0ZXMgb2YgYW4gZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIEltcG9ydERhdGFHZXQoKQoKZ2V0IGltcG9ydCBkYXRhIGFzIDJELWFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW10gaWYgIWRlZmluZWQgJFBhcmFte1NvdXJjZUNvbnRlbnR9OwoKICAgICMgY2hlY2sgc291cmNlIGNvbnRlbnQKICAgIGlmICggcmVmICRQYXJhbXtTb3VyY2VDb250ZW50fSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvdXJjZUNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CiAgICAkQ2hhcnNldCA9fiBzeyBccyogKHV0Zi04fHV0ZjgpIFxzKiB9e1VURi04fXhtc2k7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAhJENoYXJzZXQgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgIyBjcmVhdGUgYW4gaW4gbWVtb3J5IHRlbXAgZmlsZSBhbmQgb3BlbiBpdAogICAgbXkgJEZpbGVDb250ZW50ID0gJyc7CiAgICBvcGVuIG15ICRGSCwgJys8JywgXCRGaWxlQ29udGVudDsgICAgIyMgbm8gY3JpdGljCgogICAgIyB3cml0ZSBzb3VyY2UgY29udGVudAogICAgcHJpbnQgJEZIICR7ICRQYXJhbXtTb3VyY2VDb250ZW50fSB9OwoKICAgICMgcmV3aW5kIGZpbGUgaGFuZGxlCiAgICBzZWVrICRGSCwgMCwgMDsKCiAgICAjIHBhcnNlIHRoZSBjb250ZW50CiAgICBteSAkTGluZUNvdW50ID0gMTsKICAgIG15IEBJbXBvcnREYXRhOwoKICAgICMgaXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGlzIHN5bnRheCAid2hpbGUgKCAhZW9mKCRGSCkgKSIKICAgICMgYXMgdGhlIENQQU4gbW9kdWxlIFRleHQ6OkNTVl9YUyBtaWdodCBzaG93IGVycm9ycyBpZiB0aGUKICAgICMgZ2V0bGluZSBjYWxsIGlzIHdpdGhpbiB0aGUgd2hpbGUgdGVzdAogICAgIyBoYXZlIGEgbG9vayBhdCBodHRwOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTI3MAogICAgd2hpbGUgKCAhZW9mKCRGSCkgKSB7CiAgICAgICAgbXkgJENvbHVtbiA9ICRQYXJzZU9iamVjdC0+Z2V0bGluZSgkRkgpOwogICAgICAgIHB1c2ggQEltcG9ydERhdGEsICRDb2x1bW47CiAgICAgICAgJExpbmVDb3VudCsrOwogICAgfQoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIG15ICggJFBhcnNlRXJyb3JDb2RlLCAkUGFyc2VFcnJvclN0cmluZyApID0gJFBhcnNlT2JqZWN0LT5lcnJvcl9kaWFnKCk7CiAgICBpZiAoJFBhcnNlRXJyb3JDb2RlKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbXBvcnRFcnJvciBhdCBsaW5lICRMaW5lQ291bnQsICIKICAgICAgICAgICAgICAgIC4gIkVycm9yQ29kZTogJFBhcnNlRXJyb3JDb2RlICckUGFyc2VFcnJvclN0cmluZycgIiwKICAgICAgICApOwogICAgfQoKICAgICMgY2xvc2UgdGhlIGluIG1lbW9yeSBmaWxlIGhhbmRsZQogICAgY2xvc2UgJEZIOwoKICAgIHJldHVybiBcQEltcG9ydERhdGEgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIGZvciBteSAkUm93IChASW1wb3J0RGF0YSkgewogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgIEVuY29kZTo6X3V0Zjhfb24oJENlbGwpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBJbXBvcnREYXRhOwp9Cgo9aXRlbSBFeHBvcnREYXRhU2F2ZSgpCgpleHBvcnQgb25lIHJvdyBvZiB0aGUgZXhwb3J0IGRhdGEKCiAgICBteSAkRGVzdGluYXRpb25Db250ZW50ID0gJEZvcm1hdEJhY2tlbmQtPkV4cG9ydERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIEV4cG9ydERhdGFSb3cgPT4gJEFycmF5UmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBFeHBvcnREYXRhUm93IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBleHBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtFeHBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRXhwb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9ybWF0IGRhdGEKICAgIGlmICggISRGb3JtYXREYXRhIHx8IHJlZiAkRm9ybWF0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmb3JtYXQgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgbXkgJENoYXJzZXQgPSAkRm9ybWF0RGF0YS0+e0NoYXJzZXR9IHx8PSAnJzsKICAgICRDaGFyc2V0ID1+IHN7IFxzKiAodXRmLTh8dXRmOCkgXHMqIH17VVRGLTh9eG1zaTsKCiAgICAjIGNoZWNrIHRoZSBjaGFyc2V0CiAgICBpZiAoICEkQ2hhcnNldCApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBjaGFyc2V0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjaGFyc2V0CiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAhJFBhcnNlT2JqZWN0LT5jb21iaW5lKCBAeyAkUGFyYW17RXhwb3J0RGF0YVJvd30gfSApICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbWJpbmUgdGhlIGV4cG9ydCBkYXRhIHRvIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIENTViBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkUGFyc2VPYmplY3QtPnN0cmluZygpOwoKICAgIHJldHVybiAkU3RyaW5nIGlmICRDaGFyc2V0IG5lICdVVEYtOCc7CgogICAgIyBzZXQgdXRmOCBmbGFnCiAgICBFbmNvZGU6Ol91dGY4X29uKCRTdHJpbmcpOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+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+e0FkZH0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIHRlbXBsYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCB0ZW1wbGF0ZSBpZCB2YXJhaWJsZQogICAgICAgIGlmICggISRBZGRlZFRlbXBsYXRlSURzWy0xXSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTi4gUGxlYXNlIGFkZCBhIHRlbXBsYXRlIGZpcnN0LiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbGFzdCBURU1QTEFURTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9IHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkVGVtcGxhdGVBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntVcGRhdGVHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUdldC0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVHZXQoKSAtICRUZW1wbGF0ZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CmNvbnRpbnVlIHsKCiAgICAjIGluY3JlbWVudCB0aGUgY291bnRlcgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMSAoY2hlY2sgYXJyYXkgcmVmZXJlbmNlcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBsaXN0IG11c3QgYmUgYW4gZW1wdHkgYXJyYXkgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRUZW1wbGF0ZUxpc3QxQWxsIGVxICdBUlJBWScgJiYgcmVmICRUZW1wbGF0ZUxpc3QxT2JqZWN0IGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGFycmF5IHJlZmVyZW5jZXMiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGxpc3QgbXVzdCBiZSBlbXB0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBsaXN0IG11c3QgYmUgYW4gZW1wdHkgbGlzdAokU2VsZi0+VHJ1ZSgKICAgIHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QxT2JqZWN0fSBlcSAwLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBlbXB0eSBsaXN0IiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAyIChjaGVjayBjb3JyZWN0IG51bWJlciBvZiBuZXcgaXRlbXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlTGlzdDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRUZW1wbGF0ZUxpc3QyIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGFycmF5IHJlZmVyZW5jZSIsCik7CgpteSAkVGVtcGxhdGVMaXN0Q291bnQgPSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0Mn0gLSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MUFsbH07CgojIGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcwokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZUxpc3RDb3VudCBlcSBzY2FsYXIgQEFkZGVkVGVtcGxhdGVJRHMsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAxIChhZGQgb25lIHRlbXBsYXRlIGFuZCBkZWxldGUgaXQpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgYWRkIGEgdGVzdCB0ZW1wbGF0ZQpteSAkVGVtcGxhdGVEZWxldGVJRCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVs0XSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QyID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGhhdmUgb25lIG1vcmUgZWxlbWVudAokU2VsZi0+VHJ1ZSgKICAgIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0MX0gZXEgKCBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDJ9ICkgLSAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKIyBkZWxldGUgdGhlIG5ldyB0ZW1wbGF0ZQpteSAkVGVtcGxhdGVEZWxldGUxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGVsZXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBzdWNjZXNzZnVsbAokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZURlbGV0ZTEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIiwKKTsKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGhhdmUgdGhlIG9yaWdpbmFsIG51bWJlciBvZiBlbGVtZW50cwokU2VsZi0+VHJ1ZSgKICAgIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0MX0gZXEgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QzfSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgLSBudW1iZXIgb2YgbGlzdGVkIGVsZW1lbnRzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZURlbGV0ZSB0ZXN0IDIgKGRlbGV0ZSBhbGwgdW5pdHRlc3QgdGVtcGxhdGVzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJFRlbXBsYXRlSUQgKEBBZGRlZFRlbXBsYXRlSURzKSB7CgogICAgIyBkZWxldGUgdGhlIHRlbXBsYXRlCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgc3VjY2VzcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSBUZW1wbGF0ZUlEICRUZW1wbGF0ZUlEIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRPYmplY3RMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3RPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgojIHNldCB0ZXN0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRPYmplY3RMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRPYmplY3RMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskT2JqZWN0TGlzdDF9ICkgewoKICAgIGlmICggISRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJE9iamVjdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRPYmplY3RMaXN0MS0+eyRLZXl9IG5lICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJE9iamVjdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskT2JqZWN0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBvYmplY3QgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRGb3JtYXRMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3RPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgojIHNldCB0ZXN0IGxpc3QKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskRm9ybWF0TGlzdDF9ICkgewoKICAgIGlmICggISRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRGb3JtYXRMaXN0MS0+eyRLZXl9IG5lICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskRm9ybWF0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgbGlzdAokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgoxOwo=
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWOwoKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntGb3JtYXRCYWNrZW5kT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVi0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGhvbWUgZGlyZWN0b3J5CiRTZWxmLT57SG9tZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKIyBhZGQgc29tZSB0ZXN0IHRlbXBsYXRlcyBmb3IgbGF0ZXIgY2hlY2tzCm15IEBUZW1wbGF0ZUlEczsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgojIGNoZWNrIGZvcm1hdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdExpc3QxICYmIHJlZiAkRm9ybWF0TGlzdDEgZXEgJ0hBU0gnICYmICRGb3JtYXRMaXN0MS0+e0NTVn0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBDU1YgZXhpc3RzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ29sdW1uU2VwYXJhdG9yJywKICAgICAgICBOYW1lICA9PiAnQ29sdW1uIFNlcGFyYXRvcicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRhYnVsYXRvciA9PiAnVGFidWxhdG9yIChUQUIpJywKICAgICAgICAgICAgICAgIFNlbWljb2xvbiA9PiAnU2VtaWNvbG9uICg7KScsCiAgICAgICAgICAgICAgICBDb2xvbiAgICAgPT4gJ0NvbG9uICg6KScsCiAgICAgICAgICAgICAgICBEb3QgICAgICAgPT4gJ0RvdCAoLiknLAogICAgICAgICAgICAgICAgQ29tbWEgICAgID0+ICdDb21tYSAoLCknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICBOYW1lICA9PiAnQ2hhcnNldCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJ1VURi04JywKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMjAsCiAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnSW5jbHVkZUNvbHVtbkhlYWRlcnMnLAogICAgICAgIE5hbWUgID0+ICdJbmNsdWRlIENvbHVtbiBIZWFkZXJzJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAgICAgMSA9PiAnWWVzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgIH0sCiAgICB9LApdOwoKIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgojIGR1bXAgdGhlIGxpc3QgZnJvbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgYW5kIHRoZSByZWZlcmVuY2UgdGFibGUKIyMgbm8gY3JpdGljCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDEpOwpteSAkRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJEZvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlKTsKIyMgdXNlIGNyaXRpYwoKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgIE5hbWUgID0+ICdDb2x1bW4nLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0RUTCcsCiAgICAgICAgICAgIERhdGEgICAgID0+ICckUURhdGF7IkNvdW50ZXIifScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgYW5kIHRoZSByZWZlcmVuY2UgdGFibGUKIyMgbm8gY3JpdGljCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSk7Cm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSk7CiMjIHVzZSBjcml0aWMKCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gYXR0cmlidXRlcyBvZiB0aGUgcm93IGFyZSBpZGVudGljYWwiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG1hcHBpbmcgZm9ybWF0IGF0dHJpYnV0ZXMKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+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==
IyAtLQojIEltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0OyAgICAjIyBubyBjcml0aWMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpJbXBvcnRFeHBvcnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJbXBvcnRFeHBvcnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAyLjAuMy4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUJlZm9yZV8yXzBfMygpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUJlZm9yZV8yXzBfMyB7ICAgICMjIG5vIGNyaXRpYwogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGZpeCBhIHR5cG8gaW4gdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+X0ZpeERhdGFiYXNlVHlwbygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0ZpeERhdGFiYXNlVHlwbygpCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRml4RGF0YWJhc2VUeXBvKCk7Cgo9Y3V0CgpzdWIgX0ZpeERhdGFiYXNlVHlwbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZml4IHRoZSBDb2x1bW5TZXBlcmF0b3IgdHlwbyAoY29ycmVjdCBpcyBDb2x1bW5TZXBhcmF0b3IpCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9mb3JtYXQgIgogICAgICAgICAgICAuICJTRVQgZGF0YV9rZXkgPSAnQ29sdW1uU2VwYXJhdG9yJyAiCiAgICAgICAgICAgIC4gIldIRVJFIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGVyYXRvciciLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXAucG5nKTsKfQoKYnV0dG9uLkFycm93VXBbZGlzYWJsZWQ9ImRpc2FibGVkIl0gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXBfZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKYnV0dG9uLkFycm93RG93biB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
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==