{"id":602,"date":"2025-06-03T07:09:56","date_gmt":"2025-06-03T07:09:56","guid":{"rendered":"https:\/\/abatablaster.xyz\/?page_id=602"},"modified":"2026-03-01T08:07:16","modified_gmt":"2026-03-01T08:07:16","slug":"smart-warmupblast","status":"publish","type":"page","link":"https:\/\/abatablaster.xyz\/index.php\/smart-warmupblast\/","title":{"rendered":"\ud83d\ude80Smart Warmup+Blast"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"ms\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n    <title>Smart Warmer \u2013 AbataBlaster<\/title>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-app-compat.js\"><\/script>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-auth-compat.js\"><\/script>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-firestore-compat.js\"><\/script>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-storage-compat.js\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/xlsx@0.18.5\/dist\/xlsx.full.min.js\"><\/script>\n\n    <!-- \u2705 Shared Status MESTI DULU sebab initialize Firebase -->\n    <script src=\"https:\/\/abatablaster.xyz\/js\/shared-status.js\"><\/script>\n\n    <style>\n        @keyframes blink {\n            50% {\n                opacity: 0;\n            }\n        }\n    <\/style>\n\n    <style>\n        \/* ===== THEME TOKENS ===================================================== *\/\n        :root {\n            --page-max: 1200px;\n            \/* ubah 1200\u21921400 ikut selesa *\/\n            --page-pad: clamp(12px, 3vw, 32px);\n\n            --clr-bg: #f2faf6;\n            --clr-text: #1a4321;\n            --clr-primary: #36c47c;\n            --clr-primary-d: #1a7f4a;\n\n            --clr-border: #b3dbc5;\n            --clr-soft: #f7fcfa;\n            --clr-accent: #cfe8dc;\n\n            --clr-info: #1976d2;\n            --clr-warn: #ffb300;\n            --clr-danger: #d32f2f;\n            --clr-blue: #0288d1;\n\n            --shadow-1: 0 3px 10px rgba(54, 196, 124, .07), 0 1.5px 5px rgba(0, 0, 0, .05);\n            --shadow-2: 0 1.5px 4px rgba(54, 196, 124, .06);\n        }\n\n        \/* ===== BASE ============================================================= *\/\n        html,\n        body {\n            overflow-x: hidden;\n        }\n\n        * {\n            box-sizing: border-box;\n        }\n\n        body {\n            margin: 0;\n            padding: 0 !important;\n            \/* override lama *\/\n            font-family: 'Segoe UI', Arial, sans-serif;\n            color: var(--clr-text);\n            background: var(--clr-bg);\n        }\n\n        \/* Container berpusat *\/\n        .page {\n            width: 100%;\n            max-width: var(--page-max);\n            margin: 0 auto;\n            padding-left: var(--page-pad);\n            padding-right: var(--page-pad);\n        }\n\n        h3 {\n            margin: 0 0 12px;\n            color: var(--clr-primary-d);\n            font-weight: 600;\n        }\n\n        label,\n        .card label {\n            display: block;\n            margin-bottom: 4px;\n            font-size: 15px;\n            color: #185734;\n        }\n\n        \/* ===== COMPONENTS ======================================================= *\/\n        .card {\n            background: #fff;\n            padding: 18px 16px;\n            border-radius: 16px;\n            margin-bottom: 22px;\n            border-left: 7px solid var(--clr-primary);\n            box-shadow: var(--shadow-1);\n        }\n\n        \/* \u2705 KECILKAN card nombor sahaja *\/\n        .card.card-number {\n            padding: 12px 12px;\n            margin-bottom: 16px;\n        }\n\n        .card.card-number h3 {\n            margin: 0 0 8px;\n            font-size: 16px;\n        }\n\n        \/* \u2705 list nombor: paparkan semua (jangan hadkan tinggi) *\/\n        .card.card-number #numberList {\n            max-height: none;\n        }\n\n        .btn {\n            display: inline-block;\n            min-width: 110px;\n            padding: 8px 16px;\n            margin: 4px 4px 0 0;\n            font-size: 15px;\n            font-weight: 500;\n            color: #fff;\n            background: var(--clr-primary);\n            border: 0;\n            border-radius: 7px;\n            cursor: pointer;\n            transition: background .15s;\n            box-shadow: var(--shadow-2);\n        }\n\n        .btn:hover,\n        .btn:focus {\n            background: var(--clr-primary-d);\n        }\n\n        \/* Variasi butang ikut id sedia ada *\/\n        #stopBtn {\n            background: var(--clr-danger);\n        }\n\n        #stopBtn:hover,\n        #stopBtn:focus {\n            background: #b71c1c;\n        }\n\n        #pauseBtn {\n            background: var(--clr-warn);\n            color: #fff;\n        }\n\n        #pauseBtn:hover,\n        #pauseBtn:focus {\n            background: #c68400;\n        }\n\n        #resumeBtn {\n            background: var(--clr-blue);\n            color: #fff;\n        }\n\n        #resumeBtn:hover,\n        #resumeBtn:focus {\n            background: #01579b;\n        }\n\n        \/* Form fields *\/\n        textarea,\n        input[type=\"text\"],\n        input[type=\"number\"],\n        input[type=\"file\"] {\n            width: 100%;\n            font-size: 15px;\n            padding: 7px 9px;\n            margin: 6px 0 12px;\n            border: 1.3px solid var(--clr-border);\n            border-radius: 6px;\n            background: var(--clr-soft);\n            outline: none;\n            transition: border .2s, background .2s;\n        }\n\n        textarea:focus,\n        input[type=\"text\"]:focus,\n        input[type=\"number\"]:focus {\n            border-color: var(--clr-primary);\n            background: #f2faf6;\n        }\n\n        \/* File input: kecil & ringkas di mobile\/desktop *\/\n        input[type=\"file\"] {\n            padding: 0;\n            background: none;\n            border: none;\n        }\n\n        \/* Kecilkan ruang di bawah preview *\/\n        #fieldsPreview,\n        #previewMessage {\n            margin-bottom: 5px;\n        }\n\n        \/* Timer blocks *\/\n        .timer-block-ui {\n            background: #f4fef8;\n            border: 1.4px solid #c4f1e3;\n            border-radius: 11px;\n            padding: 15px 18px 10px;\n            margin-bottom: 18px;\n            box-shadow: var(--shadow-2);\n        }\n\n        .timer-block-title {\n            font-size: 16px;\n            font-weight: 700;\n            color: #19734d;\n            margin-bottom: 7px;\n        }\n\n        .timer-block-info {\n            background: #eafbea;\n            color: #19734d;\n            font-size: 13px;\n            padding: 7px 13px;\n            border-left: 3.5px solid var(--clr-primary);\n            border-radius: 7px;\n            margin-bottom: 12px;\n        }\n\n        #pauseResumeBlock input[type=\"number\"] {\n            min-width: 45px;\n            max-width: 65px;\n            padding: 5px 8px;\n            font-size: 15px;\n            border: 1.2px solid var(--clr-border);\n            border-radius: 6px;\n            background: var(--clr-soft);\n            margin: 0 4px;\n        }\n\n        \/* ===== LIST GRID (Numbers & Groups) ===================================== *\/\n        \/* ===== LIST GRID (Numbers & Groups) ===================================== *\/\n        #numberList,\n        #groupList {\n            display: grid;\n            gap: 10px 16px;\n            grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n        }\n\n        \/* \u2705 KECILKAN: nombor sahaja (tanpa scroll, paparkan semua) *\/\n        #numberList {\n            gap: 8px 10px;\n            grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));\n            max-height: none;\n            overflow: unset;\n            \/* atau buang line overflow terus *\/\n            padding-right: 0;\n        }\n\n        #numberList label,\n        #groupList label {\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            padding: 6px 10px;\n            background: var(--clr-soft);\n            border: 1px dashed var(--clr-accent);\n            border-radius: 8px;\n            max-width: 100%;\n\n            \/* \u2705 elak teks panjang pecah layout *\/\n            white-space: normal;\n            overflow-wrap: anywhere;\n            min-width: 0;\n        }\n\n        \/* \u2705 Padatkan label nombor *\/\n        #numberList label {\n            padding: 4px 8px;\n            gap: 6px;\n            font-size: 13px;\n            line-height: 1.25;\n        }\n\n        \/* ===== RESPONSIVE ======================================================= *\/\n        @media (max-width: 700px) {\n            .btn {\n                font-size: 13px;\n                min-width: 90px;\n                padding: 8px 6px;\n                margin: 3px 2px 0 0;\n            }\n\n            .card {\n                padding: 12px 7px;\n                border-radius: 10px;\n            }\n\n            h1 {\n                font-size: 22px;\n                padding-bottom: 10px;\n            }\n        }\n\n        @media (max-width: 560px) {\n\n            #numberList,\n            #groupList {\n                grid-template-columns: 1fr;\n            }\n\n            \/* telefon: 1 lajur *\/\n        }\n\n        @media (min-width: 768px) {\n\n            #numberList,\n            #groupList {\n                grid-template-columns: repeat(2, 1fr);\n            }\n        }\n\n        @media (min-width: 992px) {\n\n            #numberList,\n            #groupList {\n                grid-template-columns: repeat(3, 1fr);\n            }\n        }\n\n        @media (min-width: 1280px) {\n\n            #numberList,\n            #groupList {\n                grid-template-columns: repeat(4, 1fr);\n            }\n        }\n\n        \/* ===== COLLAPSIBLE SETTINGS PANEL ===================================== *\/\n        .settings-wrap {\n            margin-bottom: 18px;\n        }\n\n        .settings-header {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            background: #ffffff;\n            border-left: 7px solid var(--clr-primary);\n            border-radius: 16px;\n            padding: 14px 16px;\n            box-shadow: var(--shadow-1);\n            border: 1px solid rgba(0, 0, 0, .06);\n            cursor: pointer;\n            user-select: none;\n        }\n\n        .settings-header .title {\n            font-weight: 800;\n            color: var(--clr-primary-d);\n            display: flex;\n            align-items: center;\n            gap: 10px;\n        }\n\n        .settings-header .meta {\n            font-size: 12px;\n            color: #2d6a3d;\n            opacity: .85;\n        }\n\n        .settings-header .chev {\n            font-size: 18px;\n            transition: transform .18s ease;\n        }\n\n        .settings-header[data-open=\"0\"] .chev {\n            transform: rotate(-90deg);\n        }\n\n        .settings-body {\n            margin-top: 10px;\n        }\n\n        .settings-body[hidden] {\n            display: none;\n        }\n\n        \/* butang kecil quick scroll *\/\n        .settings-actions {\n            display: flex;\n            gap: 8px;\n            flex-wrap: wrap;\n            margin-top: 10px;\n        }\n\n        .btn-mini {\n            padding: 6px 10px;\n            border-radius: 10px;\n            border: 1px dashed rgba(0, 0, 0, .18);\n            background: #f7fcfa;\n            cursor: pointer;\n            font-size: 13px;\n            color: #185734;\n        }\n\n        .btn-mini:hover {\n            border-style: solid;\n        }\n    <\/style>\n\n<\/head>\n\n<body>\n\n    <main class=\"page\"> <!-- \u2b05\ufe0f BALUT DI SINI -->\n\n        <!-- \u2705 STATUS HEADER (Hanya paparkan selepas login) -->\n        <div id=\"statusHeader\" style=\"display: none;\">\n            <div id=\"topUserStatus\"\n                style=\"background: #f1f8e9; border: 1px solid #c5e1a5; padding: 15px; border-radius: 10px; margin-bottom: 30px; display: flex; flex-wrap: wrap; justify-content: space-between; gap: 30px; font-size: 14px;\">\n                <div>\n                    <div>\ud83d\udce7 <strong>Email:<\/strong> <span id=\"userEmail\">\u2013<\/span><\/div>\n                    <div>\ud83d\udcbc <strong>Pakej:<\/strong> <span id=\"infoPakej\">\u2013<\/span><\/div>\n                    <div>\ud83d\udce4 <strong>Mesej Baki:<\/strong> <span id=\"infoMesej\">\u2013<\/span> (<span id=\"infoHari\">\u2013<\/span>\n                        hari)\n                    <\/div>\n                    <div>\ud83d\udcf1 <strong>WhatsApp Aktif:<\/strong> <span id=\"infoNombor\">\u2013<\/span><\/div>\n                <\/div>\n                <div style=\"margin-left: auto; align-self: center; text-align: right;\">\n                    <a href=\"https:\/\/abatablaster.xyz\/index.php\/telegram-alert\/\"\n                        style=\"display:block; margin-bottom: 8px; color: #1565c0; font-weight: bold;\">\n                        \ud83d\udd14 Sambungkan Telegram\n                    <\/a>\n                    <button onclick=\"logout()\"\n                        style=\"background: #d32f2f; color: white; padding: 6px 15px; border-radius: 6px; border: none;\">\ud83d\udeaa\n                        Log\n                        Keluar<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- \u26a0\ufe0f AMARAN LANGGANAN TAMAT -->\n        <div id=\"amaranLangganan\"\n            style=\"display: none; background: #ffebee; border: 1px solid #f44336; color: #b71c1c; padding: 12px; border-radius: 10px; margin-bottom: 20px; font-weight: bold; text-align: center; animation: blink 1s step-end infinite;\">\n            \u26a0\ufe0f Langganan anda telah tamat atau mesej telah habis. Sila upgrade untuk terus gunakan sistem ini.\n        <\/div>\n\n        <div style=\"text-align: center; margin-bottom: 30px;\">\n            <img decoding=\"async\" style=\"max-width: 180px; border-radius: 12px; box-shadow: 0 4px 10px rgba(0,0,0,0.2);\"\n                src=\"https:\/\/abatablaster.xyz\/wp-content\/uploads\/2025\/05\/photo_2024-05-16_15-47-59.jpg\"\n                alt=\"Abata Blaster Logo\" \/>\n        <\/div>\n\n        <div class=\"card\" id=\"warmupPairingNotice\"\n            style=\"border-left: 7px solid #ffb300; background: #fffde7; color: #7b5e09; margin-bottom: 24px;\">\n            <b>Nota Penting (Warmup Pairing untuk Nombor Baru):<\/b>\n            <ul style=\"margin-top:6px;\">\n                <li>Jika anda baru membeli\/menambah nombor WhatsApp, sangat digalakkan <b>guna fungsi <a\n                            href='https:\/\/abatablaster.xyz\/index.php\/warmup-pairing'\n                            style='color:#ff9800;text-decoration:underline;font-weight:bold;'>Warmup Pairing<\/a><\/b>\n                    dahulu.\n                <\/li>\n                <li>Warmup Pairing bantu kuatkan \u201ctrust\u201d akaun baru dan <b>kurangkan risiko banned<\/b>.<\/li>\n                <li><b>JANGAN<\/b> jalankan \u201cSmart Warmup\/Blast\u201d dan \u201cWarmup Pairing\u201d serentak pada nombor yang sama.\n                <\/li>\n            <\/ul>\n        <\/div>\n\n        <!-- Pilih Nombor -->\n        <div class=\"card card-number\">\n            <h3>Pilih Nombor Aktif<\/h3>\n            <div id=\"numberList\"><\/div>\n        <\/div>\n\n        <!-- \u2705 COLLAPSIBLE SETTINGS (Start dari Pilih Mode \u2192 Lampiran Media) -->\n        <div class=\"settings-wrap\" id=\"settingsWrap\">\n\n            <!-- Header toggle -->\n            <div class=\"settings-header\" id=\"settingsToggle\" data-open=\"1\">\n                <div>\n                    <div class=\"title\">\u2699\ufe0f Settings Smart Warmup \/ Blast <span class=\"meta\">(Klik untuk\n                            buka\/tutup)<\/span><\/div>\n                    <div class=\"meta\" id=\"settingsSummary\">Mode: \u2013 \u2022 Timer: \u2013 \u2022 Media: \u2013<\/div>\n                <\/div>\n                <div class=\"chev\">\u25be<\/div>\n            <\/div>\n\n            <!-- Body yang boleh collapse -->\n            <div class=\"settings-body\" id=\"settingsBody\">\n\n                <div class=\"card\">\n                    <h3>Pilih Mode Smart Warmer<\/h3>\n                    <label><input type=\"radio\" name=\"modeSelect\" value=\"both\" checked> Warmup + Blast\n                        (Automatik)<\/label><br>\n                    <label><input type=\"radio\" name=\"modeSelect\" value=\"warmup\"> Warmup Sahaja<\/label><br>\n                    <label><input type=\"radio\" name=\"modeSelect\" value=\"blast\"> Blast Sahaja<\/label>\n                <\/div>\n\n                <div class=\"card\">\n                    <h3>Tetapan Timer (Warmup\/Blast)<\/h3>\n                    <label>\n                        <input type=\"checkbox\" id=\"useDefaultTimer\" checked>\n                        Guna Default Timer (disyorkan)\n                    <\/label>\n                    <div id=\"customTimerDiv\" style=\"margin-top:10px;display:none\">\n\n                        <!-- Blok: Warmup 1-on-1 -->\n                        <div class=\"timer-block-ui\" data-timer=\"warmup\">\n                            <div class=\"timer-block-title\">\ud83d\udfe2 Warmup 1-on-1<\/div>\n                            <div class=\"timer-block-info\">\n                                Bot akan blast secara perbualan 1-on-1 antara nombor yang anda pilih. Proses ini bantu\n                                kuatkan\n                                trust\n                                dan activity untuk setiap nombor WhatsApp.\n                            <\/div>\n                            <label>\n                                Tempoh Warmup 1-on-1:\n                                <input type=\"number\" id=\"warmupDurationMin\" value=\"2\" min=\"1\" step=\"0.1\"\n                                    style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"warmupDurationMax\" value=\"3\" min=\"1\" step=\"0.1\"\n                                    style=\"width:60px\"> jam\n                            <\/label><br>\n                            <label>\n                                Delay antara setiap warmup:\n                                <input type=\"number\" id=\"delayWarmupMin\" value=\"15\" min=\"5\" style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"delayWarmupMax\" value=\"30\" min=\"5\" style=\"width:60px\"> saat\n                            <\/label>\n                        <\/div>\n\n                        <!-- Blok: Warmup Group -->\n                        <div class=\"timer-block-ui\" data-timer=\"group\">\n                            <div class=\"timer-block-title\">\ud83d\udd35 Warmup Group<\/div>\n                            <div class=\"timer-block-info\">\n                                Semua nombor dalam group akan blast mesej secara rawak dalam group. Sangat berkesan\n                                untuk\n                                kukuhkan\n                                &#8216;trust&#8217; antara nombor dalam group WhatsApp.\n                            <\/div>\n                            <label>\n                                Tempoh Group Warmup:\n                                <input type=\"number\" id=\"groupWarmupDurationMin\" value=\"1\" min=\"0.5\" step=\"0.1\"\n                                    style=\"width:60px\">\n                                \u2013\n                                <input type=\"number\" id=\"groupWarmupDurationMax\" value=\"2\" min=\"0.5\" step=\"0.1\"\n                                    style=\"width:60px\">\n                                jam\n                            <\/label><br>\n                            <label>\n                                Delay antara group warmup:\n                                <input type=\"number\" id=\"delayGroupMin\" value=\"60\" min=\"10\" style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"delayGroupMax\" value=\"60\" min=\"10\" style=\"width:60px\"> saat\n                            <\/label><br>\n                            <label>\n                                Delay rehat sebelum group warmup:\n                                <input type=\"number\" id=\"restBeforeGroupMin\" value=\"30\" min=\"0\" step=\"1\"\n                                    style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"restBeforeGroupMax\" value=\"60\" min=\"0\" step=\"1\"\n                                    style=\"width:60px\">\n                                minit\n                            <\/label>\n                        <\/div>\n\n                        <!-- Blok: Blasting -->\n                        <div class=\"timer-block-ui\" data-timer=\"blast\">\n                            <div class=\"timer-block-title\">\ud83d\udd34 Blasting<\/div>\n                            <div class=\"timer-block-info\">\n                                Proses utama untuk blast mesej ke semua contact (target). Tetapan di bawah tentukan\n                                kelajuan\n                                blasting &#038; jumlah contact setiap cycle.\n                            <\/div>\n                            <label>\n                                Delay antara blasting:\n                                <input type=\"number\" id=\"delayBlastingMin\" value=\"30\" min=\"5\" style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"delayBlastingMax\" value=\"60\" min=\"5\" style=\"width:60px\"> saat\n                            <\/label><br>\n                            <label>\n                                <b>Contact diblast setiap cycle:<\/b>\n                                <input type=\"number\" id=\"contactPerCycle\" value=\"15\" min=\"1\" max=\"1000\"\n                                    style=\"width:80px;\">\n                                contact\n                            <\/label>\n                        <\/div>\n\n                        <!-- Blok: Cycle -->\n                        <div class=\"timer-block-ui\" data-timer=\"cycle\">\n                            <div class=\"timer-block-title\">\ud83d\udfe1 Cycle (Rehat Selepas Tamat 1 Pusingan)<\/div>\n                            <div class=\"timer-block-info\">\n                                Selepas habis 1 cycle, bot akan rehat seketika sebelum sambung semula untuk cycle\n                                berikutnya.\n                            <\/div>\n                            <label>\n                                Delay rehat selepas complete cycle:\n                                <input type=\"number\" id=\"restAfterCycleMin\" value=\"2\" min=\"0.5\" step=\"0.1\"\n                                    style=\"width:60px\"> \u2013\n                                <input type=\"number\" id=\"restAfterCycleMax\" value=\"3\" min=\"0.5\" step=\"0.1\"\n                                    style=\"width:60px\">\n                                jam\n                            <\/label>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"timer-block\" id=\"endConditionBlock\" style=\"margin-top:10px;\">\n                        <label><b>Sesi Tamat Apabila:<\/b><\/label><br>\n                        <label>\n                            <input type=\"radio\" name=\"endCondition\" value=\"cycle\" checked>\n                            Tamat ikut bilangan cycle (<span id=\"maxCycleLabel\">3<\/span> cycle)\n                        <\/label><br>\n                        <label>\n                            <input type=\"radio\" name=\"endCondition\" value=\"contacts\">\n                            Tamat bila semua contact telah selesai di-blast (walaupun kurang dari bilangan cycle)\n                        <\/label>\n                    <\/div>\n\n                    <div class=\"timer-block\" data-timer=\"cycleLimit\" id=\"cycleLimitBlock\">\n                        <label>\n                            Bilangan cycle warmup:\n                            <input type=\"number\" id=\"maxCycle\" value=\"3\" min=\"1\" style=\"width:60px\"> cycle\n                        <\/label>\n                        <div id=\"cycleEstimateTime\" style=\"font-size:13px;color:#1976d2;margin-top:3px;\"><\/div>\n                    <\/div>\n\n                    <div id=\"customTimerPreview\" style=\"font-size:13px;color:#1976d2;margin-top:5px;\"><\/div>\n                <\/div>\n\n                <div class=\"timer-block-ui\" id=\"pauseResumeBlock\" style=\"margin-top: 18px;\">\n                    <div class=\"timer-block-title\">\u23f8\ufe0f Auto Pause\/Resume<\/div>\n                    <div class=\"timer-block-info\">\n                        <label style=\"font-weight:normal;\">\n                            <input type=\"checkbox\" id=\"autoPauseResumeEnabled\" checked>\n                            Berjalan 24 jam (non-stop)\n                        <\/label>\n                        <div id=\"customPauseResumeDiv\" style=\"margin-top:12px;display:none;\">\n                            <div style=\"display: flex; gap: 18px; flex-wrap: wrap;\">\n                                <label style=\"display:flex;align-items:center;\">\n                                    PAUSE Setiap Hari:\n                                    <input type=\"number\" id=\"autoPauseHour\" value=\"21\" min=\"0\" max=\"23\"\n                                        style=\"width:55px;margin-left:7px;\">:00\n                                <\/label>\n                                <label style=\"display:flex;align-items:center;\">\n                                    &#038; RESUME Setiap Hari:\n                                    <input type=\"number\" id=\"autoResumeHour\" value=\"9\" min=\"0\" max=\"23\"\n                                        style=\"width:55px;margin-left:7px;\">:00\n                                <\/label>\n                            <\/div>\n                            <div style=\"font-size:12px;color:#888;margin-top:6px;\">\n                                (Proses akan diPAUSE setiap hari pada jam yang dipilih. Jika mahu berjalan 24 jam,\n                                biarkan\n                                &#8216;Berjalan\n                                24 jam&#8217; ditanda.)\n                            <\/div>\n                        <\/div>\n                        <span id=\"autoPauseResumeInfo\"\n                            style=\"font-size:13px;color:#1976d2;display:none;display:block;margin-top:10px;\">\n                            Proses akan diPAUSE setiap hari jam <span id=\"infoPauseHour\">21<\/span>:00 &#038; auto sambung\n                            semula jam\n                            <span id=\"infoResumeHour\">9<\/span>:00\n                        <\/span>\n                        <!-- AMARAN PAUSE -->\n                        <div id=\"autoPauseWarningBox\" style=\"\n            background: #fff9c4;\n            border: 1.2px solid #ffe082;\n            padding: 8px 12px 7px 12px;\n            border-radius: 8px;\n            margin: 12px 0 0 0;\n            color: #7b5e09;\n            font-size: 13.5px;\n            line-height: 1.5;\n            box-shadow: 0 2px 7px rgba(247, 201, 49, 0.06);\n            display: flex;\n            align-items: flex-start;\n            gap: 8px;\">\n                            <span style=\"font-size: 17px; margin-right: 6px;\">\u26a0\ufe0f<\/span>\n                            <span>\n                                <b>Peringatan:<\/b> Jika anda aktifkan fungsi <b>Auto Pause\/Resume<\/b>, proses Smart\n                                Warmup\/Blast\n                                akan dijeda secara <b>automatik<\/b> setiap hari pada jam\n                                <span id=\"infoPauseHour2\">21<\/span>:00 dan hanya akan bersambung semula pada jam <span\n                                    id=\"infoResumeHour2\">9<\/span>:00.<br>\n                                <span style=\"color: #b71c1c; font-weight: bold;\">\n                                    Sepanjang tempoh <u>Auto Pause<\/u>, anda <b>tidak boleh Resume\/Pause<\/b> secara\n                                    manual\n                                    sehingga\n                                    auto-pause tamat.\n                                <\/span>\n                            <\/span>\n                        <\/div>\n                        <script>\n                            \/\/ Sync info hour in warning\n                            function syncAutoPauseWarning() {\n                                const pauseH = document.getElementById('autoPauseHour').value;\n                                const resumeH = document.getElementById('autoResumeHour').value;\n                                document.getElementById('infoPauseHour2').textContent = pauseH.padStart(2, '0');\n                                document.getElementById('infoResumeHour2').textContent = resumeH.padStart(2, '0');\n                            }\n                            document.getElementById('autoPauseHour').addEventListener('input', syncAutoPauseWarning);\n                            document.getElementById('autoResumeHour').addEventListener('input', syncAutoPauseWarning);\n                            \/\/ Initial set\n                            setTimeout(syncAutoPauseWarning, 400);\n                        <\/script>\n                    <\/div>\n                <\/div>\n\n                <div class=\"card\" data-section=\"group\">\n                    <h3>Extract &#038; Pilih Group Common<\/h3>\n                    <button id=\"extractGroupsBtn\" class=\"btn\">Extract Group<\/button>\n                    <div id=\"groupList\"><\/div>\n                <\/div>\n\n                <!-- Upload Contact -->\n                <div class=\"card\" data-section=\"upload\">\n                    <h3>Upload Contact List (CSV\/JSON)<\/h3>\n                    <input type=\"file\" id=\"fileInput\"\n                        accept=\".csv,.json,text\/csv,application\/json,text\/plain,application\/vnd.ms-excel\">\n                    <button id=\"downloadCsvTemplateBtn\" class=\"btn\" type=\"button\"\n                        style=\"margin-left:10px;background:#1976d2;\">Download Contoh CSV<\/button>\n                    <div style=\"font-size:12px;color:#666;margin-top:3px;\">\n                        *Pastikan anda guna format CSV yang sama untuk personalized mesej. Field pertama WAJIB\n                        <b>no_tel<\/b>.\n                    <\/div>\n\n                    <!-- \u2b07\ufe0f PROGRESS UI BARU -->\n                    <div id=\"uploadProgressWrap\" style=\"display:none;margin-top:10px;\">\n                        <div style=\"height:10px;background:#e0f2f1;border-radius:6px;overflow:hidden;\">\n                            <div id=\"uploadProgressBar\" style=\"height:10px;width:0%;background:#26a69a;\"><\/div>\n                        <\/div>\n                        <div id=\"uploadProgressText\" style=\"font-size:12px;color:#1565c0;margin-top:6px;\">\n                            Menunggu&#8230;\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- SECTION: XLSX to CSV Converter (Collapsible) -->\n                <div class=\"card\" id=\"xlsxConverterCard\"\n                    style=\"background:#f7fcfa;border-left:7px solid #00bfa5; margin-bottom:18px;\">\n                    <button id=\"toggleConverterBtn\" type=\"button\"\n                        style=\"background:#009688;color:#fff;padding:7px 16px;border-radius:7px;border:none;font-size:14px;cursor:pointer;font-weight:600;margin-bottom:8px;\">\n                        \u2b07\ufe0f Tukar Excel ke CSV? (Klik untuk buka\/tutup)\n                    <\/button>\n                    <div id=\"xlsxToCsvSection\" style=\"display:none;\">\n                        <div style=\"background:#e8f5e9;padding:14px 18px;border-radius:10px;\">\n                            <b>Convert fail Excel (.xlsx) ke CSV<\/b>\n                            <div style=\"font-size:13px;color:#333;margin-bottom:7px;\">Jika anda terima contact dalam\n                                format\n                                Excel,\n                                boleh convert di sini sebelum upload ke sistem.<\/div>\n                            <input type=\"file\" id=\"xlsxFile\" accept=\".xlsx\" style=\"margin-bottom:8px;\">\n                            <button id=\"convertBtn\" onclick=\"convertXLSXtoCSV()\"\n                                style=\"padding:6px 16px;background:#43a047;color:#fff;border-radius:6px;\">Convert<\/button>\n                            <a id=\"downloadCsvBtn\" href=\"#\"\n                                style=\"display:none;margin-left:18px;padding:6px 16px;background:#43a047;color:#fff;border-radius:5px;text-decoration:none;\">Download\n                                .csv<\/a>\n                            <div id=\"csvPreview\" style=\"margin-top:12px;font-size:13px;color:#444;\"><\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div id=\"fieldsPreview\" style=\"margin-top:10px;color:#444;font-size:13px\"><\/div>\n                <div id=\"previewMessage\" style=\"margin:10px 0;color:#2e7d32;font-size:14px\"><\/div>\n\n                <!-- Mesej Blast -->\n                <div class=\"card\" data-section=\"blast\">\n                    <h3>Masukkan Mesej Blast<\/h3>\n                    <textarea id=\"blastMessage\" rows=\"3\" style=\"width:100%;\"\n                        placeholder=\"Hi! Ini warm-up blast dari team saya.\"><\/textarea>\n                <\/div>\n\n                <div class=\"card\" data-section=\"media\">\n                    <h3>Lampiran Media (Pilih 1 Sahaja)<\/h3>\n                    <div style=\"font-size:13px;color:#b71c1c;margin-bottom:8px;\">\n                        *Hanya boleh upload <b>1 jenis media sahaja dalam satu sesi.<\/b> Jika ingin tukar, sila klik\n                        <b>Clear<\/b>\n                        untuk upload media lain.\n                    <\/div>\n                    <div id=\"mediaUploadFields\">\n                        <div style=\"margin-bottom:8px;\" id=\"imageInputBlock\">\n                            <label>Gambar (JPG\/PNG):<\/label>\n                            <input type=\"file\" id=\"blastImageInput\" accept=\"image\/*\">\n                            <button type=\"button\" id=\"clearImageInput\"\n                                style=\"display:none;margin-left:6px;\">Clear<\/button>\n                            <span id=\"uploadedImagePreview\"><\/span>\n                        <\/div>\n                        <div style=\"margin-bottom:8px;\" id=\"audioInputBlock\">\n                            <label>Audio (MP3\/OGG):<\/label>\n                            <input type=\"file\" id=\"blastAudioInput\" accept=\"audio\/*\">\n                            <button type=\"button\" id=\"clearAudioInput\"\n                                style=\"display:none;margin-left:6px;\">Clear<\/button>\n                            <span id=\"uploadedAudioPreview\"><\/span>\n\n                            <!-- \u2705 NEW: voice note option (match smart-warmup.js) -->\n                            <label\n                                style=\"display:flex;align-items:center;gap:8px;margin-top:6px;font-size:13px;color:#185734;\">\n                                <input type=\"checkbox\" id=\"isVoiceNote\">\n                                Hantar audio sebagai Voice Note\n                            <\/label>\n                        <\/div>\n                        <div style=\"margin-bottom:8px;\" id=\"videoInputBlock\">\n                            <label>Video (MP4\/MOV):<\/label>\n                            <input type=\"file\" id=\"blastVideoInput\" accept=\"video\/*\">\n                            <button type=\"button\" id=\"clearVideoInput\"\n                                style=\"display:none;margin-left:6px;\">Clear<\/button>\n                            <span id=\"uploadedVideoPreview\"><\/span>\n                            <div id=\"videoPreviewWrapper\" style=\"margin-top:8px;min-height:40px;\"><\/div>\n                        <\/div>\n\n                        <div style=\"margin-bottom:8px;\" id=\"docInputBlock\">\n                            <label>Dokumen (PDF, DOCX):<\/label>\n                            <input type=\"file\" id=\"blastDocInput\" accept=\".pdf,.doc,.docx,.txt,.xls,.xlsx,.ppt,.pptx\">\n                            <button type=\"button\" id=\"clearDocInput\"\n                                style=\"display:none;margin-left:6px;\">Clear<\/button>\n                            <span id=\"uploadedDocPreview\"><\/span>\n                        <\/div>\n                    <\/div>\n                    <div style=\"font-size:12px;color:#888;\">*Setiap media adalah pilihan, upload jika perlu sahaja.<br>\n                        Limit saiz: Gambar\/Audio \u2264 5MB, Video \u2264 20MB, Dokumen \u2264 10MB.\n                    <\/div>\n                <\/div>\n\n                <!-- Start\/Stop Button -->\n                <div class=\"card\" style=\"display: flex; flex-wrap: wrap; gap: 8px;\">\n                    <button id=\"startBtn\" class=\"btn\">Start fungsi SMART<\/button>\n                    <button id=\"stopBtn\" class=\"btn\" style=\"background:#c62828;\">Stop<\/button>\n\n                    <!-- PAUSE overlay -->\n                    <div style=\"position:relative; display:inline-block;\">\n                        <button id=\"pauseBtn\" class=\"btn\" style=\"background:#ff9800;\">Pause<\/button>\n                        <div id=\"pauseBtnOverlay\"\n                            style=\"display:none; position:absolute; left:0; top:0; width:100%; height:100%; z-index:5; cursor:not-allowed;\">\n                        <\/div>\n                    <\/div>\n\n                    <!-- RESUME overlay -->\n                    <div style=\"position:relative; display:inline-block;\">\n                        <button id=\"resumeBtn\" class=\"btn\" style=\"background:#039be5;\">Resume<\/button>\n                        <div id=\"resumeBtnOverlay\"\n                            style=\"display:none; position:absolute; left:0; top:0; width:100%; height:100%; z-index:5; cursor:not-allowed;\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- optional: quick actions -->\n                <div class=\"settings-actions\">\n                    <button class=\"btn-mini\" type=\"button\"\n                        onclick=\"document.getElementById('statusNow')?.scrollIntoView({behavior:'smooth',block:'start'})\">\u2b07\ufe0f\n                        Lompat ke Status<\/button>\n                    <button class=\"btn-mini\" type=\"button\"\n                        onclick=\"document.getElementById('logBlastTable')?.scrollIntoView({behavior:'smooth',block:'start'})\">\u2b07\ufe0f\n                        Lompat ke Log<\/button>\n                    <button class=\"btn-mini\" type=\"button\" onclick=\"window.scrollTo({top:0,behavior:'smooth'})\">\u2b06\ufe0f Ke\n                        Atas<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Progress -->\n        <div class=\"card\">\n            <h3>Status &#038; Progress<\/h3>\n            <div><b>Status Sesi:<\/b> <span id=\"statusNow\" style=\"color:#2e7d32;\">&#8211;<\/span><\/div>\n            <div id=\"progressArea\" style=\"white-space: pre-line;\">Belum bermula&#8230;<\/div>\n        <\/div>\n\n\n        <div class=\"card\" id=\"cycleInfoCard\" style=\"margin-bottom:10px;\">\n            <b>Anda kini berada di cycle:<\/b> <span id=\"cycleNow\">&#8211;<\/span>\n        <\/div>\n\n        <!-- === TAMBAH INI DI SINI === -->\n        <div class=\"card\">\n            <h3>Log Blasting (LIVE)<\/h3>\n            <div style=\"color:#888; font-size:13px; margin-bottom:5px;\">\n                \u26a0\ufe0f Paparan ini hanya tunjuk 100 log blasting terbaru sahaja.<br>\n                Untuk semua log blasting penuh, sila download <b>Report CSV<\/b> di bawah.\n            <\/div>\n            <div style=\"max-height:400px;overflow:auto;\">\n                <table id=\"logBlastTable\" style=\"width:100%;font-size:13px;\">\n                    <thead>\n                        <tr>\n                            <th>Bil<\/th>\n                            <th>No.Target<\/th>\n                            <th>Status<\/th>\n                            <th>Status Selepas Retry<\/th>\n                            <th>Retry Ke-<\/th>\n                            <th>Dari Status<\/th>\n                            <th>Masa<\/th>\n                            <th>Dari Nombor<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                    <\/tbody>\n                <\/table>\n            <\/div>\n            <!-- Button download report letak di sini, di luar table -->\n            <button id=\"downloadReportBtn\" class=\"btn\" style=\"background:#1976d2;margin-top:10px;\">Download Report\n                CSV<\/button>\n            <button id=\"downloadRemainingBtn\" class=\"btn btn-outline-primary\">\n                \u2b07\ufe0f Download Baki Contact (Belum Diblast)\n            <\/button>\n\n        <\/div>\n    <\/main> <!-- \u2b05\ufe0f TUTUP DI SINI -->\n\n    <script src=\"\/js\/smart-warmup.js\"><\/script>\n\n    <script>\n        (function () {\n            const toggle = document.getElementById('settingsToggle');\n            const body = document.getElementById('settingsBody');\n            const summary = document.getElementById('settingsSummary');\n\n            if (!toggle || !body) return;\n\n            \/\/ restore state\n            const saved = localStorage.getItem('smartwarmup_settings_open');\n            const open = (saved === null) ? true : (saved === '1');\n\n            function setOpen(v) {\n                toggle.dataset.open = v ? \"1\" : \"0\";\n                body.hidden = !v;\n                localStorage.setItem('smartwarmup_settings_open', v ? '1' : '0');\n            }\n\n            \/\/ init\n            setOpen(open);\n\n            \/\/ click toggle\n            toggle.addEventListener('click', () => {\n                const nowOpen = toggle.dataset.open === \"1\";\n                setOpen(!nowOpen);\n            });\n\n            \/\/ optional: ringkasan cepat (mode + timer + media) \u2014 supaya bila collapse pun user nampak\n            function updateSummary() {\n                \/\/ mode\n                const m = document.querySelector('input[name=\"modeSelect\"]:checked')?.value || \"-\";\n                const modeLabel = m === 'both' ? 'Warmup+Blast' : (m === 'warmup' ? 'Warmup' : (m === 'blast' ? 'Blast' : m));\n\n                \/\/ timer\n                const defT = document.getElementById('useDefaultTimer')?.checked;\n                const timerLabel = defT ? 'Default' : 'Custom';\n\n                \/\/ media detect (1 sahaja)\n                const hasImg = !!document.getElementById('blastImageInput')?.files?.length;\n                const hasAud = !!document.getElementById('blastAudioInput')?.files?.length;\n                const hasVid = !!document.getElementById('blastVideoInput')?.files?.length;\n                const hasDoc = !!document.getElementById('blastDocInput')?.files?.length;\n\n                let media = 'Tiada';\n                if (hasImg) media = 'Gambar';\n                else if (hasAud) media = 'Audio';\n                else if (hasVid) media = 'Video';\n                else if (hasDoc) media = 'Dokumen';\n\n                const selectedNum =\n                    document.querySelector('#numberList input[type=\"radio\"]:checked')?.value ||\n                    document.querySelector('#numberList input[type=\"checkbox\"]:checked')?.value ||\n                    '-';\n\n                if (summary) summary.textContent =\n                    `Nombor: ${selectedNum} \u2022 Mode: ${modeLabel} \u2022 Timer: ${timerLabel} \u2022 Media: ${media}`;\n            }\n\n            \/\/ hook perubahan\n            document.addEventListener('change', (e) => {\n                const id = e.target?.id || '';\n                const nm = e.target?.name || '';\n                if (nm === 'modeSelect' || id === 'useDefaultTimer' ||\n                    id === 'blastImageInput' || id === 'blastAudioInput' ||\n                    id === 'blastVideoInput' || id === 'blastDocInput') {\n                    updateSummary();\n                }\n            });\n\n            \/\/ init summary\n            setTimeout(updateSummary, 300);\n\n            \/\/ \u2705 Auto-collapse bila Start ditekan (optional)\n            document.getElementById('startBtn')?.addEventListener('click', () => {\n                setOpen(false);\n            });\n\n            document.getElementById('stopBtn')?.addEventListener('click', () => {\n                setOpen(true);\n            });\n        })();\n    <\/script>\n\n<\/body>\n\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Smart Warmer \u2013 AbataBlaster \ud83d\udce7 Email: \u2013 \ud83d\udcbc Pakej: \u2013 \ud83d\udce4 Mesej Baki: \u2013 (\u2013 hari) \ud83d\udcf1 WhatsApp Aktif: \u2013 \ud83d\udd14 Sambungkan Telegram \ud83d\udeaa Log Keluar \u26a0\ufe0f Langganan anda telah tamat atau mesej telah habis. Sila upgrade untuk terus gunakan sistem ini. Nota Penting (Warmup Pairing untuk Nombor Baru): Jika anda baru membeli\/menambah nombor WhatsApp, [&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-602","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=602"}],"version-history":[{"count":115,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/602\/revisions"}],"predecessor-version":[{"id":1375,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/602\/revisions\/1375"}],"wp:attachment":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}