<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Eventos y Enlaces Acestream</title>
    <style>
        /* Estilos existentes */
        .enlace-android {
            color: #ff002b;
            text-decoration: none;
            padding: 5px 10px;
        }

        .enlace-pc {
            color: #ff33a8;
            text-decoration: none;
            padding: 5px 10px;
        }

        .enlace-android:hover,
        .enlace-pc:hover {
            text-decoration: underline;
            background-color: rgba(255, 255, 255, 0.1);
        }

        body {
            text-align: center;
            background-color: #242424;
            color: #ffffff;
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
            background-color: rgba(0, 0, 0, 0.2);
        }

        th,
        td {
            border: 1px solid #ffffff;
            padding: 12px 8px;
            text-align: center;
        }

        th {
            background-color: #0a8228;
            color: white;
        }

        #debug-console {
            margin-top: 20px;
            width: 100%;
            height: 300px;
            border: 2px solid #ff33a8;
            background-color: #000;
            color: #0f0;
            font-family: monospace;
            padding: 10px;
            box-sizing: border-box;
            overflow-y: auto;
            text-align: left;
            display: none;
        }

        .log-entry {
            margin: 5px 0;
            padding: 5px;
            border-bottom: 1px solid #333;

        }

        .log-info {
            color: #0f0;
        }

        .log-error {
            color: #f00;
        }

        .log-warning {
            color: #ff0;
        }

        .log-success {
            color: #0ff;
        }

        .log-data {
            color: #ff9900;
        }

        #connection-status {
            position: fixed;
            top: 10px;
            left: 10px;
            padding: 5px 10px;
            border-radius: 5px;
            font-weight: bold;
        }

        .status-connecting {
            background-color: #ff9900;
        }

        .status-connected {
            background-color: #00ff00;
            display: none;
        }

        .status-error {
            background-color: #ff0000;
        }

        .raw-data {
            margin-top: 10px;
            padding: 10px;
            background-color: rgba(0, 0, 0, 0.3);
            border: 1px solid #666;
            font-size: 12px;
            white-space: pre-wrap;
            max-height: 200px;
            overflow-y: auto;
        }

        .category-icon {
            width: 20px;
            height: 20px;
            vertical-align: middle;
            margin-right: 5px;
        }

        /* Eliminamos .category-cell y sus estilos */
        td img.category-icon+span {
            vertical-align: middle;
        }
    </style>
</head>

