{"id":2908,"date":"2026-06-13T03:28:36","date_gmt":"2026-06-13T03:28:36","guid":{"rendered":"https:\/\/nopassdev.com\/?page_id=2908"},"modified":"2026-06-13T04:31:42","modified_gmt":"2026-06-13T04:31:42","slug":"all-in-win","status":"publish","type":"page","link":"https:\/\/nopassdev.com\/fr\/all-in-win\/","title":{"rendered":"all in win"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2908\" class=\"elementor elementor-2908\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c13f7ed e-flex e-con-boxed e-con e-parent\" data-id=\"c13f7ed\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f5e618 elementor-widget elementor-widget-heading\" data-id=\"1f5e618\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">All in win \u9760\u767d\u5ad6\u54e5<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7bfec8e elementor-widget elementor-widget-shortcode\" data-id=\"7bfec8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">           <div id=\"npoa-1\" class=\"npoa-wrap\"\n               data-currency=\"\">\n            <div class=\"npoa-card\">\n                <h3 class=\"npoa-title\">\u6bd4\u5206\u8d54\u7387\u5206\u914d\u5668<\/h3>\n\n                <div class=\"npoa-input\">\n                    <label for=\"npoa-1-raw\">\u8d54\u7387\u6570\u636e\u8f93\u5165<\/label>\n                    <textarea\n                        id=\"npoa-1-raw\"\n                        class=\"npoa-raw\"\n                        rows=\"13\"\n                        placeholder=\"\u4e3b\u961f \u80dc\\n- 1-0\uff1a14\\n- 2-1\uff1a81\\n\\n\u548c\u5c40\\n- 0-0\uff1a3.2\\n\\n\u5ba2\u961f \u80dc\\n- 0-1\uff1a3\"\n                    ><\/textarea>\n                    <p class=\"npoa-hint\">\u683c\u5f0f\uff1a\u53ef\u5199\u201c### \u6807\u9898\u201d\u6216\u76f4\u63a5\u5199\u201c\u5361\u5854\u5c14 \u80dc\/\u548c\u5c40\/\u745e\u58eb \u80dc\u201d\uff1b\u8d54\u7387\u884c\u652f\u6301 \u201c- \u6bd4\u5206:\u8d54\u7387\u201d \u548c \u201c- \u59272.5:\u8d54\u7387 \/ \u5c0f2.5:\u8d54\u7387 \/ Over 2.5:\u8d54\u7387\u201d\u3002\u672a\u5199\u6807\u9898\u65f6\u4f1a\u81ea\u52a8\u5f52\u7c7b\u3002<\/p>\n                <\/div>\n\n                <div class=\"npoa-controls\">\n                    <label>\n                        \u603b\u6295\u5165\n                        <input type=\"number\" class=\"npoa-total\" min=\"0\" step=\"0.1\" inputmode=\"decimal\" value=\"100\" \/>\n                    <\/label>\n                    <label>\n                        \u6295\u5165\u500d\u6570\n                        <input type=\"number\" class=\"npoa-total-multiplier\" min=\"0.1\" step=\"0.1\" inputmode=\"decimal\" value=\"1\" \/>\n                    <\/label>\n                    <label>\n                        \u6700\u5927\u4e8f\u635f%\n                        <input type=\"number\" class=\"npoa-loss-target\" min=\"0\" max=\"90\" step=\"1\" value=\"10\" \/>\n                    <\/label>\n                    <label>\n                        \u9ad8\u8d54\u503e\u659c\n                        <input type=\"range\" class=\"npoa-odds-bias\" min=\"0\" max=\"100\" step=\"1\" value=\"70\" \/>\n                    <\/label>\n                    <label>\n                        \u4f4e\u8d54\u9608\u503c\n                        <input type=\"number\" class=\"npoa-low-threshold\" min=\"2\" max=\"30\" step=\"0.1\" value=\"8\" \/>\n                    <\/label>\n                    <label>\n                        \u4f4e\u8d54\u500d\u6570\n                        <select class=\"npoa-low-multiplier\">\n                            <option value=\"1\">1x<\/option>\n                            <option value=\"2\" selected>2x<\/option>\n                            <option value=\"3\">3x<\/option>\n                        <\/select>\n                    <\/label>\n                    <label>\n                        \u91cd\u70b9\u73a9\u6cd5\n                        <select class=\"npoa-focus-market\">\n                            <option value=\"balanced\" selected>\u5747\u8861<\/option>\n                            <option value=\"ou\">\u5927\u5c0f\u7403\u4f18\u5148<\/option>\n                            <option value=\"score\">\u6bd4\u5206\u4f18\u5148<\/option>\n                        <\/select>\n                    <\/label>\n                    <label>\n                        \u91cd\u70b9\u52a0\u6743\n                        <input type=\"range\" class=\"npoa-focus-boost\" min=\"100\" max=\"300\" step=\"10\" value=\"180\" \/>\n                    <\/label>\n                    <label class=\"npoa-checkall\">\n                        <input type=\"checkbox\" class=\"npoa-auto-ignore\" \/> \u81ea\u52a8\u5ffd\u7565\u9ad8\u8d54\u7387\n                    <\/label>\n                    <label>\n                        \u9ad8\u8d54\u7387\u4e0a\u9650\n                        <input type=\"number\" class=\"npoa-max-odd\" min=\"1.1\" max=\"500\" step=\"0.1\" value=\"30\" \/>\n                    <\/label>\n                    <label>\n                        \u6982\u7387\u4f18\u5148\n                        <input type=\"range\" class=\"npoa-prob-priority\" min=\"0\" max=\"100\" step=\"1\" value=\"60\" \/>\n                    <\/label>\n                    <label>\n                        \u6392\u9664\u603b\u8fdb\u7403\n                        <input type=\"text\" class=\"npoa-excluded-goals\" placeholder=\"\u5982 8 \u8868\u793a\u6392\u9664 8+\uff1b\u6216 0,1,2\" \/>\n                    <\/label>\n                    <button type=\"button\" class=\"npoa-apply-goal-filter\">\u6309\u603b\u8fdb\u7403\u6392\u9664<\/button>\n                    <label class=\"npoa-checkall\">\n                        <input type=\"checkbox\" class=\"npoa-buy-all\"  checked='checked' \/> \u5168\u90e8\u8d2d\u4e70\n                    <\/label>\n                    <label class=\"npoa-checkall\">\n                        <input type=\"checkbox\" class=\"npoa-flat20\" \/> \u5168\u90e8\u6700\u4f4e 20\n                    <\/label>\n                    <label class=\"npoa-checkall\">\n                        <input type=\"checkbox\" class=\"npoa-flat40\" \/> \u5168\u90e8\u5e73\u5747 40\n                    <\/label>\n                    <span class=\"npoa-unit-note\">\u6295\u6ce8\u5355\u4f4d\uff1a10\uff1b\u6bcf\u9879\u6700\u4f4e\uff1a20<\/span>\n                    <button type=\"button\" class=\"npoa-analyze-combos\">\u62c6\u5206\u7ec4\u5408\u5206\u6790<\/button>\n                <\/div>\n\n                <div class=\"npoa-goal-shortcuts\">\n                    <span class=\"npoa-presets-label\">\u603b\u8fdb\u7403\u5feb\u6377\u6392\u9664<\/span>\n                    <button type=\"button\" class=\"npoa-goal-shortcut\" data-goals=\"0,1\">\u6392\u9664 0-1 \u7403<\/button>\n                    <button type=\"button\" class=\"npoa-goal-shortcut\" data-goals=\"4,5,6,7,8,9\">\u6392\u9664 4+ \u7403<\/button>\n                    <button type=\"button\" class=\"npoa-goal-shortcut\" data-goals=\"0,1,4,5,6,7,8,9\">\u53ea\u4fdd\u7559 2-3 \u7403<\/button>\n                    <button type=\"button\" class=\"npoa-goal-shortcut\" data-goals=\"\">\u6e05\u7a7a\u6392\u9664<\/button>\n                <\/div>\n\n                <div class=\"npoa-recommend-box\">\n                    <span class=\"npoa-recommend-text\">\u63a8\u8350\u65b9\u6848\uff1a-<\/span>\n                    <button type=\"button\" class=\"npoa-apply-recommend\" disabled>\u5957\u7528\u63a8\u8350<\/button>\n                <\/div>\n\n                <div class=\"npoa-presets\">\n                    <span class=\"npoa-presets-label\">\u4e00\u952e\u6a21\u677f<\/span>\n                    <button type=\"button\" class=\"npoa-preset\" data-preset=\"conservative\">\u7a33\u5065<\/button>\n                    <button type=\"button\" class=\"npoa-preset\" data-preset=\"balanced\">\u5e73\u8861<\/button>\n                    <button type=\"button\" class=\"npoa-preset\" data-preset=\"aggressive\">\u6fc0\u8fdb<\/button>\n                    <button type=\"button\" class=\"npoa-export-image\">\u5bfc\u51fa\u56fe\u7247<\/button>\n                <\/div>\n                <div class=\"npoa-export-note\">\u5bfc\u51fa\u56fe\u7247\u4ec5\u4e0b\u8f7d\u5230\u4f60\u5f53\u524d\u8bbe\u5907\uff0c\u672c\u529f\u80fd\u4e0d\u4f1a\u4e0a\u4f20\u6216\u4fdd\u5b58\u5230\u7f51\u7ad9\u670d\u52a1\u5668\u3002<\/div>\n\n                <div class=\"npoa-parse-status\"><\/div>\n\n                <div class=\"npoa-metrics\">\n                    <div class=\"npoa-metric-card\">\n                        <span>\u5f53\u524d\u6700\u5dee\u8fd4\u8fd8<\/span>\n                        <strong class=\"npoa-min-payout\">-<\/strong>\n                    <\/div>\n                    <div class=\"npoa-metric-card\">\n                        <span>\u5f53\u524d\u4fdd\u5e95\u76c8\u4e8f<\/span>\n                        <strong class=\"npoa-min-profit\">-<\/strong>\n                    <\/div>\n                    <div class=\"npoa-metric-card\">\n                        <span>\u4e0d\u4e8f\u6700\u4f4e\u6295\u5165<\/span>\n                        <strong class=\"npoa-min-noloss\">-<\/strong>\n                    <\/div>\n                    <div class=\"npoa-metric-card\">\n                        <span>\u7406\u8bba\u6700\u4f4e\u4e8f\u635f%<\/span>\n                        <strong class=\"npoa-best-loss-rate\">-<\/strong>\n                    <\/div>\n                    <div class=\"npoa-metric-card npoa-primary-metric\">\n                        <span>\u98ce\u9669\u76ee\u6807\u6700\u4f4e\u6295\u5165<\/span>\n                        <strong class=\"npoa-min-required\">-<\/strong>\n                        <button type=\"button\" class=\"npoa-apply-min\" disabled>\u5957\u7528\u8be5\u91d1\u989d<\/button>\n                    <\/div>\n                    <div class=\"npoa-metric-card\">\n                        <span>\u5f53\u524d\u6700\u9ad8\u76c8\u5229<\/span>\n                        <strong class=\"npoa-max-profit\">-<\/strong>\n                    <\/div>\n                <\/div>\n\n                <div class=\"npoa-groups\"><\/div>\n\n                <div class=\"npoa-result\">\n                    <div class=\"npoa-summary\"><\/div>\n                    <table>\n                        <thead>\n                            <tr>\n                                <th>\u9009\u9879<\/th>\n                                <th>\u8d54\u7387<\/th>\n                                <th>\u5efa\u8bae\u6295\u5165<\/th>\n                                <th>\u547d\u4e2d\u8fd4\u8fd8<\/th>\n                            <\/tr>\n                        <\/thead>\n                        <tbody class=\"npoa-result-body\"><\/tbody>\n                    <\/table>\n                <\/div>\n\n                <div class=\"npoa-combo-panel\">\n                    <h4>\u53ef\u4fdd\u672c\u5b50\u7ec4\u5408\uff08\u57fa\u4e8e\u5f53\u524d\u52fe\u9009\uff09<\/h4>\n                    <div class=\"npoa-combo-note\">\u70b9\u51fb\u201c\u62c6\u5206\u7ec4\u5408\u5206\u6790\u201d\u540e\u81ea\u52a8\u8ba1\u7b97\u3002<\/div>\n                    <table>\n                        <thead>\n                            <tr>\n                                <th>\u7ec4\u5408<\/th>\n                                <th>\u8d54\u7387\u5012\u6570\u548c<\/th>\n                                <th>\u6700\u5c11\u4e0d\u4e8f\u6295\u5165<\/th>\n                            <\/tr>\n                        <\/thead>\n                        <tbody class=\"npoa-combo-body\"><\/tbody>\n                    <\/table>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <style>\n        .npoa-wrap{margin:18px 0}\n        .npoa-card{border:1px solid #d5dee8;border-radius:10px;padding:20px;background:#f8fbff;box-shadow:0 12px 34px rgba(18,48,78,.08)}\n        .npoa-title{margin:0 0 14px;font-size:22px;line-height:1.2}\n        .npoa-input{margin-bottom:14px;background:#fff;border:1px solid #dbe5ef;border-radius:10px;padding:12px}\n        .npoa-input label{display:block;font-weight:600;margin-bottom:6px}\n        .npoa-raw{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px;line-height:1.45;border:1px solid #cdd5df;border-radius:10px;padding:10px;box-sizing:border-box;resize:vertical;background:#ffffff}\n        .npoa-hint{margin:6px 0 0;color:#4f5b68;font-size:13px}\n        .npoa-controls{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:12px;background:#fff;border:1px solid #dbe5ef;border-radius:10px;padding:12px}\n        .npoa-controls label{display:flex;gap:8px;align-items:center;font-weight:600}\n        .npoa-controls input[type=\"number\"]{width:180px}\n        .npoa-controls input.npoa-total-multiplier{width:85px}\n        .npoa-controls input.npoa-loss-target{width:90px}\n        .npoa-controls input.npoa-odds-bias{width:120px}\n        .npoa-controls input.npoa-low-threshold{width:90px}\n        .npoa-controls select.npoa-low-multiplier{height:32px;border:1px solid #cbd8e6;border-radius:6px;padding:0 6px}\n        .npoa-controls select.npoa-focus-market{height:32px;border:1px solid #cbd8e6;border-radius:6px;padding:0 6px}\n        .npoa-controls input.npoa-focus-boost{width:120px}\n        .npoa-controls input.npoa-max-odd{width:95px}\n        .npoa-controls input.npoa-prob-priority{width:120px}\n        .npoa-controls input.npoa-excluded-goals{width:120px}\n        .npoa-checkall{padding:6px 10px;border-radius:8px;background:#eef5ff}\n        .npoa-unit-note{font-size:13px;color:#39536d;background:#eff4fa;border:1px solid #d9e5f1;padding:6px 10px;border-radius:8px}\n        .npoa-analyze-combos{border:1px solid #1f4d77;background:#1f5f95;color:#fff;padding:7px 12px;border-radius:9px;font-size:14px;cursor:pointer}\n        .npoa-analyze-combos:hover{background:#184f7b}\n        .npoa-apply-goal-filter{border:1px solid #7898b7;background:#fff;color:#214d73;padding:7px 12px;border-radius:9px;font-size:14px;cursor:pointer}\n        .npoa-apply-goal-filter:hover{background:#f1f7ff}\n        .npoa-goal-shortcuts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:-2px 0 12px}\n        .npoa-goal-shortcut{border:1px solid #b7cbe0;background:#fff;color:#214d73;padding:6px 10px;border-radius:8px;font-size:13px;cursor:pointer}\n        .npoa-goal-shortcut:hover{background:#f1f7ff}\n        .npoa-recommend-box{display:flex;gap:10px;align-items:center;justify-content:space-between;background:#eef6ff;border:1px solid #c9ddf1;border-radius:10px;padding:10px 12px;margin-bottom:12px}\n        .npoa-recommend-text{font-size:14px;color:#194166;font-weight:600}\n        .npoa-apply-recommend{border:1px solid #7da8d2;background:#fff;color:#1e4a72;padding:6px 10px;border-radius:8px;font-size:13px;cursor:pointer}\n        .npoa-apply-recommend:disabled{opacity:.45;cursor:not-allowed}\n        .npoa-presets{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}\n        .npoa-presets-label{font-size:13px;color:#385777;font-weight:700}\n        .npoa-preset{border:1px solid #b7cbe0;background:#fff;color:#214d73;padding:6px 10px;border-radius:8px;font-size:13px;cursor:pointer}\n        .npoa-preset:hover{background:#f1f7ff}\n        .npoa-export-image{border:1px solid #7da8d2;background:#1f5f95;color:#fff;padding:6px 10px;border-radius:8px;font-size:13px;cursor:pointer}\n        .npoa-export-image:hover{background:#184f7b}\n        .npoa-export-note{margin-top:-4px;margin-bottom:12px;font-size:12px;color:#5a6f84}\n        .npoa-parse-status{margin-bottom:12px;font-size:14px;font-weight:600;color:#2f4f74}\n        .npoa-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin-bottom:14px}\n        .npoa-metric-card{background:#ffffff;border:1px solid #dbe4ee;border-radius:10px;padding:12px;min-height:76px}\n        .npoa-primary-metric{border-color:#8fb7df;background:#f1f7ff}\n        .npoa-metric-card span{display:block;font-size:13px;color:#4b6077;margin-bottom:4px}\n        .npoa-metric-card strong{font-size:20px;line-height:1.2;color:#17324d}\n        .npoa-apply-min{margin-top:8px;border:1px solid #b7c9dd;background:#f4f9ff;color:#1d4268;padding:6px 10px;border-radius:8px;font-size:13px;cursor:pointer}\n        .npoa-apply-min:disabled{opacity:.45;cursor:not-allowed}\n        .npoa-groups{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:16px}\n        .npoa-group{border:1px solid #dbe4ee;border-radius:10px;padding:12px;background:#ffffff}\n        .npoa-group h4{margin:0 0 8px;font-size:17px}\n        .npoa-col-head{display:grid;grid-template-columns:1fr auto auto;gap:8px;padding:0 8px 6px;color:#61758b;font-size:12px;font-weight:700}\n        .npoa-group ul{margin:0;padding:0;list-style:none}\n        .npoa-group li+li{margin-top:6px}\n        .npoa-group label{display:grid;grid-template-columns:auto 1fr auto auto;gap:10px;align-items:center;padding:6px 8px;border-radius:8px}\n        .npoa-group label:hover{background:#f6f8fa}\n        .npoa-score{font-weight:600}\n        .npoa-goals{font-size:12px;color:#5e7388;background:#edf3f8;border-radius:999px;padding:2px 8px}\n        .npoa-odd{color:#0a58a7;font-weight:600}\n        .npoa-result{border:1px solid #dbe4ee;border-radius:10px;background:#fff;padding:12px;margin-top:14px}\n        .npoa-summary{margin-bottom:10px;font-weight:600;line-height:1.6}\n        .npoa-result table{width:100%;border-collapse:collapse}\n        .npoa-result th,.npoa-result td{padding:8px;border-bottom:1px solid #edf1f5;text-align:left}\n        .npoa-result th{background:#f8fafc}\n        .npoa-combo-panel{border:1px solid #dbe4ee;border-radius:10px;background:#fff;padding:12px;margin-top:12px}\n        .npoa-combo-panel h4{margin:0 0 8px;font-size:16px}\n        .npoa-combo-note{margin-bottom:8px;color:#50657b;font-size:13px}\n        .npoa-combo-panel table{width:100%;border-collapse:collapse}\n        .npoa-combo-panel th,.npoa-combo-panel td{padding:8px;border-bottom:1px solid #edf1f5;text-align:left;vertical-align:top}\n        .npoa-combo-panel th{background:#f8fafc}\n        .npoa-no-loss{color:#146c2e}\n        .npoa-loss{color:#a53e1b}\n        .npoa-empty{padding:12px;border:1px solid #e3e3e3;border-radius:8px;background:#fffdf5}\n        @media (max-width:768px){\n            .npoa-title{font-size:20px}\n            .npoa-controls{align-items:flex-start}\n            .npoa-metrics{grid-template-columns:1fr}\n            .npoa-groups{grid-template-columns:1fr}\n            .npoa-result th,.npoa-result td{font-size:14px;padding:7px}\n        }\n        <\/style>\n\n        <script>\n        (function(){\n            var root = document.getElementById(\"npoa-1\");\n            if (!root) { return; }\n\n            var rawInput = root.querySelector('.npoa-raw');\n            var totalInput = root.querySelector('.npoa-total');\n            var totalMultiplierInput = root.querySelector('.npoa-total-multiplier');\n            var lossTargetInput = root.querySelector('.npoa-loss-target');\n            var oddsBiasInput = root.querySelector('.npoa-odds-bias');\n            var lowThresholdInput = root.querySelector('.npoa-low-threshold');\n            var lowMultiplierInput = root.querySelector('.npoa-low-multiplier');\n            var focusMarketInput = root.querySelector('.npoa-focus-market');\n            var focusBoostInput = root.querySelector('.npoa-focus-boost');\n            var autoIgnoreInput = root.querySelector('.npoa-auto-ignore');\n            var maxOddInput = root.querySelector('.npoa-max-odd');\n            var probPriorityInput = root.querySelector('.npoa-prob-priority');\n            var checkAll = root.querySelector('.npoa-buy-all');\n            var flat20Input = root.querySelector('.npoa-flat20');\n            var flat40Input = root.querySelector('.npoa-flat40');\n            var groupsWrap = root.querySelector('.npoa-groups');\n            var parseStatus = root.querySelector('.npoa-parse-status');\n            var summary = root.querySelector('.npoa-summary');\n            var body = root.querySelector('.npoa-result-body');\n            var minPayoutEl = root.querySelector('.npoa-min-payout');\n            var minProfitEl = root.querySelector('.npoa-min-profit');\n            var minNoLossEl = root.querySelector('.npoa-min-noloss');\n            var bestLossRateEl = root.querySelector('.npoa-best-loss-rate');\n            var minRequiredEl = root.querySelector('.npoa-min-required');\n            var maxProfitEl = root.querySelector('.npoa-max-profit');\n            var applyMinBtn = root.querySelector('.npoa-apply-min');\n            var recommendText = root.querySelector('.npoa-recommend-text');\n            var applyRecommendBtn = root.querySelector('.npoa-apply-recommend');\n            var presetButtons = Array.prototype.slice.call(root.querySelectorAll('.npoa-preset'));\n            var exportImageBtn = root.querySelector('.npoa-export-image');\n            var excludedGoalsInput = root.querySelector('.npoa-excluded-goals');\n            var applyGoalFilterBtn = root.querySelector('.npoa-apply-goal-filter');\n            var goalShortcutButtons = Array.prototype.slice.call(root.querySelectorAll('.npoa-goal-shortcut'));\n            var analyzeBtn = root.querySelector('.npoa-analyze-combos');\n            var comboNote = root.querySelector('.npoa-combo-note');\n            var comboBody = root.querySelector('.npoa-combo-body');\n            var currency = root.getAttribute('data-currency') || '';\n            var unit = 10;\n            var minUnitsPerPick = 2;\n            var allItems = [];\n            var picks = [];\n            var minUnitsCache = {};\n            var latestMinRequired = null;\n            var latestRecommended = null;\n            var parseStatusBaseText = '';\n\n            function escapeHtml(text){\n                return String(text)\n                    .replace(\/&\/g, '&amp;')\n                    .replace(\/<\/g, '&lt;')\n                    .replace(\/>\/g, '&gt;')\n                    .replace(\/\"\/g, '&quot;')\n                    .replace(\/'\/g, '&#039;');\n            }\n\n            function parseOddsText(raw){\n                var groupsMap = {};\n                var items = [];\n                var currentGroup = '';\n                var autoId = 1;\n                var lines = String(raw || '').split(\/\\r?\\n\/);\n                var drawLabel = '\u548c\u5c40';\n                var homeWinLabel = '\u4e3b\u961f \u80dc';\n                var awayWinLabel = '\u5ba2\u961f \u80dc';\n\n                function cleanTitle(title){\n                    return String(title || '')\n                        .trim()\n                        .replace(\/[\uff1a:]+$\/, '')\n                        .replace(\/\\s+\/g, ' ');\n                }\n\n                function isDrawTitle(title){\n                    return \/(\u548c\u5c40|\u5e73\u5c40|draw)\/i.test(title);\n                }\n\n                function isTitleLine(text){\n                    if (!text || \/[0-9]{1,2}\\s*-\\s*[0-9]{1,2}\/.test(text)) { return false; }\n                    return text.length <= 24;\n                }\n\n                var titleCandidates = [];\n                lines.forEach(function(line){\n                    var text = line.trim();\n                    var m;\n                    if(!text){ return; }\n                    m = text.match(\/^#{1,6}\\s*(.+)$\/);\n                    if(m){\n                        titleCandidates.push(cleanTitle(m[1]));\n                        return;\n                    }\n                    if(isTitleLine(text)){\n                        titleCandidates.push(cleanTitle(text));\n                    }\n                });\n\n                var winTitles = [];\n                titleCandidates.forEach(function(title){\n                    if(!title){ return; }\n                    if(isDrawTitle(title)){\n                        drawLabel = '\u548c\u5c40';\n                        return;\n                    }\n                    if(\/\u80dc$\/u.test(title)){\n                        var normalizedWin = cleanTitle(title.replace(\/\\s*\u80dc$\/u, '') + ' \u80dc');\n                        if(winTitles.indexOf(normalizedWin) === -1){\n                            winTitles.push(normalizedWin);\n                        }\n                    }\n                });\n\n                if(winTitles.length >= 1){\n                    homeWinLabel = winTitles[0];\n                }\n                if(winTitles.length >= 2){\n                    awayWinLabel = winTitles[1];\n                }\n\n                var homeTeamName = cleanTitle(homeWinLabel.replace(\/\\s*\u80dc$\/u, '')) || '\u4e3b\u961f';\n                var awayTeamName = cleanTitle(awayWinLabel.replace(\/\\s*\u80dc$\/u, '')) || '\u5ba2\u961f';\n\n                function scoreDisplayLabel(score){\n                    var parts = String(score).split('-');\n                    if (parts.length !== 2) { return String(score); }\n                    var left = parseInt(parts[0], 10);\n                    var right = parseInt(parts[1], 10);\n                    if (!isFinite(left) || !isFinite(right)) { return String(score); }\n                    return homeTeamName + ' ' + left + ' : ' + right + ' ' + awayTeamName;\n                }\n\n                function normTitle(title){\n                    var t = cleanTitle(title);\n                    if(!t){ return ''; }\n\n                    var homeTeam = cleanTitle(homeWinLabel.replace(\/\\s*\u80dc$\/u, ''));\n                    var awayTeam = cleanTitle(awayWinLabel.replace(\/\\s*\u80dc$\/u, ''));\n\n                    if(isDrawTitle(t)){ return drawLabel; }\n                    if(t === homeWinLabel || t === homeTeam || t === homeTeam + '\u80dc'){ return homeWinLabel; }\n                    if(t === awayWinLabel || t === awayTeam || t === awayTeam + '\u80dc'){ return awayWinLabel; }\n                    return t;\n                }\n\n                function titleFromScore(score){\n                    var parts = String(score).split('-');\n                    var left = parseInt(parts[0], 10);\n                    var right = parseInt(parts[1], 10);\n                    if(left > right){ return homeWinLabel; }\n                    if(left < right){ return awayWinLabel; }\n                    return drawLabel;\n                }\n\n                function detectMarketType(label, groupTitle){\n                    var text = (String(label || '') + ' ' + String(groupTitle || '')).toLowerCase();\n                    if (\/(\u5927|\u5c0f)(\u7403)?\\s*[0-9]+(?:\\.[0-9]+)?\/.test(text) || \/(over|under|o\\\/u|ou)\\s*[0-9]+(?:\\.[0-9]+)?\/.test(text)) {\n                        return 'ou';\n                    }\n                    return 'other';\n                }\n\n                function ensureGroup(title){\n                    if (!groupsMap[title]) {\n                        groupsMap[title] = {\n                            title: title,\n                            items: []\n                        };\n                    }\n                }\n\n                lines.forEach(function(line){\n                    var text = line.trim();\n                    var headMatch;\n                    var itemMatch;\n\n                    if (!text) { return; }\n\n                    headMatch = text.match(\/^#{1,6}\\s*(.+)$\/);\n                    if (headMatch) {\n                        currentGroup = normTitle(headMatch[1]);\n                        return;\n                    }\n\n                    \/\/ \u652f\u6301\u65e0 ### \u7684\u5206\u7ec4\u6807\u9898\u884c\u3002\n                    if (isTitleLine(text)) {\n                        var maybeTitle = normTitle(text);\n                        if (maybeTitle) {\n                            currentGroup = maybeTitle;\n                            return;\n                        }\n                        return;\n                    }\n\n                    itemMatch = text.match(\/^(?:[-*]\\s*)?([0-9]{1,2}\\s*-\\s*[0-9]{1,2})\\s*[\uff1a:]\\s*([0-9]+(?:\\.[0-9]+)?)$\/);\n                    if (itemMatch) {\n                        var score = itemMatch[1].replace(\/\\s+\/g, '');\n                        var odd = parseFloat(itemMatch[2]);\n                        if (!isFinite(odd) || odd <= 1) { return; }\n\n                        var finalGroup = currentGroup || titleFromScore(score);\n                        ensureGroup(finalGroup);\n\n                        var scoreParts = score.split('-');\n                        var goals = parseInt(scoreParts[0], 10) + parseInt(scoreParts[1], 10);\n\n                        var scoreItem = {\n                            id: 'o' + autoId,\n                            group: finalGroup,\n                            score: score,\n                            label: scoreDisplayLabel(score),\n                            odd: odd,\n                            goals: goals,\n                            marketType: 'score'\n                        };\n                        autoId += 1;\n\n                        groupsMap[finalGroup].items.push(scoreItem);\n                        items.push(scoreItem);\n                        return;\n                    }\n\n                    var genericMatch = text.match(\/^(?:[-*]\\s*)?(.+?)\\s*[\uff1a:]\\s*([0-9]+(?:\\.[0-9]+)?)$\/);\n                    if (!genericMatch) { return; }\n\n                    var label = String(genericMatch[1] || '').trim();\n                    var genericOdd = parseFloat(genericMatch[2]);\n                    if (!label || !isFinite(genericOdd) || genericOdd <= 1) { return; }\n\n                    var marketType = detectMarketType(label, currentGroup);\n                    var finalGenericGroup = currentGroup || (marketType === 'ou' ? '\u5927\u5c0f\u7403' : '\u672a\u5206\u7c7b');\n                    ensureGroup(finalGenericGroup);\n\n                    var genericItem = {\n                        id: 'o' + autoId,\n                        group: finalGenericGroup,\n                        score: label,\n                        label: label,\n                        odd: genericOdd,\n                        goals: null,\n                        marketType: marketType\n                    };\n                    autoId += 1;\n\n                    groupsMap[finalGenericGroup].items.push(genericItem);\n                    items.push(genericItem);\n                });\n\n                var orderedTitles = [homeWinLabel, drawLabel, awayWinLabel];\n                var groups = orderedTitles\n                    .filter(function(title){ return !!groupsMap[title]; })\n                    .map(function(title){ return groupsMap[title]; });\n\n                Object.keys(groupsMap).forEach(function(title){\n                    if (orderedTitles.indexOf(title) === -1) {\n                        groups.push(groupsMap[title]);\n                    }\n                });\n\n                return {\n                    groups: groups,\n                    items: items,\n                    teams: {\n                        home: homeTeamName,\n                        away: awayTeamName\n                    }\n                };\n            }\n\n            function bindPickEvents(){\n                picks.forEach(function(item){\n                    item.addEventListener('change', function(){\n                        checkAll.checked = picks.length > 0 && picks.every(function(x){ return x.checked; });\n                        recalc();\n                    });\n                });\n            }\n\n            function renderGroups(groups){\n                if (!groups.length) {\n                    groupsWrap.innerHTML = '<div class=\"npoa-empty\">\u8bf7\u5728\u4e0a\u65b9\u8f93\u5165\u6570\u636e\u540e\u5f00\u59cb\u8ba1\u7b97\u3002<\/div>';\n                    picks = [];\n                    return;\n                }\n\n                var shouldCheck = checkAll.checked;\n                groupsWrap.innerHTML = groups.map(function(group){\n                    return '<section class=\"npoa-group\">' +\n                        '<h4>' + escapeHtml(group.title) + '<\/h4>' +\n                        '<div class=\"npoa-col-head\"><span>\u9009\u9879<\/span><span>\u7c7b\u578b<\/span><span>\u8d54\u7387<\/span><\/div>' +\n                        '<ul>' +\n                        group.items.map(function(item){\n                            var metaText = item.marketType === 'score'\n                                ? String(item.goals) + '\u7403'\n                                : (item.marketType === 'ou' ? '\u5927\u5c0f\u7403' : '\u5176\u4ed6');\n                            return '<li><label>' +\n                                '<input type=\"checkbox\" class=\"npoa-pick\" data-id=\"' + escapeHtml(item.id) + '\" data-odd=\"' + escapeHtml(String(item.odd)) + '\" ' + (shouldCheck ? 'checked' : '') + ' \/>' +\n                                '<span class=\"npoa-score\">' + escapeHtml(item.label || item.score) + '<\/span>' +\n                                '<span class=\"npoa-goals\">' + escapeHtml(metaText) + '<\/span>' +\n                                '<span class=\"npoa-odd\">\u8d54\u7387 ' + escapeHtml(String(item.odd)) + '<\/span>' +\n                            '<\/label><\/li>';\n                        }).join('') +\n                        '<\/ul>' +\n                    '<\/section>';\n                }).join('');\n\n                picks = Array.prototype.slice.call(root.querySelectorAll('.npoa-pick'));\n                bindPickEvents();\n            }\n\n            function parseAndRender(){\n                var parsed = parseOddsText(rawInput.value || '');\n                allItems = parsed.items;\n\n                if (!allItems.length) {\n                    parseStatusBaseText = '';\n                    parseStatus.textContent = '\u672a\u8bc6\u522b\u5230\u6709\u6548\u8d54\u7387\uff0c\u8bf7\u68c0\u67e5\u683c\u5f0f\u3002';\n                    parseStatus.className = 'npoa-parse-status npoa-loss';\n                    renderGroups([]);\n                    summary.className = 'npoa-summary npoa-loss';\n                    summary.textContent = '\u8bf7\u5148\u8f93\u5165\u5e76\u89e3\u6790\u8d54\u7387\u6570\u636e\u3002';\n                    body.innerHTML = '';\n                    latestMinRequired = null;\n                    applyMinBtn.disabled = true;\n                    recommendText.textContent = '\u63a8\u8350\u65b9\u6848\uff1a\u8bf7\u5148\u8f93\u5165\u6709\u6548\u8d54\u7387';\n                    applyRecommendBtn.disabled = true;\n                    comboNote.textContent = '\u8bf7\u5148\u8f93\u5165\u6709\u6548\u8d54\u7387\u3002';\n                    comboBody.innerHTML = '';\n                    return;\n                }\n\n                parseStatusBaseText = '\u5df2\u89e3\u6790 ' + allItems.length + ' \u4e2a\u9009\u9879\uff0c\u5206\u7ec4 ' + parsed.groups.length + ' \u4e2a\u3002';\n                var ouCount = allItems.filter(function(it){ return it.marketType === 'ou'; }).length;\n                if (ouCount > 0) {\n                    parseStatusBaseText += '\uff08\u542b\u5927\u5c0f\u7403 ' + ouCount + ' \u9879\uff09';\n                }\n                parseStatus.textContent = parseStatusBaseText;\n                parseStatus.className = 'npoa-parse-status';\n                renderGroups(parsed.groups);\n                comboNote.textContent = '\u70b9\u51fb\u201c\u62c6\u5206\u7ec4\u5408\u5206\u6790\u201d\u540e\u81ea\u52a8\u8ba1\u7b97\u3002';\n                comboBody.innerHTML = '';\n            }\n\n            function formatMoney(n) {\n                if (!isFinite(n)) { return '-'; }\n                return (currency ? currency + ' ' : '') + String(Math.round(n));\n            }\n\n            function pickedItems() {\n                var selected = [];\n                picks.forEach(function(item){\n                    if (!item.checked) { return; }\n                    var id = item.getAttribute('data-id');\n                    var odd = parseFloat(item.getAttribute('data-odd') || '0');\n                    var found = allItems.find(function(x){ return x.id === id; });\n                    if (found && odd > 1) {\n                        selected.push({ id: id, score: found.score, label: found.label || found.score, odd: odd, group: found.group || '', marketType: found.marketType || 'other' });\n                    }\n                });\n                return selected;\n            }\n\n            function uniqueGroupCount(selected){\n                var map = {};\n                selected.forEach(function(it){\n                    if (it.group) { map[it.group] = true; }\n                });\n                return Object.keys(map).length;\n            }\n\n            function getStrategySelected() {\n                var selectedRaw = pickedItems();\n                var autoIgnore = !!autoIgnoreInput.checked;\n                var maxOdd = parseFloat(maxOddInput.value || '30');\n                if (!isFinite(maxOdd) || maxOdd < 1.1) { maxOdd = 30; }\n                if (maxOdd > 500) { maxOdd = 500; }\n                maxOddInput.value = String(maxOdd);\n\n                var selected = selectedRaw.filter(function(it){\n                    return !autoIgnore || it.odd <= maxOdd;\n                });\n\n                return {\n                    selected: selected,\n                    ignoredCount: Math.max(0, selectedRaw.length - selected.length),\n                    autoIgnore: autoIgnore,\n                    maxOdd: maxOdd\n                };\n            }\n\n            function parseExcludedGoals(){\n                var values = String(excludedGoalsInput.value || '')\n                    .split(\/[^0-9]+\/)\n                    .map(function(v){ return v.trim(); })\n                    .filter(function(v){ return v !== ''; })\n                    .map(function(v){ return parseInt(v, 10); })\n                    .filter(function(v, idx, arr){\n                        return isFinite(v) && v >= 0 && arr.indexOf(v) === idx;\n                    });\n\n                if (values.length === 1) {\n                    return {\n                        threshold: values[0],\n                        exact: []\n                    };\n                }\n\n                return {\n                    threshold: null,\n                    exact: values\n                };\n            }\n\n            function applyGoalExclusions(){\n                var excludedGoals = parseExcludedGoals();\n                if ((!excludedGoals.exact.length && excludedGoals.threshold === null) || !picks.length) {\n                    return 0;\n                }\n\n                var changed = 0;\n                picks.forEach(function(item){\n                    var id = item.getAttribute('data-id');\n                    var found = allItems.find(function(x){ return x.id === id; });\n                    if (!found || found.marketType !== 'score' || !isFinite(found.goals)) {\n                        return;\n                    }\n                    var shouldExclude = excludedGoals.threshold !== null\n                        ? found.goals >= excludedGoals.threshold\n                        : excludedGoals.exact.indexOf(found.goals) !== -1;\n                    if (shouldExclude && item.checked) {\n                        item.checked = false;\n                        changed += 1;\n                    }\n                });\n                checkAll.checked = picks.length > 0 && picks.every(function(x){ return x.checked; });\n                return changed;\n            }\n\n            function focusWeight(item, focusTarget, focusBoost){\n                if (focusTarget === 'balanced') {\n                    return 1;\n                }\n                if (focusTarget === 'ou' && item.marketType === 'ou') {\n                    return focusBoost;\n                }\n                if (focusTarget === 'score' && item.marketType === 'score') {\n                    return focusBoost;\n                }\n                return 1;\n            }\n\n            function sumUnits(arr){\n                return arr.reduce(function(s, v){ return s + v; }, 0);\n            }\n\n            function getBaseMinUnits(selected, lowThreshold, lowMultiplier){\n                var multiplier = Math.max(1, Math.min(3, lowMultiplier));\n                return selected.map(function(it){\n                    if (it.odd <= lowThreshold) {\n                        return minUnitsPerPick * multiplier;\n                    }\n                    return minUnitsPerPick;\n                });\n            }\n\n            function findMinUnitsNoLoss(selected, baseMinUnits){\n                var key = selected\n                    .map(function(it){ return it.odd; })\n                    .sort(function(a,b){ return a-b; })\n                    .join('|') + '#base=' + baseMinUnits.join(',');\n\n                if (minUnitsCache[key] !== undefined) {\n                    return minUnitsCache[key];\n                }\n\n                var maxUnits = 50000;\n                for (var u = 1; u <= maxUnits; u += 1) {\n                    var need = 0;\n                    for (var i = 0; i < selected.length; i += 1) {\n                        need += Math.max(baseMinUnits[i] || minUnitsPerPick, Math.ceil(u \/ selected[i].odd));\n                        if (need > u) {\n                            break;\n                        }\n                    }\n                    if (need <= u) {\n                        minUnitsCache[key] = u;\n                        return u;\n                    }\n                }\n\n                minUnitsCache[key] = null;\n                return null;\n            }\n\n            function findMinUnitsForLossTarget(selected, lossPct, baseMinUnits){\n                var pct = Math.max(0, Math.min(90, lossPct));\n                var key = selected\n                    .map(function(it){ return it.odd; })\n                    .sort(function(a,b){ return a-b; })\n                    .join('|') + '#loss=' + pct + '#base=' + baseMinUnits.join(',');\n\n                if (minUnitsCache[key] !== undefined) {\n                    return minUnitsCache[key];\n                }\n\n                var k = 1 - (pct \/ 100);\n                var maxUnits = 50000;\n                for (var u = 1; u <= maxUnits; u += 1) {\n                    var need = 0;\n                    for (var i = 0; i < selected.length; i += 1) {\n                        need += Math.max(baseMinUnits[i] || minUnitsPerPick, Math.ceil((k * u) \/ selected[i].odd));\n                        if (need > u) {\n                            break;\n                        }\n                    }\n                    if (need <= u) {\n                        minUnitsCache[key] = u;\n                        return u;\n                    }\n                }\n\n                minUnitsCache[key] = null;\n                return null;\n            }\n\n            function allocateRiskMinimizedUnits(selected, totalUnits, baseMinUnits){\n                var units = baseMinUnits.slice();\n                var remain = Math.max(0, totalUnits - sumUnits(baseMinUnits));\n\n                while (remain > 0) {\n                    var targetIndex = 0;\n                    var targetPayout = units[0] * selected[0].odd;\n\n                    for (var i = 1; i < selected.length; i += 1) {\n                        var payout = units[i] * selected[i].odd;\n                        if (payout < targetPayout) {\n                            targetPayout = payout;\n                            targetIndex = i;\n                        }\n                    }\n\n                    units[targetIndex] += 1;\n                    remain -= 1;\n                }\n\n                return units;\n            }\n\n            function addRiskProtectionUnits(selected, units, count){\n                var remain = Math.max(0, count);\n                while (remain > 0) {\n                    var targetIndex = 0;\n                    var targetPayout = units[0] * selected[0].odd;\n\n                    for (var i = 1; i < selected.length; i += 1) {\n                        var payout = units[i] * selected[i].odd;\n                        if (payout < targetPayout) {\n                            targetPayout = payout;\n                            targetIndex = i;\n                        }\n                    }\n\n                    units[targetIndex] += 1;\n                    remain -= 1;\n                }\n            }\n\n            function upsetWeight(odd){\n                if (odd < 8) { return 0.15; }\n                if (odd <= 120) {\n                    var center = Math.log(45);\n                    var distance = Math.log(odd) - center;\n                    return 1 + (7 * Math.exp(-(distance * distance) \/ 1.2));\n                }\n                return 0.9 + Math.min(1.2, 120 \/ odd);\n            }\n\n            function addWeightedUnits(selected, units, count, focusTarget, focusBoost, probPriority){\n                var remain = Math.max(0, count);\n                if (remain <= 0) { return; }\n\n                var weights = selected.map(function(it){\n                    var probWeight = Math.pow(it.odd, -2 * (probPriority \/ 100));\n                    return upsetWeight(it.odd) * focusWeight(it, focusTarget, focusBoost) * probWeight;\n                });\n                var weightSum = weights.reduce(function(sum, w){ return sum + w; }, 0);\n                var raw = weights.map(function(w){ return weightSum > 0 ? (remain * w \/ weightSum) : 0; });\n                var floor = raw.map(function(v){ return Math.floor(v); });\n                var used = floor.reduce(function(sum, v){ return sum + v; }, 0);\n                var extra = remain - used;\n                var remainders = raw.map(function(v, index){\n                    return { index: index, frac: v - Math.floor(v) };\n                }).sort(function(a, b){ return b.frac - a.frac; });\n\n                for (var i = 0; i < extra && i < remainders.length; i += 1) {\n                    floor[remainders[i].index] += 1;\n                }\n\n                floor.forEach(function(v, index){\n                    units[index] += v;\n                });\n            }\n\n            function allocateHighRiskUpsideUnits(selected, totalUnits, bias, baseMinUnits, focusTarget, focusBoost, probPriority){\n                var units = baseMinUnits.slice();\n                var remain = Math.max(0, totalUnits - sumUnits(baseMinUnits));\n                var upsideShare = Math.max(0.35, Math.min(0.85, bias \/ 100));\n                var upsideUnits = Math.round(remain * upsideShare);\n                var riskUnits = remain - upsideUnits;\n\n                addRiskProtectionUnits(selected, units, riskUnits);\n                addWeightedUnits(selected, units, upsideUnits, focusTarget, focusBoost, probPriority);\n\n                return units;\n            }\n\n            function buildRecommendation(selected, maxLossPct, lowThreshold, lowMultiplier){\n                var recMultiplier = lowMultiplier;\n                var sumInvLocal = selected.reduce(function(s, it){ return s + (1 \/ it.odd); }, 0);\n                var bestLossPct = Math.max(0, (1 - (1 \/ sumInvLocal)) * 100);\n                if (bestLossPct > maxLossPct + 8) {\n                    recMultiplier = 3;\n                } else if (bestLossPct > maxLossPct + 2) {\n                    recMultiplier = 2;\n                }\n\n                var recThreshold = Math.max(6, Math.min(12, lowThreshold));\n                var recBias = 75;\n                var ouCount = selected.filter(function(it){ return it.marketType === 'ou'; }).length;\n                var recFocusTarget = ouCount > 0 ? 'ou' : 'balanced';\n                var recFocusBoost = ouCount > 0 ? 1.8 : 1;\n                var recProbPriority = ouCount > 0 ? 65 : 55;\n                var recBase = getBaseMinUnits(selected, recThreshold, recMultiplier);\n                var recGoalUnits = findMinUnitsForLossTarget(selected, maxLossPct, recBase);\n                var recBaseUnits = sumUnits(recBase);\n                var recTotalUnits = recGoalUnits === null ? Math.ceil(recBaseUnits * 1.1) : Math.max(recGoalUnits, recBaseUnits);\n\n                return {\n                    threshold: recThreshold,\n                    multiplier: recMultiplier,\n                    bias: recBias,\n                    focusTarget: recFocusTarget,\n                    focusBoostPct: Math.round(recFocusBoost * 100),\n                    probPriority: recProbPriority,\n                    total: recTotalUnits * unit,\n                    riskReachable: recGoalUnits !== null\n                };\n            }\n\n            function recalc() {\n                var baseTotal = parseFloat(totalInput.value || '0');\n                if (!isFinite(baseTotal) || baseTotal < 0) { baseTotal = 0; }\n                totalInput.value = String(baseTotal);\n\n                var totalMultiplier = parseFloat(totalMultiplierInput.value || '1');\n                if (!isFinite(totalMultiplier) || totalMultiplier <= 0) { totalMultiplier = 1; }\n                if (totalMultiplier > 100) { totalMultiplier = 100; }\n                totalMultiplierInput.value = String(totalMultiplier);\n\n                var total = Math.floor((baseTotal * totalMultiplier) \/ unit) * unit;\n\n                var maxLossPct = parseInt(lossTargetInput.value || '10', 10);\n                if (!isFinite(maxLossPct) || maxLossPct < 0) { maxLossPct = 0; }\n                if (maxLossPct > 90) { maxLossPct = 90; }\n                lossTargetInput.value = String(maxLossPct);\n\n                var bias = parseInt(oddsBiasInput.value || '70', 10);\n                if (!isFinite(bias) || bias < 0) { bias = 0; }\n                if (bias > 100) { bias = 100; }\n                oddsBiasInput.value = String(bias);\n                var biasPower = bias \/ 50; \/\/ 0..2\n\n                var lowThreshold = parseFloat(lowThresholdInput.value || '8');\n                if (!isFinite(lowThreshold) || lowThreshold < 2) { lowThreshold = 8; }\n                if (lowThreshold > 30) { lowThreshold = 30; }\n                lowThresholdInput.value = String(lowThreshold);\n\n                var lowMultiplier = parseInt(lowMultiplierInput.value || '2', 10);\n                if (!isFinite(lowMultiplier) || lowMultiplier < 1) { lowMultiplier = 1; }\n                if (lowMultiplier > 3) { lowMultiplier = 3; }\n                lowMultiplierInput.value = String(lowMultiplier);\n\n                var focusTarget = String(focusMarketInput.value || 'balanced');\n                if (['balanced', 'ou', 'score'].indexOf(focusTarget) === -1) {\n                    focusTarget = 'balanced';\n                }\n                focusMarketInput.value = focusTarget;\n\n                var focusBoostPct = parseInt(focusBoostInput.value || '180', 10);\n                if (!isFinite(focusBoostPct) || focusBoostPct < 100) { focusBoostPct = 100; }\n                if (focusBoostPct > 300) { focusBoostPct = 300; }\n                focusBoostInput.value = String(focusBoostPct);\n                var focusBoost = focusBoostPct \/ 100;\n\n                var probPriority = parseInt(probPriorityInput.value || '60', 10);\n                if (!isFinite(probPriority) || probPriority < 0) { probPriority = 0; }\n                if (probPriority > 100) { probPriority = 100; }\n                probPriorityInput.value = String(probPriority);\n\n                var goalExcludedCount = applyGoalExclusions();\n\n                var strategy = getStrategySelected();\n                var selected = strategy.selected;\n                var ignoredCount = strategy.ignoredCount;\n                var selectedGroups = uniqueGroupCount(selected);\n                if (!selected.length) {\n                    parseStatus.textContent = parseStatusBaseText;\n                    summary.className = 'npoa-summary npoa-loss';\n                    summary.textContent = strategy.autoIgnore ? '\u5df2\u542f\u7528\u81ea\u52a8\u5ffd\u7565\uff0c\u5f53\u524d\u6ca1\u6709\u6ee1\u8db3\u4e0a\u9650\u8d54\u7387\uff08<= ' + strategy.maxOdd + '\uff09\u7684\u9009\u9879\u3002' : '\u8bf7\u81f3\u5c11\u52fe\u9009\u4e00\u4e2a\u6bd4\u5206\u3002';\n                    minPayoutEl.textContent = '-';\n                    minProfitEl.textContent = '-';\n                    minNoLossEl.textContent = '-';\n                    bestLossRateEl.textContent = '-';\n                    minRequiredEl.textContent = '-';\n                    maxProfitEl.textContent = '-';\n                    latestMinRequired = null;\n                    applyMinBtn.disabled = true;\n                    recommendText.textContent = '\u63a8\u8350\u65b9\u6848\uff1a\u8bf7\u5148\u52fe\u9009\u6709\u6548\u9009\u9879';\n                    applyRecommendBtn.disabled = true;\n                    body.innerHTML = '';\n                    comboNote.textContent = '\u8bf7\u81f3\u5c11\u52fe\u9009\u4e24\u4e2a\u9009\u9879\u518d\u505a\u7ec4\u5408\u5206\u6790\u3002';\n                    comboBody.innerHTML = '';\n                    return;\n                }\n\n                parseStatus.textContent = parseStatusBaseText + ' \u5f53\u524d\u7eb3\u5165 ' + selectedGroups + ' \u7ec4 \/ ' + selected.length + ' \u9879\u3002\u5b9e\u9645\u603b\u6295\u5165 ' + formatMoney(total) + '\uff08\u57fa\u7840 ' + formatMoney(baseTotal) + ' x ' + totalMultiplier + '\uff09\u3002';\n\n                var baseMinUnits = getBaseMinUnits(selected, lowThreshold, lowMultiplier);\n                var minNonZeroTotal = sumUnits(baseMinUnits) * unit;\n                var autoRaisedForNonZero = false;\n                if (total < minNonZeroTotal) {\n                    total = minNonZeroTotal;\n                    totalInput.value = String(total);\n                    autoRaisedForNonZero = true;\n                }\n\n                var sumInv = selected.reduce(function(sum, it){\n                    return sum + (1 \/ it.odd);\n                }, 0);\n\n                var minNoLossUnits = findMinUnitsNoLoss(selected, baseMinUnits);\n                minNoLossEl.textContent = minNoLossUnits === null ? '\u4e0d\u53ef\u8fbe' : formatMoney(minNoLossUnits * unit);\n\n                var theoreticalBestReturnRate = sumInv > 0 ? (1 \/ sumInv) : 0;\n                var theoreticalBestLossPct = Math.max(0, (1 - theoreticalBestReturnRate) * 100);\n                var riskPossible = ((1 - (maxLossPct \/ 100)) * sumInv) <= 1;\n                bestLossRateEl.textContent = theoreticalBestLossPct.toFixed(1) + '%';\n\n                var minUnitsGoal = riskPossible ? findMinUnitsForLossTarget(selected, maxLossPct, baseMinUnits) : null;\n                var minRequiredGoal = minUnitsGoal === null ? null : (minUnitsGoal * unit);\n                var autoRaisedTotal = false;\n                latestMinRequired = minRequiredGoal;\n                if (minRequiredGoal === null) {\n                    minRequiredEl.textContent = '\u4e0d\u53ef\u8fbe';\n                    applyMinBtn.disabled = true;\n                } else {\n                    minRequiredEl.textContent = formatMoney(minRequiredGoal);\n                    applyMinBtn.disabled = false;\n                    if (total < minRequiredGoal) {\n                        total = minRequiredGoal;\n                        totalInput.value = String(total);\n                        autoRaisedTotal = true;\n                    }\n                }\n\n                var payoutExact = sumInv > 0 ? (total \/ sumInv) : 0;\n\n                var totalUnits = Math.floor(total \/ unit);\n                var targetFloor = total * (1 - (maxLossPct \/ 100));\n                var baseUnits = selected.map(function(it, idx){\n                    return Math.max(baseMinUnits[idx], Math.ceil(targetFloor \/ (it.odd * unit)));\n                });\n                var baseSumUnits = baseUnits.reduce(function(sum, v){ return sum + v; }, 0);\n                var rounded = [];\n\n                if (baseSumUnits <= totalUnits) {\n                    rounded = baseUnits.slice();\n                    var remainUnits = totalUnits - baseSumUnits;\n                    var blendedExp = biasPower - (2 * (probPriority \/ 100));\n                    var weights = selected.map(function(it){\n                        return Math.pow(it.odd, blendedExp) * focusWeight(it, focusTarget, focusBoost);\n                    });\n                    var weightSum = weights.reduce(function(sum, w){ return sum + w; }, 0);\n                    var extraRaw = weights.map(function(w){\n                        return weightSum > 0 ? (remainUnits * w \/ weightSum) : 0;\n                    });\n                    var extraFloor = extraRaw.map(function(v){ return Math.floor(v); });\n                    var extraSum = extraFloor.reduce(function(sum, v){ return sum + v; }, 0);\n                    var extraRemain = remainUnits - extraSum;\n                    var extraRems = extraRaw.map(function(v, idx){\n                        return { idx: idx, frac: v - Math.floor(v) };\n                    }).sort(function(a, b){ return b.frac - a.frac; });\n\n                    for (var ex = 0; ex < extraRemain && ex < extraRems.length; ex += 1) {\n                        extraFloor[extraRems[ex].idx] += 1;\n                    }\n\n                    rounded = rounded.map(function(v, idx){ return v + (extraFloor[idx] || 0); });\n                } else {\n                    \/\/ \u98ce\u9669\u76ee\u6807\u4e0d\u53ef\u8fbe\u65f6\uff0c\u5168\u4e70\u4fdd\u7559\uff0c\u5269\u4f59\u9884\u7b97\u6309\u201c\u98ce\u9669\u7f13\u51b2 + \u4e2d\u9ad8\u8d54\u7387\u51b7\u95e8\u6536\u76ca\u201d\u5206\u914d\u3002\n                    rounded = allocateHighRiskUpsideUnits(selected, totalUnits, bias, baseMinUnits, focusTarget, focusBoost, probPriority);\n                }\n\n                var useFlat20 = !!flat20Input.checked;\n                var useFlat40 = !useFlat20 && !!flat40Input.checked;\n                if (useFlat20) {\n                    rounded = selected.map(function(){ return minUnitsPerPick; });\n                    total = rounded.reduce(function(s, v){ return s + (v * unit); }, 0);\n                    totalUnits = rounded.length * minUnitsPerPick;\n                    payoutExact = sumInv > 0 ? (total \/ sumInv) : 0;\n                    var flat20Base = totalMultiplier > 0 ? (total \/ totalMultiplier) : total;\n                    baseTotal = flat20Base;\n                    totalInput.value = String(flat20Base);\n                }\n                if (useFlat40) {\n                    var flatUnits40 = 4; \/\/ 40 \/ unit\n                    rounded = selected.map(function(){ return flatUnits40; });\n                    total = rounded.reduce(function(s, v){ return s + (v * unit); }, 0);\n                    totalUnits = rounded.length * flatUnits40;\n                    payoutExact = sumInv > 0 ? (total \/ sumInv) : 0;\n                    var flat40Base = totalMultiplier > 0 ? (total \/ totalMultiplier) : total;\n                    baseTotal = flat40Base;\n                    totalInput.value = String(flat40Base);\n                }\n\n                body.innerHTML = selected.map(function(it, index){\n                    var stake = (rounded[index] || 0) * unit;\n                    var payout = stake * it.odd;\n\n                    return '<tr>' +\n                        '<td>' + escapeHtml(it.label || it.score) + '<\/td>' +\n                        '<td>' + it.odd + '<\/td>' +\n                        '<td>' + formatMoney(stake) + '<\/td>' +\n                        '<td>' + formatMoney(payout) + '<\/td>' +\n                    '<\/tr>';\n                }).join('');\n\n                var payouts = selected.map(function(it, index){\n                    var stake = (rounded[index] || 0) * unit;\n                    return stake * it.odd;\n                });\n                var minPayout = payouts.length ? Math.min.apply(Math, payouts) : 0;\n                var maxPayout = payouts.length ? Math.max.apply(Math, payouts) : 0;\n                var minProfit = minPayout - total;\n                var maxProfit = maxPayout - total;\n                minPayoutEl.textContent = formatMoney(minPayout);\n                minProfitEl.textContent = formatMoney(minProfit);\n                maxProfitEl.textContent = formatMoney(maxProfit);\n                var targetMaxLoss = -total * (maxLossPct \/ 100);\n                var goalHit = minProfit >= targetMaxLoss;\n\n                if (sumInv <= 1) {\n                    summary.className = 'npoa-summary npoa-no-loss';\n                    summary.textContent = '\u53ef\u505a\u5230\u4e0d\u4e8f\u3002\u7406\u8bba\u4efb\u4e00\u547d\u4e2d\u8fd4\u8fd8\u7ea6 ' + formatMoney(payoutExact) + '\uff0c\u5f53\u524d\u79bb\u6563\u5206\u914d\u4e0b\u4fdd\u5e95\u76c8\u4e8f\u7ea6 ' + formatMoney(minProfit) + '\u3002';\n                } else {\n                    summary.className = goalHit ? 'npoa-summary npoa-no-loss' : 'npoa-summary npoa-loss';\n                    if (goalHit) {\n                        summary.textContent = '\u5df2\u8fbe\u5230\u76ee\u6807\uff1a\u6700\u5927\u4e8f\u635f\u63a7\u5236\u5728 ' + maxLossPct + '% \u4ee5\u5185\uff0c\u5e76\u5c06\u5269\u4f59\u9884\u7b97\u5411\u9ad8\u8d54\u7387\u503e\u659c\u3002\u5f53\u524d\u4fdd\u5e95\u76c8\u4e8f ' + formatMoney(minProfit) + '\u3002';\n                    } else {\n                        var extra = !riskPossible\n                            ? '\u8fd9\u7ec4\u52fe\u9009\u65e0\u8bba\u6295\u5165\u591a\u5c11\u90fd\u65e0\u6cd5\u628a\u98ce\u9669\u538b\u5230 ' + maxLossPct + '%\uff0c\u7406\u8bba\u6700\u4f4e\u4e8f\u635f\u7ea6 ' + theoreticalBestLossPct.toFixed(1) + '%\u3002\u5f53\u524d\u91c7\u7528\u9ad8\u98ce\u9669\u6536\u76ca\u578b\uff1a\u4fdd\u7559\u5168\u4e70\uff0c\u5269\u4f59\u9884\u7b97\u4f18\u5148\u7ed9\u4e2d\u9ad8\u8d54\u7387\u51b7\u95e8\uff0c\u540c\u65f6\u4fdd\u7559\u4e00\u90e8\u5206\u8865\u4f4e\u8d54\u7387\u98ce\u9669\u3002'\n                            : (minRequiredGoal !== null && total < minRequiredGoal\n                                ? '\u5f53\u524d\u603b\u6295\u5165\u4f4e\u4e8e\u98ce\u9669\u76ee\u6807\u6700\u4f4e\u6295\u5165 ' + formatMoney(minRequiredGoal) + '\u3002'\n                                : '\u8bf7\u51cf\u5c11\u4f4e\u8d54\u7387\u9009\u9879\u6216\u62c6\u5206\u7ec4\u5408\u3002');\n                        summary.textContent = '\u5f53\u524d\u52fe\u9009\u65e0\u6cd5\u6ee1\u8db3\u201c\u6700\u5927\u4e8f\u635f ' + maxLossPct + '%\u201d\u76ee\u6807\uff08\u6700\u4f4e\u53ef\u5230 ' + formatMoney(minProfit) + '\uff09\u3002' + extra;\n                    }\n                }\n\n                if (autoRaisedTotal) {\n                    summary.textContent = '\u5f53\u524d\u539f\u6295\u5165\u4e0d\u8db3\u4ee5\u8986\u76d6\u5168\u90e8\u52fe\u9009\u9879\u7684 ' + maxLossPct + '% \u98ce\u9669\u76ee\u6807\uff0c\u5df2\u81ea\u52a8\u63d0\u5347\u5230\u76ee\u6807\u6700\u5c11\u6295\u5165 ' + formatMoney(total) + ' \u540e\u91cd\u65b0\u5206\u914d\u3002' + summary.textContent;\n                }\n\n                if (autoRaisedForNonZero) {\n                    summary.textContent = '\u5f53\u524d\u539f\u6295\u5165\u4e0d\u8db3\u4ee5\u6ee1\u8db3\u4f4e\u8d54\u500d\u6570\u7ea6\u675f\uff08\u4f4e\u8d54\u9608\u503c <= ' + lowThreshold + '\uff0c\u500d\u6570 ' + lowMultiplier + 'x\uff09\uff0c\u5df2\u81ea\u52a8\u63d0\u5347\u5230 ' + formatMoney(total) + '\u3002' + summary.textContent;\n                }\n\n                if (totalUnits > 0 && selected.length > totalUnits) {\n                    summary.className = 'npoa-summary npoa-loss';\n                    summary.textContent = summary.textContent + ' \u5f53\u524d\u52fe\u9009 ' + selected.length + ' \u9879\uff0c\u4f46\u603b\u6295\u5165\u4ec5 ' + total + '\uff0c\u6309\u5355\u4f4d ' + unit + ' \u8ba1\u7b97\u6700\u591a\u53ea\u80fd\u7ed9 ' + totalUnits + ' \u9879\u975e\u96f6\u6295\u5165\uff0c\u6240\u4ee5\u4f1a\u51fa\u73b0\u90e8\u5206 0\u3002';\n                }\n\n                if (ignoredCount > 0) {\n                    summary.textContent = summary.textContent + ' \u672c\u8f6e\u5df2\u6309\u7b56\u7565\u5ffd\u7565 ' + ignoredCount + ' \u9879\u9ad8\u8d54\u7387\uff0c\u8d44\u91d1\u66f4\u96c6\u4e2d\u5728\u9ad8\u6982\u7387\u9879\u3002';\n                }\n                if (goalExcludedCount > 0) {\n                    summary.textContent = summary.textContent + ' \u5df2\u6309\u603b\u8fdb\u7403\u89c4\u5219\u81ea\u52a8\u53d6\u6d88 ' + goalExcludedCount + ' \u9879\u52fe\u9009\u3002';\n                }\n\n                comboNote.textContent = '\u5f53\u524d\u52fe\u9009\u5df2\u53d8\u5316\uff0c\u70b9\u51fb\u201c\u62c6\u5206\u7ec4\u5408\u5206\u6790\u201d\u5237\u65b0\u7ed3\u679c\u3002';\n\n                latestRecommended = buildRecommendation(selected, maxLossPct, lowThreshold, lowMultiplier);\n                var focusText = latestRecommended.focusTarget === 'ou'\n                    ? '\u5927\u5c0f\u7403\u4f18\u5148\uff08\u52a0\u6743 ' + latestRecommended.focusBoostPct + '%\uff09'\n                    : (latestRecommended.focusTarget === 'score' ? '\u6bd4\u5206\u4f18\u5148\uff08\u52a0\u6743 ' + latestRecommended.focusBoostPct + '%\uff09' : '\u5747\u8861');\n                recommendText.textContent = '\u63a8\u8350\u65b9\u6848\uff1a\u4f4e\u8d54\u9608\u503c <= ' + latestRecommended.threshold + '\uff0c\u4f4e\u8d54\u500d\u6570 ' + latestRecommended.multiplier + 'x\uff0c\u9ad8\u8d54\u503e\u659c ' + latestRecommended.bias + '\uff0c\u6982\u7387\u4f18\u5148 ' + latestRecommended.probPriority + '%\uff0c\u91cd\u70b9\u73a9\u6cd5 ' + focusText + '\uff0c\u5efa\u8bae\u603b\u6295\u5165 ' + formatMoney(latestRecommended.total) + (latestRecommended.riskReachable ? '\uff08\u53ef\u51b2\u76ee\u6807\uff09' : '\uff08\u76ee\u6807\u4e0d\u53ef\u8fbe\u65f6\u7684\u6536\u76ca\u578b\u65b9\u6848\uff09');\n                applyRecommendBtn.disabled = false;\n            }\n\n            function applyPreset(name){\n                if (name === 'conservative') {\n                    autoIgnoreInput.checked = true;\n                    maxOddInput.value = '16';\n                    probPriorityInput.value = '85';\n                    oddsBiasInput.value = '35';\n                    focusBoostInput.value = '130';\n                    lowThresholdInput.value = '8';\n                    lowMultiplierInput.value = '3';\n                    if (focusMarketInput.value !== 'ou') {\n                        focusMarketInput.value = 'balanced';\n                    }\n                    recalc();\n                    return;\n                }\n\n                if (name === 'balanced') {\n                    autoIgnoreInput.checked = true;\n                    maxOddInput.value = '28';\n                    probPriorityInput.value = '60';\n                    oddsBiasInput.value = '60';\n                    focusBoostInput.value = '170';\n                    lowThresholdInput.value = '8';\n                    lowMultiplierInput.value = '2';\n                    if (focusMarketInput.value !== 'ou') {\n                        focusMarketInput.value = 'balanced';\n                    }\n                    recalc();\n                    return;\n                }\n\n                autoIgnoreInput.checked = false;\n                maxOddInput.value = '60';\n                probPriorityInput.value = '30';\n                oddsBiasInput.value = '85';\n                focusBoostInput.value = '220';\n                lowThresholdInput.value = '7';\n                lowMultiplierInput.value = '1';\n                if (focusMarketInput.value !== 'ou') {\n                    focusMarketInput.value = 'score';\n                }\n                recalc();\n            }\n\n            function comboKey(items){\n                return items.map(function(it){ return (it.label || it.score) + '@' + it.odd; }).join(' | ');\n            }\n\n            function wrapLines(ctx, text, maxWidth){\n                var words = String(text || '').split(\/\\s+\/);\n                var lines = [];\n                var line = '';\n                words.forEach(function(w){\n                    var next = line ? (line + ' ' + w) : w;\n                    if (ctx.measureText(next).width <= maxWidth) {\n                        line = next;\n                    } else {\n                        if (line) { lines.push(line); }\n                        line = w;\n                    }\n                });\n                if (line) { lines.push(line); }\n                return lines.length ? lines : [''];\n            }\n\n            function exportCurrentImage(){\n                var rows = Array.prototype.slice.call(body.querySelectorAll('tr'));\n                if (!rows.length) {\n                    alert('\u6682\u65e0\u53ef\u5bfc\u51fa\u7684\u7ed3\u679c\u6570\u636e\u3002');\n                    return;\n                }\n\n                var title = (root.querySelector('.npoa-title') || {}).textContent || '\u6295\u6ce8\u65b9\u6848';\n                var pageTitle = String(document.title || '').trim() || '\u672a\u547d\u540d\u9875\u9762';\n                var groupHeadings = Array.prototype.slice.call(root.querySelectorAll('.npoa-group h4')).map(function(h){ return (h.textContent || '').trim(); }).filter(function(t){ return !!t; });\n                var drawKeywords = \/\u548c\u5c40|\u5e73\u5c40|draw\/i;\n                var nonDrawGroups = groupHeadings.filter(function(t){ return !drawKeywords.test(t); });\n                var teamNames = [nonDrawGroups[0] || groupHeadings[0], nonDrawGroups[1] || groupHeadings[2]].filter(Boolean);\n                var fileTeams = teamNames.length >= 2\n                    ? teamNames[0].replace(\/\\s*\u80dc$\/u,'') + ' vs ' + teamNames[1].replace(\/\\s*\u80dc$\/u,'')\n                    : (teamNames.length === 1 ? teamNames[0].replace(\/\\s*\u80dc$\/u,'') : '\u6295\u6ce8\u65b9\u6848');\n                var brand = 'All in win \u9760\u767d\u5ad6\u54e5';\n                var subtitle = (parseStatus.textContent || '').trim();\n                var summaryText = (summary.textContent || '').trim();\n                var totalRaw = parseInt(totalInput.value || '0', 10);\n                if (!isFinite(totalRaw) || totalRaw < 0) { totalRaw = 0; }\n                var totalMultiplier = parseFloat(totalMultiplierInput.value || '1');\n                if (!isFinite(totalMultiplier) || totalMultiplier <= 0) { totalMultiplier = 1; }\n                var totalExport = Math.floor((totalRaw * totalMultiplier) \/ unit) * unit;\n                var metricCards = [\n                    { label: '\u5f53\u524d\u6700\u5dee\u8fd4\u8fd8', value: (minPayoutEl.textContent || '-').trim() },\n                    { label: '\u5f53\u524d\u4fdd\u5e95\u76c8\u4e8f', value: (minProfitEl.textContent || '-').trim() },\n                    { label: '\u4e0d\u4e8f\u6700\u4f4e\u6295\u5165', value: (minNoLossEl.textContent || '-').trim() },\n                    { label: '\u7406\u8bba\u6700\u4f4e\u4e8f\u635f%', value: (bestLossRateEl.textContent || '-').trim() },\n                    { label: '\u98ce\u9669\u76ee\u6807\u6700\u4f4e\u6295\u5165', value: (minRequiredEl.textContent || '-').trim() },\n                    { label: '\u5f53\u524d\u6700\u9ad8\u76c8\u5229', value: (maxProfitEl.textContent || '-').trim() }\n                ];\n                var headers = ['\u9009\u9879', '\u8d54\u7387', '\u5efa\u8bae\u6295\u5165', '\u547d\u4e2d\u8fd4\u8fd8'];\n                var data = rows.map(function(tr){\n                    return Array.prototype.slice.call(tr.querySelectorAll('td')).map(function(td){\n                        return (td.textContent || '').trim();\n                    });\n                });\n\n                var w = 1280;\n                var colX = [30, 620, 760, 940];\n                var rowH = 38;\n                var titleH = 56;\n                var infoH = 54;\n                var summaryMaxW = w - 60;\n                var cardCols = 3;\n                var cardGap = 14;\n                var cardW = Math.floor((w - 60 - ((cardCols - 1) * cardGap)) \/ cardCols);\n                var cardH = 86;\n                var metricRows = Math.ceil(metricCards.length \/ cardCols);\n                var metricsH = (metricRows * cardH) + ((metricRows - 1) * cardGap);\n\n                var matchTitle = teamNames.length >= 2\n                    ? teamNames[0].replace(\/\\s*\u80dc$\/u, '') + '  VS  ' + teamNames[1].replace(\/\\s*\u80dc$\/u, '')\n                    : (teamNames.length === 1 ? teamNames[0].replace(\/\\s*\u80dc$\/u, '') : '');\n                var matchTitleH = matchTitle ? 80 : 0;\n\n                var canvas = document.createElement('canvas');\n                var ctx = canvas.getContext('2d');\n                ctx.font = '16px sans-serif';\n                var summaryLines = wrapLines(ctx, summaryText, summaryMaxW);\n                var summaryH = Math.max(30, summaryLines.length * 24 + 8);\n                var metricsTop = matchTitleH + titleH + infoH + 10;\n                var summaryTop = metricsTop + metricsH + 18;\n                var tableTop = summaryTop + summaryH + 18;\n                var tableH = (data.length + 1) * rowH;\n                var h = tableTop + tableH + 30;\n\n                canvas.width = w;\n                canvas.height = h;\n\n                ctx.fillStyle = '#ffffff';\n                ctx.fillRect(0, 0, w, h);\n\n                if (matchTitle) {\n                    ctx.fillStyle = '#12304e';\n                    ctx.fillRect(0, 0, w, matchTitleH);\n                    ctx.fillStyle = '#ffffff';\n                    ctx.font = 'bold 40px sans-serif';\n                    var mtW = ctx.measureText(matchTitle).width;\n                    ctx.fillText(matchTitle, Math.round((w - mtW) \/ 2), matchTitleH - 22);\n                }\n\n                ctx.fillStyle = '#1a3652';\n                ctx.font = 'bold 24px sans-serif';\n                ctx.fillText(title, 30, matchTitleH + 38);\n\n                ctx.fillStyle = '#4b6077';\n                ctx.font = '14px sans-serif';\n                ctx.fillText(subtitle || '\u7ed3\u679c\u5bfc\u51fa', 30, matchTitleH + 66);\n                ctx.fillText('\u9875\u9762\u6807\u9898\uff1a' + pageTitle + ' | \u603b\u6295\u5165\uff1a' + formatMoney(totalExport) + '\uff08\u57fa\u7840 ' + formatMoney(totalRaw) + ' x ' + totalMultiplier + '\uff09', 30, matchTitleH + 88);\n\n                ctx.fillStyle = '#7a8ea3';\n                ctx.fillText(new Date().toLocaleString(), w - 280, matchTitleH + 66);\n\n                ctx.font = 'bold 18px sans-serif';\n                ctx.fillStyle = '#c87c20';\n                var brandW = ctx.measureText(brand).width;\n                ctx.fillText(brand, w - brandW - 30, matchTitleH + 38);\n\n                metricCards.forEach(function(card, idx){\n                    var row = Math.floor(idx \/ cardCols);\n                    var col = idx % cardCols;\n                    var x = 30 + (col * (cardW + cardGap));\n                    var y = metricsTop + (row * (cardH + cardGap));\n\n                    ctx.fillStyle = '#f4f8fd';\n                    ctx.fillRect(x, y, cardW, cardH);\n                    ctx.strokeStyle = '#d4e0ee';\n                    ctx.lineWidth = 1;\n                    ctx.strokeRect(x, y, cardW, cardH);\n\n                    ctx.fillStyle = '#506a83';\n                    ctx.font = '13px sans-serif';\n                    ctx.fillText(card.label, x + 12, y + 24);\n\n                    ctx.fillStyle = '#1f3f5e';\n                    ctx.font = 'bold 24px sans-serif';\n                    var valueLines = wrapLines(ctx, card.value || '-', cardW - 24);\n                    valueLines.slice(0, 2).forEach(function(vl, vIdx){\n                        ctx.fillText(vl, x + 12, y + 54 + (vIdx * 24));\n                    });\n                });\n\n                ctx.fillStyle = '#263f59';\n                ctx.font = 'bold 14px sans-serif';\n                summaryLines.forEach(function(line, idx){\n                    ctx.fillText(line, 30, summaryTop + (idx * 24));\n                });\n\n                ctx.fillStyle = '#eef4fb';\n                ctx.fillRect(30, tableTop, w - 60, rowH);\n\n                ctx.strokeStyle = '#d7e1ec';\n                ctx.lineWidth = 1;\n                for (var r = 0; r <= data.length + 1; r += 1) {\n                    var y = tableTop + (r * rowH);\n                    ctx.beginPath();\n                    ctx.moveTo(30, y);\n                    ctx.lineTo(w - 30, y);\n                    ctx.stroke();\n                }\n\n                [30, 610, 750, 930, w - 30].forEach(function(x){\n                    ctx.beginPath();\n                    ctx.moveTo(x, tableTop);\n                    ctx.lineTo(x, tableTop + tableH);\n                    ctx.stroke();\n                });\n\n                ctx.fillStyle = '#294661';\n                ctx.font = 'bold 15px sans-serif';\n                headers.forEach(function(hd, idx){\n                    ctx.fillText(hd, colX[idx], tableTop + 24);\n                });\n\n                ctx.fillStyle = '#1f3a56';\n                ctx.font = '14px sans-serif';\n                data.forEach(function(row, rowIdx){\n                    var y = tableTop + rowH + (rowIdx * rowH) + 24;\n                    ctx.fillText(String(row[0] || ''), colX[0], y);\n                    ctx.fillText(String(row[1] || ''), colX[1], y);\n                    ctx.fillText(String(row[2] || ''), colX[2], y);\n                    ctx.fillText(String(row[3] || ''), colX[3], y);\n                });\n\n                var a = document.createElement('a');\n                a.href = canvas.toDataURL('image\/png');\n                var safeName = fileTeams.replace(\/[^\\u4e00-\\u9fa5a-zA-Z0-9_\\- ]\/g, '').replace(\/\\s+\/g, '_').substring(0, 60);\n                a.download = safeName + '_' + Date.now() + '.png';\n                a.click();\n            }\n\n            function analyzeSplitCombos(){\n                var selected = getStrategySelected().selected;\n                var maxSize = Math.min(6, selected.length);\n                var candidates = [];\n                var maxCandidates = 12000;\n                var stop = false;\n\n                if (selected.length < 2) {\n                    comboNote.textContent = '\u81f3\u5c11\u52fe\u9009 2 \u4e2a\u9009\u9879\u624d\u80fd\u62c6\u5206\u7ec4\u5408\u5206\u6790\u3002';\n                    comboBody.innerHTML = '';\n                    return;\n                }\n\n                function dfs(start, combo, sumInv){\n                    if (stop) { return; }\n\n                    if (combo.length >= 2) {\n                        if (sumInv <= 1) {\n                            candidates.push({\n                                picks: combo.slice(),\n                                sumInv: sumInv\n                            });\n                            if (candidates.length >= maxCandidates) {\n                                stop = true;\n                                return;\n                            }\n                        } else {\n                            return;\n                        }\n                    }\n\n                    if (combo.length >= maxSize) {\n                        return;\n                    }\n\n                    for (var i = start; i < selected.length; i += 1) {\n                        var nextSum = sumInv + (1 \/ selected[i].odd);\n                        if (nextSum > 1) {\n                            continue;\n                        }\n                        combo.push(selected[i]);\n                        dfs(i + 1, combo, nextSum);\n                        combo.pop();\n                        if (stop) { return; }\n                    }\n                }\n\n                dfs(0, [], 0);\n\n                if (!candidates.length) {\n                    comboNote.textContent = '\u5f53\u524d\u52fe\u9009\u4e0b\uff0c\u6ca1\u6709\u627e\u5230\u53ef\u4fdd\u672c\u7684\u5b50\u7ec4\u5408\u3002';\n                    comboBody.innerHTML = '';\n                    return;\n                }\n\n                candidates.sort(function(a, b){\n                    if (a.sumInv !== b.sumInv) {\n                        return a.sumInv - b.sumInv;\n                    }\n                    if (a.picks.length !== b.picks.length) {\n                        return a.picks.length - b.picks.length;\n                    }\n                    return comboKey(a.picks).localeCompare(comboKey(b.picks));\n                });\n\n                var shown = [];\n                var seen = {};\n                for (var c = 0; c < candidates.length && shown.length < 12; c += 1) {\n                    var k = comboKey(candidates[c].picks);\n                    if (seen[k]) { continue; }\n                    seen[k] = true;\n                    shown.push(candidates[c]);\n                }\n\n                comboBody.innerHTML = shown.map(function(row){\n                    var rowBase = row.picks.map(function(){ return minUnitsPerPick; });\n                    var minUnits = findMinUnitsNoLoss(row.picks, rowBase);\n                    var minRequired = minUnits === null ? '\u8ba1\u7b97\u8d85\u9650' : formatMoney(minUnits * unit);\n                    return '<tr>' +\n                        '<td>' + escapeHtml(row.picks.map(function(it){ return (it.label || it.score) + ' @' + it.odd; }).join('\uff0c')) + '<\/td>' +\n                        '<td>' + row.sumInv.toFixed(4) + '<\/td>' +\n                        '<td>' + minRequired + '<\/td>' +\n                    '<\/tr>';\n                }).join('');\n\n                comboNote.textContent = '\u5df2\u627e\u5230 ' + candidates.length + ' \u4e2a\u53ef\u4fdd\u672c\u5b50\u7ec4\u5408\uff0c\u5c55\u793a\u524d ' + shown.length + ' \u4e2a\uff08\u66f4\u4f18\u5148\u5012\u6570\u548c\u66f4\u4f4e\uff09\u3002';\n            }\n\n            checkAll.addEventListener('change', function(){\n                picks.forEach(function(item){ item.checked = checkAll.checked; });\n                recalc();\n            });\n            rawInput.addEventListener('input', function(){\n                parseAndRender();\n                recalc();\n            });\n            totalInput.addEventListener('input', recalc);\n            totalMultiplierInput.addEventListener('input', recalc);\n            lossTargetInput.addEventListener('input', recalc);\n            oddsBiasInput.addEventListener('input', recalc);\n            lowThresholdInput.addEventListener('input', recalc);\n            lowMultiplierInput.addEventListener('change', recalc);\n            focusMarketInput.addEventListener('change', recalc);\n            focusBoostInput.addEventListener('input', recalc);\n            autoIgnoreInput.addEventListener('change', recalc);\n            maxOddInput.addEventListener('input', recalc);\n            probPriorityInput.addEventListener('input', recalc);\n            excludedGoalsInput.addEventListener('input', recalc);\n            flat20Input.addEventListener('change', function(){\n                if (flat20Input.checked) { flat40Input.checked = false; }\n                recalc();\n            });\n            flat40Input.addEventListener('change', function(){\n                if (flat40Input.checked) { flat20Input.checked = false; }\n                recalc();\n            });\n            applyMinBtn.addEventListener('click', function(){\n                if (!latestMinRequired) { return; }\n                var totalMultiplier = parseFloat(totalMultiplierInput.value || '1');\n                if (!isFinite(totalMultiplier) || totalMultiplier <= 0) { totalMultiplier = 1; }\n                totalInput.value = String(Math.ceil(latestMinRequired \/ totalMultiplier));\n                recalc();\n            });\n            applyRecommendBtn.addEventListener('click', function(){\n                if(!latestRecommended){ return; }\n                lowThresholdInput.value = String(latestRecommended.threshold);\n                lowMultiplierInput.value = String(latestRecommended.multiplier);\n                oddsBiasInput.value = String(latestRecommended.bias);\n                focusMarketInput.value = String(latestRecommended.focusTarget);\n                focusBoostInput.value = String(latestRecommended.focusBoostPct);\n                probPriorityInput.value = String(latestRecommended.probPriority);\n                var totalMultiplier = parseFloat(totalMultiplierInput.value || '1');\n                if (!isFinite(totalMultiplier) || totalMultiplier <= 0) { totalMultiplier = 1; }\n                totalInput.value = String(Math.ceil(latestRecommended.total \/ totalMultiplier));\n                recalc();\n            });\n            presetButtons.forEach(function(btn){\n                btn.addEventListener('click', function(){\n                    applyPreset(btn.getAttribute('data-preset') || 'balanced');\n                });\n            });\n            exportImageBtn.addEventListener('click', exportCurrentImage);\n            applyGoalFilterBtn.addEventListener('click', function(){\n                recalc();\n            });\n            goalShortcutButtons.forEach(function(btn){\n                btn.addEventListener('click', function(){\n                    excludedGoalsInput.value = btn.getAttribute('data-goals') || '';\n                    recalc();\n                });\n            });\n            analyzeBtn.addEventListener('click', analyzeSplitCombos);\n\n            parseAndRender();\n            recalc();\n        })();\n        <\/script>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\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>All in win \u9760\u767d\u5ad6\u54e5<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_gspb_post_css":"","footnotes":""},"class_list":["post-2908","page","type-page","status-publish","hentry"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nopassdev.com\/fr\/all-in-win\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\" \/>\n<meta property=\"og:description\" content=\"All in win \u9760\u767d\u5ad6\u54e5\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nopassdev.com\/fr\/all-in-win\/\" \/>\n<meta property=\"og:site_name\" content=\"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-13T04:31:42+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nopassdev.com\\\/all-in-win\\\/\",\"url\":\"https:\\\/\\\/nopassdev.com\\\/all-in-win\\\/\",\"name\":\"all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#website\"},\"datePublished\":\"2026-06-13T03:28:36+00:00\",\"dateModified\":\"2026-06-13T04:31:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nopassdev.com\\\/all-in-win\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nopassdev.com\\\/all-in-win\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nopassdev.com\\\/all-in-win\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\\\/\\\/nopassdev.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"all in win\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#website\",\"url\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/\",\"name\":\"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#organization\",\"name\":\"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\",\"url\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/nopassdev.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/LOGO-NEW.jpg\",\"contentUrl\":\"https:\\\/\\\/nopassdev.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/LOGO-NEW.jpg\",\"width\":1822,\"height\":306,\"caption\":\"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546\"},\"image\":{\"@id\":\"https:\\\/\\\/nopassdev.com\\\/zh\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nopassdev.com\/fr\/all-in-win\/","og_locale":"fr_FR","og_type":"article","og_title":"all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546","og_description":"All in win \u9760\u767d\u5ad6\u54e5","og_url":"https:\/\/nopassdev.com\/fr\/all-in-win\/","og_site_name":"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546","article_modified_time":"2026-06-13T04:31:42+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/nopassdev.com\/all-in-win\/","url":"https:\/\/nopassdev.com\/all-in-win\/","name":"all in win - \u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546","isPartOf":{"@id":"https:\/\/nopassdev.com\/zh\/#website"},"datePublished":"2026-06-13T03:28:36+00:00","dateModified":"2026-06-13T04:31:42+00:00","breadcrumb":{"@id":"https:\/\/nopassdev.com\/all-in-win\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nopassdev.com\/all-in-win\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nopassdev.com\/all-in-win\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/nopassdev.com\/"},{"@type":"ListItem","position":2,"name":"all in win"}]},{"@type":"WebSite","@id":"https:\/\/nopassdev.com\/zh\/#website","url":"https:\/\/nopassdev.com\/zh\/","name":"Fournisseurs de services transfrontaliers de sites web","description":"","publisher":{"@id":"https:\/\/nopassdev.com\/zh\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nopassdev.com\/zh\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/nopassdev.com\/zh\/#organization","name":"Fournisseurs de services transfrontaliers de sites web","url":"https:\/\/nopassdev.com\/zh\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/nopassdev.com\/zh\/#\/schema\/logo\/image\/","url":"https:\/\/nopassdev.com\/wp-content\/uploads\/2025\/07\/LOGO-NEW.jpg","contentUrl":"https:\/\/nopassdev.com\/wp-content\/uploads\/2025\/07\/LOGO-NEW.jpg","width":1822,"height":306,"caption":"\u8de8\u5883\u5efa\u7ad9\u670d\u52a1\u5546"},"image":{"@id":"https:\/\/nopassdev.com\/zh\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/pages\/2908","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/comments?post=2908"}],"version-history":[{"count":13,"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/pages\/2908\/revisions"}],"predecessor-version":[{"id":2921,"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/pages\/2908\/revisions\/2921"}],"wp:attachment":[{"href":"https:\/\/nopassdev.com\/fr\/wp-json\/wp\/v2\/media?parent=2908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}