<!DOCTYPE html>
<html lang="id" class="dark scroll-smooth">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="robots" content="noindex, follow">
            <link rel="canonical" href="https://lonteku.in.net/sitemap-index.xml">
        <title>Link Bocil Dood Viral</title>
    <meta name="description" content="Link Bocil Dood Viral adalah situs kumpulan bokep sd, bokep SMP terlengkap paling viral selalu di update setiap hari.">

    <link rel="alternate" type="application/rss+xml" title="Link Bocil Dood Viral RSS Feed" href="https://lonteku.in.net/rss" />
    
    <!-- GEO & LANGUAGE SEO -->
    <meta http-equiv="content-language" content="id">
    <meta name="geo.region" content="ID">
    <meta name="geo.position" content="-0.7893;113.9213"> <!-- Center of Indonesia -->
    <meta name="ICBM" content="-0.7893, 113.9213">

    <!-- SOCIAL SEO -->
        <meta property="og:locale" content="id_ID">
    <meta property="og:type" content="website">
    <meta property="og:title" content="Link Bocil Dood Viral">
    <meta property="og:description" content="Link Bocil Dood Viral adalah situs kumpulan bokep sd, bokep SMP terlengkap paling viral selalu di update setiap hari.">
    <meta property="og:url" content="https://lonteku.in.net/sitemap-index.xml">
    <meta property="og:site_name" content="Link Bocil Dood Viral">
    <meta property="og:image" content="https://lonteku.in.net/assets/img/logo.png">
    <meta property="og:image:width" content="1200">
    <meta property="og:image:height" content="630">
    
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="Link Bocil Dood Viral">
    <meta name="twitter:description" content="Link Bocil Dood Viral adalah situs kumpulan bokep sd, bokep SMP terlengkap paling viral selalu di update setiap hari.">
    <meta name="twitter:image" content="https://lonteku.in.net/assets/img/logo.png">

    
    
                    <meta name="msvalidate.01" content="C470909DC480C03864885FFEE0AE1CD4" />    
    <!-- Fonts -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link rel="preconnect" href="https://cdnjs.cloudflare.com">
    <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Outfit:wght@400;500;700;900&display=swap">
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Outfit:wght@400;500;700;900&display=swap" rel="stylesheet" media="print" onload="this.media='all'">
    <noscript><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Outfit:wght@400;500;700;900&display=swap" rel="stylesheet"></noscript>
    <link rel="stylesheet" href="https://lonteku.in.net/assets/css/fontawesome-swap.css" media="print" onload="this.media='all'" />
    <noscript><link rel="stylesheet" href="https://lonteku.in.net/assets/css/fontawesome-swap.css"></noscript>
    <link rel="stylesheet" href="https://lonteku.in.net/assets/css/style.min.css" />
    <link rel="stylesheet" href="https://lonteku.in.net/assets/css/stories.css?v=1777055913" />
    
    <!-- Tailwind CSS -->
    <script src="https://cdn.tailwindcss.com?plugins=typography"></script>
    <script>
        tailwind.config = {
            darkMode: 'class',
            theme: {
                extend: {
                    colors: {
                        primary: '#10b981',
                        dark: '#030303',
                        'glass-dark': 'rgba(10, 10, 10, 0.85)',
                    },
                    fontFamily: {
                        heading: ['Poppins', 'sans-serif'],
                        sans: ['Inter', 'sans-serif'],
                    },
                    boxShadow: {
                        'glow': '0 0 20px #10b98133', /* 33 is 20% opacity */
                        'glow-hover': '0 0 30px #10b9814D', /* 4D is 30% opacity */
                    },
                    backgroundImage: {
                        'gradient-dark': 'linear-gradient(to bottom, transparent, rgba(0,0,0,0.8))',
                        'sidebar-gradient': '#191919',
                    }
                }
            }
        }
    </script>
    
    
    <style>
        :root { 
            --primary: #10b981; 
            --accent: #10b981; /* Override style.css */
        }

        /* RGB Moving Line (Nexus Hub) */
                @keyframes rgb-flow {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }
        @keyframes scanner-flow {
            0% { background-position: -100% 0; }
            50% { background-position: 100% 0; }
            100% { background-position: -100% 0; }
        }
        @keyframes pulse-flow {
            0%, 100% { opacity: 0.2; filter: blur(1px); }
            50% { opacity: 1; filter: blur(0px); }
        }
        @keyframes comet-flow {
            0% { background-position: -100% 0; }
            100% { background-position: 200% 0; }
        }
        @keyframes mirror-flow {
            0%, 100% { background-position: 50% 0; background-size: 0% 100%; }
            50% { background-position: 0% 0; background-size: 100% 100%; }
        }
        @keyframes glitch-flow {
            0% { opacity: 1; transform: translateX(0); }
            20% { opacity: 0.8; transform: translateX(-2px); }
            40% { opacity: 1; transform: translateX(2px); }
            60% { opacity: 0.9; transform: translateX(-1px); }
            80% { opacity: 1; transform: translateX(1px); }
            100% { opacity: 1; transform: translateX(0); }
        }
        @keyframes breathe-flow {
            0%, 100% { opacity: 0.1; }
            50% { opacity: 1; }
        }
        @keyframes heartbeat-flow {
            0%, 100% { transform: scaleX(1); opacity: 1; }
            10%, 30% { transform: scaleX(1.1); opacity: 0.8; }
            20% { transform: scaleX(1.2); opacity: 0.6; }
        }
        @keyframes matrix-flow {
            0% { background-position: 0 -100%; }
            100% { background-position: 0 100%; }
        }
        @keyframes police-flow {
            0% { background-position: 0 0; }
            50% { background-position: 100% 0; }
        }
        @keyframes circuit-flow {
            0% { background-position: 0 0; }
            100% { background-position: 20% 0; }
        }
        @keyframes lightning-flash {
            0%, 20%, 40%, 46%, 54%, 60%, 80%, 100% { opacity: 0; box-shadow: none; }
            42%, 52% { opacity: 1; box-shadow: 0 0 20px #fff, 0 0 40px #bbf7ff; }
            44% { opacity: 0.5; box-shadow: 0 0 10px #fff; }
            82%, 84% { opacity: 1; box-shadow: 0 0 30px #fff, 0 0 50px #bbf7ff; }
            83% { opacity: 0; }
        }
        .rgb-line {
            height: 2px;
            width: 100%;
            background: linear-gradient(90deg, #ff00ea, #ff0055, #ffdd00, #00ffaa, #00c3ff, #aa00ff, #ff00ea);
            background-size: 400% 400%;
            background-repeat: no-repeat;
            animation: rgb-flow 5s linear infinite;
            opacity: 1;
            box-shadow: 0 0 15px rgba(255, 255, 255, 0.2);
            position: relative;
            z-index: 50;
        }
        /* Scrollbar */
        ::-webkit-scrollbar { width: 6px; }
        ::-webkit-scrollbar-track { background: #0a0a0a; }
        ::-webkit-scrollbar-thumb { background: #333; border-radius: 3px; }
        ::-webkit-scrollbar-thumb:hover { background: var(--primary); }
        
        /* Utility overrides */
        .text-primary { color: var(--primary); }
        .bg-primary { background-color: var(--primary); }
        .border-primary { border-color: var(--primary); }
        
        /* Style.css Overrides for Dynamic Color */
        .logo { background: var(--primary); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
        .views-badge i { color: var(--primary) !important; }
        .fav-btn.active { color: var(--primary) !important; }
        .fav-btn:hover { color: var(--primary) !important; background: rgba(var(--primary), 0.1); }
        .main-nav a:hover { color: var(--primary); }
         .no-scrollbar::-webkit-scrollbar { display: none; }
         .no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
         .text-shadow-sm { text-shadow: 0 1px 2px rgba(0,0,0,0.6); }
         .text-shadow { text-shadow: 0 2px 4px rgba(0,0,0,0.8); }
         input:focus { outline: none; }
         
         body {
             background-color: #030303;
             background-image: 
                 radial-gradient(circle at 10% 10%, rgba(239, 68, 68, 0.08) 0%, transparent 40%),
                 radial-gradient(circle at 90% 90%, rgba(59, 130, 246, 0.08) 0%, transparent 40%);
             background-attachment: fixed;
         }

         /* Marquee */
         .marquee-container { overflow: hidden; white-space: nowrap; }
         .marquee-content { display: inline-block; padding-left: 100%; animation: marquee 25s linear infinite; }
         @keyframes marquee { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
         
         /* Glass Utilities */
         .glass-panel {
             background: rgba(20, 20, 20, 0.6);
             backdrop-filter: blur(16px);
             -webkit-backdrop-filter: blur(16px);
             border: 1px solid rgba(255, 255, 255, 0.06);
         }
         
         .sidebar-item {
             position: relative;
             overflow: hidden;
         }
         .sidebar-item::before {
             content: '';
             position: absolute;
             left: 0; top: 0; bottom: 0;
             width: 3px;
             background: #ef4444;
             transform: scaleY(0);
             transition: transform 0.2s;
         }
         .sidebar-item:hover::before {
             transform: scaleY(1);
         }

         /* Cyber Grid Overlay */
         .cyber-grid {
             position: fixed;
             top: 0; left: 0; width: 100%; height: 100%;
             background-image: 
                 linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
                 linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
             background-size: 40px 40px;
             background-position: center center;
             pointer-events: none;
             z-index: -1;
         }
         .cyber-grid::after {
             content: '';
             position: absolute;
             inset: 0;
             background: radial-gradient(circle at center, transparent 0%, #030303 90%);
         }

         /* Skeleton Loading FX */
         @keyframes shimmer {
             0% { background-position: -200% 0; }
             100% { background-position: 200% 0; }
         }
         .skeleton {
             background: linear-gradient(90deg, #121212 25%, #1a1a1a 50%, #121212 75%);
             background-size: 200% 100%;
             animation: shimmer 1.5s infinite linear;
             border-radius: 1rem;
         }
         .skeleton-card {
             display: flex;
             flex-direction: column;
             gap: 12px;
             height: 100%;
             padding: 0;
             background: rgba(255, 255, 255, 0.02);
             border: 1px solid rgba(255, 255, 255, 0.05);
             border-radius: 1.25rem;
             overflow: hidden;
         }
         .skeleton-img { width: 100%; aspect-ratio: 16/9; }
         .skeleton-text { height: 12px; margin: 0 16px; width: 80%; }
         .skeleton-text-short { height: 12px; margin: 0 16px 16px 16px; width: 40%; }
    </style>

    
</head>
<body class="bg-[#050505] text-gray-200 font-sans selection:bg-primary/30 selection:text-primary">

    
<div class="cyber-grid"></div>

<!-- Announcement Bar -->

<!-- Navbar -->
<nav class="sticky top-0 z-[100] bg-black/70 backdrop-blur-xl border-b border-white/5 transition-all duration-300">
    <div class="container mx-auto px-4 h-14 flex justify-between items-center">
        <!-- Left: Hamburger + Logo -->
        <div class="flex items-center gap-5">
            <button onclick="toggleSidebar()" aria-label="Toggle Sidebar" class="text-white hover:text-primary transition-colors text-xl p-2 rounded-xl hover:bg-white/5 active:scale-95">
                <i class="fa-solid fa-bars-staggered"></i>
            </button>
            <a href="https://lonteku.in.net/" class="flex items-center gap-2">
                                     <div class="flex flex-col leading-none">
                        <span class="font-heading font-black text-xl italic tracking-tighter" style="color: #ffffff">ASUPAN</span>
                        <span class="font-heading font-black text-sm tracking-widest -mt-1 ml-0.5" style="color: #6366f1">VIRAL</span>
                     </div>
                            </a>
        </div>

        <!-- Right: Search & Actions -->
        <div class="flex items-center gap-3">
            <form action="https://lonteku.in.net/" method="GET" class="hidden md:flex items-center bg-white/5 rounded-full pl-4 pr-2 py-1.5 border border-white/5 focus-within:border-primary/50 focus-within:bg-white/10 transition-all backdrop-blur-sm group" onsubmit="event.preventDefault(); window.location.href='https://lonteku.in.net/search/' + this.q.value.trim().toLowerCase().replace(/\s+/g, '-');">
                <input type="text" name="q" id="desktop-search-input" placeholder="Cari Video..." class="bg-transparent border-none text-white text-sm w-48 placeholder-gray-500 focus:outline-none group-focus-within:placeholder-gray-400" autofocus>
                <button type="button" aria-label="Voice Search" onclick="startVoiceSearch('desktop-search-input')" class="w-8 h-8 rounded-full text-gray-400 hover:text-primary flex items-center justify-center transition-all mr-1"><i class="fa-solid fa-microphone text-xs"></i></button>
                <button type="submit" aria-label="Search" class="w-8 h-8 rounded-full bg-white/5 text-gray-400 hover:bg-primary hover:text-white flex items-center justify-center transition-all"><i class="fa-solid fa-magnifying-glass text-xs"></i></button>
            </form>
            
             <button aria-label="Toggle Mobile Search" class="md:hidden text-white w-10 h-10 rounded-xl hover:bg-white/5 flex items-center justify-center" onclick="document.getElementById('mobile-search').classList.toggle('hidden')">
                 <i class="fa-solid fa-magnifying-glass text-lg"></i>
            </button>
             <a href="https://lonteku.in.net/favorites" aria-label="Favorites" class="text-white hover:text-primary transition-colors w-10 h-10 rounded-xl hover:bg-primary/10 flex items-center justify-center relative group">
                 <i class="fa-regular fa-heart text-xl group-hover:scale-110 transition-transform"></i>
            </a>
             <button id="push-sub-btn" aria-label="Subscribe" class="text-white hover:text-primary transition-colors w-10 h-10 rounded-xl hover:bg-primary/10 flex items-center justify-center relative group">
                 <i class="fa-regular fa-bell text-xl group-hover:scale-110 transition-transform"></i>
            </button>
        </div>
    </div>

    <!-- Mobile Search -->
    <div id="mobile-search" class="hidden px-4 pb-4 md:hidden border-b border-white/5 bg-black/90 backdrop-blur-xl">
        <form action="https://lonteku.in.net/" method="GET" class="flex items-center bg-white/10 rounded-xl px-2 py-2 w-full border border-white/5" onsubmit="event.preventDefault(); window.location.href='https://lonteku.in.net/search/' + this.q.value.trim().toLowerCase().replace(/\s+/g, '-');">
            <input type="text" name="q" placeholder="Cari video..." class="bg-transparent border-none text-white ml-2 w-full placeholder-gray-500 text-sm" autofocus>
            <button type="submit" aria-label="Search" class="w-8 h-8 rounded-lg bg-primary text-white flex items-center justify-center"><i class="fa-solid fa-magnifying-glass text-xs"></i></button>
        </form>
    </div>

    <!-- STORIES BAR -->
        
    <!-- RGB Animated Line (Nexus Hub) -->
            <div class="rgb-line"></div>
    
    <!-- Category Pills -->
    <div class="w-full overflow-x-auto no-scrollbar border-b border-white/5 bg-black/20 backdrop-blur-lg">
        <div class="container mx-auto px-4 flex gap-2 py-2 min-w-max">
            <a href="https://lonteku.in.net/" class="px-4 py-1.5 text-xs font-bold text-white bg-primary/90 rounded-full border border-primary shadow-glow hover:bg-primary transition-all uppercase whitespace-nowrap">Home</a>
            <a href="https://lonteku.in.net/latest" class="px-4 py-1.5 text-xs font-semibold text-gray-300 hover:text-white bg-white/5 hover:bg-white/10 rounded-full border border-white/5 transition-all uppercase whitespace-nowrap">Terbaru</a>
            <a href="https://lonteku.in.net/viral" class="group flex items-center gap-1.5 px-4 py-1.5 text-xs font-semibold text-gray-300 hover:text-white bg-white/5 hover:bg-white/10 rounded-full border border-white/5 transition-all uppercase whitespace-nowrap">
                Viral 
                <svg class="w-3.5 h-3.5 text-orange-500 animate-pulse drop-shadow-[0_0_8px_rgba(249,115,22,0.8)]" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 .5-5 2.986-7C14 5 16.09 5.777 17.656 7.343A7.975 7.975 0 0120 13a7.975 7.975 0 01-2.343 5.657z"></path>
                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.879 16.121A3 3 0 1012.015 11L11 14H9c0 .768.293 1.536.879 2.121z"></path>
                </svg>
            </a>
            
                    </div>
    </div>
</nav>

<!-- Sidebar Overlay -->
<div id="sidebar-overlay" class="fixed inset-0 bg-black/80 backdrop-blur-sm z-[100] opacity-0 invisible transition-all duration-300" onclick="toggleSidebar()"></div>

<!-- Premium Sidebar (Admin Style) -->
<div id="sidebar" class="fixed top-0 left-0 h-full w-[280px] z-[120] transform -translate-x-full transition-transform duration-300 ease-in-out py-[10px] pl-[10px]">
    <div class="w-full h-full flex flex-col bg-[#0f1115]/95 backdrop-blur-[24px] border border-white/5 shadow-[0_15px_50px_rgba(0,0,0,0.6)] rounded-[24px] overflow-hidden relative" style="-webkit-backdrop-filter: blur(24px);">
    <!-- Sidebar Header -->
    <div class="h-24 flex items-center justify-between px-8 relative">
        <div class="absolute bottom-0 left-6 right-6 h-px bg-gradient-to-r from-transparent via-white/10 to-transparent"></div>
        <a href="https://lonteku.in.net/" class="flex items-center gap-3">
            <div class="w-10 h-10 rounded-xl bg-gradient-to-br from-primary to-orange-500 flex items-center justify-center text-white text-lg shadow-[0_0_15px_rgba(255,90,0,0.3)]">
                <i class="fa-solid fa-bolt"></i>
            </div>
            <div class="flex flex-col leading-none">
                <span class="text-base font-black italic tracking-tighter uppercase font-heading mb-0" style="color: #ffffff">
                    ASUPAN                </span>
                <span class="text-[9px] font-black uppercase tracking-[0.3em] text-primary -mt-0.5 ml-0.5" style="color: #6366f1">
                    VIRAL                </span>
            </div>
        </a>
        <button onclick="toggleSidebar()" aria-label="Close Sidebar" class="absolute top-4 right-4 w-8 h-8 rounded-full text-gray-500 hover:text-white flex items-center justify-center transition-all bg-white/5 hover:bg-white/10">
            <i class="fa-solid fa-xmark text-sm"></i>
        </button>
    </div>

    <!-- Scrollable Content -->
    <div class="flex-1 overflow-y-auto px-4 py-8 no-scrollbar">

        
        <h3 class="text-[9px] font-black tracking-[0.3em] text-gray-600 uppercase mb-5 ml-4">Main Menu</h3>
        
        <div class="space-y-1.5 mb-10">
            <!-- Normal Links with Admin-like pill hover effect -->
            <a href="https://lonteku.in.net/" class="flex items-center gap-4 px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                <i class="fa-solid fa-layer-group w-5 text-center text-primary transition-transform group-hover:scale-110"></i>
                <span class="font-bold text-[13px] tracking-wide">Beranda</span>
            </a>

            <a href="https://lonteku.in.net/latest" class="flex items-center gap-4 px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                <i class="fa-solid fa-clock-rotate-left w-5 text-center text-orange-400 transition-transform group-hover:-rotate-45"></i>
                <span class="font-bold text-[13px] tracking-wide">Terbaru</span>
            </a>

            <a href="https://lonteku.in.net/viral" class="flex items-center gap-4 px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                <i class="fa-solid fa-fire-flame-curved w-5 text-center text-rose-500 transition-transform group-hover:scale-110"></i>
                <span class="font-bold text-[13px] tracking-wide">Lagi Viral</span>
            </a>

            <a href="https://lonteku.in.net/favorites" class="flex items-center gap-4 px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                <i class="fa-solid fa-heart w-5 text-center text-red-400 transition-transform group-hover:scale-110"></i>
                <span class="font-bold text-[13px] tracking-wide">Favorit Saya</span>
            </a>

            <a href="https://lonteku.in.net/request" class="flex items-center gap-4 px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                <i class="fa-solid fa-envelope-open-text w-5 text-center text-emerald-400 transition-transform group-hover:scale-110"></i>
                <span class="font-bold text-[13px] tracking-wide">Request Video</span>
            </a>
            
            <div class="h-4"></div>
            <h3 class="text-[9px] font-black tracking-[0.3em] text-gray-600 uppercase mb-3 ml-4">Links</h3>

            <!-- Partner Links Accordion -->
            <div class="relative">
                <button onclick="togglePartnerDropdown()" class="w-full flex items-center justify-between px-4 py-3 rounded-2xl text-gray-400 hover:text-white hover:bg-white/5 transition-all group">
                    <div class="flex items-center gap-4">
                        <i class="fa-solid fa-handshake w-5 text-center text-blue-400 transition-transform group-hover:scale-110"></i>
                        <span class="font-bold text-[13px] tracking-wide">Partner</span>
                    </div>
                    <i class="fa-solid fa-chevron-down text-xs transition-transform duration-300" id="partner-chevron"></i>
                </button>
                
                <div id="partner-dropdown" class="hidden pl-12 pr-4 py-2 space-y-3">
                                                                <span class="text-[10px] text-gray-700 font-bold uppercase tracking-widest italic block">Belum ada partner</span>
                                    </div>
            </div>
            
        </div>

        <h3 class="text-[9px] font-black tracking-[0.3em] text-gray-600 uppercase mb-4 ml-4">Kategori</h3>
        
        <div class="grid grid-cols-2 gap-3 mb-4">
                    </div>

        <a href="https://lonteku.in.net/category" class="flex items-center justify-center h-14 bg-white/5 hover:bg-white/10 text-white font-black uppercase text-[10px] tracking-widest rounded-2xl border border-white/5 transition-all w-full shadow-md hover:shadow-lg mt-6 gap-3 group">
            Lihat Semua Kategori <i class="fa-solid fa-arrow-right text-primary group-hover:translate-x-1 transition-transform"></i>
        </a>

    </div>

    <!-- Copyright -->
    <div class="px-6 pb-8 pt-4">
        <p class="text-[9px] text-gray-600 uppercase font-black tracking-widest text-center">&copy; Link Bocil Dood Viral</p>
    </div>
    </div>
    <!-- End Inner Sidebar Layer -->
</div>

<script>
function toggleSidebar() {
    const sidebar = document.getElementById('sidebar');
    const overlay = document.getElementById('sidebar-overlay');
    if (!sidebar) return;
    
    const isClosed = sidebar.classList.contains('-translate-x-full');

    if (isClosed) {
        sidebar.classList.remove('-translate-x-full');
        sidebar.classList.add('translate-x-0');
        overlay.classList.remove('opacity-0', 'invisible');
        overlay.classList.add('opacity-100', 'visible');
        document.body.style.overflow = 'hidden';
    } else {
        sidebar.classList.remove('translate-x-0');
        sidebar.classList.add('-translate-x-full');
        overlay.classList.remove('opacity-100', 'visible');
        overlay.classList.add('opacity-0', 'invisible');
        document.body.style.overflow = '';
    }
}
function togglePartnerDropdown() {
    const dropdown = document.getElementById('partner-dropdown');
    const chevron  = document.getElementById('partner-chevron');
    if (!dropdown) return;
    const isOpen = !dropdown.classList.contains('hidden');
    dropdown.classList.toggle('hidden', isOpen);
    chevron.classList.toggle('rotate-180', !isOpen);
}

function toggleSidebarCat() {
    const dropdown = document.getElementById('sidebar-cat-dropdown');
    const chevron  = document.getElementById('cat-chevron');
    if (!dropdown) return;
    const isOpen = !dropdown.classList.contains('hidden');
    dropdown.classList.toggle('hidden', isOpen);
    chevron.classList.toggle('rotate-180', !isOpen);
}
</script>

<!-- Main Content -->
<main class="container mx-auto px-3 md:px-4 py-4 min-h-[70vh] flex flex-col">

    <!-- Header Ad -->
    <div id="ad-header-placeholder">
        
    </div>

    
            <!-- 404 PAGE -->
        <div class="flex-1 flex flex-col items-center justify-center relative p-8 text-center overflow-hidden py-10 md:py-16">
            <!-- Background Ambient -->
            <div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-primary/10 rounded-full blur-[120px] pointer-events-none"></div>
            <div class="absolute bottom-0 right-0 w-[500px] h-[500px] bg-blue-600/10 rounded-full blur-[100px] pointer-events-none"></div>

            <div class="relative z-10 mb-8">
                 <h1 class="text-[120px] md:text-[180px] font-black leading-none text-transparent bg-clip-text bg-gradient-to-b from-white to-gray-800 font-heading tracking-tighter" style="text-shadow: 0 0 50px rgba(255,255,255,0.1);">
                    404
                 </h1>
                 <div class="absolute top-0 left-0 w-full h-full text-primary opacity-50 blur-[2px] animate-pulse flex items-center justify-center font-black leading-none tracking-tighter text-[120px] md:text-[180px] select-none pointer-events-none" style="animation-duration: 0.2s; mix-blend-mode: color-dodge;">404</div>
            </div>
            
            <h2 class="text-2xl md:text-3xl font-bold text-white mb-6 relative z-10">
                Waduh, Nyasar Bos? 🤨
            </h2>
            
            <p class="text-gray-400 max-w-md mx-auto mb-10 text-sm md:text-base relative z-10 leading-relaxed">
                Halaman yang lo cari udah ilang atau emang gak pernah ada. <br>
                Mending balik ke jalan yang benar yuk.
            </p>
            
            <a href="https://lonteku.in.net/" class="group px-8 py-4 bg-primary hover:opacity-80 text-white font-bold rounded-2xl uppercase tracking-widest transition-all shadow-[0_0_30px_rgba(239,68,68,0.4)] hover:shadow-[0_0_50px_rgba(239,68,68,0.6)] hover:scale-105 relative z-10 flex items-center gap-3">
                <i class="fa-solid fa-house"></i> <span>Kembali ke Home</span>
            </a>
        </div>

    
    
</main>

<footer class="mt-6 py-12 bg-black/80 backdrop-blur-2xl border-t border-white/5 text-center">
    <div class="container mx-auto px-4 flex flex-col items-center">
         <div class="mb-6">
             <span class="text-2xl font-black italic font-heading tracking-tighter">
                <span style="color: #ffffff">ASUPAN</span><span style="color: #6366f1">VIRAL</span>
             </span>
         </div>
         <div class="flex gap-6 text-xs font-bold text-gray-500 uppercase tracking-widest mb-8">
             <a href="https://lonteku.in.net/page/dmca" class="hover:text-primary transition-colors">DMCA</a>
             <a href="https://lonteku.in.net/page/terms" class="hover:text-primary transition-colors">Terms</a>
             <a href="https://lonteku.in.net/page/privacy" class="hover:text-primary transition-colors">Privacy</a>
             <a href="https://lonteku.in.net/page/contact" class="hover:text-primary transition-colors">Contact</a>
             <a href="https://lonteku.in.net/sitemap-html" class="hover:text-primary transition-colors">Sitemap</a>
         </div>
        <p class="text-[10px] text-gray-700 font-mono">&copy; 2026 All Rights Reserved.</p>
    </div>
</footer>

<!-- Footer Ad -->
<div id="ad-footer-placeholder">
    
</div>

<!-- Telegram Floating -->
<a href="#" target="_blank" aria-label="Join Telegram Channel" class="fixed bottom-6 right-6 w-14 h-14 bg-[#229ED9] rounded-2xl flex items-center justify-center text-white text-2xl shadow-glow hover:scale-110 hover:-rotate-6 transition-all z-50 group border border-white/10">
    <i class="fa-brands fa-telegram group-hover:animate-pulse"></i>
</a>

<!-- SCRIPTS -->
<script>
    // toggleSidebar is handled in the top script block

    document.addEventListener('DOMContentLoaded', () => {
        const grid = document.getElementById('favorites-grid');
        
        // Active fav buttons
        document.querySelectorAll('.btn-fav').forEach(btn => {
            const id = btn.dataset.id;
            const favs = JSON.parse(localStorage.getItem('my_favs') || '[]');
            if (favs.some(f => f.id == id)) {
                btn.classList.add('text-primary', 'scale-110');
                btn.querySelector('i').classList.replace('fa-regular', 'fa-solid');
            }
        });

        document.body.addEventListener('click', (e) => {
            const btn = e.target.closest('.btn-fav');
            if (btn) {
                e.preventDefault();
                e.stopPropagation();
                toggleFavorite(btn.dataset, btn);
            }
        });

        if (grid) {
            const favs = JSON.parse(localStorage.getItem('my_favs') || '[]');
            if (favs.length === 0) {
                grid.className = 'flex flex-col items-center justify-center py-20 col-span-full';
                grid.innerHTML = '<i class="fa-regular fa-folder-open text-6xl text-gray-800 mb-4"></i><p class="text-gray-500 font-bold uppercase tracking-widest text-xs">Belum ada favorit</p>';
            } else {
                favs.forEach(p => {
                    const html = `
                         <a href="https://lonteku.in.net/${p.slug}" class="group block glass-panel rounded-2xl overflow-hidden hover:border-primary/50 hover:shadow-glow-hover transition-all duration-300 hover:-translate-y-1.5 flex flex-col h-full">
                            <div class="relative w-full aspect-video bg-gray-900 overflow-hidden">
                                <img src="${p.thumb}" alt="${p.title}" class="absolute inset-0 w-full h-full object-cover blur-xl opacity-30 scale-125 pointer-events-none">
                                <img src="${p.thumb}" alt="${p.title}" loading="lazy" class="relative z-10 w-full h-full object-contain transition-transform duration-700 group-hover:scale-105 group-hover:brightness-110">
                                <div class="absolute bottom-2 right-2 bg-black/80 backdrop-blur-md border border-white/10 text-white text-[10px] font-bold px-2 py-1 rounded-lg flex items-center gap-1.5 z-20">
                                    <i class="fa-solid fa-eye text-primary"></i> ${p.views}
                                </div>
                            </div>
                            <div class="p-4 flex flex-col flex-1 bg-gradient-to-b from-transparent to-black/40">
                                <h3 class="text-xs md:text-sm font-bold text-gray-200 leading-normal line-clamp-2 group-hover:text-primary/80 transition-colors mb-auto">${p.title}</h3>
                            </div>
                        </a>
                    `;
                    grid.insertAdjacentHTML('beforeend', html);
                });
            }
        }
    });

    function toggleFavorite(data, btn) {
        let favs = JSON.parse(localStorage.getItem('my_favs') || '[]');
        const idx = favs.findIndex(f => f.id == data.id);
        const icon = btn.querySelector('i');

        if (idx > -1) {
            favs.splice(idx, 1);
            btn.classList.remove('text-primary', 'scale-110');
            icon.classList.replace('fa-solid', 'fa-regular');
        } else {
            favs.push(data);
            btn.classList.add('text-primary', 'scale-110');
            icon.classList.replace('fa-regular', 'fa-solid');
            triggerConfetti();
        }
        localStorage.setItem('my_favs', JSON.stringify(favs));
    }

    // --- VOICE SEARCH ---
    function startVoiceSearch(inputId) {
        if ('webkitSpeechRecognition' in window) {
            const recognition = new webkitSpeechRecognition();
            recognition.lang = 'id-ID'; // Indonesian
            recognition.start();
            
            const btn = document.querySelector(`button[onclick="startVoiceSearch('${inputId}')"] i`);
            btn.className = 'fa-solid fa-spinner fa-spin text-primary';
            
            recognition.onresult = function(event) {
                const transcript = event.results[0][0].transcript;
                document.getElementById(inputId).value = transcript;
                document.getElementById(inputId).closest('form').submit();
            };
            
            recognition.onerror = function(event) {
                console.error(event.error);
                alert('Gagal mendengarkan. Coba lagi.');
                btn.className = 'fa-solid fa-microphone';
            };
            
            recognition.onend = function() {
                 btn.className = 'fa-solid fa-microphone';
            };
        } else {
            alert('Browser ini tidak mendukung Voice Search.');
        }
    }

    // --- BLUR-UP LAZY LOAD ---
    function initLazyLoad() {
        const images = document.querySelectorAll('img.lazy-load:not(.loaded)');
        
        const observer = new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    const img = entry.target;
                    img.src = img.dataset.src;
                    img.onload = () => {
                        img.classList.remove('blur-md', 'scale-110');
                        img.classList.add('loaded'); // Mark as done
                    };
                    observer.unobserve(img);
                }
            });
        }, { rootMargin: "50px" });

        images.forEach(img => observer.observe(img));
    }
    
    // Init on Load
    initLazyLoad();

    // --- CONFETTI FX ---
    function triggerConfetti() {
        if(typeof confetti === 'undefined') return;
        
        // Explosion 1
        confetti({
            particleCount: 100,
            spread: 70,
            origin: { y: 0.6 }
        });
        
        // Explosion 2 (Delayed)
        setTimeout(() => {
             confetti({
                particleCount: 50,
                angle: 60,
                spread: 55,
                origin: { x: 0 }
            });
             confetti({
                particleCount: 50,
                angle: 120,
                spread: 55,
                origin: { x: 1 }
            });
        }, 200);
    }

    // --- INFINITE SCROLL WITH SKELETONS (DISABLED) ---
    /*
    let isLoading = false;
    let pageCount = 1;
    let totalPages = 0;
    
    if (totalPages > 1) {
        const grid = document.getElementById('posts-grid');
        const trigger = document.getElementById('loading-trigger');
        const endMsg = document.getElementById('end-message');
        
        // Hide standard pagination if JS is active
        const pagination = document.querySelector('.mt-12.flex.justify-center');
        if(pagination) pagination.classList.add('hidden');
        if(trigger) trigger.classList.remove('hidden');

        const scrollObserver = new IntersectionObserver((entries) => {
            if (entries[0].isIntersecting && !isLoading && pageCount < totalPages) {
                loadMorePosts();
            }
        }, { rootMargin: '200px' });

        if(trigger) scrollObserver.observe(trigger);

        function loadMorePosts() {
            isLoading = true;
            
            const offset = pageCount * 8;
            const url = new URL(window.location.href);
            url.searchParams.set('ajax', '1');
            url.searchParams.set('offset', offset);
            
            // Context for category/search
            const sc_type = '404';
            const sc_idx = '';
            if(sc_idx) {
                url.searchParams.set('sc_type', sc_type);
                url.searchParams.set('sc_idx', sc_idx);
            }

            fetch(url)
                .then(res => res.text())
                .then(html => {
                    if (html.trim()) {
                        grid.insertAdjacentHTML('beforeend', html);
                        pageCount++;
                        initLazyLoad(); // Re-init for new images
                        if (pageCount >= totalPages) {
                            if(trigger) trigger.classList.add('hidden');
                            if(endMsg) endMsg.classList.remove('hidden');
                        }
                    } else {
                        if(trigger) trigger.classList.add('hidden');
                        if(endMsg) endMsg.classList.remove('hidden');
                    }
                })
                .catch(err => console.error('Loading error:', err))
                .finally(() => {
                    isLoading = false;
                });
        }
    }
    */

    // ===== LAZY LOAD IMAGES =====
    function initLazyLoad() {
        const images = document.querySelectorAll('img.lazy-load:not(.loaded)');
        
        if ('IntersectionObserver' in window) {
            const imageObserver = new IntersectionObserver((entries, observer) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        const img = entry.target;
                        const src = img.dataset.src;
                        
                        if (src) {
                            img.src = src;
                            img.onload = () => {
                                img.classList.remove('blur-md');
                                img.classList.add('loaded');
                            };
                            observer.unobserve(img);
                        }
                    }
                });
            }, { rootMargin: '50px' });

            images.forEach(img => imageObserver.observe(img));
        } else {
            // Fallback for older browsers
            images.forEach(img => {
                const src = img.dataset.src;
                if (src) {
                    img.src = src;
                    img.classList.remove('blur-md');
                    img.classList.add('loaded');
                }
            });
        }
    }
    
    // Init on page load
    initLazyLoad();
</script>

<script>
    // ===== STAR RATING SYSTEM =====
    function ratePost(rating) {
        console.log('ratePost called with rating:', rating);
        const postId = document.getElementById('star-rating')?.getAttribute('data-post-id');
        console.log('postId:', postId);
        if (!postId) {
            console.error('No post ID found!');
            return;
        }
        
        fetch('https://lonteku.in.net/', {
            method: 'POST',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: `rate_post=1&post_id=${postId}&rating=${rating}`
        })
        .then(res => res.json())
        .then(data => {
            if (data.success) {
                // Update average and count
                document.getElementById('rating-avg').textContent = data.average;
                document.getElementById('rating-count').textContent = data.count;
                
                // Update stars visual
                const stars = document.querySelectorAll('.star-btn i');
                stars.forEach((star, idx) => {
                    const starNum = idx + 1;
                    star.className = '';
                    if (starNum <= Math.floor(data.average)) {
                        star.className = 'fa-solid fa-star text-yellow-400';
                    } else if (starNum - 0.5 <= data.average) {
                        star.className = 'fa-solid fa-star-half-stroke text-yellow-400';
                    } else {
                        star.className = 'fa-regular fa-star text-yellow-400';
                    }
                });
                
                // Show success feedback
                const container = document.getElementById('star-rating');
                container.style.transform = 'scale(1.1)';
                setTimeout(() => container.style.transform = 'scale(1)', 200);
            } else {
                alert('Failed to rate: ' + (data.error || 'Unknown error'));
            }
        })
        .catch(err => console.error('Rating error:', err));
    }
    
    // ===== COPY LINK FUNCTION =====
    function copyLink() {
        const url = window.location.href;
        if (navigator.clipboard) {
            navigator.clipboard.writeText(url).then(() => {
                // Show toast notification
                const toast = document.createElement('div');
                toast.className = 'fixed bottom-8 right-8 bg-green-500 text-white px-6 py-3 rounded-xl font-bold shadow-2xl z-50 animate-fade-in flex items-center gap-3';
                toast.innerHTML = '<i class="fa-solid fa-check-circle"></i> Link copied!';
                document.body.appendChild(toast);
                setTimeout(() => {
                    toast.style.opacity = '0';
                    toast.style.transform = 'translateY(20px)';
                    setTimeout(() => toast.remove(), 300);
                }, 2000);
            });
        } else {
            // Fallback for older browsers
            const input = document.createElement('input');
            input.value = url;
            document.body.appendChild(input);
            input.select();
            document.execCommand('copy');
            document.body.removeChild(input);
            alert('Link copied to clipboard!');
        }
    }

</script>



<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.6.0/dist/confetti.browser.min.js" defer></script>
    

    <!-- POPOUNDER SLOTS OUTPUT -->
    

    <!-- STORY VIEWER OVERLAY -->
    <div id="story-viewer">
        <div class="story-progress-bar" id="story-progress"></div>
        <div class="story-header">
            <div class="flex items-center gap-2">
                                    <div class="w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center text-primary font-bold text-xs ring-1 ring-white/20">
                        A                    </div>
                                <div>
                    <div class="flex items-center gap-1">
                        <span class="text-white font-bold text-sm">Admin</span>
                                                    <i class="fa-solid fa-circle-check text-blue-500 text-xs"></i>
                                            </div>
                                            <span class="text-white/50 text-[10px] block leading-none">Official Account</span>
                                    </div>
            </div>
            <div class="story-close" onclick="closeStories()">&times;</div>
        </div>
        
        <div class="story-content-area" id="story-content">
            <!-- Content Injected via JS -->
        </div>

        <!-- Tap Areas -->
        <div class="story-tap-area left" onclick="prevStory(event)"></div>
        <div class="story-tap-area right" onclick="nextStory(event)"></div>
    </div>

    <script>
        // Story Data (Safe Encode)
                window.sttreamStories = [];
        console.log("Stories Data:", window.sttreamStories);
    </script>
    <script src="assets/js/stories.js?v=1777116316"></script>

    <!-- Story viewer fixes: fix text word-per-line + add relative time -->
    <style>
        /* Fix story text wrapping word-per-line */
        .story-text {
            flex-direction: column !important;
            text-align: center !important;
            white-space: pre-wrap !important;
            word-break: break-word !important;
        }
        .story-text p, .story-text a {
            display: block !important;
            width: 100% !important;
            white-space: pre-wrap !important;
            word-break: break-word !important;
        }
        #story-time-label {
            font-size: 10px;
            color: rgba(255,255,255,0.5);
            line-height: 1;
            margin-top: 1px;
            display: block;
        }
    </style>
    <script>
    function storyTimeAgo(date) {
        if (!date) return '';
        const s = Math.floor((Date.now() - new Date(date)) / 1000);
        if (isNaN(s) || s < 0) return '';
        if (s < 60) return 'baru saja';
        if (s < 3600) return Math.floor(s/60) + ' menit lalu';
        if (s < 86400) return Math.floor(s/3600) + ' jam lalu';
        if (s < 172800) return 'Kemarin';
        if (s < 604800) return Math.floor(s/86400) + ' hari lalu';
        if (s < 2592000) return Math.floor(s/604800) + ' minggu lalu';
        return Math.floor(s/2592000) + ' bulan lalu';
    }

    // Inject time label once after page load — no MutationObserver
    window.addEventListener('load', function() {
        const storyViewer = document.getElementById('story-viewer');
        if (!storyViewer) return;

        // Add static time label element to header
        const headerInfo = storyViewer.querySelector('.story-header > div:first-child > div:last-child');
        if (headerInfo && !document.getElementById('story-time-label')) {
            const timeLabel = document.createElement('span');
            timeLabel.id = 'story-time-label';
            headerInfo.appendChild(timeLabel);
        }

        // Override window.openStories / any click on story bubbles to update time
        const storyBubbles = document.querySelectorAll('[onclick*="openStories"], .story-item, .story-bubble');
        storyBubbles.forEach(function(el) {
            el.addEventListener('click', function() {
                setTimeout(function() {
                    const stories = window.sttreamStories || [];
                    const idx = window.currentStoryIndex ?? 0;
                    const story = stories[idx];
                    const label = document.getElementById('story-time-label');
                    if (story && label) {
                        label.textContent = storyTimeAgo(story.created_at || story.date || null);
                    }
                }, 100);
            });
        });
    });
    </script>



    <script src="https://lonteku.in.net/assets/js/script.min.js" defer></script>
    
    <style>
        .stories-hidden {
            margin-top: -130px !important; /* Slide up completely */
            opacity: 0;
            pointer-events: none;
        }
    </style>
    <script>
        // Collapsible Stories on Scroll
        const storiesWrapper = document.getElementById('stories-wrapper');
        
        window.addEventListener('scroll', function() {
            let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
            
            if (scrollTop <= 10) {
                // Mentok Atas -> Show
                storiesWrapper.classList.remove('stories-hidden');
            } else {
                // Scroll Down -> Hide
                storiesWrapper.classList.add('stories-hidden');
            }
        }, { passive: true });
    </script>
