ITSMConfigItem
1.1.1
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.1.1.
Build for OTRS::ITSM 1.1.0 rc1.
Build for OTRS::ITSM 1.1.0 beta4.
Build for OTRS::ITSM 1.1.0 beta3.
Build for OTRS::ITSM 1.1.0 beta2.
Build for OTRS::ITSM 1.1.0 beta1.
Testbuild for OTRS::ITSM 1.1.0 beta1.
The OTRS::ITSM config item package.
Das OTRS::ITSM Config Item Paket.
2.2.6
2.2.x CVS
<br>
WELCOME<br>
<br>
You are about to install the OTRS module ITSMConfigItem.<br>
<br>
<br>
REQUIRED OTRS PACKAGES
<ul>
<li>GeneralCatalog 1.1.1</li>
<li>LinkObject 1.1.1</li>
<li>ITSMCore 1.1.1</li>
<li>ITSMService 1.1.1</li>
<li>ITSMTicket 1.1.1</li>
</ul>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ITSMConfigItem zu installieren.<br>
<br>
<br>
BENÖTIGTE OTRS-PAKETE
<ul>
<li>GeneralCatalog 1.1.1</li>
<li>LinkObject 1.1.1</li>
<li>ITSMCore 1.1.1</li>
<li>ITSMService 1.1.1</li>
<li>ITSMTicket 1.1.1</li>
</ul>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WELCOME<br>
<br>
You are about to upgrade the OTRS module ITSMConfigItem.<br>
<br>
<br>
REQUIRED OTRS PACKAGES
<ul>
<li>GeneralCatalog 1.1.1</li>
<li>LinkObject 1.1.1</li>
<li>ITSMCore 1.1.1</li>
<li>ITSMService 1.1.1</li>
<li>ITSMTicket 1.1.1</li>
</ul>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ITSMConfigItem zu aktualisieren.<br>
<br>
<br>
BENÖTIGTE OTRS-PAKETE
<ul>
<li>GeneralCatalog 1.1.1</li>
<li>LinkObject 1.1.1</li>
<li>ITSMCore 1.1.1</li>
<li>ITSMService 1.1.1</li>
<li>ITSMTicket 1.1.1</li>
</ul>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
GeneralCatalog
ITSMCore
ITSMTicket
LinkObject2
require Kernel::System::Group;
$Self->{GroupObject} = Kernel::System::Group->new(%{$Self});
# add group itsm-configitem
$Self->{GroupObject}->GroupAdd(
Name => 'itsm-configitem',
Comment => 'Group for ITSM ConfigItem mask access in the agent interface.',
ValidID => 1,
UserID => 1,
);
# add user root to itsm-configitem admin group
$Self->{GroupObject}->GroupMemberAdd(
GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'itsm-configitem'),
UID => 1,
Permission => {
ro => 1,
move_into => 1,
create => 1,
owner => 1,
priority => 1,
rw => 1,
},
UserID => 1,
);
require Kernel::System::Group;
$Self->{GroupObject} = Kernel::System::Group->new(%{$Self});
# add group itsm-configitem
$Self->{GroupObject}->GroupAdd(
Name => 'itsm-configitem',
Comment => 'Group for ITSM ConfigItem mask access in the agent interface.',
ValidID => 1,
UserID => 1,
);
# add user root to itsm-configitem admin group
$Self->{GroupObject}->GroupMemberAdd(
GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'itsm-configitem'),
UID => 1,
Permission => {
ro => 1,
move_into => 1,
create => 1,
owner => 1,
priority => 1,
rw => 1,
},
UserID => 1,
);
# create general catalog object
use Kernel::System::GeneralCatalog;
$Self->{GeneralCatalogObject} = Kernel::System::GeneralCatalog->new(%{$Self});
# rename general catalog class from state to deployment state
$Self->{GeneralCatalogObject}->ClassRename(
ClassOld => 'ITSM::ConfigItem::State',
ClassNew => 'ITSM::ConfigItem::DeploymentState',
);
# reset deployment state, if required
# define default items
my $NewItemData = {
33 => {
Name => 'Expired',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
34 => {
Name => 'Inactive',
Functionality => 'postproductive',
ValidID => 1,
Comment => '',
},
35 => {
Name => 'Maintenance',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
36 => {
Name => 'Pilot',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
37 => {
Name => 'Planned',
Functionality => 'preproductive',
ValidID => 1,
Comment => '',
},
38 => {
Name => 'Production',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
39 => {
Name => 'Repair',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
40 => {
Name => 'Retired',
Functionality => 'postproductive',
ValidID => 1,
Comment => '',
},
41 => {
Name => 'Review',
Functionality => 'productive',
ValidID => 1,
Comment => '',
},
42 => {
Name => 'Test/QA',
Functionality => 'preproductive',
ValidID => 1,
Comment => '',
},
};
# get functionality list
my $FunctionalityList = $Self->{GeneralCatalogObject}->FunctionalityList(
Class => 'ITSM::ConfigItem::DeploymentState',
);
my $ExistsPreproductive = 0;
my $ExistsProductive = 0;
my $ExistsPostproductive = 0;
# check functionality list
for my $Functionality (@{$FunctionalityList}) {
if ($Functionality eq 'preproductive') {
$ExistsPreproductive = 1;
}
elsif ($Functionality eq 'productive') {
$ExistsProductive = 1;
}
elsif ($Functionality eq 'postproductive') {
$ExistsPostproductive = 1;
}
}
# start reset, if required
if (!$ExistsPreproductive || !$ExistsProductive || !$ExistsPostproductive) {
# get item list
my $ItemList = $Self->{GeneralCatalogObject}->ItemList(
Class => 'ITSM::ConfigItem::DeploymentState',
Valid => 0,
);
# reset config item state
for my $ItemID (keys %{$ItemList}) {
if ($NewItemData->{$ItemID}) {
# update item
$Self->{GeneralCatalogObject}->ItemUpdate(
ItemID => $ItemID,
Name => $NewItemData->{$ItemID}->{Name},
Functionality => $NewItemData->{$ItemID}->{Functionality},
ValidID => $NewItemData->{$ItemID}->{ValidID},
Comment => $NewItemData->{$ItemID}->{Comment},
UserID => 1,
);
}
else {
# get item data
my $CurrentItem = $Self->{GeneralCatalogObject}->ItemGet(
ItemID => $ItemID,
);
# update item
$Self->{GeneralCatalogObject}->ItemUpdate(
ItemID => $ItemID,
Name => $CurrentItem->{Name},
Functionality => 'productive',
ValidID => $CurrentItem->{ValidID} || 1,
Comment => $CurrentItem->{Comment},
UserID => 1,
);
}
}
}
2008-05-04 16:40:20
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29uZmlnSXRlbS54bWwsdiAxLjI5IDIwMDgvMDEvMjQgMTc6MDI6NTEgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbklUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluSVRTTUNvbmZpZ0l0ZW0gY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSVRTTUNvbmZpZ0l0ZW0gS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNvbmZpZyBJdGVtPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQ5NTwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIENvbmZpZyBJdGVtIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNvbmZpZyBJdGVtPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aXRzbV9jb25maWdpdGVtLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW08L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+T3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNvbmZpZyBJdGVtPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q29uZmlnIEl0ZW0gWm9vbTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Wm9vbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtRWRpdC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBFZGl0PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5FZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBQcmludDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+UHJpbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbUFkZCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPml0c20tY29uZmlnaXRlbTwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q29uZmlnIEl0ZW0gQWRkPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5BZGQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5OZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk5ldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bmV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2ggb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5TZWFyY2g8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TZWFyY2g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnNlYXJjaC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q29uZmlnIEl0ZW0gRWRpdDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+U2VhcmNoUmVzdWx0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgYmFjayBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1cvxjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+JEVudnsiSVRTTUNvbmZpZ0l0ZW1MYXN0U2NyZWVuT3ZlcnZpZXcifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1WZXJzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHZlcnNpb25zIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgVmVyc2lvbmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlZlcnNpb25zPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMjAwLUVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBlZGl0IGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgQmVhcmJlaXRlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQmYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzAwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgcHJpbnQgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBEcnVja2VuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtUHJpbnQmYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtWZXJzaW9uSUQ9JFFEYXRheyJWZXJzaW9uSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj50YXJnZXQ9InByaW50IjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzQwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBWZXJrbvxwZmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdDImYW1wO1NvdXJjZUNsYXNzPUlUU01Db25maWdJdGVtJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJDb25maWdJdGVtSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzUwMC1EdXBsaWNhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBkdXBsaWNhdGUgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBEdXBsaXppZXJlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkR1cGxpY2F0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0JmFtcDtEdXBsaWNhdGVJRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtWZXJzaW9uSUQ9JFFEYXRheyJWZXJzaW9uSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZWxlY3QgdGhlIGNvbmZpZyBpdGVtIG51bWJlciBnZW5lcmF0b3IgbW9kdWxlLiAiQXV0b0luY3JlbWVudCIgaW5jcmVtZW50cyB0aGUgY29uZmlnIGl0ZW0gbnVtYmVyLCB0aGUgU3lzdGVtSUQsIHRoZSBDb25maWdJdGVtQ2xhc3NJRCBhbmQgdGhlIGNvdW50ZXIgYXJlIHVzZWQuIFRoZSBmb3JtYXQgaXMgIlN5c3RlbUlEIENvbmZpZ0l0ZW1DbGFzc0lEIENvdW50ZXIiLCBlLmcuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkF1c3dhaGwgZGVzIE1vZHVscyB6dXIgR2VuZXJpZXJ1bmcgZGVyIENvbmZpZ0l0ZW0tTnVtbWVyLiAiQXV0b0luY3JlbWVudCIgeuRobHQgZGllIENvbmZpZ0l0ZW0tTnVtbWVyIGF1dG9tYXRpc2NoIGhvY2ggdW5kIHZlcmJpbmRldCBzaWUgbWl0IGRlciBTeXN0ZW1JRCB1bmQgbWl0IGRlciBDb25maWdJdGVtQ2xhc3NJRC4gRXMgd2lyZCBkYXMgRm9ybWF0ICJTeXN0ZW1JRCBDb25maWdJdGVtQ2xhc3NJRCBDb3VudGVyIiB2ZXJ3ZW5kZXQsIHouIEIuIDEyMDUwMDAwMDQsIDEyMDUwMDAwMDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBMb2NhdGlvbj0iS2VybmVsL1N5c3RlbS9JVFNNQ29uZmlnSXRlbS9OdW1iZXIvKi5wbSIgU2VsZWN0ZWRJRD0iS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQiPjwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3QyOjpQb3NzaWJsZVBhcnRuZXIjIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBvc3NpYmxlIHBhcnRuZXIgZnJvbSBJVFNNQ29uZmlnSXRlbSBvYmplY3QgdG8gb3RoZXIgb2JqZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TfZnbGljaGUgUGFydG5lciB2b20gSVRTTUNvbmZpZ0l0ZW0genUgYW5kZXJlbiBPYmpla3Rlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0Mjo6UG9zc2libGVQYXJ0bmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01Db25maWdJdGVtIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkluY2x1ZGVzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvbm5lY3RlZFRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01Mb2NhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkFsdGVybmF0aXZlVG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+QWx0ZXJuYXRpdmVUbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+QWx0ZXJuYXRpdmVUbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgaXRzbSBjb25maWcgaXRlbSBzdHVmZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIFN0YXRpc3Rpa2VuIPxiZXIgSVRTTSBDb25maWdJdGVtIERpbmdlIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9iamVjdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5PYmpla3QtQmFja2VuZCBNb2R1bCBSZWdpc3RyYXRpb24gZGVzIEltcG9ydC9FeHBvcnQgTW9kdWxzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkltcG9ydEV4cG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk9iamVjdEJhY2tlbmQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5Db25maWcgSXRlbTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBCdWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGJnX0lUU01Db25maWdJdGVtLnBtLHYgMS4xMCAyMDA4LzA1LzA0IDEyOjQ3OjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIOru7fTo4/Pw4Pbo7u3t6PLlIOXk6O3o9uggQ0knOwogICAgJExhbmctPnsnQ2hhbmdlIERlZmluaXRpb24nfSAgICAgID0gJ8/w7uz/7eAg7eAg5OX06O3o9uj/8uAnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ8rr4PEnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ8/u6uDm6CDC5fDx6Ojy5Sc7CiAgICAkTGFuZy0+eydIaWRlIFZlcnNpb25zJ30gICAgICAgICAgPSAn0erw6OkgwuXw8ejo8uUnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ8/u8evl5O3uIO/w7uzl7eXtIO7yJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICfP7vHr5eTt4CDv8O7s/+3gJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICfP8O7s/+3g8uAg7eAg5OX06O3o9ujo8uUg5SDt5fPx7+X47eAhIMLo5iDx6PHy5ezt6P8g5vPw7eDrIOfgIOTl8uDp6+guJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ICAgICAgICA9ICfE4CDy+vDx6CDoIOIg7/Dl5Oj47ejy5SDi5fDx6Og/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfP7urg5+Dt6CDq7u306OPz8C7l5Ojt6PboJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgICAgICAgICA9ICfE7vHy+u/t6CDq7u306OPz8C7l5Ojt6PboJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICcnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u8evl5O3gIO/w7uz/7eAnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83g7/Dg4ugg6u7v6OUnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn8uXq6+gnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83l4Ory6OLt6Cc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7k5PD65urgJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP6Ovu8i3i7uTg9yc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+vg7ejw4O0nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7uTz6vLo4uXtJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ5ezu7fIvwvrn8fLg7e7i/+Lg7eUnOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn6//n+usg7vIg8+/u8vDl4eAnOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w5ePr5ebk4O0nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Ll8fIvyuD35fHy4uXtIOru7fLw7usnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83g8fLu6+XtJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP8OXt7vHo7Cc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+gnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0uXr5fTu7Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0frw4vrwJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfA8PXo4ujw4PnuIPMt4u4nOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Ho7OXwJzsKICAgICRMYW5nLT57J0NhbWVyYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK4Ozl8OAnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tu6ujt4yDx8uDt9uj/JzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+Di6ODy8/DgJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM7uTl7Cc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7t6PLu8Cc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzOj46uAnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEg6uDw8uAnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w6O3y5fAnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Dz8uXwJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR6uXt5fAnOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Mt4u4g5+Ag8ejj8/Dt7vHyJzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7u325e3y8ODy7vAnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VTQiDT8fLw7unx8uLuJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOIPLu9+rgIOfgIOTu8fL67yc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxjbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwOTs6O3o8fLw4PLo4u3l7SDo7fHy8PPs5e3yJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfP7vLw5eHo8uXr8eroIO/w6Ovu5uXt6P8nOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u8vDl4ejy5evx6uAgzu/l8C7xLezgJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfC4/Dg5OXt4Cc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0fDl5O3uIO3o4u4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfR+vDi+vDt7iDv8Ojr7ubl7ejlJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfx+vDi+vDt4CDO7+XwLvEt7OAnOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8rr6OXt8vHq6CDo7fHy8PPs5e3yJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7u3q8/Dl7fLt6CDv7vLw5eHo8uXr6Cc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxOXs7ic7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAny+j25e3nIOfgIPDg5/Dg4e7y9+j26Cc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnxe3y+vDv8ODp8SDr6Pbl7ecnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Hl5+/r4PLt7iDw4Ofv8O7x8vDg7f/i4O0nOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hu9PLz5fAg8SDu8uLu8OXtIOru5Cc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAny+j25e3n6PDg7eUg7eAg8u736uAnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+jw4O3lIOfgIO/w7vbl8e7wJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo8ODt5SDn4CDx+vDi+vAnOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+jw4O3lIOfgIO/u8vDl4ejy5esnOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Xk6O3o9+XtIOvo9uXt5yc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAny+j25e3nLCDu4/Dg7ej35e0g7+4g4vDl7OUnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83l7uPw4O3o9+XtIOvo9uXt5yc7CiAgICAkTGFuZy0+eydWb2x1bWUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0e/l9ujg6+3oIO7h5ezt6CDv8O7j8ODs6Cc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7k5esnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8Ojl7SDN7uzl8Cc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnzu/l8OD26O7t7eAg8ejx8uXs4Cc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Du9uXx7vAnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/g7OXyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS4vrw5CDk6PHqJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICA9ICfS4vrw5CDk6PHqOjrq4O/g9ujy5fInOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8rg7+D26PLl8ic7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRlFETic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzPDl5u7iIODk4O/y5fAnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgID0gJ8zw5ebu4iDg5ODv8uXwOjpJUCDu8iBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICfM8OXm7uIg4OTg7/Ll8Do6SVAgwOTw5fEnOwogICAgJExhbmctPnsnSVAgb3ZlciBESENQJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIO7yIERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIODk8OXxJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfD8OD06Pft4CDq4PDy4Cc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+4g7uHu8PPk4uDt5Sc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgPSAnxODy4CDt4CDo5/Lo9+Dt5SDt4CDj4PDg7fbo//LgJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE4PLgIO3gIOjt8fLg6+D26P8nOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zw5ebu4iDg5PDl8Sc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnzPDl5u7iIODk8OXxOjrM4PHq4CDt4CDv7uTs8OXm4PLgJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgICA9ICfM8OXm7uIg4OTw5fE6OsPl6fIg7/Dl9e7kJzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM4PHq4CDt4CDv7uTs8OXm4PLgJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfD5enyIO/w5fXu5Cc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0ujvIO3gIOvo9uXt5+AnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+XtIOrr/vcnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+XtIOrr/vc6Osru6+j35fHy4u4nOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgID0gJ8vo9uXt5+XtIOrr/vc6OsTg8uAg7eAg6Ofy6Pfg7eUnOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8ru6+j35fHy4u4nOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tg8uAg7eAg6Ofy6Pfg7eUnOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zl5Oj/JzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogY3pfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjExIDIwMDgvMDUvMDQgMTI6NDc6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgKCRTZWxmKSA9IEBfOwogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnS29uZmlnLiBqZWRub3RreSBDSSc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICfFmMOtemVuw60ga29uZmlndXJhxI1uw61jaCBqZWRub3RlayBDSSc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnWm3Em25hIGRlZmluaWNlJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICdUxZnDrWRhJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdVa2HFviBWZXJ6ZSc7CiAgICAkTGFuZy0+eydIaWRlIFZlcnNpb25zJ30gICAgICAgICAgPSAnSGlkZSBWZXJ6ZSc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAnUG9zbGVkbsOtIHptxJtuYSBvZCc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnUG9zbGVkbsOtIHptxJtuYSc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnWm3Em25hIGRlZmluaWPDrSBuZcO6c3DEm8WhbsOhISBWaXogc3lzdMOpbW92w70gesOhem5hbSBvIGRldGFqbGVjaC4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gICAgICAgID0gJ0hsZWRhdCB2IHDFmWVkY2hvesOtY2ggdmVyesOtY2g/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdVa2F6YW7DqSBrb25maWcuamVkbm90a3knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgICAgICAgID0gJ0Rvc3R1cG7DqSBrb25maWcuamVkbm90a3knOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJExhbmctPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgID0gJyc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9zbGVkbsOtIHptxJtuYSc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnWmhvdG92aXQga29waWUnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Z5cHJjaGzDqSc7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmVha3Rpdm7DrSc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw5pkcsW+YmEnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90LXbFr2RjZSc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGxhbm92w6FuJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWvEjW7DrSc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ByYXZhL09ibm92ZW7DrSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWltbyBwcm92b3onOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2hsw63FvmVuJzsKICAgICRMYW5nLT57J1Rlc3QvUUEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZXN0L0tvbnRyb2xhIGt2YWxpdHknOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0b2xuw60nOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vYmlsbsOtJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPc3RhdG7DrSc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1rDoWxvaG92w6Fjw60gemHFmcOtemVuw60nOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29tb3JhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEb2sgc3RhbmljZSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2zDoXZlc25pY2UnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVtJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPYnJhem92a2EnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ015xaEnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bsOtJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga2FydGEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rpc2vDoXJuYSc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUnVldHInOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Nuw61tYcSNJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXpwZcSNbm9zdG7DqSB6YcWZw616ZW7DrSc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3DDrW5hxI0nOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VTQiB6YcWZw616ZW7DrSc7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiBib2QgcMWZw61zdHVwdSc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bsOtJzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxjbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRtaW5pc3RyYcSNbsOtIG7DoXN0cm9qJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdVxb5pdmF0ZWxza8OpIGFwbGlrYWNlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVxb5pdmF0ZWxza8O9IG9wZXJhxI1uw60gc3lzdMOpbSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmVzdGF2xJtuw70nOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0xZllZG7DrSDDunJvdmXFiCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3N0YXRuw60nOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcm92w6EgYXBsaWthY2UnOwogICAgJExhbmctPnsnU2VydmVyIE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcm92w70gb3Blci5zeXN0w6ltJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVxb5pdmF0ZWxza8O9IG7DoXN0cm9qJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLb25rdXJlbsSNbsOtIHXFvml2YXRlbMOpJzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbmNlIHbDvXZvasOhxZllJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2RuaWthdGVsc2vDoSBsaWNlbmNlICc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmV6cGxhdG7DvSc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29mdHdhcmUgcyBvdGV2xZllbsO9bSBrz4xkZW0nOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY292w6Fuw60gw7p6bHUnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY292w6Fuw60gcHJvIHByb2Nlc29yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbmNvdsOhbsOtIHBybyBzZXJ2ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY292w6Fuw60gcHJvIHXFvml2YXRlbGUnOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0plZG5vdGxpdsOhIGxpY2VuY2UnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8SMYXNvdsSbIG9tZXplbsOhIGxpY2VuY2UnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05lb21lemVuw6EgbGljZW5jZSAnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NwZWNpw6FsbsOtIG9ixJttb3bDqSBwcm9ncmFteSc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1PDqXJpb3bDqSDEjcOtc2xvJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYcSNbsOtIHN5c3TDqW0nOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2Nlc29yJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYW3Em8WlJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUdnJkw70gZGlzayc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAnVHZyZMO9IGRpc2s6OmthcGFjaXRhJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQmkthcGFjaXRhJzsKICAgICRMYW5nLT57J0ZRRE4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGUUROJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTw63FpW92w70gYWRhcHRlcic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgICAgPSAnU8OtxaVvdsO9IGFkYXB0ZXI6OklQIHogREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgICAgPSAnU8OtxaVvdsO9IGFkYXB0ZXI6OklQIGFkcmVzYSc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgeiBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCBhZHJlc2EnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dyYWZpY2vDoSBrYXJ0YSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSmluw6kgdnliYXZlbsOtJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdLb25lYyBwbGF0bm9zdGkgesOhcnVreSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGF0dW0gaW5zdGFsYWNlJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTw63FpW92w6EgYWRyZXNhJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6U3VibmV0IE1hc2snfSAgICAgICAgICAgICA9ICdTw63FpW92w6EgYWRyZXNhOm1hc2thIHN1YnPDrXTEmyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgICAgPSAnU8OtxaVvdsOhIGFkcmVzYTo6R2F0ZSBwxZllY2hvZCc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWFza2Egc3Vic8OtdMSbJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRlIHDFmWVjaG9kJzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEcnVoIGxpY2VuY2UnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuxI1uw60ga2zDrcSNJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbsSNbsOtIGtsw63EjTo6TW5vxb5zdHbDrSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnTGljZW7EjW7DrSBrbMOtxI06OmtvbmVjIHBsYXRub3N0aSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW5vxb5zdHbDrSc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29uZWMgcGxhdG5vc3RpJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNw6lkaXVtJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db25maWdJdGVtLnBtLHYgMS4zMCAyMDA4LzA1LzA0IDEyOjQ3OjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICgkU2VsZikgPSBAXzsKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdDb25maWcgSXRlbS1CZXJlaWNoJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdDb25maWcgSXRlbSBWZXJ3YWx0dW5nJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdEZWZpbml0aW9uIORuZGVybic7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnS2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWZXJzaW9uZW4gZWluYmxlbmRlbic7CiAgICAkTGFuZy0+eydIaWRlIFZlcnNpb25zJ30gICAgICAgICAgPSAnVmVyc2lvbmVuIGF1c2JsZW5kZW4nOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ1p1bGV0enQgZ2XkbmRlcnQgdm9uJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICdadWxldHp0IGdl5G5kZXJ0JzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICfEbmRlcm4gZGVyIERlZmluaXRpb24gZmVobGdlc2NobGFnZW4hIEltIFN5c3RlbSBMb2cgZmluZGVuIFNpZSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4uJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0F1Y2ggaW4gZnL8aGVyZW4gVmVyc2lvbmVuIHN1Y2hlbj8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW1zIGFuZ2V6ZWlndCc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdDb25maWcgSXRlbXMgdmVyZvxnYmFyJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ1ZlcndlbmR1bmdzc3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ0FrdHVlbGxlciBWZXJ3ZW5kdW5nc3N0YXR1cyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdWb3JmYWxsc3N0YXR1cyc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICdBa3R1ZWxsZXIgVm9yZmFsbHNzdGF0dXMnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnRGVyIE5hbWUgZGllc2VzIENvbmZpZyBJdGVtcyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdEZXIgVmVyd2VuZHVuZ3NzdGF0dXMgZGllc2VzIENvbmZpZyBJdGVtcyc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0RlciBWb3JmYWxsc3N0YXR1cyBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGV0enRlIMRuZGVydW5nJzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGl6aWVyZW4nOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBYmdlbGF1ZmVuJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5ha3Rpdic7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luIFdhcnR1bmcnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdGJldHJpZWInOwogICAgJExhbmctPnsnUGxhbm5lZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHZXBsYW50JzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZHVrdGl2JzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW4gUmVwYXJhdHVyJzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXXfZXIgRGllbnN0JzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVW50ZXIgUmV2aWV3JzsKICAgICRMYW5nLT57J1Rlc3QvUUEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVzdC9RUyc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09wZXJhdGl2JzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9yZmFsbCc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMYXB0b3AnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmFja3VwIEdlcuR0JzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVhbWVyJzsKICAgICRMYW5nLT57J0NhbWVyYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2FtZXJhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRG9ja2luZyBTdGF0aW9uJzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGFzdGF0dXInOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNYXVzJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUENNQ0lBIEthcnRlJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHJ1Y2tlcic7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JvdXRlcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYW5uZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTaWNoZXJ0aGVpdHNnZXLkdCc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N3aXRjaCc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VTQiBHZXLkdCc7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4gQWNjZXNzIFBvaW50JzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2VzJzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsa28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRtaW4gVG9vbCc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0NsaWVudCBBbndlbmR1bmcnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDbGllbnQgQmV0cmllYnNzeXN0ZW0nOwogICAgJExhbmctPnsnRW1iZWRkZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFbWJlZGRlZCc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01pZGRsZXdhcmUnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgQW53ZW5kdW5nJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyIEJldHJpZWJzc3lzdGVtJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVXNlciBUb29sJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnR2xlaWNoemVpdGlnZSBVc2VyJzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVtbyc7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0VudHdpY2tsZXIgTGl6ZW56JzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRW50ZXJwcmlzZSBMaXplbnonOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcmVld2FyZSc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09wZW4gU291cmNlJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvIEtub3Rlbic7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BybyBQcm96ZXNzb3InOwogICAgJExhbmctPnsnUGVyIFNlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gU2VydmVyJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvIEJlbnV0emVyJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnRWluemVsbGl6ZW56JzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnWmVpdGxpY2ggYmVncmVuenQnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVbmxpbWl0aWVydCc7CiAgICAkTGFuZy0+eydWb2x1bWUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZvbHVtZW4gTGl6ZW56JzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJpZW5udW1tZXInOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXRyaWVic3N5c3RlbSc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NQVSc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyYmVpdHNzcGVpY2hlcic7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Zlc3RwbGF0dGUnOwogICAgJExhbmctPnsnSGFyZCBEaXNrOjpDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdGZXN0cGxhdHRlOjpLYXBheml05HQnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYXBheml05HQnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGUUROJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmV0endlcmsgQWRhcHRlcic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgID0gJ05ldHp3ZXJrIEFkYXB0ZXI6OklQIPxiZXIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgID0gJ05ldHp3ZXJrIEFkYXB0ZXI6OklQIEFkZHJlc3NlJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAg/GJlciBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgQWRkcmVzc2UnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdHcmFmaWsgQWRhcHRlcic7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlIEF1c3N0YXR0dW5nJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAnR2FyYW50aWUgQWJsYXVmZGF0dW0nOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbnN0YWxsYXRpb25zZGF0dW0nOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR6d2VyayBBZGRyZXNzZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ05ldHp3ZXJrIEFkZHJlc3NlOjpTdWJuZXR6IE1hc2tlJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgPSAnTmV0endlcmsgQWRkcmVzc2U6OkdhdGV3YXknOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdWJuZXR6IE1hc2tlJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR2F0ZXdheSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpemVuenR5cCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpemVuenNjaGz8c3NlbCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ0xpemVuenNjaGz8c3NlbDo6TWVuZ2UnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICA9ICdMaXplbnpzY2hs/HNzZWw6OkFibGF1ZmRhdHVtJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVuZ2UnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBYmxhdWZkYXR1bSc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01lZGl1bSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ01heGltYWxlIEFuemFobCBlaW5lcyBFbGVtZW50cyc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpa2F0b3InOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhZG1pbiBmcm9udGVuZCB0byBtYW5hZ2UgY29uZmlnIGl0ZW1zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Db25maWdJdGVtLnBtLHYgMS4xNSAyMDA4LzAyLzA1IDExOjQ0OjEwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVmaW5pdGlvbkxpc3QnICkgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQ2xhc3NJRCIgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkQ2xhc3NJRDsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25MaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbiBsaXN0CiAgICAgICAgbXkgJERlZmluaXRpb25MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkxpc3QoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICREZWZpbml0aW9uICggcmV2ZXJzZSBAeyREZWZpbml0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJERlZmluaXRpb24tPntDcmVhdGVCeX0sCiAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGRlZmluaXRpb24KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25MaXN0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAleyREZWZpbml0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlZmluaXRpb24gdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlZmluaXRpb25WaWV3JyApIHsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbiBpZAogICAgICAgIG15ICREZWZpbml0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJEZWZpbml0aW9uSUQiICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJERlZmluaXRpb25JRDsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZGVmaW5pdGlvbgogICAgICAgIG15ICREZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uSUQsCiAgICAgICAgKTsKICAgICAgICAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb259LAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmaW5pdGlvbi0+e0NsYXNzSUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJERlZmluaXRpb24tPntDcmVhdGVCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25WaWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3NMaXN0LT57ICREZWZpbml0aW9uLT57Q2xhc3NJRH0gfSwKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uQ2hhbmdlJyApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgaWQKICAgICAgICBteSAkQ2xhc3NJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzSUQiICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJENsYXNzSUQ7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlZmluaXRpb24KICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25DaGFuZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICAleyREZWZpbml0aW9ufSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWZpbml0aW9uIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uU2F2ZScgKSB7CiAgICAgICAgbXkgJURlZmluaXRpb247CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciBteSAkRm9ybVBhcmFtIChxdyhDbGFzc0lEIERlZmluaXRpb24pKSB7CiAgICAgICAgICAgICREZWZpbml0aW9ueyRGb3JtUGFyYW19ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRm9ybVBhcmFtICkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIGZvciBteSAkRm9ybVBhcmFtIChxdyhDbGFzc0lEIERlZmluaXRpb24pKSB7CiAgICAgICAgICAgIGlmICggISREZWZpbml0aW9ueyRGb3JtUGFyYW19ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJEZvcm1QYXJhbSEiICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25BZGQoCiAgICAgICAgICAgICVEZWZpbml0aW9uLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISREZWZpbml0aW9uSUQ7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY29uZmlnIGl0ZW0gY2xhc3Mgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRDbGFzc0lEICggc29ydCB7ICRDbGFzc0xpc3QtPnskYX0gY21wICRDbGFzc0xpc3QtPnskYn0gfSBrZXlzICV7JENsYXNzTGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjI0IDIwMDgvMDIvMTkgMTQ6MDk6MzEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFnZQogICAgbXkgJFBhZ2UgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJQYWdlIiApIHx8IDE7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIG91dHB1dCBtZW51CiAgICBteSAlQ2xhc3NDb3VudDsKICAgIG15ICRDb3VudGVyID0gMDsKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQgeyAkeyRDbGFzc0xpc3R9eyRhfSBjbXAgJHskQ2xhc3NMaXN0fXskYn0gfSBrZXlzICV7JENsYXNzTGlzdH0gKSB7CgogICAgICAgICMgY291bnQgYWxsIHJlY29yZHMgb2YgdGhpcyBjbGFzcwogICAgICAgICRDbGFzc0NvdW50eyRDbGFzc0lEfSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1Db3VudCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbnUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG1lbnUgaXRlbSBzcGxpdAogICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjbGFzcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgQ2xhc3MgICA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICAgICAgQ291bnQgICA9PiAkQ2xhc3NDb3VudHskQ2xhc3NJRH0gfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGlkCiAgICBteSAkQ2xhc3NJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgbXkgJVNlYXJjaFJlc3VsdCA9ICgKICAgICAgICBSZXN1bHQgICAgICAgICAgID0+IDAsCiAgICAgICAgQ29uZmlnSXRlbXNBdmFpbCA9PiAwLAogICAgKTsKCiAgICBpZiAoJENsYXNzSUQpIHsKCiAgICAgICAgIyBvdXRwdXQgY2xhc3MKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWFyY2hSZXN1bHR7Q29uZmlnSXRlbXNBdmFpbH0gPSAkQ2xhc3NDb3VudHskQ2xhc3NJRH0gfHwgMDsKCiAgICAgICAgbXkgJFNlYXJjaFN0YXJ0ID0gMDsKICAgICAgICBpZiAoICRQYWdlICYmICRQYWdlID4gMSApIHsKICAgICAgICAgICAgJFNlYXJjaFN0YXJ0ID0gKCAkUGFnZSAtIDEgKSAqIDEwMDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGxpc3QKICAgICAgICBteSAkQ29uZmlnSXRlbVJlc3VsdExpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtUmVzdWx0TGlzdCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgU3RhcnQgICA9PiAkU2VhcmNoU3RhcnQsCiAgICAgICAgICAgIExpbWl0ICAgPT4gMTAwLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHNlYXJjaCByZXN1bHQKICAgICAgICAkU2VhcmNoUmVzdWx0e1Jlc3VsdH0gPSBAeyRDb25maWdJdGVtUmVzdWx0TGlzdH07CiAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlfSAgID0gaW50KCAkU2VhcmNoUmVzdWx0e0NvbmZpZ0l0ZW1zQXZhaWx9IC8gMTAwICk7CiAgICAgICAgaWYgKCAoICRTZWFyY2hSZXN1bHR7Q29uZmlnSXRlbXNBdmFpbH0gLyAxMDAgKSAtICRTZWFyY2hSZXN1bHR7UGFnZX0gKSB7CiAgICAgICAgICAgICRTZWFyY2hSZXN1bHR7UGFnZX0rKzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICk7CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbSAoIEB7JENvbmZpZ0l0ZW1SZXN1bHRMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnID8gJ3NlYXJjaGFjdGl2ZScgOiAnc2VhcmNocGFzc2l2ZSc7CgogICAgICAgICAgICAjIG91dHB1dCBjbGFzcwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2xhc3NSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBwYWdlCiAgICBpZiAoICRTZWFyY2hSZXN1bHR7UGFnZX0gKSB7CiAgICAgICAgZm9yIG15ICRQYWdlQ291bnQgKCAxIC4uICRTZWFyY2hSZXN1bHR7UGFnZX0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBwYWdlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZU5hbWUgPSAkUGFnZUNvdW50IGVxICRQYWdlID8gJ1BhZ2VCb2xkJyA6ICdQYWdlTm9ybWFsJzsKCiAgICAgICAgICAgICMgb3V0cHV0IHBhZ2UgbGluawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkVGVtcGxhdGVOYW1lLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgICAgICBQYWdlICAgID0+ICRQYWdlQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWFyY2hSZXN1bHR7UGFnZU51bGx9ID0gMDsKICAgIH0KCiAgICAjIHNldCBsYXN0IHNjcmVlbiB2aWV3CiAgICAkQ2xhc3NJRCB8fD0gJyc7CiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0lUU01Db25maWdJdGVtTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mQ2xhc3NJRD0kQ2xhc3NJRCZQYWdlPSRQYWdlIiwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdPdmVydmlldycgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZWFyY2hSZXN1bHQsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLnBtLHYgMS4xNSAyMDA4LzAyLzA1IDExOjQ0OjEwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcmVkaXJlY3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUmVkaXJlY3QnICkgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkQ2xhc3NJRDsKCiAgICAgICAgIyB1cGRhdGUgc2Vzc2lvbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdJVFNNQ29uZmlnSXRlbUxhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZDbGFzc0lEPSRDbGFzc0lEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnQWRkJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtQWRkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtLHYgMS40MyAyMDA4LzAyLzE4IDIwOjAyOjQ4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtRWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQzICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnSXRlbSA9ICgpOwoKICAgICMgZ2V0IGNvbmZpZ2l0ZW0gaWQgYW5kIGNsYXNzIGlkCiAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDb25maWdJdGVtSUQiICkgfHwgMDsKICAgICRDb25maWdJdGVtLT57Q2xhc3NJRH0gICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzSUQiICkgICAgICB8fCAwOwogICAgbXkgJER1cGxpY2F0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRHVwbGljYXRlSUQiICkgfHwgMDsKCiAgICAjIGdldCBuZWVkZWQgZGF0YQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gJiYgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSB0byBkdXBsaWNhdGUKICAgICAgICAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9ICdORVcnOwogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9ICkgewoKICAgICAgICAjIHNldCBjb25maWcgaXRlbSBpZCBhbmQgbnVtYmVyCiAgICAgICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJ05FVyc7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9ICAgICAgID0gJ05FVyc7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkZWZpbml0aW9uCiAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICAjIGFib3J0LCBpZiBubyBkZWZpbml0aW9uIGlzIGRlZmluZWQKICAgIGlmICggISRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gRGVmaW5pdGlvbiB3YXMgZGVmaW5pZWQgZm9yIGNsYXNzICRDb25maWdJdGVtLT57Q2xhc3N9ISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc3VibWl0IHNhdmUKICAgIG15ICRTdWJtaXRTYXZlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiU3VibWl0U2F2ZSIgKTsKCiAgICBteSAkVmVyc2lvbiA9IHt9OwoKICAgICMgZ2V0IHhtbCBkYXRhCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgIG15ICRBbGxSZXF1aXJlZCA9IDE7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgZm9ybSBkYXRhCiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KE5hbWUgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQpKSB7CiAgICAgICAgICAgICRWZXJzaW9uLT57JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKTsKICAgICAgICAgICAgaWYgKCAhJFZlcnNpb24tPnskRm9ybVBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHhtbCBmb3JtIGRhdGEKICAgICAgICAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gXCRBbGxSZXF1aXJlZCwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdmVyc2lvbiB0byBkYXRhYmFzZQogICAgICAgIGlmICggJFN1Ym1pdFNhdmUgJiYgJEFsbFJlcXVpcmVkICkgewogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdmVyc2lvbgogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJWZXJzaW9uSUQiICk7CiAgICAgICAgaWYgKCRWZXJzaW9uSUQpIHsKCiAgICAgICAgICAgICMgZ2V0IHZlcnNpb24gZGF0YSB0byBkdXBsaWNhdGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEgdG8gZHVwbGljYXRlIGNvbmZpZyBpdGVtCiAgICAgICAgICAgICRWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVhNTEZvcm1PdXRwdXRQYXJhbTsKICAgIGlmICggJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSApIHsKICAgICAgICAkWE1MRm9ybU91dHB1dFBhcmFte1hNTERhdGF9ID0gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXTsKICAgIH0KCiAgICAjIG91dHB1dCBuYW1lIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd05hbWUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBuYW1lIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57TmFtZX0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnUm93TmFtZUludmFsaWQnICk7CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBEZXBsU3RhdGVPcHRpb25TdHJnCiAgICBteSAkRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVwbFN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3dEZXBsU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBEZXBsU3RhdGVPcHRpb25TdHJnID0+ICREZXBsU3RhdGVPcHRpb25TdHJnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGRlcGxveW1lbnQgc3RhdGUgaW52YWxpZCBibG9jawogICAgaWYgKCAhJFZlcnNpb24tPntEZXBsU3RhdGVJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93RGVwbFN0YXRlSW52YWxpZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdvcGVyYXRpb25hbCcsICdpbmNpZGVudCcgXSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBJbmNpU3RhdGVPcHRpb25TdHJnCiAgICBteSAkSW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93SW5jaVN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkSW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57SW5jaVN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Jvd0luY2lTdGF0ZUludmFsaWQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgeG1sIGZvcm0KICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAkU2VsZi0+X1hNTEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgJVhNTEZvcm1PdXRwdXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1hNTEZvcm1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtBbGxSZXF1aXJlZH07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17QWxsUmVxdWlyZWR9IG5lICdTQ0FMQVInOwoKICAgIG15ICRGb3JtRGF0YSA9ICgpOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICBteSAkQ291bnRlckluc2VydCA9IDE7CgogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGlucHV0a2V5IGFuZCBhZGRrZXkKICAgICAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9IC4gJzo6JyAuICRDb3VudGVyOwogICAgICAgICAgICBteSAkQWRkS2V5ICAgPSAkSXRlbS0+e0tleX0gLiAnOjpBZGQnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgICAgICAgICAgJEFkZEtleSAgID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJEFkZEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcGFyYW0KICAgICAgICAgICAgbXkgJEZvcm1WYWx1ZXMgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtRm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBLZXkgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEZvcm1WYWx1ZXMtPntWYWx1ZX0gKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayByZXF1aXJlZCB2YWx1ZQogICAgICAgICAgICAgICAgaWYgKCAkRm9ybVZhbHVlcy0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgICAgICR7ICRQYXJhbXtBbGxSZXF1aXJlZH0gfSA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkSW5wdXRLZXkgLiAnOjpEZWxldGUnICk7CgogICAgICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1YkZvcm1EYXRhID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gJFBhcmFte0FsbFJlcXVpcmVkfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTdWJGb3JtRGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XS0+e0NvbnRlbnR9ID0gJEZvcm1WYWx1ZXMtPntWYWx1ZX07CiAgICAgICAgICAgICAgICAkQ291bnRlckluc2VydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgYWRkIGJ1dHRvbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRBZGRLZXkgKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZvcm1EYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJJbnNlcnRdID0gJFNlbGYtPl9YTUxEZWZhdWx0U2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XS0+e0NvbnRlbnR9ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgpzdWIgX1hNTERlZmF1bHRTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgIG15ICREZWZhdWx0RGF0YSA9ICgpOwoKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudERlZmF1bHR9ICkgewoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICREZWZhdWx0RGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSA9ICRTZWxmLT5fWE1MRGVmYXVsdFNldCgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERlZmF1bHREYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICREZWZhdWx0RGF0YTsKfQoKc3ViIF9YTUxGb3JtT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICAkUGFyYW17TGV2ZWx9IHx8PSAwOwoKICAgICMgc2V0IGRhdGEgcHJlc2VudCBtb2RlCiAgICBteSAkRGF0YVByZXNlbnRNb2RlID0gMDsKICAgIGlmICggJFBhcmFte1hNTERhdGF9ICYmIHJlZiAkUGFyYW17WE1MRGF0YX0gZXEgJ0hBU0gnICkgewogICAgICAgICREYXRhUHJlc2VudE1vZGUgPSAxOwogICAgfQoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBvdXRwdXQgcm93IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93JyApOwoKICAgICAgICAjIHNldCBsb29wCiAgICAgICAgbXkgJExvb3AgPSAkSXRlbS0+e0NvdW50RGVmYXVsdH07CiAgICAgICAgaWYgKCREYXRhUHJlc2VudE1vZGUpIHsKICAgICAgICAgICAgJExvb3AgPSAwOwoKICAgICAgICAgICAgIyBzZWFyY2ggdGhlIGxhc3QgY29udGVudAogICAgICAgICAgICBDT1VOVEVSOgogICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSIGlmICFkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgJExvb3AgPSAkQ291bnRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYWJzb2x1dCBtaW5pbXVtCiAgICAgICAgICAgIGlmICggJExvb3AgPCAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgICAgICRMb29wID0gJEl0ZW0tPntDb3VudE1pbn07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGRlbGV0ZQogICAgICAgIG15ICREZWxldGUgPSAwOwogICAgICAgIGlmICggJExvb3AgPiAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgJERlbGV0ZSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjb250ZW50IHJvd3MKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRMb29wICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkgYW5kIGFkZGtleQogICAgICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyB2YWx1ZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dWYWx1ZScgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyB2YWx1ZSBjb250ZW50IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dWYWx1ZUNvbnRlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSB8fCAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIENvbHNwYW4gICAgID0+IDQgLSAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIElucHV0U3RyaW5nID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBibHVlIHJlcXVpcmVkIHN0YXIKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudFJlcXVpcmVkJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByZWQgaW52YWxpZCBzdGFyCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+eyRJbnB1dEtleX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudEludmFsaWQnICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyB2YWx1ZSBjb250ZW50IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dWYWx1ZUNvbnRlbnRTcGFjZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgZGVsZXRlIGJ1dHRvbgogICAgICAgICAgICBpZiAoJERlbGV0ZSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dWYWx1ZUNvbnRlbnREZWxldGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEtleSA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdYTUxSb3dWYWx1ZUNvbnRlbnREZWxldGVEdW1teScgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHJ1bGUgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlUnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+IDYgLSAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBydWxlIHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dWYWx1ZVJ1bGVTcGFjZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgIG15ICVYTUxGb3JtT3V0cHV0UGFyYW07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGFQcmVzZW50TW9kZQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFhNTEZvcm1PdXRwdXRQYXJhbXtYTUxEYXRhfSA9ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+X1hNTEZvcm1PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgJVhNTEZvcm1PdXRwdXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBMZXZlbCAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyB0byBzb3J0IHJvd3MgY29ycmVjdGx5CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvdycgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFkZCBidXR0b24KICAgICAgICBpZiAoICRMb29wIDwgJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJElucHV0S2V5ID0gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJElucHV0S2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgYWRkIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd0FkZCcgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgY29udGVudCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkQ29udGVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiAgICAgPT4gNCAtICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXRLZXkgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgY29udGVudCBzcGFjZSwgaWYgbGV2ZWwgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmICggJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkQ29udGVudFNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgYWRkIHJ1bGUgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd0FkZFJ1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiA2IC0gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByb3cgYWRkIHJ1bGUgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd0FkZFJ1bGVTcGFjZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBjb25maWcgaXRlbSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSx2IDEuMTEgMjAwOC8wMi8xOCAxMzo1NzozNCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TGlua09iamVjdDJ9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQ29uZmlnSXRlbUlEIiApOwogICAgbXkgJFZlcnNpb25JRCAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlZlcnNpb25JRCIgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCB8fCAhJFZlcnNpb25JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb25maWdJdGVtSUQgJENvbmZpZ0l0ZW1JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICApOwogICAgaWYgKCAhJFZlcnNpb24tPntWZXJzaW9uSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJWZXJzaW9uSUQgJFZlcnNpb25JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgJENvbmZpZ0l0ZW0tPntDdXJyZW50TmFtZX0gPSAkTGFzdFZlcnNpb24tPntOYW1lfTsKCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBteSAkVmVyc2lvbk51bWJlciA9IDE7CiAgICBMSVNUVkVSU0lPTklEOgogICAgZm9yIG15ICRMaXN0VmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewoKICAgICAgICBsYXN0IExJU1RWRVJTSU9OSUQgaWYgJFZlcnNpb25JRCBlcSAkTGlzdFZlcnNpb25JRDsKICAgICAgICAkVmVyc2lvbk51bWJlcisrOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSBvZiBjb25maWcgaXRlbSAoY3JlYXRlIGJ5KQogICAgbXkgJUNvbmZpZ0l0ZW1DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ29uZmlnSXRlbS0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBkYXRhIG9mIGNvbmZpZyBpdGVtIChjaGFuZ2UgYnkpCiAgICBteSAlQ29uZmlnSXRlbUNoYW5nZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgb2YgdmVyc2lvbiAoY3JlYXRlIGJ5KQogICAgbXkgJVZlcnNpb25DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVmVyc2lvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKCiAgICAgICAgbXkgJVBhZ2U7CiAgICAgICAgbXkgJFVybCA9ICcgJzsKCiAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSApIHsKICAgICAgICAgICAgJFVybCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIdHRwVHlwZScpIC4gJzovLycKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKQogICAgICAgICAgICAgICAgLiAkRU5We1JFUVVFU1RfVVJJfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgICAgICBpZiAoICEkUGFnZXtNYXhQYWdlc30gfHwgJFBhZ2V7TWF4UGFnZXN9IDwgMSB8fCAkUGFnZXtNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAxMDA7CiAgICAgICAgfQoKICAgICAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAgICAgJFBhZ2V7TWFyZ2luUmlnaHR9ICA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAgICAgJFBhZ2V7SGVhZGVyUmlnaHR9ICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDb25maWdJdGVtJykgLiAnIycKICAgICAgICAgICAgLiAkQ29uZmlnSXRlbS0+e051bWJlcn07CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSAgPSAkVmVyc2lvbi0+e05hbWV9OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3ByaW50ZWQgYnknKSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAnJEVudnsiVGltZSJ9JyApOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJFVybDsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmp