:root{--bg: var(--tg-theme-bg-color, #ffffff);--bg2: var(--tg-theme-secondary-bg-color, #f2f3f5);--text: var(--tg-theme-text-color, #111111);--hint: var(--tg-theme-hint-color, #8a8f98);--link: var(--tg-theme-link-color, #2a7ae2);--btn: var(--tg-theme-button-color, #2a7ae2);--btn-text: var(--tg-theme-button-text-color, #ffffff);--ok: #2fb36b;--bad: #e5484d;--warn: #d99a00}*{box-sizing:border-box}html,body{margin:0;background:var(--bg2);color:var(--text);font:15px/1.4 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}#root{max-width:640px;margin:0 auto;padding:12px 16px 32px}h2{margin:8px 0 12px;font-size:20px}.center{display:flex;flex-direction:column;align-items:stretch;gap:10px;padding-top:12vh;text-align:center}.page{display:flex;flex-direction:column;gap:12px}.hint{color:var(--hint);font-size:13px}.err{color:var(--bad)}.note{color:var(--hint);font-size:12px;text-align:center}.note.warn{color:var(--warn)}input{width:100%;padding:12px;border-radius:10px;border:1px solid rgba(127,127,127,.3);background:var(--bg);color:var(--text);font-size:16px}input.pin{text-align:center;letter-spacing:8px;font-size:22px}button{padding:12px;border:0;border-radius:10px;background:var(--btn);color:var(--btn-text);font-size:16px;font-weight:600;cursor:pointer}button:disabled{opacity:.5}button.link,button.back{background:none;color:var(--link);font-weight:500;padding:8px 0}button.back{text-align:left}.card{background:var(--bg);border-radius:12px;padding:12px;display:flex;flex-direction:column;gap:6px}.card .h{font-weight:700}.row{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px solid rgba(127,127,127,.12)}.row:first-of-type{border-top:0}.row.btn{background:none;color:inherit;font-weight:400;text-align:left;border-radius:0;padding:8px 0}.grow{flex:1;min-width:0}.title{font-weight:600;overflow-wrap:anywhere}.chev{color:var(--hint);font-size:22px}.dot{width:10px;height:10px;border-radius:50%;flex:0 0 10px;background:var(--hint)}.dot.ok{background:var(--ok)}.dot.bad{background:var(--bad)}.tiles{display:grid;grid-template-columns:1fr 1fr;gap:10px}.tile{display:flex;flex-direction:column;align-items:flex-start;gap:4px;background:var(--bg);color:var(--text);border-radius:12px;padding:14px;font-weight:400;text-align:left}.tile b{font-size:16px}.tile span{color:var(--hint);font-size:13px}.tile.off{opacity:.5}.kv{display:flex;justify-content:space-between;gap:12px;padding:4px 0}.kv span{color:var(--hint)}.kv b{font-weight:600;text-align:right;overflow-wrap:anywhere}.switch,.tabs{display:flex;gap:6px;margin-bottom:10px}.switch button,.tabs button{flex:1;background:var(--bg);color:var(--text);font-weight:600;padding:10px}.switch button.on,.tabs button.on{background:var(--btn);color:var(--btn-text)}.switch small{font-weight:400;opacity:.75;font-size:12px}.switch small.bad{color:var(--bad);opacity:1;font-weight:700}.tabs button{padding:8px;font-size:14px}.filters{display:flex;gap:6px}select,textarea{width:100%;padding:10px;border-radius:10px;border:1px solid rgba(127,127,127,.3);background:var(--bg);color:var(--text);font-size:15px}textarea{min-height:80px;font-family:inherit}.tag{display:inline-flex;align-items:center;gap:4px;margin-left:6px;padding:1px 6px;border-radius:6px;background:var(--bg2);color:var(--hint);font-size:11px;font-weight:600}.tag .dot{width:8px;height:8px;flex-basis:8px}.btns{display:flex;gap:8px;align-items:center}.btns.wrap{flex-wrap:wrap}button.soon{background:var(--bg2);color:var(--hint);font-weight:500;font-size:13px;padding:8px 10px}button.soon small{font-size:10px;text-transform:uppercase;letter-spacing:.5px}.dot.off{background:#6b7280}.dot.warn{background:var(--warn)}.dot.info{background:var(--link)}.dot.none{background:transparent;border:1.5px solid var(--hint)}.pw{display:flex;flex-direction:column;gap:4px;padding:8px;border-radius:10px;background:var(--bg2)}.pw code{font-size:16px;-webkit-user-select:all;user-select:all;word-break:break-all}.fp{display:block;padding:8px;border-radius:8px;background:var(--bg2);word-break:break-all;font-size:13px}pre.out{margin:6px 0 0;padding:8px;border-radius:8px;background:var(--bg2);font-size:11px;line-height:1.35;white-space:pre-wrap;word-break:break-all;max-height:260px;overflow:auto}.step{display:inline-block;width:18px;text-align:center}.step.ok{color:var(--ok)}.step.fail{color:var(--bad)}.step.run{color:var(--link)}.step.skip{color:var(--warn)}.diag{display:flex;flex-direction:column;gap:2px;margin-top:6px}label.hint{margin-top:4px}.subtabs{display:flex;gap:12px;margin:-2px 0 8px}.subtabs button{background:none;color:var(--hint);padding:4px 0;font-size:14px;font-weight:600}.subtabs button.on{color:var(--link)}button.mini{padding:3px 8px;font-size:11px;border-radius:7px;margin-left:6px;background:var(--bg2);color:var(--link);font-weight:600}textarea.code{min-height:50vh;font-family:ui-monospace,Menlo,monospace;font-size:12px;white-space:pre}.fresh{display:flex;justify-content:space-between;align-items:center;margin:2px 0 6px}.flag{margin-right:4px}details.fallback summary{cursor:pointer;color:var(--hint);font-size:13px;margin-top:6px}.ipline{display:flex;align-items:center;justify-content:space-between;font-size:17px;font-weight:700}.plate{padding:8px 10px;border-radius:8px;font-weight:600;margin:6px 0}.plate.bad,button.danger{background:#c62828;color:#fff}.ro button:not(.row):not(.nav):not(.mini):not(.back){opacity:.4;pointer-events:none}.ro input,.ro textarea{pointer-events:none;opacity:.6}.ro .filters select,.ro input[placeholder^=Поиск]{pointer-events:auto;opacity:1}.note.rohead{margin:6px 0}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:flex-end;justify-content:center;z-index:50}.modal .sheet{background:var(--bg, #fff);width:100%;max-width:560px;max-height:88vh;overflow:auto;border-radius:14px 14px 0 0;padding:14px 16px 22px;box-sizing:border-box}details.more{margin-top:6px}details.more summary{cursor:pointer;color:var(--hint);font-size:13px}html.rw-on,html.rw-on body{background:#0d1117}.rw,html.rw-on #root{--bg: #0d1117;--bg2: #010409;--text: #c9d1d9;--hint: #8b949e;--link: #3bc9db;--btn: rgba(34, 184, 207, .16);--btn-text: #66d9e8;--ok: #3fb950;--bad: #f85149;--warn: #d29922;--line: rgba(255, 255, 255, .08);--head: #e6edf3;--surface: #161b22;color:var(--text);font-size:15px}.rw h2{color:var(--head);font-weight:600;font-size:21px;letter-spacing:.2px;margin:6px 0 10px}.rw .card{background:#ffffff06;border:1px solid var(--line);border-radius:8px;padding:14px;gap:8px}.rw .card .h{color:var(--head);font-weight:600;font-size:14px;letter-spacing:.3px;padding-bottom:6px;border-bottom:1px solid var(--line);margin-bottom:2px}.rw .kv{padding:7px 0;border-top:1px solid var(--line);align-items:baseline}.rw .kv:first-of-type{border-top:0}.rw .kv span{color:var(--hint);font-size:13px}.rw .kv b{color:var(--head);font-weight:500}.rw .row{border-top:1px solid var(--line);padding:10px 0;min-height:44px}.rw .hint{color:var(--hint)}.rw .err{color:#ff7b72}.rw button{min-height:44px;border-radius:8px;background:var(--btn);color:var(--btn-text);border:1px solid rgba(34,184,207,.32);font-weight:600;font-size:15px;padding:10px 14px}.rw button:disabled{opacity:.45}html.rw-on button.back{background:none;color:#3bc9db}.rw button.link,.rw button.back{background:none;border:0;color:var(--link);font-weight:500;padding:10px 0;min-height:40px}.rw button.row.btn{background:none;border:0;border-top:1px solid var(--line);border-radius:0;color:inherit;font-weight:400}.rw button.mini{min-height:30px;padding:4px 10px;font-size:12px;background:transparent;border:1px solid rgba(34,184,207,.45);color:var(--btn-text);border-radius:6px}.rw button.danger{background:#da3633;border-color:#f85149;color:#fff}.rw input,.rw select,.rw textarea{background:var(--bg2);border:1px solid #30363d;color:var(--head);border-radius:8px;min-height:44px}.rw input:focus,.rw select:focus,.rw textarea:focus{outline:none;border-color:#22b8cf}.rw .tag{background:transparent;border:1px solid #30363d;color:var(--hint);border-radius:6px}.rw .note{color:var(--hint)}.rw .note.warn{color:#e3b341;background:#d299221f;border:1px solid rgba(210,153,34,.45);border-radius:8px;padding:9px 11px;text-align:left;font-size:13px}.rw .plate{border-radius:8px;padding:11px 12px;font-size:15px}.rw .plate.bad{background:#da3633;color:#fff;border:1px solid #f85149;font-weight:700}.rw pre.out,.rw .fp,.rw .pw{background:var(--bg2);border:1px solid var(--line);color:var(--text);font-family:ui-monospace,SF Mono,Menlo,monospace}.rw .diag{gap:4px}.rw details.more summary,.rw details.fallback summary{color:var(--link);padding:8px 0}.rw .modal .sheet{background:var(--surface);border:1px solid var(--line);border-bottom:0}.rw .step.run{color:var(--link)}.rw .dot{box-shadow:0 0 0 3px #ffffff0a}.rw .switch button,.rw .tabs button{background:#ffffff08;color:var(--hint);border:1px solid var(--line)}.rw .switch button.on,.rw .tabs button.on{background:#22b8cf38;color:var(--head);border-color:#22b8cf}.rw .subtabs button{background:none;border:0;min-height:36px}.rw .subtabs button.on{color:var(--link)}.rw .tile{background:#ffffff06;border:1px solid var(--line);color:var(--text)}.rw button.wide{width:100%;margin-top:6px}.rw button:disabled{opacity:.38;filter:grayscale(1)}.rw .card{gap:10px}.rw details.fallback,.rw details.more{margin-top:8px}.rw details[open]>*:not(summary){margin-top:8px}.rw .btns{gap:10px;margin-top:4px}.rw .kv.stack{flex-direction:column;align-items:flex-start;gap:2px}.rw .kv.stack b{text-align:left}.rw .plate.warnplate{background:#d2992229;color:#e3b341;border:1px solid rgba(210,153,34,.55);font-weight:600}.copyable{color:#58a6ff;cursor:pointer;text-decoration:underline dotted rgba(88,166,255,.5);text-underline-offset:3px;overflow-wrap:anywhere}.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom));transform:translate(-50%);z-index:100;background:#161b22;color:#e6edf3;border:1px solid rgba(255,255,255,.12);border-radius:999px;padding:8px 16px;font-size:13px;box-shadow:0 6px 20px #00000073;animation:toastIn .15s ease-out}@keyframes toastIn{0%{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%)}}.rw .filterbox{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--line);border-radius:8px;background:#ffffff05}.rw .filterbox label{display:flex;flex-direction:column;gap:4px;color:var(--hint);font-size:13px}.rw .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px}.rw button.on{background:#22b8cf47;border-color:#22b8cf;color:var(--head)}.rw details.card.fold>summary{cursor:pointer;list-style:none;border-bottom:0;padding-bottom:0;margin:0}.rw details.card.fold[open]>summary{border-bottom:1px solid var(--line);padding-bottom:6px}.rw details.card.fold>summary:after{content:" ▾";color:var(--hint)}.rw details.card.fold[open]>summary:after{content:" ▴"}.rw .kv b.big{font-size:18px;font-weight:600}.rw .nodechip{display:inline-flex;align-items:center;gap:4px;margin:2px 12px 2px 0}.rw .kv b.big,.rw .kv b.big .copyable{font-size:20px;font-weight:600}.rw .card>.h+.row,.rw .card>.h+button.row.btn,.rw .card>button.row.btn:first-child,.rw .card>.row:first-child{border-top:0}.rw .iprow{padding:10px 0;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:4px}.rw .card>.h+.iprow{border-top:0}.rw .ipline2{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600}.rw .ipicon{font-size:14px}.rw .ipstate{margin-left:auto;font-size:12px;font-weight:600;padding:2px 8px;border-radius:6px;border:1px solid var(--line);color:var(--hint)}.rw .ipstate.s-free{color:#3fb950;border-color:#3fb95080}.rw .ipstate.s-busy{color:#58a6ff;border-color:#58a6ff80}.rw .ipstate.s-rkn{color:#fff;background:#da3633;border-color:#f85149}.rw .ipstate.s-bad{color:#e6edf3;background:#30363d;border-color:#484f58}.rw .hint.stale{color:#6e7681;font-style:italic}.rw .iprow button.mini{align-self:flex-start;margin-left:0}.rw button.row.btn.att{border:1px solid;border-left-width:4px;border-radius:8px;padding:10px;margin:4px 0}.rw button.row.btn.att+button.row.btn{border-top:0}.rw button.row.btn.att.bad{background:#ef444421;border-color:#ef44448c}.rw button.row.btn.att.warn{background:#f59e0b21;border-color:#f59e0b8c}.rw button.row.btn.att.off{background:#6b72801f;border-color:#6b728066;opacity:.7}.rw .attlabel{display:inline-block;margin-left:8px;padding:1px 7px;border-radius:6px;font-size:12px;font-weight:600;vertical-align:1px}.rw .attlabel.bad{background:#ef444438;color:#ff8a8a}.rw .attlabel.warn{background:#f59e0b38;color:#f5c060}.rw .attlabel.off{background:#6b728040;color:#c0c4cc}.rw .lock{display:inline-block;margin-left:8px;font-size:12px;font-weight:500;color:var(--hint)}.rw button.row.btn.att.ok{background:#2dd4bf26;border-color:#2dd4bf4d}[hidden]{display:none!important}.prod-space{--prod: #8b5cf6;--prod-bg: #3b1f6b;--prod-fg: #fff;--prod-label: none;--prod-btn: none}.prod-astra{--prod: #eab308;--prod-bg: #4a3a00;--prod-fg: #fff6d6;--prod-label: "🟡 ASTRA";--prod-btn: " в ASTRA"}.rw .switch button.space.on{background:#7c3aed59;border-color:#8b5cf6;color:#fff}.rw .switch button.astra.on{background:#eab30847;border-color:#eab308;color:#fff6d6}html.space-on body{box-shadow:inset 0 4px #8b5cf6}html.astra-on body{box-shadow:inset 0 4px #eab308}.prodhead{position:sticky;top:0;z-index:5;margin:6px 0;padding:10px 12px;border-radius:8px;font-weight:700;background:var(--prod-bg);color:var(--prod-fg);border:1px solid var(--prod);text-align:center}.prod-space .diag:not(.noprod):before,.prod-astra .diag:not(.noprod):before{content:var(--prod-label);display:block;margin:-2px 0 8px;padding:8px 10px;border-radius:6px;background:var(--prod-bg);color:var(--prod-fg);font-weight:700;border:1px solid var(--prod)}.prod-space .diag:not(.noprod) .btns>button:not(.link):after,.prod-space .diag:not(.noprod) .row2>button:not(.link):after,.prod-astra .diag:not(.noprod) .btns>button:not(.link):after,.prod-astra .diag:not(.noprod) .row2>button:not(.link):after{content:var(--prod-btn);font-weight:800}.prod-space .diag:not(.noprod) .btns>button:not(.link),.prod-space .diag:not(.noprod) .row2>button:not(.link),.prod-astra .diag:not(.noprod) .btns>button:not(.link),.prod-astra .diag:not(.noprod) .row2>button:not(.link){border-color:var(--prod)}.diag.noprod:before{content:"⚠️ МАШИНА ЦЕЛИКОМ — все её ноды, Duck Net и Astra";display:block;margin:-2px 0 8px;padding:8px 10px;border-radius:6px;background:#5a1414;color:#fff;font-weight:700;border:1px solid #ef4444}.ipadd input{width:100%;box-sizing:border-box;margin-bottom:6px}.ipadd label{display:block;margin-top:4px}.kv.lvl-bad b{color:var(--bad)}.kv.lvl-warn b{color:var(--warn)}pre.filetext{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;max-width:100%;overflow-x:auto;background:#7f7f7f1a;padding:8px;border-radius:6px}.jsonedit{display:flex;flex-direction:column;gap:4px}.jsonedit textarea.code,.rw .jsonedit textarea.code{min-height:0;resize:none;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-all;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.4;-moz-tab-size:2;tab-size:2;padding:8px;-webkit-overflow-scrolling:touch}.jsonedit .jbar{display:flex;align-items:center;gap:4px}.jsonedit .jst{font-size:13px;font-weight:600;color:var(--hint)}.jsonedit .jst.ok{color:var(--ok)}.rw .jsonedit button.jst.bad,.jsonedit button.jst.bad{background:none;border:0;color:var(--bad);padding:0;min-height:0;font-size:13px}.rw .jsonedit .jbar button.mini{min-height:32px;margin-left:0}.jsonedit .jerr pre.out{margin-top:4px}.jsonedit.full{position:fixed;left:0;right:0;z-index:60;padding:0 6px 4px;gap:0;background:var(--bg, #0d1117)}.jsonedit.full .jbar{padding:0 4px;border-bottom:1px solid var(--line, rgba(127,127,127,.2))}.jsonedit.full textarea.code{border-radius:0;border:0}.jsonedit .jerr-full{position:absolute;left:6px;right:6px;bottom:4px;padding:6px 8px;border-radius:6px;font-size:12px;background:#5a1414;color:#fff;pointer-events:none}.rw button,.rw button.mini,.rw button.on,.rw .switch button.on,.rw .tabs button.on{background:#15aabf;color:#fff;border:0;box-shadow:0 0 14px #15aabf73}.rw button:not(:disabled):active{background:#1098ad;box-shadow:0 0 8px #15aabf59}.rw button:disabled{box-shadow:none}.rw .switch button,.rw .tabs button{box-shadow:none}.rw button.danger{background:#da3633;color:#fff;border:0;box-shadow:0 0 14px #da363366}.rw button.link,.rw button.back,.rw button.row.btn,.rw .subtabs button{box-shadow:none}.rw .srvrow .title{font-size:17px}.rw .srvrow .flag{margin-right:6px}.rw .srvip{color:var(--head);font-size:15px;font-weight:600;font-family:ui-monospace,SF Mono,Menlo,monospace;margin-top:2px}.rw .prod{display:inline-block;margin-left:6px;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:700;letter-spacing:.3px;vertical-align:middle}.rw .prod.space{background:#9775fa33;color:#b197fc}.rw .prod.astra{background:#fab0052e;color:#ffd43b}.rw .prod.none{background:#ffffff0f;color:var(--hint)}.rw button.row.btn.noderow{padding:14px 0;min-height:60px}.rw .noderow .title{font-size:17px}.rw .noderow .hint{font-size:13px;margin-top:2px}.rw .onl{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:999px;font-size:14px;font-weight:700;background:#15aabf29;color:#66d9e8;white-space:nowrap}.rw .onl.zero{background:#ffffff0f;color:var(--hint)}.rw .onl svg{width:15px;height:15px}.rw .subtabs button.on{background:#15aabf;color:#fff;box-shadow:0 0 14px #15aabf73}.rw textarea.keybox{min-height:140px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:11px;white-space:pre;overflow-x:auto}.rw label.filepick{color:var(--link);font-size:14px;cursor:pointer;padding:4px 0}.rw label.filepick input{display:none}.rw .kv b code{font-size:12px;color:var(--hint);word-break:break-all}
