CustomerCompanyImportExport 1.1.0 c.a.p.e. IT GmbH http://www.cape-it.de/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 CR: changes for use with OTRS 3.0.x. 2008-09-19 v0.0.0 Absolutely new package. Provides ImportExportBackend for CustomerCompany. Stellt ImportExport-Backend fuer Kundenfirmeneintraege zur Verfuegung. 3.0.x <br> WELCOME<br> <br> You are about to install the OTRS module CustomerCompanyImportExport.<br> <br> REQUIRED OTRS PACKAGES <ul> <li>ImportExport 2.1.91</li> </ul> <br> <br> c.a.p.e. IT ...global consulting - individual solutions.<br> <br> <br> The package has been installed. Your configuration has been changed.<br> <br> ImportExport my $FunctionName = 'CodeInstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeUpgrade'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeUninstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeReinstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } 2011-02-16 13:51:57 cvs.intra.cape-it.de PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEN1c3RvbWVyQ29tcGFueUltcG9ydEV4cG9ydC54bWwsdiAxLjEgMjAxMC0wNC0wNiAxNDozMjo0MyByYWJvIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNDdXN0b21lckNvbXBhbnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5PYmplY3QgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+T2JqZWt0LUJhY2tlbmQgTW9kdWwgUmVnaXN0cmF0aW9uIGRlcyBJbXBvcnQvRXhwb3J0IE1vZHVscy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JbXBvcnRFeHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5PYmplY3RCYWNrZW5kOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpDdXN0b21lckNvbXBhbnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkN1c3RvbWVyQ29tcGFueTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDdXN0b21lclVzZXJJbXBvcnQ6OkRlZmF1bHRDdXN0b21lcklEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB3aGljaCBjdXN0b21lciBJRCB0byB1c2UgaWYgbm8gY29tcGFueSBkZWZpbmVkIC0gb25seSByZWxldmFudCBmb3IgbmV3IGN1c3RvbWVyIHVzZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgd2VsY2hlIEt1bmRlbi1JRCBnZW51dHp0IHdpcmQsIGZhbGxzIG5pY2h0IGluIE1hcHBpbmcgZGVmaW5pZXJ0IC0gbnVyIGZ1ZXIgbmV1ZSBLdW5kZW5udXR6ZXJlaW50cmFlZ2UgcmVsZXZhbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q3VzdG9tZXJDb21wYW55SW1wb3J0RXhwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5YTVBMQ3VzdG9tZXJJRDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCjwvb3Ryc19jb25maWc+Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvQ3VzdG9tZXJDb21wYW55LnBtCiMKIy0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDdXN0b21lckNvbXBhbnkKIwojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IEN1c3RvbWVyQ29tcGFueS5wbSx2IDEuNSAyMDExLTAyLTE2IDEyOjQ1OjU3IHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpDdXN0b21lckNvbXBhbnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpDdXN0b21lckNvbXBhbnkgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIEN1c3RvbWVyVXNlcgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IEN1c3RvbWVyQ29tcGFueSBlbnRyaWVzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpDdXN0b21lckNvbXBhbnk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OkN1c3RvbWVyQ29tcGFueS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEltcG9ydEV4cG9ydE9iamVjdCA9PiAkSW1wb3J0RXhwb3J0T2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2NoZWNrIHJlcXVpcmVkIG9iamVjdHMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgSW1wb3J0RXhwb3J0T2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCggJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9ICkgKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9ID0KICAgICAgICAgICAgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueS0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgIGlmICggISRTZWxmLT57VmFsaWRPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkT2JqZWN0QmFja2VuZC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9CiAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVWYWxpZGxpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTGFiZWxFeHBvcnQnLAogICAgICAgICAgICBOYW1lICA9PiAnRXhwb3J0IHdpdGggbGFiZWxzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICcwJyA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgICcxJyA9PiAnWWVzJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0RlZmF1bHRWYWxpZCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdEZWZhdWx0IFZhbGlkaXR5JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVmFsaWRsaXN0LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIG1hcHBpbmcgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQEVsZW1lbnRMaXN0ID0gcXd7fTsKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyQ29tcGFueScpLT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckNvbXBhbnknKS0+e0tleX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJDb21wYW55LT5DdXN0b21lckNvbXBhbnlLZXkgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyQ29tcGFueScpLT57TWFwfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPk1hcCBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CgogICAgZm9yIG15ICRDdXJyQXR0cmlidXRlTWFwcGluZyAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSB9ICkgewogICAgICAgIG15ICRDdXJyQXR0cmlidXRlID0gewogICAgICAgICAgICBLZXkgICA9PiAkQ3VyckF0dHJpYnV0ZU1hcHBpbmctPlswXSwKICAgICAgICAgICAgVmFsdWUgPT4gJEN1cnJBdHRyaWJ1dGVNYXBwaW5nLT5bMF0sCiAgICAgICAgfTsKCiAgICAgICAgIyBpZiBWYWxpZElEIGlzIGF2YWlsYWJsZSAtIG9mZmVyIFZhbGlkIGluc3RlYWQuLgogICAgICAgIGlmICggJEN1cnJBdHRyaWJ1dGVNYXBwaW5nLT5bMF0gZXEgJ1ZhbGlkSUQnICkgewogICAgICAgICAgICAkQ3VyckF0dHJpYnV0ZSA9IHsgS2V5ID0+ICdWYWxpZCcsIFZhbHVlID0+ICdWYWxpZGl0eScsIH07CiAgICAgICAgfQoKICAgICAgICBwdXNoKCBARWxlbWVudExpc3QsICRDdXJyQXR0cmlidXRlICk7CgogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0tleScsCiAgICAgICAgICAgIE5hbWUgID0+ICdLZXknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBFbGVtZW50TGlzdCwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBOYW1lICA9PiAnSWRlbnRpZmllcicsCiAgICAgICAgICAgIElucHV0ID0+IHsgVHlwZSA9PiAnQ2hlY2tib3gnLCB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gU2VhcmNoQXR0cmlidXRlc0dldCgpCgpnZXQgdGhlIHNlYXJjaCBvYmplY3QgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlTGlzdCA9ICRPYmplY3RCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybjsKfQoKPWl0ZW0gRXhwb3J0RGF0YUdldCgpCgpnZXQgZXhwb3J0IGRhdGEgYXMgMkQtYXJyYXktaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRXhwb3J0RGF0YSA9ICRPYmplY3RCYWNrZW5kLT5FeHBvcnREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIG1hcHBpbmcgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBtYXBwaW5nIGxpc3QKICAgIGlmICggISRNYXBwaW5nTGlzdCB8fCByZWYgJE1hcHBpbmdMaXN0IG5lICdBUlJBWScgfHwgIUB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9CiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICggISRNYXBwaW5nT2JqZWN0RGF0YSB8fCByZWYgJE1hcHBpbmdPYmplY3REYXRhIG5lICdIQVNIJyApIHsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoKCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YSApOwogICAgfQoKICAgICMgbGlzdCBjdXN0b21lciBjb21wYW55cy4uLgogICAgbXkgJUN1c3RvbWVyQ29tcGFueUxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUxpc3QoKTsKCiAgICBteSBARXhwb3J0RGF0YTsKCiAgICAjIGV4cG9ydCBoZWFkbGluZS9sYWJlbHMgLi4uCiAgICBpZiAoICRPYmplY3REYXRhLT57TGFiZWxFeHBvcnR9ICkgewogICAgICAgIG15IEBDdXJyUm93ID0gcXd7fTsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3QgKEBNYXBwaW5nT2JqZWN0TGlzdCkgewogICAgICAgICAgICBwdXNoKCBAQ3VyclJvdywgJE1hcHBpbmdPYmplY3QtPntLZXl9IHx8ICctJyApOwogICAgICAgIH0KICAgICAgICBwdXNoIEBFeHBvcnREYXRhLCBcQEN1cnJSb3c7CiAgICB9CgogICAgZm9yIG15ICRDdXJyQ29tcGFueSAoJUN1c3RvbWVyQ29tcGFueUxpc3QpIHsKCiAgICAgICAgbXkgJUN1c3RvbWVyQ29tcGFueURhdGEgPQogICAgICAgICAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0KICAgICAgICAgICAgLT5DdXN0b21lckNvbXBhbnlHZXQoIEN1c3RvbWVySUQgPT4gJEN1cnJDb21wYW55ICk7CgogICAgICAgIGlmICglQ3VzdG9tZXJDb21wYW55RGF0YSkgewogICAgICAgICAgICBteSBAQ3VyclJvdzsKCiAgICAgICAgICAgICMgcHJlcGFyZSB2YWxpZGl0eS4uLgogICAgICAgICAgICBpZiAoICRDdXN0b21lckNvbXBhbnlEYXRhe1ZhbGlkSUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueURhdGF7VmFsaWR9ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gJEN1c3RvbWVyQ29tcGFueURhdGF7VmFsaWRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3QgKEBNYXBwaW5nT2JqZWN0TGlzdCkgewogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRNYXBwaW5nT2JqZWN0LT57S2V5fTsKICAgICAgICAgICAgICAgIGlmICggISRLZXkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQ3VyclJvdywgJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKCBAQ3VyclJvdywgJEN1c3RvbWVyQ29tcGFueURhdGF7JEtleX0gfHwgJycgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBFeHBvcnREYXRhLCBcQEN1cnJSb3c7CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gXEBFeHBvcnREYXRhOwp9Cgo9aXRlbSBJbXBvcnREYXRhU2F2ZSgpCgppbXBvcnQgb25lIHJvdyBvZiB0aGUgaW1wb3J0IGRhdGEKCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJE9iamVjdEJhY2tlbmQtPkltcG9ydERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEFycmF5UmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBJbXBvcnREYXRhUm93IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpbXBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtJbXBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW1wb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIG1hcHBpbmcgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBtYXBwaW5nIGxpc3QKICAgIGlmICggISRNYXBwaW5nTGlzdCB8fCByZWYgJE1hcHBpbmdMaXN0IG5lICdBUlJBWScgfHwgIUB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBteSAlSWRlbnRpZmllcjsKICAgIG15ICRDb3VudGVyICAgICAgICAgICAgICAgID0gMDsKICAgIG15ICVOZXdDdXN0b21lckNvbXBhbnlEYXRhID0gcXd7fTsKICAgIG15ICRDdXN0b21lckNvbXBhbnlLZXkgICAgID0gIiI7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjQlVJTEQgTUFQUElORyBUQUJMRS4uLgogICAgbXkgJElzSGVhZGxpbmUgPSAxOwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoKCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YSApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9CiAgICAgICAgICAgICYmICRJZGVudGlmaWVyeyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gIgogICAgICAgICAgICAgICAgICAgIC4gIickTWFwcGluZ09iamVjdERhdGEtPntLZXl9JyBoYXMgYmVlbiB1c2VkIG11bHRpcGxlICIKICAgICAgICAgICAgICAgICAgICAuICJ0aW1lcyBhcyBpZGVudGlmaWVyIChsaW5lICRQYXJhbXtDb3VudGVyfSkuISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE1hcHBpbmdPYmplY3REYXRhLT57SWRlbnRpZmllcn0gKSB7CiAgICAgICAgICAgICRJZGVudGlmaWVyeyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0gPQogICAgICAgICAgICAgICAgJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdOwogICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55S2V5ID0gJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fTsKICAgICAgICB9CgogICAgICAgICROZXdDdXN0b21lckNvbXBhbnlEYXRheyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0gPQogICAgICAgICAgICAkUGFyYW17SW1wb3J0RGF0YVJvd30tPlskQ291bnRlcl07CgogICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBuZSAkUGFyYW17SW1wb3J0RGF0YVJvd30tPlskQ291bnRlcl0gKSB7CiAgICAgICAgICAgICRJc0hlYWRsaW5lID0gMDsKICAgICAgICB9CgogICAgICAgICRDb3VudGVyKys7CgogICAgfQoKICAgIGlmICgkSXNIZWFkbGluZSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RGF0YVNhdmU6IGxpbmUgY29udGFpbnMgb25seSBtYXBwaW5nIGtleXMgbmFtZXMuICIKICAgICAgICAgICAgICAgIC4gIkl0IGlzIGxpa2VseSB0aGF0IGl0IGlzIGEgaGVhZGxpbmUuIFRoZXJlZm9yZSB0aGlzIGxpbmUgIgogICAgICAgICAgICAgICAgLiAiIHdpbGwgYmUgc2tpcHBlZC4iCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICNETyBUSEUgSU1QT1JULi4uCgogICAgIygxKSBQcmVwcm9jZXNzIGRhdGEuLi4KCiAgICAjIGxvb2t1cCBWYWxpZC1JRC4uLgogICAgaWYgKCAhJE5ld0N1c3RvbWVyQ29tcGFueURhdGF7VmFsaWRJRH0gJiYgJE5ld0N1c3RvbWVyQ29tcGFueURhdGF7VmFsaWR9ICkgewogICAgICAgICROZXdDdXN0b21lckNvbXBhbnlEYXRhe1ZhbGlkSUR9ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZCA9PiAkTmV3Q3VzdG9tZXJDb21wYW55RGF0YXtWYWxpZH0KICAgICAgICApOwogICAgfQogICAgaWYgKCAhJE5ld0N1c3RvbWVyQ29tcGFueURhdGF7VmFsaWRJRH0gKSB7CiAgICAgICAgJE5ld0N1c3RvbWVyQ29tcGFueURhdGF7VmFsaWRJRH0gPSAkT2JqZWN0RGF0YS0+e0RlZmF1bHRWYWxpZH0gfHwgMTsKICAgIH0KCiAgICAjKDEpIGxvb2t1cCBjb21wYW55IGVudHJ5Li4uCiAgICBteSAlQ3VzdG9tZXJDb21wYW55RGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fQogICAgICAgIC0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICROZXdDdXN0b21lckNvbXBhbnlEYXRhe0N1c3RvbWVySUR9ICk7CgogICAgbXkgJE5ld0NvbXBhbnkgPSAxOwogICAgaWYgKCVDdXN0b21lckNvbXBhbnlEYXRhKSB7CiAgICAgICAgJE5ld0NvbXBhbnkgPSAwOwogICAgfQoKICAgIGZvciBteSAkS2V5ICgga2V5cyglTmV3Q3VzdG9tZXJDb21wYW55RGF0YSkgKSB7CiAgICAgICAgbmV4dCBpZiAoICEkTmV3Q3VzdG9tZXJDb21wYW55RGF0YXskS2V5fSApOwogICAgICAgICRDdXN0b21lckNvbXBhbnlEYXRheyRLZXl9ID0gJE5ld0N1c3RvbWVyQ29tcGFueURhdGF7JEtleX07CiAgICB9CgogICAgIygyKSBpZiBjb21wYW55IERPRVMgTk9UIGV4aXN0cyA9PiBjcmVhdGUgbmV3IGVudHJ5Li4uCiAgICBteSAkUmVzdWx0ID0gMDsKICAgIGlmICgkTmV3Q29tcGFueSkgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICAgICAgJUN1c3RvbWVyQ29tcGFueURhdGEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RGF0YVNhdmU6IGFkZGluZyBDdXN0b21lckNvbXBhbnkgKCIKICAgICAgICAgICAgICAgICAgICAuICJDdXN0b21lcklEICIKICAgICAgICAgICAgICAgICAgICAuICRDdXN0b21lckNvbXBhbnlEYXRhe0N1c3RvbWVySUR9CiAgICAgICAgICAgICAgICAgICAgLiAiKSBmYWlsZWQgKGxpbmUgJFBhcmFte0NvdW50ZXJ9KS4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgIygzKSBpZiBjb21wYW55IERPRVMgZXhpc3RzID0+IGNoZWNrIHVwZGF0ZS4uLgogICAgZWxzZSB7CiAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fS0+Q3VzdG9tZXJDb21wYW55VXBkYXRlKAogICAgICAgICAgICAlQ3VzdG9tZXJDb21wYW55RGF0YSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbXBvcnREYXRhU2F2ZTogdXBkYXRpbmcgQ3VzdG9tZXJDb21wYW55ICgiCiAgICAgICAgICAgICAgICAgICAgLiAiQ3VzdG9tZXJJRCAiCiAgICAgICAgICAgICAgICAgICAgLiAkQ3VzdG9tZXJDb21wYW55RGF0YXtDdXN0b21lcklEfQogICAgICAgICAgICAgICAgICAgIC4gIikgZmFpbGVkIChsaW5lICRQYXJhbXtDb3VudGVyfSkuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHJldHVybiAkUmVzdWx0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBhIGRlcml2YXRpdmUgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMTEtMDItMTYgMTI6NDU6NTcgJAoKPWN1dAoK IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9DdXN0b21lckNvbXBhbnlJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZXJtYW4gbGFuZ3VhZ2UKIyB0cmFuc2xhdGlvbiBmb3IgQ3VzdG9tZXJDb21wYW55SW1wb3J0RXhwb3J0IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMKIyAtLQojICRJZDogZGVfQ3VzdG9tZXJDb21wYW55SW1wb3J0RXhwb3J0LnBtLHYgMS4xIDIwMTAtMDQtMTUgMDg6NDk6MjQgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQ3VzdG9tZXJDb21wYW55SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKIyAtLQpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgIyAkJFNUQVJUJCQKCiAgICAjIHRyYW5zbGF0aW9ucyBtaXNzaW5nIGluIEltcG9ydEV4cG9ydC4uLgogICAgJExhbmctPnsnQ29sdW1uIFNlcGVyYXRvcid9ICAgICAgICAgICA9ICdTcGFsdGVudHJlbm5lcic7CiAgICAkTGFuZy0+eydDaGFyc2V0J30gICAgICAgICAgICAgICAgICAgID0gJ1plaWNoZW5zYXR6JzsKICAgICRMYW5nLT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRXhwb3J0IG1pdHRlbHMgU3VjaGUgZWluc2NocuRua2VuJzsKCiAgICAkTGFuZy0+eycnfSA9ICcnOwoKICAgIHJldHVybiAwOwoKICAgICMgJCRTVE9QJCQKfQoKIyAtLQoxOwo= IyAtLQojIEN1c3RvbWVyQ29tcGFueUltcG9ydEV4cG9ydC5wbSAtIGNvZGUgcnVuIGR1cmluZyBwYWNrYWdlIGRlLS9pbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMKIyAtLQojICRJZDogQ3VzdG9tZXJDb21wYW55SW1wb3J0RXhwb3J0LnBtLHYgMS45IDIwMTEtMDItMTYgMTI6NDU6NTcgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpDdXN0b21lckNvbXBhbnlJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZzsKdXNlIEtlcm5lbDo6Q29uZmlnOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCk9UUlNfQ2lDUy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6T1RSUy1DaUNTLUlUU00ucG0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2NoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgJFNlbGYtPntDb25maWdPYmplY3R9ICAgICAgID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgJFNlbGYtPntMb2dPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntNYWluT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntPYmplY3RCYWNrZW5kT2JqZWN0fSA9CiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6Q3VzdG9tZXJDb21wYW55LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0NyZWF0ZU1hcHBpbmdzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQ3JlYXRlTWFwcGluZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X1JlbW92ZVJlbGF0ZWRNYXBwaW5ncygpOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX1JlbW92ZVJlbGF0ZWRNYXBwaW5ncyAoKSB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIEZvcm1hdCA9PiAnQ1NWJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgaWYgKCByZWYoJFRlbXBsYXRlTGlzdCkgZXEgJ0FSUkFZJyAmJiBAeyRUZW1wbGF0ZUxpc3R9ICkgewogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlTGlzdCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQ3JlYXRlTWFwcGluZ3MgKCkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGFkZCBhIHRlbXBsYXRlIGN1c3RvbWVyIGNvbXBhbnkKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAiQ3VzdG9tZXJDb21wYW55IiAuICIgKGF1dG8tY3JlYXRlZCBtYXApIiwKICAgICAgICBDb21tZW50ID0+ICJBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZHVyaW5nIEN1c3RvbWVyQ29tcGFueUltcG9ydEV4cG9ydCBpbnN0YWxsYXRpb24iLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgbWFwcGluZyBmb3IgY3VzdG9tZXIgY29tcGFueQogICAgbXkgQEVsZW1lbnRMaXN0ID0gcXd7fTsKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyQ29tcGFueScpLT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckNvbXBhbnknKS0+e0tleX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJDb21wYW55LT5DdXN0b21lckNvbXBhbnlLZXkgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyQ29tcGFueScpLT57TWFwfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPk1hcCBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CgogICAgZm9yIG15ICRDdXJyQXR0cmlidXRlTWFwcGluZyAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSB9ICkgewogICAgICAgIG15ICRDdXJyQXR0cmlidXRlID0gewogICAgICAgICAgICBLZXkgICA9PiAkQ3VyckF0dHJpYnV0ZU1hcHBpbmctPlswXSwKICAgICAgICAgICAgVmFsdWUgPT4gJEN1cnJBdHRyaWJ1dGVNYXBwaW5nLT5bMF0sCiAgICAgICAgfTsKCiAgICAgICAgIyBpZiBWYWxpZElEIGlzIGF2YWlsYWJsZSAtIG9mZmVyIFZhbGlkIGluc3RlYWQuLgogICAgICAgIGlmICggJEN1cnJBdHRyaWJ1dGVNYXBwaW5nLT5bMF0gZXEgJ1ZhbGlkSUQnICkgewogICAgICAgICAgICAkQ3VyckF0dHJpYnV0ZSA9IHsgS2V5ID0+ICdWYWxpZCcsIFZhbHVlID0+ICdWYWxpZGl0eScsIH07CiAgICAgICAgfQoKICAgICAgICBwdXNoKCBARWxlbWVudExpc3QsICRDdXJyQXR0cmlidXRlICk7CgogICAgfQoKICAgIG15ICRFeHBvcnREYXRhU2V0cyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcQEVsZW1lbnRMaXN0LAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YUdldCAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICBdOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICBteSAkT2JqZWN0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRFeHBvcnREYXRhU2V0cy0+WzBdLT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CiAgICBteSAkQXR0cmlidXRlVmFsdWVzOwogICAgZm9yZWFjaCBteSAkRGVmYXVsdCAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewogICAgICAgICRBdHRyaWJ1dGVWYWx1ZXMtPnsgJERlZmF1bHQtPntLZXl9IH0gPSAkRGVmYXVsdC0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CiAgICAkRXhwb3J0RGF0YVNldHMtPlswXS0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0gPSAkQXR0cmlidXRlVmFsdWVzOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgcnVuIGdlbmVyYWwgRXhwb3J0RGF0YUdldAogICAgRVhQT1JUREFUQVNFVDoKICAgIGZvciBteSAkQ3VycmVudEV4cG9ydERhdGFTZXQgKCBAeyRFeHBvcnREYXRhU2V0c30gKSB7CgogICAgICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfQogICAgICAgICAgICB8fCByZWYgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IEVYUE9SVERBVEFTRVQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0KICAgICAgICAgICAgJiYgcmVmICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICYmICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+CiAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgICAgICYmIHJlZiAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9IGVxICdIQVNIJwogICAgICAgICAgICAmJiAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PgogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfQogICAgICAgICAgICAmJiByZWYgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBleGlzdGluZyBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PgogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RXhwb3J0RGF0YVNldC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKICAgICAgICAgICAgTUFQUElOR09CSkVDVERBVEE6CiAgICAgICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdERhdGEgKAogICAgICAgICAgICAgICAgQHsgJEN1cnJlbnRFeHBvcnREYXRhU2V0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgICAgIG15ICRNYXBwaW5nSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRNYXBwaW5nT2JqZWN0RGF0YSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBFeHBvcnQgZGF0YSBzYXZlCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9CiAgICAgICAgICAgICRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0KICAgICAgICAgICAgLT5FeHBvcnREYXRhR2V0KCAleyAkQ3VycmVudEV4cG9ydERhdGFTZXQtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9IH0sICk7CgogICAgfQoKICAgIHJldHVybiAxOwoKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAxMS0wMi0xNiAxMjo0NTo1NyAkCj1jdXQK IyAtLQojIENIQU5HRVMuY3VzdG9tZXJjb21wYW55aW1wb3J0ZXhwb3J0IC0gY2hhbmdlIGxvZyBvZiBjdXN0b21lcnVzZXJpbXBvcnRleHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCiMgLS0KIyAkSWQ6IENIQU5HRVNfY3VzdG9tZXJjb21wYW55aW1wb3J0ZXhwb3J0LHYgMS40IDIwMTEtMDItMTYgMTI6NDU6NTcgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMS4wICgyMDExLzAyLzE2KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzAyLzE2KSAtIENSOiBjaGFuZ2VzIGZvciB1c2Ugd2l0aCBPVFJTIDMuMC54CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4wICgyMDEwLzA0LzE3KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDEwLzA0LzE3KSAtIENSOiBGaXJzdCByZWxlYXNlIG9mIGdlbmVyYWwgY3VzdG9tZXIgY29tcGFueSBpbXBvcnQtL2V4cG9ydCBiYWNrZW5kLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA== IyAtLQojIEltcG9ydEV4cG9ydE9iamVjdEN1c3RvbWVyQ29tcGFueS50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDdXN0b21lckNvbXBhbnkgb2JqZWN0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydE9iamVjdEN1c3RvbWVyQ29tcGFueS50LHYgMS4yIDIwMTAtMDQtMTUgMDg6NTc6NDMgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6Q3VzdG9tZXJDb21wYW55Owp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgokU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnktPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntFbmNvZGVPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e09iamVjdEJhY2tlbmRPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OkN1c3RvbWVyQ29tcGFueS0+bmV3KCAleyRTZWxmfSApOwogICAgCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBhZGQgc29tZSB0ZXN0IHRlbXBsYXRlcyBmb3IgbGF0ZXIgY2hlY2tzCm15IEBUZW1wbGF0ZUlEczsKZm9yICggMSAuLiAzMCApIHsKCiAgICAjIGFkZCBhIHRlc3QgdGVtcGxhdGUgZm9yIGxhdGVyIGNoZWNrcwogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ0N1c3RvbWVyQ29tcGFueScsCiAgICAgICAgRm9ybWF0ICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgQ1NWIGl0ZW0pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IG9iamVjdCBsaXN0Cm15ICRPYmplY3RMaXN0MSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKIyBjaGVjayBvYmplY3QgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRPYmplY3RMaXN0MSAmJiByZWYgJE9iamVjdExpc3QxIGVxICdIQVNIJyAmJiAkT2JqZWN0TGlzdDEtPntDdXN0b21lckNvbXBhbnl9LAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gQ3VzdG9tZXJDb21wYW55IGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIwojCiMgVE8gRE8gCiMKIwoKCg==