<!-- PWA Install Prompt -->
<div id="pwa-install-toast" class="fixed bottom-4 left-4 right-4 md:left-auto md:right-4 md:w-80 bg-black/90 border border-white/10 p-4 rounded-xl shadow-2xl z-50 transform translate-y-full opacity-0 transition-all duration-500 hidden">
    <div class="flex items-center gap-3">
        <div class="w-10 h-10 bg-primary/20 rounded-lg flex items-center justify-center text-primary">
            <i class="fa-solid fa-download"></i>
        </div>
        <div class="flex-1">
            <h4 class="text-sm font-bold text-white">Install App</h4>
            <p class="text-xs text-gray-400">Add to Home Screen for better experience.</p>
        </div>
        <button id="pwa-install-btn" class="px-3 py-1.5 bg-primary text-black text-xs font-bold rounded-lg hover:bg-primary/80">
            Install
        </button>
        <button onclick="document.getElementById('pwa-install-toast').classList.add('hidden')" class="text-gray-500 hover:text-white">
            <i class="fa-solid fa-xmark"></i>
        </button>
    </div>
</div>

<script>
if ('serviceWorker' in navigator) {
    window.addEventListener('load', () => {
        navigator.serviceWorker.register('/sw.js')
            .then(reg => console.log('SW Registered!', reg))
            .catch(err => console.log('SW Failed', err));
    });
}