<body>
    <div class="container">
        <div id="connection-status">Verificando conexión...</div>
        <h1>/⁠╲⁠/⁠\⁠╭⁠(⁠•⁠‿⁠•⁠)⁠╮⁠/⁠\⁠╱⁠\</h1>
        <h1>Eventos Acestream Arena4Viewer ;)</h1>
        <h1>by TokyoGhoull</h1>

        <table id="eventos-tabla">
            <thead>
                <tr>
                    <th>Fecha</th>
                    <th>Hora</th>
                    <th>Categoría</th>
                    <th>Campeonato</th>
                    <th>Evento</th>
                    <th>Enlaces Android</th>
                    <th>Enlaces PC</th>
                </tr>
            </thead>
            <tbody></tbody>
        </table>

        <div id="debug-console"></div>
    </div>

    <script>
        // Diccionario de traducción de categorías
        const CATEGORIAS = {
            'BEACHSOCCER': 'Futbol Playa',
            'MOTOGP': 'MotoGP',
            'PADDLE': 'Pádel',
            'SOCCER': 'Futbol',
            'SPORTS': 'Deportes',
            'TENNIS': 'Tenis',
            'SYNCHRONIZED SWIMMING': 'Natación Sincronizada',
            'SNOOKER': 'Billar',
            'BASEBALL': 'Béisbol',
            'VOLLEYBALL': 'Voleibol',
            'MOTORCYCLING': 'Motociclismo',
            'F1': 'Fórmula 1',
            'MMA': 'Artes Marciales Mixtas',
            'UFC': 'UFC',
            'GOLF': 'Golf',
            'EVENT': 'Evento',
            'MOTOR': 'Motor',
            'MOTOS': 'Motocicletas',
            'RUGBY': 'Rugby',
            'TENIS': 'Tenis',
            'FORMULA 1': 'Fórmula 1',
            'VOLLEYBALL (W)': 'Voleibol (F)',
            'ATHLETICS': 'Atletismo',
            'BASKETBALL (W)': 'Baloncesto (F)',
            'SWIMMING': 'Natación',
            'BADMINTON': 'Bádminton',
            'HANDBALL': 'Balonmano',
            'MOTORSPORT': 'Automovilismo',
            'SWIMMING (W)': 'Natación (F)',
            'SWIMMING(W)': 'Natación (F)',
            'FOOTBALL': 'Futbol',
            'BASKETBALL': 'Baloncesto',
            'FORMULA1': 'Fórmula 1',
            'GYMNASTICS TRAMPOLINE': 'Gimnasia Trampolín',
            'BALONCESTO': 'Baloncesto',
            'MOTOCYCLING': 'Motociclismo',
            'BEACH SOCCER': 'Futbol Playa',
            'MIXEDMARTIALARTS': 'Artes Marciales Mixtas',
            'VOLLEYBALL(W)': 'Voleibol (F)',
            'BASKETBALL(W)': 'Baloncesto (F)',
            'CURLING': 'Curling',
            'SOCCER(W)': 'Futbol (F)',
            'CYCLING': 'Ciclismo',
            'BOXING': 'Boxeo',
            'SOCCER (W)': 'Futbol (F)',
            'EVENTS': 'Eventos',
            'FUTSAL': 'Futbol Sala',
            'BOBSLEIGH': 'Bobsleigh',
            'WRESTLING': 'Lucha Libre',
            'MARATHON': 'Atletismo',
        };

        // Diccionario de iconos en base64 (SVG)
        const CATEGORY_ICONS = {
            'Deportes': 'data:file/octet-stream;base64,UklGRkoCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSMIAAAABgLtt2/HlzrZte/v92u3aO9rs2uzJ3Gz3P9iTbWOzn/QprhExAfiH2kbnRYuUeVOLGrojItoqseXFMGODmC+L5Tmp5J0S+wkrDuFLxHnHno3+APG5rs3gGT9J/PZCQgJwansh3r0Ao/IbErBRJv2UBB1UOSNh61ApzJYVvAQ5MgVkpoXoAIBIIcQfFNb5S8WniWxGx/YeGF5mI/C50hxTFqBiIw6MTE+LDXKVALPvJzf1IvDeRXRR6wABPWYKjfBXB1ZQOCBiAQAAcAcAnQEqIAAgAD6RQpxKJaOioagIALASCWwAtvdengbJ45XUJuAAPoDk5VLjP23RrOZ0MLDjmAtAYw/LrxeizHf5AAAA/vsIaBgeOkUIOgZF7gvj3YG/vgNBLSvoVtZGNm//LgB2lOwV3FrmdSx0c2cvnt7sv/9f64sS7Qch1PeaKDx5SaMf3E/VlCqbe1Pv+GWu5hy0wQD3om9O+X55BLS7KstRCooFJdZpBGgNByHveZXVApo25/mvOj9rb65QcZ6PS2rghNhgh2xFGrzOfEijqF/apUVHgKNh+Z0u90x59oXXgdw5b1TSDRerumXUrVA9ue7OM9ojeX0Q0MCfsFEuwbSS/sZrbHJVheas/+Rc9mJRgAi+6gibr38/Hx3RVx8WC+uqbQRX+FvyS61Uix6f66jC4iIp/Kz6F/20lJiiTX+OZgS10jiz/f9MhkBPCmBhppJg7csrQVRPnx8CAAAA',
            'Boxeo': 'data:file/octet-stream;base64,UklGRkoCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSMIAAAABgLtt2/HlzrZte/v92u3aO9rs2uzJ3Gz3P9iTbWOzn/QprhExAfiH2kbnRYuUeVOLGrojItoqseXFMGODmC+L5Tmp5J0S+wkrDuFLxHnHno3+APG5rs3gGT9J/PZCQgJwansh3r0Ao/IbErBRJv2UBB1UOSNh61ApzJYVvAQ5MgVkpoXoAIBIIcQfFNb5S8WniWxGx/YeGF5mI/C50hxTFqBiIw6MTE+LDXKVALPvJzf1IvDeRXRR6wABPWYKjfBXB1ZQOCBiAQAAcAcAnQEqIAAgAD6RQpxKJaOioagIALASCWwAtvdengbJ45XUJuAAPoDk5VLjP23RrOZ0MLDjmAtAYw/LrxeizHf5AAAA/vsIaBgeOkUIOgZF7gvj3YG/vgNBLSvoVtZGNm//LgB2lOwV3FrmdSx0c2cvnt7sv/9f64sS7Qch1PeaKDx5SaMf3E/VlCqbe1Pv+GWu5hy0wQD3om9O+X55BLS7KstRCooFJdZpBGgNByHveZXVApo25/mvOj9rb65QcZ6PS2rghNhgh2xFGrzOfEijqF/apUVHgKNh+Z0u90x59oXXgdw5b1TSDRerumXUrVA9ue7OM9ojeX0Q0MCfsFEuwbSS/sZrbHJVheas/+Rc9mJRgAi+6gibr38/Hx3RVx8WC+uqbQRX+FvyS61Uix6f66jC4iIp/Kz6F/20lJiiTX+OZgS10jiz/f9MhkBPCmBhppJg7csrQVRPnx8CAAAA',
            'Balonmano': 'data:file/octet-stream;base64,UklGRqYCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOsAAAABgGPb2rHniVXZldHZmoBt1badMdh2MoN/pbJt2zae8P2eNyOIiAmAfyxlm1ja2dtQ4qVJo5I+g39etDgQRKwje52mAOkqFLxqzyTTh4TXriwVSHpq8FcoEovEf1PcpULP31KRfEzyh9QCHVqpmImDFXIc2UJTSOCBeKMFpXyyATq59EsD9PB4sQSAOh6HoBINRTwG3VcRvHicvCGC+gUHRCwHaOHxkg4A1m90C47ws46sXxV+VdkgWlOFP62vaDyA0eWYYlKMBYxFBG7ALh5zL6QOBOcKGFAQpjDPNKkDhJY3DCe6QBrM4AeMAFZQOCCUAQAA8AgAnQEqIAAgAD6JOJVHpSOiITf1WACgEQlsAJ0yhILI+PgF+w8BtgLsA5QD4JP3G9I4wATNhhiwQbNJ60wS3mdOojvDo/4gIr4EKh0PguAA/t62NuUjPtpFRfRMw64+APaJSYzVWalcqVogtXztN9+8AgXOjnHlE4WsWv0rTteE6aT8ZOho6nk5g0LWqpr1cInxOg5225Eu8Z5HCv1mT5PkbdC7qCTYevJNVsIa1BQrZPEKoTC9sY60D9pmraxofvbhkPhuMOymXNxpMbrGV4Ou/aeZtgloxUK0wu2fabOio6H52ad5m8ZK2WRPaGuEVwqv0Z4KTpFYVENL2/f7R30NgMIfKvuXx/nujRodNAnd5WZoBzwrqqyR0ezH0bmcUPmRpzYqqIsMvldh39mpHzVez5ew4M7qoct8CARLt4SBsgMTQaL5vJ6pniRIbC156EnvP0RGpGTUeF2ZWkuQdfd2uWTMWJp5b2dWOSqc3GITprgk/t8pnUWl/58vwmMy4a1xwM1cv7H7/3kcODHnVWgQAAA=',
            'Pádel': 'data:file/octet-stream;base64,UklGRloCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOEAAAABgKtt//nl8/9nW5NtuyZNbrMxuc212d6sA/gfQXZttm3XJ3++36sOICImAP5blaiGvo48XwlmYav47VQEo1z85YAKCz/89YgyTWLmdzhIC0RqGKmVJKKIzZIONQgaJyS0J+jfkh6MCSaPpEUpgu4NqRqISjuUcz2KYJySCORuQiHQS7FG9NNLHjBMQyuxhPlv5gOAZTi6A9Qg4kKWHDBNRxurIbzpDZQCxkO4/vZQZgbM5TbwtVEPOGbhgw/w1D7CduDaggdaXFyeMQt4qkzighSXeERf4KrTMyfOB0AV/igAVlA4IFIBAACQBgCdASogACAAPpE+m0kloyKhKAqosBIJbADBDutUBqIBXgezLNJ3x39QFscJeNSQ+UYPHxTFqE3j/caAAP7/OkHsNrCUtdOgakl9+UNb+SA4zQ1ELv96EOrcrfwt/a//1r/yBW+ePQ7koew0xDpINOh/+3kKL+3vc93J54Nyo2ujTQ/gL7oO9JAdM/dpH757qAEeUk2ZGJEl4yQMAEF9ZHuzxistv1wtqx3zJkHhwYMGt48sHgPBYgEJqr7kMzJzRQDRU9ny1Ct5zoc5AOT8I9Ixus4zFXZXp79sR/3kl9JZ987+Ifnv17BrkT9VBvhZPSAKXiOtgxEMJdIFeAptrvD1Z+LhyRz8a9KND/u5fd+Tr5P+avmgwr+mJl/jGFmfY9HnMhFSe3l12+9dFobkO7y6/wEiViLTFdrsN5iBl39JRHtnANtwXI4xyY0vcuAAAA==',
            'Rugby': 'data:file/octet-stream;base64,UklGRvoCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSAEBAAABBjm3tR17ZNu206q0ncq2U9q2bXQss1LZHHta2/bM8z7vnX9wrYiYAPyvbmisLkFvWrz94NXbR5dWygJ0SLTu/OZ8MuEvJS73t8jTFCkxq2KAfR8++fvigFFVHq2nFDh14NB/TYJXgUJaz2jwOUBA+jLBr98A3jmxsEaAX78B3FJjdVKw51lRdPBlmH+h+MW4Jvcf1ikE4xk5F3DE0H1DB+f/0H8Bgwyrj3Q3Zf9DNd0PK4byPTJEMuD2nayIhTSydgHUU80KoZFokgP5X0maeeB+nyKDC1pd30X9sOUDXBc+iViWEO9Yd5Nn25wAkHNNH9u+du/GzkColAS9tIIM2ABWUDgg0gEAAJAKAJ0BKiAAIAA+hTCUR6UioiE3+qgAoBCJbACdMuN1B4BwhL58ADbAaDp1FHPbexF+2n7R+0zc1ZEC6AlQPZk9p9AAWWoUENVRMzVim3CAoUJuXWJFAn31lJpwAAD+43zEWK81FR7tbuVT26TNWZqnxTYT9NKym5MGyiydIVPWI844QdN/J4tzR3YDV9q8FknZTItnKx5xWQden85l6zVb/i6I3z1r/8KX/Bmpdt12Yit1tjw//jnhFPAL8f2Y57fjhC1w/crQu17lP1t0n/QK0nLYcIzdw/1M0QykwAi811jzfQmWJjzIR2kiRHyOea6KP06/icviL25RIJ0NzFq6xX/OPM154T9fzXU5yjJxWzgJKxiDKJrB0e5L1CoZ1d8TxWb1+QTLuV3NXBf2+5Xe3kgcP9Dglj1qziIiXdzy0tSRoyA3WxXqmpy8Xbnbq6WNb2//MQhtlZGWvxd2+frpepNPv/9OdJeZr9pb+R+Pwrrxrg34pbVpQ7hAkPLN0tCXG7wo7/lkLTAmS1xGy37djvCbtn+ABDfuLpgXp/VLgeJgH1I58VcpKEpkz1o2xSiZbE5KO43w5l0GhgFhN2KS5Eal+xhKGCdznPWIs+FgAAA=',
            'Tenis': 'data:file/octet-stream;base64,UklGRl4CAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOYAAAABgHNbt2lX+Y5V2kZn22htterUZ6Szbdu10bG0U9t572WH5+4dERMA4iZ+CYmR9ppA7F62eY+I+H7YnahB4D2nQNH9Ailq5TKU2mUhZLSChDfJAoZ7SJv1j9o6EsvC/ypH8mvdX+4KOmz6tYCMMkcAJxkHNgCUIuu5JqzxYIDhPVOhDzJ3JXBNJnFNRXENWb8zlasfMKVDD8+tAcTyDABoHLOEAkAux7YaAKhsMQTDb6dXsgr4O5lqTvkfyFGQzGqDYMwFQbUyCBu1ySTsRIFkl5az/x4Wk9WBUiekpHtqaqQ81RJEAVZQOCBSAQAAEAkAnQEqIAAgAD6RQpxKJaOioagIALASCWwAdgD8APwAvQe7d1gHoAeUp7DH7VfsB7OTRXkgTMgYBttd/0XH9UTWbFlDlThM8GRhbK9dTMVAAP736S0QnYzgPbIICkhooHEG2WXuotN6L1CMEEuv/83s4S6qeNs7JVaGys2/4aNcaiP+672PiISjMJas2Y9ITnX/8tKZAELFyga4VjCldjkBP4UwwsuM1gv7vPD9XJPUSPaX6JyNcqCVb2vgelNgDqmtNAFlcHQNzBbvK8Svs5m3gcI06LEuf8yZVjPbpoUVWnv9yefIjdeXDnyDzgMF1CM1YqmQB6QFFepvQ4+z4n1KMXfp+tpOYR/jZizMTt6dKvziHwoM0nfw7MiUfJtndQhRsGRtwz4MHeArNrl0CWz7KsfOgiVeMvNqveIm8NP5NucKebJHjY3J7tUkNQdAAAA=',
            'Futbol (F)': 'data:file/octet-stream;base64,UklGRqICAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOUAAAABgLtt2/FV/f1TtrnZja6tyTXX3GjXZmOyjdme2mzbdlM/v9/7RMQEgN02MCYxJsQenN2yZp/l6q9LBT4cXJo+5ax/XT5CUp7lQj8zmERNcp69egwDcr7jOlqq5bzbNUXJ+SepmZwRPFkDSJVTFgP6JySPZoiQ08aijKgV80RresdEN+aPRI8WT0RPxtdE9+IVomP0EI0jmSgNjr8k/+5AP8kUAH+SMABoJOiHuvE2t3NrDfB85vQVCK2BN1xeI8HotsxhLQDM0qJHAW9lBhDqXLrNsFfjAp6y4Kz24bHhjtxwXTACAFZQOCCWAQAAEAgAnQEqIAAgAD6NNpZHpSKiITf1WACgEYlpAAsALBT2v/PX/S9wP9YOtGcZh3zjszEu2nmB4H0karYZvasf6t99t/zFo6+AAAD+/BPgiMI25NDfP/qkGX/yshV3oolbwcuCqW0d3XhO7P31n26/mB7qRSP7PFtHvNP55rH/+6qEwgLxDhPREe/ThrS837zsHrY5JIQvLdplg2NnFL/D8rX/8m3Y0dVWJCD/b3x/Tve7/bVZ/XM98WhpztiwnxOrgvjSfSbSQr3SVnmxDHMoD/qyf59MFuPH/0rD5JX7Yr8d2Xy4/8z+Kze3wc7QD5h3lOuKLmfWNx0/dmz+id8ibU/yDwhjvx8xM/0dl7SchAIz2AVlHyue7dEywDdQYBkiJXNeTgdv278KC1QtPPPKoFTGa0fdfGqYsx/5pTpswT1MHGEo0eX+YRcyyC8/DIHhAVGTkgWcvnqhNxg7ToVIO/qmwXcZzisjyEVUhbExsGZYavGYSxCFjt0IuYfdEkeJ9YrRW1w3Ob5j2Sc32ZoSTNDx4AAAAA==',
            'Futbol': 'data:file/octet-stream;base64,UklGRqICAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOUAAAABgLtt2/FV/f1TtrnZja6tyTXX3GjXZmOyjdme2mzbdlM/v9/7RMQEgN02MCYxJsQenN2yZp/l6q9LBT4cXJo+5ax/XT5CUp7lQj8zmERNcp69egwDcr7jOlqq5bzbNUXJ+SepmZwRPFkDSJVTFgP6JySPZoiQ08aijKgV80RresdEN+aPRI8WT0RPxtdE9+IVomP0EI0jmSgNjr8k/+5AP8kUAH+SMABoJOiHuvE2t3NrDfB85vQVCK2BN1xeI8HotsxhLQDM0qJHAW9lBhDqXLrNsFfjAp6y4Kz24bHhjtxwXTACAFZQOCCWAQAAEAgAnQEqIAAgAD6NNpZHpSKiITf1WACgEYlpAAsALBT2v/PX/S9wP9YOtGcZh3zjszEu2nmB4H0karYZvasf6t99t/zFo6+AAAD+/BPgiMI25NDfP/qkGX/yshV3oolbwcuCqW0d3XhO7P31n26/mB7qRSP7PFtHvNP55rH/+6qEwgLxDhPREe/ThrS837zsHrY5JIQvLdplg2NnFL/D8rX/8m3Y0dVWJCD/b3x/Tve7/bVZ/XM98WhpztiwnxOrgvjSfSbSQr3SVnmxDHMoD/qyf59MFuPH/0rD5JX7Yr8d2Xy4/8z+Kze3wc7QD5h3lOuKLmfWNx0/dmz+id8ibU/yDwhjvx8xM/0dl7SchAIz2AVlHyue7dEywDdQYBkiJXNeTgdv278KC1QtPPPKoFTGa0fdfGqYsx/5pTpswT1MHGEo0eX+YRcyyC8/DIHhAVGTkgWcvnqhNxg7ToVIO/qmwXcZzisjyEVUhbExsGZYavGYSxCFjt0IuYfdEkeJ9YrRW1w3Ob5j2Sc32ZoSTNDx4AAAAA==',
            'Baloncesto (F)': 'data:file/octet-stream;base64,UklGRuoCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOEAAAABgLJt2/lX+D2b6b/mrdq2bTcjOS6p29YHsG00b9FMxju+v/eJiAkAv4GNt5+PqToEO1St3TPG2NNpX4y6AM9hxn1UqCRBs5ZJXrPnMtpgAh/TOQyPmdjMf7R3meDP4L/amfAL2a9wRtgBQG6J4tMScGekTUA9zYWu0h4N8zd9ISrzYsRNEVQDUVRDwVTdNlQ1eldE6RileTVHNs0CIHsgyQBQQbGvCkD7lCAcv70/hDXi73xR0yr/oEjMhA44E68E1KuA26Rfym4UJDu3nv33PJ2hDJH6AeXNg0NdlakW4AUAVlA4IOIBAACQCQCdASogACAAPn0ukkekoqGhN+gAkA+JbACdMoRwN7XxVLlcADbAbh7/d+mrvgHll+xPXOJzn3BjEmdpR3clur9xuOMZr8UlkkkLsqRK1teOrqNAAP6dawejOrgnDbtmzjLD/OQwiVtCokh4KfKXAeUZK3mYpAHFNIGrLYzvmsAxpXExH5NuVc1KAN9LzL4F3xh+qF3vR7X5jvjdavgvjRawfAIu4xSSub297KW4n76Vtub4VpXXsr1oODZ3RMcZwokha0I5F/vfKbNl1T8xKzPg7SGUj4gVGh64Cqw22y1cHtVBQSCY/SYtHvbl+n4isaOO80lXWK/aysUKz35saV2/dCqgCA4oNS1koCMRdj08Gi5gvNcYXxbkMaOqOwlVS3XURLioksNWPkCLau9be4e60AXe3wR047SZNdjjgS/0bq9RsHSZsxMhJrHInDZIt+aFTHuwGQb/f2YogXJSPpZJbwu9yulvxJle1hUTMQMAi/xHvT3Gc3C55nJ1swlC6lb8WWTS910KNAeeIEAnAxk5SmtmF887JMAJvtkF4psWczQAMRAnacwcouQSKkSas32F7SNhXVGC0rj7qWc+xeZUtqGtPVr/fQfDo3HaRVsG7gSl3Ufk7fn/lnRdhxCAAA==',
            'Baloncesto': 'data:file/octet-stream;base64,UklGRuoCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOEAAAABgLJt2/lX+D2b6b/mrdq2bTcjOS6p29YHsG00b9FMxju+v/eJiAkAv4GNt5+PqToEO1St3TPG2NNpX4y6AM9hxn1UqCRBs5ZJXrPnMtpgAh/TOQyPmdjMf7R3meDP4L/amfAL2a9wRtgBQG6J4tMScGekTUA9zYWu0h4N8zd9ISrzYsRNEVQDUVRDwVTdNlQ1eldE6RileTVHNs0CIHsgyQBQQbGvCkD7lCAcv70/hDXi73xR0yr/oEjMhA44E68E1KuA26Rfym4UJDu3nv33PJ2hDJH6AeXNg0NdlakW4AUAVlA4IOIBAACQCQCdASogACAAPn0ukkekoqGhN+gAkA+JbACdMoRwN7XxVLlcADbAbh7/d+mrvgHll+xPXOJzn3BjEmdpR3clur9xuOMZr8UlkkkLsqRK1teOrqNAAP6dawejOrgnDbtmzjLD/OQwiVtCokh4KfKXAeUZK3mYpAHFNIGrLYzvmsAxpXExH5NuVc1KAN9LzL4F3xh+qF3vR7X5jvjdavgvjRawfAIu4xSSub297KW4n76Vtub4VpXXsr1oODZ3RMcZwokha0I5F/vfKbNl1T8xKzPg7SGUj4gVGh64Cqw22y1cHtVBQSCY/SYtHvbl+n4isaOO80lXWK/aysUKz35saV2/dCqgCA4oNS1koCMRdj08Gi5gvNcYXxbkMaOqOwlVS3XURLioksNWPkCLau9be4e60AXe3wR047SZNdjjgS/0bq9RsHSZsxMhJrHInDZIt+aFTHuwGQb/f2YogXJSPpZJbwu9yulvxJle1hUTMQMAi/xHvT3Gc3C55nJ1swlC6lb8WWTS910KNAeeIEAnAxk5SmtmF887JMAJvtkF4psWczQAMRAnacwcouQSKkSas32F7SNhXVGC0rj7qWc+xeZUtqGtPVr/fQfDo3HaRVsG7gSl3Ufk7fn/lnRdhxCAAA==',
            'Fórmula 1': 'data:file/octet-stream;base64,UklGRgwDAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSPcAAAABgGPb2rHnxrZto8oAbKOybdsp02UKdmrbGEFWKtvGU7zfb9QRMQGQC92CYpOSQ92UBHC34DIuWn4n9nuvL81Hl4d6+WYCh+UG8f1zvDHV393S275ENMfhfMUf/28OjN6xsP6JShmlTfoVDhEtMxj4+xfatxtT9U3Cb2DKSYQ7TJgoflwBeP6KgCoA6N+KYgmA4uy7CD5cAaS9ioCqAWSTKPcUgRSR/LoD4f+ioFLA9lYki4DuqUi+AOyJhACMcjytjw4OTh3dC9ILoI+IDkttwSqY+TfNnvxx/c+FAkAWnecpg29N34SqlqaWYj9wRq7ZQ7S66pDlAFZQOCDuAQAAsAsAnQEqIAAgAD6RPphJpaMiISgKqLASCWkAE4a6Czvf6j7YB20npOcY/tWOo0STTpf6r06M5Dyx/0/cJ/Tj/jf1/hQFVsQ65EDsl+ivUno1yu+Aa31EN3mktH+Rpd7QzEw5zIQAAJ359Bx1jT1PBn6/62aPjVZXW4/1Ggn7hHk9/8ya0Iydp5CLvxmr86L7WFj+B/5RODM5Lcw8scvrmQ1Upz4XHr5syPev6z4X3nCZ6BZJ0mG9cGaVMXXr57ftu/+ek4lcrn6+3//nv26f7w0DlUv4L46jsHeSqZyB7L6eNoINkYhFtZuzj5vO+a7+OOux73dsIe6oW57cH/JFiwEyRl47QJ6b8WI/peblQt1oSnpA0QfErUTUd4H0ecQi+N/Yk2o0HhCd4SgMl/n9mVErSl8nzxRumDT9h6/m3/vsiPax3VBH0iM7MzZTMWr/3mzhnXrDcdZL1Al4ey+bj7fXN/z3gKIB8m6P9z6FVih9KGy2rXyx7UQcB9QlpnPX4oE/jEuSecf+Q1hCS/7/U7+5c7MUYYOYpjiLaSbd4vTaksEag69vy+zD2IafNNVyqO0qzJMrrfDynV/A3QrTU/0ABPyd8xTaM3uHTns/s9xmxhsHYH/Bvu9cRylHw9Dz4etQIn6kUFaW1HAAAAA=',
            'Golf': 'data:file/octet-stream;base64,UklGRlwCAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSOQAAAABkGvb2rFXO7Zt263R+RJso7XZq0z6VHbS2bZt+5zf3/c+dxAREwCeaga6qmAfUt29e3u9M95R5MhCJ2FcwPGxzZtXwLKA51ezBrfsHwH/GQcuZQKmh86y8gSMdyyk+QuY90ubZCeIk8gUEG4pA8oLFIIIIEBA2gMU03xYoYtGEKh/RpRo90FUZXRLVGd8R1SuvEmUhDGicFTRvFkhkmYC0NgmSQPQTHGrDcBkmyANkrHsRiC9ltW9uQy0s7kKBsc6Fuvu4BxxwOevRRc8DTPXuLx3+oGhYmh1/9bN5f50R7ozOAJWUDggUgEAAFAHAJ0BKiAAIAA+kUKcSqWjoqGoCACwEglnALLYEAfPpgHYEGBKn+4bUA3QBLZ5dJr0SQM7m6jRIipFTkq0TYDzzKQA/v4wMMo0+gOc/dkl696htA7O+QubHduqfQ6NQ/c2/xgnhlOqRSKry4Pm00FCx2n9s/U0l6Z4NY7fIbOPvVEQYG7gkZUWhW3POQn468DtIqKj6OOomocda4VpjlOLGlCua8+vy5ZYO7ZITAuRoadvjMYLpo9D5F/sFIIOMNqAK5ogQJ4QDgo3b+fA9Cif3Fk5Wm2jjUKwaxDqDQWxiZJwuJI8alR14RPy+ePldGBIhpHEJPl7r8x6JN+qz/c9E6bRBduaQmLXacFFkYWDmChtxmOxUMNDmfyWS51X4W7HzrGY7k+2+1nLXmhOdp65uXc0XORPc4X2Vy8grQLSoYsCSoz6LmPK0PQ0amWZAlgA',
            'MotoGP': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyek0xMiA1YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIvPjwvc3ZnPg==',
            // Añade más iconos según necesites...
            'default': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTVoLTJ2LTZoMnY2em0wLThoLTJWN2gydjJ6Ii8+PC9zdmc+'
        };

        class DebugConsole {


            constructor() {
                this.console = document.getElementById('debug-console');
                this.connectionStatus = document.getElementById('connection-status');
            }


            log(message, type = 'info') {
                const entry = document.createElement('div');
                entry.className = `log-entry log-${type}`;
                entry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
                this.console.appendChild(entry);
                this.console.scrollTop = this.console.scrollHeight;
            }

            logRawData(title, data) {
                const container = document.createElement('div');
                container.className = 'log-entry';

                const titleEl = document.createElement('div');
                titleEl.className = 'log-data';
                titleEl.textContent = `[${new Date().toLocaleTimeString()}] ${title}:`;

                const dataEl = document.createElement('div');
                dataEl.className = 'raw-data';
                dataEl.textContent = typeof data === 'object' ? JSON.stringify(data, null, 2) : data;

                container.appendChild(titleEl);
                container.appendChild(dataEl);
                this.console.appendChild(container);
                this.console.scrollTop = this.console.scrollHeight;
            }

            updateConnectionStatus(status, message) {
                this.connectionStatus.className = `status-${status}`;
                this.connectionStatus.textContent = message;
            }

            clear() {
                this.console.innerHTML = '';
            }
        }

        class AceStreamViewer {
            constructor() {
                this.PRIMARY_URL = 'https://api.codetabs.com/v1/proxy/?quest=https://www.arena4viewer.co.in/misguia2.php';
                this.BACKUP_URL = 'https://archive.org/download/abcd_20240416/Arena4view.txt';
                // this.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
                this.KEY = '';
                this.EXPIRE = '';
                this.debugConsole = new DebugConsole();
            }

            async checkConnection() {
                try {
                    this.debugConsole.updateConnectionStatus('connecting', 'Verificando conexión...');
                    this.debugConsole.log('Iniciando verificación de conexión...', 'info');

                    const response = await fetch('https://www.google.com', {
                        mode: 'no-cors'
                    });

                    this.debugConsole.updateConnectionStatus('connected', 'Conexión OK');
                    this.debugConsole.log('Conexión a Internet establecida', 'success');
                    return true;
                } catch (error) {
                    this.debugConsole.updateConnectionStatus('error', 'Sin conexión');
                    this.debugConsole.log('Error de conexión: ' + error.message, 'error');
                    return false;
                }
            }

            async obtenerEnlacesBackup() {
                try {
                    this.debugConsole.log('Intentando obtener enlaces desde URL de respaldo...', 'info');
                    const response = await fetch(this.BACKUP_URL);

                    if (!response.ok) {
                        throw new Error(`HTTP error! status: ${response.status}`);
                    }

                    const data = await response.text();
                    this.debugConsole.log('Enlaces de respaldo obtenidos correctamente', 'success');
                    this.debugConsole.logRawData('Enlaces de respaldo', data);

                    return data.split('\n').filter(line => line.trim());
                } catch (error) {
                    this.debugConsole.log('Error al obtener enlaces de respaldo: ' + error.message, 'error');
                    return [];
                }
            }

            async obtenerDatos() {
                try {
                    this.debugConsole.log('Intentando obtener datos del servidor principal...', 'info');

                    const response = await fetch(this.PRIMARY_URL, {
                        method: 'POST',
                        headers: {
                            'User-Agent': this.USER_AGENT,
                            'Connection': 'Keep-Alive',
                            'Content-Type': 'application/x-www-form-urlencoded'
                        },
                        body: new URLSearchParams({
                            key: this.KEY,
                            expire: this.EXPIRE
                        })
                    });

                    this.debugConsole.log(`Respuesta del servidor: ${response.status} ${response.statusText}`, 'info');

                    if (!response.ok) {
                        throw new Error(`HTTP error! status: ${response.status}`);
                    }

                    const data = await response.text();
                    this.debugConsole.log('Datos recibidos correctamente', 'success');
                    this.debugConsole.log('Longitud de la respuesta: ' + data.length + ' caracteres', 'info');
                    this.debugConsole.logRawData('Muestra de datos del servidor principal', data.substring(0, 500));

                    const processedData = await this.procesarDatos(data);

                    // Si no hay enlaces en los datos principales, intentar con el backup
                    if (!processedData.enlaces || processedData.enlaces.length === 0) {
                        this.debugConsole.log('No se encontraron enlaces en datos principales, usando respaldo', 'warning');
                        processedData.enlaces = await this.obtenerEnlacesBackup();
                    }

                    return processedData;
                } catch (error) {
                    this.debugConsole.log('Error al obtener datos principales: ' + error.message, 'error');

                    // En caso de error, intentar obtener al menos los enlaces del backup
                    const enlaces = await this.obtenerEnlacesBackup();
                    return { horarios: [], enlaces };
                }
            }

            procesarDatos(htmlContent) {
                this.debugConsole.log('Iniciando procesamiento de datos...', 'info');

                try {
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(htmlContent, 'text/html');

                    // Procesar horarios
                    const horarios = Array.from(doc.querySelectorAll('tr'))
                        .map(tr => Array.from(tr.querySelectorAll('td.auto-style3'))
                            .map(td => td.textContent.trim())
                            .filter(text => text))
                        .filter(row => row.length);

                    this.debugConsole.log(`Encontrados ${horarios.length} horarios`, 'success');
                    this.debugConsole.logRawData('Horarios procesados', horarios);

                    // Procesar enlaces acestream
                    const streamDiv = doc.querySelector('div.streams');
                    const enlaces = streamDiv ? streamDiv.textContent.split(',') : [];

                    this.debugConsole.log(`Encontrados ${enlaces.length} enlaces en datos principales`, 'success');
                    this.debugConsole.logRawData('Enlaces principales', enlaces);

                    return { horarios, enlaces };
                } catch (error) {
                    this.debugConsole.log('Error al procesar datos: ' + error.message, 'error');
                    return null;
                }
            }

            // Método para traducir categoría y obtener icono
            procesarCategoria(categoria) {
                const categoriaOriginal = categoria.toUpperCase();
                const categoriaTraducida = CATEGORIAS[categoriaOriginal] || categoria;
                const icono = CATEGORY_ICONS[categoriaTraducida] || CATEGORY_ICONS['default'];

                return {
                    nombre: categoriaTraducida,
                    icono: icono
                };
            }

            actualizarTabla(datos) {
                if (!datos || !datos.horarios) {
                    this.debugConsole.log('No hay datos para actualizar la tabla', 'warning');
                    return;
                }

                this.debugConsole.log('Actualizando tabla con nuevos datos...', 'info');

                const tabla = document.getElementById('eventos-tabla');
                const tbody = tabla.querySelector('tbody');
                tbody.innerHTML = '';

                try {
                    const fechaActual = new Date();
                    fechaActual.setHours(0, 0, 0, 0);

                    let eventosAgregados = 0;

                    datos.horarios.forEach((evento, index) => {
                        const fechaEvento = this.parsearFecha(evento[0]);

                        if (fechaEvento >= fechaActual) {
                            const categoria = this.procesarCategoria(evento[2] || 'SPORTS');

                            const tr = document.createElement('tr');
                            tr.innerHTML = `
                    <td>${evento[0] || 'N/A'}</td>
                    <td>${evento[1] || 'N/A'}</td>
                    <td>
                        <img src="${categoria.icono}" class="category-icon" alt="${categoria.nombre}"><span>${categoria.nombre}</span>
                    </td>
                    <td>${evento[3] || 'N/A'}</td>
                    <td>${evento[4] || 'N/A'}</td>
                    <td>${this.generarEnlaces(evento[5], datos.enlaces, 'android')}</td>
                    <td>${this.generarEnlaces(evento[5], datos.enlaces, 'pc')}</td>
                `;
                            tbody.appendChild(tr);
                            eventosAgregados++;
                        }
                    });

                    // Si no hay eventos futuros, mostrar mensaje informativo
                    if (eventosAgregados === 0) {
                        const tr = document.createElement('tr');
                        tr.innerHTML = `
                <td colspan="7" style="text-align: center; padding: 20px;">
                    <div style="color: #ff33a8;">
                        <h3>¡No hay eventos programados! /⁠╲⁠/\⁠\\⁠╭⁠(⁠•⁠‿⁠•⁠)⁠╮⁠/⁠\\⁠╱⁠\\</h3>
                        <p>En este momento no hay eventos futuros disponibles.</p>
                        <p>La página se actualizará automáticamente cada 5 minutos.</p>
                        <p>¡Vuelve más tarde para ver los próximos eventos!</p>
                    </div>
                </td>
            `;
                        tbody.appendChild(tr);
                        this.debugConsole.log('No se encontraron eventos futuros', 'warning');
                    }

                    this.debugConsole.log(`Tabla actualizada. Se encontraron ${eventosAgregados} eventos futuros`, 'success');
                } catch (error) {
                    this.debugConsole.log('Error al actualizar tabla: ' + error.message, 'error');
                    const tr = document.createElement('tr');
                    tr.innerHTML = `
            <td colspan="7" style="text-align: center; padding: 20px;">
                <div style="color: #ff0000;">
                    <h3>¡Ups! Ha ocurrido un error</h3>
                    <p>No se han podido cargar los eventos correctamente.</p>
                    <p>Por favor, intenta recargar la página.</p>
                </div>
            </td>
        `;
                    tbody.appendChild(tr);
                }
            }

            // Añadir este método a la clase AceStreamViewer para parsear la fecha
            parsearFecha(fechaStr) {
                try {
                    // Suponiendo que la fecha viene en formato "DD/MM/YYYY"
                    const [dia, mes, año] = fechaStr.split('/').map(Number);
                    return new Date(año, mes - 1, dia); // mes - 1 porque en JavaScript los meses van de 0 a 11
                } catch (error) {
                    this.debugConsole.log(`Error al parsear fecha: ${fechaStr}`, 'error');
                    return new Date(0); // Fecha inválida
                }
            }


            generarEnlaces(numeros, enlaces, tipo) {
                if (!numeros) return 'Próximamente';
                if (!enlaces || enlaces.length === 0) return 'Sin enlaces disponibles';

                // Depuración inicial
                this.debugConsole.log(`Procesando números originales: ${numeros}`, 'info');

                // Limpiamos el string de cualquier texto adicional (como [SPA])
                const cleanNumeros = numeros.replace(/\s*\[.*?\]\s*/g, '').trim();
                this.debugConsole.log(`Números después de limpieza: ${cleanNumeros}`, 'info');

                // Dividimos por guiones y limpiamos cada número
                const nums = cleanNumeros.split('-').map(num => num.trim());
                this.debugConsole.log(`Array de números a procesar: ${JSON.stringify(nums)}`, 'info');

                return nums.map((num, i) => {
                    this.debugConsole.log(`Buscando enlace para número: ${num}`, 'info');

                    const link = enlaces.find(e => e.includes(`av${num}#`));
                    if (link) {
                        this.debugConsole.log(`Enlace encontrado para ${num}: ${link}`, 'success');
                        const aceLink = link.split('#')[1];
                        if (tipo === 'android') {
                            return `<a href="${aceLink}" title="${aceLink}" target="_blank" class="enlace-android">Enlace Android ${i + 1}</a>`;
                        } else {
                            const pcLink = `http://127.0.0.1:6878/server/api?method=open_in_player&player_id=&content_id=${aceLink.replace('acestream://', '')}`;
                            return `<a href="${pcLink}" title="${pcLink}" target="_blank" class="enlace-pc">Enlace PC ${i + 1}</a>`;
                        }
                    } else {
                        this.debugConsole.log(`No se encontró enlace para número ${num}`, 'warning');
                        return '';
                    }
                }).filter(Boolean).join('<br>') || 'Próximamente';
            }

        }

        function openInNewTab(url) {
            window.open(url, '_blank').focus();
        }

        // Inicialización
        document.addEventListener('DOMContentLoaded', async () => {
            const viewer = new AceStreamViewer();

            // Verificar conexión inicial
            if (await viewer.checkConnection()) {
                // Obtener datos iniciales
                const datos = await viewer.obtenerDatos();
                if (datos) {
                    viewer.actualizarTabla(datos);
                }

                // Actualizar datos cada 5 minutos
                setInterval(async () => {
                    if (await viewer.checkConnection()) {
                        const nuevoDatos = await viewer.obtenerDatos();
                        if (nuevoDatos) {
                            viewer.actualizarTabla(nuevoDatos);
                        }
                    }
                }, 300000);
            }
        });
    </script>
</body>

</html>