Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval(base64_decode("cmVxdWlyZSBfX0RJUl9fLicvdmVuZG9yL2F1dG9sb2FkLnBocCc7CiRpZyA9I..
Decoded Output download
require __DIR__.'/vendor/autoload.php';
$ig = new \InstagramAPI\Instagram();
output_clean("
_ _ _
| | | | | |
| |_| |_ _ _ __ ___ _ __| | ___ ___ _ __
| _ | | | | '_ \ / _ \ '__| |/ _ \ / _ \| '_ \
| | | | |_| | |_) | __/ | | | (_) | (_) | |_) |
\_| |_/\__, | .__/ \___|_| |_|\___/ \___/| .__/
__/ | | | |
|___/|_| |_|
");
output_clean("");
output_clean("Hyperloop Terminal");
output_clean("v.2.0");
output_clean("");
output_clean(" Developed by Nextpost Developers Team (https://nextpost.tech)");
output_clean("");
run($ig);
/**
* Let's start the show
*/
function run($ig) {
try {
output('Please provide login data of your Instagram Account.');
$login = getVarFromUser("Login");
if (empty($login)) {
do {
$login = getVarFromUser("Login");
} while (empty($login));
}
$password = getVarFromUser("Password");
if (empty($password)) {
do {
$password = getVarFromUser("Password");
} while (empty($password));
}
$first_loop = true;
do {
if ($first_loop) {
output("(Optional) Set proxy, if needed.");
output("Proxy should match following pattern:");
output("http://ip:port or http://username:password@ip:port");
output("Don't use in pattern https://.");
output("Type 3 to skip and don't use proxy.");
$first_loop = false;
} else {
output("Proxy - [NOT VALID]");
output("Please check the proxy syntax and try again.");
}
$proxy = getVarFromUser("Proxy");
if (empty($proxy)) {
do {
$proxy = getVarFromUser("Proxy");
} while (empty($proxy));
}
if ($proxy == '3') {
// Skip proxy setup
break;
}
} while (!isValidProxy($proxy));
if ($proxy == "3") {
// // Skip proxy setup
} else {
output("Proxy - [OK]");
$ig->setProxy($proxy);
}
// output('Please set pause between requests to Instagram.');
// output('As lower delay as faster speed. Try to use 0 for example.');
// output('You should increase delay if you are using another type of automation-related to followers.');
// $delay = (int)getVarFromUser("Delay");
$delay = 0;
// if (!is_int($delay)) {
// do {
// output('Delay shoold be an integer value. Please type correct value.');
// $delay = getVarFromUser("Delay");
// } while (!is_int($delay));
// }
try {
output("Emulation of an Instagram app in initiated...");
$login_resp = $ig->login($login, $password);
if ($login_resp !== null && $login_resp->isTwoFactorRequired()) {
// Default verification method is phone
$twofa_method = '1';
// Detect is Authentification app verification is available
$is_totp = json_decode(json_encode($login_resp), true);
if ($is_totp['two_factor_info']['totp_two_factor_on'] == '1'){
output("Two-factor authentication required, please enter the code from you Authentication app");
$twofa_id = $login_resp->getTwoFactorInfo()->getTwoFactorIdentifier();
$twofa_method = '3';
} else {
output("Two-factor authentication required, please enter the code sent to your number ending in %s",
$login_resp->getTwoFactorInfo()->getObfuscatedPhoneNumber());
$twofa_id = $login_resp->getTwoFactorInfo()->getTwoFactorIdentifier();
}
$twofa_code = getVarFromUser("Two-factor code");
if (empty($twofa_code)) {
do {
$twofa_code = getVarFromUser("Two-factor code");
} while (empty($twofa_code));
}
try {
output("Two-factor authentication in progress...");
$twofa_resp = $ig->finishTwoFactorLogin($login, $password, $twofa_id, $twofa_code, $twofa_method);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
do {
output("Code is incorrect. Please check the syntax and try again.");
$twofa_code = getVarFromUser("Two-factor code");
if (empty($twofa_code)) {
do {
$twofa_code = getVarFromUser("Security code");
} while (empty($twofa_code));
}
try {
output("Verification in progress...");
$twofa_resp = $ig->finishTwoFactorLogin($login, $password, $twofa_id, $twofa_code, $twofa_method);
$is_code_correct = true;
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
}
} while (!$is_code_correct);
} catch (\Exception $e) {
$msg = $e->getMessage();
output($msg);
run($ig);
}
}
} catch (\InstagramAPI\Exception\NetworkException $e) {
output("We couldn't connect to Instagram at the moment. Please try again in few minutes.");
run($ig);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
output("Instagram send us empty response. Please try again in few minutes.");
run($ig);
} catch (\InstagramAPI\Exception\CheckpointRequiredException $e) {
output("Please go to Instagram website or mobile app and pass checkpoint!");
run($ig);
} catch (\InstagramAPI\Exception\ChallengeRequiredException $e) {
output("Instagram will send you a security code to verify your identity.");
output("How do you want receive this code?");
output("1 - [Email]");
output("2 - [SMS]");
output("3 - [Exit]");
$choice = getVarFromUser("Choice");
if (empty($choice)) {
do {
$choice = getVarFromUser("Choice");
} while (empty($choice));
}
if ($choice == '1' || $choice == '2' || $choice == '3') {
// All fine
} else {
do {
output("Choice is incorrect. Type 1, 2 or 3.");
$choice = getVarFromUser("Choice");
if (empty($choice)) {
do {
$choice = getVarFromUser("Choice");
} while (empty($choice));
}
} while ($choice != '1' || $choice != '2' || $choice != '3');
}
if ($choice == '3') {
run($ig);
} elseif ($choice == '1') {
$choice = 1;
} else {
$choice = 2;
}
$api_path = $e->getResponse()->getChallenge()->getApiPath();
$challenge_resp = $ig->sendChallangeCode($api_path, $choice);
// Failed to send challenge code via email. Try with SMS.
if ($challenge_resp->status != "ok") {
$choice = 2;
$challenge_resp = $ig->sendChallangeCode($api_path, $choice);
}
if ($challenge_resp->status != "ok") {
output("Couldn't send a verification code for the login challenge. Please try again later.");
run($ig);
}
$contact_point = $challenge_resp->step_data->contact_point;
if (isset($challenge_resp->step_data->contact_point)){
$contact_point = $challenge_resp->step_data->contact_point;
if ($choice == 2) {
output("Enter the code sent to your number ending in " . $contact_point . ".");
} else {
output("Enter the 6-digit code sent to the email address " . $contact_point . ".");
}
} else {
if ($choice == 2) {
output("Enter the code sent to your phone number.");
} else {
output("Enter the 6-digit code sent to your email address.");
}
}
$security_code = getVarFromUser("Security code");
if (empty($security_code)) {
do {
$security_code = getVarFromUser("Security code");
} while (empty($security_code));
}
try {
output("Verification in progress...");
$challenge_resp = $ig->finishChallengeLogin($login, $password, $api_path, $security_code);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
do {
output("Please check the security code sent to you and try again.");
$security_code= getVarFromUser("Security code");
if (empty($security_code)) {
do {
$security_code = getVarFromUser("Security code");
} while (empty($security_code));
}
try {
output("Verification in progress...");
$challenge_resp = $ig->finishChallengeLogin($login, $password, $api_path, $security_code);
$is_code_correct = true;
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
} catch (\Exception $e) {
$msg = $e->getMessage();
output($msg);
run($ig);
}
} while (!$is_code_correct);
} catch (\Exception $e) {
$msg = $e->getMessage();
if ($msg == 'Invalid Login Response at finishChallengeLogin().') {
sleep(7);
$ig = finishLogin($ig, $login, $password, $proxy);
} elseif ($msg == 'This field is required.') {
output("You should login to Instagram website or mobile app and attach mobile phone number to account.");
output("For advanced users: You can catch Instagram-session with Chrome/Opera extensions and save this session to /hyperloop/vendor/mgp25/instagram-php/sessions folder.");
} else {
$msg = $e->getMessage();
output($msg);
run($ig);
}
}
} catch (\InstagramAPI\Exception\AccountDisabledException $e) {
output("Your account has been disabled for violating Instagram terms. Go Instagram website or mobile app to learn how you may be able to restore your account.");
run($ig);
} catch (\InstagramAPI\Exception\ConsentRequiredException $e) {
output("Instagram updated Terms and Data Policy. Please go to Instagram website or mobile app to review these changes and accept them.");
run($ig);
} catch (\InstagramAPI\Exception\SentryBlockException $e) {
output("Your account has been banned from Instagram API for spam behaviour or otherwise abusing.");
run($ig);
} catch (\InstagramAPI\Exception\IncorrectPasswordException $e) {
output("The password you entered is incorrect. Please try again.");
run($ig);
} catch (\InstagramAPI\Exception\InvalidUserException $e) {
output("The username you entered doesn't appear to belong to an account. Please check your username and try again.");
run($ig);
} catch (\Exception $e) {
throw new Exception($e->getMessage());
run($ig);
}
output("Logged as @" . $login . " successfully.");
$data = define_targets($ig);
masslooking($data, $ig, $delay);
} catch (Exception $e){
output($e->getMessage());
run($ig);
}
}
/**
* Define targets for masslooking
*/
function define_targets($ig) {
do {
output("Please define the targets.");
output("Write all Instagram profile usernames via comma without '@' symbol.");
output("Example: apple, instagram, zendaya");
$targets_input = getVarFromUser("Usernames");
if (empty($targets_input)) {
do {
$targets_input = getVarFromUser("Usernames");
} while (empty($targets_input));
}
$targets_input = str_replace(' ','',$targets_input);
$targets = [];
$targets = explode(',',trim($targets_input));
$targets = array_unique($targets);
$pks = [];
$filtered_targets = [];
foreach ($targets as $target) {
try {
$user_resp = $ig->people->getUserIdForName($target);
output("@" . $target . " - [OK]");
$filtered_targets[] = $target;
$pks[] = $user_resp;
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\Exception $e) {
$is_username_correct = false;
do {
output("Instagram profile username @" . $target . " is incorrect.");
output("Type 3 for skip this target.");
$target_new = getVarFromUser("Please provide valid username");
if (empty($target_new)) {
do {
$target_new = getVarFromUser("Please provide valid username");
} while (empty($target_new));
}
if ($target_new == "3") {
break;
} else {
try {
$user_resp = $ig->people->getUserIdForName($target_new);
output("@" . $target_new . " - [OK]");
$filtered_targets[] = $target_new;
$pks[] = $user_resp;
$is_username_correct = true;
sleep(3);
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\Exception $e) {
$is_username_correct = false;
}
}
} while (!$is_username_correct);
}
}
} while ( empty($filtered_targets) );
$targets = array_unique($filtered_targets);
$pks = array_unique($pks);
$data = [];
for ($i = 0; $i < count($targets); $i++) {
$data[$i] = [
'username' => $targets[$i],
'pk' => $pks[$i],
];
}
output("Selected targets: @" . implode(", @", $targets) . ".");
output("Please confirm that the selected targets are correct.");
output("1 - [Yes]");
output("2 - [No]");
output("3 - [Exit]");
$confirm = getVarFromUser("Choice");
if (empty($confirm)) {
do {
$confirm = getVarFromUser("Choice");
} while (empty($confirm));
}
if ($confirm == '1' || $confirm == '2' || $confirm == '3') {
// All fine
} else {
do {
output("Choice is incorrect. Type 1, 2 or 3.");
$confirm = getVarFromUser("Choice");
if (empty($confirm)) {
do {
$confirm = getVarFromUser("Choice");
} while (empty($confirm));
}
} while ($confirm != '1' || $confirm != '2' || $confirm != '3');
}
if ($confirm == '3') {
run($ig);
} elseif ($confirm == '2') {
$data = define_targets($ig);
} else {
// All fine. Going to masslooking.
}
return $data;
}
/**
* Masslooking loop
*/
function masslooking($data, $ig, $delay) {
$rank_token = \InstagramAPI\Signatures::generateUUID();
$max_id = null;
$view_count = 0;
$st_count = 0;
$st_count_seen = 0;
$begin = strtotime(date("Y-m-d H:i:s"));
$speed = 0;
$delitel = 0;
$counter1 = 0;
$counter2 = 0;
$stories = [];
output("Masslooking started.");
foreach ($data as $d) {
$users_count = 0;
$is_gf_first = 1;
do {
try {
$followers = $ig->people->getFollowers($d['pk'], $rank_token, null, $max_id);
$begin_gf = strtotime(date("Y-m-d H:i:s"));
if (empty($followers->getUsers())) {
output("@" . $d['username'] . " don't have any follower.");
sleep(5);
continue;
}
$max_id = $followers->getNextMaxId();
$followers_ids = [];
foreach ($followers->getUsers() as $follower) {
$followers_ids[] = $follower->getPk();
}
$users_count = $users_count + count($followers_ids);
$number = count($followers_ids);
if ($is_gf_first) {
output($number . " followers of @" . $d['username'] . " collected.");
$is_gf_first = 0;
} else {
output("Next " . $number . " followers of @" . $d['username'] . " collected. Total: " . number_format($users_count, 0, '.', ' ') . " followers parsed.");
}
$index_new = 0;
$index_old = 0;
$last = false;
$begin_fs = strtotime(date("Y-m-d H:i:s"));
do {
$index_new += 13;
if (!isset($followers_ids[$index_new])) {
do {
$index_new -= 1;
} while (!isset($followers_ids[$index_new]));
$last = true;
}
if ($index_new < $index_old) {
break;
}
$ids = [];
for ($i = $index_old; $i <= $index_new; $i++) {
$ids[] = $followers_ids[$i];
}
try {
$stories_reels = $ig->story->getReelsMediaFeed($ids);
// $counter1 += 1;
if (isset($stories_reels) && $stories_reels->isOk() && count($stories_reels->getReels()->getData()) > 0) {
// Save user story reels's to array
$reels = [];
$reels = $stories_reels->getReels()->getData();
$stories_collected = [];
foreach ($reels as $r) {
$items = [];
$stories_loop = [];
$items = $r->getItems();
foreach ($items as $item) {
if (!$item->getId()) {
// Item is not valid
continue;
}
$stories_loop[] = $item;
}
if (empty($stories)) {
$stories = $stories_loop;
} else {
$stories = array_merge($stories, $stories_loop);
}
if (empty($stories_collected)) {
$stories_collected = $stories_loop;
} else {
$stories_collected = array_merge($stories_collected, $stories_loop);
}
}
$st_count = $st_count + count($stories_collected);
$view_count = $view_count + count($stories_collected);
$now = strtotime(date("Y-m-d H:i:s"));
if ($now - $begin >= 299) {
$begin = strtotime(date("Y-m-d H:i:s"));
$delitel = $delitel + 1;
$speed = (int)($view_count * 12 * 24 / $delitel);
output_clean("");
output_clean("Estimated speed is " . number_format($speed, 0, '.', ' ') . " stories/day.");
output_clean("");
}
// output($st_count . " stories found. / Debug: getReelsMediaFeed (" . $counter1 . "), markMediaSeen (" . $counter2 . ")");
output($st_count . " stories found in this loop.");
}
if ($st_count > 1500) {
// Mark collected stories as seen
$mark_seen_resp = $ig->story->markMediaSeen($stories);
$st_count_seen = number_format($st_count, 0, '.', ' ');
// $counter2 += 1;
// output($st_count_seen . " stories marked as seen. Total: " . number_format($view_count, 0, '.', ' ') . " stories successfully seen. / Debug: getReelsMediaFeed (" . $counter1 . "), markMediaSeen (" . $counter2 . ").");
output($st_count_seen . " stories marked as seen. Total: " . number_format($view_count, 0, '.', ' ') . " stories successfully seen.");
// Initialize arrays and parameters again
$stories = [];
$st_count = 0;
} elseif ($last && $max_id == null) {
// Mark collected stories as seen
$mark_seen_resp = $ig->story->markMediaSeen($stories);
$st_count_seen = number_format($st_count, 0, '.', ' ');
// $counter2 += 1;
// output($st_count_seen . " stories marked as seen. Total: " . number_format($view_count, 0, '.', ' ') . " stories successfully seen. / Debug: getReelsMediaFeed (" . $counter1 . "), markMediaSeen (" . $counter2 . ").");
output($st_count_seen . " stories marked as seen. Total: " . number_format($view_count, 0, '.', ' ') . " stories successfully seen.");
// Initialize arrays and parameters again
$stories = [];
$st_count = 0;
}
sleep($delay);
} catch (\InstagramAPI\Exception\NetworkException $e) {
output("We couldn't connect to Instagram at the moment. Trying again.");
sleep(7);
$index_new -= 13;
continue;
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
output("Instagram sent us empty response. Trying again.");
sleep(7);
$index_new -= 13;
continue;
} catch (\InstagramAPI\Exception\ThrottledException $e) {
output("Throttled by Instagram because of too many API requests.");
output("Please login again after 1 hour and you reached Instagram limits");
run($ig);
} catch (Exception $e){
output($e->getMessage());
sleep(5);
}
$index_old = $index_new + 1;
} while ($last == false);
// Check pause for account safety
$end_gf = strtotime(date("Y-m-d H:i:s"));
if (($end_gf - $begin_gf) < 5) {
$sleep_time = 5 - ($end_gf - $begin_gf);
sleep($sleep_time);
}
} catch (\InstagramAPI\Exception\NetworkException $e) {
output("We couldn't connect to Instagram at the moment. Trying again.");
sleep(7);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
output("Instagram send us empty response. Trying again.");
sleep(7);
} catch (\InstagramAPI\Exception\ThrottledException $e) {
output("Throttled by Instagram because of too many API requests.");
output("Please log in again after 1 hour and increase the delay between requests manually.");
run($ig);
} catch (Exception $e){
output($e->getMessage());
sleep(7);
}
} while ($max_id !== null);
if (empty($followers->getUsers())) {
continue;
}
output("All stories of @" . $d['username'] . "'s followers successfully seen.");
}
output("All stories related to the targets seen. Starting the new loop.");
masslooking($data, $ig, $delay);
}
/**
* Get varable from user
*/
function getVarFromUser($text) {
echo $text . ": ";
$var = trim(fgets(STDIN));
return $var;
}
/**
* Output message with data to console
*/
function output($message) {
echo "[", date("H:i:s"), "] ", $message, PHP_EOL;
}
/**
* Output clean message to console
*/
function output_clean($message) {
echo $message, PHP_EOL;
}
/**
* Validates proxy address
*/
function isValidProxy($proxy) {
output("Connecting to Instagram...");
try {
$client = new \GuzzleHttp\Client();
$res = $client->request('GET', 'http://www.instagram.com',
[
"timeout" => 30,
"proxy" => $proxy
]);
$code = $res->getStatusCode();
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
$code = isValidProxy($proxy);
} catch (\Exception $e) {
output($e->getMessage());
return false;
}
return $code == 200;
}
/**
* Validates proxy address
*/
function finishLogin($ig, $login, $password, $proxy) {
$success = false;
do {
if ($proxy == "3") {
// Skip proxy setup
} else {
$ig->setProxy($proxy);
}
try {
$login_resp = $ig->login($login, $password);
if ($login_resp !== null && $login_resp->isTwoFactorRequired()) {
// Default verification method is phone
$twofa_method = '1';
// Detect is Authentification app verification is available
$is_totp = json_decode(json_encode($login_resp), true);
if ($is_totp['two_factor_info']['totp_two_factor_on'] == '1'){
output("Two-factor authentication required, please enter the code from you Authentication app");
$twofa_id = $login_resp->getTwoFactorInfo()->getTwoFactorIdentifier();
$twofa_method = '3';
} else {
output("Two-factor authentication required, please enter the code sent to your number ending in %s",
$login_resp->getTwoFactorInfo()->getObfuscatedPhoneNumber());
$twofa_id = $login_resp->getTwoFactorInfo()->getTwoFactorIdentifier();
}
$twofa_code = getVarFromUser("Two-factor code");
if (empty($twofa_code)) {
do {
$twofa_code = getVarFromUser("Two-factor code");
} while (empty($twofa_code));
}
try {
output("Two-factor authentication in progress...");
$twofa_resp = $ig->finishTwoFactorLogin($login, $password, $twofa_id, $twofa_code, $twofa_method);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
do {
output("Code is incorrect. Please check the syntax and try again.");
$twofa_code = getVarFromUser("Two-factor code");
if (empty($security_code)) {
do {
$security_code = getVarFromUser("Security code");
} while (empty($security_code));
}
try {
output("Verification in progress...");
$twofa_resp = $ig->finishTwoFactorLogin($login, $password, $twofa_id, $twofa_code, $twofa_method);
$is_code_correct = true;
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\InvalidSmsCodeException $e) {
$is_code_correct = false;
} catch (\Exception $e) {
$msg = $e->getMessage();
output($msg);
run($ig);
}
} while (!$is_code_correct);
} catch (\Exception $e) {
$msg = $e->getMessage();
output($msg);
run($ig);
}
}
$success = true;
} catch (\InstagramAPI\Exception\NetworkException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\EmptyResponseException $e) {
sleep(3);
} catch (\InstagramAPI\Exception\CheckpointRequiredException $e) {
output("Please go to Instagram website or mobile app and pass checkpoint!");
run($ig);
} catch (\InstagramAPI\Exception\ChallengeRequiredException $e) {
output("Challenge loop. Something wring with your account");
run($ig);
} catch (\Exception $e) {
$msg = $e->getMessage();
output($msg);
run($ig);
}
} while (!$success);
return $ig;
}
Did this file decode correctly?
Original Code
<?php
eval(base64_decode("cmVxdWlyZSBfX0RJUl9fLicvdmVuZG9yL2F1dG9sb2FkLnBocCc7CiRpZyA9IG5ldyBcSW5zdGFn
cmFtQVBJXEluc3RhZ3JhbSgpOwoKb3V0cHV0X2NsZWFuKCIKIF8gICBfICAgICAgICAgICAgICAg
ICAgICAgICBfICAgICAgICAgICAgICAgICAgIAp8IHwgfCB8ICAgICAgICAgICAgICAgICAgICAg
fCB8ICAgICAgICAgICAgICAgICAgCnwgfF98IHxfICAgXyBfIF9fICAgX19fIF8gX198IHwgX19f
ICAgX19fICBfIF9fICAKfCAgXyAgfCB8IHwgfCAnXyBcIC8gXyBcICdfX3wgfC8gXyBcIC8gXyBc
fCAnXyBcIAp8IHwgfCB8IHxffCB8IHxfKSB8ICBfXy8gfCAgfCB8IChfKSB8IChfKSB8IHxfKSB8
ClxffCB8Xy9cX18sIHwgLl9fLyBcX19ffF98ICB8X3xcX19fLyBcX19fL3wgLl9fLyAKICAgICAg
ICBfXy8gfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgIAogICAgICAgfF9fXy98
X3wgICAgICAgICAgICAgICAgICAgICAgICAgICB8X3wgICAgICAgIAoiKTsKCm91dHB1dF9jbGVh
bigiIik7Cm91dHB1dF9jbGVhbigiSHlwZXJsb29wIFRlcm1pbmFsIik7Cm91dHB1dF9jbGVhbigi
di4yLjAiKTsKb3V0cHV0X2NsZWFuKCIiKTsKb3V0cHV0X2NsZWFuKCLCqSBEZXZlbG9wZWQgYnkg
TmV4dHBvc3QgRGV2ZWxvcGVycyBUZWFtIChodHRwczovL25leHRwb3N0LnRlY2gpIik7Cm91dHB1
dF9jbGVhbigiIik7CgpydW4oJGlnKTsKCi8qKgogKiBMZXQncyBzdGFydCB0aGUgc2hvdwogKi8K
ZnVuY3Rpb24gcnVuKCRpZykgewogICAgdHJ5IHsKCiAgICAgICAgb3V0cHV0KCdQbGVhc2UgcHJv
dmlkZSBsb2dpbiBkYXRhIG9mIHlvdXIgSW5zdGFncmFtIEFjY291bnQuJyk7CiAgICAgICAgJGxv
Z2luID0gZ2V0VmFyRnJvbVVzZXIoIkxvZ2luIik7CgogICAgICAgIGlmIChlbXB0eSgkbG9naW4p
KSB7CiAgICAgICAgICAgIGRvIHsgCiAgICAgICAgICAgICAgICAkbG9naW4gPSBnZXRWYXJGcm9t
VXNlcigiTG9naW4iKTsgCiAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCRsb2dpbikpOwogICAg
ICAgIH0KCiAgICAgICAgJHBhc3N3b3JkID0gZ2V0VmFyRnJvbVVzZXIoIlBhc3N3b3JkIik7Cgog
ICAgICAgIGlmIChlbXB0eSgkcGFzc3dvcmQpKSB7CiAgICAgICAgICAgIGRvIHsgCiAgICAgICAg
ICAgICAgICAkcGFzc3dvcmQgPSBnZXRWYXJGcm9tVXNlcigiUGFzc3dvcmQiKTsKICAgICAgICAg
ICAgfSB3aGlsZSAoZW1wdHkoJHBhc3N3b3JkKSk7CiAgICAgICAgfQoKICAgICAgICAkZmlyc3Rf
bG9vcCA9IHRydWU7CiAgICAgICAgZG8gewogICAgICAgICAgICBpZiAoJGZpcnN0X2xvb3ApIHsK
ICAgICAgICAgICAgICAgIG91dHB1dCgiKE9wdGlvbmFsKSBTZXQgcHJveHksIGlmIG5lZWRlZC4i
KTsKICAgICAgICAgICAgICAgIG91dHB1dCgiUHJveHkgc2hvdWxkIG1hdGNoIGZvbGxvd2luZyBw
YXR0ZXJuOiIpOwogICAgICAgICAgICAgICAgb3V0cHV0KCJodHRwOi8vaXA6cG9ydCBvciBodHRw
Oi8vdXNlcm5hbWU6cGFzc3dvcmRAaXA6cG9ydCIpOwogICAgICAgICAgICAgICAgb3V0cHV0KCJE
b24ndCB1c2UgaW4gcGF0dGVybiBodHRwczovLy4iKTsKICAgICAgICAgICAgICAgIG91dHB1dCgi
VHlwZSAzIHRvIHNraXAgYW5kIGRvbid0IHVzZSBwcm94eS4iKTsKICAgICAgICAgICAgICAgICRm
aXJzdF9sb29wID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBv
dXRwdXQoIlByb3h5IC0gW05PVCBWQUxJRF0iKTsKICAgICAgICAgICAgICAgIG91dHB1dCgiUGxl
YXNlIGNoZWNrIHRoZSBwcm94eSBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iKTsKICAgICAgICAgICAg
fQoKICAgICAgICAgICAgJHByb3h5ID0gZ2V0VmFyRnJvbVVzZXIoIlByb3h5Iik7CgogICAgICAg
ICAgICBpZiAoZW1wdHkoJHByb3h5KSkgewogICAgICAgICAgICAgICAgZG8geyAKICAgICAgICAg
ICAgICAgICAgICAkcHJveHkgPSBnZXRWYXJGcm9tVXNlcigiUHJveHkiKTsKICAgICAgICAgICAg
ICAgIH0gd2hpbGUgKGVtcHR5KCRwcm94eSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBp
ZiAoJHByb3h5ID09ICczJykgewogICAgICAgICAgICAgICAgLy8gU2tpcCBwcm94eSBzZXR1cAog
ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICghaXNW
YWxpZFByb3h5KCRwcm94eSkpOwoKICAgICAgICBpZiAoJHByb3h5ID09ICIzIikgewogICAgICAg
ICAgIC8vIC8vIFNraXAgcHJveHkgc2V0dXAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBv
dXRwdXQoIlByb3h5IC0gW09LXSIpOwogICAgICAgICAgICAkaWctPnNldFByb3h5KCRwcm94eSk7
CiAgICAgICAgfQoKICAgICAgICAvLyBvdXRwdXQoJ1BsZWFzZSBzZXQgcGF1c2UgYmV0d2VlbiBy
ZXF1ZXN0cyB0byBJbnN0YWdyYW0uJyk7CiAgICAgICAgLy8gb3V0cHV0KCdBcyBsb3dlciBkZWxh
eSBhcyBmYXN0ZXIgc3BlZWQuIFRyeSB0byB1c2UgMCBmb3IgZXhhbXBsZS4nKTsKICAgICAgICAv
LyBvdXRwdXQoJ1lvdSBzaG91bGQgaW5jcmVhc2UgZGVsYXkgaWYgeW91IGFyZSB1c2luZyBhbm90
aGVyIHR5cGUgb2YgYXV0b21hdGlvbi1yZWxhdGVkIHRvIGZvbGxvd2Vycy4nKTsKICAgICAgICAv
LyAkZGVsYXkgPSAoaW50KWdldFZhckZyb21Vc2VyKCJEZWxheSIpOwogICAgICAgICRkZWxheSA9
IDA7CgogICAgICAgIC8vIGlmICghaXNfaW50KCRkZWxheSkpIHsKICAgICAgICAvLyAgICBkbyB7
IAogICAgICAgIC8vICAgICAgICBvdXRwdXQoJ0RlbGF5IHNob29sZCBiZSBhbiBpbnRlZ2VyIHZh
bHVlLiBQbGVhc2UgdHlwZSBjb3JyZWN0IHZhbHVlLicpOwogICAgICAgIC8vICAgICAgICAkZGVs
YXkgPSBnZXRWYXJGcm9tVXNlcigiRGVsYXkiKTsKICAgICAgICAvLyAgICB9IHdoaWxlICghaXNf
aW50KCRkZWxheSkpOwogICAgICAgIC8vIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0
cHV0KCJFbXVsYXRpb24gb2YgYW4gSW5zdGFncmFtIGFwcCBpbiBpbml0aWF0ZWQuLi4iKTsKICAg
ICAgICAgICAgJGxvZ2luX3Jlc3AgPSAkaWctPmxvZ2luKCRsb2dpbiwgJHBhc3N3b3JkKTsKCiAg
ICAgICAgICAgIGlmICgkbG9naW5fcmVzcCAhPT0gbnVsbCAmJiAkbG9naW5fcmVzcC0+aXNUd29G
YWN0b3JSZXF1aXJlZCgpKSB7CiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHZlcmlmaWNhdGlv
biBtZXRob2QgaXMgcGhvbmUKICAgICAgICAgICAgICAgICR0d29mYV9tZXRob2QgPSAnMSc7Cgog
ICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGlzIEF1dGhlbnRpZmljYXRpb24gYXBwIHZlcmlmaWNh
dGlvbiBpcyBhdmFpbGFibGUgCiAgICAgICAgICAgICAgICAkaXNfdG90cCA9IGpzb25fZGVjb2Rl
KGpzb25fZW5jb2RlKCRsb2dpbl9yZXNwKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoJGlz
X3RvdHBbJ3R3b19mYWN0b3JfaW5mbyddWyd0b3RwX3R3b19mYWN0b3Jfb24nXSA9PSAnMScpewog
ICAgICAgICAgICAgICAgICAgIG91dHB1dCgiVHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiByZXF1
aXJlZCwgcGxlYXNlIGVudGVyIHRoZSBjb2RlIGZyb20geW91IEF1dGhlbnRpY2F0aW9uIGFwcCIp
OwogICAgICAgICAgICAgICAgICAgICR0d29mYV9pZCA9ICRsb2dpbl9yZXNwLT5nZXRUd29GYWN0
b3JJbmZvKCktPmdldFR3b0ZhY3RvcklkZW50aWZpZXIoKTsKICAgICAgICAgICAgICAgICAgICAk
dHdvZmFfbWV0aG9kID0gJzMnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg
ICAgICAgICBvdXRwdXQoIlR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gcmVxdWlyZWQsIHBsZWFz
ZSBlbnRlciB0aGUgY29kZSBzZW50IHRvIHlvdXIgbnVtYmVyIGVuZGluZyBpbiAlcyIsIAogICAg
ICAgICAgICAgICAgICAgICAgICAkbG9naW5fcmVzcC0+Z2V0VHdvRmFjdG9ySW5mbygpLT5nZXRP
YmZ1c2NhdGVkUGhvbmVOdW1iZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgJHR3b2ZhX2lkID0g
JGxvZ2luX3Jlc3AtPmdldFR3b0ZhY3RvckluZm8oKS0+Z2V0VHdvRmFjdG9ySWRlbnRpZmllcigp
OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0d29mYV9jb2RlID0gZ2V0VmFy
RnJvbVVzZXIoIlR3by1mYWN0b3IgY29kZSIpOwoKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgk
dHdvZmFfY29kZSkpIHsKICAgICAgICAgICAgICAgICAgICBkbyB7IAogICAgICAgICAgICAgICAg
ICAgICAgICAkdHdvZmFfY29kZSA9IGdldFZhckZyb21Vc2VyKCJUd28tZmFjdG9yIGNvZGUiKTsK
ICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlbXB0eSgkdHdvZmFfY29kZSkpOwogICAgICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0
cHV0KCJUd28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzLi4uIik7CiAgICAgICAg
ICAgICAgICAgICAgJHR3b2ZhX3Jlc3AgPSAkaWctPmZpbmlzaFR3b0ZhY3RvckxvZ2luKCRsb2dp
biwgJHBhc3N3b3JkLCAkdHdvZmFfaWQsICR0d29mYV9jb2RlLCAkdHdvZmFfbWV0aG9kKTsKICAg
ICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9uXEludmFsaWRTbXND
b2RlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGlzX2NvZGVfY29ycmVjdCA9
IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cHV0KCJDb2RlIGlzIGluY29ycmVjdC4gUGxlYXNlIGNoZWNrIHRoZSBzeW50YXggYW5kIHRy
eSBhZ2Fpbi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHR3b2ZhX2NvZGUgPSBnZXRWYXJG
cm9tVXNlcigiVHdvLWZhY3RvciBjb2RlIik7CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGVtcHR5KCR0d29mYV9jb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8g
eyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHdvZmFfY29kZSA9IGdldFZhckZy
b21Vc2VyKCJTZWN1cml0eSBjb2RlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdo
aWxlIChlbXB0eSgkdHdvZmFfY29kZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG91dHB1dCgiVmVyaWZpY2F0aW9uIGluIHByb2dyZXNzLi4uIik7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAkdHdvZmFfcmVzcCA9ICRpZy0+ZmluaXNoVHdvRmFjdG9yTG9naW4oJGxvZ2lu
LCAkcGFzc3dvcmQsICR0d29mYV9pZCwgJHR3b2ZhX2NvZGUsICR0d29mYV9tZXRob2QpOwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJGlzX2NvZGVfY29ycmVjdCA9IHRydWU7CiAgICAgICAg
ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9uXE5ldHdvcmtF
eGNlcHRpb24gJGUpIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgzKTsKICAg
ICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cRW1w
dHlSZXNwb25zZUV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xl
ZXAoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhj
ZXB0aW9uXEludmFsaWRTbXNDb2RlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAkaXNfY29kZV9jb3JyZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghJGlzX2NvZGVfY29ycmVjdCk7CiAgICAg
ICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAg
JG1zZyA9ICRlLT5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCRtc2cp
OwogICAgICAgICAgICAgICAgICAgIHJ1bigkaWcpOwogICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICB9CiAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cTmV0d29ya0V4
Y2VwdGlvbiAkZSkgeyAKICAgICAgICAgICAgb3V0cHV0KCJXZSBjb3VsZG4ndCBjb25uZWN0IHRv
IEluc3RhZ3JhbSBhdCB0aGUgbW9tZW50LiBQbGVhc2UgdHJ5IGFnYWluIGluIGZldyBtaW51dGVz
LiIpOwogICAgICAgICAgICBydW4oJGlnKTsKICAgICAgICB9IGNhdGNoIChcSW5zdGFncmFtQVBJ
XEV4Y2VwdGlvblxFbXB0eVJlc3BvbnNlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIG91dHB1
dCgiSW5zdGFncmFtIHNlbmQgdXMgZW1wdHkgcmVzcG9uc2UuIFBsZWFzZSB0cnkgYWdhaW4gaW4g
ZmV3IG1pbnV0ZXMuIik7CiAgICAgICAgICAgIHJ1bigkaWcpOwogICAgICAgIH0gY2F0Y2ggKFxJ
bnN0YWdyYW1BUElcRXhjZXB0aW9uXENoZWNrcG9pbnRSZXF1aXJlZEV4Y2VwdGlvbiAkZSkgewog
ICAgICAgICAgICBvdXRwdXQoIlBsZWFzZSBnbyB0byBJbnN0YWdyYW0gd2Vic2l0ZSBvciBtb2Jp
bGUgYXBwIGFuZCBwYXNzIGNoZWNrcG9pbnQhIik7CiAgICAgICAgICAgIHJ1bigkaWcpOwogICAg
ICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9uXENoYWxsZW5nZVJlcXVpcmVkRXhj
ZXB0aW9uICRlKSB7CiAgICAgICAgICAgIG91dHB1dCgiSW5zdGFncmFtIHdpbGwgc2VuZCB5b3Ug
YSBzZWN1cml0eSBjb2RlIHRvIHZlcmlmeSB5b3VyIGlkZW50aXR5LiIpOwogICAgICAgICAgICBv
dXRwdXQoIkhvdyBkbyB5b3Ugd2FudCByZWNlaXZlIHRoaXMgY29kZT8iKTsKICAgICAgICAgICAg
b3V0cHV0KCIxIC0gW0VtYWlsXSIpOwogICAgICAgICAgICBvdXRwdXQoIjIgLSBbU01TXSIpOwog
ICAgICAgICAgICBvdXRwdXQoIjMgLSBbRXhpdF0iKTsKCiAgICAgICAgICAgICRjaG9pY2UgPSBn
ZXRWYXJGcm9tVXNlcigiQ2hvaWNlIik7CgogICAgICAgICAgICBpZiAoZW1wdHkoJGNob2ljZSkp
IHsKICAgICAgICAgICAgICAgIGRvIHsgCiAgICAgICAgICAgICAgICAgICAgJGNob2ljZSA9IGdl
dFZhckZyb21Vc2VyKCJDaG9pY2UiKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCRj
aG9pY2UpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRjaG9pY2UgPT0gJzEnIHx8
ICRjaG9pY2UgPT0gJzInIHx8ICRjaG9pY2UgPT0gJzMnKSB7CiAgICAgICAgICAgICAgICAvLyBB
bGwgZmluZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZG8gewogICAgICAg
ICAgICAgICAgICAgIG91dHB1dCgiQ2hvaWNlIGlzIGluY29ycmVjdC4gVHlwZSAxLCAyIG9yIDMu
Iik7CiAgICAgICAgICAgICAgICAgICAgJGNob2ljZSA9IGdldFZhckZyb21Vc2VyKCJDaG9pY2Ui
KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRjaG9pY2UpKSB7CiAgICAgICAgICAg
ICAgICAgICAgICAgIGRvIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hvaWNlID0g
Z2V0VmFyRnJvbVVzZXIoIkNob2ljZSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxl
IChlbXB0eSgkY2hvaWNlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
fSB3aGlsZSAoJGNob2ljZSAhPSAnMScgfHwgJGNob2ljZSAhPSAnMicgfHwgJGNob2ljZSAhPSAn
MycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNob2ljZSA9PSAnMycpIHsKICAg
ICAgICAgICAgICAgIHJ1bigkaWcpOwogICAgICAgICAgICB9IGVsc2VpZiAoJGNob2ljZSA9PSAn
MScpIHsKICAgICAgICAgICAgICAgICRjaG9pY2UgPSAxOwogICAgICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICAgICAgJGNob2ljZSA9IDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRh
cGlfcGF0aCA9ICRlLT5nZXRSZXNwb25zZSgpLT5nZXRDaGFsbGVuZ2UoKS0+Z2V0QXBpUGF0aCgp
OwoKICAgICAgICAgICAgJGNoYWxsZW5nZV9yZXNwID0gJGlnLT5zZW5kQ2hhbGxhbmdlQ29kZSgk
YXBpX3BhdGgsICRjaG9pY2UpOwoKICAgICAgICAgICAgLy8gRmFpbGVkIHRvIHNlbmQgY2hhbGxl
bmdlIGNvZGUgdmlhIGVtYWlsLiBUcnkgd2l0aCBTTVMuCiAgICAgICAgICAgIGlmICgkY2hhbGxl
bmdlX3Jlc3AtPnN0YXR1cyAhPSAib2siKSB7CiAgICAgICAgICAgICAgICAkY2hvaWNlID0gMjsK
ICAgICAgICAgICAgICAgICRjaGFsbGVuZ2VfcmVzcCA9ICRpZy0+c2VuZENoYWxsYW5nZUNvZGUo
JGFwaV9wYXRoLCAkY2hvaWNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRjaGFs
bGVuZ2VfcmVzcC0+c3RhdHVzICE9ICJvayIpIHsKICAgICAgICAgICAgICAgIG91dHB1dCgiQ291
bGRuJ3Qgc2VuZCBhIHZlcmlmaWNhdGlvbiBjb2RlIGZvciB0aGUgbG9naW4gY2hhbGxlbmdlLiBQ
bGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIpOwogICAgICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgICRjb250YWN0X3BvaW50ID0gJGNoYWxsZW5nZV9yZXNwLT5z
dGVwX2RhdGEtPmNvbnRhY3RfcG9pbnQ7CgogICAgICAgICAgICBpZiAoaXNzZXQoJGNoYWxsZW5n
ZV9yZXNwLT5zdGVwX2RhdGEtPmNvbnRhY3RfcG9pbnQpKXsKICAgICAgICAgICAgICAgICRjb250
YWN0X3BvaW50ID0gJGNoYWxsZW5nZV9yZXNwLT5zdGVwX2RhdGEtPmNvbnRhY3RfcG9pbnQ7CiAg
ICAgICAgICAgICAgICBpZiAoJGNob2ljZSA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0
cHV0KCJFbnRlciB0aGUgY29kZSBzZW50IHRvIHlvdXIgbnVtYmVyIGVuZGluZyBpbiAiIC4gJGNv
bnRhY3RfcG9pbnQgLiAiLiIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg
ICAgICAgICBvdXRwdXQoIkVudGVyIHRoZSA2LWRpZ2l0IGNvZGUgc2VudCB0byB0aGUgZW1haWwg
YWRkcmVzcyAiIC4gJGNvbnRhY3RfcG9pbnQgLiAiLiIpOwogICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCRjaG9pY2UgPT0gMikgewogICAg
ICAgICAgICAgICAgICAgIG91dHB1dCgiRW50ZXIgdGhlIGNvZGUgc2VudCB0byB5b3VyIHBob25l
IG51bWJlci4iKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAg
b3V0cHV0KCJFbnRlciB0aGUgNi1kaWdpdCBjb2RlIHNlbnQgdG8geW91ciBlbWFpbCBhZGRyZXNz
LiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2VjdXJp
dHlfY29kZSA9IGdldFZhckZyb21Vc2VyKCJTZWN1cml0eSBjb2RlIik7CgogICAgICAgICAgICBp
ZiAoZW1wdHkoJHNlY3VyaXR5X2NvZGUpKSB7CiAgICAgICAgICAgICAgICBkbyB7IAogICAgICAg
ICAgICAgICAgICAgICRzZWN1cml0eV9jb2RlID0gZ2V0VmFyRnJvbVVzZXIoIlNlY3VyaXR5IGNv
ZGUiKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCRzZWN1cml0eV9jb2RlKSk7CiAg
ICAgICAgICAgIH0KCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvdXRwdXQoIlZl
cmlmaWNhdGlvbiBpbiBwcm9ncmVzcy4uLiIpOwogICAgICAgICAgICAgICAgJGNoYWxsZW5nZV9y
ZXNwID0gJGlnLT5maW5pc2hDaGFsbGVuZ2VMb2dpbigkbG9naW4sICRwYXNzd29yZCwgJGFwaV9w
YXRoLCAkc2VjdXJpdHlfY29kZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElc
RXhjZXB0aW9uXEludmFsaWRTbXNDb2RlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAk
aXNfY29kZV9jb3JyZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAg
ICAgICAgICAgb3V0cHV0KCJQbGVhc2UgY2hlY2sgdGhlIHNlY3VyaXR5IGNvZGUgc2VudCB0byB5
b3UgYW5kIHRyeSBhZ2Fpbi4iKTsKICAgICAgICAgICAgICAgICAgICAkc2VjdXJpdHlfY29kZT0g
Z2V0VmFyRnJvbVVzZXIoIlNlY3VyaXR5IGNvZGUiKTsKCiAgICAgICAgICAgICAgICAgICAgaWYg
KGVtcHR5KCRzZWN1cml0eV9jb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkbyB7IAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlY3VyaXR5X2NvZGUgPSBnZXRWYXJGcm9tVXNl
cigiU2VjdXJpdHkgY29kZSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlbXB0
eSgkc2VjdXJpdHlfY29kZSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAg
ICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCJWZXJpZmljYXRpb24g
aW4gcHJvZ3Jlc3MuLi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoYWxsZW5nZV9yZXNw
ID0gJGlnLT5maW5pc2hDaGFsbGVuZ2VMb2dpbigkbG9naW4sICRwYXNzd29yZCwgJGFwaV9wYXRo
LCAkc2VjdXJpdHlfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpc19jb2RlX2NvcnJl
Y3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhj
ZXB0aW9uXE5ldHdvcmtFeGNlcHRpb24gJGUpIHsgCiAgICAgICAgICAgICAgICAgICAgICAgIHNs
ZWVwKDMpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0
aW9uXEVtcHR5UmVzcG9uc2VFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAg
c2xlZXAoMyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNl
cHRpb25cSW52YWxpZFNtc0NvZGVFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgICAgICAg
ICAgJGlzX2NvZGVfY29ycmVjdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gg
KFxFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG1zZyA9ICRlLT5nZXRN
ZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCgkbXNnKTsKICAgICAgICAg
ICAgICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgfSB3aGlsZSAoISRpc19jb2RlX2NvcnJlY3QpOwogICAgICAgICAgICB9IGNhdGNoIChc
RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkbXNnID0gJGUtPmdldE1lc3NhZ2UoKTsK
ICAgICAgICAgICAgICAgIGlmICgkbXNnID09ICdJbnZhbGlkIExvZ2luIFJlc3BvbnNlIGF0IGZp
bmlzaENoYWxsZW5nZUxvZ2luKCkuJykgewogICAgICAgICAgICAgICAgICAgIHNsZWVwKDcpOwog
ICAgICAgICAgICAgICAgICAgICRpZyA9IGZpbmlzaExvZ2luKCRpZywgJGxvZ2luLCAkcGFzc3dv
cmQsICRwcm94eSk7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJG1zZyA9PSAnVGhpcyBmaWVs
ZCBpcyByZXF1aXJlZC4nKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCJZb3Ugc2hvdWxk
IGxvZ2luIHRvIEluc3RhZ3JhbSB3ZWJzaXRlIG9yIG1vYmlsZSBhcHAgYW5kIGF0dGFjaCBtb2Jp
bGUgcGhvbmUgbnVtYmVyIHRvIGFjY291bnQuIik7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0
KCJGb3IgYWR2YW5jZWQgdXNlcnM6IFlvdSBjYW4gY2F0Y2ggSW5zdGFncmFtLXNlc3Npb24gd2l0
aCBDaHJvbWUvT3BlcmEgZXh0ZW5zaW9ucyBhbmQgc2F2ZSB0aGlzIHNlc3Npb24gdG8gL2h5cGVy
bG9vcC92ZW5kb3IvbWdwMjUvaW5zdGFncmFtLXBocC9zZXNzaW9ucyBmb2xkZXIuIik7CiAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRtc2cgPSAkZS0+Z2V0TWVz
c2FnZSgpOwogICAgICAgICAgICAgICAgICAgIG91dHB1dCgkbXNnKTsKICAgICAgICAgICAgICAg
ICAgICBydW4oJGlnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0g
Y2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9uXEFjY291bnREaXNhYmxlZEV4Y2VwdGlvbiAk
ZSkgewogICAgICAgICAgICBvdXRwdXQoIllvdXIgYWNjb3VudCBoYXMgYmVlbiBkaXNhYmxlZCBm
b3IgdmlvbGF0aW5nIEluc3RhZ3JhbSB0ZXJtcy4gR28gSW5zdGFncmFtIHdlYnNpdGUgb3IgbW9i
aWxlIGFwcCB0byBsZWFybiBob3cgeW91IG1heSBiZSBhYmxlIHRvIHJlc3RvcmUgeW91ciBhY2Nv
dW50LiIpOwogICAgICAgICAgICBydW4oJGlnKTsKICAgICAgICB9IGNhdGNoIChcSW5zdGFncmFt
QVBJXEV4Y2VwdGlvblxDb25zZW50UmVxdWlyZWRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAg
b3V0cHV0KCJJbnN0YWdyYW0gdXBkYXRlZCBUZXJtcyBhbmQgRGF0YSBQb2xpY3kuIFBsZWFzZSBn
byB0byBJbnN0YWdyYW0gd2Vic2l0ZSBvciBtb2JpbGUgYXBwIHRvIHJldmlldyB0aGVzZSBjaGFu
Z2VzIGFuZCBhY2NlcHQgdGhlbS4iKTsKICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgfSBj
YXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cU2VudHJ5QmxvY2tFeGNlcHRpb24gJGUpIHsK
ICAgICAgICAgICAgb3V0cHV0KCJZb3VyIGFjY291bnQgaGFzIGJlZW4gYmFubmVkIGZyb20gSW5z
dGFncmFtIEFQSSBmb3Igc3BhbSBiZWhhdmlvdXIgb3Igb3RoZXJ3aXNlIGFidXNpbmcuIik7CiAg
ICAgICAgICAgIHJ1bigkaWcpOwogICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0
aW9uXEluY29ycmVjdFBhc3N3b3JkRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIG91dHB1dCgi
VGhlIHBhc3N3b3JkIHlvdSBlbnRlcmVkIGlzIGluY29ycmVjdC4gUGxlYXNlIHRyeSBhZ2Fpbi4i
KTsKICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxF
eGNlcHRpb25cSW52YWxpZFVzZXJFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgb3V0cHV0KCJU
aGUgdXNlcm5hbWUgeW91IGVudGVyZWQgZG9lc24ndCBhcHBlYXIgdG8gYmVsb25nIHRvIGFuIGFj
Y291bnQuIFBsZWFzZSBjaGVjayB5b3VyIHVzZXJuYW1lIGFuZCB0cnkgYWdhaW4uIik7CiAgICAg
ICAgICAgIHJ1bigkaWcpOwogICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKICAgICAg
ICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAg
cnVuKCRpZyk7CiAgICAgICAgfQogICAgICAgIG91dHB1dCgiTG9nZ2VkIGFzIEAiIC4gJGxvZ2lu
IC4gIiBzdWNjZXNzZnVsbHkuIik7CgogICAgICAgICRkYXRhID0gZGVmaW5lX3RhcmdldHMoJGln
KTsKCiAgICAgICAgbWFzc2xvb2tpbmcoJGRhdGEsICRpZywgJGRlbGF5KTsKCiAgICB9IGNhdGNo
IChFeGNlcHRpb24gJGUpewogICAgICAgIG91dHB1dCgkZS0+Z2V0TWVzc2FnZSgpKTsKICAgICAg
ICBydW4oJGlnKTsKICAgIH0KfQoKLyoqCiAqIERlZmluZSB0YXJnZXRzIGZvciBtYXNzbG9va2lu
ZwogKi8KZnVuY3Rpb24gZGVmaW5lX3RhcmdldHMoJGlnKSB7CgogICAgZG8gewogICAgICAgIG91
dHB1dCgiUGxlYXNlIGRlZmluZSB0aGUgdGFyZ2V0cy4iKTsKICAgICAgICBvdXRwdXQoIldyaXRl
IGFsbCBJbnN0YWdyYW0gcHJvZmlsZSB1c2VybmFtZXMgdmlhIGNvbW1hIHdpdGhvdXQgJ0AnIHN5
bWJvbC4iKTsKICAgICAgICBvdXRwdXQoIkV4YW1wbGU6IGFwcGxlLCBpbnN0YWdyYW0sIHplbmRh
eWEiKTsKICAgICAgICAkdGFyZ2V0c19pbnB1dCA9IGdldFZhckZyb21Vc2VyKCJVc2VybmFtZXMi
KTsKCiAgICAgICAgaWYgKGVtcHR5KCR0YXJnZXRzX2lucHV0KSkgewogICAgICAgICAgICBkbyB7
IAogICAgICAgICAgICAgICAgJHRhcmdldHNfaW5wdXQgPSBnZXRWYXJGcm9tVXNlcigiVXNlcm5h
bWVzIik7CiAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCR0YXJnZXRzX2lucHV0KSk7CiAgICAg
ICAgfQoKICAgICAgICAkdGFyZ2V0c19pbnB1dCA9IHN0cl9yZXBsYWNlKCcgJywnJywkdGFyZ2V0
c19pbnB1dCk7CiAgICAgICAgJHRhcmdldHMgPSBbXTsKICAgICAgICAkdGFyZ2V0cyA9IGV4cGxv
ZGUoJywnLHRyaW0oJHRhcmdldHNfaW5wdXQpKTsKICAgICAgICAkdGFyZ2V0cyA9IGFycmF5X3Vu
aXF1ZSgkdGFyZ2V0cyk7CgogICAgICAgICRwa3MgPSBbXTsKICAgICAgICAkZmlsdGVyZWRfdGFy
Z2V0cyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCR0YXJnZXRzIGFzICR0YXJnZXQpIHsKICAgICAg
ICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR1c2VyX3Jlc3AgPSAkaWctPnBlb3BsZS0+Z2V0
VXNlcklkRm9yTmFtZSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIG91dHB1dCgiQCIgLiAkdGFy
Z2V0IC4gIiAtIFtPS10iKTsKICAgICAgICAgICAgICAgICRmaWx0ZXJlZF90YXJnZXRzW10gPSAk
dGFyZ2V0OwogICAgICAgICAgICAgICAgJHBrc1tdID0gJHVzZXJfcmVzcDsKICAgICAgICAgICAg
fSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cTmV0d29ya0V4Y2VwdGlvbiAkZSkgeyAK
ICAgICAgICAgICAgICAgIHNsZWVwKDMpOwogICAgICAgICAgICB9IGNhdGNoIChcSW5zdGFncmFt
QVBJXEV4Y2VwdGlvblxFbXB0eVJlc3BvbnNlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAg
ICBzbGVlcCgzKTsKICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewogICAgICAg
ICAgICAgICAgJGlzX3VzZXJuYW1lX2NvcnJlY3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGRv
IHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXQoIkluc3RhZ3JhbSBwcm9maWxlIHVzZXJuYW1l
IEAiIC4gJHRhcmdldCAuICIgaXMgaW5jb3JyZWN0LiIpOwogICAgICAgICAgICAgICAgICAgIG91
dHB1dCgiVHlwZSAzIGZvciBza2lwIHRoaXMgdGFyZ2V0LiIpOwogICAgICAgICAgICAgICAgICAg
ICR0YXJnZXRfbmV3ID0gZ2V0VmFyRnJvbVVzZXIoIlBsZWFzZSBwcm92aWRlIHZhbGlkIHVzZXJu
YW1lIik7CgogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGFyZ2V0X25ldykpIHsKICAg
ICAgICAgICAgICAgICAgICAgICAgZG8geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0
YXJnZXRfbmV3ID0gZ2V0VmFyRnJvbVVzZXIoIlBsZWFzZSBwcm92aWRlIHZhbGlkIHVzZXJuYW1l
Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCR0YXJnZXRfbmV3KSk7
CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldF9u
ZXcgPT0gIjMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAkdXNlcl9yZXNwID0gJGlnLT5wZW9wbGUtPmdldFVzZXJJZEZvck5h
bWUoJHRhcmdldF9uZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCJAIiAu
ICR0YXJnZXRfbmV3IC4gIiAtIFtPS10iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRm
aWx0ZXJlZF90YXJnZXRzW10gPSAkdGFyZ2V0X25ldzsKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICRwa3NbXSA9ICR1c2VyX3Jlc3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXNf
dXNlcm5hbWVfY29ycmVjdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVl
cCgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNl
cHRpb25cTmV0d29ya0V4Y2VwdGlvbiAkZSkgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNsZWVwKDMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChcSW5zdGFncmFtQVBJ
XEV4Y2VwdGlvblxFbXB0eVJlc3BvbnNlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzbGVlcCgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEV4
Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlzX3VzZXJuYW1lX2Nv
cnJlY3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKCEkaXNfdXNlcm5hbWVfY29ycmVjdCk7CiAg
ICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IHdoaWxlICggZW1wdHkoJGZpbHRlcmVkX3Rhcmdl
dHMpICk7CgogICAgJHRhcmdldHMgPSBhcnJheV91bmlxdWUoJGZpbHRlcmVkX3RhcmdldHMpOwog
ICAgJHBrcyA9IGFycmF5X3VuaXF1ZSgkcGtzKTsKCiAgICAkZGF0YSA9IFtdOwogICAgZm9yICgk
aSA9IDA7ICRpIDwgY291bnQoJHRhcmdldHMpOyAkaSsrKSB7CiAgICAgICAgJGRhdGFbJGldID0g
WwogICAgICAgICAgICAndXNlcm5hbWUnID0+ICR0YXJnZXRzWyRpXSwKICAgICAgICAgICAgJ3Br
JyA9PiAkcGtzWyRpXSwKICAgICAgICBdOwogICAgfQoKICAgIG91dHB1dCgiU2VsZWN0ZWQgdGFy
Z2V0czogQCIgLiBpbXBsb2RlKCIsIEAiLCAkdGFyZ2V0cykgLiAiLiIpOwogICAgb3V0cHV0KCJQ
bGVhc2UgY29uZmlybSB0aGF0IHRoZSBzZWxlY3RlZCB0YXJnZXRzIGFyZSBjb3JyZWN0LiIpOwog
ICAgb3V0cHV0KCIxIC0gW1llc10iKTsKICAgIG91dHB1dCgiMiAtIFtOb10iKTsKICAgIG91dHB1
dCgiMyAtIFtFeGl0XSIpOwoKICAgICRjb25maXJtID0gZ2V0VmFyRnJvbVVzZXIoIkNob2ljZSIp
OwoKICAgIGlmIChlbXB0eSgkY29uZmlybSkpIHsKICAgICAgICBkbyB7IAogICAgICAgICAgICAk
Y29uZmlybSA9IGdldFZhckZyb21Vc2VyKCJDaG9pY2UiKTsKICAgICAgICB9IHdoaWxlIChlbXB0
eSgkY29uZmlybSkpOwogICAgfQoKICAgIGlmICgkY29uZmlybSA9PSAnMScgfHwgJGNvbmZpcm0g
PT0gJzInIHx8ICRjb25maXJtID09ICczJykgewogICAgICAgIC8vIEFsbCBmaW5lCiAgICB9IGVs
c2UgewogICAgICAgIGRvIHsKICAgICAgICAgICAgb3V0cHV0KCJDaG9pY2UgaXMgaW5jb3JyZWN0
LiBUeXBlIDEsIDIgb3IgMy4iKTsKICAgICAgICAgICAgJGNvbmZpcm0gPSBnZXRWYXJGcm9tVXNl
cigiQ2hvaWNlIik7CgogICAgICAgICAgICBpZiAoZW1wdHkoJGNvbmZpcm0pKSB7CiAgICAgICAg
ICAgICAgICBkbyB7IAogICAgICAgICAgICAgICAgICAgICRjb25maXJtID0gZ2V0VmFyRnJvbVVz
ZXIoIkNob2ljZSIpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoZW1wdHkoJGNvbmZpcm0pKTsK
ICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCRjb25maXJtICE9ICcxJyB8fCAkY29uZmly
bSAhPSAnMicgfHwgJGNvbmZpcm0gIT0gJzMnKTsKICAgIH0KCiAgICBpZiAoJGNvbmZpcm0gPT0g
JzMnKSB7CiAgICAgICAgcnVuKCRpZyk7CiAgICB9IGVsc2VpZiAoJGNvbmZpcm0gPT0gJzInKSB7
CiAgICAgICAgJGRhdGEgPSBkZWZpbmVfdGFyZ2V0cygkaWcpOwogICAgfSBlbHNlIHsKICAgICAg
ICAvLyBBbGwgZmluZS4gR29pbmcgdG8gbWFzc2xvb2tpbmcuCiAgICB9CgogICAgcmV0dXJuICRk
YXRhOwp9CgovKioKICogTWFzc2xvb2tpbmcgbG9vcAogKi8KZnVuY3Rpb24gbWFzc2xvb2tpbmco
JGRhdGEsICRpZywgJGRlbGF5KSB7CgogICAgJHJhbmtfdG9rZW4gPSBcSW5zdGFncmFtQVBJXFNp
Z25hdHVyZXM6OmdlbmVyYXRlVVVJRCgpOwogICAgJG1heF9pZCA9IG51bGw7CiAgICAkdmlld19j
b3VudCA9IDA7CiAgICAkc3RfY291bnQgPSAwOwogICAgJHN0X2NvdW50X3NlZW4gPSAwOwogICAg
JGJlZ2luID0gc3RydG90aW1lKGRhdGUoIlktbS1kIEg6aTpzIikpOwogICAgJHNwZWVkID0gMDsK
ICAgICRkZWxpdGVsID0gMDsKICAgICRjb3VudGVyMSA9IDA7CiAgICAkY291bnRlcjIgPSAwOwog
ICAgJHN0b3JpZXMgPSBbXTsKCiAgICBvdXRwdXQoIk1hc3Nsb29raW5nIHN0YXJ0ZWQuIik7Cgog
ICAgZm9yZWFjaCAoJGRhdGEgYXMgJGQpIHsKICAgICAgICAkdXNlcnNfY291bnQgPSAwOwogICAg
ICAgICRpc19nZl9maXJzdCA9IDE7CiAgICAgICAgZG8gewogICAgICAgICAgICB0cnkgewogICAg
ICAgICAgICAgICAgJGZvbGxvd2VycyA9ICRpZy0+cGVvcGxlLT5nZXRGb2xsb3dlcnMoJGRbJ3Br
J10sICRyYW5rX3Rva2VuLCBudWxsLCAkbWF4X2lkKTsKICAgICAgICAgICAgICAgICRiZWdpbl9n
ZiA9IHN0cnRvdGltZShkYXRlKCJZLW0tZCBIOmk6cyIpKTsKCiAgICAgICAgICAgICAgICBpZiAo
ZW1wdHkoJGZvbGxvd2Vycy0+Z2V0VXNlcnMoKSkpIHsgCiAgICAgICAgICAgICAgICAgICAgb3V0
cHV0KCJAIiAuICRkWyd1c2VybmFtZSddIC4gIiBkb24ndCBoYXZlIGFueSBmb2xsb3dlci4iKTsK
ICAgICAgICAgICAgICAgICAgICBzbGVlcCg1KTsKICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbWF4X2lkID0gJGZvbGxvd2Vy
cy0+Z2V0TmV4dE1heElkKCk7CgogICAgICAgICAgICAgICAgJGZvbGxvd2Vyc19pZHMgPSBbXTsK
ICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmb2xsb3dlcnMtPmdldFVzZXJzKCkgYXMgJGZvbGxv
d2VyKSB7CiAgICAgICAgICAgICAgICAgICAgJGZvbGxvd2Vyc19pZHNbXSA9ICRmb2xsb3dlci0+
Z2V0UGsoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdXNlcnNfY291bnQg
PSAkdXNlcnNfY291bnQgKyBjb3VudCgkZm9sbG93ZXJzX2lkcyk7CgogICAgICAgICAgICAgICAg
JG51bWJlciA9IGNvdW50KCRmb2xsb3dlcnNfaWRzKTsKCiAgICAgICAgICAgICAgICBpZiAoJGlz
X2dmX2ZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCRudW1iZXIgLiAiIGZvbGxv
d2VycyBvZiBAIiAuICRkWyd1c2VybmFtZSddIC4gIiBjb2xsZWN0ZWQuIik7CiAgICAgICAgICAg
ICAgICAgICAgJGlzX2dmX2ZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0KCJOZXh0ICIgLiAkbnVtYmVyIC4gIiBmb2xsb3dlcnMgb2Yg
QCIgLiAkZFsndXNlcm5hbWUnXSAuICIgY29sbGVjdGVkLiBUb3RhbDogIiAuIG51bWJlcl9mb3Jt
YXQoJHVzZXJzX2NvdW50LCAwLCAnLicsICcgJykgLiAiIGZvbGxvd2VycyBwYXJzZWQuIik7CiAg
ICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGluZGV4X25ldyA9IDA7CiAgICAgICAg
ICAgICAgICAkaW5kZXhfb2xkID0gMDsKICAgICAgICAgICAgICAgICRsYXN0ID0gZmFsc2U7Cgog
ICAgICAgICAgICAgICAgJGJlZ2luX2ZzID0gc3RydG90aW1lKGRhdGUoIlktbS1kIEg6aTpzIikp
OwoKICAgICAgICAgICAgICAgIGRvIHsgCiAgICAgICAgICAgICAgICAgICAgJGluZGV4X25ldyAr
PSAxMzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkZm9sbG93ZXJzX2lkc1skaW5k
ZXhfbmV3XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJGluZGV4X25ldyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9IHdo
aWxlICghaXNzZXQoJGZvbGxvd2Vyc19pZHNbJGluZGV4X25ld10pKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgJGxhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg
ICAgICAgICAgaWYgKCRpbmRleF9uZXcgPCAkaW5kZXhfb2xkKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAg
JGlkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAoJGkgPSAkaW5kZXhfb2xkOyAkaSA8
PSAkaW5kZXhfbmV3OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpZHNbXSA9ICRm
b2xsb3dlcnNfaWRzWyRpXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg
ICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdG9yaWVzX3JlZWxzID0gJGlnLT5z
dG9yeS0+Z2V0UmVlbHNNZWRpYUZlZWQoJGlkcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAv
LyAkY291bnRlcjEgKz0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkc3Rv
cmllc19yZWVscykgJiYgJHN0b3JpZXNfcmVlbHMtPmlzT2soKSAmJiBjb3VudCgkc3Rvcmllc19y
ZWVscy0+Z2V0UmVlbHMoKS0+Z2V0RGF0YSgpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIFNhdmUgdXNlciBzdG9yeSByZWVscydzIHRvIGFycmF5CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAkcmVlbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRy
ZWVscyA9ICRzdG9yaWVzX3JlZWxzLT5nZXRSZWVscygpLT5nZXREYXRhKCk7CgogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJHN0b3JpZXNfY29sbGVjdGVkID0gW107CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmb3JlYWNoICgkcmVlbHMgYXMgJHIpIHsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAkaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAkc3Rvcmllc19sb29wID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0
ZW1zID0gJHItPmdldEl0ZW1zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGl0ZW0tPmdldElkKCkp
IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZW0gaXMgbm90
IHZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAkc3Rvcmllc19sb29wW10gPSAkaXRlbTsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChl
bXB0eSgkc3RvcmllcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0
b3JpZXMgPSAkc3Rvcmllc19sb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG9yaWVzID0gYXJy
YXlfbWVyZ2UoJHN0b3JpZXMsICRzdG9yaWVzX2xvb3ApOwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRz
dG9yaWVzX2NvbGxlY3RlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
JHN0b3JpZXNfY29sbGVjdGVkID0gJHN0b3JpZXNfbG9vcDsKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk
c3Rvcmllc19jb2xsZWN0ZWQgPSBhcnJheV9tZXJnZSgkc3Rvcmllc19jb2xsZWN0ZWQsICRzdG9y
aWVzX2xvb3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RfY291bnQg
PSAgJHN0X2NvdW50ICsgY291bnQoJHN0b3JpZXNfY29sbGVjdGVkKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICR2aWV3X2NvdW50ID0gJHZpZXdfY291bnQgKyBjb3VudCgkc3Rvcmllc19j
b2xsZWN0ZWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub3cgPSBzdHJ0b3RpbWUo
ZGF0ZSgiWS1tLWQgSDppOnMiKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRu
b3cgLSAkYmVnaW4gPj0gMjk5KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRi
ZWdpbiA9IHN0cnRvdGltZShkYXRlKCJZLW0tZCBIOmk6cyIpKTsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAkZGVsaXRlbCA9ICRkZWxpdGVsICsgMTsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAkc3BlZWQgPSAoaW50KSgkdmlld19jb3VudCAqIDEyICogMjQgLyAkZGVs
aXRlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NsZWFuKCIiKTsK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY2xlYW4oIkVzdGltYXRlZCBz
cGVlZCBpcyAiIC4gbnVtYmVyX2Zvcm1hdCgkc3BlZWQsIDAsICcuJywgJyAnKSAuICIgc3Rvcmll
cy9kYXkuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NsZWFuKCIi
KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBvdXRwdXQoJHN0X2NvdW50IC4gIiBzdG9yaWVzIGZvdW5kLiAvIERlYnVnOiBnZXRS
ZWVsc01lZGlhRmVlZCAoIiAuICRjb3VudGVyMSAuICIpLCBtYXJrTWVkaWFTZWVuICgiIC4gJGNv
dW50ZXIyIC4gIikiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCgkc3RfY291
bnQgLiAiIHN0b3JpZXMgZm91bmQgaW4gdGhpcyBsb29wLiIpOwogICAgICAgICAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoJHN0X2NvdW50ID4gMTUwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFy
ayBjb2xsZWN0ZWQgc3RvcmllcyBhcyBzZWVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAk
bWFya19zZWVuX3Jlc3AgPSAkaWctPnN0b3J5LT5tYXJrTWVkaWFTZWVuKCRzdG9yaWVzKTsKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0
X2NvdW50X3NlZW4gPSBudW1iZXJfZm9ybWF0KCRzdF9jb3VudCwgMCwgJy4nLCAnICcpOwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJGNvdW50ZXIyICs9IDE7CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBvdXRwdXQoJHN0X2NvdW50X3NlZW4gLiAiIHN0b3JpZXMgbWFya2Vk
IGFzIHNlZW4uIFRvdGFsOiAiIC4gbnVtYmVyX2Zvcm1hdCgkdmlld19jb3VudCwgMCwgJy4nLCAn
ICcpIC4gIiBzdG9yaWVzIHN1Y2Nlc3NmdWxseSBzZWVuLiAvIERlYnVnOiBnZXRSZWVsc01lZGlh
RmVlZCAoIiAuICRjb3VudGVyMSAuICIpLCBtYXJrTWVkaWFTZWVuICgiIC4gJGNvdW50ZXIyIC4g
IikuIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCRzdF9jb3VudF9zZWVu
IC4gIiBzdG9yaWVzIG1hcmtlZCBhcyBzZWVuLiBUb3RhbDogIiAuIG51bWJlcl9mb3JtYXQoJHZp
ZXdfY291bnQsIDAsICcuJywgJyAnKSAuICIgc3RvcmllcyBzdWNjZXNzZnVsbHkgc2Vlbi4iKTsK
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgYXJyYXlz
IGFuZCBwYXJhbWV0ZXJzIGFnYWluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3Rvcmll
cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0X2NvdW50ID0gMDsKICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRsYXN0ICYmICRtYXhfaWQgPT0gbnVsbCkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBjb2xsZWN0ZWQgc3RvcmllcyBhcyBz
ZWVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWFya19zZWVuX3Jlc3AgPSAkaWctPnN0
b3J5LT5tYXJrTWVkaWFTZWVuKCRzdG9yaWVzKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RfY291bnRfc2VlbiA9IG51bWJlcl9m
b3JtYXQoJHN0X2NvdW50LCAwLCAnLicsICcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyAkY291bnRlcjIgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1
dCgkc3RfY291bnRfc2VlbiAuICIgc3RvcmllcyBtYXJrZWQgYXMgc2Vlbi4gVG90YWw6ICIgLiBu
dW1iZXJfZm9ybWF0KCR2aWV3X2NvdW50LCAwLCAnLicsICcgJykgLiAiIHN0b3JpZXMgc3VjY2Vz
c2Z1bGx5IHNlZW4uIC8gRGVidWc6IGdldFJlZWxzTWVkaWFGZWVkICgiIC4gJGNvdW50ZXIxIC4g
IiksIG1hcmtNZWRpYVNlZW4gKCIgLiAkY291bnRlcjIgLiAiKS4iKTsgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvdXRwdXQoJHN0X2NvdW50X3NlZW4gLiAiIHN0b3JpZXMgbWFya2VkIGFz
IHNlZW4uIFRvdGFsOiAiIC4gbnVtYmVyX2Zvcm1hdCgkdmlld19jb3VudCwgMCwgJy4nLCAnICcp
IC4gIiBzdG9yaWVzIHN1Y2Nlc3NmdWxseSBzZWVuLiIpOyAKICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgYXJyYXlzIGFuZCBwYXJhbWV0ZXJzIGFnYWlu
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RvcmllcyA9IFtdOwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJHN0X2NvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoJGRlbGF5KTsKICAgICAgICAgICAgICAgICAg
ICB9IGNhdGNoIChcSW5zdGFncmFtQVBJXEV4Y2VwdGlvblxOZXR3b3JrRXhjZXB0aW9uICRlKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCgiV2UgY291bGRuJ3QgY29ubmVjdCB0byBJ
bnN0YWdyYW0gYXQgdGhlIG1vbWVudC4gVHJ5aW5nIGFnYWluLiIpOwogICAgICAgICAgICAgICAg
ICAgICAgICBzbGVlcCg3KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4X25ldyAtPSAx
MzsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAg
fSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cRW1wdHlSZXNwb25zZUV4Y2VwdGlvbiAk
ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQoIkluc3RhZ3JhbSBzZW50IHVzIGVt
cHR5IHJlc3BvbnNlLiBUcnlpbmcgYWdhaW4uIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNs
ZWVwKDcpOwogICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXhfbmV3IC09IDEzOwogICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChc
SW5zdGFncmFtQVBJXEV4Y2VwdGlvblxUaHJvdHRsZWRFeGNlcHRpb24gJGUpIHsKICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0KCJUaHJvdHRsZWQgYnkgSW5zdGFncmFtIGJlY2F1c2Ugb2Yg
dG9vIG1hbnkgQVBJIHJlcXVlc3RzLiIpOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQo
IlBsZWFzZSBsb2dpbiBhZ2FpbiBhZnRlciAxIGhvdXIgYW5kIHlvdSByZWFjaGVkIEluc3RhZ3Jh
bSBsaW1pdHMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgICAg
ICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKXsKICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cHV0KCRlLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCg1
KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgJGluZGV4X29sZCA9ICRpbmRleF9uZXcgKyAxOwoKICAgICAgICAgICAgICAgIH0g
d2hpbGUgKCRsYXN0ID09IGZhbHNlKTsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBwYXVzZSBm
b3IgYWNjb3VudCBzYWZldHkKICAgICAgICAgICAgICAgICRlbmRfZ2YgPSBzdHJ0b3RpbWUoZGF0
ZSgiWS1tLWQgSDppOnMiKSk7CiAgICAgICAgICAgICAgICBpZiAoKCRlbmRfZ2YgLSAkYmVnaW5f
Z2YpIDwgNSkgewogICAgICAgICAgICAgICAgICAgICRzbGVlcF90aW1lID0gNSAtICgkZW5kX2dm
IC0gJGJlZ2luX2dmKTsKICAgICAgICAgICAgICAgICAgICBzbGVlcCgkc2xlZXBfdGltZSk7CiAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0
aW9uXE5ldHdvcmtFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIG91dHB1dCgiV2UgY291
bGRuJ3QgY29ubmVjdCB0byBJbnN0YWdyYW0gYXQgdGhlIG1vbWVudC4gVHJ5aW5nIGFnYWluLiIp
OwogICAgICAgICAgICAgICAgc2xlZXAoNyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdy
YW1BUElcRXhjZXB0aW9uXEVtcHR5UmVzcG9uc2VFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAg
ICAgIG91dHB1dCgiSW5zdGFncmFtIHNlbmQgdXMgZW1wdHkgcmVzcG9uc2UuIFRyeWluZyBhZ2Fp
bi4iKTsKICAgICAgICAgICAgICAgIHNsZWVwKDcpOwogICAgICAgICAgICB9IGNhdGNoIChcSW5z
dGFncmFtQVBJXEV4Y2VwdGlvblxUaHJvdHRsZWRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAg
ICAgIG91dHB1dCgiVGhyb3R0bGVkIGJ5IEluc3RhZ3JhbSBiZWNhdXNlIG9mIHRvbyBtYW55IEFQ
SSByZXF1ZXN0cy4iKTsKICAgICAgICAgICAgICAgIG91dHB1dCgiUGxlYXNlIGxvZyBpbiBhZ2Fp
biBhZnRlciAxIGhvdXIgYW5kIGluY3JlYXNlIHRoZSBkZWxheSBiZXR3ZWVuIHJlcXVlc3RzIG1h
bnVhbGx5LiIpOwogICAgICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgICAgIH0gY2F0Y2gg
KEV4Y2VwdGlvbiAkZSl7CiAgICAgICAgICAgICAgICBvdXRwdXQoJGUtPmdldE1lc3NhZ2UoKSk7
CiAgICAgICAgICAgICAgICBzbGVlcCg3KTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUg
KCRtYXhfaWQgIT09IG51bGwpOwoKICAgICAgICBpZiAoZW1wdHkoJGZvbGxvd2Vycy0+Z2V0VXNl
cnMoKSkpIHsgCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgb3V0cHV0
KCJBbGwgc3RvcmllcyBvZiBAIiAuICAkZFsndXNlcm5hbWUnXSAuICIncyBmb2xsb3dlcnMgc3Vj
Y2Vzc2Z1bGx5IHNlZW4uIik7CgogICAgfQoKICAgIG91dHB1dCgiQWxsIHN0b3JpZXMgcmVsYXRl
ZCB0byB0aGUgdGFyZ2V0cyBzZWVuLiBTdGFydGluZyB0aGUgbmV3IGxvb3AuIik7CgogICAgbWFz
c2xvb2tpbmcoJGRhdGEsICRpZywgJGRlbGF5KTsKfQoKLyoqCiAqIEdldCB2YXJhYmxlIGZyb20g
dXNlcgogKi8KZnVuY3Rpb24gZ2V0VmFyRnJvbVVzZXIoJHRleHQpIHsKICAgIGVjaG8gJHRleHQg
LiAiOiAiOwogICAgJHZhciA9IHRyaW0oZmdldHMoU1RESU4pKTsKICAgIHJldHVybiAkdmFyOwp9
CgovKioKICogT3V0cHV0IG1lc3NhZ2Ugd2l0aCBkYXRhIHRvIGNvbnNvbGUKICovCmZ1bmN0aW9u
IG91dHB1dCgkbWVzc2FnZSkgewogICAgZWNobyAiWyIsIGRhdGUoIkg6aTpzIiksICJdICIsICRt
ZXNzYWdlLCBQSFBfRU9MOwp9CgovKioKICogT3V0cHV0IGNsZWFuIG1lc3NhZ2UgdG8gY29uc29s
ZQogKi8KZnVuY3Rpb24gb3V0cHV0X2NsZWFuKCRtZXNzYWdlKSB7CiAgICBlY2hvICRtZXNzYWdl
LCBQSFBfRU9MOwp9CgovKioKICogVmFsaWRhdGVzIHByb3h5IGFkZHJlc3MKICovCmZ1bmN0aW9u
IGlzVmFsaWRQcm94eSgkcHJveHkpIHsKICAgIG91dHB1dCgiQ29ubmVjdGluZyB0byBJbnN0YWdy
YW0uLi4iKTsKICAgIHRyeSB7CiAgICAgICAgJGNsaWVudCA9IG5ldyBcR3V6emxlSHR0cFxDbGll
bnQoKTsKICAgICAgICAkcmVzID0gJGNsaWVudC0+cmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly93d3cu
aW5zdGFncmFtLmNvbScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQiID0+IDMwLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAicHJveHkiID0+ICRwcm94eQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICRjb2RlID0gJHJlcy0+Z2V0U3RhdHVzQ29k
ZSgpOwogICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cTmV0d29ya0V4Y2VwdGlv
biAkZSkgeyAKICAgICAgICBzbGVlcCgzKTsKICAgICAgICAkY29kZSA9IGlzVmFsaWRQcm94eSgk
cHJveHkpOwogICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewogICAgICAgIG91dHB1dCgkZS0+
Z2V0TWVzc2FnZSgpKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuICRj
b2RlID09IDIwMDsKfQoKLyoqCiAqIFZhbGlkYXRlcyBwcm94eSBhZGRyZXNzCiAqLwpmdW5jdGlv
biBmaW5pc2hMb2dpbigkaWcsICRsb2dpbiwgJHBhc3N3b3JkLCAkcHJveHkpIHsKICAgICRzdWNj
ZXNzID0gZmFsc2U7CiAgICBkbyB7CiAgICAgICAgaWYgKCRwcm94eSA9PSAiMyIpIHsKICAgICAg
ICAgICAgLy8gU2tpcCBwcm94eSBzZXR1cAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRp
Zy0+c2V0UHJveHkoJHByb3h5KTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAg
ICRsb2dpbl9yZXNwID0gJGlnLT5sb2dpbigkbG9naW4sICRwYXNzd29yZCk7CiAgICAKICAgICAg
ICAgICAgaWYgKCRsb2dpbl9yZXNwICE9PSBudWxsICYmICRsb2dpbl9yZXNwLT5pc1R3b0ZhY3Rv
clJlcXVpcmVkKCkpIHsKICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmVyaWZpY2F0aW9uIG1l
dGhvZCBpcyBwaG9uZQogICAgICAgICAgICAgICAgJHR3b2ZhX21ldGhvZCA9ICcxJzsKICAgIAog
ICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGlzIEF1dGhlbnRpZmljYXRpb24gYXBwIHZlcmlmaWNh
dGlvbiBpcyBhdmFpbGFibGUgCiAgICAgICAgICAgICAgICAkaXNfdG90cCA9IGpzb25fZGVjb2Rl
KGpzb25fZW5jb2RlKCRsb2dpbl9yZXNwKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoJGlz
X3RvdHBbJ3R3b19mYWN0b3JfaW5mbyddWyd0b3RwX3R3b19mYWN0b3Jfb24nXSA9PSAnMScpewog
ICAgICAgICAgICAgICAgICAgIG91dHB1dCgiVHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiByZXF1
aXJlZCwgcGxlYXNlIGVudGVyIHRoZSBjb2RlIGZyb20geW91IEF1dGhlbnRpY2F0aW9uIGFwcCIp
OwogICAgICAgICAgICAgICAgICAgICR0d29mYV9pZCA9ICRsb2dpbl9yZXNwLT5nZXRUd29GYWN0
b3JJbmZvKCktPmdldFR3b0ZhY3RvcklkZW50aWZpZXIoKTsKICAgICAgICAgICAgICAgICAgICAk
dHdvZmFfbWV0aG9kID0gJzMnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg
ICAgICAgICBvdXRwdXQoIlR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gcmVxdWlyZWQsIHBsZWFz
ZSBlbnRlciB0aGUgY29kZSBzZW50IHRvIHlvdXIgbnVtYmVyIGVuZGluZyBpbiAlcyIsIAogICAg
ICAgICAgICAgICAgICAgICAgICAkbG9naW5fcmVzcC0+Z2V0VHdvRmFjdG9ySW5mbygpLT5nZXRP
YmZ1c2NhdGVkUGhvbmVOdW1iZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgJHR3b2ZhX2lkID0g
JGxvZ2luX3Jlc3AtPmdldFR3b0ZhY3RvckluZm8oKS0+Z2V0VHdvRmFjdG9ySWRlbnRpZmllcigp
OwogICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAkdHdvZmFfY29kZSA9IGdl
dFZhckZyb21Vc2VyKCJUd28tZmFjdG9yIGNvZGUiKTsKICAgIAogICAgICAgICAgICAgICAgaWYg
KGVtcHR5KCR0d29mYV9jb2RlKSkgewogICAgICAgICAgICAgICAgICAgIGRvIHsgCiAgICAgICAg
ICAgICAgICAgICAgICAgICR0d29mYV9jb2RlID0gZ2V0VmFyRnJvbVVzZXIoIlR3by1mYWN0b3Ig
Y29kZSIpOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVtcHR5KCR0d29mYV9jb2RlKSk7
CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAg
ICAgICAgICAgb3V0cHV0KCJUd28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzLi4u
Iik7CiAgICAgICAgICAgICAgICAgICAgJHR3b2ZhX3Jlc3AgPSAkaWctPmZpbmlzaFR3b0ZhY3Rv
ckxvZ2luKCRsb2dpbiwgJHBhc3N3b3JkLCAkdHdvZmFfaWQsICR0d29mYV9jb2RlLCAkdHdvZmFf
bWV0aG9kKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9u
XEludmFsaWRTbXNDb2RlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGlzX2Nv
ZGVfY29ycmVjdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cHV0KCJDb2RlIGlzIGluY29ycmVjdC4gUGxlYXNlIGNoZWNrIHRoZSBz
eW50YXggYW5kIHRyeSBhZ2Fpbi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHR3b2ZhX2Nv
ZGUgPSBnZXRWYXJGcm9tVXNlcigiVHdvLWZhY3RvciBjb2RlIik7CiAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGVtcHR5KCRzZWN1cml0eV9jb2RlKSkgewogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZG8geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjdXJp
dHlfY29kZSA9IGdldFZhckZyb21Vc2VyKCJTZWN1cml0eSBjb2RlIik7CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9IHdoaWxlIChlbXB0eSgkc2VjdXJpdHlfY29kZSkpOwogICAgICAgICAg
ICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCgiVmVyaWZpY2F0aW9uIGluIHByb2dyZXNzLi4u
Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHdvZmFfcmVzcCA9ICRpZy0+ZmluaXNo
VHdvRmFjdG9yTG9naW4oJGxvZ2luLCAkcGFzc3dvcmQsICR0d29mYV9pZCwgJHR3b2ZhX2NvZGUs
ICR0d29mYV9tZXRob2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlzX2NvZGVfY29y
cmVjdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxJbnN0YWdyYW1B
UElcRXhjZXB0aW9uXE5ldHdvcmtFeGNlcHRpb24gJGUpIHsgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzbGVlcCgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEluc3Rh
Z3JhbUFQSVxFeGNlcHRpb25cRW1wdHlSZXNwb25zZUV4Y2VwdGlvbiAkZSkgewogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2xlZXAoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0
Y2ggKFxJbnN0YWdyYW1BUElcRXhjZXB0aW9uXEludmFsaWRTbXNDb2RlRXhjZXB0aW9uICRlKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXNfY29kZV9jb3JyZWN0ID0gZmFsc2U7CiAg
ICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICRtc2cgPSAkZS0+Z2V0TWVzc2FnZSgpOwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0KCRtc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg
cnVuKCRpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9
IHdoaWxlICghJGlzX2NvZGVfY29ycmVjdCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChcRXhj
ZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgJG1zZyA9ICRlLT5nZXRNZXNzYWdlKCk7
CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCRtc2cpOwogICAgICAgICAgICAgICAgICAgIHJ1
bigkaWcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3Vj
Y2VzcyA9IHRydWU7CiAgICAgICAgfSBjYXRjaCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cTmV0
d29ya0V4Y2VwdGlvbiAkZSkgeyAKICAgICAgICAgICAgc2xlZXAoMyk7CiAgICAgICAgfSBjYXRj
aCAoXEluc3RhZ3JhbUFQSVxFeGNlcHRpb25cRW1wdHlSZXNwb25zZUV4Y2VwdGlvbiAkZSkgewog
ICAgICAgICAgICBzbGVlcCgzKTsKICAgICAgICB9IGNhdGNoIChcSW5zdGFncmFtQVBJXEV4Y2Vw
dGlvblxDaGVja3BvaW50UmVxdWlyZWRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgb3V0cHV0
KCJQbGVhc2UgZ28gdG8gSW5zdGFncmFtIHdlYnNpdGUgb3IgbW9iaWxlIGFwcCBhbmQgcGFzcyBj
aGVja3BvaW50ISIpOwogICAgICAgICAgICBydW4oJGlnKTsKICAgICAgICB9IGNhdGNoIChcSW5z
dGFncmFtQVBJXEV4Y2VwdGlvblxDaGFsbGVuZ2VSZXF1aXJlZEV4Y2VwdGlvbiAkZSkgewogICAg
ICAgICAgICBvdXRwdXQoIkNoYWxsZW5nZSBsb29wLiBTb21ldGhpbmcgd3Jpbmcgd2l0aCB5b3Vy
IGFjY291bnQiKTsKICAgICAgICAgICAgcnVuKCRpZyk7CiAgICAgICAgfSBjYXRjaCAoXEV4Y2Vw
dGlvbiAkZSkgewogICAgICAgICAgICAkbXNnID0gJGUtPmdldE1lc3NhZ2UoKTsKICAgICAgICAg
ICAgb3V0cHV0KCRtc2cpOwogICAgICAgICAgICBydW4oJGlnKTsKICAgICAgICB9CiAgICB9IHdo
aWxlICghJHN1Y2Nlc3MpOwoKICAgIHJldHVybiAkaWc7Cn0="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | ab521aea3d444463a1b81dd1f3e9bb2e |
Eval Count | 1 |
Decode Time | 138 ms |