let deferredPrompt;
const pwaToast = document.getElementById('pwa-install-toast');
const installBtn = document.getElementById('pwa-install-btn');

window.addEventListener('beforeinstallprompt', (e) => {
    e.preventDefault();
    deferredPrompt = e;
    // Show toast
    pwaToast.classList.remove('hidden');
    setTimeout(() => {
        pwaToast.classList.remove('translate-y-full', 'opacity-0');
    }, 100);
});

installBtn.addEventListener('click', () => {
    pwaToast.classList.add('translate-y-full', 'opacity-0');
    if (deferredPrompt) {
        deferredPrompt.prompt();
        deferredPrompt.userChoice.then((choiceResult) => {
            if (choiceResult.outcome === 'accepted') {
                console.log('User accepted the install prompt');
            }
            deferredPrompt = null;
        });
    }
});
</script>
<script>
    const VAPID_PUBLIC_KEY = '';
    
    // Service Worker Registration
    if ('serviceWorker' in navigator && 'PushManager' in window && VAPID_PUBLIC_KEY) {
        window.addEventListener('load', () => {
            navigator.serviceWorker.register('https://lonteku.in.net/sw.js')
                .then(swReg => {
                    console.log('Service Worker is registered', swReg);
                    checkSubscription(swReg);
                })
                .catch(error => {
                    console.error('Service Worker Error', error);
                });
        });
    }

    function checkSubscription(swReg) {
        swReg.pushManager.getSubscription()
        .then(subscription => {
            const isSubscribed = !(subscription === null);
            updateBtn(isSubscribed);
        });
    }

    function updateBtn(isSubscribed) {
        const btn = document.getElementById('push-sub-btn');
        if(btn) {
            const icon = btn.querySelector('i');
            if (isSubscribed) {
                btn.classList.add('text-primary');
                btn.classList.remove('text-white');
                if(icon) icon.classList.replace('fa-regular', 'fa-solid'); // Solid bell
            } else {
                btn.classList.remove('text-primary');
                btn.classList.add('text-white');
                if(icon) icon.classList.replace('fa-solid', 'fa-regular'); // Outline bell
            }
        }
    }

    function subscribeUser() {
        if (!VAPID_PUBLIC_KEY) return;
        
        navigator.serviceWorker.ready.then(swReg => {
            swReg.pushManager.subscribe({
                userVisibleOnly: true,
                applicationServerKey: urlB64ToUint8Array(VAPID_PUBLIC_KEY)
            })
            .then(subscription => {
                updateSubscriptionOnServer(subscription);
                updateBtn(true);
                alert('Subscribed to notifications! 🔔');
            })
            .catch(err => {
                console.log('Failed to subscribe: ', err);
                alert('Failed to subscribe. Please ensure permission is granted.');
            });
        });
    }

    function updateSubscriptionOnServer(subscription) {
        fetch('https://lonteku.in.net/api/subscribe.php', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(subscription)
        });
    }

    function urlB64ToUint8Array(base64String) {
        const padding = '='.repeat((4 - base64String.length % 4) % 4);
        const base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
        const rawData = window.atob(base64);
        const outputArray = new Uint8Array(rawData.length);
        for (let i = 0; i < rawData.length; ++i) {
            outputArray[i] = rawData.charCodeAt(i);
        }
        return outputArray;
    }
    
    // Bind Button
    document.addEventListener('click', (e) => {
        if(e.target && (e.target.id === 'push-sub-btn' || e.target.closest('#push-sub-btn'))) {
             subscribeUser();
        }
    });
</script>
</body>
</html>