





{"id":1896,"date":"2025-09-10T08:57:18","date_gmt":"2025-09-10T08:57:18","guid":{"rendered":"https:\/\/iptv.directory\/?page_id=1896"},"modified":"2025-09-10T08:58:25","modified_gmt":"2025-09-10T08:58:25","slug":"rdx","status":"publish","type":"page","link":"https:\/\/iptv.directory\/index.php\/rdx\/","title":{"rendered":"RDX"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1896\" class=\"elementor elementor-1896\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fc22a97 e-flex e-con-boxed e-con e-parent\" data-id=\"fc22a97\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a60e87 elementor-widget elementor-widget-html\" data-id=\"7a60e87\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>Microworkers Reddit Success Wizard - Redixel.com<\/title>\r\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/papaparse@5.4.1\/papaparse.min.js\" defer><\/script>\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/canvas-confetti@1.9.2\/dist\/confetti.browser.min.js\" defer><\/script>\r\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.1.1\/css\/all.min.css\" integrity=\"sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" \/>\r\n    <style>\r\n        \/* ================================================ *\/\r\n        \/* ==         VARIABLES & STYLES DE BASE         == *\/\r\n        \/* ================================================ *\/\r\n        :root{\r\n            --accent:#ff4500;\r\n            --accent-dark:#e03d00;\r\n            --ok:#28a745;\r\n            --ok-dark:#218838;\r\n            --warn:#ffc107;\r\n            --warn-dark: #d39e00;\r\n            --danger:#dc3545;\r\n            --info:#0d6efd;\r\n            --info-dark:#0b5ed7;\r\n            \/* NOUVEAU: Couleur pour les astuces (Tips) *\/\r\n            --tip: #6f42c1; \r\n            --tip-dark: #59359a;\r\n            --tip-light-bg: #f4f0f9;\r\n\r\n            --bg:#f5f7fa;\r\n            --panel:#ffffff;\r\n            --border:#e9eef3;\r\n            --text:#222;\r\n            --border-radius:12px;\r\n            --transition-speed: 0.2s;\r\n            \r\n            --helper-green: #20c997;\r\n            --helper-green-dark: #19a179;\r\n            --helper-purple: #6f42c1;\r\n            --helper-purple-dark: #59359a;\r\n\r\n            \/* \u00c9chelle typographique *\/\r\n            --font-size-sm: 0.8rem;\r\n            --font-size-base: 1rem;\r\n            --font-size-md: 1.1rem;\r\n            --font-size-lg: 1.5rem;\r\n            --font-size-xl: 2.5rem;\r\n            \r\n            --font-weight-regular: 400;\r\n            --font-weight-medium: 500;\r\n            --font-weight-semibold: 600;\r\n            --font-weight-bold: 800;\r\n        }\r\n\r\n        *{box-sizing:border-box;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Arial,sans-serif;}\r\n        \r\n        body{\r\n            margin:0;\r\n            background:linear-gradient(180deg, #f5f7fa 0%, #e9eef3 100%);\r\n            color:var(--text);\r\n            font-size: var(--font-size-base);\r\n            font-weight: var(--font-weight-regular);\r\n            min-height: 100vh;\r\n            padding-bottom: 60px;\r\n        }\r\n\r\n        a{color:var(--accent);} a:hover{text-decoration:none;}\r\n\r\n        \/* Hi\u00e9rarchie des titres *\/\r\n        .tool-title-main {\r\n            font-size: var(--font-size-xl);\r\n            font-weight: var(--font-weight-bold);\r\n            margin:0;\r\n            background:linear-gradient(90deg,var(--accent),var(--accent-dark));\r\n            -webkit-background-clip:text;\r\n            -webkit-text-fill-color:transparent;\r\n            background-clip:text;\r\n            color:transparent;\r\n        }\r\n        .tool-title-subtitle {\r\n            font-size: var(--font-size-base);\r\n            font-weight: var(--font-weight-medium);\r\n            margin:5px 0 0;\r\n            color:#555;\r\n        }\r\n        h2{\r\n            margin-top:0;\r\n            margin-bottom: 12px;\r\n            font-size: var(--font-size-lg);\r\n            font-weight: var(--font-weight-semibold);\r\n        }\r\n        h3 { \r\n            font-size: var(--font-size-md);\r\n            font-weight: var(--font-weight-semibold);\r\n            color: var(--accent);\r\n            border-bottom: 2px solid var(--border);\r\n            padding-bottom: 8px;\r\n            margin-bottom: 15px;\r\n            margin-top: 25px;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 8px;\r\n        }\r\n\r\n        h3:first-child { margin-top: 0; }\r\n        h3 .fa-solid { color: var(--accent); }\r\n\r\n        .container{max-width:980px;margin:30px auto;background:var(--panel);border:none;border-radius:16px;padding:30px;position:relative; box-shadow: 0 10px 40px rgba(0,0,0,0.08);}\r\n        \r\n        \/* ================================================ *\/\r\n        \/* ==         STYLES DES COMPOSANTS              == *\/\r\n        \/* ================================================ *\/\r\n        \r\n        \/* Barre de statut du compte *\/\r\n        #account-status-bar {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 12px;\r\n            padding: 10px 15px;\r\n            border-radius: var(--border-radius);\r\n            margin-bottom: 20px;\r\n            font-size: 0.8rem;\r\n            font-weight: 500;\r\n            border: 1px solid transparent;\r\n        }\r\n        #account-status-bar.ok {\r\n            background-color: #e6f9eb;\r\n            border-color: #bfe8c9;\r\n            color: var(--ok-dark);\r\n        }\r\n        #account-status-bar.warn {\r\n            background-color: #fffbe6;\r\n            border-color: #ffe58f;\r\n            color: #b26a00;\r\n        }\r\n        #account-status-bar img {\r\n            width: 30px;\r\n            height: 30px;\r\n            border-radius: 50%;\r\n        }\r\n        #account-status-bar strong {\r\n            font-weight: 700;\r\n        }\r\n        #account-status-bar .status-message {\r\n            margin-right: auto; \/* Pousse les stats \u00e0 droite *\/\r\n        }\r\n        #account-status-bar .status-message .fa-solid {\r\n            margin-right: 5px;\r\n        }\r\n        #account-status-bar .stats {\r\n            display: flex;\r\n            gap: 15px;\r\n        }\r\n        #account-status-bar .stats .fa-solid {\r\n            margin-right: 4px;\r\n        }\r\n        #account-status-bar.warn .stats .is-problem {\r\n            font-weight: 700;\r\n            text-decoration: underline;\r\n            text-decoration-color: var(--danger);\r\n            text-decoration-thickness: 2px;\r\n        }\r\n\r\n\r\n        \/* Navigation par \u00e9tapes *\/\r\n        nav.steps{border-bottom: 1px solid var(--border); padding-bottom: 10px; margin-bottom: 25px; display:flex;gap:6px;flex-wrap:wrap;}\r\n        nav.steps button{flex:1 1 140px; border: none; background: transparent; color: #888; border-bottom: 3px solid transparent; border-radius: 6px 6px 0 0; font-weight: 600; padding: 10px 6px 8px 6px; font-size:.8rem; transition: all 0.2s ease;}\r\n        nav.steps button.active{background: var(--bg); color: var(--info); border-bottom: 3px solid var(--info);}\r\n        nav.steps i { margin-right: 6px; }\r\n        .step{display:none;} .step.active{display:block;}\r\n\r\n        \/* Animations de transition *\/\r\n        @keyframes slide-in-right { from { transform: translateX(30px); opacity: 0; } to { transform: translateX(0); opacity: 1; } }\r\n        @keyframes slide-out-left { from { transform: translateX(0); opacity: 1; } to { transform: translateX(-30px); opacity: 0; } }\r\n        .slide-in { animation: slide-in-right 0.3s forwards ease-out; }\r\n        .slide-out { animation: slide-out-left 0.3s forwards ease-out; }\r\n        \r\n        .action-panel { background-color: var(--bg); border: 1px solid var(--border); border-radius: var(--border-radius); padding: 25px; margin-top: 20px; }\r\n        \r\n        \/* Styles des champs de formulaire et validation *\/\r\n        .field{position: relative; margin-bottom:18px;}\r\n        .field label{display:block; font-size: 0.9rem; font-weight: var(--font-weight-semibold); margin-bottom:4px;}\r\n        input[type=text],textarea{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--border-radius);font-size:.85rem;background:#fff; transition: box-shadow 0.2s, border-color 0.2s;}\r\n        input[type=text]:focus,textarea:focus { border-color: var(--info); box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.15); outline: none; }\r\n        textarea{min-height:120px;resize:vertical;}\r\n\r\n        @keyframes shake-horizontal {\r\n            0%, 100% { transform: translateX(0); }\r\n            10%, 30%, 50%, 70% { transform: translateX(-5px); }\r\n            20%, 40%, 60%, 80% { transform: translateX(5px); }\r\n        }\r\n\r\n        .is-invalid {\r\n            border-color: var(--danger) !important;\r\n            animation: shake-horizontal 0.5s ease-in-out;\r\n        }\r\n        \r\n        .is-valid {\r\n            border-color: var(--ok) !important;\r\n            padding-right: 30px;\r\n        }\r\n\r\n        .is-valid::after {\r\n            content: '\u2705';\r\n            position: absolute;\r\n            top: 50%;\r\n            right: 12px;\r\n            transform: translateY(-50%);\r\n            font-size: 0.9rem;\r\n        }\r\n\r\n        \/* Styles des boutons (version am\u00e9lior\u00e9e) *\/\r\n        button { cursor: pointer; transition: all var(--transition-speed) ease-out; }\r\n        button:disabled { cursor: not-allowed; opacity: 0.65; background-color: #cccccc !important; transform: none !important; box-shadow: none !important; border-color: #cccccc !important; background-image: none !important; }\r\n        button.outline:disabled { background: #fff !important; color: #ccc !important; border-color: #ccc !important; }\r\n        .btn { background: var(--accent); color: #fff; border: 1px solid transparent; padding: 12px 24px; border-radius: var(--border-radius); font-weight: var(--font-weight-semibold); font-size: 0.9rem; transition: all var(--transition-speed) ease-out; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.07); }\r\n        .btn i { margin-right: 8px; margin-left: 0; }\r\n        .btn .fa-arrow-right, .btn .fa-triangle-exclamation { margin-left: 8px; margin-right: 0; }\r\n        .btn:hover:not(:disabled) { background: var(--accent-dark); transform: translateY(-1px); box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); }\r\n        .btn:active:not(:disabled) { transform: scale(0.98); box-shadow: 0 2px 4px rgba(0,0,0,0.07); }\r\n        .btn.outline { background: #fff; color: var(--accent); border: 1px solid var(--accent); }\r\n        .btn.outline:hover:not(:disabled) { background: var(--accent); color: #fff; }\r\n        .btn.outline.info { color: var(--info); border-color: var(--info); }\r\n        .btn.outline.info:hover:not(:disabled) { background: var(--info); color: #fff; }\r\n        .btn.subtle { background-color: #f8f9fa; color: #495057; border: 1px solid #dee2e6; font-weight: 500; }\r\n        .btn.subtle:hover:not(:disabled) { background-color: #e9ecef; border-color: #ced4da; color: #212529; transform: translateY(-1px); }\r\n        .btn.sm { padding: 6px 12px; font-size: .75rem; font-weight: 500; border-radius: 8px; }\r\n        .btn-alt { background-color: #fffbe6; color: #b26a00; border: 1px solid #ffe58f; font-weight: 600; }\r\n        .btn-alt:hover { background-color: #fff2cc; border-color: #ffd590; color: #b26a00; }\r\n\r\n        \/* Squelettes de chargement *\/\r\n        @keyframes pulse-skeleton { 0% { background-color: #eee; } 50% { background-color: #e0e0e0; } 100% { background-color: #eee; } }\r\n        .skeleton { background-color: #eee; animation: pulse-skeleton 1.5s infinite ease-in-out; color: transparent !important; }\r\n        .skeleton .profile-avatar { background-color: #e0e0e0; }\r\n        .skeleton h4, .skeleton p { background-color: #e0e0e0; border-radius: 4px; color: transparent; user-select: none; }\r\n        .comment-history-item.skeleton { display: flex; flex-direction: column; gap: 8px; background-color: transparent; animation: none; }\r\n        .comment-history-item.skeleton .line { height: 12px; border-radius: 4px; background-color: #eee; animation: pulse-skeleton 1.5s infinite ease-in-out; }\r\n        .comment-history-item.skeleton .line.short { width: 60%; }\r\n\r\n        \/* MODIFI\u00c9: Logique des couleurs pour les bo\u00eetes d'information *\/\r\n        .msg{margin-top:6px;font-size:var(--font-size-sm); padding: 10px; border-radius: var(--border-radius);}\r\n        .msg .ok{color:var(--ok);font-weight:600; background-color: #e6f9eb; border: 1px solid #bfe8c9; display: block; }\r\n        .msg .err{color:var(--danger);font-weight:600; background-color: #ffe6e6; border: 1px solid #ffb3b3; display: block;}\r\n        .note, #quality-box, .result-card-details, .badge{font-size: var(--font-size-sm);}\r\n        #card-list .post{border:1px solid var(--border);padding:12px;border-radius:var(--border-radius);margin-bottom:10px;font-size:.75rem;background:#fff;display:flex;justify-content:space-between;gap:10px;align-items:center;position:relative; transition: transform 0.2s, box-shadow 0.2s, background-color 0.2s; box-shadow: 0 2px 8px rgba(0,0,0,0.06);}\r\n        #card-list .post:hover { transform: translateY(-4px); box-shadow: 0 8px 20px rgba(0,0,0,0.07); }\r\n        .actions-bottom{margin-top:25px;display:flex;gap:12px;flex-wrap:wrap;justify-content:flex-end;align-items:center;}\r\n        .instruction-box { background-color: #eef7ff; border: 1px solid #b3d9ff; border-left: 5px solid var(--info); border-radius: var(--border-radius); padding: 15px; margin-bottom: 20px; font-size: 0.9rem; line-height: 1.5; }\r\n        .instruction-box h4 { margin: 0 0 10px 0; font-size: 0.9rem; color: #005a7d; }\r\n        .instruction-box.with-action { display: flex; justify-content: space-between; align-items: center; }\r\n        .instruction-box.with-action p { margin: 0; }\r\n        #task-checklist-box { background-color: var(--panel); border-radius: var(--border-radius); padding: 20px 25px; max-width: 980px; margin: 30px auto 20px auto; border-top: 4px solid var(--accent); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.08); }\r\n        footer { text-align: center; padding: 20px; font-size: 0.8rem; color: #888; margin-top: 30px; }\r\n        .faq-float, .contact-float { width: 50px; height: 50px; border-radius: 50%; text-align: center; font-size: 24px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all var(--transition-speed) ease-in-out; }\r\n        .faq-float { position: fixed; bottom: 25px; right: 25px; background-color: var(--info); color: #FFF; z-index: 100; }\r\n        .contact-float { position: fixed; bottom: 90px; right: 25px; background-color: #0088cc; color: #FFF; z-index: 100; }\r\n        .faq-float:hover, .contact-float:hover { transform: scale(1.1) translateY(-2px); box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2); }\r\n        .tool-title-container{text-align:center;padding:10px 0 20px 0;}\r\n        #progress-wrapper{display: flex; gap: 4px; width: 100%; height: 8px; margin-bottom: 20px;}\r\n        .progress-segment { flex: 1; background-color: #eee; border-radius: 4px; transition: background-color 0.4s ease-out; transform: scaleX(0); transform-origin: left; animation: fill-in 0.4s forwards; }\r\n        .progress-segment.filled { background: linear-gradient(90deg,var(--info),var(--accent)); }\r\n        @keyframes fill-in { from { transform: scaleX(0); } to { transform: scaleX(1); } }\r\n        .example{padding:8px 10px;border:1px solid #d4e9ff;background:#fff;margin-bottom:8px;border-radius:6px;cursor:pointer;font-size:.75rem;line-height:1.3;}\r\n        .example:hover{background:#f0f7ff;}\r\n        .note{font-size:.7rem;color:#666;margin-top:4px;}\r\n        #validated-comment-display blockquote, #task-recap blockquote { background: #fff; border-left: 4px solid var(--ok); padding: 15px; margin: 10px 0; font-style: italic; font-size: 0.85rem; }\r\n        .post-list-wrapper { background-color: #fff; border: 1px solid var(--border); border-radius: var(--border-radius); padding: 15px; margin-top: 0; max-height: 350px; overflow-y: auto; }\r\n        #card-list .post:nth-child(even) { background-color: #fdfdfd; }\r\n        #card-list .post.selected{border-color:var(--ok);box-shadow:0 0 0 2px #b1e8c4; background-color: #f0fff4;}\r\n        .post-actions {display: flex;flex-direction: column;gap: 6px;flex-shrink: 0;width: 85px;}\r\n        .post-actions button {margin: 0;width: 100%;box-sizing: border-box; border-radius: 8px;}\r\n        .status-ok{color:var(--ok);font-weight:600;}\r\n        .status-bad{color:var(--danger);font-weight:600;}\r\n        .suggestions{background:#fff6e0;border:1px solid #ffd590;padding:10px;border-radius:var(--border-radius);margin-top:16px;font-size:.75rem;}\r\n        .badge.parfait{background:var(--ok);color:#fff;}\r\n        .badge.correct{background:var(--info);color:#fff;}\r\n        .badge.acorriger{background:var(--warn);color:#333;}\r\n        .badge.rejet{background:var(--danger);color:#fff;}\r\n        #quality-box .warn{color:#b26a00;font-weight:600;}\r\n        #quality-box .ok{color:var(--ok);font-weight:600;}\r\n        #score-canvas{width:150px;height:150px;}\r\n        .scorewrap{display:flex;align-items:center;gap:25px;margin-top:12px;flex-wrap:wrap;}\r\n        #idle-warning{position:fixed;bottom:12px;right:12px;background:#fffbe6;border:1px solid #ffe58f;padding:10px 14px;border-radius:8px;font-size:.65rem;display:none;box-shadow:0 2px 6px rgba(0,0,0,.15);z-index:99;}\r\n        .hidden{display:none !important;}\r\n        #final-page{max-width:680px;margin:40px auto;text-align:center;}\r\n        #final-page h1{font-size:2rem;margin-bottom:10px;}\r\n        .final-pass{color:var(--ok);} .final-fail{color:var(--danger);}\r\n        .ok-hint{background:#e6f9eb;border:1px solid #bfe8c9;padding:10px 14px;border-radius:var(--border-radius);margin-top:12px;font-size:.7rem;font-weight:500;}\r\n        .instruction-box p, .instruction-box ol, .instruction-box ul { margin: 0; padding-left: 18px; }\r\n        .instruction-box p { padding-left: 0; }\r\n        .instruction-box b { color: #005a7d; }\r\n        .instruction-box.warn { background-color: #fffbe6; border-color: #ffe58f; border-left-color: var(--warn); }\r\n        .instruction-box.warn h4, .instruction-box.warn b { color: #b26a00; }\r\n        .instruction-box.tip { background-color: var(--tip-light-bg); border-color: #dcd1ec; border-left-color: var(--tip); }\r\n        .instruction-box.tip h4, .instruction-box.tip b { color: var(--tip-dark); }\r\n        .scrollable-box { max-height: 250px; overflow-y: auto; }\r\n        #comment-checklist { list-style-type: none; padding: 0; font-size: 0.8rem; margin-top: 8px; }\r\n        #comment-checklist li { margin-bottom: 4px; transition: color 0.3s; }\r\n        #comment-checklist li.ok { color: var(--ok); font-weight: 600; }\r\n        #comment-checklist li.ok::before { content: '\u2705 '; }\r\n        #comment-checklist li.not-ok::before { content: '\u274c '; }\r\n        @keyframes pop-in { 0% { transform: scale(0.8); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }\r\n        @keyframes slide-in-down { from { opacity: 0; transform: translateY(-15px); } to { opacity: 1; transform: translateY(0); } }\r\n        #comment-checklist li.pop-in { animation: pop-in 0.3s forwards; }\r\n        #find-comment-helper { margin-top: 15px; padding: 10px; background: #eef7ff; border-radius: var(--border-radius); border: 1px solid #b3d9ff; }\r\n        #result-box { position: relative; }\r\n        #watermark {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%) rotate(-30deg);font-size: 3vw;font-weight: 800;color: rgba(0, 0, 0, 0.07);pointer-events: none;white-space: nowrap;z-index: 10;}\r\n        .modal-container {display: none; position: fixed;z-index: 1000;left: 0;top: 0;width: 100%;height: 100%;overflow: auto;background-color: rgba(0,0,0,0.5); animation: fade .25s ease-in;}\r\n        .modal-content {background-color: #fefefe;margin: 10% auto;padding: 25px;border: 1px solid #888;width: 80%;max-width: 600px;border-radius: var(--border-radius);position: relative;}\r\n        .modal-close {color: #aaa;position: absolute;top: 10px;right: 20px;font-size: 28px;font-weight: bold;}\r\n        .modal-close:hover,.modal-close:focus {color: black;text-decoration: none;cursor: pointer;}\r\n        \r\n        .profile-card { display: flex; align-items: center; gap: 15px; padding: 12px; border-radius: var(--border-radius); margin-top: 10px; }\r\n        .profile-card.skeleton { min-height: 76px; }\r\n        .profile-card.ok { background: #e6f9eb; border: 1px solid #bfe8c9; }\r\n        .profile-card.bad { background: #ffe6e6; border: 1px solid #ffb3b3; }\r\n        .profile-card.warn { background: #fffbe6; border: 1px solid #ffe58f; }\r\n        .profile-avatar { width: 50px; height: 50px; border-radius: 50%; }\r\n        .profile-info h4 { margin: 0 0 4px 0; font-size: 1rem; }\r\n        .profile-info p { margin: 0; font-size: 0.8rem; }\r\n        .result-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; }\r\n        .result-card { background-color: #f8f9fa; border: 1px solid var(--border); border-radius: var(--border-radius); padding: 15px; }\r\n        .result-card-header { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }\r\n        .result-card-header h4 { margin: 0; font-size: 0.9rem; }\r\n        .result-card-icon { font-size: 1.2rem; }\r\n        .result-card-details a {font-weight: 600;}\r\n        .tooltip-icon { cursor: help; color: #aaa; margin-left: auto; font-weight: bold; border: 1px solid #ccc; border-radius: 50%; width: 18px; height: 18px; display: inline-flex; justify-content: center; align-items: center; font-size: 0.7rem; }\r\n        #comment-history-list { max-height: 250px; overflow-y: auto; border: 1px solid var(--border); border-radius: var(--border-radius); padding: 8px; }\r\n        .comment-history-item { padding: 10px; border-radius: 8px; cursor: pointer; border: 2px solid transparent; transition: background-color 0.2s, border-color 0.2s; }\r\n        .comment-history-item:hover { background-color: #f5f7fa; }\r\n        .comment-history-item p { margin: 0; font-size: 0.8rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\r\n        .comment-history-item small { font-size: 0.7rem; color: #6c757d; }\r\n        #manual-verify-toggle { margin-top: 15px; width: 100%; }\r\n        #comment-found-box { border: 1px solid var(--border); padding: 12px; border-radius: var(--border-radius); background: #f8f9fa; font-size: 0.8rem; margin-top: 10px; }\r\n        #comment-found-box blockquote { margin: 8px 0; padding: 8px; background: #fff; border-left: 3px solid var(--info); }\r\n        #confirm-zone { display:flex; gap: 12px; }\r\n        @keyframes pulse-border { 0% { box-shadow: 0 0 0 0 rgba(255, 69, 0, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(255, 69, 0, 0); } 100% { box-shadow: 0 0 0 0 rgba(255, 69, 0, 0); } }\r\n        .pulse-select-button { animation: pulse-border 2s infinite; }\r\n        #task-checklist { list-style: none; padding: 0; margin: 10px 0 0 0; }\r\n        #task-checklist li { display: flex; align-items: center; padding: 8px 0; font-size: 0.9rem; transition: all 0.3s ease; border-top: 1px solid var(--border); }\r\n        #task-checklist li:first-child { border-top: none; }\r\n        #task-checklist li span { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--border); margin-right: 12px; transition: all 0.3s ease; }\r\n        #task-checklist li.active { font-weight: 700; color: var(--info); }\r\n        #task-checklist li.active span { border-color: var(--info); }\r\n        #task-checklist li.active span::before { content: '\u25b6'; color: var(--info); font-size: 10px; animation: pop-in 0.3s; }\r\n        #task-checklist li.completed { color: #888; text-decoration: line-through; opacity: 0.7; }\r\n        #task-checklist li.completed span { background-color: var(--ok); border-color: var(--ok); }\r\n        #task-checklist li.completed span::before { content: '\u2714'; color: white; font-size: 12px; animation: pop-in 0.3s; }\r\n        .diff-box{background:#f8f9fa;padding:10px;border-radius:4px;font-family:monospace;white-space:pre-wrap;word-break:break-all;}\r\n        .diff-box del{color:#dc3545;background:#f8d7da;text-decoration:none;}\r\n        .diff-box ins{color:#28a745;background:#d4edda;text-decoration:none;}\r\n\r\n        .btn-toggle {\r\n            border-radius: 50px;\r\n            font-weight: 600;\r\n            padding: 10px 20px;\r\n            width: 100%;\r\n            max-width: 250px;\r\n            text-align: left;\r\n            display: inline-flex;\r\n            align-items: center;\r\n            box-shadow: 0 2px 4px rgba(0,0,0, 0.1);\r\n        }\r\n        #tips-toggle-btn { \r\n            background-color: var(--helper-green);\r\n            border-color: var(--helper-green);\r\n            color: #fff;\r\n        }\r\n        #tips-toggle-btn:hover:not(:disabled) {\r\n            background-color: var(--helper-green-dark);\r\n            border-color: var(--helper-green-dark);\r\n        }\r\n        #examples-toggle-btn { \r\n            background-color: var(--helper-purple);\r\n            border-color: var(--helper-purple);\r\n            color: #fff;\r\n        }\r\n        #examples-toggle-btn:hover:not(:disabled) {\r\n            background-color: var(--helper-purple-dark);\r\n            border-color: var(--helper-purple-dark);\r\n        }\r\n        .btn-toggle:hover:not(:disabled) {\r\n            transform: translateY(-1px);\r\n            box-shadow: 0 4px 10px rgba(0,0,0, 0.15);\r\n        }\r\n        .btn-toggle.outline {\r\n            background-color: #eef7ff;\r\n            font-weight: 500;\r\n            box-shadow: none;\r\n        }\r\n        #tips-toggle-btn.outline { color: var(--helper-green-dark); border-color: #d3f3e9; background-color: #e9f9f4; }\r\n        #examples-toggle-btn.outline { color: var(--helper-purple-dark); border-color: #e2d9f2; background-color: #f3eff8; }\r\n\r\n        .btn-toggle.outline:hover:not(:disabled) {\r\n             transform: translateY(-1px);\r\n             box-shadow: 0 4px 8px rgba(0,0,0,0.05);\r\n        }\r\n        .btn-toggle::after {\r\n            font-family: \"Font Awesome 6 Free\";\r\n            font-weight: 900;\r\n            margin-left: auto;\r\n            padding-left: 10px;\r\n            transition: transform 0.2s ease-in-out;\r\n        }\r\n        .btn-toggle:not(.outline)::after { content: '\\f077'; } \/* up arrow *\/\r\n        .btn-toggle.outline::after { content: '\\f078'; } \/* down arrow *\/\r\n        \r\n        .error-explanation-box {\r\n            border: 1px solid #ffb3b3;\r\n            border-left: 5px solid var(--danger);\r\n            background-color: #ffe6e6;\r\n            padding: 15px;\r\n            margin-top: 15px;\r\n            border-radius: var(--border-radius);\r\n            font-size: 0.85rem;\r\n            color: #333;\r\n            text-align: left;\r\n        }\r\n        .error-explanation-box h4 {\r\n            margin: 0 0 10px 0;\r\n            font-size: 0.9rem;\r\n            color: var(--danger);\r\n            border-bottom: none;\r\n            padding-bottom: 0;\r\n        }\r\n        .error-explanation-box ol { padding-left: 20px; margin: 0; }\r\n        .error-explanation-box li { margin-bottom: 8px; }\r\n        .error-explanation-box li:last-child { margin-bottom: 0; }\r\n        \r\n        #validate-comment-btn {\r\n            width: 100%;\r\n            padding: 14px 24px;\r\n            font-size: 1rem;\r\n            font-weight: var(--font-weight-semibold);\r\n            color: #fff;\r\n            background-color: var(--ok);\r\n            border: none;\r\n            border-radius: var(--border-radius);\r\n            margin-top: 15px;\r\n            margin-bottom: 0;\r\n            box-shadow: 0 4px 15px rgba(40, 167, 69, 0.25);\r\n            transition: all 0.2s ease-out;\r\n        }\r\n        #validate-comment-btn:hover:not(:disabled) {\r\n            transform: translateY(-2px);\r\n            box-shadow: 0 6px 20px rgba(40, 167, 69, 0.35);\r\n            background-color: var(--ok-dark);\r\n        }\r\n        #validate-comment-btn:active:not(:disabled) {\r\n            transform: scale(0.98);\r\n            box-shadow: 0 2px 10px rgba(40, 167, 69, 0.2);\r\n        }\r\n\r\n        @media(max-width:700px){.container{padding:22px;} nav.steps button{flex:1 1 46%;font-size:.7rem;} #score-canvas{width:130px;height:130px;} #account-status-bar{flex-wrap: wrap;}}\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n<a href=\"https:\/\/t.me\/XCmarketing\" target=\"_blank\" class=\"contact-float\" title=\"Contact us on Telegram\">\r\n    <i class=\"fa-brands fa-telegram\"><\/i>\r\n<\/a>\r\n<button id=\"faq-button\" class=\"faq-float\" aria-label=\"Open FAQ\">?<\/button>\r\n<div id=\"faq-modal\" class=\"modal-container\">\r\n    <div class=\"modal-content\">\r\n        <span id=\"faq-close\" class=\"modal-close\" aria-label=\"Close\">&times;<\/span>\r\n        <h2>Frequently Asked Questions (FAQ) \ud83e\udd14<\/h2>\r\n        <details>\r\n            <summary>What are the most common mistakes?<\/summary>\r\n            <div>\r\n                <p>To ensure success, avoid these errors:<\/p>\r\n                <ul>\r\n                    <li><strong>Copying an example word-for-word:<\/strong> Always personalize the examples.<\/li>\r\n                    <li><strong>Copying the post link instead of the comment link:<\/strong> Make sure to use the \"Share\" -> \"Copy Link\" option on YOUR comment.<\/li>\r\n                    <li><strong>Not waiting long enough:<\/strong> Sometimes, a comment takes 1-2 minutes to become public.<\/li>\r\n                <\/ul>\r\n            <\/div>\r\n        <\/details>\r\n        <details>\r\n            <summary>My account has a warning in Step 1, why?<\/summary>\r\n            <div>\r\n                <p>To maximize your chances of success, your Reddit account should be at least <strong>7 days old<\/strong> AND have more than <strong>50 karma<\/strong>. If you don't meet these conditions, Reddit is very likely to make your comment invisible. The tool allows you to continue, but success is not guaranteed.<\/p>\r\n            <\/div>\r\n        <\/details>\r\n        <details>\r\n            <summary>The tool can't find my comment during verification.<\/summary>\r\n            <div>\r\n                <p>Possible reasons:<\/p>\r\n                <ul>\r\n                    <li><strong>Wait a minute:<\/strong> It can take 30-60 seconds for a comment to be public on Reddit. Click the \"Reload\" button to try again.<\/li>\r\n                    <li><strong>Check the URL:<\/strong> Ensure you copied the direct link to the comment (\"Share\" -> \"Copy Link\") and not the URL of the post itself.<\/li>\r\n                    <li><strong>Your account might be too new:<\/strong> If you proceeded despite the warning in Step 1, it's highly likely that Reddit has hidden your comment.<\/li>\r\n                <\/ul>\r\n            <\/div>\r\n        <\/details>\r\n        <details>\r\n            <summary>Can I do this task multiple times?<\/summary>\r\n            <div>\r\n                <p>Please refer to the task instructions on the Microworkers platform. The rules for participation (once only, once per day, etc.) are specified there.<\/p>\r\n            <\/div>\r\n        <\/details>\r\n    <\/div>\r\n<\/div>\r\n\r\n<div class=\"tool-title-container\">\r\n    <h1 class=\"tool-title-main\">Reddit Success Wizard \ud83e\ude84<\/h1>\r\n    <p class=\"tool-title-subtitle\">Your assistant for a flawless submission<\/p>\r\n<\/div>\r\n\r\n<div id=\"task-checklist-box\">\r\n    <h3><i class=\"fa-solid fa-list-check\"><\/i> Your Mission<\/h3>\r\n    <ol id=\"task-checklist\">\r\n        <li id=\"checklist-item-0\"><span><\/span>Loading & Setup<\/li>\r\n        <li id=\"checklist-item-1\"><span><\/span>Verify Accounts & MW ID<\/li>\r\n        <li id=\"checklist-item-2\"><span><\/span>Write & Post Comment<\/li>\r\n        <li id=\"checklist-item-3\"><span><\/span>Verify Your Comment<\/li>\r\n        <li id=\"checklist-item-4\"><span><\/span>Review Final Result<\/li>\r\n    <\/ol>\r\n<\/div>\r\n\r\n<div id=\"idle-warning\">Inactivity detected... session will reset in 1 minute.<\/div>\r\n<div class=\"container\" id=\"wizard\" data-current-step=\"0\">\r\n    \r\n    <div id=\"account-status-bar\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"account_status_bar\" class=\"hidden\"><\/div>\r\n    \r\n    <div id=\"progress-wrapper\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"progress_bar\">\r\n        <div class=\"progress-segment\"><\/div>\r\n        <div class=\"progress-segment\"><\/div>\r\n        <div class=\"progress-segment\"><\/div>\r\n        <div class=\"progress-segment\"><\/div>\r\n        <div class=\"progress-segment\"><\/div>\r\n    <\/div>\r\n    <nav class=\"steps\" aria-label=\"steps\">\r\n        <button id=\"nav0\" data-xcw-event=\"goto_0\" class=\"active\" onclick=\"goto(0)\"><i class=\"fa-solid fa-spinner fa-fw fa-spin\"><\/i> Loading<\/button>\r\n        <button id=\"nav1\" data-xcw-event=\"goto_1\" onclick=\"goto(1)\"><i class=\"fa-solid fa-user-shield fa-fw\"><\/i> 1. Accounts<\/button>\r\n        <button id=\"nav2\" data-xcw-event=\"goto_2\" onclick=\"goto(2)\"><i class=\"fa-solid fa-pen-to-square fa-fw\"><\/i> 2. Task & Verification<\/button>\r\n        <button id=\"nav4\" data-xcw-event=\"goto_4\" onclick=\"goto(4)\"><i class=\"fa-solid fa-flag-checkered fa-fw\"><\/i> 3. Result<\/button>\r\n    <\/nav>\r\n\r\n    <div class=\"step active\" id=\"step0\" data-status=\"initializing\">\r\n        <h2><i class=\"fa-solid fa-cogs\"><\/i> Initializing & Setup<\/h2>\r\n        <div class=\"action-panel\">\r\n            <div class=\"progress-bar-container\" style=\"width: 100%; background: #e9eef3; border-radius: 4px; overflow: hidden; margin-bottom: 20px;\">\r\n                <div id=\"loading-progress\" style=\"height: 12px; width: 0%; background: linear-gradient(90deg, var(--info), var(--accent)); transition: width 0.5s ease-in-out;\"><\/div>\r\n            <\/div>\r\n            <ul id=\"loading-tasks\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"loading_tasks\" style=\"list-style-type: none; padding: 0;\"><\/ul>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"step\" id=\"step1\" data-account-status=\"pending\">\r\n        <h2><i class=\"fa-solid fa-user-shield\"><\/i> Step 1 \u2013 Account Validation<\/h2>\r\n        <div class=\"instruction-box\">\r\n            <h4><i class=\"fa-solid fa-circle-info\"><\/i> Prerequisites<\/h4>\r\n            <ul style=\"padding-left: 20px; margin: 0;\">\r\n                <li>A valid Reddit account (7+ days, 50+ karma recommended)<\/li>\r\n                <li>Your Microworkers Username<\/li>\r\n                <li>5 minutes of your time<\/li>\r\n            <\/ul>\r\n        <\/div>\r\n        <div class=\"action-panel\">\r\n            <div class=\"field\">\r\n                <label for=\"reddit-username\">Reddit Username or Profile URL<\/label>\r\n                <input type=\"text\" id=\"reddit-username\" data-xcw-field=\"reddit_username\" placeholder=\"reddit.com\/user\/YourUsername\" oninput=\"onUsernameInput()\">\r\n                <div id=\"msg1\" class=\"msg\"><\/div>\r\n            <\/div>\r\n            <div id=\"mw-id-field\" class=\"field hidden\">\r\n                 <hr style=\"margin:20px 0;\">\r\n                <label for=\"mw-username\">Microworkers Username<\/label>\r\n                <p class=\"note\">To find your username, go to <a href=\"https:\/\/www.microworkers.com\/account.php\" target=\"_blank\">your Microworkers account<\/a> and look for \"Your Username is...\"<\/p>\r\n                <input type=\"text\" id=\"mw-username\" data-xcw-field=\"mw_username\" placeholder=\"e.g., YourMicroworkerUsername\">\r\n                <div id=\"msg2\" class=\"msg\"><\/div>\r\n            <\/div>\r\n             <button id=\"next-step1-btn\" class=\"btn\" data-xcw-event=\"verify_account\" onclick=\"checkAccount()\"><i class=\"fa-solid fa-user-check\"><\/i>Verify Account<\/button>\r\n        <\/div>\r\n        <div class=\"actions-bottom\">\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"step\" id=\"step2\" data-comment-status=\"editing\">\r\n        <div id=\"task-phase\">\r\n            <h2><i class=\"fa-solid fa-pen-to-square\"><\/i> Step 2 \u2013 Write Comment & Choose Post<\/h2>\r\n            <div id=\"mission-box-step2\" class=\"instruction-box\">\r\n                <h4><i class=\"fa-solid fa-bullseye\"><\/i> Your Mission for this Step<\/h4>\r\n                <p style=\"margin: 5px 0 0 0;\">\r\n                    Your goal is to write a positive and authentic comment about the <strong>Redixel.com<\/strong> IPTV service.\r\n                    You will then post this comment on a Reddit thread that you will choose from a list.\r\n                <\/p>\r\n            <\/div>\r\n            \r\n            <div id=\"step2-part1\">\r\n                <h3><i class=\"fa-solid fa-pencil\"><\/i> 2.1: Write Your Comment<\/h3>\r\n                <div class=\"action-panel\">\r\n                    <div class=\"field\">\r\n                        <label for=\"comment\">Your Comment *<\/label>\r\n                        <textarea id=\"comment\" data-xcw-field=\"comment_text\" oninput=\"checkCommentRealtime();runQualityLive()\" placeholder=\"Be personal and authentic! Talk about a real experience...\"><\/textarea>\r\n                        <ul id=\"comment-checklist\">\r\n                            <li id=\"check-length\" class=\"not-ok\">At least 80 characters<\/li>\r\n                            <li id=\"check-keyword\" class=\"not-ok\">Contains the word \"Redixel.com\"<\/li>\r\n                        <\/ul>\r\n                        <div id=\"msg3\" class=\"msg\"><\/div>\r\n                        <div id=\"quality-box\"><\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"helper-section\">\r\n                        <div class=\"helper-buttons\" style=\"display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 15px;\">\r\n                            <button id=\"tips-toggle-btn\" class=\"btn btn-toggle outline\" onclick=\"toggleHelper('tips', this)\">\r\n                                <i class=\"fa-solid fa-lightbulb\"><\/i> Show Tips\r\n                            <\/button>\r\n                            <button id=\"examples-toggle-btn\" class=\"btn btn-toggle outline\" onclick=\"toggleHelper('examples', this)\">\r\n                                <i class=\"fa-solid fa-file-lines\"><\/i> Show Examples\r\n                            <\/button>\r\n                        <\/div>\r\n                        \r\n                        <div id=\"tips\" class=\"instruction-box tip hidden\">\r\n                            <h4><i class=\"fa-solid fa-lightbulb\"><\/i> Pro-Tips for a Great Comment<\/h4>\r\n                            <ul style=\"margin:8px 0 0 18px;padding:0;font-size:.8rem;line-height:1.5;\">\r\n                                <li><b>Be personal:<\/b> Mention a real experience. Talk about the \"last football game without any buffering\" or \"that series you could finally watch in 4K.\"<\/li>\r\n                                <li><b>Highlight a strong point:<\/b> Besides the free trial, mention the True 4K channels, worldwide content, or VPN protection.<\/li>\r\n                                <li><b>Ask a question:<\/b> Ending with \"Has anyone else tried it?\" can encourage interaction and make the comment feel more natural.<\/li>\r\n                                <li><b>Avoid marketing language:<\/b> Phrases like \"This is an incredible offer!\" can seem suspicious. Prefer an authentic, conversational tone.<\/li>\r\n                            <\/ul>\r\n                        <\/div>\r\n                        \r\n                        <div id=\"examples\" class=\"instruction-box scrollable-box hidden\">\r\n                            <h4>Click an example to copy and customize it:<\/h4>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">Hey everyone, just found Redixel.com and it's a game-changer! They offer a 24h free trial with no strings attached. Go for it!<\/div>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">I've been using Redixel.com for a while, and honestly, it's the best IPTV service I've tried. You can test it for free for 24h, no credit card required!<\/div>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">If you're tired of buffering and low-quality streams, check out Redixel.com. They're offering a 24h free trial right now. Nothing to lose, everything to gain!<\/div>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">Just started my free trial with Redixel.com and I'm blown away by the True 4K channels and huge content library. Everything works perfectly. I highly recommend giving it a try!<\/div>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">I was skeptical about another IPTV service, but Redixel.com has proven to be very stable. No freezing during the big game last night, which is a huge win. The 24h free trial convinced me.<\/div>\r\n                            <div class=\"example\" onclick=\"copyExample(this)\">A big thank you to Redixel.com for making the setup process so simple. I was up and running in minutes on multiple devices. Their VPN protection is also excellent. Check them out!<\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <button id=\"validate-comment-btn\" data-xcw-event=\"validate_comment\" class=\"btn\" onclick=\"validateCommentAndUnlockPosts()\"><i class=\"fa-solid fa-check\"><\/i> Validate Comment<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div id=\"validated-comment-display\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"validated_comment\" class=\"hidden\">\r\n                <h3><i class=\"fa-solid fa-check-double\"><\/i> 2.1: Your Comment (Validated)<\/h3>\r\n                <div class=\"action-panel\">\r\n                    <blockquote><\/blockquote>\r\n                    <button class=\"btn outline info sm\" onclick=\"editComment()\"><i class=\"fa-solid fa-pencil\"><\/i> Edit<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div id=\"step2-part2\" class=\"hidden\">\r\n                <h3><i class=\"fa-solid fa-signs-post\"><\/i> 2.2: Post and Select<\/h3>\r\n                <div class=\"instruction-box\">\r\n                    <h4>How to proceed:<\/h4>\r\n                    <ol>\r\n                        <li><b>Open a Post:<\/b> Click an \"Open\" button below to view a Reddit post in a new tab.<\/li>\r\n                        <li><b>Paste Your Comment:<\/b> Paste your validated comment as a reply on that post.<\/li>\r\n                        <li><b>Return & Select:<\/b> Come back to this page and click the \"Select\" button for the post you commented on.<\/li>\r\n                        <li><b>Confirm Publication:<\/b> Click the \"I have posted\" button that will become active at the bottom.<\/li>\r\n                    <\/ol>\r\n                <\/div>\r\n                <div class=\"post-list-wrapper\" style=\"margin-top: 15px;\">\r\n                    <div id=\"card-list\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"post_list\">Loading\u2026<\/div>\r\n                <\/div>\r\n                <div id=\"msg4\" class=\"msg\" style=\"margin-top: 15px;\"><\/div>\r\n            <\/div>\r\n\r\n            <div class=\"actions-bottom\">\r\n                <button class=\"btn subtle\" onclick=\"prev()\"><i class=\"fa-solid fa-arrow-left\"><\/i> Back to Step 1<\/button>\r\n                <button id=\"confirm-publication-btn\" data-xcw-event=\"confirm_publication\" class=\"btn hidden\" onclick=\"initiateVerificationPhase()\" disabled><i class=\"fa-solid fa-upload\"><\/i> I have posted<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div id=\"verification-sub-step\" class=\"hidden\" data-verification-status=\"pending\">\r\n            <h2><i class=\"fa-solid fa-link\"><\/i> Step 3 \u2013 Verify Your Reddit Comment<\/h2>\r\n            \r\n            <div id=\"task-recap\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"task_recap\" class=\"instruction-box\"><\/div>\r\n\r\n            <div id=\"auto-verify-zone\">\r\n                 <div class=\"instruction-box with-action\">\r\n                    <p id=\"auto-verify-status\"><\/p>\r\n                    <button class=\"btn outline info sm hidden\" id=\"reload-btn\" data-xcw-event=\"reload_comments\" onclick=\"reloadComment()\"><i class=\"fa-solid fa-rotate-right\"><\/i> Reload<\/button>\r\n                <\/div>\r\n                <div class=\"action-panel\">\r\n                    <div id=\"comment-history-list\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"comment_history_list\"><\/div>\r\n                    <button id=\"manual-verify-toggle\" data-xcw-event=\"toggle_manual_verify\" class=\"btn btn-alt\" onclick=\"showManualVerification('Switching to manual entry.')\"><i class=\"fa-solid fa-keyboard\"><\/i> Can't find the comment? Manual Entry<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            <div id=\"manual-verify-zone\" class=\"hidden\">\r\n                <div class=\"instruction-box\">\r\n                    <p>Paste the <b>direct URL<\/b> of your comment (<code>\u2026\/comment\/&lt;id&gt;\/<\/code>)<\/p>\r\n                <\/div>\r\n                <div class=\"action-panel\">\r\n                    <div id=\"find-comment-helper\"><\/div>\r\n                    <div class=\"field\" style=\"max-width:470px; margin-top: 15px;\">\r\n                        <input type=\"text\" id=\"comment-url\" data-xcw-field=\"comment_url\" placeholder=\"https:\/\/www.reddit.com\/r\/...\/comments\/...\/comment\/xxxxx\/\">\r\n                    <\/div>\r\n                    <button class=\"btn\" data-xcw-event=\"verify_url\" onclick=\"verifyComment(document.getElementById('comment-url').value)\"><i class=\"fa-solid fa-check-double\"><\/i> Verify URL<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            <div id=\"verif\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"verification_box\" class=\"msg\" style=\"margin-top:8px;\"><\/div>\r\n            <div class=\"actions-bottom\">\r\n                <button class=\"btn subtle\" onclick=\"returnToTaskPhase()\"><i class=\"fa-solid fa-arrow-left\"><\/i> Back to Posting<\/button>\r\n                <div id=\"confirm-zone\" class=\"hidden\">\r\n                    <button class=\"btn\" data-xcw-event=\"confirm_verification\" style=\"background-color: var(--info);\" onclick=\"confirm()\">Next \u2192 Result <i class=\"fa-solid fa-arrow-right\"><\/i><\/button>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"step\" id=\"step4\">\r\n        <h2><i class=\"fa-solid fa-flag-checkered\"><\/i> Step 4 \u2013 Final Validation & Comparison<\/h2>\r\n        <div id=\"result-box\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"result_box\"><\/div>\r\n        <div class=\"actions-bottom\">\r\n            <button class=\"btn subtle\" id=\"back-fix\" onclick=\"returnToVerificationPhase()\"><i class=\"fa-solid fa-wrench\"><\/i> Go Back to Fix<\/button>\r\n            <button class=\"btn\" id=\"finish-btn\" data-xcw-event=\"finish_job\" onclick=\"finishJob()\"><i class=\"fa-solid fa-paper-plane\"><\/i> Finish & Submit<\/button>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<div id=\"final-page\" data-xcw-observe=\"mutations\" data-xcw-snapshot=\"final_page\" class=\"hidden\"><\/div>\r\n\r\n<footer>\r\n    <p>Reddit Success Wizard v10.8 | Resilient Edition<\/p>\r\n<\/footer>\r\n\r\n<script>\r\n    \/\/ SCRIPT PRINCIPAL DE L'APPLICATION\r\n    let current = 0;\r\n    let redditData = {}, mwUser = '', commentText = '', selectedPost = '';\r\n    let allowedPosts = [];\r\n    let verifiedData = null, threadInfo = null, lastURL = '';\r\n    let exampleTexts = [];\r\n    let lastResultContext = null;\r\n    const openedPosts = new Set();\r\n    let taskLog = {};\r\n\r\n    if (typeof AbortSignal !== 'undefined' && !AbortSignal.prototype.timeout) {\r\n        AbortSignal.timeout = ms => {\r\n            const c = new AbortController();\r\n            setTimeout(() => c.abort(), ms);\r\n            return c.signal;\r\n        };\r\n    }\r\n\r\n    function onUsernameInput() {\r\n        const input = document.getElementById('reddit-username');\r\n        const nextBtn = document.getElementById('next-step1-btn');\r\n        if (redditData && redditData.name) {\r\n            redditData = {};\r\n            document.getElementById('account-status-bar').classList.add('hidden');\r\n            document.getElementById('mw-id-field').classList.add('hidden');\r\n            document.getElementById('msg1').innerHTML = '';\r\n            input.classList.remove('is-valid', 'is-invalid');\r\n            nextBtn.innerHTML = '<i class=\"fa-solid fa-user-check\"><\/i>Verify Account';\r\n            nextBtn.onclick = () => checkAccount();\r\n            nextBtn.style.backgroundColor = ''; \r\n            nextBtn.style.color = '';\r\n            document.getElementById('step1').setAttribute('data-account-status', 'pending');\r\n        }\r\n        nextBtn.disabled = input.value.trim() === '';\r\n    }\r\n\r\n    async function fetchWithProxies(url, signal) {\r\n        const endpoints = [\r\n            { name: 'Proxy 1', url: `https:\/\/iptv.directory\/proxy.php?url=${encodeURIComponent(url)}` },\r\n            { name: 'Proxy 2', url: `https:\/\/corsproxy.io\/?${encodeURIComponent(url)}` },\r\n            { name: 'Proxy 3 (fallback)', url: `https:\/\/api.allorigins.win\/get?url=${encodeURIComponent(url)}` }\r\n        ];\r\n        for (const endpoint of endpoints) {\r\n            try {\r\n                const response = await fetch(endpoint.url, { signal });\r\n                if (!response.ok) throw new Error(`Request failed with status ${response.status}`);\r\n                const text = await response.text();\r\n                try {\r\n                    const json = JSON.parse(text);\r\n                    return json.contents || json;\r\n                } catch (e) {\r\n                    return text;\r\n                }\r\n            } catch (e) {\r\n                console.error(`Fetch from ${endpoint.name} failed:`, e);\r\n            }\r\n        }\r\n        throw new Error('All proxy attempts failed.');\r\n    }\r\n\r\n    function validateCommentAndUnlockPosts() {\r\n        const commentInput = document.getElementById('comment');\r\n        const txt = commentInput.value.trim();\r\n        const msg3 = document.getElementById('msg3');\r\n        const isExact = exampleTexts.some(ex => normalizePlain(ex) === normalizePlain(txt));\r\n        if (isExact) {\r\n            msg3.innerHTML = '<span class=\"err\">Do not copy an example exactly. Please personalize it.<\/span>';\r\n            return;\r\n        }\r\n        const lengthOk = txt.length >= 80;\r\n        const keywordOk = \/redixel\\.com\/i.test(txt);\r\n        if (!lengthOk || !keywordOk) {\r\n            msg3.innerHTML = '<span class=\"err\">Comment must be at least 80 characters long and contain \"Redixel.com\".<\/span>';\r\n            return;\r\n        }\r\n        msg3.innerHTML = '';\r\n        commentText = txt;\r\n        \r\n        taskLog.validatedComment = {\r\n            text: commentText,\r\n            length: commentText.length,\r\n            uniquenessScore: uniquenessScore(commentText)\r\n        };\r\n\r\n        document.getElementById('step2').setAttribute('data-comment-status', 'validated');\r\n        document.getElementById('step2-part1').classList.add('hidden');\r\n        document.getElementById('mission-box-step2').classList.add('hidden');\r\n        document.querySelector('#validated-comment-display blockquote').textContent = commentText;\r\n        document.getElementById('validated-comment-display').classList.remove('hidden');\r\n        document.getElementById('step2-part2').classList.remove('hidden');\r\n        document.getElementById('confirm-publication-btn').classList.remove('hidden');\r\n    }\r\n\r\n    function editComment() {\r\n        document.getElementById('step2').setAttribute('data-comment-status', 'editing');\r\n        document.getElementById('step2-part1').classList.remove('hidden');\r\n        document.getElementById('mission-box-step2').classList.remove('hidden');\r\n        document.getElementById('validated-comment-display').classList.add('hidden');\r\n        document.getElementById('step2-part2').classList.add('hidden');\r\n        const confirmBtn = document.getElementById('confirm-publication-btn');\r\n        confirmBtn.classList.add('hidden');\r\n        confirmBtn.disabled = true;\r\n        openedPosts.clear();\r\n        selectedPost = '';\r\n        document.getElementById('msg4').innerHTML = '';\r\n        document.querySelectorAll('#card-list .post').forEach(card => {\r\n            card.classList.remove('selected');\r\n            const openButton = card.querySelector('.btn-open');\r\n            if (openButton) {\r\n                openButton.disabled = false;\r\n                openButton.innerHTML = 'Open';\r\n            }\r\n            const selectButton = card.querySelector('.btn-select');\r\n            if (selectButton) {\r\n                selectButton.disabled = true;\r\n            }\r\n        });\r\n    }\r\n\r\n    function handleOpenClick(openButton, url) {\r\n        window.open(url, '_blank');\r\n        openedPosts.add(url);\r\n        const selectButton = openButton.closest('.post-actions').querySelector('.btn-select');\r\n        if (selectButton) {\r\n            selectButton.disabled = false;\r\n        }\r\n        openButton.innerHTML = 'Opened \u2714';\r\n        openButton.disabled = true;\r\n    }\r\n\r\n    function selectPost(selectButton, url) {\r\n        selectedPost = url;\r\n        taskLog.selectedPost = { url: selectedPost };\r\n        document.querySelectorAll('#card-list .post').forEach(p => p.classList.remove('selected'));\r\n        selectButton.closest('.post').classList.add('selected');\r\n        document.getElementById('msg4').innerHTML = '<span class=\"ok\">Post selected! You can now confirm the publication.<\/span>';\r\n        document.getElementById('confirm-publication-btn').disabled = false;\r\n    }\r\n\r\n    function handlePostsData(csvText) {\r\n        const list = document.getElementById('card-list');\r\n        list.innerHTML = ''; \/\/ Clear current content\r\n        const parsed = Papa.parse(csvText || \"\", { header: true }).data;\r\n        allowedPosts = [];\r\n        \r\n        parsed.filter(r => r.Actif && r.Actif.toLowerCase() === 'oui').forEach(p => {\r\n            if (p.Titre && p.URL) {\r\n                const postId = (p.URL.match(\/\\\/comments\\\/([^\/]+)\/) || [])[1];\r\n                if (postId) allowedPosts.push({ postId, url: p.URL, title: p.Titre });\r\n                const div = document.createElement('div');\r\n                div.className = 'post';\r\n                div.innerHTML = `<div style=\"flex:1; overflow-wrap: break-word; word-break: break-word;\"><b>${safeHTML(p.Titre)}<\/b><br><small>${safeHTML(p.URL)}<\/small><\/div>\r\n                                                 <div class=\"post-actions\">\r\n                                                     <button class=\"btn outline info sm btn-open\" data-xcw-event=\"post_open_click\" onclick=\"handleOpenClick(this, '${p.URL}')\">Open<\/button>\r\n                                                     <button class=\"btn sm btn-select\" data-xcw-event=\"post_select_click\" onclick=\"selectPost(this, '${p.URL}')\" disabled>Select<\/button>\r\n                                                 <\/div>`;\r\n                list.appendChild(div);\r\n            }\r\n        });\r\n        \r\n        if (!allowedPosts.length) {\r\n             const errorHtml = `\r\n                <div style=\"text-align:center; padding: 20px;\">\r\n                    <p class=\"status-bad\" style=\"margin-bottom: 15px;\">No active posts available at the moment.<\/p>\r\n                    <button class=\"btn outline info sm\" data-xcw-event=\"manual_refresh_posts\" onclick=\"refreshPostList()\">\r\n                        <i class=\"fa-solid fa-rotate-right\"><\/i> Refresh List\r\n                    <\/button>\r\n                <\/div>`;\r\n            list.innerHTML = errorHtml;\r\n        }\r\n    }\r\n    \r\n    async function refreshPostList() {\r\n        const list = document.getElementById('card-list');\r\n        list.innerHTML = '<p style=\"text-align:center; padding: 20px;\"><i class=\"fa-solid fa-spinner fa-spin\"><\/i> Checking for new posts...<\/p>';\r\n        try {\r\n            const csvUrls = [\r\n                `https:\/\/n8n.srv749745.hstgr.cloud\/webhook\/c3434e96-6b67-42ef-bdda-ca65c86894f0?t=${Date.now()}`,\r\n                `https:\/\/gist.githubusercontent.com\/youneskh\/13054179313a01129b6f4817a3a3b04c\/raw\/posts.csv?t=${Date.now()}`\r\n            ];\r\n            let csvData;\r\n            try {\r\n                csvData = await fetchWithProxies(csvUrls[0], AbortSignal.timeout(8000));\r\n            } catch (e) {\r\n                console.warn(\"Manual refresh: Primary URL failed, trying fallback.\", e);\r\n                csvData = await fetchWithProxies(csvUrls[1], AbortSignal.timeout(8000));\r\n            }\r\n            handlePostsData(csvData);\r\n        } catch (error) {\r\n            console.error(\"Manual post list refresh failed:\", error);\r\n            handlePostsData(''); \/\/ This will re-display the \"No posts\" message with the refresh button\r\n        }\r\n    }\r\n\r\n    function checkCommentRealtime() {\r\n        const txt = document.getElementById('comment').value.trim();\r\n        const lengthOk = txt.length >= 80;\r\n        const keywordOk = \/redixel\\.com\/i.test(txt);\r\n        document.getElementById('check-length').className = lengthOk ? 'ok' : 'not-ok';\r\n        document.getElementById('check-keyword').className = keywordOk ? 'ok' : 'not-ok';\r\n    }\r\n    \r\n    let idleTimer = null, idleWarningTimer = null;\r\n    function resetIdle() { clearTimeout(idleTimer); clearTimeout(idleWarningTimer); document.getElementById('idle-warning').style.display = 'none'; idleWarningTimer = setTimeout(() => { document.getElementById('idle-warning').style.display = 'block'; }, 9 * 60 * 1000); idleTimer = setTimeout(() => { alert('Session expired due to inactivity. The page will reload.'); location.reload(); }, 10 * 60 * 1000); }\r\n    ['mousemove', 'keydown', 'click', 'scroll', 'touchstart'].forEach(ev => window.addEventListener(ev, resetIdle));\r\n\r\n    function updateTaskChecklist() {\r\n        const navMap = {0:0, 1:1, 2:2, 3:3, 4:4}; \r\n        for (let i = 0; i <= 4; i++) {\r\n            const item = document.getElementById(`checklist-item-${i}`);\r\n            if (!item) continue;\r\n            item.classList.remove('active', 'completed');\r\n            if (i < navMap[current]) { item.classList.add('completed'); } \r\n            else if (i === navMap[current]) { item.classList.add('active'); }\r\n        }\r\n    }\r\n\r\n    function goto(step) {\r\n        if (step === current) return;\r\n        document.getElementById('wizard').setAttribute('data-current-step', step);\r\n        const newStepEl = document.getElementById('step' + step);\r\n        const oldStepEl = document.querySelector('.step.active');\r\n\r\n        if(oldStepEl) oldStepEl.classList.add('slide-out');\r\n        \r\n        setTimeout(() => {\r\n            if(oldStepEl) oldStepEl.classList.remove('active', 'slide-out');\r\n            if(newStepEl) {\r\n                newStepEl.classList.add('active', 'slide-in');\r\n                setTimeout(() => newStepEl.classList.remove('slide-in'), 300);\r\n            }\r\n            current = step;\r\n            renderNav();\r\n            updateTaskChecklist();\r\n        }, 300);\r\n    }\r\n    function prev() { goto(Math.max(1, current - 1)); }\r\n    function next(checkStep) {\r\n        if (checkStep === 1) {\r\n            mwUser = document.getElementById('mw-username').value.trim();\r\n            if (!redditData || !redditData.name) {\r\n                document.getElementById('msg1').innerHTML = '<span class=\"err\">Please verify your Reddit account first.<\/span>';\r\n                return;\r\n            }\r\n            if (mwUser.length < 3) { document.getElementById('msg2').innerHTML = '<span class=\"err\">Too short.<\/span>'; return; }\r\n            taskLog.microworkersUsername = mwUser;\r\n            taskLog.redditAccount = { ...redditData, status: document.getElementById('step1').getAttribute('data-account-status') };\r\n            document.getElementById('msg2').innerHTML = '';\r\n        }\r\n        goto(current + 1);\r\n    }\r\n\r\n    function renderNav() {\r\n        const navMap = { 0:0, 1:1, 2:2, 3:2, 4:4 };\r\n        const stepNavs = document.querySelectorAll('nav.steps button');\r\n        stepNavs.forEach(btn => {\r\n            const btnStep = parseInt(btn.id.replace('nav',''));\r\n            const isActive = (navMap[current] === btnStep);\r\n            btn.classList.toggle('active', isActive);\r\n            btn.querySelector('i')?.classList.toggle('fa-beat-fade', isActive);\r\n        });\r\n\r\n        const segments = document.querySelectorAll('.progress-segment');\r\n        segments.forEach((segment, index) => {\r\n            segment.classList.toggle('filled', index < document.querySelectorAll('#task-checklist li.completed').length);\r\n        });\r\n    }\r\n\r\n    function render() { renderNav(); updateTaskChecklist(); }\r\n\r\n    function initiateVerificationPhase() {\r\n        document.getElementById('task-phase').classList.add('hidden');\r\n        document.getElementById('verification-sub-step').classList.remove('hidden');\r\n        \r\n        const recapBox = document.getElementById('task-recap');\r\n        recapBox.innerHTML = `\r\n            <h4><i class=\"fa-solid fa-clipboard-list\"><\/i> Task Recap<\/h4>\r\n            <p style=\"padding-left:0; margin-bottom:10px;\"><strong>Selected Post:<\/strong> <a href=\"${selectedPost}\" target=\"_blank\" style=\"word-break:break-all;\">${selectedPost}<\/a><\/p>\r\n            <strong>Comment validated in the tool:<\/strong>\r\n            <blockquote>${safeHTML(commentText)}<\/blockquote>\r\n        `;\r\n\r\n        current = 3; \r\n        render(); \r\n        startAutomaticVerification();\r\n    }\r\n\r\n    function returnToTaskPhase() {\r\n        document.getElementById('verification-sub-step').classList.add('hidden');\r\n        document.getElementById('task-phase').classList.remove('hidden');\r\n        document.getElementById('verification-sub-step').setAttribute('data-verification-status', 'pending');\r\n        current = 2;\r\n        render();\r\n    }\r\n    \r\n    function returnToVerificationPhase() {\r\n        goto(2); \r\n        document.getElementById('task-phase').classList.add('hidden');\r\n        document.getElementById('verification-sub-step').classList.remove('hidden');\r\n        current = 3;\r\n        render();\r\n    }\r\n\r\n    function safeHTML(str) { return str.replace(\/[<>&\"'`]\/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', '\"': '&quot;', \"'\": '&#39;', '`': '&#96;' }[c])); }\r\n    function normalizePlain(txt) { return txt.toLowerCase().replace(\/<[^>]+>\/g, '').replace(\/[^\\p{L}\\p{N}\\s]\/gu, '').replace(\/\\s+\/g, ' ').trim(); }\r\n    function uniquenessScore(txt) { const w = normalizePlain(txt).split(' ').filter(Boolean); const u = new Set(w); return (u.size \/ Math.max(w.length, 1)) * 100; }\r\n    function readability(txt) { const sentences = (txt.match(\/[.!?]\/g) || []).length || 1; const words = (txt.match(\/\\b[\\p{L}\\p{N}]+\\b\/gu) || []).length; return words \/ sentences; }\r\n\r\n    async function checkAccount() {\r\n        const input = document.getElementById('reddit-username');\r\n        const raw = input.value.trim();\r\n        let user = raw.match(\/\\\/u(?:ser)?\\\/([a-zA-Z0-9_-]+)\/)?.[1] || raw.replace(\/^(u\\\/|user\\\/)\/, '');\r\n        const msg = document.getElementById('msg1');\r\n        const mwIdField = document.getElementById('mw-id-field');\r\n        const nextBtn = document.getElementById('next-step1-btn');\r\n        const statusBar = document.getElementById('account-status-bar');\r\n        const step1Div = document.getElementById('step1');\r\n\r\n        if (!user) { msg.innerHTML = '<span class=\"err\">Please enter a valid username.<\/span>'; return; }\r\n        \r\n        step1Div.setAttribute('data-account-status', 'verifying');\r\n        nextBtn.disabled = true;\r\n        input.classList.remove('is-valid', 'is-invalid');\r\n        statusBar.classList.add('hidden');\r\n        \r\n        const MAX_RETRIES = 3;\r\n        const RETRY_DELAY = 2500;\r\n\r\n        for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\r\n            try {\r\n                if (attempt === 1) {\r\n                    msg.innerHTML = `<div class=\"profile-card skeleton\"><div class=\"profile-avatar\"><\/div><div class=\"profile-info\"><h4>Username<\/h4><p>Verifying...<\/p><\/div><\/div>`;\r\n                } else {\r\n                    msg.innerHTML = `<span class=\"msg warn\"><i class=\"fa-solid fa-spinner fa-spin fa-fw\"><\/i> Connection unstable. Retrying... (${attempt}\/${MAX_RETRIES})<\/span>`;\r\n                    await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));\r\n                }\r\n                \r\n                const redditApiUrl = `https:\/\/www.reddit.com\/user\/${user}\/about.json`;\r\n                const j = await fetchWithProxies(redditApiUrl, AbortSignal.timeout(10000));\r\n                const age = Math.floor((Date.now() \/ 1000 - j.data.created_utc) \/ 86400);\r\n                const karma = j.data.total_karma;\r\n                redditData = { name: j.data.name, createdUTC: j.data.created_utc, age, karma, avatar: j.data.icon_img.split('?')[0] };\r\n                \r\n                mwIdField.classList.remove('hidden');\r\n                statusBar.classList.remove('hidden');\r\n                \r\n                const ageOk = age >= 7;\r\n                const karmaOk = karma >= 50;\r\n\r\n                if (ageOk && karmaOk) {\r\n                    step1Div.setAttribute('data-account-status', 'verified-ok');\r\n                    statusBar.className = 'ok';\r\n                    statusBar.innerHTML = `<img decoding=\"async\" src=\"${redditData.avatar}\" alt=\"Avatar\"><strong>${redditData.name}<\/strong><span class=\"status-message\"><i class=\"fa-solid fa-check-circle\"><\/i> Account Eligible<\/span><div class=\"stats\"><span><i class=\"fa-solid fa-cake-candles\"><\/i> ${age} days<\/span><span><i class=\"fa-solid fa-arrow-up-right-dots\"><\/i> ${karma} karma<\/span><\/div>`;\r\n                    msg.innerHTML = '';\r\n                    input.classList.add('is-valid');\r\n                    nextBtn.innerHTML = 'Next <i class=\"fa-solid fa-arrow-right\"><\/i>';\r\n                    nextBtn.style.backgroundColor = ''; nextBtn.style.color = '';\r\n                    nextBtn.onclick = () => next(1);\r\n                } else {\r\n                    step1Div.setAttribute('data-account-status', 'verified-warn');\r\n                    let reasonMessage = !ageOk && !karmaOk ? 'Insufficient Age & Karma' : (!ageOk ? 'Insufficient Age' : 'Insufficient Karma');\r\n                    statusBar.className = 'warn';\r\n                    statusBar.innerHTML = `<img decoding=\"async\" src=\"${redditData.avatar}\" alt=\"Avatar\"><strong>${redditData.name}<\/strong><span class=\"status-message\"><i class=\"fa-solid fa-triangle-exclamation\"><\/i> Status: Warning<\/span><div class=\"stats\"><span class=\"${ageOk ? '' : 'is-problem'}\"><i class=\"fa-solid fa-cake-candles\"><\/i> ${age} days<\/span><span class=\"${karmaOk ? '' : 'is-problem'}\"><i class=\"fa-solid fa-arrow-up-right-dots\"><\/i> ${karma} karma<\/span><\/div>`;\r\n                    msg.innerHTML = `<div class=\"instruction-box warn\" style=\"margin-top: 15px;\"><h4 style=\"color:#b26a00\"><i class=\"fa-solid fa-circle-info\"><\/i> Important Explanation<\/h4><p style=\"padding-left:0;\">Your account is flagged for the following reason: <strong>${reasonMessage}<\/strong>. If you continue, it is <strong>highly likely that your comment will be invisible<\/strong> to us and others. The task will then be incorrect.<\/p><\/div>`;\r\n                    input.classList.remove('is-valid', 'is-invalid');\r\n                    nextBtn.innerHTML = 'Continue Despite Warning <i class=\"fa-solid fa-triangle-exclamation\"><\/i>';\r\n                    nextBtn.style.backgroundColor = 'var(--warn)'; nextBtn.style.color = '#333';\r\n                    nextBtn.onclick = () => next(1);\r\n                }\r\n                \r\n                nextBtn.disabled = false;\r\n                return;\r\n            } catch (error) {\r\n                console.error(`CheckAccount attempt ${attempt} failed:`, error);\r\n                if (attempt === MAX_RETRIES) {\r\n                    step1Div.setAttribute('data-account-status', 'failed');\r\n                    statusBar.classList.add('hidden');\r\n                    input.classList.add('is-invalid');\r\n                    msg.innerHTML = `<span class=\"err\">Profile not found or API error after ${MAX_RETRIES} attempts. Please check the username and your connection, then try again.<\/span>`;\r\n                    mwIdField.classList.add('hidden');\r\n                    nextBtn.innerHTML = '<i class=\"fa-solid fa-user-check\"><\/i>Verify Account';\r\n                    nextBtn.onclick = () => checkAccount();\r\n                    nextBtn.disabled = false;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    function toggleHelper(elementId, button) {\r\n        const element = document.getElementById(elementId);\r\n        if (!element || !button) return;\r\n        const isNowHidden = element.classList.toggle('hidden');\r\n        if (!isNowHidden) { element.style.animation = 'slide-in-down 0.3s ease-out forwards'; } else { element.style.animation = ''; }\r\n        \r\n        button.classList.toggle('outline', isNowHidden);\r\n        \r\n        const action = isNowHidden ? 'Show' : 'Hide';\r\n        const name = elementId === 'tips' ? 'Tips' : 'Examples';\r\n        const iconClass = elementId === 'tips' ? 'fa-lightbulb' : 'fa-file-lines';\r\n        button.innerHTML = `<i class=\"fa-solid ${iconClass}\"><\/i> ${action} ${name}`;\r\n    }\r\n\r\n    function runQualityLive() {\r\n        const txt = document.getElementById('comment').value.trim();\r\n        if (!txt) { document.getElementById('quality-box').innerHTML = ''; return; }\r\n        const score = uniquenessScore(txt);\r\n        const isExact = exampleTexts.some(ex => normalizePlain(ex) === normalizePlain(txt));\r\n        let html = `<b>Originality:<\/b> ${score.toFixed(1)}% `;\r\n        if (isExact) html += '<span class=\"warn\">\u26a0 Exact copy.<\/span>'; else if (score < 50) html += '<span class=\"warn\">\u26a0 Low.<\/span>'; else html += '<span class=\"ok\">\u2714 Good.<\/span>';\r\n        html += ` | <b>Readability:<\/b> ${readability(txt).toFixed(1)} words\/sentence`;\r\n        document.getElementById('quality-box').innerHTML = html;\r\n    }\r\n    \r\n    function copyExample(el) {\r\n        const commentInput = document.getElementById('comment');\r\n        if (commentInput.readOnly) return;\r\n        commentInput.value = el.textContent.trim();\r\n        checkCommentRealtime();\r\n        runQualityLive();\r\n        document.getElementById('msg3').innerHTML = '<span class=\"ok\">Example copied \u2013 please customize it before validating.<\/span>';\r\n        \r\n        const examplesPanel = document.getElementById('examples');\r\n        const examplesButton = document.getElementById('examples-toggle-btn');\r\n        if (!examplesPanel.classList.contains('hidden')) {\r\n            toggleHelper('examples', examplesButton);\r\n        }\r\n    }\r\n\r\n    async function initApp() {\r\n        const loadingList = document.getElementById('loading-tasks');\r\n        const loadingProgress = document.getElementById('loading-progress');\r\n        const step0Div = document.getElementById('step0');\r\n        const MAX_RETRIES = 3;\r\n        const RETRY_DELAY = 3000;\r\n        let postsLoaded = false;\r\n\r\n        loadingProgress.style.width = '10%';\r\n        \r\n        for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\r\n            try {\r\n                loadingList.innerHTML = `<li id=\"task-posts\"><i class=\"fa-solid fa-spinner fa-spin fa-fw\"><\/i> The Wizard is preparing your mission... \ud83e\ude84<\/li>`;\r\n                const csvUrls = [\r\n                    `https:\/\/n8n.srv749745.hstgr.cloud\/webhook\/c3434e96-6b67-42ef-bdda-ca65c86894f0?t=${Date.now()}`,\r\n                    `https:\/\/gist.githubusercontent.com\/youneskh\/13054179313a01129b6f4817a3a3b04c\/raw\/posts.csv?t=${Date.now()}`\r\n                ];\r\n                \r\n                let csvData;\r\n                try {\r\n                    csvData = await fetchWithProxies(csvUrls[0], AbortSignal.timeout(8000));\r\n                } catch (primaryError) {\r\n                    console.warn(\"Primary URL failed, trying fallback.\", primaryError);\r\n                    csvData = await fetchWithProxies(csvUrls[1], AbortSignal.timeout(8000));\r\n                }\r\n                \r\n                handlePostsData(csvData);\r\n                postsLoaded = true;\r\n                break; \r\n            } catch (error) {\r\n                console.error(`Attempt ${attempt} to load posts failed.`, error);\r\n                if (attempt < MAX_RETRIES) {\r\n                    loadingList.innerHTML = `<li id=\"task-posts\"><i class=\"fa-solid fa-triangle-exclamation fa-fw\" style=\"color: var(--warn-dark);\"><\/i> Failed to load posts. Retrying automatically in ${RETRY_DELAY \/ 1000}s... (Attempt ${attempt}\/${MAX_RETRIES})<\/li>`;\r\n                    await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));\r\n                }\r\n            }\r\n        }\r\n\r\n        if (postsLoaded) {\r\n            step0Div.setAttribute('data-status', 'success');\r\n            loadingProgress.style.width = '60%';\r\n            loadingList.innerHTML = `<li id=\"task-posts\"><i class=\"fa-solid fa-check\"><\/i> Mission prepared!<\/li>\r\n                                     <li id=\"task-api-check\"><i class=\"fa-solid fa-spinner fa-spin fa-fw\"><\/i> Tip: Be personal and authentic! \ud83d\ude09<\/li>`;\r\n            loadingProgress.style.width = '80%';\r\n            \r\n            setTimeout(() => {\r\n                document.querySelector('#task-api-check').innerHTML = `\u2705 All set! Let's start a successful task! \u2728`;\r\n                loadingProgress.style.width = '100%';\r\n                setTimeout(() => { goto(1); }, 1200);\r\n            }, 1000);\r\n        } else {\r\n            step0Div.setAttribute('data-status', 'failed');\r\n            const errorHtml = `\r\n                <li id=\"task-posts\">\u274c Failed to load the list of posts.<\/li>\r\n                <div class=\"err msg\" style=\"display:block; margin-top:10px;\">\r\n                    There was a problem connecting to the server.\r\n                    <button class=\"btn sm\" style=\"margin-top:10px;\" data-xcw-event=\"manual_reload_posts\" onclick=\"manualLoadPosts()\">\r\n                        <i class=\"fa-solid fa-rotate-right\"><\/i> Try Again\r\n                    <\/button>\r\n                <\/div>`;\r\n            loadingList.innerHTML = errorHtml;\r\n            document.getElementById('nav0').innerHTML = `<i class=\"fa-solid fa-triangle-exclamation fa-fw\"><\/i> Error`;\r\n        }\r\n    }\r\n\r\n    async function manualLoadPosts() {\r\n        const loadingList = document.getElementById('loading-tasks');\r\n        loadingList.innerHTML = `<li id=\"task-posts\"><i class=\"fa-solid fa-spinner fa-spin fa-fw\"><\/i> Reloading posts...<\/li>`;\r\n\r\n        try {\r\n            const csvUrls = [\r\n                `https:\/\/n8n.srv749745.hstgr.cloud\/webhook\/c3434e96-6b67-42ef-bdda-ca65c86894f0?t=${Date.now()}`,\r\n                `https:\/\/gist.githubusercontent.com\/youneskh\/13054179313a01129b6f4817a3a3b04c\/raw\/posts.csv?t=${Date.now()}`\r\n            ];\r\n            \r\n            let csvData;\r\n            try {\r\n                csvData = await fetchWithProxies(csvUrls[0], AbortSignal.timeout(8000));\r\n            } catch (e) {\r\n                console.warn(\"Manual refresh: Primary URL failed, trying fallback.\", e);\r\n                csvData = await fetchWithProxies(csvUrls[1], AbortSignal.timeout(8000));\r\n            }\r\n            \r\n            handlePostsData(csvData);\r\n            \r\n            const step0Div = document.getElementById('step0');\r\n            step0Div.setAttribute('data-status', 'success');\r\n            loadingList.innerHTML = `<li id=\"task-posts\"><i class=\"fa-solid fa-check\"><\/i> Mission prepared!<\/li>`;\r\n            \r\n            setTimeout(() => { goto(1); }, 1200);\r\n\r\n        } catch (error) {\r\n            console.error(\"Manual post list refresh failed:\", error);\r\n            const errorHtml = `\r\n                <li id=\"task-posts\">\u274c The reload attempt also failed.<\/li>\r\n                <div class=\"err msg\" style=\"display:block; margin-top:10px;\">\r\n                    Please check your internet connection or try again in a few moments.\r\n                    <button class=\"btn sm\" style=\"margin-top:10px;\" data-xcw-event=\"manual_reload_posts\" onclick=\"manualLoadPosts()\">\r\n                        <i class=\"fa-solid fa-rotate-right\"><\/i> Try Again\r\n                    <\/button>\r\n                <\/div>`;\r\n            loadingList.innerHTML = errorHtml;\r\n        }\r\n    }\r\n\r\n    async function startAutomaticVerification() {\r\n        const listEl = document.getElementById('comment-history-list');\r\n        const statusEl = document.getElementById('auto-verify-status');\r\n        const verifStepDiv = document.getElementById('verification-sub-step');\r\n        verifStepDiv.setAttribute('data-verification-status', 'searching');\r\n        document.getElementById('auto-verify-zone').classList.remove('hidden');\r\n        document.getElementById('manual-verify-zone').classList.add('hidden');\r\n        document.getElementById('confirm-zone').classList.add('hidden');\r\n        document.getElementById('verif').innerHTML = '';\r\n        \r\n        statusEl.innerHTML = `\ud83d\udd0e Searching for your comment... <br><small>If you just posted, it might take 1-2 minutes. This tool will retry automatically.<\/small>`;\r\n\r\n        listEl.innerHTML = ''; \r\n        for (let i = 0; i < 3; i++) {\r\n            const skeletonItem = document.createElement('div');\r\n            skeletonItem.className = 'comment-history-item skeleton';\r\n            skeletonItem.innerHTML = `<div class=\"line\"><\/div><div class=\"line short\"><\/div>`;\r\n            listEl.appendChild(skeletonItem);\r\n        }\r\n\r\n        if (!redditData || !redditData.name) { showManualVerification(\"Reddit user not found. Please verify manually.\"); return; }\r\n        \r\n        const MAX_RETRIES = 3;\r\n        const RETRY_DELAY = 3000;\r\n\r\n        for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\r\n            try {\r\n                if (attempt > 1) {\r\n                    statusEl.innerHTML = `\u26a0\ufe0f Connection error. Retrying search... (${attempt}\/${MAX_RETRIES})`;\r\n                    await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));\r\n                }\r\n                \r\n                const historyUrl = `https:\/\/www.reddit.com\/user\/${redditData.name}\/comments.json?limit=5&t=${Date.now()}`;\r\n                const result = await fetchWithProxies(historyUrl, AbortSignal.timeout(8000));\r\n                \r\n                listEl.innerHTML = '';\r\n                const comments = result.data.children;\r\n                statusEl.innerHTML = `\u2705 Search complete! Please select your comment.`;\r\n                document.getElementById('reload-btn').classList.remove('hidden');\r\n                \r\n                if (comments.length === 0) {\r\n                     listEl.innerHTML = `<div class=\"instruction-box warn\" style=\"margin: 10px 0;\"><strong>No recent comments found.<\/strong><br>Did you post your comment on Reddit? If so, please wait another minute, then click the \"Reload\" button above.<\/div>`;\r\n                     verifStepDiv.setAttribute('data-verification-status', 'no-comments-found');\r\n                     return;\r\n                }\r\n                \r\n                comments.forEach(comment => {\r\n                    const data = comment.data;\r\n                    const item = document.createElement('div');\r\n                    item.className = 'comment-history-item';\r\n                    const postedDate = new Date(data.created_utc * 1000);\r\n                    const timeAgo = Math.round((Date.now() - postedDate.getTime()) \/ 60000);\r\n                    item.innerHTML = `<p><strong>On r\/${data.subreddit}:<\/strong> ${safeHTML(data.body)}<\/p><small>Posted ${timeAgo} minutes ago<\/small>`;\r\n                    item.onclick = () => {\r\n                        document.querySelectorAll('.comment-history-item').forEach(el => { el.style.border = '2px solid transparent'; el.style.background = ''; });\r\n                        item.style.border = '2px solid var(--info)';\r\n                        item.style.background = '#eef7ff';\r\n                        const commentUrl = 'https:\/\/www.reddit.com' + data.permalink;\r\n                        document.getElementById('comment-url').value = commentUrl;\r\n                        verifyComment(commentUrl, true);\r\n                    };\r\n                    listEl.appendChild(item);\r\n                });\r\n\r\n                return;\r\n            } catch (error) {\r\n                console.error(`Automatic verification attempt ${attempt} failed:`, error);\r\n                if (attempt === MAX_RETRIES) {\r\n                    verifStepDiv.setAttribute('data-verification-status', 'failed');\r\n                    listEl.innerHTML = '';\r\n                    showManualVerification(\"Automatic search failed after several attempts. This could be a network issue. Please try manual entry.\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n    \r\n    function showManualVerification(reason) {\r\n        document.getElementById('auto-verify-zone').classList.add('hidden');\r\n        document.getElementById('manual-verify-zone').classList.remove('hidden');\r\n        updateFindCommentHelper();\r\n        if (reason) { document.getElementById('verif').innerHTML = `<span class=\"warn\">${reason}<\/span>`; }\r\n    }\r\n    function updateFindCommentHelper() {\r\n        const helper = document.getElementById('find-comment-helper');\r\n        if (selectedPost && redditData && redditData.name) {\r\n            const searchUrl = `${selectedPost.split('?')[0]}?q=author:${redditData.name}`;\r\n            helper.innerHTML = `\ud83d\ude80 <b>Having trouble finding your comment?<\/b><br><a href=\"${searchUrl}\" target=\"_blank\" class=\"btn outline info sm\" style=\"margin-top: 6px;\">Click here for an easy search<\/a>`;\r\n            helper.style.display = 'block';\r\n        } else { helper.style.display = 'none'; }\r\n    }\r\n    const extractIds = (url) => {\r\n        const cleanedUrl = url.split('?')[0];\r\n        const match = cleanedUrl.match(\/comments\\\/([a-z0-9]+)(?:\\\/[^\\\/]+\\\/([a-z0-9]{7,}))?\/);\r\n        if (match && match[1] && match[2]) { return { postId: match[1], commentId: match[2] }; }\r\n        const fallbackMatch = cleanedUrl.match(\/comments\\\/([a-z0-9]+)\\\/([a-z0-9]{7,})\/);\r\n        if (fallbackMatch && fallbackMatch[1] && fallbackMatch[2]) { return { postId: fallbackMatch[1], commentId: fallbackMatch[2] }; }\r\n        return {};\r\n    };\r\n\r\n    function handleVerificationData(js, ids) {\r\n        const box = document.getElementById('verif');\r\n        const verifStepDiv = document.getElementById('verification-sub-step');\r\n        threadInfo = js[0]?.data?.children?.[0]?.data || null;\r\n        const found = js[1]?.data?.children?.find(c => c.data.id === ids.commentId);\r\n\r\n        if (!found) {\r\n            verifStepDiv.setAttribute('data-verification-status', 'failed');\r\n            const explanationHTML = `\r\n                <div class=\"error-explanation-box\">\r\n                    <h4>\ud83d\udcdd Why can't the tool find my comment?<\/h4>\r\n                    <p>This means <strong>Reddit has made it invisible<\/strong> to everyone (except you), likely due to spam filters. This is not a bug with the tool.<\/p>\r\n                    <h4 style=\"margin-top:15px;\">\u2705 Quick 3-Step Solution<\/h4>\r\n                    <ol>\r\n                        <li><strong>Check in a private window:<\/strong> Paste your comment link into a private browser window. If it doesn't appear, it's definitely hidden.<\/li>\r\n                        <li><strong>Switch posts:<\/strong> Go \"Back to Posting\" and choose a <strong>DIFFERENT<\/strong> post from the list.<\/li>\r\n                        <li><strong>Re-post:<\/strong> Post your comment on the new thread and try the verification again.<\/li>\r\n                    <\/ol>\r\n                <\/div>\r\n            `;\r\n            box.innerHTML = `<span class=\"err\">Comment not found in public data.<\/span>` + explanationHTML;\r\n            return;\r\n        }\r\n\r\n        verifStepDiv.setAttribute('data-verification-status', 'success');\r\n        verifiedData = found.data;\r\n        taskLog.verifiedPublicComment = {\r\n            author: verifiedData.author,\r\n            body: verifiedData.body,\r\n            permalink: 'https:\/\/www.reddit.com' + verifiedData.permalink,\r\n            id: verifiedData.id,\r\n            created_utc: verifiedData.created_utc\r\n        };\r\n\r\n        const commentDirectUrl = 'https:\/\/www.reddit.com' + verifiedData.permalink;\r\n        let successHtml = `<div id=\"comment-found-box\"><p class=\"status-ok\">\u2705 Comment found! Is this yours?<\/p><blockquote>${safeHTML(verifiedData.body)}<\/blockquote><\/div><div style=\"padding:10px; border: 1px solid var(--ok); background: #e6f9eb; border-radius: var(--border-radius); margin-top: 10px;\"><p style=\"font-size: 0.75rem; margin: 0 0 8px 0;\"><strong>Final Action:<\/strong> Copy the link, then open a <strong>private browser window<\/strong> and paste the link to ensure it's publicly visible.<\/p><button class=\"btn sm\" style=\"background-color: var(--info);\" onclick=\"copyForPrivateWindow('${commentDirectUrl}', this)\">Copy Link<\/button><\/div>`;\r\n        box.innerHTML = successHtml;\r\n        document.getElementById('confirm-zone').classList.remove('hidden');\r\n    }\r\n\r\n    function copyForPrivateWindow(url, btn) {\r\n        navigator.clipboard.writeText(url).then(() => { btn.textContent = '\u2705 Link Copied!'; setTimeout(() => { btn.textContent = 'Copy Link'; }, 2000); }).catch(err => { console.error('Copy failed: ', err); btn.textContent = 'Copy Failed!'; });\r\n    }\r\n    async function verifyComment(url, isFromAutoList = false) {\r\n        if (!isFromAutoList) { document.getElementById('auto-verify-zone').classList.add('hidden'); document.getElementById('manual-verify-zone').classList.remove('hidden'); }\r\n        lastURL = url;\r\n        const ids = extractIds(url);\r\n        const box = document.getElementById('verif');\r\n        document.getElementById('confirm-zone').classList.add('hidden');\r\n        if (!ids.postId || !ids.commentId) { box.innerHTML = '<span class=\"err\">Invalid URL format.<\/span>'; return; }\r\n        \r\n        const MAX_RETRIES = 3;\r\n        const RETRY_DELAY = 2500;\r\n\r\n        for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\r\n            try {\r\n                if (attempt > 1) {\r\n                    box.innerHTML = `<i class=\"fa-solid fa-spinner fa-spin fa-fw\"><\/i> Retrying verification... (${attempt}\/${MAX_RETRIES})`;\r\n                    await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));\r\n                } else {\r\n                    box.innerHTML = `Verifying URL...`;\r\n                }\r\n\r\n                const commentApiUrl = `https:\/\/old.reddit.com\/comments\/${ids.postId}\/_\/${ids.commentId}.json?t=${Date.now()}`;\r\n                const js = await fetchWithProxies(commentApiUrl, AbortSignal.timeout(8000));\r\n                handleVerificationData(js, ids);\r\n                return;\r\n            } catch (error) {\r\n                console.error(`Verify comment attempt ${attempt} failed:`, error);\r\n                if (attempt === MAX_RETRIES) {\r\n                    box.innerHTML = `<span class=\"err\">Comment not found or API error after ${MAX_RETRIES} attempts. Please check the URL and your connection.<\/span>`;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    \r\n    function reloadComment() {\r\n        startAutomaticVerification();\r\n    }\r\n\r\n    function confirm() { goto(4); buildResult(); }\r\n    function triggerConfetti() { confetti({ particleCount: 150, spread: 90, origin: { y: 0.6 } }); }\r\n    function getFeedbackMessage(score, status, critical) {\r\n        if (critical) { return `Score: ${score}\/100. Critical corrections needed.`; }\r\n        if (score === 100) { return `Perfect Score: 100\/100. Excellent work!`; }\r\n        if (score >= 90) { return `Excellent Score: ${score}\/100. Very high quality.`; }\r\n        if (score >= 75) { return `Good Score: ${score}\/100. All important criteria are met.`; }\r\n        return `Score: ${score}\/100. The work is correct but could be improved.`;\r\n    }\r\n\r\n    function buildResult() {\r\n        const resultBox = document.getElementById('result-box');\r\n        if (!redditData || !redditData.createdUTC || !verifiedData) {\r\n            resultBox.innerHTML = `<div class=\"suggestions\"><b>Error: Missing data.<\/b><br><button class=\"btn\" onclick=\"goto(1)\">Return to Step 1<\/button><\/div>`;\r\n            return;\r\n        }\r\n        const d = verifiedData;\r\n        const userOK = redditData.name?.toLowerCase() === d.author.toLowerCase();\r\n        const declaredId = (selectedPost.match(\/\\\/comments\\\/([^\/]+)\/) || [])[1];\r\n        const actualId = (('https:\/\/www.reddit.com' + d.permalink).match(\/\\\/comments\\\/([^\/]+)\/) || [])[1];\r\n        const postOK = declaredId === actualId;\r\n        const allowedButDifferent = !postOK && allowedPosts.some(p => p.postId === actualId);\r\n        const lengthOK = d.body.trim().length >= 80;\r\n        const keywordOK = \/redixel\\.com\/i.test(d.body);\r\n        let ageAtComment = Math.floor((d.created_utc - redditData.createdUTC) \/ 86400);\r\n        const ageOK = ageAtComment !== null && ageAtComment >= 7;\r\n        const contentOK = normalizePlain(commentText) === normalizePlain(d.body);\r\n\r\n        const suggestions = [];\r\n        if (!userOK) suggestions.push(\"The Reddit account does not match.\");\r\n        if (!postOK && !allowedButDifferent) suggestions.push(\"The comment is not on an authorized post.\");\r\n        if (!contentOK) suggestions.push(\"The posted content does not match the validated content.\");\r\n        if (!keywordOK) suggestions.push(\"The keyword \u201cRedixel.com\u201d is missing.\");\r\n        if (!lengthOK) suggestions.push(\"The comment must be at least 80 characters long.\");\r\n        if (!ageOK) suggestions.push(\"The account was not 7 days old at the time of posting.\");\r\n        \r\n        let score = 0;\r\n        function add(ok, pts) { if (ok) score += pts; }\r\n        add(userOK, 20);\r\n        add(postOK || allowedButDifferent, 20);\r\n        add(contentOK, 25);\r\n        add(keywordOK, 15);\r\n        add(lengthOK, 15);\r\n        add(ageOK, 5);\r\n\r\n        const critical = !userOK || (!postOK && !allowedButDifferent) || !contentOK || !keywordOK || !lengthOK || !ageOK;\r\n        const allGood = !critical;\r\n        \r\n        let status = 'Needs Correction', badgeClass = 'acorriger';\r\n        if (critical) { status = 'Rejected'; badgeClass = 'rejet'; } else if (allGood && score >= 95) { status = 'Perfect'; badgeClass = 'parfait'; } else if (allGood) { status = 'Correct'; badgeClass = 'correct'; }\r\n        lastResultContext = { allGood, status, score, critical };\r\n        \r\n        taskLog.result = {\r\n            score: score,\r\n            status: status,\r\n            reasons: {\r\n                userMatch: userOK,\r\n                postMatch: postOK || allowedButDifferent,\r\n                contentMatch: contentOK,\r\n                keywordPresent: keywordOK,\r\n                lengthSufficient: lengthOK,\r\n                accountAgeSufficient: ageOK\r\n            }\r\n        };\r\n        taskLog.sessionCompletedAt = new Date().toISOString();\r\n        resultBox.setAttribute('data-final-log', JSON.stringify(taskLog));\r\n        \r\n        resultBox.setAttribute('data-final-score', score);\r\n        resultBox.setAttribute('data-final-status', status);\r\n\r\n        const summaryText = getFeedbackMessage(score, status, critical);\r\n        let html = `<p style=\"font-size:.9rem;\"><b>${summaryText}<\/b> <span class=\"badge ${badgeClass}\">${status}<\/span><\/p><div class=\"scorewrap\"><canvas id=\"score-canvas\" width=\"150\" height=\"150\"><\/canvas><\/div><div class=\"result-grid\">`;\r\n        \r\n        const userHelp = `The author is '${d.author}', but you used '${redditData.name}' in Step 1.`;\r\n        html += `<div class=\"result-card\"><div class=\"result-card-header\"><span class=\"result-card-icon\">${userOK ? '\u2705' : '\u274c'}<\/span><h4>User<\/h4>${!userOK ? `<span class=\"tooltip-icon\" title=\"${userHelp}\">?<\/span>` : ''}<\/div><div class=\"result-card-details\">Declared: <b>${safeHTML(redditData.name || '')}<\/b><br>Actual: <b>${safeHTML(d.author)}<\/b><\/div><\/div>`;\r\n        \r\n        let contentDetails;\r\n        if (contentOK) {\r\n            contentDetails = `<div class=\"result-card-details\">Status: <b class=\"status-ok\">Matches<\/b><\/div>`;\r\n        } else {\r\n            contentDetails = `<div class=\"result-card-details\">\r\n                Status: <b class=\"status-bad\">Does not match<\/b>\r\n                <div style=\"margin-top:8px;\">\r\n                    <b>Expected:<\/b><blockquote style=\"font-style:normal; font-size: 0.75rem; background: #fffbe6; border-color: var(--warn); margin: 4px 0; word-break: break-word;\">${safeHTML(commentText)}<\/blockquote>\r\n                    <b>Posted:<\/b><blockquote style=\"font-style:normal; font-size: 0.75rem; background: #ffe6e6; border-color: var(--danger); margin: 4px 0; word-break: break-word;\">${safeHTML(d.body)}<\/blockquote>\r\n                <\/div>\r\n            <\/div>`;\r\n        }\r\n        html += `<div class=\"result-card\"><div class=\"result-card-header\"><span class=\"result-card-icon\">${contentOK ? '\u2705' : '\u274c'}<\/span><h4>Content Match<\/h4><\/div>${contentDetails}<\/div>`;\r\n        \r\n        const postStatus = postOK ? 'Matches' : (allowedButDifferent ? 'Other Allowed' : 'Not Allowed');\r\n        html += `<div class=\"result-card\"><div class=\"result-card-header\"><span class=\"result-card-icon\">${postOK || allowedButDifferent ? '\u2705' : '\u274c'}<\/span><h4>Post<\/h4><\/div><div class=\"result-card-details\">Status: <b class=\"${postOK || allowedButDifferent ? 'status-ok' : 'status-bad'}\">${postStatus}<\/b><br><a href=\"https:\/\/www.reddit.com${d.permalink}\" target=\"_blank\">View Post<\/a><\/div><\/div>`;\r\n        html += `<div class=\"result-card\"><div class=\"result-card-header\"><span class=\"result-card-icon\">${lengthOK ? '\u2705' : '\u274c'}<\/span><h4>Length \u2265 80<\/h4><\/div><div class=\"result-card-details\">Your comment: <b>${d.body.trim().length} characters<\/b>.<\/div><\/div>`;\r\n        html += `<div class=\\\"result-card\\\"><div class=\\\"result-card-header\\\"><span class=\\\"result-card-icon\\\">${keywordOK ? '\u2705' : '\u274c'}<\/span><h4>Keyword \\\"Redixel.com\\\"<\/h4><\/div><div class=\\\"result-card-details\\\">Status: <b class=\\\"${keywordOK ? 'status-ok' : 'status-bad'}\\\">${keywordOK ? 'Present' : 'Missing'}<\/b><\/div><\/div>`;\r\n        html += `<div class=\"result-card\"><div class=\"result-card-header\"><span class=\"result-card-icon\">${ageOK ? '\u2705' : '\u274c'}<\/span><h4>Account Age<\/h4><\/div><div class=\"result-card-details\">Account age at post: <b>${ageAtComment !== null ? ageAtComment + ' days' : 'N\/A'}<\/b>.<\/div><\/div>`;\r\n        html += `<\/div>`;\r\n\r\n        if (allGood) { html += `<div class=\"ok-hint\">\u2705 All checks passed. <b>Take a screenshot of this page<\/b> and submit it as proof.<\/div>`; }\r\n        if (suggestions.length) { html += `<div class=\"suggestions\"><b>To correct:<\/b><ul style=\"margin:6px 0 0 18px;padding:0;\">${suggestions.map(s => '<li>' + safeHTML(s) + '<\/li>').join('')}<\/ul><\/div>`; }\r\n        const watermarkText = `${safeHTML(mwUser)} - ${new Date().toLocaleString('en-US')}`;\r\n        html += `<div id=\"watermark\">${watermarkText}<\/div>`;\r\n        resultBox.innerHTML = html;\r\n        document.getElementById('back-fix').classList.toggle('hidden', allGood);\r\n        \r\n        setTimeout(() => drawDonut(score), 50);\r\n\r\n        if (score >= 95 && allGood) { setTimeout(triggerConfetti, 500); }\r\n    }\r\n    \r\n    function drawDonut(score) {\r\n        const cvs = document.getElementById('score-canvas');\r\n        if (!cvs) return;\r\n        const ctx = cvs.getContext('2d');\r\n        const radius = 65, centerX = cvs.width \/ 2, centerY = cvs.height \/ 2;\r\n        ctx.lineWidth = 16;\r\n\r\n        const computedStyles = getComputedStyle(document.documentElement);\r\n        const okColor = computedStyles.getPropertyValue('--ok').trim();\r\n        const warnColor = computedStyles.getPropertyValue('--warn').trim();\r\n        const dangerColor = computedStyles.getPropertyValue('--danger').trim();\r\n        const scoreColor = score >= 75 ? okColor : (score >= 50 ? warnColor : dangerColor);\r\n        \r\n        let currentScore = 0;\r\n        const animationDuration = 1000;\r\n        let startTime = null;\r\n\r\n        function animate(timestamp) {\r\n            if (!startTime) startTime = timestamp;\r\n            const progress = timestamp - startTime;\r\n            const scoreFraction = Math.min(progress \/ animationDuration, 1);\r\n            currentScore = Math.floor(score * scoreFraction);\r\n            ctx.clearRect(0, 0, cvs.width, cvs.height);\r\n            \r\n            ctx.lineCap = 'round';\r\n            ctx.strokeStyle = '#e9eef3';\r\n            ctx.beginPath();\r\n            ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\r\n            ctx.stroke();\r\n\r\n            if (currentScore > 0) {\r\n                const endAngle = -Math.PI \/ 2 + (Math.PI * 2 * (currentScore \/ 100));\r\n                ctx.strokeStyle = scoreColor;\r\n                ctx.beginPath();\r\n                ctx.arc(centerX, centerY, radius, -Math.PI \/ 2, endAngle);\r\n                ctx.stroke();\r\n            }\r\n\r\n            ctx.fillStyle = '#222';\r\n            ctx.font = 'bold 24px Inter,Arial';\r\n            ctx.textAlign = 'center';\r\n            ctx.textBaseline = 'middle';\r\n            ctx.fillText(currentScore, centerX, centerY - 8);\r\n            ctx.font = '12px Inter,Arial';\r\n            ctx.fillStyle = '#666';\r\n            ctx.fillText('\/ 100', centerX, centerY + 15);\r\n            \r\n            if (progress < animationDuration) { requestAnimationFrame(animate); }\r\n        }\r\n        requestAnimationFrame(animate);\r\n    }\r\n    \r\n    function adoptRealPost() { if (threadInfo?.permalink) { selectedPost = 'https:\/\/www.reddit.com' + threadInfo.permalink; buildResult(); } }\r\n    \r\n    function finishJob() {\r\n        if (!lastResultContext) { alert('No result available.'); return; }\r\n        const passed = lastResultContext.allGood;\r\n        const final = document.getElementById('final-page');\r\n        const wizard = document.getElementById('wizard');\r\n        wizard.classList.add('hidden');\r\n        final.classList.remove('hidden');\r\n        final.innerHTML = `<h1 class=\"${passed ? 'final-pass' : 'final-fail'}\">${passed ? 'SUCCESS \u2705' : 'FAILURE \u274c'}<\/h1><p style=\"font-size:1rem;\">${passed ? 'All checks have passed. <b>Make sure you have taken a screenshot.<\/b>' : 'The submission is not valid \u2013 please correct the issues.'}<\/p><p style=\"font-size:.8rem;\">Score: <b>${lastResultContext.score}\/100<\/b> \u2013 Status: <b>${lastResultContext.status}<\/b><\/p><div style=\"margin-top:20px;\"><button class=\"btn\" onclick=\"location.reload()\"><i class=\"fa-solid fa-rotate-right\"><\/i> Start Over<\/button><\/div>`;\r\n    }\r\n    function setupFAQ() {\r\n        const modal = document.getElementById('faq-modal');\r\n        const btn = document.getElementById('faq-button');\r\n        const span = document.getElementById('faq-close');\r\n        if (!modal || !btn || !span) { console.error(\"FAQ elements not found.\"); return; }\r\n        btn.addEventListener('click', () => { modal.style.display = \"block\"; });\r\n        span.addEventListener('click', () => { modal.style.display = \"none\"; });\r\n        window.addEventListener('click', (event) => { if (event.target == modal) { modal.style.display = \"none\"; } });\r\n    }\r\n    \r\n    window.addEventListener('DOMContentLoaded', () => {\r\n        document.querySelectorAll('.example').forEach(e => exampleTexts.push(e.textContent));\r\n        \r\n        const navButton3 = document.getElementById('nav3');\r\n        if(navButton3) navButton3.remove();\r\n        const navButton2 = document.getElementById('nav2');\r\n        if(navButton2) navButton2.onclick = () => goto(2);\r\n        \r\n        document.getElementById('next-step1-btn').disabled = document.getElementById('reddit-username').value.trim() === '';\r\n\r\n        initApp();\r\n        render();\r\n        resetIdle();\r\n        checkCommentRealtime();\r\n        setupFAQ();\r\n    });\r\n<\/script>\r\n\r\n<script>\r\n(function() {\r\n    'use strict';\r\n\r\n    \/\/ 1. Initialisation de la session et du buffer\r\n    const SESSION_ID = 'sid_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\r\n    const STORAGE_KEY = 'xcw_event_buffer';\r\n    const MAX_BUFFER_SIZE_MB = 2;\r\n    let eventCounter = 0;\r\n\r\n    try {\r\n        let existingBuffer = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]');\r\n        window.XCW_EVENT_BUFFER = Array.isArray(existingBuffer) ? existingBuffer : [];\r\n    } catch (e) {\r\n        window.XCW_EVENT_BUFFER = [];\r\n    }\r\n\r\n    function pushEvent(type, payload = {}) {\r\n        const event = {\r\n            id: `eid_${eventCounter++}`,\r\n            sessionId: SESSION_ID,\r\n            timestamp: new Date().toISOString(),\r\n            type: type,\r\n            payload: payload\r\n        };\r\n        window.XCW_EVENT_BUFFER.push(event);\r\n        try {\r\n            let jsonString = JSON.stringify(window.XCW_EVENT_BUFFER);\r\n            if (jsonString.length > MAX_BUFFER_SIZE_MB * 1024 * 1024) {\r\n                const tenPercent = Math.floor(window.XCW_EVENT_BUFFER.length * 0.1);\r\n                window.XCW_EVENT_BUFFER.splice(0, tenPercent);\r\n                jsonString = JSON.stringify(window.XCW_EVENT_BUFFER);\r\n            }\r\n            localStorage.setItem(STORAGE_KEY, jsonString);\r\n        } catch (e) {\r\n            console.error(\"XCW Logger: Failed to persist event buffer.\", e);\r\n        }\r\n    }\r\n\r\n    \/\/ 2. Listeners globaux\r\n    document.addEventListener('click', (e) => {\r\n        const target = e.target.closest('[data-xcw-event]');\r\n        if (!target) return;\r\n\r\n        const eventType = target.getAttribute('data-xcw-event');\r\n        const payload = {\r\n            targetId: target.id,\r\n            targetTag: target.tagName,\r\n            textContent: target.textContent.trim().substring(0, 50)\r\n        };\r\n        \r\n        if (eventType === 'post_open_click' || eventType === 'post_select_click') {\r\n            const postEl = target.closest('.post');\r\n            if (postEl) {\r\n                payload.post_title = postEl.querySelector('b')?.textContent || '';\r\n                payload.post_url = postEl.querySelector('small')?.textContent || '';\r\n            }\r\n        }\r\n        \r\n        pushEvent(eventType, payload);\r\n    }, true);\r\n\r\n    document.addEventListener('input', (e) => {\r\n        const target = e.target;\r\n        const fieldName = target.getAttribute('data-xcw-field');\r\n        if (!fieldName) return;\r\n        \r\n        const payload = {\r\n            field: fieldName,\r\n            length: target.value.length\r\n        };\r\n\r\n        if (fieldName === 'comment_text' && typeof readability === 'function') {\r\n            payload.keywordOK = \/redixel\\.com\/i.test(target.value);\r\n            payload.readability = readability(target.value).toFixed(1);\r\n        }\r\n        pushEvent('field_change', payload);\r\n    }, true);\r\n\r\n    \/\/ 3. MutationObserver\r\n    const observer = new MutationObserver(mutations => {\r\n        const snapshots = new Map();\r\n        mutations.forEach(mutation => {\r\n            const target = mutation.target.closest('[data-xcw-observe=\"mutations\"]');\r\n            if (target) {\r\n                const snapshotName = target.getAttribute('data-xcw-snapshot');\r\n                if (!snapshots.has(snapshotName)) {\r\n                    snapshots.set(snapshotName, (target.textContent || '').replace(\/\\s+\/g, ' ').trim().substring(0, 250));\r\n                }\r\n            }\r\n        });\r\n        snapshots.forEach((text, name) => {\r\n            pushEvent('snapshot_mutation', { zone: name, text_snapshot: text });\r\n        });\r\n    });\r\n\r\n    \/\/ 4. Wrapper Fetch\r\n    const originalFetch = window.fetch;\r\n    const trackedUrls = ['reddit.com', 'corsproxy.io', 'allorigins.win', 'iptv.directory\/proxy.php', 'n8n.srv749745.hstgr.cloud', 'gist.githubusercontent.com'];\r\n    window.fetch = function(...args) {\r\n        const url = args[0] instanceof Request ? args[0].url : args[0];\r\n        if (trackedUrls.some(trackedUrl => url.includes(trackedUrl))) {\r\n            pushEvent('fetch_try', { url });\r\n            return originalFetch.apply(this, args)\r\n                .then(response => {\r\n                    const eventType = response.ok ? 'fetch_ok' : 'fetch_error';\r\n                    pushEvent(eventType, { url, status: response.status, ok: response.ok });\r\n                    return response;\r\n                })\r\n                .catch(error => {\r\n                    pushEvent('fetch_error', { url, error: error.message });\r\n                    throw error;\r\n                });\r\n        }\r\n        return originalFetch.apply(this, args);\r\n    };\r\n\r\n    \/\/ 5. & 6. Cycle de vie et Patching des fonctions\r\n    function wrapFunction(obj, funcName, afterCallback) {\r\n        if (typeof obj[funcName] !== 'function') return;\r\n        const originalFunc = obj[funcName];\r\n        obj[funcName] = function(...args) {\r\n            const result = originalFunc.apply(this, args);\r\n            try {\r\n                afterCallback(result, args);\r\n            } catch (e) {\r\n                console.error(`XCW Logger: Error in after-callback for ${funcName}`, e);\r\n            }\r\n            return result;\r\n        };\r\n    }\r\n    \r\n    document.addEventListener('DOMContentLoaded', () => {\r\n        pushEvent('page_loaded', { userAgent: navigator.userAgent });\r\n\r\n        document.querySelectorAll('[data-xcw-observe=\"mutations\"]').forEach(el => {\r\n            observer.observe(el, { childList: true, subtree: true, characterData: true, attributes: true });\r\n        });\r\n\r\n        wrapFunction(window, 'goto', (result, args) => {\r\n            pushEvent('navigate', { from: current, to: args[0] });\r\n        });\r\n        \r\n        wrapFunction(window, 'buildResult', () => {\r\n             pushEvent('result_built', { score: lastResultContext.score, status: lastResultContext.status, isCritical: lastResultContext.critical });\r\n        });\r\n\r\n        wrapFunction(window, 'finishJob', () => {\r\n             pushEvent('finish_job_clicked');\r\n        });\r\n        \r\n        const originalSetTimeout = window.setTimeout;\r\n        window.setTimeout = function(callback, delay, ...args) {\r\n            if (delay === 9 * 60 * 1000) {\r\n                const originalCallback = callback;\r\n                callback = function() {\r\n                    pushEvent('idle_warning');\r\n                    originalCallback();\r\n                };\r\n            } else if (delay === 10 * 60 * 1000) {\r\n                const originalCallback = callback;\r\n                callback = function() {\r\n                    pushEvent('idle_timeout');\r\n                    originalCallback();\r\n                };\r\n            }\r\n            return originalSetTimeout(callback, delay, ...args);\r\n        };\r\n    });\r\n\r\n    window.addEventListener('beforeunload', () => {\r\n        pushEvent('page_unload');\r\n    });\r\n\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Microworkers Reddit Success Wizard &#8211; Redixel.com ? &times; Frequently Asked Questions (FAQ) \ud83e\udd14 What are the most common mistakes? To ensure success, avoid these errors: Copying an example word-for-word: Always personalize the examples. Copying the post link instead of the comment link: Make sure to use the &#8220;Share&#8221; -> &#8220;Copy Link&#8221; option on YOUR comment. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1896","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/pages\/1896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/comments?post=1896"}],"version-history":[{"count":5,"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/pages\/1896\/revisions"}],"predecessor-version":[{"id":1901,"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/pages\/1896\/revisions\/1901"}],"wp:attachment":[{"href":"https:\/\/iptv.directory\/index.php\/wp-json\/wp\/v2\/media?parent=1896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}