🎄 Sync 2026-09-26 02:25:56

This commit is contained in:
github-actions[bot] committed 2026-09-26 02:25:56 +08:00
1 parent 99196a85d3
commit 4136a9b488
73 files changed
+2401 -4124

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-daede
PKG_VERSION:=1.15
PKG_RELEASE:=45
PKG_RELEASE:=46
PKG_MAINTAINER:=kenzok8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
@@ -295,7 +295,7 @@ return view.extend({
function applyFilter() {
const f = state.filter;
pane.querySelectorAll('.dd-line').forEach(function(el) {
if (matchesFilter(el.textContent, f))
if (matchesFilter(el._rawLine, f))
el.classList.remove('dd-hidden');
else
el.classList.add('dd-hidden');
@@ -309,6 +309,7 @@ return view.extend({
const ln = lines[i];
if (!ln) continue;
const el = buildLine(ln);
el._rawLine = ln;
if (!matchesFilter(ln, state.filter))
el.classList.add('dd-hidden');
frag.appendChild(el);
@@ -446,17 +446,19 @@ return view.extend({
healthBody.appendChild(mkRow('✓', 'dd-up-ok', _('Hot reload'), _('/etc/init.d/dae hot_reload is available')));
}
if (ctx.backend.useNetns && ns && ns.exists) {
if (ctx.backend.useNetns && ns && ns.exists && running[ctx.name]) {
healthBody.appendChild(mkRow('✓', 'dd-up-ok', _('netns daens'), HEALTH_PATHS.netns + ' · ' + _('in use by daed')));
} else if (ctx.backend.useNetns && ns && ns.exists) {
const btn = E('button', { 'class': 'dd-up-btn' }, _('Clean'));
btn.addEventListener('click', function() {
const daedRunning = !!(running && running[ctx.name]);
const msg = daedRunning
? _('%s is running. Deleting the daens netns now will break its networking until you restart it. Continue?').format(ctx.name)
: _('Delete the daens netns?');
if (!confirm(msg))
return;
btn.disabled = true;
fs.exec('/sbin/ip', ['netns', 'del', 'daens']).finally(function() { btn.disabled = false; });
backend.detectRunning().then(function(now) {
const msg = now[ctx.name]
? _('%s is running. Deleting the daens netns now will break its networking until you restart it. Continue?').format(ctx.name)
: _('Delete the daens netns?');
if (confirm(msg))
return fs.exec('/sbin/ip', ['netns', 'del', 'daens']);
}).finally(function() { btn.disabled = false; });
});
healthBody.appendChild(mkRow('⚠', 'dd-up-warn', _('netns daens'), HEALTH_PATHS.netns + ' · ' + _('exists, may block daed start'), btn));
} else if (ctx.backend.useNetns) {
+3
View File
@@ -372,6 +372,9 @@ msgstr "dae 热重载可用"
msgid "netns daens removed."
msgstr "netns daens 已清理。"
msgid "in use by daed"
msgstr "daed 运行中,正在使用"
msgid "exists, may block daed start"
msgstr "已存在,可能阻碍 daed 启动"
+1 -1
View File
@@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter
LUCI_PKGARCH:=all
PKG_VERSION:=0.1.45
PKG_RELEASE:=37
PKG_RELEASE:=38
# Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI).
ifdef SOURCE_DATE_EPOCH
@@ -17,26 +17,9 @@
*/
function chipFieldLabel(spec) {
switch (spec.key) {
case 'q':
return _('Search');
case 'action':
return _('Action');
case 'interface':
return _('Interface');
case 'proto':
return _('Proto');
case 'src':
return _('Source');
case 'dst':
return _('Destination');
case 'sport':
return _('Source port');
case 'dport':
return _('Destination port');
default:
return spec.label || spec.key;
}
const mapped = log.filterFieldLabel(spec.key);
if (mapped !== spec.key) return mapped;
return spec.label || spec.key;
}
function chipValueNodes(spec, val) {
@@ -58,9 +41,7 @@ function chipValueNodes(spec, val) {
if (key === 'q' || key === 'src' || key === 'dst')
return [
label + ': ',
E('strong', { 'class': 'fwlive-chip-not' }, [_('not')]),
' ',
_('contains'),
E('strong', { 'class': 'fwlive-chip-not' }, [_('does not contain')]),
' ',
valueNode
];
@@ -60,7 +60,7 @@ function filterLink(field, value, label, onFilterClick) {
{
'href': '#',
'class': 'fwlive-filter-link',
'title': _('Filter by %s').format(field),
'title': _('Filter by %s').format(log.filterFieldLabel(field)),
'click': function (ev) {
onFilterClick(field, value, ev);
}
@@ -88,7 +88,7 @@ function addrFilterLink(field, ip, showHostnames, hostnameCache, onFilterClick)
: hostnameCache.get(ip);
}
const display = name || ip;
const title = name ? ip : _('Filter by %s').format(field);
const title = name ? ip : _('Filter by %s').format(log.filterFieldLabel(field));
return E(
'a',
@@ -153,7 +153,7 @@ function ifaceLink(value, onFilterClick) {
{
'href': '#',
'class': 'fwlive-filter-link fwlive-iface-badge',
'title': _('Filter by interface'),
'title': _('Filter by %s').format(log.filterFieldLabel('interface')),
'click': function (ev) {
onFilterClick('interface', value, ev);
}
@@ -26,6 +26,8 @@ const CLASSIFY_SPEC = {
'PREC',
'DF'
],
/* Classify trim (not JS String#trim): ASCII space/tab/LF/CR + NBSP (U+00A0). */
trimWhitespace: [' ', '\t', '\n', '\r', '\u00a0'],
nonFirewallPrefixes: [
'dnsmasq',
'procd',
@@ -64,6 +66,15 @@ function wordPattern(words) {
return new RegExp('(^|[^A-Za-z0-9_])(' + alt + ')([^A-Za-z0-9_]|$)', 'i');
}
function classifyTrim(s) {
const ws = CLASSIFY_SPEC.trimWhitespace;
let start = 0;
let end = s.length;
while (start < end && ws.indexOf(s.charAt(start)) >= 0) start++;
while (end > start && ws.indexOf(s.charAt(end - 1)) >= 0) end--;
return s.slice(start, end);
}
/* ---- spec-derived classification regexes (mirror core/fwlive-log.js) ---- */
const DENY_CLASS_WORDS = CLASSIFY_SPEC.actionWords.slice(3);
const NON_FIREWALL_PREFIX = new RegExp(
@@ -335,10 +346,25 @@ return baseclass.extend({
return m;
},
filterFieldLabel: function (field) {
const labels = {
'q': _('Search'),
'action': _('Action'),
'interface': _('Interface'),
'proto': _('Proto'),
'src': _('Source'),
'dst': _('Destination'),
'sport': _('Source port'),
'dport': _('Destination port')
};
return labels[field] || field;
},
/* @fwlive-codegen:luci-preserve-end */
isFirewallEvent: function (entry) {
const msg = this.normalizeNetfilterMessage((entry && entry.msg) || '').trim();
const msg = classifyTrim(this.normalizeNetfilterMessage((entry && entry.msg) || ''));
if (!msg) return false;
if (this.NON_FIREWALL_PREFIX.test(msg)) return false;
@@ -17,7 +17,7 @@
*
* renderManualTestNodes(host, state, callbacks) → void
* host - <ul> element inside #fwlive-help (cleared and rebuilt)
* state - unused; nft-only instruction
* state - unused; instruction is nft-only (rpcd never emits iptables)
*
* Empty-state helpers:
* buildEmptyStateNodes(state, callbacks) → Node[]
@@ -200,17 +200,17 @@ function buildConsentPanel(state, callbacks) {
E('li', {}, [
E('strong', {}, [_('Changes:')]),
' ',
_('sets log on the WAN firewall zone and reloads the firewall.')
_('Turns on logging for the WAN firewall zone and reloads the firewall.')
]),
E('li', {}, [
E('strong', {}, [_('Does not change:')]),
' ',
_('allow/deny rules, LAN logging, or anything else.')
_('Allow/deny rules, LAN logging, or anything else.')
]),
E('li', {}, [
E('strong', {}, [_('Undo:')]),
' ',
_('turn it back off with the WAN logging on control on the watch strip.')
_('Turn it back off with the WAN logging control on the watch strip.')
])
]),
E('p', { 'class': 'fwlive-consent-check' }, [
@@ -272,7 +272,8 @@ function buildEmptyStateNodes(state, callbacks) {
);
nodes.push(
E('p', {}, [
_('No WAN firewall zone found in /etc/config/firewall. Configure zones under '),
_('No WAN firewall zone found in /etc/config/firewall. Configure zones under:'),
' ',
links.firewallZonesLink()
])
);
@@ -368,19 +369,21 @@ function renderEmptyState(host, state, callbacks) {
}
/**
* renderManualTestNodes — fills a <li> host element with the nft manual test
* renderManualTestNodes — fills a <li> host element with the firewall manual test
* instruction. Call from addFooter() after render() has inserted
* the placeholder <li id="fwlive-manual-test">.
*/
function renderManualTestNodes(host, _state, _callbacks) {
host.innerHTML = '';
host.appendChild(document.createTextNode(_('Manual test (System → Terminal): ')));
host.appendChild(document.createTextNode(_('Manual test (System → Terminal):')));
host.appendChild(document.createTextNode(' '));
host.appendChild(
E('code', {}, [
'nft insert rule inet fw4 input ip protocol icmp icmp type echo-request log prefix "fwlive-ping " accept'
])
);
host.appendChild(document.createTextNode(_(' then ping the router.')));
host.appendChild(document.createTextNode(' '));
host.appendChild(document.createTextNode(_('Then ping the router.')));
}
return baseclass.extend({
@@ -52,6 +52,28 @@ function columnLabel(col) {
return labels[col] || col;
}
function dirLabel(dir) {
const labels = {
'in': _('Inbound'),
'out': _('Outbound'),
'forward': _('Forwarded'),
'unknown': _('unknown')
};
return labels[dir] || log.formatCell(dir);
}
function actionLabel(action) {
const labels = {
'pass': _('pass'),
'block': _('block'),
'drop': _('drop'),
'reject': _('reject')
};
return labels[action] || log.formatActionLabel(action);
}
function columnCellClass(col) {
switch (col) {
case 'time':
@@ -124,12 +146,7 @@ function buildColumnCell(col, row, state, callbacks) {
const msgDisplay = log.formatMessageDisplay(row.message, state.messageLayout);
const actionCell =
row.action && row.action !== 'unknown'
? links.filterLink(
'action',
row.action,
log.formatActionLabel(row.action),
onFilterClick
)
? links.filterLink('action', row.action, actionLabel(row.action), onFilterClick)
: log.formatActionLabel(row.action);
switch (col) {
@@ -162,7 +179,7 @@ function buildColumnCell(col, row, state, callbacks) {
)
]);
case 'dir':
return E('td', { 'class': columnCellClass(col) }, [log.formatCell(row.direction)]);
return E('td', { 'class': columnCellClass(col) }, [dirLabel(row.direction)]);
case 'proto':
return E('td', { 'class': columnCellClass(col) }, [
links.filterLink('proto', row.proto, null, onFilterClick)
@@ -2488,11 +2488,11 @@ return view.extend({
}),
E('select', { 'id': 'fwlive-action', 'class': 'cbi-input-select' }, [
E('option', { 'value': '' }, [_('Any action')]),
E('option', { 'value': 'pass' }, ['pass']),
E('option', { 'value': 'block' }, ['block']),
E('option', { 'value': 'drop' }, ['drop']),
E('option', { 'value': 'reject' }, ['reject']),
E('option', { 'value': 'unknown' }, ['unknown']),
E('option', { 'value': 'pass' }, [_('pass')]),
E('option', { 'value': 'block' }, [_('block')]),
E('option', { 'value': 'drop' }, [_('drop')]),
E('option', { 'value': 'reject' }, [_('reject')]),
E('option', { 'value': 'unknown' }, [_('unknown')]),
E('option', { 'value': '!pass' }, [_('not pass')]),
E('option', { 'value': '!drop' }, [_('not drop')]),
E('option', { 'value': '!block' }, [_('not block')]),
@@ -2607,7 +2607,8 @@ return view.extend({
this.updateTintWarnUi();
this.renderRows(true);
const testLi = document.getElementById('fwlive-manual-test');
if (testLi) logging.renderManualTestNodes(testLi, {}, {});
if (testLi)
logging.renderManualTestNodes(testLi, { firewallBackend: this.firewallBackend }, {});
if (this.showHostnames) this.resolveHostnamesForEntries(this.filteredRows());
}
});
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,3 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
@@ -17,7 +15,7 @@ msgid ""
"messages returned"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:467
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:493
msgid "%s: %s"
msgstr ""
@@ -29,7 +27,7 @@ msgstr ""
msgid "Accessible (teal/orange)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:24
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:353
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
msgid "Action"
msgstr ""
@@ -42,6 +40,10 @@ msgstr ""
msgid "Administrator access is required to enable logging."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:208
msgid "Allow/deny rules, LAN logging, or anything else."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
msgid "Also seen"
msgstr ""
@@ -84,7 +86,7 @@ msgstr ""
msgid "Classic uses green/red; Accessible uses teal/orange"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:169
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:150
msgid "Clear all"
msgstr ""
@@ -100,7 +102,7 @@ msgid ""
"view)."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:139
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:156
msgid "Click a row for the full message"
msgstr ""
@@ -155,7 +157,7 @@ msgstr ""
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:32
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:357
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
msgid "Destination"
msgstr ""
@@ -164,7 +166,7 @@ msgstr ""
msgid "Destination IP contains (! to exclude)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:36
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:359
msgid "Destination port"
msgstr ""
@@ -231,7 +233,7 @@ msgstr ""
msgid "Exclude"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:105
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:86
msgid "Exclude instead"
msgstr ""
@@ -247,14 +249,11 @@ msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:63
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:91
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:156
msgid "Filter by %s"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:156
msgid "Filter by interface"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:129
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:128
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
msgstr ""
@@ -277,6 +276,10 @@ msgid ""
"The weak-device cap affects rendered rows; the buffer can still retain more."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:59
msgid "Forwarded"
msgstr ""
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
msgid "Grant access to firewall live log view"
msgstr ""
@@ -314,17 +317,21 @@ msgid ""
"data leaves the device)."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:320
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:321
msgid ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:105
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:57
msgid "Inbound"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:86
msgid "Include instead"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:26
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:354
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
msgid "Interface"
msgstr ""
@@ -334,15 +341,15 @@ msgid "Interface (prefix ! to exclude)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:244
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:358
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:359
msgid "I’ll configure this under Network → Firewall"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:283
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:284
msgid "Kernel log modules missing"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:286
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:287
msgid ""
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
@@ -364,7 +371,7 @@ msgstr ""
msgid "Live view may be incomplete — a legacy iptables table is registered"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:329
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:330
msgid "Logging is off on this router"
msgstr ""
@@ -383,7 +390,7 @@ msgid ""
"budget, not the polling interval."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:377
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:378
msgid "Manual test (System → Terminal):"
msgstr ""
@@ -392,7 +399,7 @@ msgid "Maximum raw lines"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:49
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:313
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:330
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2417
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2424
msgid "Message"
@@ -408,7 +415,7 @@ msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:275
msgid ""
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
"No WAN firewall zone found in /etc/config/firewall. Configure zones under:"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:270
@@ -424,7 +431,7 @@ msgstr ""
msgid "Not now"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:352
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:353
msgid "Nothing changes until you click Enable."
msgstr ""
@@ -436,17 +443,21 @@ msgstr ""
msgid "One line"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:325
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:326
msgid "Open firewall zone settings"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:332
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:333
msgid ""
"OpenWrt does not write firewall events to the log until you turn logging on. "
"Live View only shows what the firewall already logs — it does not add allow/"
"deny rules."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:58
msgid "Outbound"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2215
msgid "Palette"
msgstr ""
@@ -460,7 +471,7 @@ msgstr ""
msgid "Paused"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:355
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
msgid "Proto"
msgstr ""
@@ -473,7 +484,7 @@ msgstr ""
msgid "Quick search"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:128
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:109
msgid "Remove filter"
msgstr ""
@@ -518,7 +529,7 @@ msgstr ""
msgid "SPort"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:22
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:352
msgid "Search"
msgstr ""
@@ -559,7 +570,7 @@ msgstr ""
msgid "Simple"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:30
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:356
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
msgid "Source"
msgstr ""
@@ -568,7 +579,7 @@ msgstr ""
msgid "Source IP contains (! to exclude)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:34
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/log.js:358
msgid "Source port"
msgstr ""
@@ -622,6 +633,15 @@ msgstr ""
msgid "Theme tint fallback"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:386
msgid "Then ping the router."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:304
msgid ""
"This router reported a logging blocker that Live View does not recognize yet."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
msgid "Time"
msgstr ""
@@ -638,13 +658,21 @@ msgstr ""
msgid "Top talkers"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:346
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:213
msgid "Turn it back off with the WAN logging control on the watch strip."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:347
msgid ""
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
"LAN browsing is not logged."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
msgid "Turns on logging for the WAN firewall zone and reloads the firewall."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
msgid "Undo:"
msgstr ""
@@ -662,7 +690,7 @@ msgstr ""
msgid "WAN drop/reject logging is off."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:313
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:314
msgid ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
@@ -686,6 +714,11 @@ msgstr ""
msgid "WAN logging on (%s). Click to disable."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:120
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:301
msgid "WAN logging unavailable"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:112
msgid "WAN logging unavailable: missing kernel log modules"
msgstr ""
@@ -694,7 +727,7 @@ msgstr ""
msgid "WAN logging unavailable: no WAN zone"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:310
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:311
msgid "Waiting for firewall events"
msgstr ""
@@ -707,8 +740,9 @@ msgstr ""
msgid "Wrap"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:208
msgid "allow/deny rules, LAN logging, or anything else."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:69
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2492
msgid "block"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1122
@@ -719,15 +753,20 @@ msgstr ""
msgid "buffer full"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:63
msgid "contains"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:127
msgid "default 10/minute"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:52
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
msgid "does not contain"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:70
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2493
msgid "drop"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:35
msgid "is"
msgstr ""
@@ -744,8 +783,7 @@ msgstr ""
msgid "none"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:61
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:68
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:49
msgid "not"
msgstr ""
@@ -809,6 +847,16 @@ msgstr ""
msgid "or type…"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:68
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2491
msgid "pass"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:71
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2494
msgid "reject"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1128
msgid "render paused (high rate)"
msgstr ""
@@ -821,20 +869,13 @@ msgstr ""
msgid "scroll frozen — scroll to top to follow live"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
msgid "sets log on the WAN firewall zone and reloads the firewall."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:383
msgid "then ping the router."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1136
msgid "truncated"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:213
msgid "turn it back off with the WAN logging on control on the watch strip."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:60
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2495
msgid "unknown"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:697
@@ -845,11 +886,3 @@ msgstr ""
msgid "· %s"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:303
msgid "This router reported a logging blocker that Live View does not recognize yet."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:120
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:300
msgid "WAN logging unavailable"
msgstr ""
File diff suppressed because it is too large. Load diff
@@ -15,8 +15,8 @@ function normalize(s, keys, n, i, k) {
return s
}
function trim(s) {
sub(/^[[:space:]]+/, "", s)
sub(/[[:space:]]+$/, "", s)
sub(/^([ \t\n\r]|\302\240)+/, "", s)
sub(/([ \t\n\r]|\302\240)+$/, "", s)
return s
}
function has_kv(s, key) {
@@ -136,11 +136,17 @@ function summary_rule(s, first) {
s = trim(normalize(s))
sub(/^\[[[:space:]]*[0-9.]+\][[:space:]]*/, "", s)
if (tolower(s) ~ /^fw4:[[:space:]]*/) return "fw4"
first = s
sub(/[[:space:]:].*/, "", first)
if (first == "" || first ~ /^(IN|OUT|SRC|DST|PROTO|SPT|DPT|LEN|MAC|TYPE|CODE|TTL|TOS|PREC|DF)=/) return ""
if (tolower(first) == "kernel" || tolower(first) == "iptables") return ""
return utf8_prefix(first, 64)
# Shared with parseRuleHint: token then IN=/OUT=/SRC=/DST=/PROTO=, else colon tag.
if (match(s, "^[A-Za-z0-9_.-]+(:|[[:space:]]+)(IN=|OUT=|SRC=|DST=|PROTO=)")) {
match(s, "^[A-Za-z0-9_.-]+")
return utf8_prefix(substr(s, RSTART, RLENGTH), 64)
}
if (match(s, "^[A-Za-z0-9_.-]+:")) {
first = substr(s, RSTART, RLENGTH - 1)
if (tolower(first) == "kernel" || tolower(first) == "iptables") return ""
return utf8_prefix(first, 64)
}
return ""
}
function summary_add_count(counts, key) {
if (key != "") counts[key]++
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.9.16
PKG_RELEASE:=291
PKG_RELEASE:=292
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -524,10 +524,18 @@ o:depends({ protocol = "naive" })
o = s:option(Flag, "tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped."))
o.default = "0"
o:depends({ tls = true })
o:depends({ protocol = "hysteria"})
o:depends({ protocol = "hysteria" })
o:depends({ protocol = "tuic" })
o:depends({ protocol = "hysteria2" })
o = s:option(Value, "tls_pinSHA256", translate("TLS Chain Fingerprint (SHA256)"))
o:depends({ tls = true })
o:depends({ protocol = "hysteria" })
o:depends({ protocol = "tuic" })
o:depends({ protocol = "hysteria2" })
o.description = translate("Once set, connects only when the server’s chain fingerprint matches.") ..
string.format("<a href='javascript:void(0)' onclick='javascript:fetchCertSha256(this)'>%s</a>", "→ " .. translate("Fetch Manually"))
o = s:option(Flag, "tls_certificate", translate("TLS Certificate (PEM)"))
o.default = "0"
o:depends({ tls = true, reality = false })
+19
View File
@@ -1920,6 +1920,25 @@ function fetch_cert_sha256(host, port, sni, timeout, http3)
return fp:upper()
end
function sha256_xray_sb(str)
local decoded = base64Decode(str)
if decoded ~= str and #decoded == 32 then return str end
local hex = str:gsub(":", "")
if #hex ~= 64 or not hex:match("^[A-Fa-f0-9]+$") then return str end
local binary = hex:gsub("%x%x", function(byte)
return string.char(tonumber(byte, 16))
end)
return base64Encode(binary)
end
function sha256_sb_xray(str)
local binary = base64Decode(str)
if binary == str or #binary ~= 32 then return str end
return (binary:gsub(".", function(byte)
return string.format("%02X", string.byte(byte))
end))
end
function vps_domain_exclude(domain)
domain = trim(domain)
if domain == "" then return true end
@@ -8,6 +8,7 @@ local ech_domain = {}
local local_version = api.get_app_version("sing-box"):match("[^v]+")
local version_ge_1_14_0 = api.compare_versions(local_version, ">=", "1.14.0")
local version_ge_1_15_0 = api.compare_versions(local_version, ">=", "1.15.0")
local GLOBAL = {
DNS_SERVER = {},
@@ -242,7 +243,7 @@ function gen_outbound(flag, node, tag, proxy_table)
enabled = true,
disable_sni = (node.tls_disable_sni == "1") and true or false, --不要在 ClientHello 中发送服务器名称.
server_name = node.tls_serverName, --用于验证返回证书上的主机名,除非设置不安全。它还包含在 ClientHello 中以支持虚拟主机,除非它是 IP 地址。
insecure = node.tls_allowInsecure == "1" or (node.tls_pinSHA256 and node.tls_pinSHA256 ~= ""), --接受任何服务器证书。(兼顾 xray 的 pinnedPeerCertSha256 )
insecure = node.tls_allowInsecure == "1", --接受任何服务器证书。
alpn = alpn, --支持的应用层协议协商列表,按优先顺序排列。如果两个对等点都支持 ALPN,则选择的协议将是此列表中的一个,如果没有相互支持的协议则连接将失败。
--min_version = "1.2",
--max_version = "1.3",
@@ -289,6 +290,13 @@ function gen_outbound(flag, node, tag, proxy_table)
short_id = node.reality_shortId
} or nil
}
if version_ge_1_15_0 then
if node.tls_pinSHA256 and node.tls_pinSHA256 ~= "" then
tls.certificate_sha256 = { api.sha256_xray_sb(node.tls_pinSHA256) }
end
else
tls.insecure = node.tls_allowInsecure == "1" or (node.tls_pinSHA256 and node.tls_pinSHA256 ~= "")
end
end
local mux = nil
@@ -177,7 +177,7 @@ function gen_outbound(flag, node, tag, proxy_table)
tlsSettings = (node.stream_security == "tls") and {
serverName = node.tls_serverName,
fingerprint = (node.type == "Xray" and node.utls == "1" and node.fingerprint and node.fingerprint ~= "") and node.fingerprint or nil,
pinnedPeerCertSha256 = node.tls_pinSHA256 or "",
pinnedPeerCertSha256 = (node.tls_pinSHA256 and node.tls_pinSHA256 ~= "") and api.sha256_sb_xray(node.tls_pinSHA256) or "",
verifyPeerCertByName = node.tls_CertByName or "",
echConfigList = (node.ech == "1") and node.ech_config or nil,
certificates = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and {
@@ -1058,6 +1058,9 @@ function gen_config(var)
function gen_loopback(outbound_tag, loopback_dst)
if not outbound_tag or outbound_tag == "" then return nil end
local inbound_tag = loopback_dst and "lo-to-" .. loopback_dst or outbound_tag .. "-lo"
for _, o in ipairs(outbounds) do
if o.tag == outbound_tag and o.protocol == "loopback" and o.settings.inboundTag == inbound_tag then return o end
end
local loopback_outbound = {
protocol = "loopback",
tag = outbound_tag,
@@ -1465,8 +1468,8 @@ function gen_config(var)
inbound_tag = {}
if e["inbound"]:find("tproxy") then
if redir_port then
table.insert(inboundTag, "tcp_redir")
table.insert(inboundTag, "udp_redir")
table.insert(inbound_tag, "tcp_redir")
table.insert(inbound_tag, "udp_redir")
end
end
if e["inbound"]:find("socks") then
@@ -25,7 +25,7 @@ local sid = self.section
);
return;
}
const inputs = document.querySelectorAll('input[id$=".xray_tls_pinSHA256"]');
const inputs = document.querySelectorAll('input[id$="_tls_pinSHA256"]');
inputs.forEach(function(input) {
input.value = res.data;
});
@@ -408,7 +408,7 @@ load_acl() {
else
[ -n "${DIRECT_DNSMASQ_PORT}" ] && dns_redirect=${DIRECT_DNSMASQ_PORT}
fi
if ([ -n "$tcp_port" ] || [ -n "$udp_port" ]) && [ -n "$dns_redirect" ]; then
if [ -n "$dns_redirect" ]; then
$ipt_m -A PSW $(comment "$remarks") -p udp ${_ipt_source} --dport 53 -j RETURN
$ip6t_m -A PSW $(comment "$remarks") -p udp ${_ipt_source} --dport 53 -j RETURN 2>/dev/null
$ipt_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} --dport 53 -j RETURN
@@ -597,7 +597,7 @@ load_acl() {
[ -n "${DIRECT_DNSMASQ_PORT}" ] && DNS_REDIRECT=${DIRECT_DNSMASQ_PORT}
fi
if ([ -n "${TCP_PROXY_MODE}" ] || [ -n "${UDP_PROXY_MODE}" ]) && [ -n "$DNS_REDIRECT" ]; then
if [ -n "$DNS_REDIRECT" ]; then
$ipt_m -A PSW $(comment "默认") -p udp --dport 53 -j RETURN
$ip6t_m -A PSW $(comment "默认") -p udp --dport 53 -j RETURN 2>/dev/null
$ipt_m -A PSW $(comment "默认") -p tcp --dport 53 -j RETURN
@@ -606,7 +606,9 @@ load_acl() {
$ip6t_n -A PSW_DNS $(comment "默认") -p udp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT} 2>/dev/null
$ipt_n -A PSW_DNS $(comment "默认") -p tcp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT}
$ip6t_n -A PSW_DNS $(comment "默认") -p tcp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT} 2>/dev/null
echolog " - ${msg}DNS 重定向到专用服务器[${DNS_REDIRECT}]"
[ "$DNS_REDIRECT" = "53" ] || {
echolog " - ${msg}DNS 重定向到专用服务器[${DNS_REDIRECT}]"
}
fi
[ -n "${TCP_PROXY_MODE}" ] || [ -n "${UDP_PROXY_MODE}" ] && {
@@ -470,7 +470,7 @@ load_acl() {
[ -n "${DIRECT_DNSMASQ_PORT}" ] && dns_redirect=${DIRECT_DNSMASQ_PORT}
fi
if ([ -n "$tcp_port" ] || [ -n "$udp_port" ]) && [ -n "$dns_redirect" ]; then
if [ -n "$dns_redirect" ]; then
nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} udp dport 53 counter return comment \"$remarks\""
nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp ${_ipt_source} tcp dport 53 counter return comment \"$remarks\""
nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} udp dport 53 counter return comment \"$remarks\""
@@ -656,14 +656,16 @@ load_acl() {
[ -n "${DIRECT_DNSMASQ_PORT}" ] && DNS_REDIRECT=${DIRECT_DNSMASQ_PORT}
fi
if ([ -n "${TCP_PROXY_MODE}" ] || [ -n "${UDP_PROXY_MODE}" ]) && [ -n "$DNS_REDIRECT" ]; then
if [ -n "$DNS_REDIRECT" ]; then
nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp udp dport 53 counter return comment \"默认\""
nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp tcp dport 53 counter return comment \"默认\""
nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp udp dport 53 counter return comment \"默认\""
nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp tcp dport 53 counter return comment \"默认\""
nft "add rule $NFTABLE_NAME PSW_DNS meta l4proto udp udp dport 53 counter redirect to :${DNS_REDIRECT} comment \"默认\""
nft "add rule $NFTABLE_NAME PSW_DNS meta l4proto tcp tcp dport 53 counter redirect to :${DNS_REDIRECT} comment \"默认\""
echolog " - ${msg}DNS 重定向到专用服务器[${DNS_REDIRECT}]"
[ "$DNS_REDIRECT" = "53" ] || {
echolog " - ${msg}DNS 重定向到专用服务器[${DNS_REDIRECT}]"
}
fi
[ -n "${TCP_PROXY_MODE}" ] || [ -n "${UDP_PROXY_MODE}" ] && {
+1 -1
View File
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=196
PKG_RELEASE:=75
PKG_RELEASE:=76
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
@@ -12,9 +12,6 @@ local json = require "luci.jsonc"
local uci = require "luci.model.uci".cursor()
local translate = i18n.translate
-- ============================================================
-- 常量
-- ============================================================
local CLASH_API_PORT = "16756"
local COMPONENT_HELPER = "/usr/share/shadowsocksr/update_components.sh"
local SERVER_DETECT_CACHE = "/tmp/ssrplus_server_detect.json"
@@ -33,34 +30,10 @@ local SUPPORTED_GEO_COMPONENTS = {
{ name = "v2ray_geosite", require = nil }
}
-- ============================================================
-- 通用工具函数
-- ============================================================
local function trim(value)
return tostring(value or ""):gsub("^%s+", ""):gsub("%s+$", "")
end
local function shell_quote(value)
return "'" .. tostring(value or ""):gsub("'", "'\\''") .. "'"
end
function uci_get_config(section, key)
if section ~= "global" then
return nil
end
local val = luci.sys.exec(string.format(
'uci -q get shadowsocksr.@global[0].%s 2>/dev/null', key))
val = val:gsub("%s+$", "")
if val == "" then
return nil
end
return val
end
function isdirectory(dirname)
return nixio.fs.stat(dirname, "type") == "dir"
end
local function parse_nonnegative_int(value)
local number = tonumber(value)
if not number then
@@ -92,49 +65,6 @@ local function normalize_client_ip(value)
return ""
end
local function urlencode(str)
if not str then return "" end
return tostring(str):gsub("[^%w%-_%.~]", function(c)
return string.format("%%%02X", string.byte(c))
end)
end
local function is_ipv6_address(addr)
addr = tostring(addr or "")
return addr ~= "" and addr:find(":", 1, true) ~= nil
end
local function is_local_target(addr)
addr = tostring(addr or ""):lower()
if addr == "" then
return false
end
if addr == "localhost" or addr == "::1" or addr:match("%.local$") then
return true
end
if is_ipv6_address(addr) then
return addr:match("^fe[89ab]") ~= nil or addr:match("^fc") ~= nil or addr:match("^fd") ~= nil
end
local o1, o2 = addr:match("^(%d+)%.(%d+)%.")
o1 = tonumber(o1)
o2 = tonumber(o2)
if not o1 or not o2 then
return false
end
return o1 == 10
or o1 == 127
or (o1 == 169 and o2 == 254)
or (o1 == 172 and o2 >= 16 and o2 <= 31)
or (o1 == 192 and o2 == 168)
end
-- ============================================================
-- CSV 处理(Clash 客户端规则)
-- ============================================================
local function get_clash_client_rule_csv_path(sid)
sid = trim(sid)
if sid == "" then
@@ -237,13 +167,6 @@ local function write_clash_client_rules_csv(sid, rows)
return nixio.fs.writefile(csv_path, table.concat(lines, "\n") .. "\n")
end
local function read_clash_client_rules(sid)
return read_clash_client_rules_csv(sid)
end
-- ============================================================
-- LAN 客户端收集
-- ============================================================
local function collect_lan_clients()
local clients = {}
local seen = {}
@@ -268,9 +191,10 @@ local function collect_lan_clients()
return clients
end
-- ============================================================
-- 延迟探测
-- ============================================================
local function read_clash_client_rules(sid)
return read_clash_client_rules_csv(sid)
end
local function normalize_ping_ms(value, scale)
local num = tonumber(value)
if not num or num <= 0 then
@@ -323,6 +247,46 @@ local function detect_tls_handshake_ms(domain, port, path, resolve_host, server_
return nil
end
local function urlencode(str)
if not str then return "" end
return tostring(str):gsub("[^%w%-_%.~]", function(c)
return string.format("%%%02X", string.byte(c))
end)
end
local function is_ipv6_address(addr)
addr = tostring(addr or "")
return addr ~= "" and addr:find(":", 1, true) ~= nil
end
local function is_local_target(addr)
addr = tostring(addr or ""):lower()
if addr == "" then
return false
end
if addr == "localhost" or addr == "::1" or addr:match("%.local$") then
return true
end
if is_ipv6_address(addr) then
return addr:match("^fe[89ab]") ~= nil or addr:match("^fc") ~= nil or addr:match("^fd") ~= nil
end
local o1, o2 = addr:match("^(%d+)%.(%d+)%.")
o1 = tonumber(o1)
o2 = tonumber(o2)
if not o1 or not o2 then
return false
end
return o1 == 10
or o1 == 127
or (o1 == 169 and o2 == 254)
or (o1 == 172 and o2 >= 16 and o2 <= 31)
or (o1 == 192 and o2 == 168)
end
local function detect_tcp_connect_ms(domain, port)
if not domain or domain == "" or not port or port <= 0 then
return nil
@@ -348,9 +312,6 @@ local function detect_tcp_connect_ms(domain, port)
return nil
end
-- ============================================================
-- Clash 相关
-- ============================================================
local function get_clash_secret(sid)
return sid .. "_ssrplus_clash"
end
@@ -600,9 +561,6 @@ local function save_detect_cache_entry(sid, data)
end)
end
-- ============================================================
-- 组件 / Geo 状态读取与写 JSON
-- ============================================================
local function read_component_state(component, action)
if not SUPPORTED_COMPONENTS[component] then
return nil, 400, "unsupported_component"
@@ -674,9 +632,10 @@ local function write_geo_json(data)
})
end
-- ============================================================
-- 路由注册
-- ============================================================
local function shell_quote(value)
return "'" .. tostring(value or ""):gsub("'", "'\\''") .. "'"
end
function index()
if not nixio.fs.access("/etc/config/shadowsocksr") then
call("act_reset")
@@ -685,8 +644,6 @@ function index()
page = entry({"admin", "services", "shadowsocksr"}, alias("admin", "services", "shadowsocksr", "client"), _("ShadowSocksR Plus+"), 10)
page.dependent = true
page.acl_depends = { "luci-app-ssr-plus" }
-- 页面
entry({"admin", "services", "shadowsocksr", "client"}, cbi("shadowsocksr/client"), _("SSR Client"), 10).leaf = true
entry({"admin", "services", "shadowsocksr", "servers"}, arcombine(cbi("shadowsocksr/servers"), cbi("shadowsocksr/client-config")), _("Servers Nodes"), 20).leaf = true
entry({"admin", "services", "shadowsocksr", "control"}, cbi("shadowsocksr/control"), _("Access Control"), 30).leaf = true
@@ -694,41 +651,31 @@ function index()
entry({"admin", "services", "shadowsocksr", "server"}, arcombine(cbi("shadowsocksr/server"), cbi("shadowsocksr/server-config")), _("SSR Server"), 60).leaf = true
entry({"admin", "services", "shadowsocksr", "component"}, cbi("shadowsocksr/component"), _("Component Update"), 65).leaf = true
entry({"admin", "services", "shadowsocksr", "status"}, form("shadowsocksr/status"), _("Status"), 70).leaf = true
entry({"admin", "services", "shadowsocksr", "log"}, form("shadowsocksr/log"), _("Log"), 80).leaf = true
-- 状态 / 操作
entry({"admin", "services", "shadowsocksr", "check"}, call("check_status"))
entry({"admin", "services", "shadowsocksr", "refresh"}, call("refresh_data"))
entry({"admin", "services", "shadowsocksr", "subscribe"}, call("subscribe"))
entry({"admin", "services", "shadowsocksr", "checkport"}, call("check_port"))
entry({"admin", "services", "shadowsocksr", "get_log"}, call("get_log")).leaf = true
entry({"admin", "services", "shadowsocksr", "clear_log"}, call("clear_log")).leaf = true
entry({"admin", "services", "shadowsocksr", "run"}, call("act_status"))
entry({"admin", "services", "shadowsocksr", "ping"}, call("act_ping"))
entry({"admin", "services", "shadowsocksr", "reset"}, call("act_reset"))
entry({"admin", "services", "shadowsocksr", "restart"}, call("act_restart"))
entry({"admin", "services", "shadowsocksr", "delete"}, call("act_delete"))
entry({"admin", "services", "shadowsocksr", "save_order"}, call("save_order")).leaf = true
entry({"admin", "services", "shadowsocksr", "delete_node"}, call("act_delete_node")).leaf = true
-- 订阅
entry({"admin", "services", "shadowsocksr", "add_subscribe_item"}, call("add_subscribe_item")).leaf = true
entry({"admin", "services", "shadowsocksr", "delete_subscribe_item"}, call("delete_subscribe_item")).leaf = true
entry({"admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled"}, call("toggle_subscribe_item_enabled")).leaf = true
-- 组件
entry({"admin", "services", "shadowsocksr", "component_local_status"}, call("component_local_status")).leaf = true
entry({"admin", "services", "shadowsocksr", "component_set_mirror"}, call("component_set_mirror")).leaf = true
entry({"admin", "services", "shadowsocksr", "component_status"}, call("component_status")).leaf = true
entry({"admin", "services", "shadowsocksr", "component_upgrade"}, call("component_upgrade")).leaf = true
-- Geo
entry({"admin", "services", "shadowsocksr", "geo_component"}, call("geo_component")).leaf = true
entry({"admin", "services", "shadowsocksr", "geo_local_status"}, call("geo_local_status")).leaf = true
entry({"admin", "services", "shadowsocksr", "geo_status"}, call("geo_status")).leaf = true
entry({"admin", "services", "shadowsocksr", "geo_upgrade"}, call("geo_upgrade")).leaf = true
-- Clash
entry({"admin", "services", "shadowsocksr", "checkport"}, call("check_port"))
entry({"admin", "services", "shadowsocksr", "log"}, form("shadowsocksr/log"), _("Log"), 80).leaf = true
entry({"admin", "services", "shadowsocksr", "get_log"}, call("get_log")).leaf = true
entry({"admin", "services", "shadowsocksr", "clear_log"}, call("clear_log")).leaf = true
entry({"admin", "services", "shadowsocksr", "run"}, call("act_status"))
entry({"admin", "services", "shadowsocksr", "ping"}, call("act_ping"))
entry({"admin", "services", "shadowsocksr", "save_order"}, call("save_order")).leaf = true
entry({"admin", "services", "shadowsocksr", "delete_node"}, call("act_delete_node")).leaf = true
entry({"admin", "services", "shadowsocksr", "add_subscribe_item"}, call("add_subscribe_item")).leaf = true
entry({"admin", "services", "shadowsocksr", "delete_subscribe_item"}, call("delete_subscribe_item")).leaf = true
entry({"admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled"}, call("toggle_subscribe_item_enabled")).leaf = true
entry({"admin", "services", "shadowsocksr", "reset"}, call("act_reset"))
entry({"admin", "services", "shadowsocksr", "restart"}, call("act_restart"))
entry({"admin", "services", "shadowsocksr", "delete"}, call("act_delete"))
entry({"admin", "services", "shadowsocksr", "clash_panel"}, call("clash_panel")).leaf = true
entry({"admin", "services", "shadowsocksr", "clash_groups"}, call("clash_groups")).leaf = true
entry({"admin", "services", "shadowsocksr", "clash_switch"}, call("clash_switch")).leaf = true
@@ -737,18 +684,9 @@ function index()
entry({"admin", "services", "shadowsocksr", "clash_client_policies"}, call("clash_client_policies")).leaf = true
entry({"admin", "services", "shadowsocksr", "clash_client_rule_save"}, call("clash_client_rule_save")).leaf = true
entry({"admin", "services", "shadowsocksr", "clash_client_rule_clear"}, call("clash_client_rule_clear")).leaf = true
-- 证书
entry({"admin", "services", "shadowsocksr", "fetch_certsha256"}, call("fetch_certsha256")).leaf = true
entry({"admin", "services", "shadowsocksr", "fetch_certbyname"}, call("fetch_certbyname")).leaf = true
-- Dashboard
entry({"admin", "services", "shadowsocksr", "dashboard_type"}, call("action_dashboard_type"))
entry({"admin", "services", "shadowsocksr", "switch_dashboard"}, call("action_switch_dashboard"))
entry({"admin", "services", "shadowsocksr", "delete_dashboard"}, call("action_delete_dashboard"))
entry({"admin", "services", "shadowsocksr", "default_dashboard"}, call("action_default_dashboard"))
-- 备份
--[[Backup]]
entry({"admin", "services", "shadowsocksr", "backup"}, call("create_backup")).leaf = true
entry({'admin', 'services', "shadowsocksr", 'ip'}, call('check_ip')) -- 获取ip情况
end
@@ -808,9 +746,6 @@ function check_ip()
luci.http.write_json(e)
end
-- ============================================================
-- 订阅
-- ============================================================
function subscribe()
nixio.fs.remove(SERVER_DETECT_CACHE)
local sid = luci.http.formvalue("sid") or ""
@@ -1069,175 +1004,6 @@ function toggle_subscribe_item_enabled()
luci.http.write_json({ ret = 1, sid = sid, field = field, value = value })
end
-- ============================================================
-- Dashboard 面板管理
-- ============================================================
function action_switch_dashboard()
local switch_name = luci.http.formvalue("name")
local switch_type = luci.http.formvalue("type")
local state = luci.sys.call(string.format(
'/usr/share/shadowsocksr/update_dashboard.sh "%s" "%s" >/dev/null 2>&1',
switch_name, switch_type))
-- 写日志
local f = io.open("/var/log/ssrplus.log", "a")
if f then
local result
if tonumber(state) == 0 then
result = os.date("%Y-%m-%d %H:%M:%S: ") ..
string.format("Control Panel【%s - %s】Download Successful!", switch_name, switch_type)
else
result = os.date("%Y-%m-%d %H:%M:%S: ") ..
string.format("Control Panel【%s - %s】Download Error!", switch_name, switch_type)
end
f:write(result .. "\n")
f:close()
end
if tonumber(state) == 0 then
local target
if switch_type == "Official" then
target = "Official"
else
target = "Meta"
end
if switch_name == "Dashboard" then
luci.sys.call(string.format(
'uci -q set shadowsocksr.@global[0].dashboard_type="%s"', target))
elseif switch_name == "Yacd" then
luci.sys.call(string.format(
'uci -q set shadowsocksr.@global[0].yacd_type="%s"', target))
else
luci.sys.call(
'uci -q set shadowsocksr.@global[0].dashboard_type="Official"')
end
luci.sys.call('uci -q commit shadowsocksr')
end
luci.http.prepare_content("application/json")
luci.http.write_json({
download_state = state;
})
end
function action_delete_dashboard()
local delete_name = luci.http.formvalue("name")
local delete_path = string.format("/usr/share/shadowsocksr/ui/%s", string.lower(delete_name))
local panels = {
"/usr/share/shadowsocksr/ui/dashboard",
"/usr/share/shadowsocksr/ui/yacd",
"/usr/share/shadowsocksr/ui/metacubexd",
"/usr/share/shadowsocksr/ui/zashboard"
}
local existing_panels = 0
for _, path in ipairs(panels) do
if isdirectory(path) then
existing_panels = existing_panels + 1
end
end
if existing_panels <= 1 then
luci.http.prepare_content("application/json")
luci.http.write_json({
delete_state = 0,
error = "Cannot delete the last remaining dashboard"
})
return
end
local state = luci.sys.call(string.format("rm -rf '%s' >/dev/null 2>&1", delete_path)) == 0 and 1 or 0
if tonumber(state) == 1 then
if delete_name == "Dashboard" then
luci.sys.call('uci -q set shadowsocksr.@global[0].dashboard_type="Official"')
luci.sys.call('uci -q commit shadowsocksr')
elseif delete_name == "Yacd" then
luci.sys.call('uci -q set shadowsocksr.@global[0].yacd_type="Official"')
luci.sys.call('uci -q commit shadowsocksr')
end
-- 检查 default_dashboard
local default_dashboard = luci.sys.exec(
'uci -q get shadowsocksr.@global[0].default_dashboard 2>/dev/null')
default_dashboard = default_dashboard:gsub("%s+$", "")
if default_dashboard == string.lower(delete_name) then
luci.sys.call('uci -q set shadowsocksr.@global[0].default_dashboard=""')
luci.sys.call('uci -q commit shadowsocksr')
end
end
luci.http.prepare_content("application/json")
luci.http.write_json({
delete_state = state;
})
end
function action_dashboard_type()
local dashboard_type = luci.sys.exec(
'uci -q get shadowsocksr.@global[0].dashboard_type 2>/dev/null')
dashboard_type = dashboard_type:gsub("%s+$", "")
if dashboard_type == "" then
dashboard_type = "Official"
end
local yacd_type = luci.sys.exec(
'uci -q get shadowsocksr.@global[0].yacd_type 2>/dev/null')
yacd_type = yacd_type:gsub("%s+$", "")
if yacd_type == "" then
yacd_type = "Official"
end
local default_dashboard = luci.sys.exec(
'uci -q get shadowsocksr.@global[0].default_dashboard 2>/dev/null')
default_dashboard = default_dashboard:gsub("%s+$", "")
if not isdirectory("/usr/share/shadowsocksr/ui/" .. default_dashboard) then
default_dashboard = ""
end
luci.http.prepare_content("application/json")
luci.http.write_json({
dashboard_type = dashboard_type,
yacd_type = yacd_type,
yacd = isdirectory("/usr/share/shadowsocksr/ui/yacd"),
dashboard = isdirectory("/usr/share/shadowsocksr/ui/dashboard"),
metacubexd = isdirectory("/usr/share/shadowsocksr/ui/metacubexd"),
zashboard = isdirectory("/usr/share/shadowsocksr/ui/zashboard"),
default_dashboard = default_dashboard;
})
end
function action_default_dashboard()
local default_dashboard = luci.http.formvalue("name")
if not default_dashboard
or (default_dashboard ~= "Dashboard"
and default_dashboard ~= "Yacd"
and default_dashboard ~= "Metacubexd"
and default_dashboard ~= "Zashboard") then
luci.http.status(500, "Set Failed")
return
end
if not isdirectory("/usr/share/shadowsocksr/ui/" .. string.lower(default_dashboard)) then
luci.http.status(500, "Set Failed")
return
end
luci.sys.call(string.format(
'uci -q set shadowsocksr.@global[0].default_dashboard="%s"',
string.lower(default_dashboard)))
luci.sys.call('uci -q commit shadowsocksr')
luci.http.prepare_content("application/json")
luci.http.write_json({
default_dashboard = default_dashboard;
})
end
-- ============================================================
-- 组件更新
-- ============================================================
function component_status()
local component = luci.http.formvalue("component")
local data, status, err = read_component_state(component, "info")
@@ -1305,9 +1071,6 @@ function component_upgrade()
write_component_json(data)
end
-- ============================================================
-- Geo 更新
-- ============================================================
function geo_status()
local component = luci.http.formvalue("component")
local data, status, err = read_geo_state(component, "info")
@@ -1364,13 +1127,10 @@ function geo_upgrade()
data.can_upgrade = info.can_upgrade
end
end
write_geo_json(data)
end
-- ============================================================
-- 状态
-- ============================================================
function act_status()
local e = {}
e.running = global_client_running()
@@ -1381,88 +1141,6 @@ function act_status()
luci.http.write_json(e)
end
function check_status()
local e = {}
local target = luci.http.formvalue("set") or ""
e.ret = luci.sys.call("curl -m 3 -sS -o /dev/null http://www." .. target .. ".com >/dev/null 2>&1")
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function refresh_data()
local set = luci.http.formvalue("set")
local retstring = loadstring("return " .. luci.sys.exec("/usr/bin/lua /usr/share/shadowsocksr/update.lua " .. set))()
luci.http.prepare_content("application/json")
luci.http.write_json(retstring)
end
function check_port()
local retstring = "<br /><br />"
local s
local server_name = ""
local uci = require "luci.model.uci".cursor()
local use_nft = use_fw4_backend()
uci:foreach("shadowsocksr", "servers", function(s)
if s.type == "clash" then
retstring = retstring .. string.format("<font><b style='color:gray'>[%s] Clash panel node.</b></font><br />", s.alias or s[".name"])
return
end
if s.alias then
server_name = s.alias
elseif s.server and s.server_port then
server_name = s.server .. ":" .. s.server_port
end
-- 临时加入 set
local is_ipv6 = is_ipv6_address(s.server)
local iret = false
if not is_ipv6 then
if use_nft then
iret = luci.sys.call("nft add element inet ss_spec ss_spec_wan_ac { " .. s.server .. " } 2>/dev/null") == 0
else
iret = luci.sys.call("ipset add ss_spec_wan_ac " .. s.server .. " 2>/dev/null") == 0
end
end
-- TCP 测试
local socket = nixio.socket(is_ipv6 and "inet6" or "inet", "stream")
socket:setopt("socket", "rcvtimeo", 3)
socket:setopt("socket", "sndtimeo", 3)
local ret = socket:connect(s.server, s.server_port)
socket:close()
if ret then
retstring = retstring .. string.format("<font><b style='color:green'>[%s] OK.</b></font><br />", server_name)
else
retstring = retstring .. string.format("<font><b style='color:red'>[%s] Error.</b></font><br />", server_name)
end
-- 删除临时 set
if iret then
if use_nft then
luci.sys.call("nft delete element inet ss_spec ss_spec_wan_ac { " .. s.server .. " } 2>/dev/null")
else
luci.sys.call("ipset del ss_spec_wan_ac " .. s.server)
end
end
end)
luci.http.prepare_content("application/json")
luci.http.write_json({ret = retstring})
end
function get_log()
luci.http.write(luci.sys.exec("[ -f '/var/log/ssrplus.log' ] && cat /var/log/ssrplus.log"))
end
function clear_log()
luci.sys.call("echo '' > /var/log/ssrplus.log")
end
-- ============================================================
-- Clash 面板
-- ============================================================
function clash_panel()
local sid = luci.http.formvalue("sid")
if uci:get("shadowsocksr", sid) ~= "servers" or uci:get("shadowsocksr", sid, "type") ~= "clash" then
@@ -1701,9 +1379,6 @@ function clash_client_rule_clear()
})
end
-- ============================================================
-- 证书
-- ============================================================
function fetch_certsha256()
local function fetch_cert_sha256(host, port, sni, timeout, http3)
if not host then return "" end
@@ -1768,16 +1443,16 @@ function fetch_certbyname()
port = tonumber(port) or 443
sni = sni or host
timeout = tonumber(timeout) or 5
local cmd = string.format(
"timeout %d openssl s_client -connect %s:%d -servername %s -showcerts </dev/null 2>/dev/null " ..
"| openssl x509 -noout -subject 2>/dev/null " ..
"| awk '{gsub(/^.*=[[:space:]]*/, \"\"); gsub(/,.*$/, \"\"); print}'",
timeout, host, port, sni
)
local out = trim(luci.sys.exec(cmd))
if out == "" then
return ""
end
@@ -1800,9 +1475,6 @@ function fetch_certbyname()
luci.http.write_json(data ~= "" and { code = 1, data = data } or { code = 0 })
end
-- ============================================================
-- Ping / 探测
-- ============================================================
function act_ping()
local e = {}
local domain = luci.http.formvalue("domain")
@@ -1921,7 +1593,7 @@ function act_ping()
end
end
else
-- 非 WebSocket 节点的探测逻辑 (TCP / ICMP / UDP)
-- 3. 非 WebSocket 节点的探测逻辑 (TCP / ICMP / UDP)
local socket = nixio.socket("inet", "stream")
if socket then
socket:setopt("socket", "rcvtimeo", 3)
@@ -1971,7 +1643,7 @@ function act_ping()
end
end
-- 清理防火墙规则
-- 4. 清理防火墙规则
if iret then
if use_nft then
luci.sys.call("nft delete element inet ss_spec ss_spec_wan_ac { " .. domain .. " } 2>/dev/null")
@@ -1996,9 +1668,77 @@ function act_ping()
luci.http.write_json(e)
end
-- ============================================================
-- 重启 / 重置 / 删除
-- ============================================================
function check_status()
local e = {}
local target = luci.http.formvalue("set") or ""
e.ret = luci.sys.call("curl -m 3 -sS -o /dev/null http://www." .. target .. ".com >/dev/null 2>&1")
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function refresh_data()
local set = luci.http.formvalue("set")
local retstring = loadstring("return " .. luci.sys.exec("/usr/bin/lua /usr/share/shadowsocksr/update.lua " .. set))()
luci.http.prepare_content("application/json")
luci.http.write_json(retstring)
end
function check_port()
local retstring = "<br /><br />"
local s
local server_name = ""
local uci = require "luci.model.uci".cursor()
local use_nft = use_fw4_backend()
uci:foreach("shadowsocksr", "servers", function(s)
if s.type == "clash" then
retstring = retstring .. string.format("<font><b style='color:gray'>[%s] Clash panel node.</b></font><br />", s.alias or s[".name"])
return
end
if s.alias then
server_name = s.alias
elseif s.server and s.server_port then
server_name = s.server .. ":" .. s.server_port
end
-- 临时加入 set
local is_ipv6 = is_ipv6_address(s.server)
local iret = false
if not is_ipv6 then
if use_nft then
iret = luci.sys.call("nft add element inet ss_spec ss_spec_wan_ac { " .. s.server .. " } 2>/dev/null") == 0
else
iret = luci.sys.call("ipset add ss_spec_wan_ac " .. s.server .. " 2>/dev/null") == 0
end
end
-- TCP 测试
local socket = nixio.socket(is_ipv6 and "inet6" or "inet", "stream")
socket:setopt("socket", "rcvtimeo", 3)
socket:setopt("socket", "sndtimeo", 3)
local ret = socket:connect(s.server, s.server_port)
socket:close()
if ret then
retstring = retstring .. string.format("<font><b style='color:green'>[%s] OK.</b></font><br />", server_name)
else
retstring = retstring .. string.format("<font><b style='color:red'>[%s] Error.</b></font><br />", server_name)
end
-- 删除临时 set
if iret then
if use_nft then
luci.sys.call("nft delete element inet ss_spec ss_spec_wan_ac { " .. s.server .. " } 2>/dev/null")
else
luci.sys.call("ipset del ss_spec_wan_ac " .. s.server)
end
end
end)
luci.http.prepare_content("application/json")
luci.http.write_json({ret = retstring})
end
function act_reset()
luci.sys.call("/etc/init.d/shadowsocksr reset >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr"))
@@ -2014,9 +1754,14 @@ function act_delete()
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers"))
end
-- ============================================================
-- 备份
-- ============================================================
function get_log()
luci.http.write(luci.sys.exec("[ -f '/var/log/ssrplus.log' ] && cat /var/log/ssrplus.log"))
end
function clear_log()
luci.sys.call("echo '' > /var/log/ssrplus.log")
end
function create_backup()
local backup_files = {
"/etc/config/shadowsocksr",
@@ -2,40 +2,6 @@
<%
local clash_nodes = self.clash_nodes or {}
local current_sid = self.map:get(section, "global_server") or "nil"
local panel_defs = {
{ name = "zashboard", label = "Zashboard", dir = "/usr/share/shadowsocksr/ui/zashboard" },
{ name = "metacubexd", label = "Metacubexd", dir = "/usr/share/shadowsocksr/ui/metacubexd" },
{ name = "yacd", label = "Yacd", dir = "/usr/share/shadowsocksr/ui/yacd" },
{ name = "dashboard", label = "Dashboard", dir = "/usr/share/shadowsocksr/ui/dashboard" },
}
local installed_panels = {}
for _, def in ipairs(panel_defs) do
if nixio.fs.stat(def.dir, "type") == "dir" then
installed_panels[#installed_panels + 1] = {
name = def.name,
label = def.label,
path = "/ui/" .. def.name .. "/"
}
end
end
local default_dashboard = luci.sys.exec(
'uci -q get shadowsocksr.@global[0].default_dashboard 2>/dev/null'):gsub("%s+$", "")
local default_panel = ""
if default_dashboard ~= "" then
for _, p in ipairs(installed_panels) do
if p.name == default_dashboard then
default_panel = p.name
break
end
end
end
if default_panel == "" and #installed_panels > 0 then
default_panel = installed_panels[1].name
end
-%>
<div id="ssr-clash-main-panel-wrap">
<style type="text/css">
@@ -262,91 +228,7 @@ end
filter: brightness(1.08);
}
#ssr-panel-chooser-mask {
display: none;
position: fixed;
inset: 0;
background: var(--ssr-clash-mask-bg);
z-index: 2100;
}
#ssr-panel-chooser {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: min(480px, calc(100vw - 32px));
max-height: calc(100vh - 48px);
overflow: auto;
background: var(--ssr-clash-modal-bg);
color: var(--ssr-clash-modal-fg);
border-radius: 10px;
box-shadow: var(--ssr-clash-modal-shadow);
border: 1px solid var(--ssr-clash-modal-border);
z-index: 2101;
padding: 14px 16px 16px;
}
#ssr-panel-chooser-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
}
#ssr-panel-chooser-title {
font-size: 16px;
font-weight: 600;
color: var(--ssr-clash-modal-fg);
}
#ssr-panel-chooser-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.ssr-panel-chooser-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 10px 12px;
border: 1px solid var(--ssr-clash-field-border);
border-radius: 8px;
background: var(--ssr-clash-field-bg);
color: var(--ssr-clash-field-fg);
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
}
.ssr-panel-chooser-item:hover {
background: rgba(31, 111, 235, 0.10);
border-color: #1f6feb;
}
.ssr-panel-chooser-item .ssr-panel-name {
font-weight: 600;
font-size: 14px;
}
.ssr-panel-chooser-item .ssr-panel-url {
font-size: 12px;
color: var(--ssr-clash-modal-muted);
word-break: break-all;
}
.ssr-panel-chooser-item .ssr-panel-tag {
font-size: 11px;
padding: 2px 6px;
border-radius: 4px;
background: #1f6feb;
color: #fff;
white-space: nowrap;
}
/* 手机端优化 */
#ssr-clash-main-buttons {
display: flex;
flex-wrap: wrap;
@@ -366,14 +248,6 @@ end
transform: none;
}
#ssr-panel-chooser {
top: 8px;
left: 8px;
width: calc(100vw - 16px);
max-height: calc(100vh - 24px);
transform: none;
}
#ssr-clash-modal-header {
flex-wrap: wrap;
align-items: flex-start;
@@ -388,7 +262,7 @@ end
justify-content: flex-start;
margin-left: 0;
flex-wrap: wrap;
gap: 8px;
gap: 8px;
}
#ssr-clash-modal-header #ssr-clash-rules-add {
@@ -521,103 +395,6 @@ end
<% end -%>
};
var MIHOMO_PANEL_PORT = 16756;
var MIHOMO_PANEL_DEFAULT = '<%=default_panel%>';
var installedPanels = [
<%
for i, p in ipairs(installed_panels) do
-%>
{ name: '<%=p.name%>', label: '<%=p.label%>', path: '<%=p.path%>' }<%= (i < #installed_panels) and "," or "" %>
<% end -%>
];
function buildMihomoPanelUrl(path) {
var host = window.location.hostname;
if (host.indexOf(':') >= 0) {
host = '[' + host + ']';
}
return 'http://' + host + ':' + MIHOMO_PANEL_PORT + path;
}
function openPanelUrl(path) {
if (!path) {
return false;
}
window.open(buildMihomoPanelUrl(path), '_blank');
return false;
}
function showPanelChooser() {
var mask = document.getElementById('ssr-panel-chooser-mask');
var modal = document.getElementById('ssr-panel-chooser');
var listEl = document.getElementById('ssr-panel-chooser-list');
if (!mask || !modal || !listEl) {
return false;
}
listEl.innerHTML = '';
if (!installedPanels.length) {
var empty = document.createElement('div');
empty.style.color = 'var(--ssr-clash-modal-muted)';
empty.style.padding = '12px 0';
empty.textContent = '<%:No dashboard panel installed. Please install one first.%>';
listEl.appendChild(empty);
} else {
installedPanels.forEach(function(panel) {
var item = document.createElement('div');
item.className = 'ssr-panel-chooser-item';
var info = document.createElement('div');
info.style.flex = '1 1 auto';
info.style.minWidth = '0';
var nameEl = document.createElement('div');
nameEl.className = 'ssr-panel-name';
nameEl.textContent = panel.label;
var urlEl = document.createElement('div');
urlEl.className = 'ssr-panel-url';
urlEl.textContent = buildMihomoPanelUrl(panel.path);
info.appendChild(nameEl);
info.appendChild(urlEl);
item.appendChild(info);
if (panel.name === MIHOMO_PANEL_DEFAULT) {
var tag = document.createElement('span');
tag.className = 'ssr-panel-tag';
tag.textContent = '<%:Default%>';
item.appendChild(tag);
}
item.onclick = function() {
closePanelChooser();
openPanelUrl(panel.path);
};
listEl.appendChild(item);
});
}
mask.style.display = 'block';
modal.style.display = 'block';
return false;
}
function closePanelChooser() {
var mask = document.getElementById('ssr-panel-chooser-mask');
var modal = document.getElementById('ssr-panel-chooser');
if (mask) mask.style.display = 'none';
if (modal) modal.style.display = 'none';
return false;
}
window.ssrClashOpenPanelChooser = function() {
return showPanelChooser();
};
function setPanelStatus(text, color) {
var statusEl = document.getElementById('ssr-clash-modal-status');
if (!statusEl) {
@@ -941,7 +718,7 @@ end
select.onchange = function() {
setPanelStatus('<%:Switching...%>', '#0072c3');
window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_switch")%>', {
window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_switch")%>', {
sid: currentPanelSid,
group: group.name,
name: select.value
@@ -1142,7 +919,7 @@ end
var resetBtn = document.getElementById('ssr-clash-main-reset-defaults');
var panelBtn = document.getElementById('ssr-clash-main-open');
var btnContainer = document.getElementById('ssr-clash-main-buttons');
if (!select || !row || !customRulesBtn || !resetBtn) {
if (!select || !row || !customRulesBtn || !resetBtn || !panelBtn) {
return;
}
@@ -1151,13 +928,13 @@ end
row.style.display = '';
customRulesBtn.setAttribute('data-sid', sid);
resetBtn.setAttribute('data-sid', sid);
if (panelBtn) panelBtn.setAttribute('data-sid', sid);
panelBtn.setAttribute('data-sid', sid);
if (btnContainer) btnContainer.style.display = 'flex';
} else {
row.style.display = 'none';
customRulesBtn.setAttribute('data-sid', '');
resetBtn.setAttribute('data-sid', '');
if (panelBtn) panelBtn.setAttribute('data-sid', '');
panelBtn.setAttribute('data-sid', '');
if (btnContainer) btnContainer.style.display = 'none';
}
}
@@ -1203,7 +980,9 @@ end
if (panelBtn) {
panelBtn.onclick = function() {
return window.ssrClashOpenPanelChooser();
var sid = this.getAttribute('data-sid');
if (!sid) return false;
return openPanel(sid);
};
}
@@ -1281,15 +1060,6 @@ end
modalMask.onclick = closePanel;
}
var chooserMask = document.getElementById('ssr-panel-chooser-mask');
var chooserCloseBtn = document.getElementById('ssr-panel-chooser-close');
if (chooserMask) {
chooserMask.onclick = closePanelChooser;
}
if (chooserCloseBtn) {
chooserCloseBtn.onclick = closePanelChooser;
}
updateClashPanelMain();
}, 0);
})();
@@ -1310,7 +1080,6 @@ end
value="<%:Reset Default Proxies Rules%>"
title="<%:Reset Default Proxies Rules%>"
data-sid="<%=current_sid%>" />
<% if #installed_panels > 0 then %>
<input
type="button"
id="ssr-clash-main-open"
@@ -1318,16 +1087,6 @@ end
value="<%:Mihomo Pannel%>"
title="<%:Mihomo Pannel%>"
data-sid="<%=current_sid%>" />
<% end %>
</div>
<div id="ssr-panel-chooser-mask"></div>
<div id="ssr-panel-chooser" role="dialog" aria-modal="true" aria-labelledby="ssr-panel-chooser-title">
<div id="ssr-panel-chooser-header">
<div id="ssr-panel-chooser-title"><%:Select Dashboard Panel%></div>
<input type="button" id="ssr-panel-chooser-close" class="btn cbi-button" value="<%:Close%>" />
</div>
<div id="ssr-panel-chooser-list"></div>
</div>
<div id="ssr-clash-modal-mask"></div>
@@ -345,110 +345,18 @@
queryLocalGeoInfo();
}
function makeDashboardBtn(label, fn, args) {
var argStr = args.map(function(a){ return "'" + a + "'"; }).join(', ');
return '<input type="button" class="btn cbi-button cbi-button-apply" value="' + label + '" onclick="return ' + fn + '(this, ' + argStr + ')"/>';
function selectedGeoComponent() {
var selector = document.getElementById('geo-selector');
return selector ? selector.value : 'country_mmdb';
}
window.switch_dashboard = window.switch_dashboard || function(btn, n, type) {
btn.disabled = true;
btn.value = '<%:Downloading File...%>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "switch_dashboard")%>', {name: n, type: type}, function(x, status) {
if (!x || x.status != 200) return;
if (status.download_state == "0") {
var isUpdate = (n == "Metacubexd" || n == "Zashboard");
var nextLabel, nextType;
if (isUpdate) {
nextLabel = '<%:Update Successful%> - ' + '<%:Update Version%>';
nextType = 'Official';
} else {
nextLabel = '<%:Switch Successful%> - ' + (type == "Meta" ? '<%:Switch To Official Version%>' : '<%:Switch To Meta Version%>');
nextType = type == "Meta" ? 'Official' : 'Meta';
}
document.getElementById('switch_dashboard_' + n).innerHTML = makeDashboardBtn(nextLabel, 'switch_dashboard', [n, nextType]);
document.getElementById('default_dashboard_' + n).firstElementChild.disabled = false;
document.getElementById('delete_dashboard_' + n).firstElementChild.disabled = false;
} else {
btn.value = status.download_state == "2" ? '<%:Unzip Error%>'
: (n == "Metacubexd" || n == "Zashboard") ? '<%:Update Failed%>' : '<%:Switch Failed%>';
}
btn.disabled = false;
});
return false;
};
window.delete_dashboard = window.delete_dashboard || function(btn, n) {
if (!confirm("<%:Are you sure you want to delete this panel?%>")) return false;
btn.disabled = true;
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete_dashboard")%>', {name: n}, function(x, status) {
if (!x || x.status != 200) { btn.disabled = false; return; }
if (status.delete_state == "1") {
var defBtn = document.getElementById('default_dashboard_' + n).firstElementChild;
if (defBtn.disabled) defBtn.value = '<%:Set to Default%>';
defBtn.disabled = true;
} else btn.disabled = false;
});
return false;
};
window.default_dashboard = window.default_dashboard || function(btn, n) {
btn.disabled = true;
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "default_dashboard")%>', {name: n}, function(x, status) {
if (!x || x.status != 200) { btn.disabled = false; return; }
btn.value = '<%:Default%>';
document.querySelectorAll('[id^="default_dashboard_"]').forEach(function(el) {
var b = el.firstElementChild;
if (b && b !== btn && b.value === '<%:Default%>') {
b.disabled = false;
b.value = '<%:Set to Default%>';
}
});
});
return false;
};
function initDashboardPanels() {
['Dashboard', 'Yacd', 'Metacubexd', 'Zashboard'].forEach(function(name) {
var switchEl = document.getElementById('switch_dashboard_' + name);
var defaultEl = document.getElementById('default_dashboard_' + name);
var deleteEl = document.getElementById('delete_dashboard_' + name);
if (!switchEl || !defaultEl || !deleteEl) {
return;
}
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "dashboard_type")%>', null, function(x, status) {
if (!x || x.status != 200) return;
var switchLabel;
if (name == "Metacubexd") {
switchLabel = ['<%:Update Version%>', 'Official'];
} else if (name == "Zashboard") {
switchLabel = ['<%:Update Version%>', 'Official'];
} else {
var isMeta = (name == "Dashboard" ? status.dashboard_type : status.yacd_type) == "Meta";
switchLabel = isMeta
? ['<%:Switch To Official Version%>', 'Official']
: ['<%:Switch To Meta Version%>', 'Meta'];
}
switchEl.innerHTML = makeDashboardBtn(switchLabel[0], 'switch_dashboard', [name, switchLabel[1]]);
if (status.default_dashboard == name.toLowerCase()) {
defaultEl.innerHTML = makeDashboardBtn('<%:Default%>', 'default_dashboard', [name]);
defaultEl.firstElementChild.disabled = true;
}
if (!status[name.toLowerCase()]) {
defaultEl.firstElementChild.disabled = true;
deleteEl.firstElementChild.disabled = true;
}
});
});
function geoHelp(component) {
return geoMeta[component] ? geoMeta[component].help : '';
}
window.setTimeout(function() {
onComponentChange();
loadGeoComponent();
initDashboardPanels();
loadGeoComponent()
}, 0);
//]]>
</script>
@@ -459,7 +367,6 @@
gap: 10px;
flex-wrap: wrap;
margin-top: 10px;
align-items: center;
}
.component-upgrade-card {
@@ -476,8 +383,8 @@
}
.component-selector {
width: 100%;
min-width: 180px;
width: 100%;
}
.component-layout {
@@ -520,59 +427,6 @@
color: #444;
}
.dashboard-update-grid {
display: grid;
grid-template-columns: 320px 1fr;
gap: 8px 24px;
align-items: center;
}
.dashboard-update-grid-label {
display: flex;
align-items: center;
min-height: 42px;
}
.dashboard-update-grid-label .component-select-label strong {
font-size: 18px;
font-weight: normal;
color: #444;
}
.dashboard-update-grid-label-first {
min-height: 52px;
}
.dashboard-update-grid-label-first .component-select-label strong {
font-size: 13px;
font-weight: bold;
}
.dashboard-update-grid-actions {
min-height: 42px;
}
.dashboard-update-grid-actions .ssr-clash-dashboard-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
align-items: center;
}
.dashboard-update-grid-actions .ssr-clash-dashboard-actions .cbi-button {
width: 140px;
margin: 0;
white-space: nowrap;
}
html[data-darkmode="true"] .dashboard-update-grid-label .component-select-label {
color: #aaa;
}
html[data-darkmode="true"] .dashboard-update-grid-label .component-select-label strong {
color: #e0e0e0;
}
@media (max-width: 900px) {
.component-layout {
flex-direction: column;
@@ -582,33 +436,6 @@
width: 100%;
min-width: 0;
}
.dashboard-update-grid {
grid-template-columns: 1fr;
gap: 4px;
}
.dashboard-update-grid-label {
min-height: auto;
margin: 12px 0 4px;
}
.dashboard-update-grid-label-first {
min-height: auto;
}
.dashboard-update-grid-actions {
min-height: auto;
margin-bottom: 8px;
}
.dashboard-update-grid-actions .ssr-clash-dashboard-actions .cbi-button {
width: 100%;
}
.dashboard-update-grid-actions-empty {
display: none;
}
}
</style>
@@ -694,83 +521,3 @@
</div>
</div>
</fieldset>
<fieldset class="cbi-section">
<legend><%:Dashboard Update%></legend>
<div class="cbi-value">
<div class="cbi-value-field component-upgrade-card">
<div class="dashboard-update-grid">
<div class="dashboard-update-grid-label dashboard-update-grid-label-first">
<div class="component-select-label">
<strong><%:Panel Version Management%></strong>
</div>
</div>
<div class="dashboard-update-grid-actions dashboard-update-grid-actions-empty"></div>
<div class="dashboard-update-grid-label">
<div class="component-select-label">
<strong><%:Yacd Panel%></strong>
</div>
</div>
<div class="dashboard-update-grid-actions">
<div class="ssr-clash-dashboard-actions">
<div id="switch_dashboard_Yacd"><%:Collecting data...%></div>
<div id="delete_dashboard_Yacd">
<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Delete%>" onclick="return delete_dashboard(this, 'Yacd')"/>
</div>
<div id="default_dashboard_Yacd">
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Set to Default%>" onclick="return default_dashboard(this, 'Yacd')"/>
</div>
</div>
</div>
<div class="dashboard-update-grid-label">
<div class="component-select-label">
<strong><%:Dashboard Panel%></strong>
</div>
</div>
<div class="dashboard-update-grid-actions">
<div class="ssr-clash-dashboard-actions">
<div id="switch_dashboard_Dashboard"><%:Collecting data...%></div>
<div id="delete_dashboard_Dashboard">
<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Delete%>" onclick="return delete_dashboard(this, 'Dashboard')"/>
</div>
<div id="default_dashboard_Dashboard">
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Set to Default%>" onclick="return default_dashboard(this, 'Dashboard')"/>
</div>
</div>
</div>
<div class="dashboard-update-grid-label">
<div class="component-select-label">
<strong><%:Zashboard Panel%></strong>
</div>
</div>
<div class="dashboard-update-grid-actions">
<div class="ssr-clash-dashboard-actions">
<div id="switch_dashboard_Zashboard"><%:Collecting data...%></div>
<div id="delete_dashboard_Zashboard">
<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Delete%>" onclick="return delete_dashboard(this, 'Zashboard')"/>
</div>
<div id="default_dashboard_Zashboard">
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Set to Default%>" onclick="return default_dashboard(this, 'Zashboard')"/>
</div>
</div>
</div>
<div class="dashboard-update-grid-label">
<div class="component-select-label">
<strong><%:Metacubexd Panel%></strong>
</div>
</div>
<div class="dashboard-update-grid-actions">
<div class="ssr-clash-dashboard-actions">
<div id="switch_dashboard_Metacubexd"><%:Collecting data...%></div>
<div id="delete_dashboard_Metacubexd">
<input type="button" class="btn cbi-button cbi-button-reset" value="<%:Delete%>" onclick="return delete_dashboard(this, 'Metacubexd')"/>
</div>
<div id="default_dashboard_Metacubexd">
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Set to Default%>" onclick="return default_dashboard(this, 'Metacubexd')"/>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
+105 -203
View File
@@ -100,16 +100,16 @@ msgstr ""
msgid "Accept LAN Access"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:692
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:649
msgid "Access Control"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1359
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1118
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302
msgid "Actions"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1339
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1098
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:349
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:357
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:256
@@ -130,11 +130,11 @@ msgstr ""
msgid "Additional Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:625
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:452
msgid "Address"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:693
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:650
msgid "Advanced Settings"
msgstr ""
@@ -164,11 +164,11 @@ msgstr ""
msgid "All Ports"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1267
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046
msgid "All client proxy rules cleared and applied."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1267
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046
msgid "All client proxy rules cleared."
msgstr ""
@@ -242,10 +242,6 @@ msgstr ""
msgid "Are you sure you want to delete subscribe link: %s ?"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:381
msgid "Are you sure you want to delete this panel?"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133
msgid "Are you sure you want to restore the client to default settings?"
msgstr ""
@@ -378,8 +374,8 @@ msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:653
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:688
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:480
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:515
msgid "Check Update"
msgstr ""
@@ -423,13 +419,13 @@ msgstr ""
msgid "Clang.CN.CIDR"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:419
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:380
msgid "Clash"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:112
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1337
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:893
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1096
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:3
msgid "Clash Panel"
msgstr ""
@@ -450,11 +446,11 @@ msgstr ""
msgid "Clash/Mihomo"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1342
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101
msgid "Clear All Rules"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1256
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035
msgid "Clear all custom client proxy rules and restore empty state?"
msgstr ""
@@ -473,24 +469,23 @@ msgstr ""
msgid "Click to the page"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1356
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1115
msgid "Client"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1222
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1001
msgid "Client rules exported to CSV file."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1246
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1025
msgid "Client rules imported from CSV file. Click Save to apply."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110
msgid "Client supports manual IP or IP/CIDR input."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1328
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1107
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:251
msgid "Close"
msgstr ""
@@ -505,21 +500,17 @@ msgstr ""
msgid "Cloudflare DNS (1.1.1.1)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:650
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:685
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:716
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:732
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:748
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:764
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:477
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:512
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:21
msgid "Collecting data..."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:637
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:464
msgid "Component"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:695
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:652
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:5
msgid "Component Update"
msgstr ""
@@ -562,12 +553,12 @@ msgstr ""
msgid "Copy SSR to clipboard successfully."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:616
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:443
msgid "Core Components"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:24
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:676
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:503
msgid "Country MMDB"
msgstr ""
@@ -595,8 +586,8 @@ msgstr ""
msgid "Custom"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1303
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1304
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1073
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1074
msgid "Custom Client Proxies Rules"
msgstr ""
@@ -632,11 +623,11 @@ msgstr ""
msgid "Custom YAML imported successfully: %s"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1007
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784
msgid "Custom client proxy rules saved and applied."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1007
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784
msgid "Custom client proxy rules saved."
msgstr ""
@@ -667,15 +658,7 @@ msgstr ""
msgid "DTLS 1.2"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:727
msgid "Dashboard Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:699
msgid "Dashboard Update"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:672
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:499
msgid "Database"
msgstr ""
@@ -691,10 +674,6 @@ msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1566
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1578
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1592
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:591
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:398
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:401
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:437
msgid "Default"
msgstr ""
@@ -723,17 +702,17 @@ msgid ""
"proxy protocol."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:499
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41
msgid "Defaults Cleared!"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:499
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41
msgid "Defaults Restored!"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110
msgid ""
"Define per-client Mihomo proxy targets. Rules are injected as SRC-IP-CIDR "
"entries before the original Clash rules."
@@ -743,11 +722,7 @@ msgstr ""
msgid "Delay (ms)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:888
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:718
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:734
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:750
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:766
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:665
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:319
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:196
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:328
@@ -825,7 +800,7 @@ msgstr ""
msgid "Downlink Capacity(Default:Mbps)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:624
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:451
msgid "Download Source"
msgstr ""
@@ -833,10 +808,6 @@ msgstr ""
msgid "Download failed"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:355
msgid "Downloading File..."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:971
msgid "Dual-stack Listening Socket"
msgstr ""
@@ -869,7 +840,7 @@ msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:676
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1355
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1114
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:184
msgid "Enable"
msgstr ""
@@ -1043,7 +1014,7 @@ msgstr ""
msgid "Expecting: %s"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1343
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1102
msgid "Export Client Rules"
msgstr ""
@@ -1055,7 +1026,7 @@ msgstr ""
msgid "FORCE BRUTAL"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1269
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1048
msgid "Failed to clear all client proxy rules."
msgstr ""
@@ -1084,7 +1055,7 @@ msgstr ""
msgid "Failed to query geo database information."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1009
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:786
msgid "Failed to save custom client proxy rules."
msgstr ""
@@ -1195,16 +1166,16 @@ msgstr ""
msgid "Gecko Packet Size (min)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:664
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:491
msgid "Geo Database Update"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:673
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:500
msgid "Geo Resource"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:14
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:628
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:455
msgid "GitHub Direct"
msgstr ""
@@ -1339,7 +1310,7 @@ msgstr ""
msgid "Httpupgrade Path"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:459
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:420
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:467
msgid "Hysteria2"
msgstr ""
@@ -1398,7 +1369,7 @@ msgstr ""
msgid "Import"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1344
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1103
msgid "Import Client Rules"
msgstr ""
@@ -1601,8 +1572,8 @@ msgstr ""
msgid "Listen only on the given interface or, if unspecified, on all"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1017
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1070
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:794
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:847
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:84
msgid "Loading..."
msgstr ""
@@ -1620,7 +1591,7 @@ msgstr ""
msgid "Local addresses"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:697
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:666
msgid "Log"
msgstr ""
@@ -1675,22 +1646,18 @@ msgstr ""
msgid "Maximum packet size the socks5 server can receive from external"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:759
msgid "Metacubexd Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:415
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:421
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:427
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:443
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:404
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:13
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:643
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:470
msgid "Mihomo"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1318
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1319
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1087
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1088
msgid "Mihomo Pannel"
msgstr ""
@@ -1768,10 +1735,10 @@ msgstr ""
msgid "NOT RUNNING"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:453
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:414
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:17
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:644
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:471
msgid "NaiveProxy"
msgstr ""
@@ -1823,14 +1790,10 @@ msgstr ""
msgid "No custom YAML file was selected."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:773
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:550
msgid "No custom client proxy rules yet."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:565
msgid "No dashboard panel installed. Please install one first."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:21
msgid "No new data!"
msgstr ""
@@ -1843,7 +1806,7 @@ msgstr ""
msgid "No subscription items found"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:914
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:691
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:32
msgid "No switchable proxy groups found."
msgstr ""
@@ -1966,7 +1929,7 @@ msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:677
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:504
msgid "OpenClash GeoSite Database"
msgstr ""
@@ -1990,7 +1953,7 @@ msgstr ""
msgid "Package Manager"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:638
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:465
msgid "Package Name"
msgstr ""
@@ -2007,10 +1970,6 @@ msgstr ""
msgid "Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:705
msgid "Panel Version Management"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:540
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:95
msgid "Password"
@@ -2057,7 +2016,7 @@ msgstr ""
msgid "Plugin Opts"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1357
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116
msgid "Policy"
msgstr ""
@@ -2162,22 +2121,22 @@ msgstr ""
msgid "RST Backup"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:481
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:442
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7
msgid "RUNNING"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:474
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:435
msgid "RUNNING in %s (%s) Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:478
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:439
msgid "RUNNING in %s Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:903
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1051
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:680
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:828
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:878
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:93
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:253
@@ -2197,7 +2156,7 @@ msgid "Realm URL"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:860
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17
msgid "Reapply"
msgstr ""
@@ -2247,14 +2206,14 @@ msgstr ""
msgid "Reload YAML"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:467
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:341
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:10
msgid "Reloading YAML..."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:135
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:136
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1358
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1117
msgid "Remarks"
msgstr ""
@@ -2275,14 +2234,14 @@ msgstr ""
msgid "Reserved bytes(optional)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1310
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1311
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1080
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1081
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:62
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:63
msgid "Reset Default Proxies Rules"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:502
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:376
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:44
msgid "Reset Defaults Failed!"
msgstr ""
@@ -2292,7 +2251,7 @@ msgstr ""
msgid "Reset complete"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:488
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:362
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:30
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr ""
@@ -2301,7 +2260,7 @@ msgstr ""
msgid "Reset to defaults"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:492
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:366
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:34
msgid "Resetting Defaults..."
msgstr ""
@@ -2341,7 +2300,7 @@ msgstr ""
msgid "Running Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:455
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416
msgid "SOCKS5"
msgstr ""
@@ -2349,20 +2308,20 @@ msgstr ""
msgid "SS URL base64 sstr format not recognized."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:690
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:647
msgid "SSR Client"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:5
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:641
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:468
msgid "SSR Plus+ Main Program"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:694
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:651
msgid "SSR Server"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1347
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1106
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:195
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:327
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:352
@@ -2387,7 +2346,7 @@ msgstr ""
msgid "Save failed:"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:986
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:763
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:81
msgid "Saving..."
msgstr ""
@@ -2396,10 +2355,6 @@ msgstr ""
msgid "Second"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1327
msgid "Select Dashboard Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1744
msgid "Self-signed Certificate"
msgstr ""
@@ -2439,7 +2394,7 @@ msgstr ""
msgid "Server failsafe auto swith and custom update settings"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:691
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:648
msgid "Servers Nodes"
msgstr ""
@@ -2451,15 +2406,6 @@ msgstr ""
msgid "Session Ticket"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:387
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:403
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:721
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:737
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:753
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:769
msgid "Set to Default"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:407
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:615
msgid "Shadow-TLS"
@@ -2469,15 +2415,15 @@ msgstr ""
msgid "Shadow-TLS ChainPoxy type"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:377
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:392
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:462
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:61
msgid "ShadowSocks"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:428
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:430
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:389
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:391
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:395
msgid "ShadowSocks-Rust"
msgstr ""
@@ -2486,7 +2432,7 @@ msgstr ""
msgid "ShadowSocks-rust Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:685
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644
msgid "ShadowSocksR Plus+"
msgstr ""
@@ -2494,7 +2440,7 @@ msgstr ""
msgid "ShadowSocksR Plus+ Settings"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:457
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418
msgid "ShadowTLS"
msgstr ""
@@ -2503,7 +2449,7 @@ msgstr ""
msgid "Shadowsocks Password"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:424
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:385
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:389
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:64
msgid "ShadowsocksR"
@@ -2590,7 +2536,7 @@ msgstr ""
msgid "Starting subscription update..."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:696
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:653
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134
@@ -2676,39 +2622,21 @@ msgid ""
"a maximum length of 3 bytes."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:373
msgid "Switch Failed"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
msgid "Switch Successful"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:432
msgid "Switch To Meta Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:431
msgid "Switch To Official Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104
msgid "Switch check cycly(second)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:953
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:730
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:71
msgid "Switch failed."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:950
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:727
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:68
msgid "Switched successfully."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:943
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:720
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:61
msgid "Switching..."
msgstr ""
@@ -2762,7 +2690,7 @@ msgstr ""
msgid "TLS is used to verify the leaf certificate name."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:422
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:383
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:404
msgid "TUIC"
msgstr ""
@@ -2831,8 +2759,8 @@ msgid ""
"GitHub release page."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1039
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1094
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:816
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:871
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:89
msgid "This Clash total node is not active. Apply this node first."
msgstr ""
@@ -2886,7 +2814,7 @@ msgstr ""
msgid "Transport Protocol"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:451
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:412
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:461
msgid "Trojan"
msgstr ""
@@ -2977,10 +2905,6 @@ msgstr ""
msgid "Unsupported package manager"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:372
msgid "Unzip Error"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:197
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:332
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:333
@@ -2991,10 +2915,6 @@ msgstr ""
msgid "Update All Subscribe Servers"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:373
msgid "Update Failed"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:511
msgid "Update Interval(min)"
msgstr ""
@@ -3003,16 +2923,6 @@ msgstr ""
msgid "Update Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:362
msgid "Update Successful"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:362
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:425
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:427
msgid "Update Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:482
msgid "Update cycle (Day/Week)"
msgstr ""
@@ -3041,8 +2951,8 @@ msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:654
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:689
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:481
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:516
msgid "Upgrade"
msgstr ""
@@ -3148,12 +3058,12 @@ msgid "Using incorrect encryption mothod may causes service fail to start"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:678
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:505
msgid "V2Ray GeoIP Databases"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:37
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:679
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:506
msgid "V2Ray GeoSite Databases"
msgstr ""
@@ -3265,7 +3175,7 @@ msgstr ""
msgid "XTLS"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:445
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:406
msgid "Xray"
msgstr ""
@@ -3278,32 +3188,24 @@ msgid "Xray Noise Packets"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:9
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:642
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:469
msgid "Xray-core"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:477
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:20
msgid "YAML Reload Failed!"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17
msgid "YAML Reloaded!"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:711
msgid "Yacd Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273
msgid "Yes"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:743
msgid "Zashboard Panel"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
msgid "adblock_url"
msgstr ""
+105 -203
View File
@@ -104,16 +104,16 @@ msgstr "一个合法的文件路径。在运行之前,此文件必须不存在
msgid "Accept LAN Access"
msgstr "接受局域网访问"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:692
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:649
msgid "Access Control"
msgstr "访问控制"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1359
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1118
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302
msgid "Actions"
msgstr "操作"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1339
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1098
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:349
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:357
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:256
@@ -134,11 +134,11 @@ msgstr "添加中..."
msgid "Additional Version"
msgstr "附加版本"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:625
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:452
msgid "Address"
msgstr "地址"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:693
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:650
msgid "Advanced Settings"
msgstr "高级设置"
@@ -168,11 +168,11 @@ msgstr "全部"
msgid "All Ports"
msgstr "所有端口(默认)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1267
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046
msgid "All client proxy rules cleared and applied."
msgstr "所有客户端代理规则已清空并生效。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1267
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046
msgid "All client proxy rules cleared."
msgstr "所有客户端代理规则已清空。"
@@ -246,10 +246,6 @@ msgstr "定时模式"
msgid "Are you sure you want to delete subscribe link: %s ?"
msgstr "确定要删除此订阅链接:%s 吗?"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:381
msgid "Are you sure you want to delete this panel?"
msgstr "确定要删除此面板吗?"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133
msgid "Are you sure you want to restore the client to default settings?"
msgstr "是否真的要恢复客户端默认配置?"
@@ -382,8 +378,8 @@ msgstr "切换检查重试次数"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:653
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:688
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:480
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:515
msgid "Check Update"
msgstr "检查更新"
@@ -427,13 +423,13 @@ msgstr ""
msgid "Clang.CN.CIDR"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:419
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:380
msgid "Clash"
msgstr "Clash"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:112
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1337
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:893
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1096
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:3
msgid "Clash Panel"
msgstr "Clash 面板"
@@ -454,11 +450,11 @@ msgstr "Clash YAML 路径"
msgid "Clash/Mihomo"
msgstr "Clash/Mihomo"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1342
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101
msgid "Clear All Rules"
msgstr "清空所有规则"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1256
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035
msgid "Clear all custom client proxy rules and restore empty state?"
msgstr "清空所有自定义客户端代理规则,并恢复为空白状态吗?"
@@ -477,24 +473,23 @@ msgstr "点击此处前往管理"
msgid "Click to the page"
msgstr "点击前往"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1356
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1115
msgid "Client"
msgstr "客户端"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1222
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1001
msgid "Client rules exported to CSV file."
msgstr "客户端规则已导出为 CSV 文件。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1246
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1025
msgid "Client rules imported from CSV file. Click Save to apply."
msgstr "客户端规则已从 CSV 文件导入,请点击保存生效。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110
msgid "Client supports manual IP or IP/CIDR input."
msgstr "客户端支持手动输入 IP 或 IP/CIDR。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1328
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1107
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:251
msgid "Close"
msgstr "关闭"
@@ -509,21 +504,17 @@ msgstr ""
msgid "Cloudflare DNS (1.1.1.1)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:650
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:685
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:716
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:732
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:748
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:764
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:477
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:512
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:21
msgid "Collecting data..."
msgstr "正在收集数据中..."
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:637
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:464
msgid "Component"
msgstr "组件"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:695
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:652
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:5
msgid "Component Update"
msgstr "组件升级"
@@ -566,12 +557,12 @@ msgstr "使用订阅转换模板 URL 将订阅转换为 Clash/Mihomo YAML。"
msgid "Copy SSR to clipboard successfully."
msgstr "成功复制 SSR 网址到剪贴板。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:616
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:443
msgid "Core Components"
msgstr "核心组件"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:24
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:676
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:503
msgid "Country MMDB"
msgstr "Country MMDB"
@@ -599,8 +590,8 @@ msgstr "当前版本"
msgid "Custom"
msgstr "自定义"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1303
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1304
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1073
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1074
msgid "Custom Client Proxies Rules"
msgstr "自定义客户端代理规则"
@@ -637,11 +628,11 @@ msgstr "自定义端口"
msgid "Custom YAML imported successfully: %s"
msgstr "自定义 YAML 导入成功:%s"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1007
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784
msgid "Custom client proxy rules saved and applied."
msgstr "自定义客户端代理规则已保存并生效。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1007
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784
msgid "Custom client proxy rules saved."
msgstr "自定义客户端代理规则已保存。"
@@ -672,15 +663,7 @@ msgstr ""
msgid "DTLS 1.2"
msgstr "DTLS 1.2 数据包"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:727
msgid "Dashboard Panel"
msgstr "Dashboard 面板"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:699
msgid "Dashboard Update"
msgstr "Dashboard 更新"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:672
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:499
msgid "Database"
msgstr "数据库"
@@ -696,10 +679,6 @@ msgstr "解密"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1566
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1578
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1592
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:591
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:398
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:401
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:437
msgid "Default"
msgstr "默认"
@@ -730,17 +709,17 @@ msgstr ""
"默认值:16。填负数时,如 -1,不使用 Mux 模块承载 UDP 流量。将使用代理协议原本"
"的 UDP 传输方式。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:499
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41
msgid "Defaults Cleared!"
msgstr "已清空默认状态!"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:499
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41
msgid "Defaults Restored!"
msgstr "默认值已恢复!"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110
msgid ""
"Define per-client Mihomo proxy targets. Rules are injected as SRC-IP-CIDR "
"entries before the original Clash rules."
@@ -752,11 +731,7 @@ msgstr ""
msgid "Delay (ms)"
msgstr "延迟(ms)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:888
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:718
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:734
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:750
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:766
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:665
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:319
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:196
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:328
@@ -834,7 +809,7 @@ msgstr "国内 DNS 服务器"
msgid "Downlink Capacity(Default:Mbps)"
msgstr "下行链路容量(默认:Mbps)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:624
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:451
msgid "Download Source"
msgstr "下载源"
@@ -842,10 +817,6 @@ msgstr "下载源"
msgid "Download failed"
msgstr "下载失败"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:355
msgid "Downloading File..."
msgstr "文件下载中..."
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:971
msgid "Dual-stack Listening Socket"
msgstr "双栈 Socket 监听"
@@ -878,7 +849,7 @@ msgstr "编辑服务器配置"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:676
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1355
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1114
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:184
msgid "Enable"
msgstr "启用"
@@ -1052,7 +1023,7 @@ msgstr "示例:"
msgid "Expecting: %s"
msgstr "应为:%s"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1343
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1102
msgid "Export Client Rules"
msgstr "批量导出客户端规则"
@@ -1064,7 +1035,7 @@ msgstr "解压失败"
msgid "FORCE BRUTAL"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1269
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1048
msgid "Failed to clear all client proxy rules."
msgstr "清空所有客户端代理规则失败。"
@@ -1093,7 +1064,7 @@ msgstr "获取组件信息失败。"
msgid "Failed to query geo database information."
msgstr "获取 Geo 数据库信息失败。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1009
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:786
msgid "Failed to save custom client proxy rules."
msgstr "保存自定义客户端代理规则失败。"
@@ -1204,16 +1175,16 @@ msgstr "Gecko 包大小(最大)"
msgid "Gecko Packet Size (min)"
msgstr "Gecko 包大小(最小)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:664
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:491
msgid "Geo Database Update"
msgstr "Geo 数据库更新"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:673
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:500
msgid "Geo Resource"
msgstr "Geo 资源"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:14
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:628
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:455
msgid "GitHub Direct"
msgstr "GitHub 直连"
@@ -1348,7 +1319,7 @@ msgstr "HTTPUpgrade 主机名"
msgid "Httpupgrade Path"
msgstr "HTTPUpgrade 路径"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:459
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:420
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:467
msgid "Hysteria2"
msgstr ""
@@ -1409,7 +1380,7 @@ msgstr "如果你使用自签证书,请选择"
msgid "Import"
msgstr "导入配置信息"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1344
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1103
msgid "Import Client Rules"
msgstr "批量导入客户端规则"
@@ -1612,8 +1583,8 @@ msgstr "Linux 内核 TUN 虚拟网卡需要系统支持和 root 权限。"
msgid "Listen only on the given interface or, if unspecified, on all"
msgstr "仅监听指定的接口,未指定则监听全部。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1017
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1070
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:794
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:847
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:84
msgid "Loading..."
msgstr "加载中..."
@@ -1631,7 +1602,7 @@ msgstr "本机服务端"
msgid "Local addresses"
msgstr "本地地址"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:697
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:666
msgid "Log"
msgstr "日志"
@@ -1688,22 +1659,18 @@ msgstr "最大分片数"
msgid "Maximum packet size the socks5 server can receive from external"
msgstr "socks5 服务器可以从外部接收的最大数据包大小(单位:字节)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:759
msgid "Metacubexd Panel"
msgstr "Metacubexd 面板"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:415
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:421
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:427
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:443
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:404
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:13
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:643
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:470
msgid "Mihomo"
msgstr "Mihomo"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1318
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1319
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1087
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1088
msgid "Mihomo Pannel"
msgstr "Mihomo 面板"
@@ -1783,10 +1750,10 @@ msgstr ""
msgid "NOT RUNNING"
msgstr "未运行"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:453
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:414
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:398
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:17
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:644
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:471
msgid "NaiveProxy"
msgstr ""
@@ -1838,14 +1805,10 @@ msgstr "没有可用的核心(Shadowsocks, Mihomo 或 Xray)可以导入此
msgid "No custom YAML file was selected."
msgstr "没有选择自定义 YAML 文件。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:773
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:550
msgid "No custom client proxy rules yet."
msgstr "暂无自定义客户端代理规则。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:565
msgid "No dashboard panel installed. Please install one first."
msgstr "未安装 Dashboard 面板,请先安装至少一个面板。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:21
msgid "No new data!"
msgstr "你已经是最新数据,无需更新!"
@@ -1858,7 +1821,7 @@ msgstr "没有上传证书。"
msgid "No subscription items found"
msgstr "没有找到任何订阅项"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:914
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:691
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:32
msgid "No switchable proxy groups found."
msgstr "未找到可切换的代理组。"
@@ -1982,7 +1945,7 @@ msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:677
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:504
msgid "OpenClash GeoSite Database"
msgstr "OpenClash GeoSite 数据库"
@@ -2006,7 +1969,7 @@ msgstr ""
msgid "Package Manager"
msgstr "包管理器"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:638
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:465
msgid "Package Name"
msgstr "组件包名称"
@@ -2023,10 +1986,6 @@ msgstr "数据包 | Rand 长度"
msgid "Panel"
msgstr "面板"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:705
msgid "Panel Version Management"
msgstr "面板版本管理"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:540
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:95
msgid "Password"
@@ -2073,7 +2032,7 @@ msgstr "请填写 Clash 订阅 URL 或本地 YAML 路径中的至少一项。"
msgid "Plugin Opts"
msgstr "插件参数"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1357
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116
msgid "Policy"
msgstr "策略"
@@ -2178,22 +2137,22 @@ msgstr ""
msgid "RST Backup"
msgstr "恢复备份"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:481
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:442
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7
msgid "RUNNING"
msgstr "运行中"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:474
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:435
msgid "RUNNING in %s (%s) Mode"
msgstr "运行中,当前为 %s(%s)模式"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:478
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:439
msgid "RUNNING in %s Mode"
msgstr "运行中,当前为 %s 模式"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:903
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1051
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:680
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:828
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:878
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:93
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:253
@@ -2213,7 +2172,7 @@ msgid "Realm URL"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:860
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17
msgid "Reapply"
msgstr "重新应用"
@@ -2263,14 +2222,14 @@ msgstr "发布包名"
msgid "Reload YAML"
msgstr "重载 YAML"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:467
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:341
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:10
msgid "Reloading YAML..."
msgstr "正在重载 YAML..."
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:135
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:136
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1358
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1117
msgid "Remarks"
msgstr "备注"
@@ -2291,14 +2250,14 @@ msgstr "获取 TLS 证书链指纹需要 OpenSSL 支持。"
msgid "Reserved bytes(optional)"
msgstr "保留字节(可选)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1310
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1311
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1080
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1081
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:62
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:63
msgid "Reset Default Proxies Rules"
msgstr "重置代理分组规则"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:502
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:376
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:44
msgid "Reset Defaults Failed!"
msgstr "重置默认值失败!"
@@ -2308,7 +2267,7 @@ msgstr "重置默认值失败!"
msgid "Reset complete"
msgstr "重置完成"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:488
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:362
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:30
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值吗?"
@@ -2317,7 +2276,7 @@ msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值
msgid "Reset to defaults"
msgstr "恢复出厂设置"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:492
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:366
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:34
msgid "Resetting Defaults..."
msgstr "正在重置默认值..."
@@ -2357,7 +2316,7 @@ msgstr "运行中"
msgid "Running Mode"
msgstr "运行模式"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:455
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416
msgid "SOCKS5"
msgstr "SOCKS5"
@@ -2365,20 +2324,20 @@ msgstr "SOCKS5"
msgid "SS URL base64 sstr format not recognized."
msgstr "无法识别 SS URL 的 Base64 格式。"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:690
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:647
msgid "SSR Client"
msgstr "客户端"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:5
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:641
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:468
msgid "SSR Plus+ Main Program"
msgstr "SSR Plus+ 主程序"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:694
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:651
msgid "SSR Server"
msgstr "服务端"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1347
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1106
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:195
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:327
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:352
@@ -2404,7 +2363,7 @@ msgstr "保存当前订阅设置"
msgid "Save failed:"
msgstr "保存失败:"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:986
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:763
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:81
msgid "Saving..."
msgstr "保存中..."
@@ -2413,10 +2372,6 @@ msgstr "保存中..."
msgid "Second"
msgstr "周期"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1327
msgid "Select Dashboard Panel"
msgstr "选择 Dashboard 面板"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1744
msgid "Self-signed Certificate"
msgstr "自签证书"
@@ -2456,7 +2411,7 @@ msgstr "服务端类型"
msgid "Server failsafe auto swith and custom update settings"
msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:691
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:648
msgid "Servers Nodes"
msgstr "服务器节点"
@@ -2468,15 +2423,6 @@ msgstr "服务器节点订阅与管理"
msgid "Session Ticket"
msgstr "会话凭据"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:387
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:403
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:721
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:737
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:753
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:769
msgid "Set to Default"
msgstr "设为默认"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:407
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:615
msgid "Shadow-TLS"
@@ -2486,15 +2432,15 @@ msgstr ""
msgid "Shadow-TLS ChainPoxy type"
msgstr "代理链类型"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:377
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:392
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:462
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:61
msgid "ShadowSocks"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:428
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:430
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:389
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:391
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:395
msgid "ShadowSocks-Rust"
msgstr ""
@@ -2503,7 +2449,7 @@ msgstr ""
msgid "ShadowSocks-rust Version"
msgstr "ShadowSocks-rust 版本"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:685
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644
msgid "ShadowSocksR Plus+"
msgstr ""
@@ -2511,7 +2457,7 @@ msgstr ""
msgid "ShadowSocksR Plus+ Settings"
msgstr "ShadowSocksR Plus+ 设置"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:457
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418
msgid "ShadowTLS"
msgstr "ShadowTLS"
@@ -2520,7 +2466,7 @@ msgstr "ShadowTLS"
msgid "Shadowsocks Password"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:424
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:385
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:389
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:64
msgid "ShadowsocksR"
@@ -2607,7 +2553,7 @@ msgstr "开始探测"
msgid "Starting subscription update..."
msgstr "正在开始更新订阅..."
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:696
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:653
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134
@@ -2695,39 +2641,21 @@ msgstr ""
"支持以“,”分隔的十进制数字,或者经过 Base64 编码的字符串,其最大长度为 3 个字"
"节。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:373
msgid "Switch Failed"
msgstr "切换失败"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
msgid "Switch Successful"
msgstr "切换成功"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:432
msgid "Switch To Meta Version"
msgstr "切换至 Meta 版本"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:365
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:431
msgid "Switch To Official Version"
msgstr "切换至官方版本"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104
msgid "Switch check cycly(second)"
msgstr "自动切换检查周期(秒)"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:953
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:730
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:71
msgid "Switch failed."
msgstr "切换失败。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:950
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:727
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:68
msgid "Switched successfully."
msgstr "切换成功。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:943
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:720
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:61
msgid "Switching..."
msgstr "正在切换..."
@@ -2781,7 +2709,7 @@ msgstr "TLS 主机名"
msgid "TLS is used to verify the leaf certificate name."
msgstr "TLS 用于验证 leaf 证书的 name。"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:422
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:383
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:404
msgid "TUIC"
msgstr "TUIC"
@@ -2860,8 +2788,8 @@ msgstr ""
"在线升级只跟踪 Mihomo 最新稳定版,并根据当前架构从官方 GitHub 发布页下载匹配"
"的 Linux 压缩包。"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1039
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1094
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:816
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:871
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:89
msgid "This Clash total node is not active. Apply this node first."
msgstr "该 Clash 总节点当前未启用,请先应用该节点。"
@@ -2915,7 +2843,7 @@ msgstr "传输协议"
msgid "Transport Protocol"
msgstr "传输协议"
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:451
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:412
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:461
msgid "Trojan"
msgstr "Trojan"
@@ -3006,10 +2934,6 @@ msgstr "不支持的组件"
msgid "Unsupported package manager"
msgstr "不支持的包管理器"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:372
msgid "Unzip Error"
msgstr "解压失败"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:197
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:332
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:333
@@ -3020,10 +2944,6 @@ msgstr "更新"
msgid "Update All Subscribe Servers"
msgstr "更新所有订阅节点"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:373
msgid "Update Failed"
msgstr "更新失败"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:511
msgid "Update Interval(min)"
msgstr "更新间隔(分钟)"
@@ -3032,16 +2952,6 @@ msgstr "更新间隔(分钟)"
msgid "Update Mode"
msgstr "更新模式"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:362
msgid "Update Successful"
msgstr "更新成功"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:362
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:425
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:427
msgid "Update Version"
msgstr "更新版本"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:482
msgid "Update cycle (Day/Week)"
msgstr "更新周期(天/周)"
@@ -3070,8 +2980,8 @@ msgstr "更新中..."
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:654
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:689
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:481
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:516
msgid "Upgrade"
msgstr "升级"
@@ -3179,12 +3089,12 @@ msgid "Using incorrect encryption mothod may causes service fail to start"
msgstr "输入不正确的参数组合可能会导致服务无法启动"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:678
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:505
msgid "V2Ray GeoIP Databases"
msgstr "V2Ray GeoIP 数据库"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:37
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:679
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:506
msgid "V2Ray GeoSite Databases"
msgstr "V2Ray GeoSite 数据库"
@@ -3296,7 +3206,7 @@ msgstr "XHTTP 路径"
msgid "XTLS"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:445
#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:406
msgid "Xray"
msgstr "Xray"
@@ -3309,32 +3219,24 @@ msgid "Xray Noise Packets"
msgstr "Xray 噪声数据包"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:9
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:642
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:469
msgid "Xray-core"
msgstr "Xray-core"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:477
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:351
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:20
msgid "YAML Reload Failed!"
msgstr "YAML 重载失败!"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17
msgid "YAML Reloaded!"
msgstr "YAML 已重载!"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:711
msgid "Yacd Panel"
msgstr "Yacd 面板"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273
msgid "Yes"
msgstr "是"
#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:743
msgid "Zashboard Panel"
msgstr "Zashboard 面板"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
msgid "adblock_url"
msgstr "广告屏蔽更新 URL"
+4 -38
View File
@@ -611,9 +611,7 @@ prepare_clash_runtime_config() {
local enable_fake_ip
local socks5_auth
local socks5_user
local default_dashboard
local yacd_type
local dashboard_type
local socks5_pass
cache_file="$(get_clash_cache_file "$sid")"
workdir="$(get_clash_workdir "$sid")"
@@ -637,41 +635,11 @@ prepare_clash_runtime_config() {
cp -f "$cache_file" "$raw_file"
filter_clash_yaml_proxies "$raw_file"
default_dashboard=$(uci_get_by_type global default_dashboard "zashboard")
yacd_type=$(uci_get_by_type global yacd_type "Meta")
dashboard_type=$(uci_get_by_type global dashboard_type "Official")
case "$default_dashboard" in
dashboard)
if [ "$dashboard_type" = "Official" ]; then
EXTERNAL_UI_URL="https://codeload.github.com/ayanamist/clash-dashboard/zip/refs/heads/gh-pages"
else
EXTERNAL_UI_URL="https://codeload.github.com/MetaCubeX/Razord-meta/zip/refs/heads/gh-pages"
fi
;;
yacd)
if [ "$yacd_type" = "Official" ]; then
EXTERNAL_UI_URL="https://codeload.github.com/haishanh/yacd/zip/refs/heads/gh-pages"
else
EXTERNAL_UI_URL="https://codeload.github.com/MetaCubeX/Yacd-meta/zip/refs/heads/gh-pages"
fi
;;
metacubexd)
EXTERNAL_UI_URL="https://codeload.github.com/MetaCubeX/metacubexd/zip/refs/heads/gh-pages"
;;
zashboard|*)
EXTERNAL_UI_URL="https://codeload.github.com/Zephyruso/zashboard/zip/refs/heads/gh-pages-cdn-fonts"
default_dashboard="zashboard"
;;
esac
cat >"$overlay_file" <<-EOF
redir-port: $local_port
tproxy-port: $local_port
external-controller: 0.0.0.0:$CLASH_API_PORT
secret: ""
external-ui: /usr/share/shadowsocksr/ui
external-ui-name: $default_dashboard
external-ui-url: $EXTERNAL_UI_URL
external-controller: 127.0.0.1:$CLASH_API_PORT
secret: $clash_secret
allow-lan: true
bind-address: 0.0.0.0
routing-mark: $CLASH_OUTBOUND_MARK
@@ -2508,7 +2476,7 @@ Start_Run() {
return 1
}
clash_workdir="$(get_clash_workdir "$GLOBAL_SERVER")"
SAFE_PATHS="/usr/share/shadowsocksr/" ln_start_bin "$mihomo_bin" ssr-retcp -d "$clash_workdir" -f "$clash_workdir/config.yaml"
ln_start_bin "$mihomo_bin" ssr-retcp -d "$clash_workdir" -f "$clash_workdir/config.yaml"
echolog "Main node: $($mihomo_bin -v 2>&1 | head -1 | awk '{print $1, $3}') (Clash) Started!"
;;
socks5)
@@ -2534,13 +2502,11 @@ load_config() {
else
GLOBAL_SERVER=$switch_server
fi
# 全局 socks5 注释掉后配合 advanced.lua 中取消注释 -- Server Selection 选项
if [ "$(uci_get_by_type socks5_proxy enabled 0)" = "1" ]; then
uci -q set "$NAME.@socks5_proxy[0].server=same"
else
uci -q set "$NAME.@socks5_proxy[0].server=nil"
fi
# 全局 3proxy 注释掉后配合 advanced.lua 中取消注释 -- Server Selection 选项
if [ "$(uci_get_by_type http_proxy enabled 0)" = "1" ]; then
uci -q set "$NAME.@http_proxy[0].server=same"
else
@@ -92,18 +92,6 @@ if [ -s "/etc/config/shadowsocksr" ]; then
uci -q set shadowsocksr.@global[0].component_mirror='direct'
fi
if ! uci -q get shadowsocksr.@global[0].yacd_type > /dev/null; then
uci -q set shadowsocksr.@global[0].yacd_type='Meta'
fi
if ! uci -q get shadowsocksr.@global[0].dashboard_type > /dev/null; then
uci -q set shadowsocksr.@global[0].dashboard_type='Official'
fi
if ! uci -q get shadowsocksr.@global[0].default_dashboard > /dev/null; then
uci -q set shadowsocksr.@global[0].default_dashboard='zashboard'
fi
if ! uci -q get shadowsocksr.@global[0].filter_aaaa > /dev/null; then
legacy_filter_aaaa="$(uci -q get shadowsocksr.@global[0].mosdns_ipv6)"
uci -q set shadowsocksr.@global[0].filter_aaaa="${legacy_filter_aaaa:-1}"
@@ -15,9 +15,6 @@ config global
option switch_try_count '3'
option default_node_local_port '1234'
option component_mirror 'direct'
option yacd_type 'Meta'
option dashboard_type 'Official'
option default_dashboard 'zashboard'
option gfwlist_url 'https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt'
option chnroute_url 'https://ispip.clang.cn/all_cn.txt'
option adblock_url 'https://anti-ad.net/anti-ad-for-dnsmasq.conf'
Whitespace-only changes.
@@ -1 +0,0 @@
board.zash.run.place
@@ -1,30 +0,0 @@
# Third-party notices
## Earth textures
The Earth day, night, bump, roughness, and cloud textures in
`src/assets/images/earth/` are resized/combined derivatives of the Solar System
Scope planet textures. `background.jpg` preserves the downloaded 2K stars image.
- Source: https://www.solarsystemscope.com/textures/
- 2K stars source: https://www.solarsystemscope.com/textures/download/2k_stars.jpg
- Creator: Solar System Scope
- License: Creative Commons Attribution 4.0 International (CC BY 4.0)
https://creativecommons.org/licenses/by/4.0/
The node-material treatment is adapted from the Three.js WebGPU TSL Earth
example (Three.js, MIT License):
https://threejs.org/examples/webgpu_tsl_earth.html
## DB-IP City Lite
The application can download `dbip-city-lite@1.0.16` on explicit user request.
The database is not bundled with this application. It is downloaded into and
queried from the user's browser storage.
- Source: https://www.npmjs.com/package/dbip-city-lite/v/1.0.16
- Data provider: DB-IP.com, https://db-ip.com/db/lite.php
- License: Creative Commons Attribution 4.0 International (CC BY 4.0)
https://creativecommons.org/licenses/by/4.0/
IP geolocation data provided by DB-IP.com.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

@@ -1 +0,0 @@
.earth-globe-card--expanded[data-v-dede773a]{z-index:60;border-radius:0;flex-direction:column;display:flex;position:fixed;inset:0}@media (width>=769px){.home-page.sidebar-expanded{left:16rem}.home-page.sidebar-collapsed{left:4.5rem}}
@@ -1,2 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./earth-renderer-Dh_x8rMR.js","./palette-DPyxzM37.js"])))=>i.map(i=>d[i]);
import{$ as e,A as t,B as n,D as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as ee,M as te,O as d,P as f,Q as p,R as m,S as ne,T as re,U as ie,V as h,W as g,X as _,Y as ae,Z as oe,a as se,at as v,b as ce,c as y,ct as b,d as le,et as ue,f as de,g as x,h as S,i as fe,it as C,j as pe,k as me,l as w,lt as T,m as E,n as he,nt as D,o as O,ot as k,p as ge,q as _e,r as ve,rt as ye,s as be,st as xe,t as Se,u as Ce,w as we,x as Te,y as Ee,z as A}from"./index-DC9m9n9t.js";import{t as De}from"./palette-DPyxzM37.js";var Oe=T(Ce(),1),j=e=>{try{return Oe.parse(e).toNormalizedString()}catch{return null}},M=e=>{let t=e.trim();if(!t)return null;let n=j(t);if(n)return n;if(t.startsWith(`[`)){let e=t.indexOf(`]`);if(e>1)return j(t.slice(1,e))}let r=t.lastIndexOf(`:`);return r>0&&/^\d+$/.test(t.slice(r+1))?j(t.slice(0,r)):null},N=e=>{let t=w(),n=[];for(let r of e){let e=M(t.destination(r)),i=t.hostname(r).trim().replace(/\.$/,``);!e&&!i||n.push({destinationIP:e,resolutionHost:i.toLowerCase(),upload:Math.max(0,r.uploadSpeed),download:Math.max(0,r.downloadSpeed),host:i||e||``,downloaded:Math.max(0,t.download(r)),direct:t.isDirect(r)})}return n},P=({latitude:e,longitude:t})=>`${e.toFixed(4)},${t.toFixed(4)}`,F=(...e)=>e.flat().sort((e,t)=>t.downloaded-e.downloaded).slice(0,5),I=e=>e!==null&&e.latitude!==null&&e.longitude!==null&&Number.isFinite(e.latitude)&&Number.isFinite(e.longitude)&&e.latitude>=-90&&e.latitude<=90&&e.longitude>=-180&&e.longitude<=180,L=(e,t,n)=>{let r,i;if(n&&I(n))r=n.latitude,i=n.longitude;else if(t&&I(t))r=t.latitude,i=t.longitude;else return null;return{ip:e,latitude:r,longitude:i,city:n?.city.trim()||t?.city||``,country:t?.country||n?.country.trim()||``}},ke=async(e,t,n,r,i,a)=>{let o=j(t);if(!o)return{routes:[],origin:null};let s=N(e),c=[...new Set(s.filter(e=>!e.destinationIP).map(e=>e.resolutionHost))],l=a&&c.length>0?await a(c):{};for(let e of s)e.destinationIP||=j(l[e.resolutionHost]??``);let u=s.filter(e=>e.destinationIP!==null),ee=new Set([o]);for(let e of u)ee.add(e.destinationIP);let te=await r([...ee],n),d=L(o,te[o],i);if(!d)return{routes:[],origin:null};let f=new Map;for(let e of u){let t=te[e.destinationIP];if(!t)continue;let n=[{...d,role:`origin`},{...t,role:`destination`}],r=n.map(e=>`${e.role}:${P(e)}`).join(`>`),i=f.get(r);i?(i.direct&&=e.direct,i.connections+=1,i.upload+=e.upload,i.download+=e.download,i.topHosts=F(i.topHosts,e.host?[{host:e.host,downloaded:e.downloaded}]:[])):f.set(r,{key:r,path:n,direct:e.direct,connections:1,upload:e.upload,download:e.download,topHosts:e.host?[{host:e.host,downloaded:e.downloaded}]:[]})}return{routes:[...f.values()],origin:d}},Ae=617e5;u(),e(),v(),f();var je={class:`flex items-center justify-between`},Me={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},Ne={class:`flex items-center gap-1`},Pe=[`aria-label`,`title`,`aria-pressed`],Fe=[`aria-label`,`title`,`aria-pressed`],Ie=[`aria-label`,`title`,`aria-pressed`],Le={class:`pointer-events-none absolute top-2 right-2 left-2 flex flex-wrap gap-1.5 text-xs`},Re={class:`bg-base-100/75 pointer-events-auto flex h-8 items-center gap-1.5 rounded-lg px-2 shadow backdrop-blur-md`},ze={class:`text-base-content/60`},Be={class:`font-mono`},Ve=[`aria-label`],He=[`aria-label`],Ue={class:`pointer-events-none absolute right-2 bottom-2 left-2 flex items-end justify-between gap-2`},We=[`aria-label`],Ge={class:`text-base-content/70 whitespace-nowrap`},Ke={key:0,class:`pointer-events-none absolute inset-0 flex items-center justify-center p-4`},qe={class:`bg-base-100/90 max-w-sm rounded-xl p-4 text-center text-sm shadow-xl backdrop-blur-md`},Je={class:`text-error`},Ye={key:1,class:`pointer-events-none absolute inset-0 flex items-center justify-center`},Xe={class:`bg-base-100/85 flex items-center gap-2 rounded-xl px-4 py-3 text-sm shadow-xl backdrop-blur-md`},Ze={key:2,class:`pointer-events-none absolute inset-0 flex items-center justify-center p-4`},Qe={class:`bg-base-100/90 pointer-events-auto max-w-md rounded-xl p-4 text-sm shadow-xl backdrop-blur-md`},$e={class:`font-semibold`},et={class:`text-base-content/70 mt-1.5 leading-5`},tt={key:0,class:`text-warning mt-1.5 text-xs`},nt={class:`mt-3 flex items-center gap-2`},rt={class:`link text-xs`,href:`https://db-ip.com/db/lite.php`,target:`_blank`,rel:`noopener noreferrer`},it={key:3,class:`pointer-events-none absolute inset-0 flex items-center justify-center p-4`},at={class:`bg-base-100/90 pointer-events-auto w-80 max-w-full rounded-xl p-4 text-sm shadow-xl backdrop-blur-md`},ot={class:`flex items-center justify-between gap-3`},st={class:`font-semibold`},ct={class:`text-base-content/60 text-xs`},lt=[`value`],ut={key:4,class:`pointer-events-none absolute inset-0 flex items-center justify-center p-4`},dt={class:`bg-base-100/90 pointer-events-auto max-w-sm rounded-xl p-4 text-center text-sm shadow-xl backdrop-blur-md`},ft={class:`text-error`},pt={key:5,class:`pointer-events-none absolute inset-0 flex items-center justify-center p-4`},mt={class:Line truncated
Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

@@ -1 +0,0 @@
import{$ as e,C as t,N as n,_ as r,lt as i,tt as a,u as o,v as s,y as c}from"./index-DC9m9n9t.js";var l=`zashboard-geoip`,u=2,d=`manifests`,f=`chunks`,p=256*1024,m=8,h=8,g,_=class extends Error{code;constructor(e,t){super(`GeoIP chunk store ${e} error`,t),this.code=e}},v=()=>{if(g)return g;let e=new Promise((t,n)=>{let r=indexedDB.open(l,u),i=!1;r.onupgradeneeded=()=>{r.result.objectStoreNames.contains(`mmdb`)&&r.result.deleteObjectStore(`mmdb`),r.result.objectStoreNames.contains(d)||r.result.createObjectStore(d),r.result.objectStoreNames.contains(f)||r.result.createObjectStore(f)},r.onsuccess=()=>{let n=r.result;if(i){n.close();return}i=!0;let a=()=>{g===e&&(g=void 0)};n.onversionchange=()=>{n.close(),a()},n.onclose=a,t(n)},r.onerror=()=>{i||(i=!0,g===e&&(g=void 0),n(r.error))},r.onblocked=()=>{i||(i=!0,g===e&&(g=void 0),n(new _(`storage`)))}});return g=e,e},y=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return Number.isSafeInteger(t.chunkCount)&&t.chunkCount>0&&t.chunkSize===262144&&typeof t.generation==`string`&&t.generation.length>0&&Number.isSafeInteger(t.size)&&t.size>0&&Math.ceil(t.size/t.chunkSize)===t.chunkCount&&Number.isFinite(t.updatedAt)},b=new Set,x=new Set,S=async e=>{let t=await v(),n=await new Promise((n,r)=>{let i=t.transaction(d,`readonly`).objectStore(d).get(e);i.onsuccess=()=>n(y(i.result)?i.result:void 0),i.onerror=()=>r(i.error)});return n&&!x.has(e)&&(x.add(e),E(e,n.generation,n.previousGeneration).catch(()=>x.delete(e))),n},C=async(e,t,n,r)=>{let i=await v();return new Promise((a,o)=>{let s=i.transaction(f,`readwrite`),c=s.objectStore(f);r.forEach((r,i)=>{c.put(r.buffer,[e,t,n+i])}),s.oncomplete=()=>a(),s.onerror=()=>o(s.error),s.onabort=()=>o(s.error)})},w=async(e,t,n)=>{let r=await v();return new Promise((i,a)=>{let o=r.transaction(f,`readonly`).objectStore(f).get([e,t,n]);o.onsuccess=()=>{let e=o.result;if(!(e instanceof ArrayBuffer)){a(Error(`Missing GeoIP database chunk ${n}`));return}i(new Uint8Array(e))},o.onerror=()=>a(o.error)})},T=async(e,t)=>{let n=await v();return new Promise((r,i)=>{let a=n.transaction(f,`readwrite`),o=IDBKeyRange.bound([e,t,0],[e,t,2**53-1]);a.objectStore(f).delete(o),a.oncomplete=()=>r(),a.onerror=()=>i(a.error),a.onabort=()=>i(a.error)})},E=async(e,t,n)=>{let r=await v();return new Promise((i,a)=>{let o=r.transaction(f,`readwrite`),s=o.objectStore(f).openKeyCursor(IDBKeyRange.bound([e,``],[e,`￿`]));s.onsuccess=()=>{let e=s.result;if(!e)return;let r=e.primaryKey;r[1]!==t&&r[1]!==n&&!b.has(r[1])&&e.delete(),e.continue()},o.oncomplete=()=>i(),o.onerror=()=>a(o.error),o.onabort=()=>a(o.error)})},D=class{key;manifest;memoryChunkCacheMax;size;chunks=new Map;constructor(e,t,n){this.key=e,this.manifest=t,this.memoryChunkCacheMax=n,this.size=t.size}async read(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<0||t<0)throw Error(`Invalid GeoIP database byte range`);if(e+t>this.size)throw Error(`GeoIP database byte range is out of bounds`);if(t===0)return new Uint8Array;let n=Math.floor(e/this.manifest.chunkSize),r=Math.floor((e+t-1)/this.manifest.chunkSize);if(n===r){let r=await this.loadChunk(n),i=e-n*this.manifest.chunkSize;return r.subarray(i,i+t)}let i=new Uint8Array(t),a=0;for(let o=n;o<=r;o++){let n=await this.loadChunk(o),r=o*this.manifest.chunkSize,s=Math.max(e,r)-r,c=Math.min(e+t,r+n.length)-r;i.set(n.subarray(s,c),a),a+=c-s}if(a!==t)throw Error(`Incomplete GeoIP database byte range`);return i}loadChunk(e){if(e<0||e>=this.manifest.chunkCount)return Promise.reject(Error(`Invalid GeoIP database chunk ${e}`));let t=this.chunks.get(e);if(t)return this.chunks.delete(e),this.chunks.set(e,t),t;let n=w(this.key,this.manifest.generation,e).catch(t=>{throw this.chunks.delete(e),t});for(this.chunks.set(e,n);this.chunks.size>this.memoryChunkCacheMax;){let e=this.chunks.keys().next().value;if(e===void 0)break;this.chunks.delete(e)}return n}},O={getManifest:S,createSource(e,t,n=h){return new D(e,t,n)},async stageStream(e,t,n={}){let r=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;b.add(r);let i=t.getReader(),a=new Uint8Array(p),o=0,s=0,c=0,l=[],u=0,d=async()=>{if(l.length!==0){try{await C(e,r,u,l)}catch(e){throw new _(`storage`,{cause:e})}l=[]}},f=async e=>{l.length===0&&(u=s),l.push(e),s++,l.length>=m&&await d()};try{for(;;){let e;try{e=await i.read()}catch(e){throw new _(`stream`,{cause:e})}if(e.done)break;c+=e.value.byteLength;let t=0;for(;t<e.value.byteLength;){let n=Math.min(a.byteLength-o,e.value.byteLength-t);a.set(e.value.subarray(t,t+n),o),o+=n,t+=n,o===a.byteLength&&(await f(a),a=new Uint8Array(p),o=0)}}if(o>0&&await f(a.slice(0,o)),await d(),c===0||s===0)throw new _(`stream`);return{chunkCount:s,chunkSize:p,generation:r,size:c,updatedAt:n.updatedAt??Date.now()}}catch(t){throw await i.cancel().catch(()=>{}),await T(e,r).catch(()=>{}),b.delete(r),t}},async activate(e,t,n={}){let r=await v(),i;try{await new Promise((a,o)=>{let s=r.transaction(d,`readwrite`),c=s.objectStore(d),l=c.get(e);l.onsuccessLine truncated
Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

@@ -1,538 +0,0 @@
import{t as e}from"./palette-DPyxzM37.js";var t={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},n={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},r=1e3,i=1001,a=1002,o=1003,s=1004,c=1005,l=1006,u=1007,d=1008,f=1008,p=1009,m=1010,h=1011,g=1012,_=1013,v=1014,y=1015,b=1016,x=1017,S=1018,C=1020,ee=35902,te=35899,w=1021,ne=1022,re=1023,ie=1026,ae=1027,oe=1028,se=1029,ce=1030,le=1031,ue=1032,de=1033,fe=33776,pe=33777,me=33778,he=33779,ge=35840,_e=35841,ve=35842,ye=35843,be=36196,xe=37492,Se=37496,Ce=37488,we=37489,Te=37490,Ee=37491,De=37808,Oe=37809,ke=37810,Ae=37811,je=37812,Me=37813,Ne=37814,Pe=37815,Fe=37816,Ie=37817,Le=37818,Re=37819,ze=37820,Be=37821,Ve=36492,He=36494,Ue=36495,We=36283,Ge=36284,Ke=36285,qe=36286,Je=2300,Ye=2301,Xe=2302,Ze=2303,Qe=2400,$e=2401,et=2402,tt=`srgb`,nt=`srgb-linear`,rt=`linear`,it=`srgb`,at=7680,ot=7681,st=7682,ct=7683,lt=34055,ut=34056,dt=5386,ft=35044,pt=35048,mt=2e3,ht=2001,gt={COMPUTE:`compute`,RENDER:`render`},_t={TEXTURE_COMPARE:`depthTextureCompare`};function vt(e){for(let t=e.length-1;t>=0;--t)if(e[t]>=65535)return!0;return!1}function yt(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function bt(e){return document.createElementNS(`http://www.w3.org/1999/xhtml`,e)}function xt(){let e=bt(`canvas`);return e.style.display=`block`,e}var St={};function Ct(...e){let t=`THREE.`+e.shift();console.log(t,...e)}function wt(e){let t=e[0];if(typeof t==`string`&&t.startsWith(`TSL:`)){let t=e[1];t&&t.isStackTrace?e[0]+=` `+t.getLocation():e[1]=`Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.`}return e}function T(...e){e=wt(e);let t=`THREE.`+e.shift();{let n=e[0];n&&n.isStackTrace?console.warn(n.getError(t)):console.warn(t,...e)}}function E(...e){e=wt(e);let t=`THREE.`+e.shift();{let n=e[0];n&&n.isStackTrace?console.error(n.getError(t)):console.error(t,...e)}}function Tt(...e){let t=e.join(` `);t in St||(St[t]=!0,T(...e))}function Et(){return typeof self<`u`&&self.scheduler!==void 0&&self.scheduler.yield!==void 0?self.scheduler.yield():new Promise(e=>{requestAnimationFrame(e)})}var Dt={0:1,2:6,4:7,3:5,1:0,6:2,7:4,5:3},Ot=class{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){let n=this._listeners;return n!==void 0&&n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){let n=this._listeners;if(n===void 0)return;let r=n[e];if(r!==void 0){let e=r.indexOf(t);e!==-1&&r.splice(e,1)}}dispatchEvent(e){let t=this._listeners;if(t===void 0)return;let n=t[e.type];if(n!==void 0){e.target=this;let t=n.slice(0);for(let n=0,r=t.length;n<r;n++)t[n].call(this,e);e.target=null}}},kt=`00.01.02.03.04.05.06.07.08.09.0a.0b.0c.0d.0e.0f.10.11.12.13.14.15.16.17.18.19.1a.1b.1c.1d.1e.1f.20.21.22.23.24.25.26.27.28.29.2a.2b.2c.2d.2e.2f.30.31.32.33.34.35.36.37.38.39.3a.3b.3c.3d.3e.3f.40.41.42.43.44.45.46.47.48.49.4a.4b.4c.4d.4e.4f.50.51.52.53.54.55.56.57.58.59.5a.5b.5c.5d.5e.5f.60.61.62.63.64.65.66.67.68.69.6a.6b.6c.6d.6e.6f.70.71.72.73.74.75.76.77.78.79.7a.7b.7c.7d.7e.7f.80.81.82.83.84.85.86.87.88.89.8a.8b.8c.8d.8e.8f.90.91.92.93.94.95.96.97.98.99.9a.9b.9c.9d.9e.9f.a0.a1.a2.a3.a4.a5.a6.a7.a8.a9.aa.ab.ac.ad.ae.af.b0.b1.b2.b3.b4.b5.b6.b7.b8.b9.ba.bb.bc.bd.be.bf.c0.c1.c2.c3.c4.c5.c6.c7.c8.c9.ca.cb.cc.cd.ce.cf.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.da.db.dc.dd.de.df.e0.e1.e2.e3.e4.e5.e6.e7.e8.e9.ea.eb.ec.ed.ee.ef.f0.f1.f2.f3.f4.f5.f6.f7.f8.f9.fa.fb.fc.fd.fe.ff`.split(`.`),At=1234567,jt=Math.PI/180,Mt=180/Math.PI;function Nt(){let e=Math.random()*4294967295|0,t=Math.random()*4294967295|0,n=Math.random()*4294967295|0,r=Math.random()*4294967295|0;return(kt[e&255]+kt[e>>8&255]+kt[e>>16&255]+kt[e>>24&255]+`-`+kt[t&255]+kt[t>>8&255]+`-`+kt[t>>16&15|64]+kt[t>>24&255]+`-`+kt[n&63|128]+kt[n>>8&255]+`-`+kt[n>>16&255]+kt[n>>24&255]+kt[r&255]+kt[r>>8&255]+kt[r>>16&255]+kt[r>>24&255]).toLowerCase()}function D(e,t,n){return Math.max(t,Math.min(n,e))}function Pt(e,t){return(e%t+t)%t}function Ft(e,t,n,r,i){return r+(e-t)*(i-r)/(n-t)}function It(e,t,n){return e===t?0:(n-e)/(t-e)}function Lt(e,t,n){return(1-n)*e+n*t}function Rt(e,t,n,r){return Lt(e,t,1-Math.exp(-n*r))}function zt(e,t=1){return t-Math.abs(Pt(e,t*2)-t)}function Bt(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*(3-2*e))}function Vt(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*e*(e*(e*6-15)+10))}function Ht(e,t){return e+Math.floor(Math.random()*(t-e+1))}function Ut(e,t){return e+Math.random()*(t-e)}function Wt(e){return e*(.5-Math.random())}function Gt(e){e!==void 0&&(At=e);let t=At+=1831565813;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}function Kt(e){return e*jt}function qt(e){return e*Mt}function Jt(e){return(e&e-1)==0&&e!==0}function Yt(e){return 2**Math.ceil(Math.log(e)/Math.LN2)}function Xt(e){return 2**Math.floor(Math.log(e)/Math.LN2)}function Zt(e,t,n,r,i){let a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((t+r)/2),u=o((t+r)/2),d=a((t-r)/2),f=o((t-r)/2),pLine truncated
`).map(e=>{let n=e.match(t);if(!n)return null;let r=n[1]||n[2]||``,i=n[3].split(`?`)[0],a=parseInt(n[4],10),o=parseInt(n[5],10);return{fn:r,file:i.split(`/`).pop(),line:a,column:o}}).filter(e=>e&&!js.some(t=>t.test(e.file)))}var Ns=class{constructor(e=null){this.isStackTrace=!0,this.stack=Ms(e||Error().stack)}getLocation(){if(this.stack.length===0)return`[Unknown location]`;let e=this.stack[0],t=e.fn;return`${t?`"${t}()" at `:``}"${e.file}:${e.line}"`}getError(e){return this.stack.length===0?e:`${e}\n${this.stack.map(e=>{let t=`${e.file}:${e.line}:${e.column}`;return e.fn?` at ${e.fn} (${t})`:` at ${t}`}).join(`
`)}`}};function Ps(e,t=0){let n=3735928559^t,r=1103547991^t;if(Array.isArray(e))for(let t=0,i;t<e.length;t++)i=e[t],n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677);else for(let t=0,i;t<e.length;t++)i=e.charCodeAt(t),n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507),r^=Math.imul(n^n>>>13,3266489909),4294967296*(2097151&r)+(n>>>0)}var Fs=e=>Ps(e),Is=e=>Ps(e),Ls=(...e)=>Ps(e),Rs=new Map([[1,`float`],[2,`vec2`],[3,`vec3`],[4,`vec4`],[9,`mat3`],[16,`mat4`]]),zs=new WeakMap;function Bs(e){return Rs.get(e)}function Vs(e){if(/[iu]?vec\d/.test(e))return e.startsWith(`ivec`)?Int32Array:e.startsWith(`uvec`)?Uint32Array:Float32Array;if(/mat\d/.test(e)||/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Hs(e){if(/float|int|uint|bool/.test(e))return 1;if(/vec2/.test(e))return 2;if(/vec3/.test(e))return 3;if(/vec4/.test(e)||/mat2/.test(e))return 4;if(/mat3/.test(e))return 9;if(/mat4/.test(e))return 16;E(`TSL: Unsupported type: ${e}`,new Ns)}function Us(e){if(/float|int|uint|bool/.test(e))return 1;if(/vec2/.test(e))return 2;if(/vec3/.test(e))return 3;if(/vec4/.test(e)||/mat2/.test(e))return 4;if(/mat3/.test(e))return 12;if(/mat4/.test(e))return 16;E(`TSL: Unsupported type: ${e}`,new Ns)}function Ws(e){if(/float|int|uint|bool/.test(e))return 1;if(/vec2/.test(e))return 2;if(/vec3/.test(e)||/vec4/.test(e))return 4;if(/mat2/.test(e))return 2;if(/mat3/.test(e)||/mat4/.test(e))return 4;E(`TSL: Unsupported type: ${e}`,new Ns)}function Gs(e){if(e==null)return null;let t=typeof e;return e.isNode===!0?`node`:t===`number`?`float`:t===`boolean`?`bool`:t===`string`?`string`:t===`function`?`shader`:e.isVector2===!0?`vec2`:e.isVector3===!0?`vec3`:e.isVector4===!0?`vec4`:e.isMatrix2===!0?`mat2`:e.isMatrix3===!0?`mat3`:e.isMatrix4===!0?`mat4`:e.isColor===!0?`color`:e instanceof ArrayBuffer?`ArrayBuffer`:null}function Ks(e,...t){let n=e?e.slice(-4):void 0;return t.length===1&&(n===`vec2`?t=[t[0],t[0]]:n===`vec3`?t=[t[0],t[0],t[0]]:n===`vec4`&&(t=[t[0],t[0],t[0],t[0]])),e===`color`?new j(...t):n===`vec2`?new O(...t):n===`vec3`?new k(...t):n===`vec4`?new xn(...t):n===`mat2`?new Ro(...t):n===`mat3`?new an(...t):n===`mat4`?new A(...t):e===`bool`?t[0]||!1:e===`float`||e===`int`||e===`uint`?t[0]||0:e===`string`?t[0]||``:e===`ArrayBuffer`?Ys(t[0]):null}function qs(e){let t=zs.get(e);return t===void 0&&(t={},zs.set(e,t)),t}function Js(e){let t=``,n=new Uint8Array(e);for(let e=0;e<n.length;e++)t+=String.fromCharCode(n[e]);return btoa(t)}function Ys(e){return Uint8Array.from(atob(e),e=>e.charCodeAt(0)).buffer}var Xs={VERTEX:`vertex`,FRAGMENT:`fragment`},M={NONE:`none`,FRAME:`frame`,RENDER:`render`,OBJECT:`object`},Zs={BOOLEAN:`bool`,INTEGER:`int`,FLOAT:`float`,VECTOR2:`vec2`,VECTOR3:`vec3`,VECTOR4:`vec4`,MATRIX2:`mat2`,MATRIX3:`mat3`,MATRIX4:`mat4`},Qs={READ_ONLY:`readOnly`,WRITE_ONLY:`writeOnly`,READ_WRITE:`readWrite`},$s=[`fragment`,`vertex`],ec=[`setup`,`analyze`,`generate`],tc=[...$s,`compute`],nc=[`x`,`y`,`z`,`w`],rc={analyze:`setup`,generate:`analyze`},ic=0,N=class e extends Ot{static get type(){return`Node`}constructor(t=null){super(),this.nodeType=t,this.updateType=M.NONE,this.updateBeforeType=M.NONE,this.updateAfterType=M.NONE,this.version=0,this.name=``,this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._uuid=null,this._cacheKeyVersion=0,this.id=ic++,this.stackTrace=null,e.captureStackTrace===!0&&(this.stackTrace=new Ns)}set needsUpdate(e){e===!0&&this.version++}get uuid(){return this._uuid===null&&(this._uuid=en.generateUUID()),this._uuid}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,M.FRAME)}onRenderUpdate(e){return this.onUpdate(e,M.RENDER)}onObjectUpdate(e){return this.onUpdate(e,M.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(let{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:`dispose`})}traverse(e){e(this);for(let t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){let t=[];e.add(this);for(let n of Object.getOwnPropertyNames(this)){let r=this[n];if(!(n.startsWith(`_`)===!0||e.has(r))){if(Array.isArray(r)===!0)for(let e=0;e<r.length;e++){let i=r[e];i&&i.isNode===!0&&t.push({property:n,index:e,childNode:i})}else if(r&&r.isNode===!0)t.push({property:n,childNode:r});else if(r&&Object.getPrototypeOf(r)===Object.prototype)for(let e in r){if(e.startsWith(`_`)===!0)continue;let i=r[e];i&&i.isNode===!0&&t.push({property:n,index:e,childNode:i})}}}return t}getCacheKey(e=!1,t=null){if(e||=this.version!==this._cacheKeyVersion,e===!0||this._cacheKey===null){t===null&&(t=new Set);let n=[];for(let{property:r,childNode:i}of this.Line truncated
`+e.tab+`}`),o!==null){e.addFlowCode(` else {
`).addFlowTab();let t=o.build(e,n);t&&(c?t=l+` = `+t+`;`:(t=`return `+t+`;`,s===null&&(T(`TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values.`,this.stackTrace),t=`// `+t))),e.removeFlowTab().addFlowCode(e.tab+` `+t+`
`+e.tab+`}
`)}else e.addFlowCode(`
`);return e.format(l,n,t)}}).setParameterLength(2,3);P(`select`,df);var ff=class extends N{static get type(){return`ContextNode`}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}generateNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){let e=[];return this.traverse(t=>{t.isContextNode===!0&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){let t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){let t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){let n=e.addContext(this.value),r=this.node.build(e,t);return e.setContext(n),r}},pf=(e=null,t={})=>{let n=e;return(n===null||n.isNode!==!0)&&(t=n||t,n=null),new ff(n,t)},mf=e=>pf(e,{uniformFlow:!0}),hf=(e,t)=>pf(e,{nodeName:t});function gf(e,t,n=null){return pf(n,{getShadow:({light:n,shadowColorNode:r})=>t===n?r.mul(e):r})}function _f(e,t=null){return pf(t,{getAO:(t,{material:n})=>n.transparent===!0?t:t===null?e:t.mul(e)})}function vf(e,t){return T(`TSL: "label()" has been deprecated. Use "setName()" instead.`),hf(e,t)}P(`context`,pf),P(`label`,vf),P(`uniformFlow`,mf),P(`setName`,hf),P(`builtinShadowContext`,(e,t,n)=>gf(t,n,e)),P(`builtinAOContext`,(e,t)=>_f(t,e));var yf=class extends N{static get type(){return`VarNode`}constructor(e,t=null,n=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=n,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return e.getDataFromNode(this).forceDeclaration!==!0&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}generateNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){let t=e[0],n=this.getShared(t);if(this!==n)return n.build(...e);if(this._hasStack(t)===!1&&t.buildStage===`setup`&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&this.node.shaderNode.getLayout()===null&&t.fnCall&&t.fnCall.shaderNode&&t.getDataFromNode(this.node.shaderNode).hasLoop){let n=t.getDataFromNode(this);n.forceDeclaration=!0,e=!0}let n=t.getBaseStack();e?n.addToStackBefore(this):n.addToStack(this)}return this.isIntent(t)&&this.isAssign(t)!==!0?this.node.build(...e):super.build(...e)}generate(e){let{node:t,name:n,readOnly:r}=this,{renderer:i}=e,a=i.backend.isWebGPUBackend===!0,o=!1,s=!1;r&&(o=e.isDeterministic(t),s=a?r:o);let c=this.getNodeType(e);if(c==`void`)return this.isIntent(e)!==!0&&E(`TSL: ".toVar()" can not be used with void type.`,this.stackTrace),t.build(e);let l=e.getVectorType(c),u=t.build(e,l),d=e.getVarFromNode(this,n,l,void 0,s),f=e.getPropertyName(d),p=f;if(s)if(a)p=o?`const ${f}`:`let ${f}`;else{let n=t.getArrayCount(e);p=`const ${e.getVar(d.type,f,n)}`}return e.addLineFlowCode(`${p} = ${u}`,this),f}_hasStack(e){return e.getDataFromNode(this).stack!==void 0}},bf=el(yf),xf=(e,t=null)=>bf(e,t).toStack(),Sf=(e,t=null)=>bf(e,t,!0).toStack(),Cf=e=>bf(e).setIntent(!0).toStack();P(`toVar`,xf),P(`toConst`,Sf),P(`toVarIntent`,Cf);var wf=class extends N{static get type(){return`SubBuild`}constructor(e,t,n=null){super(n),this.node=e,this.name=t,this.isSubBuildNode=!0}generateNodeType(e){if(this.nodeType!==null)return this.nodeType;e.addSubBuild(this.name);let t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);let n=this.node.build(e,...t);return e.removeSubBuild(),n}},Tf=(e,t,n=null)=>new wf(F(e),t,n),Ef=el(class extends N{static get type(){return`VaryingNode`}constructor(e,t=null){super(),this.node=Tf(e,`VERTEX`),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}generateNodeType(e){return this.node.getNodeType(e)}setupVarying(e){let t=e.getNodeProperties(this),n=t.varying;if(n===void 0){let r=this.name,i=this.getNodeType(e),a=this.interpolationType,o=this.interpolationSampling;t.varying=n=e.getVaryingFromNode(this,r,i,a,o),t.node=Tf(this.node,`VERTEX`)}return n.needsInterpolation||=e.shaderStage===`fragment`,n}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Xs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Xs.VERTEX,this.node)}generate(e){let t=e.getSubBuildProperty(`property`,e.currentStack),n=e.getNodeProperties(this),r=this.setupVarying(e);if(n[t]===void 0){let i=this.getNodeType(e),a=e.getPropertyName(r,Xs.VERTEX);if(e.shaderStage===Xs.VERTEX){let t=n.node.build(e,i);e.addLineFlowCode(`${a} = ${t}`,this)}else e.flowNodeFromShaderStage(Xs.VERTEX,n.node,i,a);n[t]=a}return e.getPropertyName(r)}}).setParameterLength(1,2),Df=e=>Ef(e);P(`toVarying`,Ef),P(`toVertexStage`,Df);var Of=R(([e Line truncated
`,i+=e.flow.code.replace(/^\t/gm,``)+`
`,i+=`/* ... */ `+n+` /* ... */
`,i+=`// #`+r+`#
`,Ct(i)}return n}},Cp=(e,t=null)=>new Sp(F(e),t).toStack();P(`debug`,Cp);var wp=class extends Ot{constructor(){super(),this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}},Tp=class extends N{static get type(){return`InspectorNode`}constructor(e,t=``,n=null){super(),this.node=e,this.name=t,this.callback=n,this.updateType=M.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}generateNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return e.context.inspector===!0&&this.callback!==null&&(t=this.callback(t)),e.renderer.backend.isWebGPUBackend!==!0&&e.renderer.inspector.constructor!==wp&&Tt(`TSL: ".toInspector()" is only available with WebGPU.`),t}};function Ep(e,t=``,n=null){return e=F(e),e.before(new Tp(e,t,n))}P(`toInspector`,Ep);function Dp(e){T(`TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add`,e)}var Op=class extends N{static get type(){return`AttributeNode`}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}generateNodeType(e){let t=this.nodeType;if(t===null){let n=this.getAttributeName(e);if(e.hasGeometryAttribute(n)){let r=e.geometry.getAttribute(n);t=e.getTypeFromAttribute(r)}else t=`float`}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){let t=this.getAttributeName(e),n=this.getNodeType(e);if(e.hasGeometryAttribute(t)===!0){let r=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(r),a=e.getAttribute(t,i);return e.shaderStage===`vertex`?e.format(a.name,i,n):Ef(this).build(e,n)}else return T(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(n)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}},kp=(e,t=null)=>new Op(e,t),Ap=(e=0)=>kp(`uv`+(e>0?e:``),`vec2`),jp=el(class extends N{static get type(){return`TextureSizeNode`}constructor(e,t=null){super(`uvec2`),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){let n=this.textureNode.build(e,`property`),r=this.levelNode===null?`0`:this.levelNode.build(e,`int`);return e.format(`${e.getMethod(`textureDimensions`)}( ${n}, ${r} )`,this.getNodeType(e),t)}}).setParameterLength(1,2),Mp=el(class extends du{static get type(){return`MaxMipLevelNode`}constructor(e){super(0),this._textureNode=e,this.updateType=M.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){let e=this.texture,t=e.images,n=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(n&&n.width!==void 0){let{width:e,height:t}=n;this.value=Math.log2(Math.max(e,t))}}}).setParameterLength(1),Np=class extends Error{constructor(e,t=null){super(e),this.name=`NodeError`,this.stackTrace=t}},Pp=new bn,Fp=class extends du{static get type(){return`TextureNode`}constructor(e=Pp,t=null,n=null,r=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=n,this.biasNode=r,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.gatherNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=M.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(t===null)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}generateNodeType(){return this.value.isDepthTexture===!0?this.gatherNode===null?`float`:`vec4`:this.value.type===1014?`uvec4`:this.value.type===1013?`ivec4`:`vec4`}getInputType(){return`texture`}getDefaultUV(){return Ap(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return this._matrixUniform===null&&(this._matrixUniform=q(this.value.matrix)),this._matrixUniform.mul(W(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(this._flipYUniform===null&&(this._flipYUniform=q(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(V(jp(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){let t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;let n=this.value;if(!n||n.isTexture!==!0)throw new Np("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().",this.stackTrace);let r=R(()=>{let t=this.uvNode;return(t===null||e.context.forceUVContext===!0)&&e.context.getUV&&(t=e.context.getUV(this,e)),t||=this.getDefaultUV(),this.updateMatrix===!0&&(t=this.getTransformedUV(t)),t=this.se Line truncated
`:``)+e.tab+f+` {
`).addFlowTab()}let i=r.build(e,`void`);t.returnsNode.build(e,`void`),e.removeFlowTab().addFlowCode(`
`+e.tab+i);for(let t=0,n=this.params.length-1;t<n;t++)e.addFlowCode((t===0?``:e.tab)+`}
`).removeFlowTab();e.addFlowTab()}},B_=(...e)=>new z_($c(e,`int`)).toStack(),V_=()=>hp(`continue`).toStack(),H_=()=>hp(`break`).toStack(),U_=new WeakMap,W_=new xn,G_=new WeakMap,K_=R(({bufferMap:e,influence:t,stride:n,width:r,depth:i,offset:a})=>{let o=V($f).mul(n).add(a),s=o.div(r);return zp(e,ul(o.sub(s.mul(r)),s)).depth(i).xyz.mul(t)});function q_(e){let t=e.morphAttributes.position!==void 0,n=e.morphAttributes.normal!==void 0,r=e.morphAttributes.color!==void 0,i=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=i===void 0?0:i.length,o=U_.get(e);if(o===void 0||o.count!==a){o!==void 0&&o.texture.dispose();let i=e.morphAttributes.position||[],s=e.morphAttributes.normal||[],c=e.morphAttributes.color||[],l=0;t===!0&&(l=1),n===!0&&(l=2),r===!0&&(l=3);let u=e.attributes.position.count*l,d=1,f=4096;u>f&&(d=Math.ceil(u/f),u=f);let p=new Float32Array(u*d*4*a),m=new Cn(p,u,d,a);m.type=y,m.needsUpdate=!0;let h=l*4;for(let e=0;e<a;e++){let a=i[e],o=s[e],l=c[e],f=u*d*4*e;for(let e=0;e<a.count;e++){let i=e*h;t===!0&&(W_.fromBufferAttribute(a,e),p[f+i+0]=W_.x,p[f+i+1]=W_.y,p[f+i+2]=W_.z,p[f+i+3]=0),n===!0&&(W_.fromBufferAttribute(o,e),p[f+i+4]=W_.x,p[f+i+5]=W_.y,p[f+i+6]=W_.z,p[f+i+7]=0),r===!0&&(W_.fromBufferAttribute(l,e),p[f+i+8]=W_.x,p[f+i+9]=W_.y,p[f+i+10]=W_.z,p[f+i+11]=l.itemSize===4?W_.w:1)}}o={count:a,texture:m,stride:l,size:new O(u,d)},U_.set(e,o);function g(){m.dispose(),U_.delete(e),e.removeEventListener(`dispose`,g)}e.addEventListener(`dispose`,g)}return o}var J_=R(([e])=>{let{geometry:t}=e,n=t.morphAttributes.position!==void 0,r=t.hasAttribute(`normal`)&&t.morphAttributes.normal!==void 0,i=t.morphAttributes.position||t.morphAttributes.normal||t.morphAttributes.color,a=i===void 0?0:i.length;if(a===0)return;let o=G_.get(e);(o===void 0||o.count!==a)&&(o={base:q(1),influences:e.morphTargetInfluences?qp(e.morphTargetInfluences,`float`):null,count:a},G_.set(e,o));let{base:s,influences:c}=o,{texture:l,stride:u,size:d}=q_(t);n===!0&&eh.mulAssign(s),r===!0&&dh.mulAssign(s);let f=V(d.width);B_(a,({i:t})=>{let i=B(0).toVar();e.count>1&&e.morphTexture!==null&&e.morphTexture!==void 0?i.assign(zp(e.morphTexture,ul(V(t).add(1),V(ep))).r):i.assign(c.element(t).toVar()),z(i.notEqual(0),()=>{n===!0&&eh.addAssign(K_({bufferMap:l,influence:i,stride:u,width:f,depth:t,offset:V(0)})),r===!0&&dh.addAssign(K_({bufferMap:l,influence:i,stride:u,width:f,depth:t,offset:V(1)}))})}),d_(({object:e})=>{let{base:t,influences:n}=o;e.geometry.morphTargetsRelative?t.value=1:t.value=1-e.morphTargetInfluences.reduce((e,t)=>e+t,0),n&&(n.array=e.morphTargetInfluences,n.update())})},`void`),Y_=class extends N{static get type(){return`LightingNode`}constructor(){super(`vec3`),this.isLightingNode=!0}},X_=class extends Y_{static get type(){return`AONode`}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}},Z_=el(class extends ff{static get type(){return`LightingContextNode`}constructor(e,t=null,n=[],r=null,i=null){super(e),this.lightingModel=t,this.materialLightings=n,this.backdropNode=r,this.backdropAlphaNode=i,this._value=null}getContext(){let{materialLightings:e,backdropNode:t,backdropAlphaNode:n}=this,r={directDiffuse:W().toVar(`directDiffuse`),directSpecular:W().toVar(`directSpecular`),indirectDiffuse:W().toVar(`indirectDiffuse`),indirectSpecular:W().toVar(`indirectSpecular`)};return{radiance:W().toVar(`radiance`),irradiance:W().toVar(`irradiance`),iblIrradiance:W().toVar(`iblIrradiance`),ambientOcclusion:B(1).toVar(`ambientOcclusion`),reflectedLight:r,materialLightings:e,backdrop:t,backdropAlpha:n}}setup(e){return this.value=this._value||=this.getContext(),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}),Q_=class extends Y_{static get type(){return`IrradianceNode`}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}},$_=new O,ev=class extends Fp{static get type(){return`ViewportTextureNode`}constructor(e=$p,t=null,n=null){let r=null;n===null?(r=new na,r.minFilter=d,n=r):r=n,super(n,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=r,this.isOutputTextureNode=!0,this.updateBeforeType=M.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,n;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,n=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,n=this._cacheTextures),e===null)return t;if(n.has(e)===!1){let r=t.clone();n.set(e,r)}return n.get(e)}updateReference(e){let t=e.renderer,n=t.getRenderTarget(),r=t.getCanvasTarget(),i=n||r;return this.value=this.getTextureForReference(i),this.value}updateBefore(e){let t=e.renderer,n=t.getRenderTarget(),r=t.getCanvasTarget(),i=n||r;i===null?t.getDrawingBufferSize($_):i.getDrawingBufferSize?i.getDrawingBufferSize($_):$_.set(i.width,i.height);let a=this.getTextureForReference(i);(a.image.width!==$_.width||a.image.height!==$_.height)&&(a.image.width=$_.width,a.image.height=$_.height,a.needsUpdate=!0);let o=a.gener Line truncated
`,t===`property`?o:e.format(`${o}()`,i,t)}},vT=(e,t=[],n=``)=>{let r=new _T(e,t,n);return tl((...e)=>r.call(...e),r)},yT=(e,t)=>vT(e,t,`glsl`),bT=(e,t)=>vT(e,t,`wgsl`);function xT(e){let t,n=e.context.getViewZ;return n!==void 0&&(t=n(this)),(t||ih.z).negate()}var ST=R(([e,t],n)=>nf(e,t,xT(n))),CT=R(([e],t)=>{let n=xT(t);return e.mul(e,n,n).negate().exp().oneMinus()}),wT=R(([e,t],n)=>{let r=xT(n),i=t.sub(nh.y).max(0).toConst().mul(r).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),TT=R(([e,t])=>G(t.toFloat().mix(Yl.rgb,e.toVec3()),Yl.a)),ET=null,DT=null,OT=el(class extends N{static get type(){return`RangeNode`}constructor(e=B(),t=B()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){let t=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),r=e.getTypeLength(Gs(t.value)),i=e.getTypeLength(Gs(n.value));return r>i?r:i}generateNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):`float`}getConstNode(e){let t=null;if(e.traverse(e=>{e.isConstNode===!0&&(t=e)}),t===null)throw new Np(`THREE.TSL: No "ConstNode" found in node graph.`,this.stackTrace);return t}setup(e){let t=e.object,n=null;if(t.count>1){let r=this.getConstNode(this.minNode),i=this.getConstNode(this.maxNode),a=r.value,o=i.value,s=e.getTypeLength(Gs(a)),c=e.getTypeLength(Gs(o));ET||=new xn,DT||=new xn,ET.setScalar(0),DT.setScalar(0),s===1?ET.setScalar(a):a.isColor?ET.set(a.r,a.g,a.b,1):ET.set(a.x,a.y,a.z||0,a.w||0),c===1?DT.setScalar(o):o.isColor?DT.set(o.r,o.g,o.b,1):DT.set(o.x,o.y,o.z||0,o.w||0);let l=4*t.count,u=new Float32Array(l);for(let e=0;e<l;e++){let t=e%4,n=ET.getComponent(t),r=DT.getComponent(t);u[e]=en.lerp(n,r,Math.random())}let d=this.getNodeType(e);if(t.count*4*4<=e.getUniformBufferLimit())n=Wp(u,`vec4`,t.count).element(ep).convert(d);else{let t=new Fi(u,4);e.geometry.setAttribute(`__range`+this.id,t),n=Xf(t).convert(d)}}else n=B(0);return n}}).setParameterLength(2),kT=class extends N{static get type(){return`ComputeBuiltinNode`}constructor(e,t){super(t),this._builtinName=e}getHash(e){return this.getBuiltinName(e)}generateNodeType(){return this.nodeType}setBuiltinName(e){return this._builtinName=e,this}getBuiltinName(){return this._builtinName}hasBuiltin(e){return e.hasBuiltin(this._builtinName)}generate(e,t){let n=this.getBuiltinName(e),r=this.getNodeType(e);return e.shaderStage===`compute`?e.format(n,r,t):(T(`ComputeBuiltinNode: Compute built-in value ${n} can not be accessed in the ${e.shaderStage} stage`),e.generateConst(r))}serialize(e){super.serialize(e),e.global=this.global,e._builtinName=this._builtinName}deserialize(e){super.deserialize(e),this.global=e.global,this._builtinName=e._builtinName}},AT=(e,t)=>new kT(e,t),jT=AT(`numWorkgroups`,`uvec3`),MT=AT(`workgroupId`,`uvec3`),NT=AT(`globalId`,`uvec3`),PT=AT(`localId`,`uvec3`),FT=AT(`subgroupSize`,`uint`),IT=el(class extends N{constructor(e){super(),this.scope=e,this.isBarrierNode=!0}setup(e){e.allowEarlyReturns=!1,e.allowGlobalVariables=!1}generate(e){let{scope:t}=this,{renderer:n}=e;n.backend.isWebGLBackend===!0?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}}),LT=()=>IT(`workgroup`).toStack(),RT=()=>IT(`storage`).toStack(),zT=()=>IT(`texture`).toStack(),BT=class extends ac{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let n,r=e.isContextAssign();if(n=super.generate(e),r!==!0){let r=this.getNodeType(e);n=e.format(n,r,t)}return n}},VT=class extends N{constructor(e,t,n=0){super(t),this.bufferType=t,this.bufferCount=n,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=``}setName(e){return this.name=e,this}label(e){return T(`TSL: "label()" has been deprecated. Use "setName()" instead.`,new Ns),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new BT(this,e)}generate(e){let t=this.name===``?`${this.scope}Array_${this.id}`:this.name;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}},HT=(e,t)=>new VT(`Workgroup`,e,t),UT=class extends N{static get type(){return`AtomicFunctionNode`}constructor(e,t,n){super(`uint`),this.method=e,this.pointerNode=t,this.valueNode=n,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}generateNodeType(e){return this.getInputType(e)}generate(e){let t=e.getNodeProperties(this),n=t.parents,r=this.method,i=this.getNodeType(e),a=this.getInputType(e),o=this.pointerNode,s=this.valueNode,c=[];c.push(`&${o.build(e,a)}`),s!==null&&c.push(s.build(e,a));let l=`${e.getMethod(r,i)}( ${c.join(`, `)} )`;if(n&&n.length===1&&n[0].isStackNode===!0)e.addLineFlowCode(l,this);else return t.constNode===void 0&&(t.constNode=hp(l,i).toConst()),t.constNode.build(e)}};UT.ATOMIC_LOAD=`atomicLoad`,UT.ATOMIC_STORE=`atomicStore`,UT.ATOMIC_ADD=`atomicAdd`,UT.ATOMIC_SUB=`atomicSub`,UT.ATOMIC_MAX=`atomicMax`,UT.ATOMIC_MIN=`atomicMin`,UT.ATOMIC_AND=`atomicAnd`,UT.ATOMIC_OR=`atomicOr`,UT.ATOMIC_XOR=` Line truncated
`),this.flow.code+=e,this)}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+=` `,this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){let t=e.getNodeType(this),n=this.flowChildNode(e,t);return this.flowsData.set(e,n),n}addInclude(e){this.currentFunctionNode!==null&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){let t=this.renderer.backend,n=Hk.get(t);n===void 0&&(n=new WeakMap,Hk.set(t,n));let r=n.get(e);if(r===void 0){r=new _T;let t=this.currentFunctionNode;this.currentFunctionNode=r,r.code=this.buildFunctionCode(e),this.currentFunctionNode=t,n.set(e,r)}return r}flowShaderNode(e){let t=e.layout,n={[Symbol.iterator](){let e=0,t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(let e of t.inputs)n[e.name]=new OS(e.type,e.name);e.layout=null;let r=e.call(n),i=this.flowStagesNode(r,t.type);return e.layout=t,i}flowBuildStage(e,t,n=null){let r=this.getBuildStage();this.setBuildStage(t);let i=e.build(this,n);return this.setBuildStage(r),i}flowStagesNode(e,t=null){let n=this.flow,r=this.vars,i=this.declarations,a=this.cache,o=this.buildStage,s=this.stack,c={code:``};this.flow=c,this.vars={},this.declarations={},this.cache=new xk,this.stack=AS();for(let n of ec)this.setBuildStage(n),c.result=e.build(this,t);return c.vars=this.getVars(this.shaderStage),this.flow=n,this.vars=r,this.declarations=i,this.cache=a,this.stack=s,this.setBuildStage(o),c}getFunctionOperator(){return null}buildFunctionCode(){T(`Abstract function.`)}flowChildNode(e,t=null){let n=this.flow,r={code:``};return this.flow=r,r.result=e.build(this,t),this.flow=n,r}flowNodeFromShaderStage(e,t,n=null,r=null){let i=this.tab,a=this.cache,o=this.shaderStage,s=this.context;this.setShaderStage(e);let c={...this.context};delete c.nodeBlock,this.cache=this.globalCache,this.tab=` `,this.context=c;let l=null;if(this.buildStage===`generate`){let i=this.flowChildNode(t,n);r!==null&&(i.code+=`${this.tab+r} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(o),this.cache=a,this.tab=i,this.context=s,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){T(`Abstract function.`)}getVaryings(){T(`Abstract function.`)}getVar(e,t,n=null){return`${n===null?this.getType(e):this.generateArrayDeclaration(e,n)} ${t}`}getVars(e,t=!1){let n=[],r=this.vars[e];if(r!==void 0)for(let e of r)n.push(`${this.getVar(e.type,e.name,e.count)};`);return n.join(t?`
`:`
`)}getUniforms(){T(`Abstract function.`)}getCodes(e){let t=this.codes[e],n=``;if(t!==void 0)for(let e of t)n+=e.code+`
`;return n}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){T(`Abstract function.`)}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,`any`).subBuilds:e instanceof Set?[...e]:e,!t)return null;let n=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){let r=t[e];if(n.includes(r))return r}return null}getSubBuildOutput(e){return this.getSubBuildProperty(`outputNode`,e)}getSubBuildProperty(e=``,t=null){let n;n=t===null?this.subBuildFn:this.getClosestSubBuild(t);let r;return r=n?e?n+`_`+e:n:e,r}prebuild(){let{object:e,renderer:t,material:n}=this;if(t.contextNode.isContextNode===!0?this.context={...this.context,...t.contextNode.getFlowContextData()}:E('NodeBuilder: "renderer.contextNode" must be an instance of `context()`.'),n&&n.contextNode&&(n.contextNode.isContextNode===!0?this.context={...this.context,...n.contextNode.getFlowContextData()}:E('NodeBuilder: "material.contextNode" must be an instance of `context()`.')),n!==null){let e=t.library.fromMaterial(n);e===null&&(E(`NodeBuilder: Material "${n.type}" is not compatible.`),e=new Av),e.build(this)}else this.addFlow(`compute`,e)}build(){this.prebuild();for(let e of ec){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage(`vertex`,this.context.position);for(let t of tc){this.setShaderStage(t);let n=this.flowNodes[t];for(let t of n)e===`generate`?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}async buildAsync(){this.prebuild();for(let e of ec){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage(`vertex`,this.context.position);for(let t of tc){this.setShaderStage(t);let n=this.flowNodes[t];for(let t of n)e===`generate`?this.flowNode(t):t.build(this);await Et()}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=Uk.get(e);return t===void 0&&(t={}),t}getNodeUniform(e,t){let n=this.getSharedDataFromNode(e),r=n.cache;if(r===void 0){if(t===`float`||t===`int`||t===`uint`)r=new Mk(e);else if(t===`vec2`||t===`ivec2`||t===`uvec2`)r=new Nk(e);else if(t===`vec3`||t===`ivec3`||t===`uvec3`)r=new Pk(e);else if(t===`vec4`||t===`ivec4`||t===`uvec4`)r=new Fk(e);else if(t===`color`)r=new Ik(e);else if(t===`mat2`)r=new Lk(e);else if(t===`mat3`)r=new Rk(e);else if(t===`mat4`)r=new zk(e);else throw Error(`THREE.NodeBuilder: Uniform "${t}" not implemented.`);n.cache=r}return r}format(e,t,n){if(t=this.getVectorType(t),n=this.getVectorType(n),t===n||n===null||this.isReference(n))return e;let r=this.getTypeLength(t),i=this.getTypeLength(n);return r===16&&i===9?`${this.getType(n)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:r===9&&i===4?`${this.getType(n)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:r>4||i>4||i===0?e:r===i?`${this.getType(n)}( ${e} )`:r>i?(e=n===`bool`?`all( ${e} )`:`${e}.${`xyz`.slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),n)):i===4&&r>1?`${this.getType(n)}( ${this.format(e,t,`vec3`)}, 1.0 )`:r===2?`${this.getType(n)}( ${this.format(e,t,`vec2`)}, 0.0 )`:(r===1&&i>1&&t!==this.getComponentType(n)&&(e=`${this.getType(this.getComponentType(n))}( ${e} )`),`${this.getType(n)}( ${e} )`)}getSignature(){return`// Three.js r185 - Node System
`}needsPreviousData(){let e=this.renderer.getMRT();return e&&e.has(`velocity`)||qs(this.object).useVelocity===!0}},Jk=class{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let n=e.get(t);return n===void 0&&(n={renderId:0,frameId:0},e.set(t,n)),n}updateBeforeNode(e){let t=e.getUpdateBeforeType(),n=e.updateReference(this);if(t===M.FRAME){let t=this._getMaps(this.updateBeforeMap,n);if(t.frameId!==this.frameId){let n=t.frameId;t.frameId=this.frameId,e.updateBefore(this)===!1&&(t.frameId=n)}}else if(t===M.RENDER){let t=this._getMaps(this.updateBeforeMap,n);if(t.renderId!==this.renderId){let n=t.renderId;t.renderId=this.renderId,e.updateBefore(this)===!1&&(t.renderId=n)}}else t===M.OBJECT&&e.updateBefore(this)}updateAfterNode(e){let t=e.getUpdateAfterType(),n=e.updateReference(this);if(t===M.FRAME){let t=this._getMaps(this.updateAfterMap,n);t.frameId!==this.frameId&&e.updateAfter(this)!==!1&&(t.frameId=this.frameId)}else if(t===M.RENDER){let t=this._getMaps(this.updateAfterMap,n);t.renderId!==this.renderId&&e.updateAfter(this)!==!1&&(t.renderId=this.renderId)}else t===M.OBJECT&&e.updateAfter(this)}updateNode(e){let t=e.getUpdateType(),n=e.updateReference(this);if(t===M.FRAME){let t=this._getMaps(this.updateMap,n);t.frameId!==this.frameId&&e.update(this)!==!1&&(t.frameId=this.frameId)}else if(t===M.RENDER){let t=this._getMaps(this.updateMap,n);t.renderId!==this.renderId&&e.update(this)!==!1&&(t.renderId=this.renderId)}else t===M.OBJECT&&e.update(this)}update(){this.frameId++,this.lastTime===void 0&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}},Yk=class{constructor(e,t,n=null,r=``,i=!1){this.type=e,this.name=t,this.count=n,this.qualifier=r,this.isConst=i}};Yk.isNodeFunctionInput=!0;var Xk=class extends kD{static get type(){return`AmbientLightNode`}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}},Zk=class extends kD{static get type(){return`DirectionalLightNode`}constructor(e=null){super(e)}setupDirect(){let e=this.colorNode;return{lightDirection:NE(this.light),lightColor:e}}},Qk=class extends kD{static get type(){return`HemisphereLightNode`}constructor(e=null){super(e),this.lightPositionNode=AE(e),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=q(new j).setGroup(K)}update(e){let{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){let{colorNode:t,groundColorNode:n,lightDirectionNode:r}=this,i=Qd(n,t,gh.dot(r).mul(.5).add(.5));e.context.irradiance.addAssign(i)}},$k=class extends kD{static get type(){return`SpotLightNode`}constructor(e=null){super(e),this.coneCosNode=q(0).setGroup(K),this.penumbraCosNode=q(0).setGroup(K),this.cutoffDistanceNode=q(0).setGroup(K),this.decayExponentNode=q(0).setGroup(K),this.colorNode=q(this.color).setGroup(K)}update(e){super.update(e);let{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){let{coneCosNode:n,penumbraCosNode:r}=this;return nf(n,r,t)}getLightCoord(e){let t=e.getNodeProperties(this),n=t.projectionUV;return n===void 0&&(n=kE(this.light,e.context.positionWorld),t.projectionUV=n),n}setupDirect(e){let{colorNode:t,cutoffDistanceNode:n,decayExponentNode:r,light:i}=this,a=this.getLightVector(e),o=a.normalize(),s=o.dot(NE(i)),c=this.getSpotAttenuation(e,s),l=AD({lightDistance:a.length(),cutoffDistance:n,decayExponent:r}),u=t.mul(c).mul(l),d,f;return i.colorNode?(f=this.getLightCoord(e),d=i.colorNode(f)):i.map&&(f=this.getLightCoord(e),d=Lp(i.map,f.xy).onRenderUpdate(()=>i.map)),d&&(u=f.mul(2).sub(1).abs().lessThan(1).all().select(u.mul(d),u)),{lightColor:u,lightDirection:o}}},eA=class extends $k{static get type(){return`IESSpotLightNode`}constructor(e=null){super(e),this._iesTextureNode=null}getSpotAttenuation(e,t){let n=this.light.iesMap,r=null;if(n&&n.isTexture===!0){let e=t.acos().mul(1/Math.PI);this._iesTextureNode=Lp(n,U(e,0),0),r=this._iesTextureNode.r}else r=super.getSpotAttenuation(e,t);return r}update(e){super.update(e),this._iesTextureNode!==null&&this.light.iesMap&&(this._iesTextureNode.value=this.light.iesMap)}},tA=class extends kD{static get type(){return`LightProbeNode`}constructor(e=null){super(e);let t=[];for(let e=0;e<9;e++)t.push(new k);this.lightProbe=qp(t)}update(e){let{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){let t=lk(gh,this.lightProbe);e.context.irradiance.addAssign(t)}},nA=R(([e,t])=>{let n=e.abs().sub(t);return Cd(Id(n Line truncated
vec4 tsl_textureGather( const int comp, sampler2D map, vec2 coord, ivec2 offset, bool flipY ) {
if ( flipY ) offset.y = - offset.y;
vec2 size = vec2( textureSize( map, 0 ) );
vec2 st = floor( coord * size + vec2( offset ) - 0.5 );
vec4 ij = vec4( st + 0.5, st + 1.5 ) / size.xyxy;
vec4 ret = vec4(
textureLod( map, ij.xw, 0.0 )[ comp ],
textureLod( map, ij.zw, 0.0 )[ comp ],
textureLod( map, ij.zy, 0.0 )[ comp ],
textureLod( map, ij.xy, 0.0 )[ comp ]
);
return flipY ? ret.wzyx : ret;
}
`),textureGatherArray:new fT(`
vec4 tsl_textureGather_array( const int comp, sampler2DArray map, vec3 coord, ivec2 offset, bool flipY ) {
if ( flipY ) offset.y = - offset.y;
vec2 size = vec2( textureSize( map, 0 ).xy );
vec2 st = floor( coord.xy * size + vec2( offset ) - 0.5 );
vec4 ij = vec4( st + 0.5, st + 1.5 ) / size.xyxy;
vec4 ret = vec4(
textureLod( map, vec3( ij.xw, coord.z ), 0.0 )[ comp ],
textureLod( map, vec3( ij.zw, coord.z ), 0.0 )[ comp ],
textureLod( map, vec3( ij.zy, coord.z ), 0.0 )[ comp ],
textureLod( map, vec3( ij.xy, coord.z ), 0.0 )[ comp ]
);
return flipY ? ret.wzyx : ret;
}
`),textureGatherCompare:new fT(`
vec4 tsl_textureGatherCompare( sampler2DShadow map, vec2 coord, ivec2 offset, float ref, bool flipY ) {
if ( flipY ) offset.y = - offset.y;
vec2 size = vec2( textureSize( map, 0 ) );
vec2 st = floor( coord * size + vec2( offset ) - 0.5 );
vec4 ij = vec4( st + 0.5, st + 1.5 ) / size.xyxy;
vec4 ret = vec4(
textureLod( map, vec3( ij.xw, ref ), 0.0 ),
textureLod( map, vec3( ij.zw, ref ), 0.0 ),
textureLod( map, vec3( ij.zy, ref ), 0.0 ),
textureLod( map, vec3( ij.xy, ref ), 0.0 )
);
return flipY ? ret.wzyx : ret;
}
`),textureGatherCompareArray:new fT(`
vec4 tsl_textureGatherCompare_array( sampler2DArrayShadow map, vec3 coord, ivec2 offset, float ref, bool flipY ) {
if ( flipY ) offset.y = - offset.y;
vec2 size = vec2( textureSize( map, 0 ).xy );
vec2 st = floor( coord.xy * size + vec2( offset ) - 0.5 );
vec4 ij = vec4( st + 0.5, st + 1.5 ) / size.xyxy;
vec4 ret = vec4(
texture( map, vec4( ij.xw, coord.z, ref ) ),
texture( map, vec4( ij.zw, coord.z, ref ) ),
texture( map, vec4( ij.zy, coord.z, ref ) ),
texture( map, vec4( ij.xy, coord.z, ref ) )
);
return flipY ? ret.wzyx : ret;
}
`)},gj={textureDimensions:`textureSize`,equals:`equal`,bitcast_float_int:`floatBitsToInt`,bitcast_int_float:`intBitsToFloat`,bitcast_uint_float:`uintBitsToFloat`,bitcast_float_uint:`floatBitsToUint`,bitcast_uint_int:`tsl_bitcast_uint_to_int`,bitcast_int_uint:`tsl_bitcast_int_to_uint`,floatpack_snorm_2x16:`packSnorm2x16`,floatpack_unorm_2x16:`packUnorm2x16`,floatpack_float16_2x16:`packHalf2x16`,floatunpack_snorm_2x16:`unpackSnorm2x16`,floatunpack_unorm_2x16:`unpackUnorm2x16`,floatunpack_float16_2x16:`unpackHalf2x16`},_j={low:`lowp`,medium:`mediump`,high:`highp`},vj={swizzleAssign:!0,storageBuffer:!1},yj={perspective:`smooth`,linear:`noperspective`},bj={centroid:`centroid`},xj=`
precision highp float;
precision highp int;
precision highp sampler2D;
precision highp sampler3D;
precision highp samplerCube;
precision highp sampler2DArray;
precision highp usampler2D;
precision highp usampler3D;
precision highp usamplerCube;
precision highp usampler2DArray;
precision highp isampler2D;
precision highp isampler3D;
precision highp isamplerCube;
precision highp isampler2DArray;
precision highp sampler2DShadow;
precision highp sampler2DArrayShadow;
precision highp samplerCubeShadow;
`,Sj=class extends qk{constructor(e,t){super(e,t,new hA),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return e.isVideoTexture===!0&&e.colorSpace!==``}_include(e){let t=hj[e];return t.build(this),this.addInclude(t),t}getMethod(e){return hj[e]!==void 0&&this._include(e),gj[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,n){return`${e} ? ${t} : ${n}`}getOutputStructName(){return``}buildFunctionCode(e){let t=e.layout,n=this.flowShaderNode(e),r=[];for(let e of t.inputs)r.push(this.getType(e.type)+` `+e.name);return`${this.getType(t.type)} ${t.name}( ${r.join(`, `)} ) {
${n.vars}
${n.code}
return ${n.result};
}`}setupPBO(e){let t=e.value;if(t.pbo===void 0){let e=t.array,n=t.count*t.itemSize,{itemSize:r}=t,i=t.array.constructor.name.toLowerCase().includes(`int`),a=i?se:oe;r===2?a=i?le:ce:r===3?a=i?ue:ne:r===4&&(a=i?de:re);let o={Float32Array:y,Uint8Array:p,Uint16Array:g,Uint32Array:v,Int8Array:m,Int16Array:h,Int32Array:_,Uint8ClampedArray:p},s=2**Math.ceil(Math.log2(Math.sqrt(n/r))),c=Math.ceil(n/r/s);s*c*r<n&&c++;let l=s*c*r,u=new e.constructor(l);u.set(e,0),t.array=u;let d=new Pi(t.array,s,c,a,o[t.array.constructor.name]||1015);d.needsUpdate=!0,d.isPBOTexture=!0;let f=new Fp(d,null,null);f.setPrecision(`high`),t.pboNode=f,t.pbo=f.value,this.getUniformFromNode(t.pboNode,`texture`,this.shaderStage,this.context.nodeName)}}getPropertyName(e,t=this.shaderStage){return e.isNodeUniform&&e.node.isTextureNode!==!0&&e.node.isBufferNode!==!0?e.name:super.getPropertyName(e,t)}generatePBO(e){let{node:t,indexNode:n}=e,r=t.value;if(this.renderer.backend.has(r)){let e=this.renderer.backend.get(r);e.pbo=r.pbo}let i=this.getUniformFromNode(r.pboNode,`texture`,this.shaderStage,this.context.nodeName),a=this.getPropertyName(i);this.increaseUsage(n);let o=n.build(this,`uint`),s=this.getDataFromNode(e),c=s.propertyName;if(c===void 0){let n=this.getVarFromNode(e);c=this.getPropertyName(n);let i=this.getDataFromNode(t),l=i.propertySizeName;l===void 0&&(l=c+`Size`,this.getVarFromNode(t,l,`uint`),this.addLineFlowCode(`${l} = uint( textureSize( ${a}, 0 ).x )`,e),i.propertySizeName=l);let{itemSize:u}=r,d=`.`+nc.join(``).slice(0,u),f=`ivec2(${o} % ${l}, ${o} / ${l})`,p=this.generateTextureLoad(null,a,f,`0`,null,null),m=`vec4`;r.pbo.type===1014?m=`uvec4`:r.pbo.type===1013&&(m=`ivec4`),this.addLineFlowCode(`${c} = ${m}(${p})${d}`,e),s.propertyName=c}return c}generateTextureLoad(e,t,n,r,i,a){r===null&&(r=`0`);let o;return o=i?a?`texelFetchOffset( ${t}, ivec3( ${n}, ${i} ), int( ${r} ), ${a} )`:`texelFetch( ${t}, ivec3( ${n}, ${i} ), int( ${r} ) )`:a?`texelFetchOffset( ${t}, ${n}, int( ${r} ), ${a} )`:`texelFetch( ${t}, ${n}, int( ${r} ) )`,e!==null&&e.isDepthTexture&&(o+=`.x`),o}generateTexture(e,t,n,r,i){return r&&(n=`vec3( ${n}, ${r} )`),e.isDepthTexture?i?`textureOffset( ${t}, ${n}, ${i} ).x`:`texture( ${t}, ${n} ).x`:i?`textureOffset( ${t}, ${n}, ${i} )`:`texture( ${t}, ${n} )`}generateTextureLevel(e,t,n,r,i,a){return i&&(n=`vec3( ${n}, ${i} )`),a?`textureLodOffset( ${t}, ${n}, ${r}, ${a} )`:`textureLod( ${t}, ${n}, ${r} )`}generateTextureBias(e,t,n,r,i,a){return i&&(n=`vec3( ${n}, ${i} )`),a?`textureOffset( ${t}, ${n}, ${a}, ${r} )`:`texture( ${t}, ${n}, ${r} )`}generateTextureGrad(e,t,n,r,i,a){return i&&(n=`vec3( ${n}, ${i} )`),a?`textureGradOffset( ${t}, ${n}, ${r[0]}, ${r[1]}, ${a} )`:`textureGrad( ${t}, ${n}, ${r[0]}, ${r[1]} )`}generateTextureCompare(e,t,n,r,i,a,o=this.shaderStage){if(o===`fragment`)return e.isCubeTexture?`texture( ${t}, vec4( ${n}, ${r} ) )`:i?a?`textureOffset( ${t}, vec4( ${n}, ${i}, ${r} ), ${a} )`:`texture( ${t}, vec4( ${n}, ${i}, ${r} ) )`:a?`textureOffset( ${t}, vec3( ${n}, ${r} ), ${a} )`:`texture( ${t}, vec3( ${n}, ${r} ) )`;E(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${o} shader.`)}generateTextureGather(e,t,n,r,i,a,o){return e.isDepthTexture&&(r=`0`),a===null&&(a=`ivec2( 0 )`),o===null&&(o=`false`),i?(this._include(`textureGatherArray`),`tsl_textureGather_array( ${r}, ${t}, vec3( ${n}, ${i} ), ${a}, ${o} )`):(this._include(`textureGather`),`tsl_textureGather( ${r}, ${t}, ${n}, ${a}, ${o} )`)}generateTextureGatherCompare(e,t,n,r,i,a,o){return a===null&&(a=`ivec2( 0 )`),o===null&&(o=`false`),i?(this._include(`textureGatherCompareArray`),`tsl_textureGatherCompare_array( ${t}, vec3( ${n}, ${i} ), ${a}, ${r}, ${o} )`):(this._include(`textureGatherCompare`),`tsl_textureGatherCompare( ${t}, ${n}, ${a}, ${r}, ${o} )`)}getUniforms(e){let t=this.uniforms[e],n=[],r={};for(let e of t){let t=null,i=!1;if(e.type===`texture`||e.type===`texture3D`){let n=e.node,r=n.value,i=``;(r.isDataTexture===!0||r.isData3DTexture===!0)&&(r.type===1014?i=`u`:r.type===1013&&(i=`i`)),t=e.type===`texture3D`&&r.isArrayTexture===!1?`${i}sampler3D ${e.name};`:r.compareFunction&&n.compareNode!==null?r.isArrayTexture===!0?`sampler2DArrayShadow ${e.name};`:`sampler2DShadow ${e.name};`:r.isArrayTexture===!0||r.isDataArrayTexture===!0||r.isCompressedArrayTexture===!0?`${i}sampler2DArray ${e.name};`:`${i}sampler2D ${e.name};`}else if(e.type===`cubeTexture`)t=`samplerCube ${e.name};`;else if(e.type===`cubeDepthTexture`)t=e.node.value.compareFunction?`samplerCubeShadow ${e.name};`:`samplerCube ${e.name};`;else if(e.type===`buffer`){let n=e.node,r=this.getType(n.bufferType),i=n.bufferCount,a=i>0?i:``;t=`${n.name} {\n\t${r} ${e.name}[${a}];\n};\n`}else{let t=e.groupNode.name;if(r[t]===void 0){let e=this.uniformGroups[t];if(e!==void 0){let n=[];for(let t of e.uniforms){let e=t.getType(),r=this.getVectorType(e),i=t.nodeUniform.node.precision,a=`${r} ${t.name};`;i!==null&&(a=_j[i]+` `+a),n.push(` `+a)}r[t]=n}}i=!0}if(!i){let r= Line truncated
`))+`
`}return i+=n.join(`
`),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==1013){let n=e;e.isInterleavedBufferAttribute&&(n=e.data);let r=n.array;r instanceof Uint32Array||r instanceof Int32Array||(t=t.slice(1))}return t}getAttributes(e){let t=``;if(e===`vertex`||e===`compute`){let e=this.getAttributesArray(),n=0;for(let r of e)t+=`layout( location = ${n++} ) in ${r.type} ${r.name};\n`}return t}getStructMembers(e){let t=[];for(let n of e.members)t.push(`\t${n.type} ${n.name};`);return t.join(`
`)}getStructs(e){let t=[],n=this.structs[e],r=[];for(let e of n)if(e.output)for(let t of e.members)r.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let n=`struct `+e.name+` {
`;n+=this.getStructMembers(e),n+=`
};
`,t.push(n)}return e===`fragment`&&r.length===0&&r.push(`layout( location = 0 ) out ${this.getOutputType()} fragColor;`),`
`+r.join(`
`)+`
`+t.join(`
`)}getVaryings(e){let t=``,n=this.varyings;if(e===`vertex`||e===`compute`)for(let r of n){e===`compute`&&(r.needsInterpolation=!0);let n=this.getType(r.type);if(r.needsInterpolation)if(r.interpolationType){let e=yj[r.interpolationType]||r.interpolationType,i=bj[r.interpolationSampling]||``;t+=`${e} ${i} out ${n} ${r.name};\n`}else{let e=n.includes(`int`)||n.includes(`uv`)||n.includes(`iv`)?`flat `:``;t+=`${e}out ${n} ${r.name};\n`}else t+=`${n} ${r.name};\n`}else if(e===`fragment`){for(let e of n)if(e.needsInterpolation){let n=this.getType(e.type);if(e.interpolationType){let r=yj[e.interpolationType]||e.interpolationType,i=bj[e.interpolationSampling]||``;t+=`${r} ${i} in ${n} ${e.name};\n`}else{let r=n.includes(`int`)||n.includes(`uv`)||n.includes(`iv`)?`flat `:``;t+=`${r}in ${n} ${e.name};\n`}}}for(let n of this.builtins[e])t+=`${n};\n`;return t}getVertexIndex(){return`uint( gl_VertexID )`}getInstanceIndex(){return`uint( gl_InstanceID )`}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){E(`GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node`)}getInvocationSubgroupIndex(){E(`GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node`)}getSubgroupIndex(){E(`GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node`)}getDrawIndex(){return this.renderer.backend.extensions.has(`WEBGL_multi_draw`)?`uint( gl_DrawID )`:`nodeUniformDrawId`}getFrontFacing(){return`gl_FrontFacing`}getFragCoord(){return`gl_FragCoord.xy`}getFragDepth(){return`gl_FragDepth`}enableExtension(e,t,n=this.shaderStage){let r=this.extensions[n]||(this.extensions[n]=new Map);r.has(e)===!1&&r.set(e,{name:e,behavior:t})}getExtensions(e){let t=[];if(e===`vertex`){let t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has(`WEBGL_multi_draw`)&&this.enableExtension(`GL_ANGLE_multi_draw`,`require`,e)}let n=this.extensions[e];if(n!==void 0)for(let{name:e,behavior:r}of n.values())t.push(`#extension ${e} : ${r}`);return t.join(`
`)}getClipDistance(){return`gl_ClipDistance`}isAvailable(e){let t=vj[e];if(t===void 0){let n;switch(t=!1,e){case`float32Filterable`:n=`OES_texture_float_linear`;break;case`clipDistance`:n=`WEBGL_clip_cull_distance`;break}if(n!==void 0){let e=this.renderer.backend.extensions;e.has(n)&&(e.get(n),t=!0)}vj[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension(`GL_ANGLE_clip_cull_distance`,`require`),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension(`GL_OVR_multiview2`,`require`,`fragment`),this.enableExtension(`GL_OVR_multiview2`,`require`,`vertex`),this.builtins.vertex.push(`layout(num_views = 2) in`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){let e=this.transforms,t=``;for(let n=0;n<e.length;n++){let r=e[n],i=this.getPropertyName(r.attributeNode);i&&(t+=`${r.varyingName} = ${i};\n\t`)}return t}_getGLSLUniformStruct(e,t){return`
layout( std140 ) uniform ${e} {
${t}
};`}_getGLSLVertexCode(e){return`#version 300 es
${this.getSignature()}
// extensions
${e.extensions}
// precision
${xj}
// structs
${e.structs}
// uniforms
${e.uniforms}
// varyings
${e.varyings}
// attributes
${e.attributes}
// vars
${e.vars}
// codes
${e.codes}
void main() {
// transforms
${e.transforms}
// flow
${e.flow}
gl_PointSize = 1.0;
}
`}_getGLSLFragmentCode(e){return`#version 300 es
${this.getSignature()}
// extensions
${e.extensions}
// precision
${xj}
// structs
${e.structs}
// uniforms
${e.uniforms}
// varyings
${e.varyings}
// vars
${e.vars}
// codes
${e.codes}
void main() {
// flow
${e.flow}
}
`}buildCode(){let e=this.material===null?{compute:{}}:{fragment:{},vertex:{}};this.sortBindingGroups();for(let t in e){let n=`// code
`;n+=this.flowCode[t];let r=this.flowNodes[t],i=r[r.length-1];for(let e of r){let r=this.getFlowData(e),a=e.name;a&&(n.length>0&&(n+=`
`),n+=`\t// flow -> ${a}\n\t`),n+=`${r.code}\n\t`,e===i&&t!==`compute`&&(n+=`// result
`,t===`vertex`?(n+=`gl_Position = `,n+=`${this.format(r.result,i.getNodeType(this),`vec4`)};`):t===`fragment`&&(e.outputNode.isOutputStructNode||(n+=`fragColor = `,n+=`${this.format(r.result,i.getNodeType(this),this.getOutputType())};`)))}let a=e[t];if(a.extensions=this.getExtensions(t),a.uniforms=this.getUniforms(t),a.attributes=this.getAttributes(t),a.varyings=this.getVaryings(t),a.vars=this.getVars(t,!0),a.structs=this.getStructs(t),a.codes=this.getCodes(t),a.transforms=this.getTransforms(t),a.flow=n,t===`vertex`){let e=this.renderer.backend.extensions;this.object.isBatchedMesh&&e.has(`WEBGL_multi_draw`)===!1&&(a.uniforms+=`
uniform uint nodeUniformDrawId;
`)}}this.material===null?this.computeShader=this._getGLSLVertexCode(e.compute):(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment))}getUniformFromNode(e,t,n,r=null){let i=super.getUniformFromNode(e,t,n,r),a=this.getDataFromNode(e,n,this.globalCache),o=a.uniformGPU;if(o===void 0){let r=e.groupNode,s=r.name,c=this.getBindGroupArray(s,n);if(t===`texture`)o=new fj(i.name,i.node,r),c.push(o);else if(t===`cubeTexture`||t===`cubeDepthTexture`)o=new pj(i.name,i.node,r),c.push(o);else if(t===`texture3D`)o=new mj(i.name,i.node,r),c.push(o);else if(t===`buffer`){i.name=`buffer${e.id}`;let t=this.getSharedDataFromNode(e),n=t.buffer;n===void 0&&(e.name=`NodeBuffer_${e.id}`,n=new rj(e,r),n.name=e.name,t.buffer=n),c.push(n),o=n}else{let e=this.uniformGroups[s];e===void 0?(e=new cj(s,r),this.uniformGroups[s]=e,c.push(e)):c.indexOf(e)===-1&&c.push(e),o=this.getNodeUniform(i,t);let n=o.name;e.uniforms.some(e=>e.name===n)||e.addUniform(o)}a.uniformGPU=o}return i}},Cj=null,wj=null,Tj=class{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[gt.RENDER]:null,[gt.COMPUTE]:null},this.trackTimestamp=e.trackTimestamp===!0}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}setXRTarget(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}createUniformBuffer(){}destroyUniformBuffer(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){let t=this.get(e),n=this.renderer.info.frame,r;r=e.isComputeNode===!0?`c:`+this.renderer.info.compute.frameCalls:`r:`+this.renderer.info.render.frameCalls,t.timestampUID=r+`:`+e.id+`:f`+n}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){let t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){let t=e.startsWith(`c:`)?gt.COMPUTE:gt.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}get hasTimestamp(){return!1}hasTimestampQuery(e){return this._getQueryPool(e).hasTimestampQuery(e)}isOccluded(){}async resolveTimestampsAsync(e=`render`){if(!this.trackTimestamp){Tt(`WebGPURenderer: Timestamp tracking is disabled.`);return}let t=this.timestampQueryPool[e];if(!t)return;let n=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=n,n}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getDrawingBufferSize(){return Cj||=new O,this.renderer.getDrawingBufferSize(Cj)}setScissorTest(){}getClearColor(){let e=this.renderer;return wj||=new wS,e.getClearColor(wj),wj.getRGB(wj),wj}getDomElement(){let e=this.domElement;return e===null&&(e=this.parameters.canvas===void 0?xt():this.parameters.canvas,`setAttribute`in e&&e.setAttribute(`data-engine`,`three.js r185 webgpu`),this.domElement=e),e}hasCompatibility(){return!1}initRenderTarget(){}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return t===void 0&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}},Ej=0,Dj=class{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[this.activeBufferIndex^1]}switchBuffers(){this.activeBufferIndex^=1}},Oj=class{constructor(e){this.backend=e}createAttribute(e,t){let n=this.backend,{gl:r}=n,i=e.array,a=e.usage||r.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,s=n.get(o),c=s.bufferGPU;c===void 0&&(c=this._createBuffer(r,t,i,a),s.bufferGPU=c,s.bufferType=t,s.version=o.version);let l;if(i instanceof Float32Array)l=r.FLOAT;else if(typeof Float16Array<`u`&&i instanceof Float16Array)l=r.HALF_FLOAT;else if(i instanceof Uint16Array)l=e.isFloat16BufferAttribute?r.HALF_FLOAT:r.UNSIGNED_SHORT;else if(i instanceof Int16Array)l=r.SHORT;else if(i instanceof Uint32Array)l=r.UNSIGNED_INT;else if(i instanceof Int32Array)l=r.INT;else if(i instanceof Int8Array)l=r.BYTE;else if(i instanceof Uint8Array)l=r.UNSIGNED_BYTE;else if(i instanceof Uint8ClampedArray)l=r.UNSIGNED_BYTE;else throw Error(`THREE.WebGLBackend: Unsupported buffer data format: `+i);let u={bufferGPU: Line truncated
`),r=[],i=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=i;e<a;e++){let i=e+1;r.push(`${i===t?`>`:` `} ${i}: ${n[e]}`)}return r.join(`
`)}_getShaderErrors(e,t,n){let r=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||``).trim();if(r&&i===``)return``;let a=/ERROR: 0:(\d+)/.exec(i);if(a){let r=parseInt(a[1]);return n.toUpperCase()+`
`+i+`
`+this._handleSource(e.getShaderSource(t),r)}else return i}_logProgramError(e,t,n){if(this.renderer.debug.checkShaderErrors){let r=this.gl,i=(r.getProgramInfoLog(e)||``).trim();if(r.getProgramParameter(e,r.LINK_STATUS)===!1)if(typeof this.renderer.debug.onShaderError==`function`)this.renderer.debug.onShaderError(r,e,n,t);else{let a=this._getShaderErrors(r,n,`vertex`),o=this._getShaderErrors(r,t,`fragment`);E(`WebGLProgram: Shader Error `+r.getError()+` - VALIDATE_STATUS `+r.getProgramParameter(e,r.VALIDATE_STATUS)+`
Program Info Log: `+i+`
`+a+`
`+o)}else i!==``&&T(`WebGLProgram: Program Info Log:`,i)}}_completeCompile(e,t){let{state:n,gl:r}=this,{programGPU:i,fragmentShader:a,vertexShader:o}=this.get(t);r.getProgramParameter(i,r.LINK_STATUS)===!1&&this._logProgramError(i,a,o),n.useProgram(i);let s=e.getBindings();this._setupBindings(s,i),this.set(t,{programGPU:i,pipeline:i})}createComputePipeline(e,t){let{state:n,gl:r}=this,i={stage:`fragment`,code:`#version 300 es
precision highp float;
void main() {}`};this.createProgram(i);let{computeProgram:a}=e,o=r.createProgram(),s=this.get(i).shaderGPU,c=this.get(a).shaderGPU,l=a.transforms,u=[],d=[];for(let e=0;e<l.length;e++){let t=l[e];u.push(t.varyingName),d.push(t.attributeNode)}r.attachShader(o,s),r.attachShader(o,c),r.transformFeedbackVaryings(o,u,r.SEPARATE_ATTRIBS),r.linkProgram(o),r.getProgramParameter(o,r.LINK_STATUS)===!1&&this._logProgramError(o,s,c),n.useProgram(o),this._setupBindings(t,o);let f=a.attributes,p=[],m=[];for(let e=0;e<f.length;e++){let t=f[e].node.attribute;p.push(t),this.has(t)||this.attributeUtils.createAttribute(t,r.ARRAY_BUFFER)}for(let e=0;e<d.length;e++){let t=d[e].attribute;this.has(t)||this.attributeUtils.createAttribute(t,r.ARRAY_BUFFER);let n=this.get(t);m.push(n)}this.set(e,{programGPU:o,transformBuffers:m,attributes:p})}createBindings(e,t){if(this._knownBindings.has(t)===!1){this._knownBindings.add(t);let e=0,n=0;for(let r of t){this.set(r,{textures:n,uniformBuffers:e});for(let t of r.bindings)t.isUniformBuffer&&e++,t.isSampledTexture&&n++}}this.updateBindings(e,t)}updateBindings(e){let{gl:t}=this;for(let n of e.bindings){let e=this.get(n);if(n.isUniformsGroup||n.isUniformBuffer){let r=n.buffer,i=e.bufferGPU;t.bindBuffer(t.UNIFORM_BUFFER,i);let a=n.updateRanges;if(t.bindBuffer(t.UNIFORM_BUFFER,i),a.length===0)t.bufferData(t.UNIFORM_BUFFER,r,t.DYNAMIC_DRAW);else{let e=yt(r),n=e?1:r.BYTES_PER_ELEMENT;for(let i=0,o=a.length;i<o;i++){let o=a[i],s=o.start*n,c=o.count*n,l=s*(e?r.BYTES_PER_ELEMENT:1);t.bufferSubData(t.UNIFORM_BUFFER,l,r,s,c)}}this.set(n,e)}else if(n.isSampledTexture){let{textureGPU:t,glTextureType:r}=this.get(n.texture);e.textureGPU=t,e.glTextureType=r,this.set(n,e)}}}updateBinding(e){let t=this.gl;if(e.isUniformsGroup||e.isUniformBuffer){let n=this.get(e).bufferGPU,r=e.buffer,i=e.updateRanges;if(t.bindBuffer(t.UNIFORM_BUFFER,n),i.length===0)t.bufferData(t.UNIFORM_BUFFER,r,t.DYNAMIC_DRAW);else{let e=yt(r),n=e?1:r.BYTES_PER_ELEMENT,a=i[0].start;for(let o=0,s=i.length;o<s;o++){let s=i[o],c=i[o+1],l=s.start+s.count;if(c!==void 0&&c.start===l)continue;let u=a*n,d=(l-a)*n,f=u*(e?r.BYTES_PER_ELEMENT:1);t.bufferSubData(t.UNIFORM_BUFFER,f,r,u,d),c!==void 0&&(a=c.start)}}}}createUniformBuffer(e){let t=this.get(e);if(t.bufferGPU===void 0){let n=this.gl,r=e.buffer;t.bufferGPU=n.createBuffer(),n.bindBuffer(n.UNIFORM_BUFFER,t.bufferGPU),n.bufferData(n.UNIFORM_BUFFER,r.byteLength,n.DYNAMIC_DRAW)}}destroyUniformBuffer(e){let t=this.get(e);this.gl.deleteBuffer(t.bufferGPU),this.delete(e)}createIndexAttribute(e){let t=this.gl;this.attributeUtils.createAttribute(e,t.ELEMENT_ARRAY_BUFFER)}createAttribute(e){if(this.has(e))return;let t=this.gl;this.attributeUtils.createAttribute(e,t.ARRAY_BUFFER)}createStorageAttribute(e){if(this.has(e))return;let t=this.gl;this.attributeUtils.createAttribute(e,t.ARRAY_BUFFER)}updateAttribute(e){this.attributeUtils.updateAttribute(e)}destroyAttribute(e){this.attributeUtils.destroyAttribute(e)}hasFeature(e){let t=Object.keys(Vj).filter(t=>Vj[t]===e),n=this.extensions;for(let e=0;e<t.length;e++)if(n.has(t[e]))return!0;return!1}copyTextureToTexture(e,t,n=null,r=null,i=0,a=0){this.textureUtils.copyTextureToTexture(e,t,n,r,i,a)}copyFramebufferToTexture(e,t,n){this.textureUtils.copyFramebufferToTexture(e,t,n)}hasCompatibility(e){return e===_t.TEXTURE_COMPARE||super.hasCompatibility(e)}initRenderTarget(e){let{gl:t,state:n}=this;this._setFramebuffer(e),n.bindFramebuffer(t.FRAMEBUFFER,null)}_setFramebuffer(e){let{gl:t,state:n}=this,r=null;if(e.textures!==null){let i=e.renderTarget,a=this.get(i),{samples:o,depthBuffer:s,stencilBuffer:c}=i,l=i.isCubeRenderTarget===!0,u=i.isRenderTarget3D===!0,d=i.depth>1,f=i.isXRRenderTarget===!0,p=f===!0&&i._hasExternalTextures===!0,m=a.msaaFrameBuffer,h=a.depthRenderbuffer,g=this.extensions.get(`WEBGL_multisampled_render_to_texture`),_=this.extensions.get(`OVR_multiview2`),v=this._useMultisampledExtension(i),y=bS(e),b;if(l?(a.cubeFramebuffers||={},b=a.cubeFramebuffers[y]):f&&p===!1?b=this._xrFramebuffer:(a.framebuffers||={},b=a.framebuffers[y]),b===void 0){b=t.createFramebuffer(),n.bindFramebuffer(t.FRAMEBUFFER,b);let r=e.textures,s=[];if(l){a.cubeFramebuffers[y]=b;let{textureGPU:e}=this.get(r[0]),n=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+n,e,i)}else{a.framebuffers[y]=b;for(let n=0;n<r.length;n++){let a=r[n],s=this.get(a);s.renderTarget=e.renderTarget,s.cacheKey=y;let c=t.COLOR_ATTACHMENT0+n;if(i.multiview)_.framebufferTextureMultisampleMultiviewOVR(t.FRAMEBUFFER,c,s.textureGPU,0,o,0,2);else if(u||d){let e=this.renderer._activeCubeFace,n=this.renderer._activeMipmapLevel;t.framebufferTextureLayer(t.FRAMEBUFFER,c,s.textureGPU,n,e)}else if(v)g.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,c,t.TEXTURE_2D,s.textureGPU,0,o);else{let e=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,c,t.TEXTURE_2D,s.textureGPU,e)}}}let f=c?t.DEPTH_STE Line truncated
struct VarysStruct {
@builtin( position ) Position: vec4f,
@location( 0 ) vTex : vec2f,
@location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,
};
@group( 0 ) @binding ( 2 )
var<uniform> flipY: u32;
@vertex
fn mainVS(
@builtin( vertex_index ) vertexIndex : u32,
@builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {
var Varys : VarysStruct;
var pos = array(
vec2f( -1, -1 ),
vec2f( -1, 3 ),
vec2f( 3, -1 ),
);
let p = pos[ vertexIndex ];
let mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );
Varys.vTex = p * mult + vec2f( 0.5 );
Varys.Position = vec4f( p, 0, 1 );
Varys.vBaseArrayLayer = instanceIndex;
return Varys;
}
@group( 0 ) @binding( 0 )
var imgSampler : sampler;
@group( 0 ) @binding( 1 )
var img2d : texture_2d<f32>;
@fragment
fn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
return textureSample( img2d, imgSampler, Varys.vTex );
}
@group( 0 ) @binding( 1 )
var img2dArray : texture_2d_array<f32>;
@fragment
fn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
return textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );
}
const faceMat = array(
mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x
mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x
mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y
mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y
mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z
mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z
);
@group( 0 ) @binding( 1 )
var imgCube : texture_cube<f32>;
@fragment
fn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
return textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );
}
`,this.mipmapShaderModule=e.createShaderModule(VM),VM.reset()}getTransferPipeline(e,t){t||=`2d-array`;let n=`${e}-${t}`,r=this.transferPipelines[n];return r===void 0&&(zM.label=`mipmap-${e}-${t}`,zM.vertex={module:this.mipmapShaderModule},zM.fragment={module:this.mipmapShaderModule,entryPoint:`main_${t.replace(`-`,`_`)}`,targets:[{format:e}]},zM.layout=`auto`,r=this.device.createRenderPipeline(zM),zM.reset(),this.transferPipelines[n]=r),r}flipY(e,t,n=0){let r=t.format,{width:i,height:a}=t.size;HM.size.width=i,HM.size.height=a,HM.format=r,HM.usage=GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING;let o=this.device.createTexture(HM);HM.reset();let s=this.getTransferPipeline(r,e.textureBindingViewDimension),c=this.getTransferPipeline(r,o.textureBindingViewDimension),l=this.device.createCommandEncoder(IM),u=(e,t,n,r,i,a)=>{let o=e.getBindGroupLayout(0);UM.dimension=t.textureBindingViewDimension||`2d-array`,UM.mipLevelCount=1;let s=t.createView(UM);UM.reset(),PM.layout=o,PM.entries.push({binding:0,resource:this.flipYSampler},{binding:1,resource:s},{binding:2,resource:{buffer:a?this.flipUniformBuffer:this.noFlipUniformBuffer}});let c=this.device.createBindGroup(PM);PM.reset(),UM.dimension=`2d`,UM.mipLevelCount=1,UM.baseArrayLayer=i,UM.arrayLayerCount=1;let u=r.createView(UM);UM.reset(),BM.view=u,BM.loadOp=Xj.Clear,BM.storeOp=Yj.Store,RM.colorAttachments.push(BM);let d=l.beginRenderPass(RM);RM.reset(),BM.reset(),d.setPipeline(e),d.setBindGroup(0,c),d.draw(3,1,0,n),d.end()};u(s,e,n,o,0,!1),u(c,o,0,e,n,!0),SM(this.device,l.finish()),o.destroy()}generateMipmaps(e,t=null){let n=this.get(e),r=n.layers||this._mipmapCreateBundles(e),i=t;i===null&&(IM.label=`mipmapEncoder`,i=this.device.createCommandEncoder(IM),IM.reset()),this._mipmapRunBundles(i,r),t===null&&SM(this.device,i.finish()),n.layers=r}_mipmapCreateBundles(e){let t=e.textureBindingViewDimension||`2d-array`,n=this.getTransferPipeline(e.format,t),r=n.getBindGroupLayout(0),i=[];for(let a=1;a<e.mipLevelCount;a++)for(let o=0;o<e.depthOrArrayLayers;o++){UM.dimension=t,UM.baseMipLevel=a-1,UM.mipLevelCount=1;let s=e.createView(UM);UM.reset(),PM.layout=r,PM.entries.push({binding:0,resource:this.mipmapSampler},{binding:1,resource:s},{binding:2,resource:{buffer:this.noFlipUniformBuffer}});let c=this.device.createBindGroup(PM);PM.reset(),UM.dimension=`2d`,UM.baseMipLevel=a,UM.mipLevelCount=1,UM.baseArrayLayer=o,UM.arrayLayerCount=1;let l=e.createView(UM);UM.reset();let u=new DM;u.view=l,u.loadOp=Xj.Clear,u.storeOp=Yj.Store;let d=new OM;d.colorAttachments.push(u),LM.colorFormats=[e.format];let f=this.device.createRenderBundleEncoder(LM);LM.reset(),f.setPipeline(n),f.setBindGroup(0,c),f.draw(3,1,0,o),i.push({renderBundles:[f.finish()],passDescriptor:d})}return i}_mipmapRunBundles(e,t){let n=t.length;for(let r=0;r<n;r++){let n=t[r],i=e.beginRenderPass(n.passDescriptor);i.executeBundles(n.renderBundles),i.end()}}},GM=class{constructor(){this.label=``,this.addressModeU=`clamp-to-edge`,this.addressModeV=`clamp-to-edge`,this.addressModeW=`clamp-to-edge`,this.magFilter=`nearest`,this.minFilter=`nearest`,this.mipmapFilter=`nearest`,this.lodMinClamp=0,this.lodMaxClamp=32,this.compare=void 0,this.maxAnisotropy=1}reset(){this.label=``,this.addressModeU=`clamp-to-edge`,this.addressModeV=`clamp-to-edge`,this.addressModeW=`clamp-to-edge`,this.magFilter=`nearest`,this.minFilter=`nearest`,this.mipmapFilter=`nearest`,this.lodMinClamp=0,this.lodMaxClamp=32,this.compare=void 0,this.maxAnisotropy=1}},KM=class{constructor(){this.texture=null,this.mipLevel=0,this.origin={x:0,y:0,z:0},this.aspect=`all`}reset(){this.texture=null,this.mipLevel=0,this.origin.x=0,this.origin.y=0,this.origin.z=0,this.aspect=`all`}},qM=class{constructor(){this.buffer=null,this.offset=0,this.bytesPerRow=void 0,this.rowsPerImage=void 0}reset(){this.buffer=null,this.offset=0,this.bytesPerRow=void 0,this.rowsPerImage=void 0}},JM=class{constructor(){this.offset=0,this.bytesPerRow=void 0,this.rowsPerImage=void 0}reset(){this.offset=0,this.bytesPerRow=void 0,this.rowsPerImage=void 0}},YM=class{constructor(){this.source=null,this.origin={x:0,y:0},this.flipY=!1}reset(){this.source=null,this.origin.x=0,this.origin.y=0,this.flipY=!1}},XM=class extends KM{constructor(){super(),this.colorSpace=`srgb`,this.premultipliedAlpha=!1}reset(){super.reset(),this.colorSpace=`srgb`,this.premultipliedAlpha=!1}},ZM=class{constructor(){this.width=0,this.height=1,this.depthOrArrayLayers=1}reset(){this.width=0,this.height=1,this.depthOrArrayLayers=1}},QM=new wM,$M=new TM,eN=new GM,tN=new KM,nN=new qM,rN=new JM,iN=new YM,aN=new XM,oN=new MM,sN=new ZM,cN={512:`never`,513:`less`,514:`equal`,515:`less-equal`,516:`greater`,518:`greater-equal`,519:`always`,517:`not-equal`},lN=[0,1,3,2,4,5];function uN(e,t,n,r,i,a,o,s,c,l){tN.texture=t,tN.mipLevel=n,tN.origin.z=r,rN.offset=r*a,rN.bytesPerRow=o,rN.rowsPerImage=s,sN.width=c,sN.height=l,e.queue.writeTexture(tN,i.data,rN,sN),tN.reset(),rN.reset(),sN.reset()}var dN=class{constructor(e){this. Line truncated
fn tsl_inverse_mat2( m : mat2x2<f32> ) -> mat2x2<f32> {
let det = m[ 0 ][ 0 ] * m[ 1 ][ 1 ] - m[ 0 ][ 1 ] * m[ 1 ][ 0 ];
return mat2x2<f32>(
m[ 1 ][ 1 ], - m[ 0 ][ 1 ],
- m[ 1 ][ 0 ], m[ 0 ][ 0 ]
) * ( 1.0 / det );
}
`),inverse_mat3:new fT(`
fn tsl_inverse_mat3( m : mat3x3<f32> ) -> mat3x3<f32> {
let a00 = m[ 0 ][ 0 ]; let a01 = m[ 0 ][ 1 ]; let a02 = m[ 0 ][ 2 ];
let a10 = m[ 1 ][ 0 ]; let a11 = m[ 1 ][ 1 ]; let a12 = m[ 1 ][ 2 ];
let a20 = m[ 2 ][ 0 ]; let a21 = m[ 2 ][ 1 ]; let a22 = m[ 2 ][ 2 ];
let b01 = a22 * a11 - a12 * a21;
let b11 = - a22 * a10 + a12 * a20;
let b21 = a21 * a10 - a11 * a20;
let det = a00 * b01 + a01 * b11 + a02 * b21;
return mat3x3<f32>(
b01, ( - a22 * a01 + a02 * a21 ), ( a12 * a01 - a02 * a11 ),
b11, ( a22 * a00 - a02 * a20 ), ( - a12 * a00 + a02 * a10 ),
b21, ( - a21 * a00 + a01 * a20 ), ( a11 * a00 - a01 * a10 )
) * ( 1.0 / det );
}
`),inverse_mat4:new fT(`
fn tsl_inverse_mat4( m : mat4x4<f32> ) -> mat4x4<f32> {
let a00 = m[ 0 ][ 0 ]; let a01 = m[ 0 ][ 1 ]; let a02 = m[ 0 ][ 2 ]; let a03 = m[ 0 ][ 3 ];
let a10 = m[ 1 ][ 0 ]; let a11 = m[ 1 ][ 1 ]; let a12 = m[ 1 ][ 2 ]; let a13 = m[ 1 ][ 3 ];
let a20 = m[ 2 ][ 0 ]; let a21 = m[ 2 ][ 1 ]; let a22 = m[ 2 ][ 2 ]; let a23 = m[ 2 ][ 3 ];
let a30 = m[ 3 ][ 0 ]; let a31 = m[ 3 ][ 1 ]; let a32 = m[ 3 ][ 2 ]; let a33 = m[ 3 ][ 3 ];
let b00 = a00 * a11 - a01 * a10;
let b01 = a00 * a12 - a02 * a10;
let b02 = a00 * a13 - a03 * a10;
let b03 = a01 * a12 - a02 * a11;
let b04 = a01 * a13 - a03 * a11;
let b05 = a02 * a13 - a03 * a12;
let b06 = a20 * a31 - a21 * a30;
let b07 = a20 * a32 - a22 * a30;
let b08 = a20 * a33 - a23 * a30;
let b09 = a21 * a32 - a22 * a31;
let b10 = a21 * a33 - a23 * a31;
let b11 = a22 * a33 - a23 * a32;
let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
return mat4x4<f32>(
a11 * b11 - a12 * b10 + a13 * b09,
a02 * b10 - a01 * b11 - a03 * b09,
a31 * b05 - a32 * b04 + a33 * b03,
a22 * b04 - a21 * b05 - a23 * b03,
a12 * b08 - a10 * b11 - a13 * b07,
a00 * b11 - a02 * b08 + a03 * b07,
a32 * b02 - a30 * b05 - a33 * b01,
a20 * b05 - a22 * b02 + a23 * b01,
a10 * b10 - a11 * b08 + a13 * b06,
a01 * b08 - a00 * b10 - a03 * b06,
a30 * b04 - a31 * b02 + a33 * b00,
a21 * b02 - a20 * b04 - a23 * b00,
a11 * b07 - a10 * b09 - a12 * b06,
a00 * b09 - a01 * b07 + a02 * b06,
a31 * b01 - a30 * b03 - a32 * b00,
a20 * b03 - a21 * b01 + a22 * b00
) * ( 1.0 / det );
}
`),biquadraticTexture:new fT(`
fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {
let res = vec2f( iRes );
let uvScaled = coord * res;
let uvWrapping = ( ( uvScaled % res ) + res ) % res;
// https://www.shadertoy.com/view/WtyXRy
let uv = uvWrapping - 0.5;
let iuv = floor( uv );
let f = fract( uv );
let rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );
let rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );
let rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );
let rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );
return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
}
`),biquadraticTextureArray:new fT(`
fn tsl_biquadraticTexture_array( map : texture_2d_array<f32>, coord : vec2f, iRes : vec2u, layer : u32, level : u32 ) -> vec4f {
let res = vec2f( iRes );
let uvScaled = coord * res;
let uvWrapping = ( ( uvScaled % res ) + res ) % res;
// https://www.shadertoy.com/view/WtyXRy
let uv = uvWrapping - 0.5;
let iuv = floor( uv );
let f = fract( uv );
let rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, layer, level );
let rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );
let rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );
let rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );
return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
}
`)},DN={dFdx:`dpdx`,dFdy:`- dpdy`,mod_float:`tsl_mod_float`,mod_vec2:`tsl_mod_vec2`,mod_vec3:`tsl_mod_vec3`,mod_vec4:`tsl_mod_vec4`,equals_bool:`tsl_equals_bool`,equals_bvec2:`tsl_equals_bvec2`,equals_bvec3:`tsl_equals_bvec3`,equals_bvec4:`tsl_equals_bvec4`,inverse_mat2:`tsl_inverse_mat2`,inverse_mat3:`tsl_inverse_mat3`,inverse_mat4:`tsl_inverse_mat4`,inversesqrt:`inverseSqrt`,bitcast:`bitcast<f32>`,floatpack_snorm_2x16:`pack2x16snorm`,floatpack_unorm_2x16:`pack2x16unorm`,floatpack_float16_2x16:`pack2x16float`,floatunpack_snorm_2x16:`unpack2x16snorm`,floatunpack_unorm_2x16:`unpack2x16unorm`,floatunpack_float16_2x16:`unpack2x16float`},ON=``;(typeof navigator<`u`&&/Firefox|Deno/g.test(navigator.userAgent))!==!0&&(ON+=`diagnostic( off, derivative_uniformity );
`);var kN=class extends qk{constructor(e,t){super(e,t,new vN),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map,this.allowEarlyReturns=!0,this.allowGlobalVariables=!0}_generateTextureSample(e,t,n,r,i,a=this.shaderStage){return a===`fragment`?r?i?`textureSample( ${t}, ${t}_sampler, ${n}, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${n}, ${r} )`:i?`textureSample( ${t}, ${t}_sampler, ${n}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${n} )`:this.generateTextureSampleLevel(e,t,n,`0`,r)}generateTextureSampleLevel(e,t,n,r,i,a){return this.isUnfilterable(e)===!1?i?a?`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${i}, ${r}, ${a} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${i}, ${r} )`:a?`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${r}, ${a} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,n,a,r,i):this.generateTextureLod(e,t,n,i,a,r)}generateWrapFunction(e){let t=`tsl_coord_${bN[e.wrapS]}S_${bN[e.wrapT]}T_${e.is3DTexture||e.isData3DTexture?`3d`:`2d`}`,n=TN[t];if(n===void 0){let r=[],i=e.is3DTexture||e.isData3DTexture?`vec3f`:`vec2f`,a=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`,o=(e,t)=>{e===1e3?(r.push(EN.repeatWrapping_float),a+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===1001?(r.push(EN.clampWrapping_float),a+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===1002?(r.push(EN.mirrorWrapping_float),a+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(a+=`\t\tcoord.${t}`,T(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};o(e.wrapS,`x`),a+=`,
`,o(e.wrapT,`y`),(e.is3DTexture||e.isData3DTexture)&&(a+=`,
`,o(e.wrapR,`z`)),a+=`
);
}
`,TN[t]=n=new fT(a,r)}return n.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,n){let r=this.getDataFromNode(e,this.shaderStage,this.cache);r.dimensionsSnippet===void 0&&(r.dimensionsSnippet={});let i=r.dimensionsSnippet[n];if(r.dimensionsSnippet[n]===void 0){let a,o,{primarySamples:s}=this.renderer.backend.utils.getTextureSampleData(e),c=s>1;o=e.is3DTexture||e.isData3DTexture?`vec3<u32>`:`vec2<u32>`,a=c||e.isStorageTexture?t:`${t}${n?`, u32( ${n} )`:``}`,i=new yf(new mp(`textureDimensions( ${a} )`,o)),r.dimensionsSnippet[n]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(r.arrayLayerCount=new yf(new mp(`textureNumLayers(${t})`,`u32`))),e.isTextureCube&&(r.cubeFaceCount=new yf(new mp(`6u`,`u32`)))}return i.build(this)}generateFilteredTexture(e,t,n,r,i=`0u`,a){let o=this.generateWrapFunction(e),s=this.generateTextureDimension(e,t,i);return r&&(n=`${n} + vec2<f32>(${r}) / ${s}`),a?(this._include(`biquadraticTextureArray`),`tsl_biquadraticTexture_array( ${t}, ${o}( ${n} ), ${s}, u32( ${a} ), u32( ${i} ) )`):(this._include(`biquadraticTexture`),`tsl_biquadraticTexture( ${t}, ${o}( ${n} ), ${s}, u32( ${i} ) )`)}generateTextureLod(e,t,n,r,i,a=`0u`){if(e.isCubeTexture===!0){i&&(n=`${n} + vec3<f32>(${i})`);let r=e.isDepthTexture?`u32`:`f32`;return`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${r}( ${a} ) )`}let o=this.generateWrapFunction(e),s=this.generateTextureDimension(e,t,a),c=e.is3DTexture||e.isData3DTexture?`vec3`:`vec2`,l=c===`vec3`?`vec3<u32>( 1, 1, 1 )`:`vec2<u32>( 1, 1 )`;i&&(n=`${n} + ${c}<f32>(${i}) / ${c}<f32>( ${s} )`);let u=`${c}<f32>( 0 )`,d=`${c}<f32>( ${s} - ${l} )`;return n=`${c}<u32>( clamp( floor( ${o}( ${n} ) * ${c}<f32>( ${s} ) ), ${u}, ${d} ) )`,this.generateTextureLoad(e,t,n,a,r,null)}generateStorageTextureLoad(e,t,n,r,i,a){a&&(n=`${n} + ${a}`);let o;return o=i?`textureLoad( ${t}, ${n}, ${i} )`:`textureLoad( ${t}, ${n} )`,o}generateTextureLoad(e,t,n,r,i,a){r===null&&(r=`0u`),a&&(n=`${n} + ${a}`);let o;return i?o=`textureLoad( ${t}, ${n}, ${i}, u32( ${r} ) )`:(o=`textureLoad( ${t}, ${n}, u32( ${r} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(o+=`.x`)),o}generateTextureStore(e,t,n,r,i){let a;return a=r?`textureStore( ${t}, ${n}, ${r}, ${i} )`:`textureStore( ${t}, ${n}, ${i} )`,a}isSampleCompare(e){return e.isDepthTexture===!0&&e.compareFunction!==null&&this.renderer.hasCompatibility(_t.TEXTURE_COMPARE)}isUnfilterable(e){return this.getComponentTypeFromTexture(e)!==`float`||!this.isAvailable(`float32Filterable`)&&e.type===1015||this.isSampleCompare(e)===!1&&e.minFilter===1003&&e.magFilter===1003||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,n,r,i,a=this.shaderStage){let o=null;return o=this.isUnfilterable(e)?this.generateTextureLod(e,t,n,r,i,`0`,a):this._generateTextureSample(e,t,n,r,i,a),o}generateTextureGrad(e,t,n,r,i,a,o=this.shaderStage){if(o===`fragment`)return i?a?`textureSampleGrad( ${t}, ${t}_sampler, ${n}, ${i}, ${r[0]}, ${r[1]}, ${a} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${n}, ${i}, ${r[0]}, ${r[1]} )`:a?`textureSampleGrad( ${t}, ${t}_sampler, ${n}, ${r[0]}, ${r[1]}, ${a} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${n}, ${r[0]}, ${r[1]} )`;E(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${o} shader.`)}generateTextureCompare(e,t,n,r,i,a,o=this.shaderStage){if(o===`fragment`)return e.isDepthTexture===!0&&e.isArrayTexture===!0?a?`textureSampleCompare( ${t}, ${t}_sampler, ${n}, ${i}, ${r}, ${a} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${n}, ${i}, ${r} )`:a?`textureSampleCompare( ${t}, ${t}_sampler, ${n}, ${r}, ${a} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${n}, ${r} )`;E(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${o} shader.`)}generateTextureGather(e,t,n,r,i,a){let o=e.isDepthTexture===!0?``:`${r}, `;return i?a?`textureGather( ${o}${t}, ${t}_sampler, ${n}, ${i}, ${a} )`:`textureGather( ${o}${t}, ${t}_sampler, ${n}, ${i} )`:a?`textureGather( ${o}${t}, ${t}_sampler, ${n}, ${a} )`:`textureGather( ${o}${t}, ${t}_sampler, ${n})`}generateTextureGatherCompare(e,t,n,r,i,a){return i?a?`textureGatherCompare( ${t}, ${t}_sampler, ${n}, ${i}, ${r}, ${a} )`:`textureGatherCompare( ${t}, ${t}_sampler, ${n}, ${i}, ${r})`:a?`textureGatherCompare( ${t}, ${t}_sampler, ${n}, ${r}, ${a} )`:`textureGatherCompare( ${t}, ${t}_sampler, ${n}, ${r})`}generateTextureLevel(e,t,n,r,i,a){return this.isUnfilterable(e)===!1?i?a?`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${i}, ${r}, ${a} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${i}, ${r} )`:a?`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${r}, ${a} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${n}, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,n,a,r,i):this.generateTextureLod(e,t,n,i,a,r)}generateTextureBias(e,t,n,r,i,a,o=this.shaderStage){if(o===`fragment`)return i?a?`textureSampleBias( ${t}, ${t}_sampler, ${n}, ${Line truncated
${n.vars}
${n.code}
`;return n.result&&(i+=`\treturn ${n.result};\n`),i+=`
}
`,i}getInstanceIndex(){return this.shaderStage===`vertex`?this.getBuiltin(`instance_index`,`instanceIndex`,`u32`,`attribute`):`instanceIndex`}getInvocationLocalIndex(){return this.getBuiltin(`local_invocation_index`,`invocationLocalIndex`,`u32`,`attribute`)}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin(`subgroup_size`,`subgroupSize`,`u32`,`attribute`)}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin(`subgroup_invocation_id`,`invocationSubgroupIndex`,`u32`,`attribute`)}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin(`subgroup_id`,`subgroupIndex`,`u32`,`attribute`)}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin(`front_facing`,`isFront`,`bool`)}getFragCoord(){return this.getBuiltin(`position`,`fragCoord`,`vec4<f32>`)+`.xy`}getFragDepth(){return`output.`+this.getBuiltin(`frag_depth`,`depth`,`f32`,`output`)}getClipDistance(){return`varyings.hw_clip_distances`}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){let t=[],n=this.directives[e];if(n!==void 0)for(let e of n)t.push(`enable ${e};`);return t.join(`
`)}enableSubGroups(){this.enableDirective(`subgroups`)}enableSubgroupsF16(){this.enableDirective(`subgroups-f16`)}enableClipDistances(){this.enableDirective(`clip_distances`)}enableShaderF16(){this.enableDirective(`f16`)}enableDualSourceBlending(){this.enableDirective(`dual_source_blending`)}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin(`clip_distances`,`hw_clip_distances`,`array<f32, ${e} >`,`vertex`)}getBuiltins(e){let t=[],n=this.builtins[e];if(n!==void 0)for(let{name:e,property:r,type:i}of n.values())t.push(`@builtin( ${e} ) ${r} : ${i}`);return t.join(`,
`)}getScopedArray(e,t,n,r){return this.scopedArrays.has(e)===!1&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:n,bufferCount:r}),e}getScopedArrays(e){if(e!==`compute`)return;let t=[];for(let{name:e,scope:n,bufferType:r,bufferCount:i}of this.scopedArrays.values()){let a=this.getType(r);t.push(`var<${n}> ${e}: array< ${a}, ${i} >;`)}return t.join(`
`)}getAttributes(e){let t=[];if(e===`compute`&&(this.getBuiltin(`global_invocation_id`,`globalId`,`vec3<u32>`,`attribute`),this.getBuiltin(`workgroup_id`,`workgroupId`,`vec3<u32>`,`attribute`),this.getBuiltin(`local_invocation_id`,`localId`,`vec3<u32>`,`attribute`),this.getBuiltin(`num_workgroups`,`numWorkgroups`,`vec3<u32>`,`attribute`),this.renderer.hasFeature(`subgroups`)&&(this.enableDirective(`subgroups`,e),this.getBuiltin(`subgroup_size`,`subgroupSize`,`u32`,`attribute`))),e===`vertex`||e===`compute`){let e=this.getBuiltins(`attribute`);e&&t.push(e);let n=this.getAttributesArray();for(let e=0,r=n.length;e<r;e++){let r=n[e],i=r.name,a=this.getType(r.type);t.push(`@location( ${e} ) ${i} : ${a}`)}}return t.join(`,
`)}getStructMembers(e){let t=[];for(let n of e.members){let r=e.output?`@location( `+n.index+` ) `:``,i=this.getType(n.type);n.atomic&&(i=`atomic< `+i+` >`),t.push(`\t${r+n.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins(`output`)}`),t.join(`,
`)}getStructs(e){let t=``,n=this.structs[e];if(n.length>0){let e=[];for(let t of n){let n=`struct ${t.name} {\n`;n+=this.getStructMembers(t),n+=`
};`,e.push(n)}t=`
`+e.join(`
`)+`
`}return t}getVar(e,t,n=null,r=``){let i=`var${r} ${t} : `;return n===null?i+=this.getType(e):i+=this.generateArrayDeclaration(e,n),i}getVars(e,t=!1){let n=``;t&&(n=`<private>`);let r=[],i=this.vars[e];if(i!==void 0)for(let e of i)r.push(`${this.getVar(e.type,e.name,e.count,n)};`);return t?r.join(`
`):`\n\t${r.join(`
`)}\n`}getVaryings(e){let t=[];if(e===`vertex`&&this.getBuiltin(`position`,`builtinClipSpace`,`vec4<f32>`,`vertex`),e===`vertex`||e===`fragment`){let n=this.varyings,r=this.vars[e],i=0;for(let a=0;a<n.length;a++){let o=n[a];if(o.needsInterpolation){let e=`@location( ${i++} )`;if(o.interpolationType){let t=o.interpolationSampling===null?` )`:`, ${o.interpolationSampling} )`;e+=` @interpolate( ${o.interpolationType}${t}`}else/^(int|uint|ivec|uvec)/.test(o.type)&&(e+=` @interpolate(flat, either)`);t.push(`${e} ${o.name} : ${this.getType(o.type)}`)}else e===`vertex`&&r.includes(o)===!1&&r.push(o)}}let n=this.getBuiltins(e);n&&t.push(n);let r=t.join(`,
`);return e===`vertex`?this._getWGSLStruct(`VaryingsStruct`,` `+r):r}isCustomStruct(e){let t=e.value,n=e.node,r=(t.isBufferAttribute||t.isInstancedBufferAttribute)&&n.structTypeNode!==null,i=n.value&&n.value.array&&typeof n.value.itemSize==`number`&&n.value.array.length>n.value.itemSize;return r&&!i}getUniforms(e){let t=this.renderer.backend,n=this.uniforms[e],r=[],i=[],a=[],o={};for(let a of n){let n=a.groupNode.name,s=this.bindingsIndexes[n];if(a.type===`texture`||a.type===`cubeTexture`||a.type===`cubeDepthTexture`||a.type===`storageTexture`||a.type===`texture3D`){let n=a.node,i=n.value;(i.isCubeTexture===!0||this.isUnfilterable(i)===!1&&n.isStorageTextureNode!==!0||n.gatherNode!==null)&&(this.isSampleCompare(i)&&n.compareNode!==null?r.push(`@binding( ${s.binding++} ) @group( ${s.group} ) var ${a.name}_sampler : sampler_comparison;`):r.push(`@binding( ${s.binding++} ) @group( ${s.group} ) var ${a.name}_sampler : sampler;`));let o,c=``,{primarySamples:l}=t.utils.getTextureSampleData(i);if(l>1&&(c=`_multisampled`),i.isCubeTexture===!0&&i.isDepthTexture===!0)o=`texture_depth_cube`;else if(i.isCubeTexture===!0)o=`texture_cube<f32>`;else if(i.isDepthTexture===!0)o=t.compatibilityMode&&i.compareFunction===null?`texture${c}_2d<f32>`:`texture_depth${c}_2d${i.isArrayTexture===!0?`_array`:``}`;else if(a.node.isStorageTextureNode===!0){let n=fN(i,t.device),r=this.getStorageAccess(a.node,e),s=a.node.value.is3DTexture,c=a.node.value.isArrayTexture;o=`texture_storage_${s?`3d`:`2d${c?`_array`:``}`}<${n}, ${r}>`}else if(i.isArrayTexture===!0||i.isDataArrayTexture===!0||i.isCompressedArrayTexture===!0)o=`texture_2d_array<f32>`;else if(i.is3DTexture===!0||i.isData3DTexture===!0)o=`texture_3d<f32>`;else{let e=this.getComponentTypeFromTexture(i).charAt(0);o=`texture${c}_2d<${e}32>`}r.push(`@binding( ${s.binding++} ) @group( ${s.group} ) var ${a.name} : ${o};`)}else if(a.type===`buffer`||a.type===`storageBuffer`||a.type===`indirectStorageBuffer`){let t=a.node,n=this.getType(t.getNodeType(this)),r=t.bufferCount,o=r>0&&a.type===`buffer`?`, `+r:``,c=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:`uniform`;if(this.isCustomStruct(a))i.push(`@binding( ${s.binding++} ) @group( ${s.group} ) var<${c}> ${a.name} : ${n};`);else{let e=`\tvalue : array< ${t.isAtomic?`atomic<${n}>`:`${n}`}${o} >`;i.push(this._getWGSLStructBinding(a.name,e,c,s.binding++,s.group))}}else{let e=a.groupNode.name;if(o[e]===void 0){let t=this.uniformGroups[e];if(t!==void 0){let n=[];for(let e of t.uniforms){let t=e.getType(),r=this.getType(this.getVectorType(t));n.push(`\t${e.name} : ${r}`)}let r=this.uniformGroupsBindings[e];r===void 0&&(r={index:s.binding++,id:s.group},this.uniformGroupsBindings[e]=r),o[e]={index:r.index,id:r.id,snippets:n}}}}}for(let e in o){let t=o[e];a.push(this._getWGSLStructBinding(e,t.snippets.join(`,
`),`uniform`,t.index,t.id))}return[...r,...i,...a].join(`
`)}buildCode(){let e=this.material===null?{compute:{}}:{fragment:{},vertex:{}};this.sortBindingGroups();for(let t in e){this.shaderStage=t;let n=this.allowGlobalVariables,r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t,n),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let i=`// code
`;i+=this.flowCode[t];let a=this.flowNodes[t],o=a[a.length-1],s=o.outputNode,c=s!==void 0&&s.isOutputStructNode===!0;for(let e of a){let n=this.getFlowData(e),a=e.name;if(a&&(i.length>0&&(i+=`
`),i+=`\t// flow -> ${a}\n`),i+=`${n.code}\n\t`,e===o&&t!==`compute`){if(i+=`// result
`,t===`vertex`)i+=`varyings.builtinClipSpace = ${n.result};`;else if(t===`fragment`)if(c)r.returnType=s.getNodeType(this),r.structs+=`var<private> output : `+r.returnType+`;`,i+=`return ${n.result};`;else{let e=`\t@location( 0 ) color: ${this.getType(this.getOutputType())}`,t=this.getBuiltins(`output`);t&&(e+=`,
`+t),r.returnType=`OutputStruct`,r.structs+=this._getWGSLStruct(`OutputStruct`,e),r.structs+=`
var<private> output : OutputStruct;`,i+=`output.color = ${this.format(n.result,o.getNodeType(this),this.getOutputType())};\n\n\treturn output;`}}}r.flow=i}if(this.shaderStage=null,this.material!==null)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{let t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let n;return t!==null&&(n=this._getWGSLMethod(e+`_`+t)),n===void 0&&(n=this._getWGSLMethod(e)),n||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,n){return`select( ${n}, ${t}, ${e} )`}getType(e){return wN[e]||e}isAvailable(e){let t=SN[e];return t===void 0&&(e===`float32Filterable`?t=this.renderer.hasFeature(`float32-filterable`):e===`clipDistance`&&(t=this.renderer.hasFeature(`clip-distances`)),SN[e]=t),t}_getWGSLMethod(e){return EN[e]!==void 0&&this._include(e),DN[e]}_include(e){let t=EN[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}
// directives
${e.directives}
// structs
${e.structs}
// uniforms
${e.uniforms}
// varyings
${e.varyings}
var<private> varyings : VaryingsStruct;
// vars
${e.vars}
// codes
${e.codes}
@vertex
fn main( ${e.attributes} ) -> VaryingsStruct {
// flow
${e.flow}
return varyings;
}
`}_getWGSLFragmentCode(e){return`${this.getSignature()}
// global
${ON}
// structs
${e.structs}
// uniforms
${e.uniforms}
// vars
${e.vars}
// codes
${e.codes}
@fragment
fn main( ${e.varyings} ) -> ${e.returnType} {
// flow
${e.flow}
}
`}_getWGSLComputeCode(e,t){let[n,r,i]=t;return`${this.getSignature()}
// directives
${e.directives}
// system
var<private> instanceIndex : u32;
// locals
${e.scopedArrays}
// structs
${e.structs}
// uniforms
${e.uniforms}
// vars
${this.allowGlobalVariables?e.vars:``}
// codes
${e.codes}
@compute @workgroup_size( ${n}, ${r}, ${i} )
fn main( ${e.attributes} ) {
// local vars
${this.allowGlobalVariables?``:e.vars}
// system
instanceIndex = globalId.x
+ globalId.y * ( ${n} * numWorkgroups.x )
+ globalId.z * ( ${n} * numWorkgroups.x ) * ( ${r} * numWorkgroups.y );
// flow
${e.flow}
}
`}_getWGSLStruct(e,t){return`
struct ${e} {
${t}
};`}_getWGSLStructBinding(e,t,n,r=0,i=0){let a=e+`Struct`;return`${this._getWGSLStruct(a,t)}
@binding( ${r} ) @group( ${i} )
var<${n}> ${e} : ${a};`}},AN=new wM,jN=new TM,MN=new Map([[Int8Array,[`sint8`,`snorm8`]],[Uint8Array,[`uint8`,`unorm8`]],[Int16Array,[`sint16`,`snorm16`]],[Uint16Array,[`uint16`,`unorm16`]],[Int32Array,[`sint32`,`snorm32`]],[Uint32Array,[`uint32`,`unorm32`]],[Float32Array,[`float32`]]]);typeof Float16Array<`u`&&MN.set(Float16Array,[`float16`]);var NN=new Map([[Gr,[`float16`]]]),PN=new Map([[Int32Array,`sint32`],[Int16Array,`sint32`],[Uint32Array,`uint32`],[Uint16Array,`uint32`],[Float32Array,`float32`]]),FN=class{constructor(e){this.backend=e}createAttribute(e,t){let n=this._getBufferAttribute(e),r=this.backend,i=r.get(n),a=i.buffer;if(a===void 0){let o=r.device,s=n.array;if(e.normalized===!1){if(s.constructor===Int16Array||s.constructor===Int8Array)s=new Int32Array(s);else if((s.constructor===Uint16Array||s.constructor===Uint8Array)&&(s=new Uint32Array(s),t&GPUBufferUsage.INDEX))for(let e=0;e<s.length;e++)s[e]===65535&&(s[e]=4294967295)}n.array=s;let c;if((n.isStorageBufferAttribute||n.isStorageInstancedBufferAttribute)&&n.itemSize===3)c=4;else if(n.itemSize>1&&n.itemSize*s.BYTES_PER_ELEMENT%4!=0){let e=n.itemSize*s.BYTES_PER_ELEMENT;c=Math.floor((e+3)/4)*4/s.BYTES_PER_ELEMENT}if(c!==void 0){let e=n.itemSize,t=new s.constructor(n.count*c);for(let r=0;r<n.count;r++)t.set(s.subarray(r*e,r*e+e),r*c);(n.isStorageBufferAttribute||n.isStorageInstancedBufferAttribute)&&(n.itemSize=c,n.array=t),s=t,i._itemSize=e,i._paddedItemSize=c}let l=s.byteLength,u=l+(4-l%4)%4;AN.label=n.name,AN.size=u,AN.usage=t,AN.mappedAtCreation=!0,a=o.createBuffer(AN),AN.reset(),new s.constructor(a.getMappedRange()).set(s),a.unmap(),i.buffer=a}}updateAttribute(e){let t=this._getBufferAttribute(e),n=this.backend,r=n.device,i=n.get(t),a=n.get(t).buffer,o=t.array,s=i._itemSize,c=i._paddedItemSize;if(c!==void 0){o=new o.constructor(t.count*c);for(let e=0;e<t.count;e++)o.set(t.array.subarray(e*s,e*s+s),e*c);(t.isStorageBufferAttribute||t.isStorageInstancedBufferAttribute)&&(t.array=o)}let l=t.updateRanges;if(l.length===0)r.queue.writeBuffer(a,0,o,0);else{let e=yt(o),n=e?1:o.BYTES_PER_ELEMENT;for(let t=0,i=l.length;t<i;t++){let i=l[t],u,d;if(c!==void 0){let e=Math.floor(i.start/s),t=Math.ceil((i.start+i.count)/s)-e;u=e*c*n,d=t*c*n}else u=i.start*n,d=i.count*n;let f=u*(e?o.BYTES_PER_ELEMENT:1);r.queue.writeBuffer(a,f,o,u,d)}t.clearUpdateRanges()}}createShaderVertexBuffers(e){let t=e.getAttributes(),n=new Map;for(let e=0;e<t.length;e++){let r=t[e],i=r.array.BYTES_PER_ELEMENT,a=this._getBufferAttribute(r),o=n.get(a);if(o===void 0){let e,t;r.isInterleavedBufferAttribute===!0?(e=r.data.stride*i,t=r.data.isInstancedInterleavedBuffer?pM.Instance:pM.Vertex):(e=r.itemSize*i,t=r.isInstancedBufferAttribute?pM.Instance:pM.Vertex,r.itemSize>1&&e%4!=0&&(e=Math.floor((e+3)/4)*4)),r.normalized===!1&&(r.array.constructor===Int16Array||r.array.constructor===Uint16Array)&&(e=4),o={arrayStride:e,attributes:[],stepMode:t},n.set(a,o)}let s=this._getVertexFormat(r),c=r.isInterleavedBufferAttribute===!0?r.offset*i:0;o.attributes.push({shaderLocation:e,offset:c,format:s})}return Array.from(n.values())}destroyAttribute(e){let t=this.backend;t.get(this._getBufferAttribute(e)).buffer.destroy(),t.delete(e)}async getArrayBufferAsync(e,t=null,n=0,r=-1){let i=this.backend,a=i.device,o=i.get(this._getBufferAttribute(e)).buffer,s=r===-1?o.size-n:r,c;if(t!==null&&t.isReadbackBuffer){let e=i.get(t);if(t._mapped===!0)throw Error(`THREE.WebGPUAttributeUtils: ReadbackBuffer must be released before being used again.`);if(t._mapped=!0,e.readBufferGPU===void 0){AN.label=`${t.name}_readback`,AN.size=t.maxByteLength,AN.usage=GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,c=a.createBuffer(AN),AN.reset();let n=()=>{t.buffer=null,t._mapped=!1,c.unmap()},r=()=>{t.buffer=null,t._mapped=!1,c.destroy(),i.delete(t),t.removeEventListener(`release`,n),t.removeEventListener(`dispose`,r)};t.addEventListener(`release`,n),t.addEventListener(`dispose`,r),e.readBufferGPU=c}else c=e.readBufferGPU}else AN.label=`${e.name}_readback`,AN.size=s,AN.usage=GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,c=a.createBuffer(AN),AN.reset();jN.label=`readback_encoder_${e.name}`;let l=a.createCommandEncoder(jN);if(jN.reset(),l.copyBufferToBuffer(o,n,c,0,s),SM(a,l.finish()),await c.mapAsync(GPUMapMode.READ,0,s),t===null){let e=c.getMappedRange(0,s).slice();return c.destroy(),e}else if(t.isReadbackBuffer)return t.buffer=c.getMappedRange(0,s),t;else{let e=c.getMappedRange(0,s);return new Uint8Array(t).set(new Uint8Array(e)),c.destroy(),t}}_getVertexFormat(e){let{itemSize:t,normalized:n}=e,r=e.array.constructor,i=e.constructor,a;if(t===1)a=PN.get(r);else{let e=(NN.get(i)||MN.get(r))[+!!n];if(e){let n=r.BYTES_PER_ELEMENT*t,i=Math.floor((n+3)/4)*4/r.BYTES_PER_ELEMENT;if(i%1)throw Error(`THREE.WebGPUAttributeUtils: Bad vertex format item size.`);a=`${e}x${i}`}}return a||E(`WebGPUAttributeUtils: Vertex format not supported yet.`),a}_getBufferAttribute(e){return e.isInterleavedBufferAttribute&&(e=e.data),e}},IN=new CM,LN=new Line truncated
`);for(let r of e.messages){let e=r.lineNum>0?` at line ${r.lineNum}${r.linePos>0?`:${r.linePos}`:``}`:``,a=`WebGPURenderer [${t} / ${n.stage} ${r.type}]${e}: ${r.message}`,o=``;r.lineNum>0&&r.lineNum<=i.length&&(o=`\n ${i[r.lineNum-1]}`,r.linePos>0&&(o+=`\n ${` `.repeat(r.linePos-1)}^`)),(r.type===`error`?E:T)(a+o)}}}_getBlending(e){let t,n,r=e.blending,i=e.blendSrc,a=e.blendDst,o=e.blendEquation;if(r===5){let r=e.blendSrcAlpha===null?i:e.blendSrcAlpha,s=e.blendDstAlpha===null?a:e.blendDstAlpha,c=e.blendEquationAlpha===null?o:e.blendEquationAlpha;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(o)},n={srcFactor:this._getBlendFactor(r),dstFactor:this._getBlendFactor(s),operation:this._getBlendOperation(c)}}else{let i=e.premultipliedAlpha,a=(e,r,i,a)=>{t={srcFactor:e,dstFactor:r,operation:rM.Add},n={srcFactor:i,dstFactor:a,operation:rM.Add}};if(i)switch(r){case 1:a(nM.One,nM.OneMinusSrcAlpha,nM.One,nM.OneMinusSrcAlpha);break;case 2:a(nM.One,nM.One,nM.One,nM.One);break;case 3:a(nM.Zero,nM.OneMinusSrc,nM.Zero,nM.One);break;case 4:a(nM.Dst,nM.OneMinusSrcAlpha,nM.Zero,nM.One);break}else switch(r){case 1:a(nM.SrcAlpha,nM.OneMinusSrcAlpha,nM.One,nM.OneMinusSrcAlpha);break;case 2:a(nM.SrcAlpha,nM.One,nM.One,nM.One);break;case 3:E(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?`material`:`blendMode`}.premultipliedAlpha = true".`);break;case 4:E(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?`material`:`blendMode`}.premultipliedAlpha = true".`);break}}if(t!==void 0&&n!==void 0)return{color:t,alpha:n};E(`WebGPURenderer: Invalid blending: `,r)}_getBlendFactor(e){let t;switch(e){case 200:t=nM.Zero;break;case 201:t=nM.One;break;case 202:t=nM.Src;break;case 203:t=nM.OneMinusSrc;break;case 204:t=nM.SrcAlpha;break;case 205:t=nM.OneMinusSrcAlpha;break;case 208:t=nM.Dst;break;case 209:t=nM.OneMinusDst;break;case 206:t=nM.DstAlpha;break;case 207:t=nM.OneMinusDstAlpha;break;case 210:t=nM.SrcAlphaSaturated;break;case Xx:t=nM.Constant;break;case Zx:t=nM.OneMinusConstant;break;default:E(`WebGPURenderer: Blend factor not supported.`,e)}return t}_getStencilCompare(e){let t,n=e.stencilFunc;switch(n){case 512:t=Jj.Never;break;case 519:t=Jj.Always;break;case 513:t=Jj.Less;break;case 515:t=Jj.LessEqual;break;case 514:t=Jj.Equal;break;case 518:t=Jj.GreaterEqual;break;case 516:t=Jj.Greater;break;case 517:t=Jj.NotEqual;break;default:E(`WebGPURenderer: Invalid stencil function.`,n)}return t}_getStencilOperation(e){let t;switch(e){case at:t=aM.Keep;break;case 0:t=aM.Zero;break;case ot:t=aM.Replace;break;case dt:t=aM.Invert;break;case st:t=aM.IncrementClamp;break;case ct:t=aM.DecrementClamp;break;case lt:t=aM.IncrementWrap;break;case ut:t=aM.DecrementWrap;break;default:E(`WebGPURenderer: Invalid stencil operation.`,t)}return t}_getBlendOperation(e){let t;switch(e){case 100:t=rM.Add;break;case 101:t=rM.Subtract;break;case 102:t=rM.ReverseSubtract;break;case 103:t=rM.Min;break;case 104:t=rM.Max;break;default:E(`WebGPUPipelineUtils: Blend equation not supported.`,e)}return t}_getPrimitiveState(e,t,n){let r={};r.topology=this.backend.utils.getPrimitiveTopology(e,n),t.index!==null&&e.isLine===!0&&e.isLineSegments!==!0&&(r.stripIndexFormat=t.index.array instanceof Uint16Array?$j.Uint16:$j.Uint32);let i=n.side===1;return e.isMesh&&e.matrixWorld.determinantAffine()<0&&(i=!i),r.frontFace=i===!0?Zj.CW:Zj.CCW,r.cullMode=n.side===2?Qj.None:Qj.Back,r}_getColorWriteMask(e){return e.colorWrite===!0?iM.All:iM.None}_getDepthCompare(e){let t;if(e.depthTest===!1)t=Jj.Always;else{let n=this.backend.parameters.reversedDepthBuffer?Dt[e.depthFunc]:e.depthFunc;switch(n){case 0:t=Jj.Never;break;case 1:t=Jj.Always;break;case 2:t=Jj.Less;break;case 3:t=Jj.LessEqual;break;case 4:t=Jj.Equal;break;case 5:t=Jj.GreaterEqual;break;case 6:t=Jj.Greater;break;case 7:t=Jj.NotEqual;break;default:E(`WebGPUPipelineUtils: Invalid depth function.`,n)}}return t}},YN=class{constructor(){this.label=``,this.type=void 0,this.count=0}reset(){this.label=``,this.type=void 0,this.count=0}},XN=new wM,ZN=new TM,QN=new YN,$N=class extends Uj{constructor(e,t,n=2048){super(n),this.device=e,this.type=t,QN.label=`queryset_global_timestamp_${t}`,QN.type=`timestamp`,QN.count=this.maxQueries,this.querySet=this.device.createQuerySet(QN),QN.reset();let r=this.maxQueries*8;XN.label=`buffer_timestamp_resolve_${t}`,XN.size=r,XN.usage=GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC,this.resolveBuffer=this.device.createBuffer(XN),XN.reset(),XN.label=`buffer_timestamp_result_${t}`,XN.size=r,XN.usage=GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,this.resultBuffer=this.device.createBuffer(XN),XN.reset()}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return Tt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THLine truncated
Binary file not shown.

Before

Width:  |  Height:  |  Size: 391 KiB

@@ -1 +0,0 @@
(function(){var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=`manifests`,u=`chunks`,d=256*1024,f;var p=class extends Error{code;constructor(e,t){super(`GeoIP chunk store ${e} error`,t),this.code=e}};let m=()=>{if(f)return f;let e=new Promise((t,n)=>{let r=indexedDB.open(`zashboard-geoip`,2),i=!1;r.onupgradeneeded=()=>{r.result.objectStoreNames.contains(`mmdb`)&&r.result.deleteObjectStore(`mmdb`),r.result.objectStoreNames.contains(l)||r.result.createObjectStore(l),r.result.objectStoreNames.contains(u)||r.result.createObjectStore(u)},r.onsuccess=()=>{let n=r.result;if(i){n.close();return}i=!0;let a=()=>{f===e&&(f=void 0)};n.onversionchange=()=>{n.close(),a()},n.onclose=a,t(n)},r.onerror=()=>{i||(i=!0,f===e&&(f=void 0),n(r.error))},r.onblocked=()=>{i||(i=!0,f===e&&(f=void 0),n(new p(`storage`)))}});return f=e,e},h=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return Number.isSafeInteger(t.chunkCount)&&t.chunkCount>0&&t.chunkSize===262144&&typeof t.generation==`string`&&t.generation.length>0&&Number.isSafeInteger(t.size)&&t.size>0&&Math.ceil(t.size/t.chunkSize)===t.chunkCount&&Number.isFinite(t.updatedAt)},g=new Set,_=new Set,v=async e=>{let t=await m(),n=await new Promise((n,r)=>{let i=t.transaction(l,`readonly`).objectStore(l).get(e);i.onsuccess=()=>n(h(i.result)?i.result:void 0),i.onerror=()=>r(i.error)});return n&&!_.has(e)&&(_.add(e),x(e,n.generation,n.previousGeneration).catch(()=>_.delete(e))),n},y=async(e,t,n,r)=>{let i=await m();return new Promise((a,o)=>{let s=i.transaction(u,`readwrite`),c=s.objectStore(u);r.forEach((r,i)=>{c.put(r.buffer,[e,t,n+i])}),s.oncomplete=()=>a(),s.onerror=()=>o(s.error),s.onabort=()=>o(s.error)})},ee=async(e,t,n)=>{let r=await m();return new Promise((i,a)=>{let o=r.transaction(u,`readonly`).objectStore(u).get([e,t,n]);o.onsuccess=()=>{let e=o.result;if(!(e instanceof ArrayBuffer)){a(Error(`Missing GeoIP database chunk ${n}`));return}i(new Uint8Array(e))},o.onerror=()=>a(o.error)})},b=async(e,t)=>{let n=await m();return new Promise((r,i)=>{let a=n.transaction(u,`readwrite`),o=IDBKeyRange.bound([e,t,0],[e,t,2**53-1]);a.objectStore(u).delete(o),a.oncomplete=()=>r(),a.onerror=()=>i(a.error),a.onabort=()=>i(a.error)})},x=async(e,t,n)=>{let r=await m();return new Promise((i,a)=>{let o=r.transaction(u,`readwrite`),s=o.objectStore(u).openKeyCursor(IDBKeyRange.bound([e,``],[e,`￿`]));s.onsuccess=()=>{let e=s.result;if(!e)return;let r=e.primaryKey;r[1]!==t&&r[1]!==n&&!g.has(r[1])&&e.delete(),e.continue()},o.oncomplete=()=>i(),o.onerror=()=>a(o.error),o.onabort=()=>a(o.error)})};var S=class{key;manifest;memoryChunkCacheMax;size;chunks=new Map;constructor(e,t,n){this.key=e,this.manifest=t,this.memoryChunkCacheMax=n,this.size=t.size}async read(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<0||t<0)throw Error(`Invalid GeoIP database byte range`);if(e+t>this.size)throw Error(`GeoIP database byte range is out of bounds`);if(t===0)return new Uint8Array;let n=Math.floor(e/this.manifest.chunkSize),r=Math.floor((e+t-1)/this.manifest.chunkSize);if(n===r){let r=await this.loadChunk(n),i=e-n*this.manifest.chunkSize;return r.subarray(i,i+t)}let i=new Uint8Array(t),a=0;for(let o=n;o<=r;o++){let n=await this.loadChunk(o),r=o*this.manifest.chunkSize,s=Math.max(e,r)-r,c=Math.min(e+t,r+n.length)-r;i.set(n.subarray(s,c),a),a+=c-s}if(a!==t)throw Error(`Incomplete GeoIP database byte range`);return i}loadChunk(e){if(e<0||e>=this.manifest.chunkCount)return Promise.reject(Error(`Invalid GeoIP database chunk ${e}`));let t=this.chunks.get(e);if(t)return this.chunks.delete(e),this.chunks.set(e,t),t;let n=ee(this.key,this.manifest.generation,e).catch(t=>{throw this.chunks.delete(e),t});for(this.chunks.set(e,n);this.chunks.size>this.memoryChunkCacheMax;){let e=this.chunks.keys().next().value;if(e===void 0)break;this.chunks.delete(e)}return n}};let C={getManifest:v,createSource(e,t,n=8){return new S(e,t,n)},async stageStream(e,t,n={}){let r=globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;g.add(r);let i=t.getReader(),a=new Uint8Array(d),o=0,s=0,c=0,l=[],u=0,f=async()=>{if(l.length!==0){try{await y(e,r,u,l)}catch(e){throw new p(`storage`,{cause:e})}l=[]}},m=async e=>{l.length===0&&(u=s),l.push(e),s++,l.length>=8&&await f()};try{for(;;){let e;try{e=await i.read()}catch(e){throw new p(`stream`,{cause:e})}if(e.done)break;c+=e.value.byteLength;let t=0;for(;t<e.value.byteLength;){let n=Math.min(a.byteLength-o,e.value.byteLength-t);a.set(e.value.subarray(t,t+n),o),o+=n,Line truncated
@@ -1,165 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./EarthGlobeCard-DhFkBz8U.js","./palette-DPyxzM37.js","./EarthGlobeCard-DQPfbIzt.css"])))=>i.map(i=>d[i]);
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},s=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),c=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},l=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},u=(n,r,a)=>(a=n==null?{}:e(i(n)),l(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),d=e=>a.call(e,`module.exports`)?e[`module.exports`]:l(t({},`__esModule`,{value:!0}),e);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var f=c({EMPTY_ARR:()=>ee,EMPTY_OBJ:()=>M,NO:()=>ne,NOOP:()=>te,PatchFlagNames:()=>Be,PatchFlags:()=>ze,ShapeFlags:()=>Ve,SlotFlags:()=>He,camelize:()=>Ee,capitalize:()=>ke,cssVarNameEscapeSymbolsRE:()=>ht,def:()=>Ne,escapeHtml:()=>T,escapeHtmlComment:()=>E,extend:()=>ie,genCacheKey:()=>h,genPropsAccessExp:()=>m,generateCodeFrame:()=>g,getEscapedCssVarName:()=>D,getGlobalThis:()=>Le,hasChanged:()=>je,hasOwn:()=>se,hyphenate:()=>Oe,includeBooleanAttr:()=>S,invokeArrayFns:()=>Me,isArray:()=>P,isBooleanAttr:()=>ot,isBuiltInDirective:()=>Ce,isDate:()=>ue,isFunction:()=>fe,isGloballyAllowed:()=>We,isGloballyWhitelisted:()=>Ge,isHTMLTag:()=>et,isIntegerKey:()=>xe,isKnownHtmlAttr:()=>ut,isKnownMathMLAttr:()=>ft,isKnownSvgAttr:()=>dt,isMap:()=>ce,isMathMLTag:()=>nt,isModelListener:()=>re,isObject:()=>he,isOn:()=>N,isPlainObject:()=>be,isPromise:()=>ge,isRegExp:()=>de,isRenderableAttrValue:()=>w,isReservedProp:()=>Se,isSSRSafeAttrName:()=>C,isSVGTag:()=>tt,isSet:()=>le,isSpecialBooleanAttr:()=>at,isString:()=>pe,isSymbol:()=>me,isVoidTag:()=>rt,looseEqual:()=>k,looseIndexOf:()=>A,looseToNumber:()=>Pe,makeMap:()=>p,normalizeClass:()=>b,normalizeCssVarValue:()=>j,normalizeProps:()=>x,normalizeStyle:()=>_,objectToString:()=>_e,parseStringStyle:()=>v,propsToAttrMap:()=>lt,remove:()=>ae,slotFlagsText:()=>Ue,stringifyStyle:()=>y,toDisplayString:()=>F,toHandlerKey:()=>Ae,toNumber:()=>Fe,toRawType:()=>ye,toTypeString:()=>ve});function p(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}function m(e){return Re.test(e)?`__props.${e}`:`__props[${JSON.stringify(e)}]`}function h(e,t){return e+JSON.stringify(t,(e,t)=>typeof t==`function`?t.toString():t)}function g(e,t=0,n=e.length){if(t=Math.max(0,Math.min(t,e.length)),n=Math.max(0,Math.min(n,e.length)),t>n)return``;let r=e.split(/(\r?\n)/),i=r.filter((e,t)=>t%2==1);r=r.filter((e,t)=>t%2==0);let a=0,o=[];for(let e=0;e<r.length;e++)if(a+=r[e].length+(i[e]&&i[e].length||0),a>=t){for(let s=e-Ke;s<=e+Ke||n>a;s++){if(s<0||s>=r.length)continue;let c=s+1;o.push(`${c}${` `.repeat(Math.max(3-String(c).length,0))}| ${r[s]}`);let l=r[s].length,u=i[s]&&i[s].length||0;if(s===e){let e=t-(a-(l+u)),r=Math.max(1,n>a?l-e:n-t);o.push(` | `+` `.repeat(e)+`^`.repeat(r))}else if(s>e){if(n>a){let e=Math.max(Math.min(n-a,l),1);o.push(` | `+`^`.repeat(e))}a+=l+u}}break}return o.join(`
`)}function _(e){if(P(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=pe(r)?v(r):_(r);if(i)for(let e in i)t[e]=i[e]}return t}else if(pe(e)||he(e))return e}function v(e){let t={};return e.replace(Ye,``).split(qe).forEach(e=>{if(e){let n=e.split(Je);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function y(e){if(!e)return``;if(pe(e))return e;let t=``;for(let n in e){let r=e[n];if(pe(r)||typeof r==`number`){let e=n.startsWith(`--`)?n:Oe(n);t+=`${e}:${r};`}}return t}function b(e){let t=``;if(pe(e))t=e;else if(P(e))for(let n=0;n<e.length;n++){let r=b(e[n]);r&&(t+=r+` `)}else if(he(e))for(let n in e)e[n]&&(t+=n+` `);return t.trim()}function x(e){if(!e)return null;let{class:t,style:n}=e;return t&&!pe(t)&&(e.class=b(t)),n&&(e.style=_(n)),e}function S(e){return!!e||e===``}function C(e){if(ct.hasOwnProperty(e))return ct[e];let t=st.test(e);return t&&console.error(`unsafe attribute name: ${e}`),ct[e]=!t}function w(e){if(e==null)return!1;let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function T(e){let t=``+e,n=pt.exec(t);if(!n)return t;let r=``,i,a,o=0;for(a=n.index;a<t.length;a++){switch(t.charCodeAt(a)){case 34:i=`&quot;`;break;case 38:i=`&amp;`;break;case 39:i=`&#39;`;break;case 60:i=`&lt;`;break;case 62:i=`&gt;`;break;default:continue}o!==a&&(r+=t.slice(o,a)),o=a+1,r+=i}return o===a?r:r+t.slice(o,a)}function E(e){let t;do t=e,e=e.replace(mt,``);while(e!==t);return e}function D(e,t){return e.replace(ht,e=>t?e===`"`?`\\\\\\"`:`\\\\${e}`:`\\${e}`)}function O(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=k(e[r],t[r]);return n}function k(e,t){if(e===t)return!0;let n=ue(e),r=ue(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=me(e),r=me(t),n||r)return e===t;if(n=P(e),r=P(t),n||r)return n&&r?O(e,t):!1;if(n=he(e),r=he(t),n||r){if(!n||!r||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e){let r=e.hasOwnProperty(n),i=t.hasOwnProperty(n);if(r&&!i||!r&&i||!k(e[n],t[n]))return!1}}return String(e)===String(t)}function A(e,t){return e.findIndex(e=>k(e,t))}function j(e){return e==null?`initial`:typeof e==`string`?e===``?` `:e:String(e)}var M,ee,te,ne,N,re,ie,ae,oe,se,P,ce,le,ue,de,fe,pe,me,he,ge,_e,ve,ye,be,xe,Se,Ce,we,Te,Ee,De,Oe,ke,Ae,je,Me,Ne,Pe,Fe,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot,st,ct,lt,ut,dt,ft,pt,mt,ht,gt,F,_t,vt,yt=o((()=>{M={},ee=[],te=()=>{},ne=()=>!1,N=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),re=e=>e.startsWith(`onUpdate:`),ie=Object.assign,ae=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},oe=Object.prototype.hasOwnProperty,se=(e,t)=>oe.call(e,t),P=Array.isArray,ce=e=>ve(e)===`[object Map]`,le=e=>ve(e)===`[object Set]`,ue=e=>ve(e)===`[object Date]`,de=e=>ve(e)===`[object RegExp]`,fe=e=>typeof e==`function`,pe=e=>typeof e==`string`,me=e=>typeof e==`symbol`,he=e=>typeof e==`object`&&!!e,ge=e=>(he(e)||fe(e))&&fe(e.then)&&fe(e.catch),_e=Object.prototype.toString,ve=e=>_e.call(e),ye=e=>ve(e).slice(8,-1),be=e=>ve(e)===`[object Object]`,xe=e=>pe(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,Se=p(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),Ce=p(`bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo`),we=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Te=/-\w/g,Ee=we(e=>e.replace(Te,e=>e.slice(1).toUpperCase())),De=/\B([A-Z])/g,Oe=we(e=>e.replace(De,`-$1`).toLowerCase()),ke=we(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ae=we(e=>e?`on${ke(e)}`:``),je=(e,t)=>!Object.is(e,t),Me=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},Ne=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Pe=e=>{let t=parseFloat(e);return isNaN(t)?e:t},Fe=e=>{let t=pe(e)?Number(e):NaN;return isNaN(t)?e:t},Le=()=>Ie||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{},Re=/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/,ze={TEXT:1,1:`TEXT`,CLASS:2,2:`CLASS`,STYLE:4,4:`STYLE`,PROPS:8,8:`PROPS`,FULL_PROPS:16,16:`FULL_PROPS`,NEED_HYDRATION:32,32:`NEED_HYDRATION`,STABLE_FRAGMENT:64,64:`STABLE_FRAGMENT`,KEYED_FRAGMENT:128,128:`KEYED_FRAGMENT`,UNKEYED_FRAGMENT:256,256:`UNKEYED_FRAGMENT`,NEED_PATCH:512,512:`NEED_PATCH`,DYNAMIC_SLOTS:1024,1024:`DYNAMIC_SLOTS`,DEV_ROOT_FRAGMENT:2048,2048:`DEV_ROOT_FRAGMENT`,CACHED:-1,"-1":`CACHED`,BAIL:-2,"-2":`BAIL`},Be={1:`TEXT`,2:`CLASS`,4:`STYLE`,8:`PROPS`,16:`FULL_PROPS`,32:`NEED_HYDRATION`,64:`STABLE_FRAGMENT`,128:`KEYED_FRAGMENT`,256:`UNKEYED_FRAGMENT`,512:`NEED_PATCH`,1024:`DYNAMIC_SLOTS`,2048:`DEV_ROOT_FRAGMENT`,[-1]:`CACHED`,[-2]:`BAIL`},Ve={ELEMENT:1,1:`ELEMENT`,FUNCTIONAL_COMPONENT:2,2:`FUNCTIONAL_COMPONENT`,STATEFUL_COMPONENT:4,4:`STATEFUL_COMPONENT`,TEXT_CHILDREN:8,8:`TEXT_CHILDREN`,ARRAY_CHILDREN:16,16:`ARRAY_CHILDREN`,SLOTS_CHILDREN:32,32:`SLOTS_CHILDREN`,TELEPORT:64,64:`TELEPORT`,SUSPENSE:128,128:`SUSPENSE`,COMPONENT_SHOULD Line truncated
`&&(e.tagName===`PRE`||e.tagName===`TEXTAREA`)&&(n=n.slice(1));let{textContent:r}=e;r!==n&&r!==n.replace(/\r\n|\r/g,`
`)&&(bi(e,0)||Ss(),e.textContent=t.children)}if(u){if(g||y||!o||d&48){let t=e.tagName.includes(`-`),i=e.namespaceURI.includes(`svg`)?`svg`:e.namespaceURI.includes(`MathML`)?`mathml`:void 0;for(let a in u)(g&&(a.endsWith(`value`)||a===`indeterminate`)||N(a)&&!Se(a)||a[0]===`.`||t&&!Se(a)||l&&l.includes(a))&&r(e,a,null,u[a],i,n)}else if(u.onClick)r(e,`onClick`,null,u.onClick,void 0,n);else if(d&4&&sn(u.style))for(let e in u.style)u.style[e]}let b;(b=u&&u.onVnodeBeforeMount)&&Co(b,n,t),m&&Gr(t,null,n,`beforeMount`),((b=u&&u.onVnodeMounted)||m||c)&&io(()=>{b&&Co(b,n,t),c&&h.enter(e),m&&Gr(t,null,n,`mounted`)},i)}return e.nextSibling},p=(e,t,r,o,s,l,u)=>{u||=!!t.dynamicChildren;let f=t.children,p=f.length,m=!1;for(let t=0;t<p;t++){let h=u?f[t]:f[t]=yo(f[t]),g=h.type===Ec;e?(g&&!u&&t+1<p&&yo(f[t+1]).type===Ec&&(c(i(e.data.slice(h.children.length)),r,a(e)),e.data=h.children),e=d(e,h,o,s,l,u)):g&&!h.children?c(h.el=i(``),r):(m||(m=!0,bi(r,1)||Ss()),n(null,h,r,null,o,s,Ts(r),l))}return e},m=(e,t,n,r,i,s)=>{let{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);let d=o(e),f=p(a(e),t,d,n,r,i,s);return f&&Es(f)&&f.data===`]`?a(t.anchor=f):(Ss(),c(t.anchor=l(`]`),d,f),f)},h=(e,t,r,i,c,l)=>{if(Si(e,t)||Ss(),t.el=null,l){let t=g(e);for(;;){let n=a(e);if(n&&n!==t)s(n);else break}}let u=a(e),d=o(e);return s(e),n(null,t,d,u,r,i,Ts(d),c),r&&(r.vnode.el=t.el,Na(r,t.el)),u},g=(e,t=`[`,n=`]`)=>{let r=0;for(;e;)if(e=a(e),e&&Es(e)&&(e.data===t&&r++,e.data===n)){if(r===0)return a(e);r--}return e},_=(e,t,n)=>{let r=t.parentNode;r&&r.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},v=e=>e.nodeType===1&&e.tagName===`TEMPLATE`;return[u,d]}function bi(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Ds);)e=e.parentElement;return xi(e&&e.getAttribute(Ds),t)}function xi(e,t){if(e==null)return!1;if(e===``)return!0;{let n=e.split(`,`);return t===0&&n.includes(`children`)?!0:n.includes(Os[t])}}function Si(e,t){return bi(e.parentElement,1)||Ci(e)||wi(t)}function Ci(e){return e.nodeType===1&&xi(e.getAttribute(Ds),1)}function wi({props:e}){let t=e&&e[Ds];return typeof t==`string`&&xi(t,1)}function Ti(e){let{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:a,innerWidth:o}=window;return(t>0&&t<a||r>0&&r<a)&&(n>0&&n<o||i>0&&i<o)}function Ei(e,t){if(Es(e)&&e.data===`[`){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Es(r))if(r.data===`]`){if(--n===0)break}else r.data===`[`&&n++;r=r.nextSibling}}else t(e)}function Di(e){fe(e)&&(e={loader:e});let{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:a,timeout:o,suspensible:s=!0,onError:c}=e,l=null,u,d=0,f=()=>(d++,l=null,p()),p=()=>{let e;return l||(e=l=t().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),c)return new Promise((t,n)=>{c(e,()=>t(f()),()=>n(e),d+1)});throw e}).then(t=>e!==l&&l?l:(t&&(t.__esModule||t[Symbol.toStringTag]===`Module`)&&(t=t.default),u=t,t)))};return V({name:`AsyncComponentWrapper`,__asyncLoader:p,__asyncHydrate(e,t,n){let r=e.isConnected,i=!1;(t.bu||=[]).push(()=>i=!0);let o=()=>{i||!e.parentNode||r&&!e.isConnected||n()},s=a?()=>{let n=a(o,t=>Ei(e,t));n&&(t.bum||=[]).push(n)}:o;u?s():p().then(()=>!t.isUnmounted&&s())},get __asyncResolved(){return u},setup(){let e=Ic;if(mi(e),u)return()=>Oi(u,e);let t=t=>{l=null,Ar(t,e,13,!r)};if(s&&e.suspense||Hc)return p().then(t=>()=>Oi(t,e)).catch(e=>(t(e),()=>r?J(r,{error:e}):null));let a=I(!1),c=I(),d=I(!!i),f,m;return Ws(()=>{f!=null&&clearTimeout(f),m!=null&&clearTimeout(m)}),i&&(m=setTimeout(()=>{e.isUnmounted||(d.value=!1)},i)),o!=null&&(f=setTimeout(()=>{if(!e.isUnmounted&&!a.value&&!c.value){let e=Error(`Async component timed out after ${o}ms.`);t(e),c.value=e}},o)),p().then(()=>{e.isUnmounted||(a.value=!0,e.parent&&Is(e.parent.vnode)&&e.parent.update())}).catch(n=>{if(e.isUnmounted){l=null;return}t(n),c.value=n}),()=>{if(a.value&&u)return Oi(u,e);if(c.value&&r)return J(r,{error:c.value});if(n&&!d.value)return Oi(n,e)}}})}function Oi(e,t){let{ref:n,props:r,children:i,ce:a}=t.vnode,o=J(e,r,i);return o.ref=n,o.ce=a,delete t.vnode.ce,o}function ki(e,t){return P(e)?e.some(e=>ki(e,t)):pe(e)?e.split(`,`).includes(t):de(e)?(e.lastIndex=0,e.test(t)):!1}function Ai(e,t){Mi(e,`a`,t)}function ji(e,t){Mi(e,`da`,t)}function Mi(e,t,n=Ic){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(Ii(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Is(e.parent.vnode)&&Ni(r,t,n,e),e=e.parent}}function Ni(e,t,n,r){let i=Ii(t,e,r,!0);Ws(()=>{ae(r[t],i)},n)}function Pi(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Fi(e){return e.shapeFlag&128?e.ssContent:e}function Ii(e,t,n=Ic,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Pt();let i=Bc(n),a=kr(t,n,e,r);return i(),Ft(),a};return r?i.unshift(a):i.push(a),a}}function Li(e,t=Ic){Ii(`ec`,e,t)}function Ri(e,t){return Vi(Js,e,!0,t)||e}function zi(e){return pe(e)?Vi(Js,e,!1)||e:e||Xs}function Bi(e){return Vi(Ys,e)}function Vi(e,t,n=!0,r=!1){let i=Qo||Ic;if(i){let n=i.type;if(e= Line truncated
/* [wrapped with `+t+`] */
`)}function qo(e){return ql(e)||Kl(e)||!!(Tt&&e&&e[Tt])}function Jo(e,t){var n=typeof e;return t??=g,!!t&&(n==`number`||n!=`symbol`&&Ye.test(e))&&e>-1&&e%1==0&&e<t}function Yo(e,t,n){if(!lu(n))return!1;var r=typeof t;return(r==`number`?Yl(n)&&Jo(t,n.length):r==`string`&&t in n)?Ul(n[t],e):!1}function Xo(e,t){if(ql(e))return!1;var n=typeof e;return n==`number`||n==`symbol`||n==`boolean`||e==null||wu(e)?!0:je.test(e)||!Ae.test(e)||t!=null&&e in nt(t)}function Zo(e){var t=typeof e;return t==`string`||t==`number`||t==`symbol`||t==`boolean`?e!==`__proto__`:e===null}function Qo(e){var t=Ao(e),n=R[t];if(typeof n!=`function`||!(t in Cr.prototype))return!1;if(e===n)return!0;var r=ko(n);return!!r&&e===r[0]}function $o(e){return!!pt&&pt in e}var es=lt?ou:Nf;function ts(e){var t=e&&e.constructor;return e===(typeof t==`function`&&t.prototype||ct)}function ns(e){return e===e&&!lu(e)}function rs(e,t){return function(r){return r!=null&&r[e]===t&&(t!==n||e in nt(r))}}function is(e){var t=Tl(e,function(e){return n.size===500&&n.clear(),e}),n=t.cache;return t}function as(e,t){var n=e[1],r=t[1],i=n|r,l=i<(o|s|f),u=r==f&&n==c||r==f&&n==p&&e[7].length<=t[8]||r==(f|p)&&t[7].length<=t[8]&&n==c;if(!(l||u))return e;r&o&&(e[2]=t[2],i|=n&o?0:4);var d=t[3];if(d){var m=e[3];e[3]=m?Ja(m,d,t[4]):d,e[4]=m?nr(e[3],a):t[4]}return d=t[5],d&&(m=e[5],e[5]=m?Ya(m,d,t[6]):d,e[6]=m?nr(e[5],a):t[6]),d=t[7],d&&(e[7]=d),r&f&&(e[8]=e[8]==null?t[8]:Kt(e[8],t[8])),e[9]??=t[9],e[0]=t[0],e[1]=i,e}function os(e){var t=[];if(e!=null)for(var n in nt(e))t.push(n);return t}function ss(e){return mt.call(e)}function cs(e,t,r){return t=Vt(t===n?e.length-1:t,0),function(){for(var n=arguments,i=-1,a=Vt(n.length-t,0),o=Ie(a);++i<a;)o[i]=n[t+i];i=-1;for(var s=Ie(t+1);++i<t;)s[i]=n[i];return s[t]=r(o),pn(e,this,s)}}function ls(e,t){return t.length<2?e:Di(e,ba(t,0,-1))}function us(e,t){for(var r=e.length,i=Kt(t.length,r),a=Xa(e);i--;){var o=t[i];e[i]=Jo(o,r)?a[o]:n}return e}function ds(e,t){if(!(t===`constructor`&&typeof e[t]==`function`)&&t!=`__proto__`)return e[t]}var fs=gs(_a),ps=jt||function(e,t){return en.setTimeout(e,t)},ms=gs(va);function hs(e,t,n){var r=t+``;return ms(e,Ko(r,xs(Vo(r),n)))}function gs(e){var t=0,r=0;return function(){var i=qt(),a=16-(i-r);if(r=i,a>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(n,arguments)}}function _s(e,t){var r=-1,i=e.length,a=i-1;for(t=t===n?i:t;++r<t;){var o=ua(r,a),s=e[o];e[o]=e[r],e[r]=s}return e.length=t,e}var vs=is(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(``),e.replace(Me,function(e,n,r,i){t.push(r?i.replace(He,`$1`):n||e)}),t});function ys(e){if(typeof e==`string`||wu(e))return e;var t=e+``;return t==`0`&&1/e==-1/0?`-0`:t}function bs(e){if(e!=null){try{return ut.call(e)}catch{}try{return e+``}catch{}}return``}function xs(e,t){return mn(x,function(n){var r=`_.`+n[0];t&n[1]&&!_n(e,r)&&e.push(r)}),e.sort()}function Ss(e){if(e instanceof Cr)return e.clone();var t=new Sr(e.__wrapped__,e.__chain__);return t.__actions__=Xa(e.__actions__),t.__index__=e.__index__,t.__values__=e.__values__,t}function Cs(e,t,r){t=(r?Yo(e,t,r):t===n)?1:Vt(Nu(t),0);var i=e==null?0:e.length;if(!i||t<1)return[];for(var a=0,o=0,s=Ie(Mt(i/t));a<i;)s[o++]=ba(e,a,a+=t);return s}function ws(e){for(var t=-1,n=e==null?0:e.length,r=0,i=[];++t<n;){var a=e[t];a&&(i[r++]=a)}return i}function Ts(){var e=arguments.length;if(!e)return[];for(var t=Ie(e-1),n=arguments[0],r=e;r--;)t[r-1]=arguments[r];return bn(ql(n)?Xa(n):[n],xi(t,1))}var Es=pa(function(e,t){return Xl(e)?mi(e,xi(t,1,Xl,!0)):[]}),Ds=pa(function(e,t){var r=qs(t);return Xl(r)&&(r=n),Xl(e)?mi(e,xi(t,1,Xl,!0),Mo(r,2)):[]}),Os=pa(function(e,t){var r=qs(t);return Xl(r)&&(r=n),Xl(e)?mi(e,xi(t,1,Xl,!0),n,r):[]});function ks(e,t,r){var i=e==null?0:e.length;return i?(t=r||t===n?1:Nu(t),ba(e,t<0?0:t,i)):[]}function As(e,t,r){var i=e==null?0:e.length;return i?(t=r||t===n?1:Nu(t),t=i-t,ba(e,0,t<0?0:t)):[]}function js(e,t){return e&&e.length?Aa(e,Mo(t,3),!0,!0):[]}function Ms(e,t){return e&&e.length?Aa(e,Mo(t,3),!0):[]}function Ns(e,t,n,r){var i=e==null?0:e.length;return i?(n&&typeof n!=`number`&&Yo(e,t,n)&&(n=0,r=i),yi(e,t,n,r)):[]}function Ps(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var i=n==null?0:Nu(n);return i<0&&(i=Vt(r+i,0)),On(e,Mo(t,3),i)}function Fs(e,t,r){var i=e==null?0:e.length;if(!i)return-1;var a=i-1;return r!==n&&(a=Nu(r),a=r<0?Vt(i+a,0):Kt(a,i-1)),On(e,Mo(t,3),a,!0)}function Is(e){return e!=null&&e.length?xi(e,1):[]}function Ls(e){return e!=null&&e.length?xi(e,h):[]}function Rs(e,t){return e!=null&&e.length?(t=t===n?1:Nu(t),xi(e,t)):[]}function zs(e){for(var t=-1,n=e==null?0:e.length,r={};++t<n;){var i=e[t];ci(r,i[0],i[1])}return r}function Bs(e){return e&&e.length?e[0]:n}function Vs(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var i=n==null?0:Nu(n);return i<0&&(i=Vt(r+i,0)),kn(e,t,i)}function Hs(e){return e!=null&&e.length?ba(e,0,-1):[]}var Us=pa(function(e){var t=yn(e,Pa);return t.length&&t[0]===e[0]?Pi(t):[]}),Ws=pa(function(e){var t=qs(e),r=yn(e,Pa);return t= Line truncated
`;e.replace(p,function(t,n,r,i,a,o){return r||=i,f+=e.slice(u,o).replace(Qe,Yn),n&&(c=!0,f+=`' +
__e(`+n+`) +
'`),a&&(l=!0,f+=`';
`+a+`;
__p += '`),r&&(f+=`' +
((__t = (`+r+`)) == null ? '' : __t) +
'`),u=o+t.length,t}),f+=`';
`;var h=dt.call(t,`variable`)&&t.variable;if(!h)f=`with (obj) {
`+f+`
}
`;else if(Ve.test(h))throw new $e("Invalid `variable` option passed into `_.template`");f=(l?f.replace(be,``):f).replace(xe,`$1`).replace(Se,`$1;`),f=`function(`+(h||`obj`)+`) {
`+(h?``:`obj || (obj = {});
`)+`var __t, __p = ''`+(c?`, __e = _.escape`:``)+(l?`, __j = Array.prototype.join;
function print() { __p += __j.call(arguments, '') }
`:`;
`)+f+`return __p
}`;var g=cf(function(){return et(o,m+`return `+f).apply(n,s)});if(g.source=f,iu(g))throw g;return g}function Zd(e){return Ru(e).toLowerCase()}function Qd(e){return Ru(e).toUpperCase()}function $d(e,t,r){if(e=Ru(e),e&&(r||t===n))return Bn(e);if(!e||!(t=Ea(t)))return e;var i=cr(e),a=cr(t);return Ra(i,Wn(i,a),Gn(i,a)+1).join(``)}function ef(e,t,r){if(e=Ru(e),e&&(r||t===n))return e.slice(0,lr(e)+1);if(!e||!(t=Ea(t)))return e;var i=cr(e);return Ra(i,0,Gn(i,cr(t))+1).join(``)}function tf(e,t,r){if(e=Ru(e),e&&(r||t===n))return e.replace(Fe,``);if(!e||!(t=Ea(t)))return e;var i=cr(e);return Ra(i,Wn(i,cr(t))).join(``)}function nf(e,t){var r=30,i=`...`;if(lu(t)){var a=`separator`in t?t.separator:a;r=`length`in t?Nu(t.length):r,i=`omission`in t?Ea(t.omission):i}e=Ru(e);var o=e.length;if(Zn(e)){var s=cr(e);o=s.length}if(r>=o)return e;var c=r-sr(i);if(c<1)return i;var l=s?Ra(s,0,c).join(``):e.slice(0,c);if(a===n)return l+i;if(s&&(c+=l.length-c),bu(a)){if(e.slice(c).search(a)){var u,d=l;for(a.global||(a=rt(a.source,Ru(We.exec(a))+`g`)),a.lastIndex=0;u=a.exec(d);)var f=u.index;l=l.slice(0,f===n?c:f)}}else if(e.indexOf(Ea(a),c)!=c){var p=l.lastIndexOf(a);p>-1&&(l=l.slice(0,p))}return l+i}function rf(e){return e=Ru(e),e&&Te.test(e)?e.replace(Ce,ur):e}var af=oo(function(e,t,n){return e+(n?` `:``)+t.toUpperCase()}),of=ao(`toUpperCase`);function sf(e,t,r){return e=Ru(e),t=r?n:t,t===n?Qn(e)?pr(e):En(e):e.match(t)||[]}var cf=pa(function(e,t){try{return pn(e,n,t)}catch(e){return iu(e)?e:new $e(e)}}),lf=Eo(function(e,t){return mn(t,function(t){t=ys(t),ci(e,t,_l(e[t],e))}),e});function uf(e){var t=e==null?0:e.length,n=Mo();return e=t?yn(e,function(e){if(typeof e[1]!=`function`)throw new at(r);return[n(e[0]),e[1]]}):[],pa(function(n){for(var r=-1;++r<t;){var i=e[r];if(pn(i[0],this,n))return pn(i[1],this,n)}})}function df(e){return fi(di(e,1))}function ff(e){return function(){return e}}function pf(e,t){return e==null||e!==e?t:e}var X=lo(),mf=lo(!0);function hf(e){return e}function gf(e){return Ji(typeof e==`function`?e:di(e,1))}function _f(e){return $i(di(e,1))}function vf(e,t){return ea(e,di(t,1))}var yf=pa(function(e,t){return function(n){return Ii(n,e,t)}}),bf=pa(function(e,t){return function(n){return Ii(e,n,t)}});function xf(e,t,n){var r=sd(t),i=Ei(t,r);n==null&&!(lu(t)&&(i.length||!r.length))&&(n=t,t=e,e=this,i=Ei(t,sd(t)));var a=!(lu(n)&&`chain`in n)||!!n.chain,o=ou(e);return mn(i,function(n){var r=t[n];e[n]=r,o&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__);return(n.__actions__=Xa(this.__actions__)).push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,bn([this.value()],arguments))})}),e}function Sf(){return en._===this&&(en._=gt),this}function Cf(){}function wf(e){return e=Nu(e),pa(function(t){return ra(t,e)})}var Tf=fo(yn),Ef=fo(gn),Df=fo(Cn);function Of(e){return Xo(e)?Nn(ys(e)):sa(e)}function kf(e){return function(t){return e==null?n:Di(e,t)}}var Af=mo(),jf=mo(!0);function Mf(){return[]}function Nf(){return!1}function Pf(){return{}}function Ff(){return``}function If(){return!0}function Lf(e,t){if(e=Nu(e),e<1||e>g)return[];var n=v,r=Kt(e,v);t=Mo(t),e-=v;for(var i=Rn(r,t);++n<e;)t(n);return i}function Rf(e){return ql(e)?yn(e,ys):wu(e)?[e]:Xa(vs(Ru(e)))}function zf(e){var t=++ft;return Ru(e)+t}var Bf=uo(function(e,t){return e+t},0),Vf=_o(`ceil`),Hf=uo(function(e,t){return e/t},1),Uf=_o(`floor`);function Wf(e){return e&&e.length?vi(e,hf,Ai):n}function Gf(e,t){return e&&e.length?vi(e,Mo(t,2),Ai):n}function Kf(e){return Mn(e,hf)}function qf(e,t){return Mn(e,Mo(t,2))}function Jf(e){return e&&e.length?vi(e,hf,Zi):n}function Yf(e,t){return e&&e.length?vi(e,Mo(t,2),Zi):n}var Xf=uo(function(e,t){return e*t},1),Zf=_o(`round`),Qf=uo(function(e,t){return e-t},0);function $f(e){return e&&e.length?Ln(e,hf):0}function ep(e,t){return e&&e.length?Ln(e,Mo(t,2)):0}return R.after=ml,R.ary=hl,R.assign=zu,R.assignIn=Bu,R.assignInWith=Vu,R.assignWith=Hu,R.at=Uu,R.before=gl,R.bind=_l,R.bindAll=lf,R.bindKey=vl,R.castArray=Ll,R.chain=Mc,R.chunk=Cs,R.compact=ws,R.concat=Ts,R.cond=uf,R.conforms=df,R.constant=ff,R.countBy=Hc,R.create=Wu,R.curry=yl,R.curryRight=bl,R.debounce=xl,R.defaults=Gu,R.defaultsDeep=Ku,R.defer=Sl,R.delay=Cl,R.difference=Es,R.differenceBy=Ds,R.differenceWith=Os,R.drop=ks,R.dropRight=As,R.dropRightWhile=js,R.dropWhile=Ms,R.fill=Ns,R.filter=Wc,R.flatMap=Y,R.flatMapDeep=qc,R.flatMapDepth=Jc,R.flatten=Is,R.flattenDeep=Ls,R.flattenDepth=Rs,R.flip=wl,R.flow=X,R.flowRight=mf,R.fromPairs=zs,R.functions=$u,R.functionsIn=ed,R.groupBy=Zc,R.initial=Hs,R.intersection=Us,R.intersectionBy=Ws,R.intersectionWith=Gs,R.invert=id,R.invertBy=ad,R.invokeMap=$c,R.iteratee=gf,R.keyBy=el,R.keys=sd,R.keysIn=cd,R.map=tl,R.mapKeys=ld,R.mapValues=ud,R.matches=_f,R.matchesProperty=vf,R.memoize=Tl,R.merge=dd,R.mergeWith=fd,R.method=yf,R.methodOf=bf,R.mixin=xf,R.negate=El,R.nthArg=wf,R.omit=pd,R.omitBy=md,R.once=Dl,R.orderBy=nl,R.over=Tf,R.overArgs=Ol,R.overEvery=Ef,R.overSome=Df,R.partial=kl,R.partialRight Line truncated
`).forEach(function(e){i=e.indexOf(`:`),n=e.substring(0,i).trim().toLowerCase(),r=e.substring(i+1).trim();let a=Q.hasOwnProp(t,n);!n||a&&Q.hasOwnProp(Bte,n)||(n===`set-cookie`?a?t[n].push(r):t[n]=[r]:t[n]=a?t[n]+`, `+r:r)}),t};function Hte(e){let t=0,n=e.length;for(;t<n;){let n=e.charCodeAt(t);if(n!==9&&n!==32)break;t+=1}for(;n>t;){let t=e.charCodeAt(n-1);if(t!==9&&t!==32)break;--n}return t===0&&n===e.length?e:e.slice(t,n)}var Ute=RegExp(`[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+`,`g`),Wte=RegExp(`[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+`,`g`);function n_(e,t){return Q.isArray(e)?e.map(e=>n_(e,t)):Hte(String(e).replace(t,``))}var Gte=e=>n_(e,Ute),Kte=e=>n_(e,Wte);function r_(e){let t=Object.create(null);return Q.forEach(e.toJSON(),(e,n)=>{t[n]=Kte(e)}),t}var i_=Symbol(`internals`);function a_(e){return e&&String(e).trim().toLowerCase()}function o_(e){return e===!1||e==null?e:Q.isArray(e)?e.map(o_):Gte(String(e))}function qte(e){let t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g,r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}var Jte=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function s_(e){let t=0,n=e.length;for(;t<n;){let n=e.charCodeAt(t);if(n!==9&&n!==32)break;t+=1}for(;n>t;){let t=e.charCodeAt(n-1);if(t!==9&&t!==32)break;--n}return t===0&&n===e.length?e:e.slice(t,n)}function Yte(e){let t=e.length-1;if(t<1||e.charCodeAt(0)!==34||e.charCodeAt(t)!==34)return e;let n=``;for(let r=1;r<t;r++){let i=e.charCodeAt(r);if(i===34||i===92&&(r+=1,r>=t))return e;n+=e[r]}return n}function c_(e){let t=Object.create(null),n=String(e),r=0,i=!1,a=!1;function o(e){let i=s_(n.slice(r,e)),a=i.indexOf(`=`);if(a<1)return;let o=s_(i.slice(0,a));if(!Jte.test(o))return;let s=o.toLowerCase();if(s===`__proto__`||s===`constructor`||s===`prototype`)return;let c=s_(i.slice(a+1));t[s]=Yte(c)}for(let e=0;e<n.length;e++){let t=n.charCodeAt(e);i?a?a=!1:t===92?a=!0:t===34&&(i=!1):t===34?i=!0:(t===44||t===59)&&(o(e),r=e+1)}return o(n.length),t}var l_=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function u_(e,t,n,r,i){if(Q.isFunction(r))return r.call(this,t,n);if(i&&(t=n),Q.isString(t)){if(Q.isString(r))return t.indexOf(r)!==-1;if(Q.isRegExp(r))return r.test(t)}}function d_(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function f_(e,t){let n=Q.toCamelCase(` `+t);[`get`,`set`,`has`].forEach(r=>{Object.defineProperty(e,r+n,{__proto__:null,value:function(e,n,i){return this[r].call(this,t,e,n,i)},configurable:!0})})}var p_=class{constructor(e){e&&this.set(e)}set(e,t,n){let r=this;function i(e,t,n){let i=a_(t);if(!i)return;let a=Q.findKey(r,i);(!a||r[a]===void 0||n===!0||n===void 0&&r[a]!==!1)&&(r[a||t]=o_(e))}let a=(e,t)=>Q.forEach(e,(e,n)=>i(e,n,t));if(Q.isPlainObject(e)||e instanceof this.constructor)a(e,t);else if(Q.isString(e)&&(e=e.trim())&&!l_(e))a(Vte(e),t);else if(Q.isObject(e)&&Q.isSafeIterable(e)){let n=Object.create(null),r,i;for(let t of e){if(!Q.isArray(t))throw TypeError(`Object iterator must return a key-value pair`);i=t[0],Q.hasOwnProp(n,i)?(r=n[i],n[i]=Q.isArray(r)?[...r,t[1]]:[r,t[1]]):n[i]=t[1]}a(n,t)}else e!=null&&i(t,e,n);return this}get(e,t){if(e=a_(e),e){let n=Q.findKey(this,e);if(n){let e=this[n];if(!t)return e;if(t===!0)return qte(e);if(Q.isFunction(t))return t.call(this,e,n);if(Q.isRegExp(t))return t.exec(e);throw TypeError(`parser must be boolean|regexp|function`)}}}has(e,t){if(e=a_(e),e){let n=Q.findKey(this,e);return!!(n&&this[n]!==void 0&&(!t||u_(this,this[n],n,t)))}return!1}delete(e,t){let n=this,r=!1;function i(e){if(e=a_(e),e){let i=Q.findKey(n,e);i&&(!t||u_(n,n[i],i,t))&&(delete n[i],r=!0)}}return Q.isArray(e)?e.forEach(i):i(e),r}clear(e){let t=Object.keys(this),n=t.length,r=!1;for(;n--;){let i=t[n];(!e||u_(this,this[i],i,e,!0))&&(delete this[i],r=!0)}return r}normalize(e){let t=this,n={};return Q.forEach(this,(r,i)=>{let a=Q.findKey(n,i);if(a){t[a]=o_(r),delete t[i];return}let o=e?d_(i):String(i).trim();o!==i&&delete t[i],t[o]=o_(r),n[o]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){let t=Object.create(null);return Q.forEach(this,(n,r)=>{n!=null&&n!==!1&&(t[r]=e&&Q.isArray(n)?n.join(`, `):n)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+`: `+t).join(`
`)}getSetCookie(){let e=this.get(`set-cookie`);return Q.isArray(e)?e:e==null||e===!1?[]:[e]}get[Symbol.toStringTag](){return`AxiosHeaders`}static from(e){return e instanceof this?e:new this(e)}static parseParameters(e){return c_(e)}static concat(e,...t){let n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){let t=(this[i_]=this[i_]={accessors:{}}).accessors,n=this.prototype;function r(e){let r=a_(e);t[r]||(f_(n,e),t[r]=!0)}return Q.isArray(e)?e.forEach(r):r(e),this}};p_.accessor([`Content-Type`,`Content-Length`,`Accept`,`Accept-Encoding`,`User-Agent`,`Authorization`]),Q.reduceDescriptors(p_.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),Q.freezeMethods(p_);var m_=`[REDACTED ****]`;function h_(e){if(Q.hasOwnProp(e,`toJSON`))return!0;let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(Q.hasOwnProp(t,`toJSON`))return!0;t=Object.getPrototypeOf(t)}return!1}function g_(e,t){let n=new Set(t.map(e=>String(e).toLowerCase())),r=[],i=e=>{if(typeof e!=`object`||!e||Q.isBuffer(e))return e;if(r.indexOf(e)!==-1)return;e instanceof p_&&(e=e.toJSON()),r.push(e);let t;if(Q.isArray(e))t=[],e.forEach((e,n)=>{let r=i(e);Q.isUndefined(r)||(t[n]=r)});else{if(!Q.isPlainObject(e)&&h_(e))return r.pop(),e;t=Object.create(null);for(let[r,a]of Object.entries(e)){let e=n.has(r.toLowerCase())?m_:i(a);Q.isUndefined(e)||(t[r]=e)}}return r.pop(),t};return i(e)}function __(e){try{return String(e)}catch{return``}}function v_(e){return e.errors.map(e=>{try{return e&&e.message?__(e.message):__(e)}catch{return``}}).filter(Boolean).join(`; `)||e.name||`AggregateError`}var y_=class e extends Error{static from(t,n,r,i,a,o){let s=t.message;!s&&Q.isArray(t.errors)&&t.errors.length&&(s=v_(t));let c=new e(s,n||t.code,r,i,a);return Object.defineProperty(c,"cause",{__proto__:null,value:t,writable:!0,enumerable:!1,configurable:!0}),c.name=t.name,t.status!=null&&c.status==null&&(c.status=t.status),o&&Object.assign(c,o),c}constructor(e,t,n,r,i){super(e),Object.defineProperty(this,"message",{__proto__:null,value:e,enumerable:!0,writable:!0,configurable:!0}),this.name=`AxiosError`,this.isAxiosError=!0,t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i,this.status=i.status)}toJSON(){let e=this.config,t=e&&Q.hasOwnProp(e,`redact`)?e.redact:void 0,n=Q.isArray(t)&&t.length>0?g_(e,t):Q.toJSONObject(e);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n,code:this.code,status:this.status}}};y_.ERR_BAD_OPTION_VALUE=`ERR_BAD_OPTION_VALUE`,y_.ERR_BAD_OPTION=`ERR_BAD_OPTION`,y_.ECONNABORTED=`ECONNABORTED`,y_.ETIMEDOUT=`ETIMEDOUT`,y_.ECONNREFUSED=`ECONNREFUSED`,y_.ERR_NETWORK=`ERR_NETWORK`,y_.ERR_FR_TOO_MANY_REDIRECTS=`ERR_FR_TOO_MANY_REDIRECTS`,y_.ERR_DEPRECATED=`ERR_DEPRECATED`,y_.ERR_BAD_RESPONSE=`ERR_BAD_RESPONSE`,y_.ERR_BAD_REQUEST=`ERR_BAD_REQUEST`,y_.ERR_CANCELED=`ERR_CANCELED`,y_.ERR_NOT_SUPPORT=`ERR_NOT_SUPPORT`,y_.ERR_INVALID_URL=`ERR_INVALID_URL`,y_.ERR_FORM_DATA_DEPTH_EXCEEDED=`ERR_FORM_DATA_DEPTH_EXCEEDED`;function b_(e){return Q.isPlainObject(e)||Q.isArray(e)}function x_(e){return Q.endsWith(e,`[]`)?e.slice(0,-2):e}function S_(e,t,n){return e?e.concat(t).map(function(e,t){return e=x_(e),!n&&t?`[`+e+`]`:e}).join(n?`.`:``):t}function C_(e){return Q.isArray(e)&&!e.some(b_)}var w_=Q.toFlatObject(Q,{},null,function(e){return/^is[A-Z]/.test(e)});function T_(e,t,n){if(!Q.isObject(e))throw TypeError(`target must be an object`);t||=new FormData,n=Q.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!Q.isUndefined(t[e])});let r=n.metaTokens,i=n.visitor||m,a=n.dots,o=n.indexes,s=n.Blob||typeof Blob<`u`&&Blob,c=n.maxDepth===void 0?100:n.maxDepth,l=s&&Q.isSpecCompliantForm(t),u=[];if(!Q.isFunction(i))throw TypeError(`visitor must be a function`);function d(e){if(e===null)return``;if(Q.isDate(e))return e.toISOString();if(Q.isBoolean(e))return e.toString();if(!l&&Q.isBlob(e))throw new y_(`Blob is not supported. Use a Buffer instead.`);if(Q.isArrayBuffer(e)||Q.isTypedArray(e)){if(l&&typeof s==`function`)return new s([e]);throw new y_(`Blob is not supported. Use a Buffer instead.`,y_.ERR_NOT_SUPPORT)}return e}function f(e){if(e>c)throw new y_(`Object is too deeply nested (`+e+` levels). Max depth: `+c,y_.ERR_FORM_DATA_DEPTH_EXCEEDED)}function p(e,t){if(c===1/0)return JSON.stringify(e);let n=[];return JSON.stringify(e,function(e,r){if(!Q.isObject(r))return r;for(;n.length&&n[n.length-1]!==this;)n.pop();return n.push(r),f(t+n.length-1),r})}function m(e,n,i){let s=e;if(Q.isReactNative(t)&&Q.isReactNativeBlob(e))return t.append(S_(i,n,a),d(e)),!1;if(e&&!i&&typeof e==`object`){if(Q.endsWith(n,`{}`))n=r?n:n.slice(0,-2),e=p(e,1);else if(Q.isArray(e)&&C_(e)||(Q.isFileList(e)||Q.endsWith(n,`[]`))&&(s=Q.toArray(e)))return n=x_(n),s.forEach(function(e,r){!(Q.isUndefined(e)||e===null)&&t.append(o===!0?S_([n],r,a):o== Line truncated
`+e.map(lv).join(`
`):` `+lv(e[0]):`as no adapter specified`),y_.ERR_NOT_SUPPORT)}return i}var uv={getAdapter:Bne,adapters:cv};function dv(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new H_(null,e)}function fv(e){return dv(e),e.headers=p_.from(e.headers),e.data=B_.call(e,e.transformRequest),[`post`,`put`,`patch`].indexOf(e.method)!==-1&&e.headers.setContentType(`application/x-www-form-urlencoded`,!1),uv.getAdapter(e.adapter||z_.adapter,e)(e).then(function(t){dv(e),e.response=t;try{t.data=B_.call(e,e.transformResponse,t)}finally{delete e.response}return t.headers=p_.from(t.headers),t},function(t){if(!V_(t)&&(dv(e),t&&t.response)){e.response=t.response;try{t.response.data=B_.call(e,e.transformResponse,t.response)}finally{delete e.response}t.response.headers=p_.from(t.response.headers)}return Promise.reject(t)})}var pv={};[`object`,`boolean`,`number`,`function`,`string`,`symbol`].forEach((e,t)=>{pv[e]=function(n){return typeof n===e||`a`+(t<1?`n `:` `)+e}});var mv={};pv.transitional=function(e,t,n){function r(e,t){return`[Axios v`+nv+`] Transitional option '`+e+`'`+t+(n?`. `+n:``)}return(n,i,a)=>{if(e===!1)throw new y_(r(i,` has been removed`+(t?` in `+t:``)),y_.ERR_DEPRECATED);return t&&!mv[i]&&(mv[i]=!0,console.warn(r(i,` has been deprecated since v`+t+` and will be removed in the near future`))),!e||e(n,i,a)}},pv.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function Vne(e,t,n){if(typeof e!=`object`||!e)throw new y_(`options must be an object`,y_.ERR_BAD_OPTION_VALUE);let r=Object.keys(e),i=r.length;for(;i-->0;){let a=r[i],o=Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0;if(o){let t=e[a],n=t===void 0||o(t,a,e);if(n!==!0)throw new y_(`option `+a+` must be `+n,y_.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new y_(`Unknown option `+a,y_.ERR_BAD_OPTION)}}var hv={assertOptions:Vne,validators:pv},gv=hv.validators,_v=class{constructor(e){this.defaults=e||{},this.interceptors={request:new A_,response:new A_}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=Error();let n=(()=>{if(!t.stack)return``;let e=t.stack.indexOf(`
`);return e===-1?``:t.stack.slice(e+1)})();try{if(!e.stack)e.stack=n;else if(n){let t=n.indexOf(`
`),r=t===-1?-1:n.indexOf(`
`,t+1),i=r===-1?``:n.slice(r+1);String(e.stack).endsWith(i)||(e.stack+=`
`+n)}}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=X_(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&hv.assertOptions(n,{silentJSONParsing:gv.transitional(gv.boolean),forcedJSONParsing:gv.transitional(gv.boolean),clarifyTimeoutError:gv.transitional(gv.boolean),legacyInterceptorReqResOrdering:gv.transitional(gv.boolean),advertiseZstdAcceptEncoding:gv.transitional(gv.boolean),validateStatusUndefinedResolves:gv.transitional(gv.boolean)},!1),r!=null&&(Q.isFunction(r)?t.paramsSerializer={serialize:r}:hv.assertOptions(r,{encode:gv.function,serialize:gv.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),hv.assertOptions(t,{baseUrl:gv.spelling(`baseURL`),withXsrfToken:gv.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Q.merge(i.common,i[t.method]);i&&Q.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`query`,`common`],e=>{delete i[e]}),t.headers=p_.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||j_;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[fv.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u<d;)l=l.then(e[u++],e[u++]);return l}d=o.length;let f=t;for(;u<d;){let e=o[u++],t=o[u++];try{f=e?e(f):f}catch(e){if(!t){l=Promise.reject(e);break}try{let n=t.call(this,e);Q.isThenable(n)&&(l=Promise.resolve(n).then(()=>fv.call(this,f)))}catch(e){l=Promise.reject(e)}break}}if(!l)try{l=fv.call(this,f)}catch(e){l=Promise.reject(e)}for(u=0,d=c.length;u<d;)l=l.then(c[u++],c[u++]);return l}getUri(e){return e=X_(this.defaults,e),k_(J_(e.baseURL,e.url,e.allowAbsoluteUrls,e),e.params,e.paramsSerializer)}};Q.forEach([`delete`,`get`,`head`,`options`],function(e){_v.prototype[e]=function(t,n){return this.request(X_(n||{},{method:e,url:t,data:n&&Q.hasOwnProp(n,`data`)?n.data:void 0}))}}),Q.forEach([`post`,`put`,`patch`,`query`],function(e){function t(t){return function(n,r,i){return this.request(X_(i||{},{method:e,headers:t?{"Content-Type":`multipart/form-data`}:{},url:n,data:r}))}}_v.prototype[e]=t(),e!==`query`&&(_v.prototype[e+`Form`]=t(!0))});var Hne=class e{constructor(e){if(typeof e!=`function`)throw TypeError(`executor must be a function.`);let t;this.promise=new Promise(function(e){t=e});let n=this;this.promise.then(e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-->0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new H_(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function Une(e){return function(t){return e.apply(null,t)}}function Wne(e){return Q.isObject(e)&&e.isAxiosError===!0}var vv={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(vv).forEach(([e,t] Line truncated
`,gre=`\u2028`,_re=`\u2029`;function vre(e){let t=e,n=0,r=1,i=1,a=0,o=e=>t[e]===hre&&t[e+1]===Yv,s=e=>t[e]===Yv,c=e=>t[e]===_re,l=e=>t[e]===gre,u=e=>o(e)||s(e)||c(e)||l(e),d=()=>n,f=()=>r,p=()=>i,m=()=>a,h=e=>o(e)||c(e)||l(e)?Yv:t[e],g=()=>h(n),_=()=>h(n+a);function v(){return a=0,u(n)&&(r++,i=0),o(n)&&n++,n++,i++,t[n]}function y(){return o(n+a)&&a++,a++,t[n+a]}function b(){n=0,r=1,i=1,a=0}function x(e=0){a=e}function S(){let e=n+a;for(;e!==n;)v();a=0}return{index:d,line:f,column:p,peekOffset:m,charAt:h,currentChar:g,currentPeek:_,next:v,peek:y,reset:b,resetPeek:x,skipToPeek:S}}var Xv=void 0,Zv=`'`,yre=`tokenizer`;function bre(e,t={}){let n=t.location!==!1,r=vre(e),i=()=>r.index(),a=()=>pre(r.line(),r.column(),r.index()),o=a(),s=i(),c={currentType:13,offset:s,startLoc:o,endLoc:o,lastType:13,lastOffset:s,lastStartLoc:o,lastEndLoc:o,braceNest:0,inLinked:!1,text:``},l=()=>c,{onError:u}=t;function d(e,t,r,...i){let a=l();if(t.column+=r,t.offset+=r,u){let r=qv(e,n?Gv(a.startLoc,t):null,{domain:yre,args:i});u(r)}}function f(e,t,r){e.endLoc=a(),e.currentType=t;let i={type:t};return n&&(i.loc=Gv(e.startLoc,e.endLoc)),r!=null&&(i.value=r),i}let p=e=>f(e,13);function m(e,t){return e.currentChar()===t?(e.next(),t):(d(Kv.EXPECTED_TOKEN,a(),0,t),``)}function h(e){let t=``;for(;e.currentPeek()===Jv||e.currentPeek()===Yv;)t+=e.currentPeek(),e.peek();return t}function g(e){let t=h(e);return e.skipToPeek(),t}function _(e){if(e===Xv)return!1;let t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t===95}function v(e){if(e===Xv)return!1;let t=e.charCodeAt(0);return t>=48&&t<=57}function y(e,t){let{currentType:n}=t;if(n!==2)return!1;h(e);let r=_(e.currentPeek());return e.resetPeek(),r}function b(e,t){let{currentType:n}=t;if(n!==2)return!1;h(e);let r=v(e.currentPeek()===`-`?e.peek():e.currentPeek());return e.resetPeek(),r}function x(e,t){let{currentType:n}=t;if(n!==2)return!1;h(e);let r=e.currentPeek()===Zv;return e.resetPeek(),r}function S(e,t){let{currentType:n}=t;if(n!==7)return!1;h(e);let r=e.currentPeek()===`.`;return e.resetPeek(),r}function C(e,t){let{currentType:n}=t;if(n!==8)return!1;h(e);let r=_(e.currentPeek());return e.resetPeek(),r}function w(e,t){let{currentType:n}=t;if(!(n===7||n===11))return!1;h(e);let r=e.currentPeek()===`:`;return e.resetPeek(),r}function T(e,t){let{currentType:n}=t;if(n!==9)return!1;let r=()=>{let t=e.currentPeek();return t===`{`?_(e.peek()):t===`@`||t===`|`||t===`:`||t===`.`||t===Jv||!t?!1:t===Yv?(e.peek(),r()):D(e,!1)},i=r();return e.resetPeek(),i}function E(e){h(e);let t=e.currentPeek()===`|`;return e.resetPeek(),t}function D(e,t=!0){let n=(t=!1,r=``)=>{let i=e.currentPeek();return i===`{`||i===`@`||!i?t:i===`|`?!(r===Jv||r===Yv):i===Jv?(e.peek(),n(!0,Jv)):i===Yv?(e.peek(),n(!0,Yv)):!0},r=n();return t&&e.resetPeek(),r}function O(e,t){let n=e.currentChar();if(n!==Xv)return t(n)?(e.next(),n):null}function k(e){let t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===95||t===36}function A(e){return O(e,k)}function j(e){let t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===95||t===36||t===45}function M(e){return O(e,j)}function ee(e){let t=e.charCodeAt(0);return t>=48&&t<=57}function te(e){return O(e,ee)}function ne(e){let t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function N(e){return O(e,ne)}function re(e){let t=``,n=``;for(;t=te(e);)n+=t;return n}function ie(e){let t=``;for(;;){let n=e.currentChar();if(n===`\\`){let r=e.peek();r===`{`||r===`}`||r===`@`||r===`|`||r===`\\`?(t+=n+r,e.next(),e.next()):(e.resetPeek(),t+=n,e.next())}else if(n===`{`||n===`}`||n===`@`||n===`|`||!n)break;else if(n===Jv||n===Yv)if(D(e))t+=n,e.next();else if(E(e))break;else t+=n,e.next();else t+=n,e.next()}return t}function ae(e){g(e);let t=``,n=``;for(;t=M(e);)n+=t;let r=e.currentChar();if(r&&r!==`}`&&r!==Xv&&r!==Jv&&r!==Yv&&r!==` `){let t=de(e);return d(Kv.INVALID_TOKEN_IN_PLACEHOLDER,a(),0,n+t),n+t}return e.currentChar()===Xv&&d(Kv.UNTERMINATED_CLOSING_BRACE,a(),0),n}function oe(e){g(e);let t=``;return e.currentChar()===`-`?(e.next(),t+=`-${re(e)}`):t+=re(e),e.currentChar()===Xv&&d(Kv.UNTERMINATED_CLOSING_BRACE,a(),0),t}function se(e){return e!==Zv&&e!==Yv}function P(e){g(e),m(e,`'`);let t=``,n=``;for(;t=O(e,se);)t===`\\`?n+=ce(e):n+=t;let r=e.currentChar();return r===Yv||r===Xv?(d(Kv.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,a(),0),r===Yv&&(e.next(),m(e,`'`)),n):(m(e,`'`),n)}function ce(e){let t=e.currentChar();switch(t){case`\\`:case`'`:return e.next(),`\\${t}`;case`u`:return le(e,t,4);case`U`:return le(e,t,6);default:return d(Kv.UNKNOWN_ESCAPE_SEQUENCE,a(),0,t),``}}function le(e,t,n){m(e,t);let r=``;for(let i=0;i<n;i++){let n=N(e);if(!n){d(Kv.INVALID_UNICODE_ESCAPE_SEQUENCE,a(),0,`\\${t}${r}${e.currentChar()}`);break}r+=n}return`\\${t}${r}`}function ue(e){return e!==`{`&&e!==`}`&&e!==Jv&&e!==Yv}function de(e){g(e);let t=``,n=``;for(;t=O(e,ue);)n+=t;return n}function fe(e){let t=``,n=``;for(;t=A(e);)n+=t;return n}function pe(e){let t=n=>{let r=e Line truncated
`:t.breakLineCode,a=t.needIndent?t.needIndent:n!==`arrow`,o=e.helpers||[],s=Are(e,{filename:r,breakLineCode:i,needIndent:a});s.push(n===`normal`?`function __msg__ (ctx) {`:`(ctx) => {`),s.indent(a),o.length>0&&(s.push(`const { ${zv(o.map(e=>`${e}: _${e}`),`, `)} } = ctx`),s.newline()),s.push(`return `),ry(s,e),s.deindent(a),s.push(`}`),delete e.helpers;let{code:c,map:l}=s.context();return{ast:e,code:c,map:l?l.toJSON():void 0}};function Ire(e,t={}){let n=Dv({},t),r=!!n.jit,i=!!n.minify,a=n.optimize==null||n.optimize,o=Ere(n).parse(e);return r?(a&&kre(o),i&&ny(o),{ast:o,code:``}):(Ore(o,n),Fre(o,n))}function Lre(){typeof __INTLIFY_PROD_DEVTOOLS__!=`boolean`&&(kv().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!=`boolean`&&(kv().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function iy(e){return Fv(e)&&uy(e)===0&&(Av(e,`b`)||Av(e,`body`))}var ay=[`b`,`body`];function Rre(e){return hy(e,ay)}var oy=[`c`,`cases`];function zre(e){return hy(e,oy,[])}var sy=[`s`,`static`];function Bre(e){return hy(e,sy)}var cy=[`i`,`items`];function Vre(e){return hy(e,cy,[])}var ly=[`t`,`type`];function uy(e){return hy(e,ly)}var dy=[`v`,`value`];function fy(e,t){let n=hy(e,dy);if(n!=null)return n;throw _y(t)}var py=[`m`,`modifier`];function Hre(e){return hy(e,py)}var my=[`k`,`key`];function Ure(e){let t=hy(e,my);if(t)return t;throw _y(6)}function hy(e,t,n){for(let n=0;n<t.length;n++){let r=t[n];if(Av(e,r)&&e[r]!=null)return e[r]}return n}var gy=[...ay,...oy,...sy,...cy,...my,...py,...dy,...ly];function _y(e){return Error(`unhandled node type: ${e}`)}function vy(e){return t=>Wre(t,e)}function Wre(e,t){let n=Rre(t);if(n==null)throw _y(0);if(uy(n)===1){let t=zre(n);return e.plural(t.reduce((t,n)=>[...t,yy(e,n)],[]))}else return yy(e,n)}function yy(e,t){let n=Bre(t);if(n!=null)return e.type===`text`?n:e.normalize([n]);{let n=Vre(t).reduce((t,n)=>[...t,by(e,n)],[]);return e.normalize(n)}}function by(e,t){let n=uy(t);switch(n){case 3:return fy(t,n);case 9:return fy(t,n);case 4:{let r=t;if(Av(r,`k`)&&r.k)return e.interpolate(e.named(r.k));if(Av(r,`key`)&&r.key)return e.interpolate(e.named(r.key));throw _y(n)}case 5:{let r=t;if(Av(r,`i`)&&Cv(r.i))return e.interpolate(e.list(r.i));if(Av(r,`index`)&&Cv(r.index))return e.interpolate(e.list(r.index));throw _y(n)}case 6:{let n=t,r=Hre(n),i=Ure(n);return e.linked(by(e,i),r?by(e,r):void 0,e.type)}case 7:return fy(t,n);case 8:return fy(t,n);default:throw Error(`unhandled node on format message part: ${n}`)}}var Gre=e=>e,xy=Ov();function Kre(e,t={}){let n=!1,r=t.onError||mre;return t.onError=e=>{n=!0,r(e)},{...Ire(e,t),detectError:n}}function qre(e,t){if(!__INTLIFY_DROP_MESSAGE_COMPILER__&&Nv(e)){Pv(t.warnHtmlMessage)&&t.warnHtmlMessage;let n=(t.onCacheKey||Gre)(e),r=xy[n];if(r)return r;let{ast:i,detectError:a}=Kre(e,{...t,location:!1,jit:!0}),o=vy(i);return a?o:xy[n]=o}else{let t=e.cacheKey;return t?xy[t]||(xy[t]=vy(e)):vy(e)}}var Sy=null;function Jre(e){Sy=e}function Yre(e,t,n){Sy&&Sy.emit(`i18n:init`,{timestamp:Date.now(),i18n:e,version:t,meta:n})}var Xre=Zre(`function:translate`);function Zre(e){return t=>Sy&&Sy.emit(e,t)}var Cy={INVALID_ARGUMENT:17,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_NON_STRING_MESSAGE:20,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23};function wy(e){return qv(e,null,void 0)}Cy.INVALID_ARGUMENT,Cy.INVALID_DATE_ARGUMENT,Cy.INVALID_ISO_DATE_ARGUMENT,Cy.NOT_SUPPORT_NON_STRING_MESSAGE,Cy.NOT_SUPPORT_LOCALE_PROMISE_VALUE,Cy.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION,Cy.NOT_SUPPORT_LOCALE_TYPE;function Ty(e,t){return t.locale==null?Dy(e.locale):Dy(t.locale)}var Ey;function Dy(e){if(Nv(e))return e;if(Mv(e)){if(e.resolvedOnce&&Ey!=null)return Ey;if(e.constructor.name===`Function`){let t=e();if(Zne(t))throw wy(Cy.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Ey=t}else throw wy(Cy.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw wy(Cy.NOT_SUPPORT_LOCALE_TYPE)}function Qre(e,t,n){return[...new Set([n,...jv(t)?t:Fv(t)?Object.keys(t):Nv(t)?[t]:[n]])]}function Oy(e,t,n){let r=Nv(n)?n:Ly,i=e;i.__localeChainCache||=new Map;let a=i.__localeChainCache.get(r);if(!a){a=[];let e=[n];for(;jv(e);)e=ky(a,e,t);let o=jv(t)||!Rv(t)?t:t.default?t.default:null;e=Nv(o)?[o]:o,jv(e)&&ky(a,e,!1),i.__localeChainCache.set(r,a)}return a}function ky(e,t,n){let r=!0;for(let i=0;i<t.length&&Pv(r);i++){let a=t[i];Nv(a)&&(r=$re(e,t[i],n))}return r}function $re(e,t,n){let r,i=t.split(`-`);do r=eie(e,i.join(`-`),n),i.splice(-1,1);while(i.length&&r===!0);return r}function eie(e,t,n){let r=!1;if(!e.includes(t)&&(r=!0,t)){r=t[t.length-1]!==`!`;let i=t.replace(/!/g,``);e.push(i),(jv(n)||Rv(n))&&n[i]&&(r=n[i])}return r}var Ay=[];Ay[0]={w:[0],i:[3,0],"[":[4],o:[7]},Ay[1]={w:[1],".":[2],"[":[4],o:[7]},Ay[2]={w:[2],i:[3,0],0:[3,0]},Ay[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]},Ay[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]},Ay[5]={"'":[4,0],o:8,l:[5,0]},Ay[6]={'"':[4,0],o:8,l:[6,0]};var tie=/^\s?(?:true|false|-?[\d.]+|'[ Line truncated
Tracking started at: {statsStartTime}`,manual:`Manual`,tableWidthMode:`Table width mode`,testFailed:`Test failed`,testFinishedTip:`{name}
{number}/{total} tests completed`,testFinishedResultTip:`{name}
Test completed: {success} succeeded, {failed} timed out`,testFailedTip:`{name}
Test failed`,updateFinishedTip:`{number} update(s) finished`,independentLatencyTest:`Independent latency test`,independentLatencyTestTip:`When enabled, the latency test will use URLs specified in the configuration file instead of zashboard's URL settings. Latency will be displayed independently based on the URLs set in policy groups.`,search:`Search`,searchVisibleColumns:`Search displayed columns`,searchHiddenColumns:`Search hidden columns too`,searchProxyGroup:`Search proxy groups`,searchProxyNode:`Search proxy nodes`,proxySearchModeGlobal:`Node search`,proxySearchModeGroup:`Policy group search`,importing:`Importing...`,hideConnection:`Hide connection`,showConnection:`Show connection`,hideConnectionRegex:`Hide connection regex`,hideConnectionTip:`You can use case-insensitive regular expressions to match and hide unwanted connections.`,hideLog:`Hide log`,showLog:`Show log`,hideLogRegex:`Hide log regex`,hideLogTip:`You can use case-insensitive regular expressions to match and hide unwanted logs.`,loadBalance:`Load balancing`,label:`Label`,optional:`Optional`,swipeInTabs:`Swipe to switch between tabs`,swipeInPages:`Swipe to switch between pages`,simpleCardPreset:`Simple preset`,detailedCardPreset:`Detailed preset`,refresh:`Refresh`,reset:`Reset`,resetSettings:`Reset settings`,resetSettingsConfirm:`Are you sure you want to reset all dashboard settings to default values? This action cannot be undone.`,backgroundToneSwitchConfirm:`This background looks better with the {theme}. Do you want to switch?`,backgroundToneLightThemeLabel:`light theme`,backgroundToneDarkThemeLabel:`dark theme`,minProxyCardWidth:`Minimum proxy card width`,displayGlobalByMode:`Show GLOBAL based on mode`,displaySelectedNode:`Show selected node`,displayLatencyNumber:`Show latency numbers`,disconnectOnRuleDisable:`Disconnect matching connections when a rule is disabled`,tipForFixed:`The current policy group is locked to the current node. Run a speed test to restore {type} behavior.`,remoteAddress:`Remote address`,save:`Save`,moreDetails:`More details`,moreSettings:`More settings`,customIcon:`Custom icon`,dropOrClickUpload:`Drop an image or paste a URL`,disablePullToRefresh:`Disable pull to refresh`,disablePullToRefreshTip:`Pull-to-refresh and virtual scrolling components may conflict. If you experience lag or accidentally trigger pull-to-refresh while scrolling, try disabling this feature.`,keyboardShortcuts:`Keyboard shortcuts`,keyboardShortcutsTip:`Click the input and press a key or key combination to set a shortcut. Press Backspace or Delete to clear it.`,keyboardShortcutPageName:`{name} page`,toggleSidebar:`Toggle sidebar`,switchToPreviousBackend:`Switch to previous backend`,switchToNextBackend:`Switch to next backend`,keyboardShortcutsConflict:`Duplicate shortcuts detected: {keys}. Only the first one will take effect.`,resetKeyboardShortcuts:`Reset shortcuts`,pressAnyKey:`Press a key`,displayAllFeatures:`Show all features`,displayAllFeaturesTip:`Show all features, including those not supported by the official build of the current core (honk). If you're using a fork that supports some of these features, you can try enabling them.`,blurIntensity:`Blur intensity`,scrollAnimationEffect:`Scroll animation effect`,importFromFile:`Import from file`,importFromUrl:`Import from URL`,uploadSettingsSuccess:`Settings uploaded successfully`,uploadSettingsIconReflectListRemoved:`Custom icon data was too large and has been removed during upload. Please reduce it and try again.`,syncSettingsSuccess:`Settings synced successfully`,syncSettingsConfirm:`The backend has stored settings that will override the following local settings:
{keys}
Do you want to apply them?`,importSettingsConfirm:`The imported settings will override the following local settings:
{keys}
Do you want to apply them?`,dontAskAgainAlwaysApply:`Don't ask again, always apply`,confirmBeforeOverride:`Confirm before overriding local settings`,deleteUploadedSettingsSuccess:`Uploaded settings deleted successfully`,deleteUploadedSettingsConfirm:`Are you sure you want to delete the uploaded settings on the backend? This action cannot be undone.`,upgradeSuccess:`Upgrade successful`,numberOfChartsInSidebar:`Number of charts in the sidebar`,flushSmartWeights:`Clear smart weights`,IPInfoAPI:`IP info API`,IPInfoAPITip:`This API is used for IP geolocation lookups in connection details and zashboard's DNS query feature. IP Check and Earth use their own API selections.`,general:`General`,groupProxiesByProvider:`Group proxies by provider`,useSmartGroupSort:`Sort smart groups by usage frequency`,all:`All`,autoDisconnectIdleUDP:`Auto-disconnect idle UDP connections`,autoDisconnectIdleUDPTime:`UDP idle time`,autoDisconnectIdleUDPTip:`When enabled, opening zashboard will close UDP connections that have been idle longer than the configured time. This can help with UDP connections that don't disconnect automatically.`,connectionTopology:`Connection topology`,applyConnectionFilter:`Apply connection filters`,topologyPause:`Pause topology updates`,topologyResume:`Resume topology updates`,topologyExpand:`Expand topology view`,topologyCollapse:`Restore topology view`,editBackend:`Edit backend`,editBackendTitle:`Edit backend configuration`,addBackend:`Add backend`,manageBackends:`Manage backends`,noBackendYet:`No backend yet`,backendConnectionFailed:`Backend connection failed. Please check your configuration.`,backendConfigSaved:`Backend configuration saved successfully`,saveFailed:`Save failed`,checking:`Checking...`,copySuccess:`Copied successfully`,importFromBackendTip:`The default ./zashboard-settings.json is located in the ui folder. Please ensure the ui folder exists and contains the configuration file.`,importFailed:`Import failed, please check the URL: {url}`,autoImportFromUrl:`Auto-import`,autoImportFromUrlTip:`When enabled, settings will be automatically imported from the URL when opening zashboard. If the hash differs from the last imported hash, settings will be re-imported and the page will be refreshed.`,getting:`Getting...`,mmdbSizeTip:`If you are using MMDB-format GEO files, this number will be 0.`,displayFinalOutbound:`Show final outbound node`,groupTestUrls:`Group test URLs`,groupTestUrlsTip:`For manual tests triggered from the dashboard, URL priority is: URLs set here > URLs in configuration > global test URLs. For groups like UrlTest/Fallback, you still need to modify URLs in the configuration, so this is mainly recommended for Selector scenarios.`,groupName:`Group name`,unknown:`Unknown`,sourceIPAddress:`Source IP address`,ruleMatch:`Rule match`,proxyChainEntry:`Proxy chain entry`,proxyChainExit:`Proxy chain exit`,nodeType:`Node type`,connectionCount:`Connection count`,zashboardSettings:`Dashboard settings`,backendSettings:`Backend settings`,generalSettings:`General settings`,overviewSettings:`Overview settings`,overviewCardSettings:`Card settings`,chartsCard:`Charts card`,networkCard:`Network card`,providerTrafficOverview:`Provider traffic overview`,topologyCharts:`Topology charts`,earthGlobeCard:`Global connections`,earthGlobeTitle:`Global connections`,earthProjection:`Projection`,earthVisualStyle:`Globe style`,earthVisualStyle_space:`Space`,earthVisualStyle_flat:`Flat`,earthOriginAPI:`Public IP service`,earthLocalIP:`Local IP`,earthToggleIP:`Show or hide local IP`,earthHideCityLabels:`Hide city names`,earthShowCityLabels:`Show city names`,earthPauseRotation:`Pause globe rotation`,earthResumeRotation:`Resume globe rotation`,earthExpand:`Expand globe view`,earthCollapse:`Restore globe view`,earthConnectionLine:`Connection route`,earthLegend:`Endpoint legend`,earthLegendProxied:`Via proxy`,earthDatabaseChecking:`Checking the local city database…`,earthDatabaseLoading:`Loading the cached city database…`,earthDatabaseConsentTitle:`Download the local city database?`,earthDatabaseConsent:`Connection endpoints stay in this browser. DB-IP City Lite requires about {download} to download and {stored} of local storage after extraction.`,earthDatabaseCacheRecovered:`A damaged cached database was removed. Download a clean copy to restore location lookup.`,earthDatabaseDownload:`Download database`,earthDatabaseLearnMore:`About DB-IP City Lite`,earthDatabaseDownloading:`Downloading city database`,earthDatabaseError_space:`There is not enough browser storage for the city database.`,earthDatabaseError_network:`The city database could not be downloaded.`,earthDatabaseError_decompress:`The city database could not be decompressed.`,earthDatabaseError_invalid:`The downloaded city database is invalid.`,earthDatabaseError_storage:`The city database could not be saved in browser storage.`,earthDatabaseError_unsupported:`This browser cannot decompress the city database.`,earthDatabaseError_unknown:`The city database coulLine truncated
Время начала записи: {statsStartTime}`,manual:`Ручной`,tableWidthMode:`Режим ширины таблицы`,testFailed:`Тест задержки таймаут`,testFinishedTip:`{name}
{number}/{total} Тест завершен`,testFinishedResultTip:`{name}
Тест завершен: {success} Успешно, {failed} Таймаут`,testFailedTip:`{name}
Тест задержки таймаут`,updateFinishedTip:`{number} Обновление завершено`,independentLatencyTest:`Независимый тест задержки`,independentLatencyTestTip:`Включение независимого тестирования задержки попытается использовать URL-адреса, указанные в конфигурационном файле, вместо настроек URL-адресов в панели управления во время теста задержки. Задержка будет отображаться отдельно на основе URL-адресов, установленных в группах политик.`,search:`Поиск`,searchVisibleColumns:`Поиск по отображаемым столбцам`,searchHiddenColumns:`Поиск и по скрытым столбцам`,searchProxyGroup:`Поиск групп прокси`,searchProxyNode:`Поиск узлов прокси`,proxySearchModeGlobal:`Поиск узлов`,proxySearchModeGroup:`Поиск групп политик`,importing:`Импортируется`,hideConnection:`Скрыть соединение`,showConnection:`Показать соединение`,hideConnectionRegex:`Скрыть соединение Regex`,hideConnectionTip:`Используйте регистронезависимое регулярное выражение, чтобы найти и скрыть нежелательные соединения.`,hideLog:`Скрыть журнал`,showLog:`Показать журнал`,hideLogRegex:`Скрыть журнал Regex`,hideLogTip:`Используйте регистронезависимое регулярное выражение, чтобы найти и скрыть нежелательные записи журнала.`,loadBalance:`Балансировка нагрузки`,label:`Метка`,optional:`Необязательно`,swipeInTabs:`Провести для переключения вкладок`,swipeInPages:`Провести для переключения страниц`,simpleCardPreset:`Простой`,detailedCardPreset:`Подробный`,refresh:`Обновить`,reset:`Сбросить`,resetSettings:`Сбросить настройки`,resetSettingsConfirm:`Вы уверены, что хотите сбросить все настройки панели к значениям по умолчанию? Это действие нельзя отменить.`,backgroundToneSwitchConfirm:`Для этого фона лучше подходит {theme}. Переключить тему?`,backgroundToneLightThemeLabel:`светлая тема`,backgroundToneDarkThemeLabel:`темная тема`,minProxyCardWidth:`Минимальная ширина карточки прокси`,displayGlobalByMode:`Отображать GLOBAL по режиму`,displaySelectedNode:`Отображать выбранный узел`,displayLatencyNumber:`Отображать задержку`,disconnectOnRuleDisable:`Разрывать соединения при отключении правила`,tipForFixed:`Текущая стратегическая группа закреплена за текущим узлом. Нажмите «Тест скорости», чтобы восстановить поведение {type}.`,remoteAddress:`удалённый адрес`,save:`Сохранить`,moreDetails:`Подробнее`,moreSettings:`Дополнительные настройки`,customIcon:`Пользовательская иконка`,dropOrClickUpload:`Перетащите изображение или вставьте URL`,disablePullToRefresh:`Отключить свойство обновления`,disablePullToRefreshTip:`Компоненты Pull-to-refresh и виртуальной прокрутки иногда могут конфликтовать. Если при прокрутке вверх-вниз у вас часто возникают задержки или случайные срабатывания Pull-to-refresh, попробуйте отключить Pull-to-refresh.`,keyboardShortcuts:`Горячие клавиши`,keyboardShortcutsTip:`Нажмите на поле и затем нужную клавишу или сочетание клавиш. Для очистки используйте Backspace или Delete.`,keyboardShortcutPageName:`Страница {name}`,toggleSidebar:`Переключить боковую панель`,switchToPreviousBackend:`Переключиться на предыдущий бэкенд`,switchToNextBackend:`Переключиться на следующий бэкенд`,keyboardShortcutsConflict:`Обнаружены повторяющиеся горячие клавиши: {keys}. Сработает только первое совпадение.`,resetKeyboardShortcuts:`Сбросить горячие клавишLine truncated
{keys}
Применить их?`,importSettingsConfirm:`Импортированные настройки перезапишут следующие локальные настройки:
{keys}
Применить их?`,dontAskAgainAlwaysApply:`Больше не спрашивать, применять автоматически`,confirmBeforeOverride:`Подтверждать перезапись локальных настроек`,deleteUploadedSettingsSuccess:`Загруженные настройки успешно удалены`,deleteUploadedSettingsConfirm:`Вы уверены, что хотите удалить загруженные на бэкенд настройки? Это действие нельзя отменить.`,upgradeSuccess:`Обновление до новой версии выполнено успешно`,numberOfChartsInSidebar:`Количество графиков в боковой панели`,flushSmartWeights:`Очистить Smart веса`,IPInfoAPI:`API информации о IP`,IPInfoAPITip:`Этот API используется для определения геолокации IP-адресов в деталях соединения и DNS-запросах панели. Проверка IP и глобус используют собственные настройки API.`,general:`Универсальный`,groupProxiesByProvider:`Группировать прокси по провайдеру`,useSmartGroupSort:`Сортировать Smart группы по частоте использования`,all:`Все`,autoDisconnectIdleUDP:`Автоматически отключить UDP-идле`,autoDisconnectIdleUDPTime:`Время UDP-идле`,autoDisconnectIdleUDPTip:`При включении открытие zashboard приведёт к закрытию UDP-соединений, продолжительность которых превышает заданное количество минут. Это может помочь в случае с некоторыми UDP-соединениями, которые не разрываются автоматически, как ожидается.`,connectionTopology:`Топология соединений`,applyConnectionFilter:`Применять фильтры соединений`,topologyPause:`Приостановить обновление топологии`,topologyResume:`Возобновить обновление топологии`,topologyExpand:`Развернуть топологию`,topologyCollapse:`Восстановить размер топологии`,editBackend:`Редактировать бэкенд`,editBackendTitle:`Редактировать конфигурацию бэкенда`,addBackend:`Добавить бэкенд`,manageBackends:`Управление бэкендами`,noBackendYet:`Бэкендов пока нет`,backendConnectionFailed:`Не удалось подключиться к бэкенду, проверьте конфигурацию`,backendConfigSaved:`Конфигурация бэкенда успешно сохранена`,saveFailed:`Не удалось сохранить`,checking:`Проверка...`,copySuccess:`Копирование успешно`,importFromBackendTip:`По умолчанию ./zashboard-settings.json находится в папке ui. Пожалуйста, убедитесь, что папка ui существует и содержит файл конфигурации.`,importFailed:`Импорт не выполнен, проверьте url {url}`,autoImportFromUrl:`Автоматический импорт`,autoImportFromUrlTip:`При включении настройки будут автоматически импортироваться из url при открытии zashboard. Если хэш отличается от последнего импортированного хэша, настройки будут импортированы заново и страница будет обновлена.`,getting:`Получение...`,mmdbSizeTip:`Если вы используете mmdb-формат файлов geo, то количество будет равно 0`,displayFinalOutbound:`Показать конечный исходящий узел`,groupTestUrls:`Группа тестовых URL`,groupTestUrlsTip:`Для ручных тестов, запущенных из панели, установите тестовые URL > URL в конфигурации > Глобальные тестовые URL, но для групп с UrlTest/Fallback и т.д., URL в конфигурации все равно нужно изменить, поэтому это рекомендуется только для Selector и т.д. `,groupName:`Группа имени`,unknown:`Неизвестно`,sourceIPAddress:`Исходный IP-адрес`,ruleMatch:`Совпадение правила`,proxyChainEntry:`Вход в цепочку прокси`,proxyChainExit:`Выход из цепочки прокси`,nodeType:`Тип узла`,connectionCount:`Количество соединений`,zashboardSet Line truncated
记录开始时间:{statsStartTime}`,manual:`手动`,tableWidthMode:`表格宽度模式`,testFailed:`测速超时`,testFinishedTip:`{name}
{number}/{total} 测试完成`,testFinishedResultTip:`{name}
测试完成: {success} 成功,{failed} 超时`,testFailedTip:`{name}
测速超时`,updateFinishedTip:`{number} 更新完成`,independentLatencyTest:`独立延迟测试`,independentLatencyTestTip:`开启独立延迟测试会在测速中尽可能的使用配置文件中的url覆盖面板设置的url,并展示根据策略组设置的url获取的延迟。`,search:`搜索`,searchVisibleColumns:`仅搜索展示的列`,searchHiddenColumns:`搜索包含隐藏的列`,searchProxyGroup:`搜索代理组`,searchProxyNode:`搜索节点`,proxySearchModeGlobal:`节点搜索`,proxySearchModeGroup:`策略组搜索`,importing:`正在导入`,hideConnection:`隐藏连接`,showConnection:`显示连接`,hideConnectionRegex:`隐藏连接正则`,hideConnectionTip:`可通过不区分大小写的正则表达式来匹配并隐藏不需要看到的连接`,hideLog:`隐藏日志`,showLog:`显示日志`,hideLogRegex:`隐藏日志正则`,hideLogTip:`可通过不区分大小写的正则表达式来匹配并隐藏不需要看到的日志`,loadBalance:`负载均衡`,label:`标签`,optional:`可选`,swipeInTabs:`滑动切换页面二级标签`,swipeInPages:`滑动切换页面`,simpleCardPreset:`简洁预设`,detailedCardPreset:`详细预设`,refresh:`刷新`,reset:`重置`,resetSettings:`恢复默认设置`,resetSettingsConfirm:`确定要将面板设置恢复为默认值吗?此操作不可撤销。`,backgroundToneSwitchConfirm:`检测到这张背景图更适合使用{theme},是否切换?`,backgroundToneLightThemeLabel:`浅色主题`,backgroundToneDarkThemeLabel:`深色主题`,minProxyCardWidth:`节点卡片最小宽度`,displayGlobalByMode:`根据模式显示 GLOBAL`,displaySelectedNode:`显示选中节点`,displayLatencyNumber:`显示延迟数字`,disconnectOnRuleDisable:`禁用规则时打断连接`,tipForFixed:`当前策略组被固定在了当前节点,点击测速来恢复{type}行为`,remoteAddress:`远端地址`,save:`保存`,moreDetails:`更多详情`,moreSettings:`更多设置`,customIcon:`自定义图标`,dropOrClickUpload:`拖拽图片或输入 URL`,disablePullToRefresh:`禁用下拉刷新`,disablePullToRefreshTip:`下拉刷新和虚拟滚动的组件有时会有冲突,如果你在上下滚动的时候经常卡顿或者误触发下拉刷新,可以尝试禁用下拉刷新`,keyboardShortcuts:`快捷键设置`,keyboardShortcutsTip:`点击输入框后可直接按单键或组合键设置快捷键,按 Backspace 或 Delete 可清空。`,keyboardShortcutPageName:`{name}页`,toggleSidebar:`展开/收起侧边栏`,switchToPreviousBackend:`切换到上一个后端`,switchToNextBackend:`切换到下一个后端`,keyboardShortcutsConflict:`检测到重复快捷键:{keys}。只有第一项会生效。`,resetKeyboardShortcuts:`重置快捷键`,pressAnyKey:`按下任意键`,displayAllFeatures:`显示所有功能`,displayAllFeaturesTip:`显示所有功能,包括当前内核(honk)官方版本不支持的功能,如果您使用的 fork 版本支持其中的某些功能,可以尝试启用`,blurIntensity:`毛玻璃强度`,scrollAnimationEffect:`滚动动画效果`,importFromFile:`从文件导入`,importFromUrl:`从 URL 导入`,uploadSettingsSuccess:`设置上传成功`,uploadSettingsIconReflectListRemoved:`自定义图标数据过长,上传时已自动移除这部分内容,请精简后重试。`,syncSettingsSuccess:`设置同步成功`,syncSettingsConfirm:`后端存储的设置将覆盖以下本地设置:
{keys}
是否应用?`,importSettingsConfirm:`导入的设置将覆盖以下本地设置:
{keys}
是否应用?`,dontAskAgainAlwaysApply:`不再提示,以后自动应用`,confirmBeforeOverride:`覆盖本地设置前确认`,deleteUploadedSettingsSuccess:`已上传设置删除成功`,deleteUploadedSettingsConfirm:`确定要删除后端上已上传的设置吗?此操作不可撤销。`,upgradeSuccess:`升级成功`,numberOfChartsInSidebar:`侧边栏图表数量`,flushSmartWeights:`清空Smart权重`,IPInfoAPI:`IP信息API`,IPInfoAPITip:`此API仅用于连接详情与面板DNS查询中的IP地理信息查询;IP检查与地球组件使用各自的API选项。`,general:`通用`,groupProxiesByProvider:`节点根据提供商分组`,useSmartGroupSort:`Smart组根据使用频率排序`,all:`全部`,autoDisconnectIdleUDP:`自动断开空闲UDP`,autoDisconnectIdleUDPTime:`UDP空闲时间`,autoDisconnectIdleUDPTip:`启用后,打开zashboard时将关闭持续时间超过配置分钟数的UDP连接,这可能对某些无法正常自动断开的UDP连接带来帮助。(这是作者自己的私货,你大概率不需要打开它)`,connectionTopology:`连接拓扑`,applyConnectionFilter:`应用连接筛选`,topologyPause:`暂停拓扑更新`,topologyResume:`继续拓扑更新`,topologyExpand:`扩展拓扑画面`,topologyCollapse:`还原拓扑画面`,editBackend:`编辑后端`,editBackendTitle:`修改后端配置`,addBackend:`添加后端`,manageBackends:`管理后端`,noBackendYet:`还没有后端`,backendConnectionFailed:`后端连接失败,请检查配置信息`,backendConfigSaved:`后端配置保存成功`,saveFailed:`保存失败`,checking:`检查中...`,copySuccess:`复制成功`,importFromBackendTip:`默认的./zashboard-settings.json位于ui文件夹下,导入前请确保ui文件夹下存在配置文件。`,importFailed:`导入失败,请检查url {url}`,autoImportFromUrl:`自动导入`,autoImportFromUrlTip:`启用后,每次打开zashboard时会自动从url设置导入并计算hash,如果hash与上次导入的hash不同,则重新导入并刷新页面。`,getting:`获取中...`,mmdbSizeTip:`mmdb等格式的geo文件无法统计数量,因此数量为0`,displayFinalOutbound:`显示最终出口节点`,groupTestUrls:`组测试链接`,groupTestUrlsTip:`对于从面板手动触发的测试,此处设置测试链接 > 配置中的链接 > 面板全局测试链接,但是对于UrlTest/Fallback等具有核心内部的定时测速逻辑的组,仍然需要修改配置中的链接,此处仅推荐Selector等场景`,groupName:`组名`,unknown:`未知`,sourceIPAddress:`源IP地址`,ruleMatch:`规则匹配`,proxyChainEntry:`代理链入口`,proxyChainExit:`代理链出口`,nodeType:`节点类型`,connectionCount:`连接数`,zashboardSettings:`面板设置`,backendSettings:`后端设置`,generalSettings:`常规设置`,overviewSettings:`概览设置`,overviewCardSettings:`卡片设置`,chartsCard:`图表卡片`,networkCard:`网络卡片`,providerTrafficOverview:`提供商流量概览`,topologyCharts:`拓扑图表`,earthGlobeCard:`全球连接`,earthGlobeTitle:`全球连接`,earthProjection:`投影方式`,earthVisualStyle:`地球样式`,earthVisualStyle_space:`星空`,earthVisualStyle_flat:`扁平`,earthOriginAPI:`公网 IP 服务`,earthLocalIP:`本机 IP`,earthToggleIP:`显示或隐藏本机 IP`,earthHideCityLabels:`隐藏城市名称`,earthShowCityLabels:`显示城市名称`,earthPauseRotation:`停止地球自转`,earthResumeRotation:`继续地球自转`,earthExpand:`扩展地球画面`,earthCollapse:`还原地球画面`,earthConnectionLine:`连接线路`,earthLegend:`端点图例`,earthLegendProxied:`经代理`,earthDatabaseChecking:`正在检查本地城市数据库…`,earthDatabaseLoading:`正在加载缓存的城市数据库…`,earthDatabaseConsentTitle:`下载本地城市数据库?`,earthDatabaseConsent:`所有连接端点都只在此浏览器中查询。DB-IP City Lite 下载约需 {download},解压后约占 {stored} 本地存储空间。`,earthDatabaseCacheRecovered:`已移除损坏的数据库缓存,请下载完整副本以恢复定位。`,earthDatabaseDownload:`下载数据库`,earthDatabaseLearnMore:`了解 DB-IP City Lite`,earthDatabaseDownloading:`正在下载城市数据库`,earthDatabaseError_space:`浏览器可用存储空间不足,无法保存城市数据库。`,earthDatabaseError_network:`城市数据库下载失败。`,earthDatabaseError_decompress:`城市数据库解压失败。`,earthDatabaseError_invalid:`下载的城市数据库无效。`,earthDatabaseError_storage:`无法将城市数据库保存到浏览器存储。`,earthDatabaseError_unsupported:`当前浏览器无法解压城市数据库。`,earthDatabaseError_unknown:`无法加载城市数据库。`,earthOriginError:`无法探测本机公网 IP,请重试后再定位连接。`,earthNoConnections:`暂无活跃连接`,earthNoLocatedConnections:`无法定位当前活跃连接的端点`,earthEndpointRole:`角色`,earthTopDownloadedHosts:`下载量 Top 5 Host`,earthRole_origin:`本机`,earthRole_destination:`目的地`, Line truncated
記錄開始時間:{statsStartTime}`,manual:`手動`,tableWidthMode:`表格寬度模式`,testFailed:`測速超時`,testFinishedTip:`{name}
{number}/{total} 測試完成`,testFinishedResultTip:`{name}
測試完成: {success} 成功,{failed} 超時`,testFailedTip:`{name}
測速超時`,updateFinishedTip:`{number} 更新完成`,independentLatencyTest:`獨立延遲測試`,independentLatencyTestTip:`開啟獨立延遲測試會在測速中盡可能的使用配置檔案中的url覆蓋面板設定的url,並展示根據策略組設定的url獲取的延遲。`,search:`搜尋`,searchVisibleColumns:`僅搜尋展示的欄位`,searchHiddenColumns:`搜尋包含隱藏的欄位`,searchProxyGroup:`搜尋代理組`,searchProxyNode:`搜尋節點`,proxySearchModeGlobal:`節點搜尋`,proxySearchModeGroup:`策略組搜尋`,importing:`正在匯入`,hideConnection:`隱藏連接`,showConnection:`顯示連接`,hideConnectionRegex:`隱藏連接正則`,hideConnectionTip:`可通過不區分大小寫的正則表達式來匹配並隱藏不需要看到的連接`,hideLog:`隱藏日誌`,showLog:`顯示日誌`,hideLogRegex:`隱藏日誌正則`,hideLogTip:`可通過不區分大小寫的正則表達式來匹配並隱藏不需要看到的日誌`,loadBalance:`負載均衡`,label:`標籤`,optional:`可選`,swipeInTabs:`滑動切換頁面二級標籤`,swipeInPages:`滑動切換頁面`,simpleCardPreset:`簡潔預設`,detailedCardPreset:`詳細預設`,refresh:`重新整理`,reset:`重設`,resetSettings:`恢復預設設定`,resetSettingsConfirm:`確定要將面板設定恢復為預設值嗎?此操作無法復原。`,backgroundToneSwitchConfirm:`檢測到這張背景圖更適合使用{theme},是否切換?`,backgroundToneLightThemeLabel:`淺色主題`,backgroundToneDarkThemeLabel:`深色主題`,minProxyCardWidth:`節點卡片最小寬度`,displayGlobalByMode:`根據模式顯示 GLOBAL`,displaySelectedNode:`顯示選中節點`,displayLatencyNumber:`顯示延遲數字`,disconnectOnRuleDisable:`禁用規則時打斷連接`,tipForFixed:`當前策略組被固定在了當前節點,點擊測速來恢復{type}行為`,remoteAddress:`遠端地址`,save:`儲存`,moreDetails:`更多詳情`,moreSettings:`更多設定`,customIcon:`自訂圖示`,dropOrClickUpload:`拖曳圖片或輸入 URL`,disablePullToRefresh:`禁用下拉重新整理`,disablePullToRefreshTip:`下拉重新整理和虛擬滾動的組件有時會有衝突,如果你在上下滾動的時候經常卡頓或者誤觸發下拉重新整理,可以嘗試禁用下拉重新整理`,keyboardShortcuts:`快捷鍵設定`,keyboardShortcutsTip:`點擊輸入框後可直接按單鍵或組合鍵設定快捷鍵,按 Backspace 或 Delete 可清空。`,keyboardShortcutPageName:`{name}頁`,toggleSidebar:`展開/收起側邊欄`,switchToPreviousBackend:`切換到上一個後端`,switchToNextBackend:`切換到下一個後端`,keyboardShortcutsConflict:`偵測到重複快捷鍵:{keys}。只有第一項會生效。`,resetKeyboardShortcuts:`重設快捷鍵`,pressAnyKey:`按下任意鍵`,displayAllFeatures:`顯示所有功能`,displayAllFeaturesTip:`顯示所有功能,包括目前核心(honk)官方版本不支援的功能,如果您使用的 fork 版本支援其中的某些功能,可以嘗試啟用`,blurIntensity:`毛玻璃強度`,scrollAnimationEffect:`滾動動畫效果`,importFromFile:`從檔案匯入`,importFromUrl:`從 URL 匯入`,uploadSettingsSuccess:`設定上傳成功`,uploadSettingsIconReflectListRemoved:`自訂圖示資料過長,上傳時已自動移除這部分內容,請精簡後再試。`,syncSettingsSuccess:`設定同步成功`,syncSettingsConfirm:`後端儲存的設定將覆蓋以下本地設定:
{keys}
是否套用?`,importSettingsConfirm:`匯入的設定將覆蓋以下本地設定:
{keys}
是否套用?`,dontAskAgainAlwaysApply:`不再提示,以後自動套用`,confirmBeforeOverride:`覆蓋本地設定前確認`,deleteUploadedSettingsSuccess:`已上傳設定刪除成功`,deleteUploadedSettingsConfirm:`確定要刪除後端上已上傳的設定嗎?此操作無法復原。`,upgradeSuccess:`升級成功`,numberOfChartsInSidebar:`側邊欄圖表數量`,flushSmartWeights:`清空Smart權重`,IPInfoAPI:`IP資訊API`,IPInfoAPITip:`此API僅用於連接詳情與面板DNS查詢中的IP地理資訊查詢;IP檢查與地球元件使用各自的API選項。`,general:`通用`,groupProxiesByProvider:`節點根據提供商分組`,useSmartGroupSort:`Smart組根據使用頻率排序`,all:`全部`,autoDisconnectIdleUDP:`自動斷開空閒UDP`,autoDisconnectIdleUDPTime:`UDP空閒時間`,autoDisconnectIdleUDPTip:`啟用後,開啟zashboard時將關閉持續時間超過配置分鐘數的UDP連接,這可能對某些無法正常自動斷開的UDP連接帶來幫助。(這是作者自己的私貨,你大概率不需要開啟它)`,connectionTopology:`連接拓撲`,applyConnectionFilter:`套用連接篩選`,topologyPause:`暫停拓撲更新`,topologyResume:`繼續拓撲更新`,topologyExpand:`展開拓撲畫面`,topologyCollapse:`還原拓撲畫面`,editBackend:`編輯後端`,editBackendTitle:`修改後端配置`,addBackend:`新增後端`,manageBackends:`管理後端`,noBackendYet:`還沒有後端`,backendConnectionFailed:`後端連接失敗,請檢查配置資訊`,backendConfigSaved:`後端配置儲存成功`,saveFailed:`儲存失敗`,checking:`檢查中...`,copySuccess:`複製成功`,importFromBackendTip:`預設的./zashboard-settings.json位於ui資料夾下,匯入前請確保ui資料夾下存在配置檔案。`,importFailed:`匯入失敗,請檢查url {url}`,autoImportFromUrl:`自動匯入`,autoImportFromUrlTip:`啟用後,每次開啟zashboard時會自動從url設定匯入並計算hash,如果hash與上次匯入的hash不同,則重新匯入並重新整理頁面。`,getting:`獲取中...`,mmdbSizeTip:`mmdb等格式的geo檔案無法統計數量,因此數量為0`,displayFinalOutbound:`顯示最終出口節點`,groupTestUrls:`組測試連結`,groupTestUrlsTip:`對於從面板手動觸發的測試,此處設定測試連結 > 配置中的連結 > 面板全域測試連結,但是對於UrlTest/Fallback等具有核心內部的定時測速邏輯的組,仍然需要修改配置中的連結,此處僅推薦Selector等場景`,groupName:`組名`,unknown:`未知`,sourceIPAddress:`源IP地址`,ruleMatch:`規則匹配`,proxyChainEntry:`代理鏈入口`,proxyChainExit:`代理鏈出口`,nodeType:`節點類型`,connectionCount:`連接數`,zashboardSettings:`面板設置`,backendSettings:`後端設置`,generalSettings:`常規設置`,overviewSettings:`概覽設置`,overviewCardSettings:`卡片設置`,chartsCard:`圖表卡片`,networkCard:`網絡卡片`,providerTrafficOverview:`提供商流量概覽`,topologyCharts:`拓撲圖表`,earthGlobeCard:`全球連接`,earthGlobeTitle:`全球連接`,earthProjection:`投影方式`,earthVisualStyle:`地球樣式`,earthVisualStyle_space:`星空`,earthVisualStyle_flat:`扁平`,earthOriginAPI:`公網 IP 服務`,earthLocalIP:`本機 IP`,earthToggleIP:`顯示或隱藏本機 IP`,earthHideCityLabels:`隱藏城市名稱`,earthShowCityLabels:`顯示城市名稱`,earthPauseRotation:`停止地球自轉`,earthResumeRotation:`繼續地球自轉`,earthExpand:`展開地球畫面`,earthCollapse:`還原地球畫面`,earthConnectionLine:`連接線路`,earthLegend:`端點圖例`,earthLegendProxied:`經代理`,earthDatabaseChecking:`正在檢查本機城市資料庫…`,earthDatabaseLoading:`正在載入快取的城市資料庫…`,earthDatabaseConsentTitle:`下載本機城市資料庫?`,earthDatabaseConsent:`所有連接端點都只在此瀏覽器中查詢。DB-IP City Lite 下載約需 {download},解壓後約占 {stored} 本機儲存空間。`,earthDatabaseCacheRecovered:`已移除損壞的資料庫快取,請下載完整副本以恢復定位。`,earthDatabaseDownload:`下載資料庫`,earthDatabaseLearnMore:`瞭解 DB-IP City Lite`,earthDatabaseDownloading:`正在下載城市資料庫`,earthDatabaseError_space:`瀏覽器可用儲存空間不足,無法儲存城市資料庫。`,earthDatabaseError_network:`城市資料庫下載失敗。`,earthDatabaseError_decompress:`城市資料庫解壓失敗。`,earthDatabaseError_invalid:`下載的城市資料庫無效。`,earthDatabaseError_storage:`無法將城市資料庫儲存到瀏覽器。`,earthDatabaseError_unsupported:`目前瀏覽器無法解壓城市資料庫。`,earthDatabaseError_unknown:`無法載入城市資料庫。`,earthOriginError:`無法偵測本機公網 IP,請重試後再定位連接。`,earthNoConnections:`暫無作用中的連接`,earthNoLocatedConnections:`無法定位目前作用中連接的端點`,earthEndpointRole:`角色`,earthTopDownloadedHosts:`下載量 Top 5 Host`,earthRole_origin:`本機`,earthRole_destination:`Line truncated
<svg class="size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5" />
</svg>
`,error:`
<svg class="size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
</svg>
`,warning:`
<svg class="size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9.303 3.376c.866 1.5-.217 3.374-1.948 3.374H4.645c-1.73 0-2.813-1.874-1.948-3.374L10.052 3.37c.866-1.5 3.03-1.5 3.896 0l7.355 12.756ZM12 15.75h.008v.008H12v-.008Z" />
</svg>
`,info:`
<svg class="size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" />
</svg>
`,neutral:`
<svg class="size-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.25 4.533A9.707 9.707 0 0 0 6 3c-1.846 0-3.543.507-5 1.395v15.36A9.697 9.697 0 0 1 6 18c1.956 0 3.77.578 5.25 1.566m0-15.033A9.707 9.707 0 0 1 16.5 3c1.846 0 3.543.507 5 1.395v15.36A9.697 9.697 0 0 0 16.5 18a9.707 9.707 0 0 0-5.25 1.566m0-15.033v15.033" />
</svg>
`},Xie=`app-toast border-base-border bg-base-100/95 pointer-events-auto relative grid w-full items-start gap-x-3 overflow-hidden rounded-xl border p-3 shadow-lg backdrop-blur origin-top-right`,Zie=e=>e?e.replace(`alert-`,``):`neutral`,Xb=new Map,Zb=null,Qie=e=>{Zb=e},$ie=e=>{let t=Xb.get(e);t&&t.timer!==-1&&!t.isPaused&&(clearTimeout(t.timer),t.isPaused=!0,t.remainingTime-=Date.now()-t.startTime,t.progressBar.style.animationPlayState=`paused`)},eae=e=>{let t=Xb.get(e);t&&t.timer!==-1&&t.isPaused&&(t.isPaused=!1,t.startTime=Date.now(),t.timer=setTimeout(()=>{Xb.delete(e),$b(t.alert)},t.remainingTime),t.progressBar.style.animationPlayState=`running`)},Qb=(e,t,n,r)=>{let i=-1;r?.parentElement?.toggleAttribute(`hidden`,t===0),t!==0&&(r&&(r.style.animation=`none`,r.offsetWidth,r.style.animation=`progressBar ${t}ms linear forwards`),i=setTimeout(()=>{n&&Xb.delete(n),$b(e)},t)),n&&r&&Xb.set(n,{alert:e,timer:i,progressBar:r,startTime:Date.now(),remainingTime:t,isPaused:!1})},$b=e=>{e.classList.contains(`is-leaving`)||(e.classList.add(`is-leaving`),window.setTimeout(()=>e.remove(),160))},ex=(e,t)=>{if(t){let e=Xb.get(t);e&&(clearTimeout(e.timer),Xb.delete(t))}$b(e)},tx=(e,t,n,r,i)=>{let a=Zie(r);e.className=Xie,e.dataset.toastType=a,e.setAttribute(`role`,a===`error`?`alert`:`status`),e.setAttribute(`aria-live`,a===`error`?`assertive`:`polite`);let o=document.createElement(`div`);o.className=`bg-(--toast-accent) h-full min-h-7 w-1 rounded-full`,o.setAttribute(`aria-hidden`,`true`);let s=document.createElement(`div`);s.className=`bg-(--toast-accent)/12 text-(--toast-accent) grid size-7 place-items-center rounded-lg`,s.setAttribute(`aria-hidden`,`true`),s.innerHTML=Yie[a];let c=document.createElement(`div`);c.className=`app-toast__content`,c.innerHTML=Yb(t,n);let l=document.createElement(`button`);l.type=`button`,l.className=`btn btn-circle btn-ghost btn-xs text-base-content/48 hover:bg-base-content/8 hover:text-base-content size-6 min-h-6 p-0`,l.setAttribute(`aria-label`,Yb(`close`)),l.innerHTML=`
<svg class="size-3.5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.75" stroke="currentColor" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg>
`,l.addEventListener(`click`,()=>ex(e,i));let u=document.createElement(`div`);u.className=`bg-base-content/6 absolute right-3 bottom-1 left-3 h-0.5 overflow-hidden rounded-full`;let d=document.createElement(`div`);return d.className=`bg-(--toast-accent)/55 h-full w-full origin-left rounded-[inherit]`,u.appendChild(d),e.replaceChildren(o,s,c,l,u),e.onmouseenter=()=>$ie(i),e.onmouseleave=()=>eae(i),d},tae=e=>{let t=Xb.get(e);t&&ex(t.alert,e)},nx=e=>{let t=`action:${e}`;return rx({key:t,content:`actionRunning`,params:{action:Yb(e)},type:`alert-info`,timeout:0}),t},rx=({content:e,params:t={},key:n,type:r=`alert-warning`,timeout:i=3e3})=>{let a=n||e;if(a&&Xb.has(a)){let{alert:n,timer:o}=Xb.get(a);clearTimeout(o),Qb(n,i,a,tx(n,e,t,r,a));return}let o=document.createElement(`div`),s=tx(o,e,t,r,a);Zb?.value?.insertBefore(o,Zb?.value?.firstChild),Qb(o,i,a,s)};bv.interceptors.request.use(e=>(Cg.value&&(e.baseURL=Em(Cg.value),e.headers.Authorization=`Bearer `+Cg.value.password),e)),bv.interceptors.response.use(null,e=>{if(e.status===401&&Sg.value){let e=Sg.value;Tg.value?.mode===`edit`&&Tg.value.uuid===e||(Eg({mode:`edit`,uuid:e}),Mr(()=>{rx({content:`unauthorizedTip`})}))}return Promise.reject(e)});var nae=()=>bv.get(`/version`),rae=()=>bv.get(`/proxies`),iae=(e,t)=>bv.put(`/proxies/${encodeURIComponent(e)}`,{name:t}),aae=e=>bv.delete(`/proxies/${encodeURIComponent(e)}`),oae=(e,t,n)=>bv.get(`/proxies/${encodeURIComponent(e)}/delay`,{params:{url:t,timeout:n}}),sae=(e,t,n,r)=>bv.get(`/providers/proxies/${encodeURIComponent(e)}/${encodeURIComponent(t)}/healthcheck`,{params:{url:n,timeout:r}}),cae=(e,t,n)=>bv.get(`/group/${encodeURIComponent(e)}/delay`,{params:{url:t,timeout:n}}),lae=()=>bv.get(`/providers/proxies`),uae=e=>bv.put(`/providers/proxies/${encodeURIComponent(e)}`),dae=e=>bv.get(`/providers/proxies/${encodeURIComponent(e)}/healthcheck`,{timeout:15e3}),fae=()=>bv.get(`/rules`),pae=()=>bv.get(`/providers/rules`),mae=e=>bv.put(`/providers/rules/${encodeURIComponent(e)}`),hae=e=>bv.delete(`/connections/${e}`),gae=()=>bv.delete(`/connections`),_ae=()=>bv.get(`/configs`),vae=e=>bv.patch(`/configs`,e),yae=()=>bv.post(`/cache/fakeip/flush`),bae=()=>bv.post(`/cache/dns/flush`),xae=e=>bv.get(`/dns/query`,{params:e}),ix=(e,t)=>{let n=Cg.value,r=new URL(`${Em(n).replace(`http`,`ws`)}/${e}`);r.searchParams.append(`token`,n.password||``),t&&Object.entries(t).forEach(([e,t])=>{r.searchParams.append(e,t)});let i=mn(),a=new Gne.default(r.toString()),o=()=>{a.close()},s=({data:e})=>{i.value=JSON.parse(e)};return a.onmessage=e===`logs`?s:(0,vg.debounce)(s,100),{data:i,close:o}},Sae=async(e,t,n)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),t),a=()=>r.abort();n?.addEventListener(`abort`,a,{once:!0});let o=Date.now(),s=()=>Date.now()-o;try{let t=await fetch(`${Em(e)}/version`,{method:`GET`,headers:{Authorization:`Bearer ${e.password}`},signal:r.signal});return t.ok?{ok:!0,latency:s()}:{ok:!1,latency:s(),kind:t.status===401?`unauthorized`:`http`,message:`HTTP ${t.status}`}}catch(e){return{ok:!1,latency:s(),kind:r.signal.aborted?`timeout`:`network`,message:e instanceof Error?e.message:String(e)}}finally{clearTimeout(i),n?.removeEventListener(`abort`,a)}},Cae=e=>bv.patch(`/rules/disable`,e),wae=()=>bv.put(`/configs?reload=true`,{path:``,payload:``}),Tae=(e,t=!1)=>bv.put(`/configs${t?`?force=true`:``}`,{path:e.path||``,payload:e.payload||``}),Eae=()=>bv.post(`/configs/geo`),Dae=e=>{let t=e===`auto`?`/upgrade`:`/upgrade?channel=${e}`;return bv.post(t)},Oae=()=>bv.post(`/restart`),kae=()=>bv.post(`/upgrade/ui`),Aae=()=>bv.get(`/storage/zashboard`),jae=e=>bv.put(`/storage/zashboard`,e),Mae=()=>bv.delete(`/storage/zashboard`),Nae=()=>bv.get(`/group/weights`),Pae=()=>bv.post(`/cache/smart/flush`),Fae=e=>bv.delete(`/connections/smart/${e}`),Iae=()=>bv.get(`/stats`),Lae=e=>bv.put(`/rules/${encodeURIComponent(e)}`),ax=function(e){return e.Mihomo=`mihomo`,e.Honk=`honk`,e.Unknown=`unknown`,e}({}),ox=I(`unknown`),sx=()=>{ox.value=`unknown`},cx=Y(()=>ox.value===`honk`),lx=Y(()=>cx.value&&nh.value),ux=Y(()=>!!Cg.value&&cx.value),dx=Y(()=>{let e=ox.value===`mihomo`,t=ox.value===`honk`,n=e||lx.value;return{coreUpgrade:n,coreRestart:n,dashboardUpgrade:n,reloadConfigs:n,updateConfigs:n,updateGeoDatabase:n,syncSettings:n,independentLatency:n,coreUpdateCheck:e,configPatch:e,traceLogLevel:t,silentLogLevel:e,runtimeStats:t}}),fx=e=>Cg.value?dx.value[e]:!1,px=I([]),mx=I({}),hx=X(`cache/ipv6-map`,{}),gx=I([]),_x=Y(()=>Eh.value||`https://www.gstatic.com/generate_204`),vx=e=>{if(!e||!Dh.value)return _x.value;let t=Jh.value.find(t=>t.name===e);return t?t.url:(mx.value[e]||gx.value.find(t=>t.name===e))?.testUrl||_x.value},Rae=e=>(0,vg.last)(e)?.delay??0,yx=``,bx=new Map,zae=(e,t)=>{let n=mx.value[e];if(t!==yx){if(!n)return;if(n.extra)return n.extra[t]?.history}return mx.value[Dx(e)]?.history},Bae=bt(!0),xx=e=>{let t=bx.get(e);return t||(t=Bae.run(()=>Y(()=>{let t=new Map;for(let n of Object.keys(mx.value))t.set(n,Rae(zae(n,e)));return t})),bx.set(e,t Line truncated
${n}
}`,t.className=`custom-theme ${e.name}`,document.head.appendChild(t)})},_C=()=>{let e=`custom-css`,t=Jm.value.trim(),n=document.getElementById(e);if(!t){n?.remove();return}n||(n=document.createElement(`style`),n.id=e,document.head.appendChild(n)),n.textContent=t},zoe=()=>{if(window.ksu){let e=document.createElement(`link`);e.rel=`stylesheet`,e.href=`https://mui.kernelsu.org/internal/colors.css`,document.head.appendChild(e)}},vC=e=>Reflect.has(aC.value,e)?aC.value[e]:mx.value[e]?.hidden,yC=e=>{rx({key:e,content:`upgradeSuccess`,type:`alert-success`})},Boe=class{value;next;constructor(e){this.value=e}},Voe=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Boe(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function bC(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),xC(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let n=new Voe,r=0,i=()=>{r<e&&n.size>0&&(r++,n.dequeue().run())},a=()=>{r--,i()},o=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}a()},s=(t,a,s,c)=>{let l={reject:s};new Promise(e=>{l.run=e,n.enqueue(l)}).then(o.bind(void 0,t,a,c)),r<e&&i()},c=(e,...t)=>new Promise((n,r)=>{s(e,n,r,t)});return Object.defineProperties(c,{activeCount:{get:()=>r},pendingCount:{get:()=>n.size},clearQueue:{value(){if(!t){n.clear();return}let e=AbortSignal.abort().reason;for(;n.size>0;)n.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){xC(t),e=t,queueMicrotask(()=>{for(;r<e&&n.size>0;)i()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>c(t,e,n));return Promise.all(n)}}}),c}function xC(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}var SC=(e,t,n)=>{let r=Uae(e);return r?Rx().proxies.testProviderNode(r,e,t,n):Rx().proxies.testNode(e,t,n)},CC=async(e,t,n)=>{let r=Dx(e);if(Rh.value)try{hx.value[r]=await SC(r,Sp,2e3)>0}catch{hx.value[r]=!1}return await SC(Dh.value?e:r,t,n)},wC=(e,t)=>Dh.value?`${e}\n@${t}`:e,Hoe=async(e,t=_x.value,n=Oh.value)=>{try{await CC(e,t,n)}catch{rx({content:`testFailedTip`,params:{name:wC(e,t)},type:`alert-error`})}finally{await eC()}},TC=(e,t,n)=>{Ex(e,n).push({time:new Date().toISOString(),delay:t})},EC=`testLatencyOneByOneWithTip`,Uoe=bC(5),DC=async(e,t,n=_x.value,r)=>{let i=t.length,a=0,o=0;await Promise.allSettled(t.map(t=>Uoe(async()=>{try{TC(t,await CC(t,n,Math.min(2e3,Oh.value)),r)}catch{o++,TC(t,0,r)}finally{a++,rx({content:`testFinishedTip`,key:EC+e,params:{name:wC(e,n),total:i.toString(),number:a.toString()},type:`alert-info`,timeout:0})}}))),await eC().catch(()=>{}),rx({content:`testFinishedResultTip`,key:EC+e,params:{name:wC(e,n),total:i.toString(),success:`${i-o}`,failed:`${o}`},type:o?`alert-warning`:`alert-success`,timeout:3e3})},OC=async e=>{let t=mx.value[e],n=(t.all??[]).filter(Ax),r=vx(e);if(kh.value===Mp.DASHBOARD&&[Yp.Selector,Yp.LoadBalance,Yp.Smart].includes(t.type.toLowerCase()))return t.fixed&&Rx().proxies.clearFixed(e).catch(()=>{}),DC(e,n,r,e);let i=Math.max(5e3,Oh.value);if(Rh.value)try{let t=await Rx().proxies.testGroup(e,Sp,i);n?.forEach(e=>{hx.value[Dx(e)]=t[e]>0})}catch{n?.forEach(e=>{hx.value[Dx(e)]=!1})}try{await Rx().proxies.testGroup(e,r,i)}catch(e){XS(e);return}finally{await eC()}let a=n.length,o=n.filter(t=>Tx(t,e)===0).length;rx({content:`testFinishedResultTip`,key:EC+e,params:{name:wC(e,r),total:a.toString(),success:`${a-o}`,failed:`${o}`},type:o?`alert-warning`:`alert-success`,timeout:3e3})},Woe=async()=>{if(Dh.value){let e=bC(3);return await Promise.all(px.value.map(t=>e(async()=>{await OC(t)})))}let e=Object.keys(mx.value).filter(e=>!oC(e)&&Ax(e));return DC(Jb.global.t(`all`),e)},kC=I([]),AC=I([]),jC=async()=>{let e=await Rx().rules.fetch();kC.value=e.rules,AC.value=e.providers},Goe=(e,t)=>Rx().rules.toggleDisabled(e,t),MC=e=>Rx().rules.updateProvider(e),Koe=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2064%2064'%20width='64'%20height='64'%3e%3crect%20width='64'%20height='64'%20rx='14'%20fill='%23111827'%20/%3e%3cpath%20d='M30%2024C30%2036%2032%2044%2038%2052'%20fill='none'%20stroke='%23f9fafb'%20stroke-width='11'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='27'%20cy='21'%20r='11'%20fill='%23f9fafb'%20/%3e%3cpath%20d='M36%2016%20L54%2021%20L36%2027%20Z'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='25'%20cy='18'%20r='2.4'%20fill='%23111827'%20/%3e%3c/svg%3e`,qoe=``+new URL(`metacubex-BlQkOUXT.jpg`,import.meta.url).href,Joe=1e3*60*60,NC=async(e,t)=>{let n=`cache/`+e,r=localStorage.getItem(n);if(r)try{let e=JSON.parse(r);if(Date.now()-e.timestamp<Joe&&e.version===t)return e.data;localStorage.removeItem(n)}catch(t){co Line truncated
Details: ${a}`:``}`,s=SyntaxError(o);s.code=e,n&&(s.loc=n),t.onWarn(s)}function UO(e){throw e}function WO(e){}function GO(e,t,n,r){let i=`https://vuejs.org/error-reference/#compiler-${e}`,a=SyntaxError(String(i));return a.code=e,a.loc=t,a}function Lde(e,t,n=!1,r=[],i=Object.create(null)){}function Rde(e,t,n){return!1}function zde(e,t){if(e&&(e.type===`ObjectProperty`||e.type===`ArrayPattern`)){let e=t.length;for(;e--;){let n=t[e];if(n.type===`AssignmentExpression`)return!0;if(n.type!==`ObjectProperty`&&!n.type.endsWith(`Pattern`))break}}return!1}function Bde(e){let t=e.length;for(;t--;){let n=e[t];if(n.type===`NewExpression`)return!0;if(n.type!==`MemberExpression`)break}return!1}function Vde(e,t){for(let n of e.params)for(let e of qO(n))t(e)}function KO(e,t){let n=e.type===`SwitchCase`?e.consequent:e.body;for(let e of n)if(e.type===`VariableDeclaration`){if(e.declare)continue;for(let n of e.declarations)for(let e of qO(n.id))t(e)}else if(e.type===`FunctionDeclaration`||e.type===`ClassDeclaration`){if(e.declare||!e.id)continue;t(e.id)}else Hde(e)?Ude(e,!0,t):e.type===`SwitchStatement`&&Wde(e,!0,t)}function Hde(e){return e.type===`ForOfStatement`||e.type===`ForInStatement`||e.type===`ForStatement`}function Ude(e,t,n){let r=e.type===`ForStatement`?e.init:e.left;if(r&&r.type===`VariableDeclaration`&&(r.kind===`var`?t:!t))for(let e of r.declarations)for(let t of qO(e.id))n(t)}function Wde(e,t,n){for(let r of e.cases){for(let e of r.consequent)if(e.type===`VariableDeclaration`&&(e.kind===`var`?t:!t))for(let t of e.declarations)for(let e of qO(t.id))n(e);KO(r,n)}}function qO(e,t=[]){switch(e.type){case`Identifier`:t.push(e);break;case`MemberExpression`:let n=e;for(;n.type===`MemberExpression`;)n=n.object;t.push(n);break;case`ObjectPattern`:for(let n of e.properties)n.type===`RestElement`?qO(n.argument,t):qO(n.value,t);break;case`ArrayPattern`:e.elements.forEach(e=>{e&&qO(e,t)});break;case`RestElement`:qO(e.argument,t);break;case`AssignmentPattern`:qO(e.left,t);break}return t}function JO(e){return _j.includes(e.type)?JO(e.expression):e}function YO(e){switch(e){case`Teleport`:case`teleport`:return gA;case`Suspense`:case`suspense`:return _A;case`KeepAlive`:case`keep-alive`:return vA;case`BaseTransition`:case`base-transition`:return yA}}function Gde(e,t,n=t.length){return XO({offset:e.offset,line:e.line,column:e.column},t,n)}function XO(e,t,n=t.length){let r=0,i=-1;for(let e=0;e<n;e++)t.charCodeAt(e)===10&&(r++,i=e);return e.offset+=n,e.line+=r,e.column=i===-1?e.column+n:n-i,e}function Kde(e,t){if(!e)throw Error(t||`unexpected compiler condition`)}function ZO(e,t,n=!1){for(let r=0;r<e.props.length;r++){let i=e.props[r];if(i.type===7&&(n||i.exp)&&(pe(t)?i.name===t:t.test(i.name)))return i}}function QO(e,t,n=!1,r=!1){for(let i=0;i<e.props.length;i++){let a=e.props[i];if(a.type===6){if(n)continue;if(a.name===t&&(a.value||r))return a}else if(a.name===`bind`&&(a.exp||r)&&$O(a.arg,t))return a}}function $O(e,t){return!!(e&&vj(e)&&e.content===t)}function ek(e){return e.props.some(e=>e.type===7&&e.name===`bind`&&(!e.arg||e.arg.type!==4||!e.arg.isStatic))}function tk(e){return e.type===5||e.type===2}function nk(e){return e.type===7&&e.name===`pre`}function rk(e){return e.type===7&&e.name===`slot`}function ik(e){return e.type===1&&e.tagType===3}function ak(e){return e.type===1&&e.tagType===2}function ok(e,t=[]){if(e&&!pe(e)&&e.type===14){let n=e.callee;if(!pe(n)&&Mj.has(n))return ok(e.arguments[0],t.concat(e))}return[e,t]}function sk(e,t,n){if(e.type!==13&&qde(e,t))return;let r,i=e.type===13?e.props:e.arguments[2],a=[],o;if(i&&!pe(i)&&i.type===14){let e=ok(i);i=e[0],a=e[1],o=a[a.length-1]}if(i==null||pe(i))r=wO([t]);else if(i.type===14){let e=i.arguments[0];!pe(e)&&e.type===15?ck(t,e)||e.properties.unshift(t):i.callee===HA?r=OO(n.helper(LA),[wO([t]),i]):i.arguments.unshift(wO([t])),!r&&(r=i)}else i.type===15?(ck(t,i)||i.properties.unshift(t),r=i):(r=OO(n.helper(LA),[wO([t]),i]),o&&o.callee===VA&&(o=a[a.length-2]));e.type===13?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function qde(e,t){var n,r,i;if(t.key.type!==4||t.key.content!==`key`)return!1;let a=e.arguments[2];if(a&&!pe(a)){let[e]=ok(a);if(e&&!pe(e)&&e.type===15&&ck(t,e))return!0}return(n=e.arguments)[2]||(n[2]=`{}`),(r=e.arguments)[3]||(r[3]=`undefined`),(i=e.arguments)[4]||(i[4]=`undefined`),e.arguments[5]=t.value,!0}function ck(e,t){let n=!1;if(e.key.type===4){let r=e.key.content;n=t.properties.some(e=>e.key.type===4&&e.key.content===r)}return n}function lk(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>t===`-`?`_`:e.charCodeAt(n).toString())}`}function uk(e,t){if(!e||Object.keys(t).length===0)return!1;switch(e.type){case 1:for(let n=0;n<e.props.length;n++){let r=e.props[n];if(r.type===7&&(uk(r.arg,t)||uk(r.exp,t)))return!0}return e.children.some(e=>uk(e,t));case 11:return uk(e.source,t)?!0:e.children.some(e=>uk(e,t));case 9:return e.branches.some(e=>uk(e,t));case 10:return uk(e.condition,t)?!0:e.children.some(e=>uk(e,t));case 4:return!e.isStatic&Line truncated
`);else if(fk(i.content)){let a=e[r-1]&&e[r-1].type,o=e[r+1]&&e[r+1].type;!a||!o||t&&(a===3&&(o===3||o===1)||a===1&&(o===3||o===1&&Qde(i.content)))?(n=!0,e[r]=null):i.content=` `}else t&&(i.content=Sk(i.content))}return n?e.filter(Boolean):e}function Qde(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n===10||n===13)return!0}return!1}function Sk(e){let t=``,n=!1;for(let r=0;r<e.length;r++)LO(e.charCodeAt(r))?n||=(t+=` `,!0):(t+=e[r],n=!1);return t}function Ck(e){(Kj[0]||Ij).children.push(e)}function wk(e,t){return{start:qj.getPos(e),end:t==null?t:qj.getPos(t),source:t==null?t:hk(e,t)}}function $de(e){return wk(e.start.offset,e.end.offset)}function Tk(e,t){e.end=qj.getPos(t),e.source=hk(e.start.offset,t)}function efe(e){let t={type:6,name:e.rawName,nameLoc:wk(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){let n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}function Ek(e,t=!1,n,r=0,i=0){return EO(e,t,n,r)}function Dk(e,t,n){Fj.onError(GO(e,wk(t,t),void 0,n))}function tfe(){qj.reset(),Rj=null,zj=null,Bj=``,Vj=-1,Hj=-1,Kj.length=0}function Ok(e,t){if(tfe(),Lj=e,Fj=ie({},Pj),t){let e;for(e in t)t[e]!=null&&(Fj[e]=t[e])}qj.mode=Fj.parseMode===`html`?1:Fj.parseMode===`sfc`?2:0,qj.inXML=Fj.ns===1||Fj.ns===2;let n=t&&t.delimiters;n&&(qj.delimiterOpen=zO(n[0]),qj.delimiterClose=zO(n[1]));let r=Ij=xO([],e);return qj.parse(Lj),r.loc=wk(0,e.length),r.children=xk(r.children),Ij=null,r}function nfe(e,t){Ak(e,void 0,t,!!kk(e))}function kk(e){let t=e.children.filter(e=>e.type!==3);return t.length===1&&t[0].type===1&&!ak(t[0])?t[0]:null}function Ak(e,t,n,r=!1,i=!1){let{children:a}=e,o=[];for(let t=0;t<a.length;t++){let s=a[t];if(s.type===1&&s.tagType===0){let e=r?0:jk(s,n);if(e>0){if(e>=2){s.codegenNode.patchFlag=-1,o.push(s);continue}}else{let e=s.codegenNode;if(e.type===13){let t=e.patchFlag;if((t===void 0||t===512||t===1)&&Nk(s,n)>=2){let t=Pk(s);t&&(e.props=n.hoist(t))}e.dynamicProps&&=n.hoist(e.dynamicProps)}}}else if(s.type===12&&(r?0:jk(s,n))>=2){s.codegenNode.type===14&&s.codegenNode.arguments.length>0&&s.codegenNode.arguments.push(`-1`),o.push(s);continue}if(s.type===1){let t=s.tagType===1;t&&n.scopes.vSlot++,Ak(s,e,n,!1,i),t&&n.scopes.vSlot--}else if(s.type===11)Ak(s,e,n,s.children.length===1,!0);else if(s.type===9)for(let t=0;t<s.branches.length;t++)Ak(s.branches[t],e,n,s.branches[t].children.length===1,i)}let s=!1;if(o.length===a.length&&e.type===1){if(e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&P(e.codegenNode.children))e.codegenNode.children=c(CO(e.codegenNode.children)),s=!0;else if(e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!P(e.codegenNode.children)&&e.codegenNode.children.type===15){let t=l(e.codegenNode,`default`);t&&(t.returns=c(CO(t.returns)),s=!0)}else if(e.tagType===3&&t&&t.type===1&&t.tagType===1&&t.codegenNode&&t.codegenNode.type===13&&t.codegenNode.children&&!P(t.codegenNode.children)&&t.codegenNode.children.type===15){let n=ZO(e,`slot`,!0),r=n&&n.arg&&l(t.codegenNode,n.arg);r&&(r.returns=c(CO(r.returns)),s=!0)}}if(!s)for(let e of o)e.codegenNode=n.cache(e.codegenNode);function c(e){let t=n.cache(e);return t.needArraySpread=!0,t}function l(e,t){if(e.children&&!P(e.children)&&e.children.type===15){let n=e.children.properties.find(e=>e.key===t||e.key.content===t);return n&&n.value}}o.length&&n.transformHoist&&n.transformHoist(a,n,e)}function jk(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(e.tagType!==0)return 0;let r=n.get(e);if(r!==void 0)return r;let i=e.codegenNode;if(i.type!==13||i.isBlock&&e.tag!==`svg`&&e.tag!==`foreignObject`&&e.tag!==`math`)return 0;if(i.patchFlag===void 0){let r=3,a=Nk(e,t);if(a===0)return n.set(e,0),0;a<r&&(r=a);for(let i=0;i<e.children.length;i++){let a=jk(e.children[i],t);if(a===0)return n.set(e,0),0;a<r&&(r=a)}if(r>1)for(let i=0;i<e.props.length;i++){let a=e.props[i];if(a.type===7&&a.name===`bind`&&a.exp){let i=jk(a.exp,t);if(i===0)return n.set(e,0),0;i<r&&(r=i)}}if(i.isBlock){for(let t=0;t<e.props.length;t++)if(e.props[t].type===7)return n.set(e,0),0;t.removeHelper(bA),t.removeHelper(PO(t.inSSR,i.isComponent)),i.isBlock=!1,t.helper(NO(t.inSSR,i.isComponent))}return n.set(e,r),r}else return n.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return jk(e.content,t);case 4:return e.constType;case 8:let a=3;for(let n=0;n<e.children.length;n++){let r=e.children[n];if(pe(r)||me(r))continue;let i=jk(r,t);if(i===0)return 0;i<a&&(a=i)}return a;case 20:return 2;default:return 0}}function Mk(e,t){if(e.type===14&&!pe(e.callee)&&Qj.has(e.callee)){let n=e.arguments[0];if(n.type===4)return jk(n,t);if(n.type===14)return Mk(n,t)}return 0}function Nk(e,t){let n=3,r=Pk(e);if(r&&r.type===15){let{properties:e}=r;for(let r=0;r<e.length;r++){let{key:i,value:a}=e[r],o=jk(i,t);if(o===0)return o;o<n&&(n=o);let s;if(s=a.type===4?jk(a,t):a.type===14? Line truncated
`+` `.repeat(e),0)}return p}function zk(e,t={}){let n=afe(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:r,push:i,prefixIdentifiers:a,indent:o,deindent:s,newline:c,scopeId:l,ssr:u}=n,d=Array.from(e.helpers),f=d.length>0,p=!a&&r!==`module`;if(ofe(e,n),i(`function ${u?`ssrRender`:`render`}(${(u?[`_ctx`,`_push`,`_parent`,`_attrs`]:[`_ctx`,`_cache`]).join(`, `)}) {`),o(),p&&(i(`with (_ctx) {`),o(),f&&(i(`const { ${d.map(eM).join(`, `)} } = _Vue
`,-1),c())),e.components.length&&(Bk(e.components,`component`,n),(e.directives.length||e.temps>0)&&c()),e.directives.length&&(Bk(e.directives,`directive`,n),e.temps>0&&c()),e.filters&&e.filters.length&&(c(),Bk(e.filters,`filter`,n),c()),e.temps>0){i(`let `);for(let t=0;t<e.temps;t++)i(`${t>0?`, `:``}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(i(`
`,0),c()),u||i(`return `),e.codegenNode?Uk(e.codegenNode,n):i(`null`),p&&(s(),i(`}`)),s(),i(`}`),{ast:e,code:n.code,preamble:``,map:n.map?n.map.toJSON():void 0}}function ofe(e,t){let{ssr:n,prefixIdentifiers:r,push:i,newline:a,runtimeModuleName:o,runtimeGlobalName:s,ssrRuntimeModuleName:c}=t,l=s,u=Array.from(e.helpers);u.length>0&&(i(`const _Vue = ${l}
`,-1),e.hoists.length&&i(`const { ${[CA,wA,TA,EA,DA].filter(e=>u.includes(e)).map(eM).join(`, `)} } = _Vue
`,-1)),sfe(e.hoists,t),a(),i(`return `)}function Bk(e,t,{helper:n,push:r,newline:i,isTS:a}){let o=n(t===`filter`?jA:t===`component`?OA:AA);for(let n=0;n<e.length;n++){let s=e[n],c=s.endsWith(`__self`);c&&(s=s.slice(0,-6)),r(`const ${lk(s,t)} = ${o}(${JSON.stringify(s)}${c?`, true`:``})${a?`!`:``}`),n<e.length-1&&i()}}function sfe(e,t){if(!e.length)return;t.pure=!0;let{push:n,newline:r}=t;r();for(let i=0;i<e.length;i++){let a=e[i];a&&(n(`const _hoisted_${i+1} = `),Uk(a,t),r())}t.pure=!1}function Vk(e,t){let n=e.length>3||!1;t.push(`[`),n&&t.indent(),Hk(e,t,n),n&&t.deindent(),t.push(`]`)}function Hk(e,t,n=!1,r=!0){let{push:i,newline:a}=t;for(let o=0;o<e.length;o++){let s=e[o];pe(s)?i(s,-3):P(s)?Vk(s,t):Uk(s,t),o<e.length-1&&(n?(r&&i(`,`),a()):r&&i(`, `))}}function Uk(e,t){if(pe(e)){t.push(e,-3);return}if(me(e)){t.push(t.helper(e));return}switch(e.type){case 1:case 9:case 11:Uk(e.codegenNode,t);break;case 2:cfe(e,t);break;case 4:Wk(e,t);break;case 5:lfe(e,t);break;case 12:Uk(e.codegenNode,t);break;case 8:Gk(e,t);break;case 3:dfe(e,t);break;case 13:ffe(e,t);break;case 14:mfe(e,t);break;case 15:hfe(e,t);break;case 17:gfe(e,t);break;case 18:_fe(e,t);break;case 19:vfe(e,t);break;case 20:yfe(e,t);break;case 21:Hk(e.body,t,!0,!1);break;case 22:break;case 23:break;case 24:break;case 25:break;case 26:break;case 10:break;default:}}function cfe(e,t){t.push(JSON.stringify(e.content),-3,e)}function Wk(e,t){let{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function lfe(e,t){let{push:n,helper:r,pure:i}=t;i&&n($j),n(`${r(IA)}(`),Uk(e.content,t),n(`)`)}function Gk(e,t){for(let n=0;n<e.children.length;n++){let r=e.children[n];pe(r)?t.push(r,-3):Uk(r,t)}}function ufe(e,t){let{push:n}=t;e.type===8?(n(`[`),Gk(e,t),n(`]`)):e.isStatic?n(bj(e.content)?e.content:JSON.stringify(e.content),-2,e):n(`[${e.content}]`,-3,e)}function dfe(e,t){let{push:n,helper:r,pure:i}=t;i&&n($j),n(`${r(TA)}(${JSON.stringify(e.content)})`,-3,e)}function ffe(e,t){let{push:n,helper:r,pure:i}=t,{tag:a,props:o,children:s,patchFlag:c,dynamicProps:l,directives:u,isBlock:d,disableTracking:f,isComponent:p}=e,m;c&&(m=String(c)),u&&n(r(MA)+`(`),d&&n(`(${r(bA)}(${f?`true`:``}), `),i&&n($j),n(r(d?PO(t.inSSR,p):NO(t.inSSR,p))+`(`,-2,e),Hk(pfe([a,o,s,m,l]),t),n(`)`),d&&n(`)`),u&&(n(`, `),Uk(u,t),n(`)`))}function pfe(e){let t=e.length;for(;t--&&e[t]==null;);return e.slice(0,t+1).map(e=>e||`null`)}function mfe(e,t){let{push:n,helper:r,pure:i}=t,a=pe(e.callee)?e.callee:r(e.callee);i&&n($j),n(a+`(`,-2,e),Hk(e.arguments,t),n(`)`)}function hfe(e,t){let{push:n,indent:r,deindent:i,newline:a}=t,{properties:o}=e;if(!o.length){n(`{}`,-2,e);return}let s=o.length>1||!1;n(s?`{`:`{ `),s&&r();for(let e=0;e<o.length;e++){let{key:r,value:i}=o[e];ufe(r,t),n(`: `),Uk(i,t),e<o.length-1&&(n(`,`),a())}s&&i(),n(s?`}`:` }`)}function gfe(e,t){Vk(e.elements,t)}function _fe(e,t){let{push:n,indent:r,deindent:i}=t,{params:a,returns:o,body:s,newline:c,isSlot:l}=e;l&&n(`_${ej[YA]}(`),n(`(`,-2,e),P(a)?Hk(a,t):a&&Uk(a,t),n(`) => `),(c||s)&&(n(`{`),r()),o?(c&&n(`return `),P(o)?Vk(o,t):Uk(o,t)):s&&Uk(s,t),(c||s)&&(i(),n(`}`)),l&&(e.isNonScopedSlot&&n(`, undefined, true`),n(`)`))}function vfe(e,t){let{test:n,consequent:r,alternate:i,newline:a}=e,{push:o,indent:s,deindent:c,newline:l}=t;if(n.type===4){let e=!bj(n.content);e&&o(`(`),Wk(n,t),e&&o(`)`)}else o(`(`),Uk(n,t),o(`)`);a&&s(),t.indentLevel++,a||o(` `),o(`? `),Uk(r,t),t.indentLevel--,a&&l(),a||o(` `),o(`: `);let u=i.type===19;u||t.indentLevel++,Uk(i,t),u||t.indentLevel--,a&&c(!0)}function yfe(e,t){let{push:n,helper:r,indent:i,deindent:a,newline:o}=t,{needPauseTracking:s,needArraySpread:c}=e;c&&n(`[...(`),n(`_cache[${e.index}] || (`),s&&(i(),n(`${r(KA)}(-1`),e.inVOnce&&n(`, true`),n(`),`),o(),n(`(`)),n(`_cache[${e.index}] = `),Uk(e.value,t),s&&(n(`).cacheIndex = ${e.index},`),o(),n(`${r(KA)}(1),`),o(),n(`_cache[${e.index}]`),a()),n(`)`),c&&n(`)]`)}function Kk(e,t,n=!1,r=!1,i=Object.create(t.identifiers)){return e}function qk(e){return pe(e)?e:e.type===4?e.content:e.children.map(qk).join(``)}function Jk(e,t,n,r){if(t.name!==`else`&&(!t.exp||!t.exp.content.trim())){let r=t.exp?t.exp.loc:e.loc;n.onError(GO(28,t.loc)),t.exp=EO(`true`,!1,r)}if(t.name===`if`){let i=Yk(e,t),a={type:9,loc:$de(e.loc),branches:[i]};if(n.replaceNode(a),r)return r(a,i,!0)}else{let i=n.parent.children,a=i.indexOf(e);for(;a-->=-1;){let o=i[a];if(o&&mk(o)){n.removeNode(o);continue}if(o&&o.type===9){(t.name===`else-if`||t.name===`else`)&&o.branches[o.branches.length-1].condition===void 0&&n.onError(GO(30,e.loc)),n.removeNode();let i=Yk(e,t);o.branches.push(i);let a=r&&r(o,i,!1);Lk(i,n),a&&a(),n.currentNode=null}else n.onError(GO(30,e.loc));break}}}function Yk(e,t){let n=e.tagType===3;return{type:10,loc:e.loc,condition:t.name===`else`?void 0:t.exp,children:n&&!ZO(e,`for`)?e.children:[e],userKey:QO(e,`key`),isTemplateIf:n}}function Xk(e,t,n){return e.condition?AO(e.condition,Zk(e,t,n),OO(n.helper(TA),[`""`,`true`])):Zk(e,t,n)}function Zk(e,t,n){let{helper:r}=n,i=TO(`key`,E Line truncated
Use a v-bind binding combined with a v-on listener that emits update:x event instead.`,45:`v-model cannot be used on a const binding because it is not writable.`,46:`Error parsing JavaScript expression: `,47:`<KeepAlive> expects exactly one child component.`,52:`@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`,48:`"prefixIdentifiers" option is not supported in this build of compiler.`,49:`ES module mode is not supported in this build of compiler.`,50:`"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,51:`"scopeId" option is only supported in module mode.`,54:``},mj=e=>/Function(?:Expression|Declaration)$|Method$/.test(e.type),hj=e=>e&&(e.type===`ObjectProperty`||e.type===`ObjectMethod`)&&!e.computed,gj=(e,t)=>hj(t)&&t.key===e,_j=[`TSAsExpression`,`TSTypeAssertion`,`TSNonNullExpression`,`TSInstantiationExpression`,`TSSatisfiesExpression`],vj=e=>e.type===4&&e.isStatic,yj=/^$|^\d|[^\$\w\xA0-\uFFFF]/,bj=e=>!yj.test(e),xj=/[A-Za-z_$\xA0-\uFFFF]/,Sj=/[\.\?\w$\xA0-\uFFFF]/,Cj=/\s+[.[]\s*|\s*[.[]\s+/g,wj=e=>e.type===4?e.content:e.loc.source,Tj=e=>{let t=wj(e).trim().replace(Cj,e=>e.trim()),n=0,r=[],i=0,a=0,o=null;for(let e=0;e<t.length;e++){let s=t.charAt(e);switch(n){case 0:if(s===`[`)r.push(n),n=1,i++;else if(s===`(`)r.push(n),n=2,a++;else if(!(e===0?xj:Sj).test(s))return!1;break;case 1:s===`'`||s===`"`||s==="`"?(r.push(n),n=3,o=s):s===`[`?i++:s===`]`&&(--i||(n=r.pop()));break;case 2:if(s===`'`||s===`"`||s==="`")r.push(n),n=3,o=s;else if(s===`(`)a++;else if(s===`)`){if(e===t.length-1)return!1;--a||(n=r.pop())}break;case 3:s===o&&(n=r.pop(),o=null);break}}return!i&&!a},Ej=te,Dj=Tj,Oj=/^\s*(?:async\s*)?(?:\([^)]*?\)|[\w$_]+)\s*(?::[^=]+)?=>|^\s*(?:async\s+)?function(?:\s+[\w$]+)?\s*\(/,kj=e=>Oj.test(wj(e)),Aj=te,jj=kj,Mj=new Set([BA,VA]),Nj=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/,Pj={parseMode:`base`,ns:0,delimiters:[`{{`,`}}`],getNamespace:()=>0,isVoidTag:ne,isPreTag:ne,isIgnoreNewlineTag:ne,isCustomElement:ne,onError:UO,onWarn:WO,comments:!1,prefixIdentifiers:!1},Fj=Pj,Ij=null,Lj=``,Rj=null,zj=null,Bj=``,Vj=-1,Hj=-1,Uj=0,Wj=!1,Gj=null,Kj=[],qj=new lj(Kj,{onerr:Dk,ontext(e,t){_k(hk(e,t),e,t)},ontextentity(e,t,n){_k(e,t,n)},oninterpolation(e,t){if(Wj)return _k(hk(e,t),e,t);let n=e+qj.delimiterOpen.length,r=t-qj.delimiterClose.length;for(;LO(Lj.charCodeAt(n));)n++;for(;LO(Lj.charCodeAt(r-1));)r--;let i=hk(n,r);i.includes(`&`)&&(i=Fj.decodeEntities(i,!1)),Ck({type:5,content:Ek(i,!1,wk(n,r)),loc:wk(e,t)})},onopentagname(e,t){let n=hk(e,t);Rj={type:1,tag:n,ns:Fj.getNamespace(n,Kj[0],Fj.ns),tagType:0,props:[],children:[],loc:wk(e-1,t),codegenNode:void 0}},onopentagend(e){gk(e)},onclosetag(e,t){let n=hk(e,t);if(!Fj.isVoidTag(n)){let r=!1;for(let e=0;e<Kj.length;e++)if(Kj[e].tag.toLowerCase()===n.toLowerCase()){r=!0,e>0&&Dk(24,Kj[0].loc.start.offset);for(let n=0;n<=e;n++)vk(Kj.shift(),t,n<e);break}r||Dk(23,yk(e,60))}},onselfclosingtag(e){let t=Rj.tag;Rj.isSelfClosing=!0,gk(e),Kj[0]&&Kj[0].tag===t&&vk(Kj.shift(),e)},onattribname(e,t){zj={type:6,name:hk(e,t),nameLoc:wk(e,t),value:void 0,loc:wk(e)}},ondirname(e,t){let n=hk(e,t),r=n===`.`||n===`:`?`bind`:n===`@`?`on`:n===`#`?`slot`:n.slice(2);if(!Wj&&r===``&&Dk(26,e),Wj||r===``)zj={type:6,name:n,nameLoc:wk(e,t),value:void 0,loc:wk(e)};else if(zj={type:7,name:r,rawName:n,exp:void 0,arg:void 0,modifiers:n===`.`?[EO(`prop`)]:[],loc:wk(e)},r===`pre`){Wj=qj.inVPre=!0,Gj=Rj;let e=Rj.props;for(let t=0;t<e.length;t++)e[t].type===7&&(e[t]=efe(e[t]))}},ondirarg(e,t){if(e===t)return;let n=hk(e,t);if(Wj&&!nk(zj))zj.name+=n,Tk(zj.nameLoc,t);else{let r=n[0]!==`[`;zj.arg=Ek(r?n:n.slice(1,-1),r,wk(e,t),r?3:0)}},ondirmodifier(e,t){let n=hk(e,t);if(Wj&&!nk(zj))zj.name+=`.`+n,Tk(zj.nameLoc,t);else if(zj.name===`slot`){let e=zj.arg;e&&(e.content+=`.`+n,Tk(e.loc,t))}else{let r=EO(n,!0,wk(e,t));zj.modifiers.push(r)}},onattribdata(e,t){Bj+=hk(e,t),Vj<0&&(Vj=e),Hj=t},onattribentity(e,t,n){Bj+=e,Vj<0&&(Vj=t),Hj=n},onattribnameend(e){let t=zj.loc.start.offset,n=hk(t,e);zj.type===7&&(zj.rawName=n),Rj.props.some(e=>(e.type===7?e.rawName:e.name)===n)&&Dk(2,t)},onattribend(e,t){if(Rj&&zj){if(Tk(zj.loc,t),e!==0)if(Bj.includes(`&`)&&(Bj=Fj.decodeEntities(Bj,!0)),zj.type===6)zj.name===`class`&&(Bj=Sk(Bj).trim()),e===1&&!Bj&&Dk(13,t),zj.value={type:2,content:Bj,loc:e===1?wk(Vj,Hj):wk(Vj-1,Hj+1)},qj.inSFCRoot&&Rj.tag===`template`&&zj.name===`lang`&&Bj&&Bj!==`html`&&qj.enterRCDATA(zO(`</template`),0);else{zj.exp=Ek(Bj,!1,wk(Vj,Hj),0,0),zj.name===`for`&&(zj.forParseResult=Jde(zj.exp));let e=-1;zj.name===`bind`&&(e=zj.modifiers.findIndex(e=>e.content===`sync`))>-1&&HO(`COMPILER_V_BIND_SYNC`,Fj,zj.loc,zj.arg.loc.source)&&(zj.name=`model`,zj.modifiers.splice(e,1))}(zj.type!==7||zj.name!==`pre`)&&Rj.props.push(zj)}Bj=``,Vj=Hj=-1},oncomment(e,t){Fj.comments&&Ck({type:3,content:hk(e,t),loc:wk(e-4,t+3)})},onend(){let e=Lj.length;for(let Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function uN(e){if(typeof window<`u`&&window.navigator)return!!navigator.userAgent.match(e)}function dN(e,t,n){e.addEventListener(t,n,!JN&&eP)}function fN(e,t,n){e.removeEventListener(t,n,!JN&&eP)}function pN(e,t){if(t){if(t[0]===`>`&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function mN(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function hN(e,t,n,r){if(e){n||=document;do{if(t!=null&&(t[0]===`>`?e.parentNode===n&&pN(e,t):pN(e,t))||r&&e===n)return e;if(e===n)break}while(e=mN(e))}return null}function gN(e,t,n){e&&t&&(e.classList?e.classList[n?`add`:`remove`](t):e.className=((` `+e.className+` `).replace(tP,` `).replace(` `+t+` `,` `)+(n?` `+t:``)).replace(tP,` `))}function _N(e,t,n){var r=e&&e.style;if(r){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,``):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in r)&&t.indexOf(`webkit`)===-1&&(t=`-webkit-`+t),r[t]=n+(typeof n==`string`?``:`px`)}}function vN(e,t){var n=``;if(typeof e==`string`)n=e;else do{var r=_N(e,`transform`);r&&r!==`none`&&(n=r+` `+n)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function yN(e,t,n){if(e){var r=e.getElementsByTagName(t),i=0,a=r.length;if(n)for(;i<a;i++)n(r[i],i);return r}return[]}function bN(){return document.scrollingElement||document.documentElement}function xN(e,t,n,r,i){if(!(!e.getBoundingClientRect&&e!==window)){var a,o,s,c,l,u,d;if(e!==window&&e.parentNode&&e!==bN()?(a=e.getBoundingClientRect(),o=a.top,s=a.left,c=a.bottom,l=a.right,u=a.height,d=a.width):(o=0,s=0,c=window.innerHeight,l=window.innerWidth,u=window.innerHeight,d=window.innerWidth),(t||n)&&e!==window&&(i||=e.parentNode,!JN))do if(i&&i.getBoundingClientRect&&(_N(i,`transform`)!==`none`||n&&_N(i,`position`)!==`static`)){var f=i.getBoundingClientRect();o-=f.top+parseInt(_N(i,`border-top-width`)),s-=f.left+parseInt(_N(i,`border-left-width`)),c=o+a.height,l=s+a.width;break}while(i=i.parentNode);if(r&&e!==window){var p=vN(i||e),m=p&&p.a,h=p&&p.d;p&&(o/=h,s/=m,d/=m,u/=h,c=o+u,l=s+d)}return{top:o,left:s,bottom:c,right:l,width:d,height:u}}}function SN(e,t,n){for(var r=DN(e,!0),i=xN(e)[t];r;){var a=xN(r)[n],o=void 0;if(o=n===`top`||n===`left`?i>=a:i<=a,!o)return r;if(r===bN())break;r=DN(r,!1)}return!1}function CN(e,t,n,r){for(var i=0,a=0,o=e.children;a<o.length;){if(o[a].style.display!==`none`&&o[a]!==IN.ghost&&(r||o[a]!==IN.dragged)&&hN(o[a],n.draggable,e,!1)){if(i===t)return o[a];i++}a++}return null}function wN(e,t){for(var n=e.lastElementChild;n&&(n===IN.ghost||_N(n,`display`)===`none`||t&&!pN(n,t));)n=n.previousElementSibling;return n||null}function TN(e,t){var n=0;if(!e||!e.parentNode)return-1;for(;e=e.previousElementSibling;)e.nodeName.toUpperCase()!==`TEMPLATE`&&e!==IN.clone&&(!t||pN(e,t))&&n++;return n}function EN(e){var t=0,n=0,r=bN();if(e)do{var i=vN(e),a=i.a,o=i.d;t+=e.scrollLeft*a,n+=e.scrollTop*o}while(e!==r&&(e=e.parentNode));return[t,n]}function zfe(e,t){for(var n in e)if(e.hasOwnProperty(n)){for(var r in t)if(t.hasOwnProperty(r)&&t[r]===e[n][r])return Number(n)}return-1}function DN(e,t){if(!e||!e.getBoundingClientRect)return bN();var n=e,r=!1;do if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=_N(n);if(n.clientWidth<n.scrollWidth&&(i.overflowX==`auto`||i.overflowX==`scroll`)||n.clientHeight<n.scrollHeight&&(i.overflowY==`auto`||i.overflowY==`scroll`)){if(!n.getBoundingClientRect||n===document.body)return bN();if(r||t)return n;r=!0}}while(n=n.parentNode);return bN()}function Bfe(e,t){if(e&&t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function ON(e,t){return Math.round(e.top)===Math.round(t.top)&&Math.round(e.left)===Math.round(t.left)&&Math.round(e.height)===Math.round(t.height)&&Math.round(e.width)===Math.round(t.width)}function kN(e,t){return function(){if(!nP){var n=arguments,r=this;n.length===1?e.call(r,n[0]):e.apply(r,n),nP=setTimeout(function(){nP=void 0},t)}}}function Vfe(){clearTimeout(nP),nP=void 0}function AN(e,t,n){e.scrollLeft+=t,e.scrollTop+=n}function jN(e){var t=window.Polymer,n=window.jQuery||window.Zepto;return t&&t.dom?t.dom(e).cloneNode(!0):n?n(e).clone(!0)[0]:e.cloneNode(!0)}function MN(e,t){_N(e,`position`,`absolute`),_N(e,`top`,t.top),_N(e,`left`,t.left),_N(e,`width`,t.width),_N(e,`height`,t.height)}function NN(e){_N(e,`position`,``),_N(e,`top`,``),_N(e,`left`,``),_N(e,`width`,``),_N(e,`height`,``)}function Hfe(){var e=[],t;return{captureAnimationState:function(){e=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){if(!(_N(t,`display`)===`none`||t===IN.ghost)){e.push({target:t,rect:xN(t)});var n=oN({},e[e.length-1].rect);if(t.thisAnimationDuration){ Line truncated
`)&&(m=`(?: `+m+`)`,g=` `+g,h++),i=RegExp(`^(?:`+m+`)`,p)),u&&(i=RegExp(`^`+m+`$(?!\\s)`,p)),c&&(n=t.lastIndex),s=a.call(f?i:t,g),f?s?(s.input=s.input.slice(h),s[0]=s[0].slice(h),s.index=t.lastIndex,t.lastIndex+=s[0].length):t.lastIndex=0:c&&s&&(t.lastIndex=t.global?s.index+s[0].length:n),u&&s&&s.length>1&&o.call(s[0],i,function(){for(d=1;d<arguments.length-2;d++)arguments[d]===void 0&&(s[d]=void 0)}),s}),e.exports=s}),"94ca":(function(e,t,n){var r=n(`d039`),i=/#|\.prototype\./,a=function(e,t){var n=s[o(e)];return n==l?!0:n==c?!1:typeof t==`function`?r(t):!!t},o=a.normalize=function(e){return String(e).replace(i,`.`).toLowerCase()},s=a.data={},c=a.NATIVE=`N`,l=a.POLYFILL=`P`;e.exports=a}),"99af":(function(e,t,n){var r=n(`23e7`),i=n(`d039`),a=n(`e8b5`),o=n(`861d`),s=n(`7b0b`),c=n(`50c4`),l=n(`8418`),u=n(`65f0`),d=n(`1dde`),f=n(`b622`),p=n(`2d00`),m=f(`isConcatSpreadable`),h=9007199254740991,g=`Maximum allowed index exceeded`,_=p>=51||!i(function(){var e=[];return e[m]=!1,e.concat()[0]!==e}),v=d(`concat`),y=function(e){if(!o(e))return!1;var t=e[m];return t===void 0?a(e):!!t};r({target:`Array`,proto:!0,forced:!_||!v},{concat:function(e){var t=s(this),n=u(t,0),r=0,i,a,o,d,f;for(i=-1,o=arguments.length;i<o;i++)if(f=i===-1?t:arguments[i],y(f)){if(d=c(f.length),r+d>h)throw TypeError(g);for(a=0;a<d;a++,r++)a in f&&l(n,r,f[a])}else{if(r>=h)throw TypeError(g);l(n,r++,f)}return n.length=r,n}})}),"9bdd":(function(e,t,n){var r=n(`825a`);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var a=e.return;throw a!==void 0&&r(a.call(e)),t}}}),"9bf2":(function(e,t,n){var r=n(`83ab`),i=n(`0cfb`),a=n(`825a`),o=n(`c04e`),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(a(e),t=o(t,!0),a(n),i)try{return s(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported`);return`value`in n&&(e[t]=n.value),e}}),"9ed3":(function(e,t,n){var r=n(`ae93`).IteratorPrototype,i=n(`7c73`),a=n(`5c6c`),o=n(`d44e`),s=n(`3f8c`),c=function(){return this};e.exports=function(e,t,n){var l=t+` Iterator`;return e.prototype=i(r,{next:a(1,n)}),o(e,l,!1,!0),s[l]=c,e}}),"9f7f":(function(e,t,n){var r=n(`d039`);function i(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=r(function(){var e=i(`a`,`y`);return e.lastIndex=2,e.exec(`abcd`)!=null}),t.BROKEN_CARET=r(function(){var e=i(`^r`,`gy`);return e.lastIndex=2,e.exec(`str`)!=null})}),a2bf:(function(e,t,n){var r=n(`e8b5`),i=n(`50c4`),a=n(`0366`),o=function(e,t,n,s,c,l,u,d){for(var f=c,p=0,m=u?a(u,d,3):!1,h;p<s;){if(p in n){if(h=m?m(n[p],p,t):n[p],l>0&&r(h))f=o(e,t,h,i(h.length),f,l-1)-1;else{if(f>=9007199254740991)throw TypeError(`Exceed the acceptable array length`);e[f]=h}f++}p++}return f};e.exports=o}),a352:(function(e,n){e.exports=t}),a434:(function(e,t,n){var r=n(`23e7`),i=n(`23cb`),a=n(`a691`),o=n(`50c4`),s=n(`7b0b`),c=n(`65f0`),l=n(`8418`),u=n(`1dde`),d=n(`ae40`),f=u(`splice`),p=d(`splice`,{ACCESSORS:!0,0:0,1:2}),m=Math.max,h=Math.min,g=9007199254740991,_=`Maximum allowed length exceeded`;r({target:`Array`,proto:!0,forced:!f||!p},{splice:function(e,t){var n=s(this),r=o(n.length),u=i(e,r),d=arguments.length,f,p,v,y,b,x;if(d===0?f=p=0:d===1?(f=0,p=r-u):(f=d-2,p=h(m(a(t),0),r-u)),r+f-p>g)throw TypeError(_);for(v=c(n,p),y=0;y<p;y++)b=u+y,b in n&&l(v,y,n[b]);if(v.length=p,f<p){for(y=u;y<r-p;y++)b=y+p,x=y+f,b in n?n[x]=n[b]:delete n[x];for(y=r;y>r-p+f;y--)delete n[y-1]}else if(f>p)for(y=r-p;y>u;y--)b=y+p-1,x=y+f-1,b in n?n[x]=n[b]:delete n[x];for(y=0;y<f;y++)n[y+u]=arguments[y+2];return n.length=r-p+f,v}})}),a4d3:(function(e,t,n){var r=n(`23e7`),i=n(`da84`),a=n(`d066`),o=n(`c430`),s=n(`83ab`),c=n(`4930`),l=n(`fdbf`),u=n(`d039`),d=n(`5135`),f=n(`e8b5`),p=n(`861d`),m=n(`825a`),h=n(`7b0b`),g=n(`fc6a`),_=n(`c04e`),v=n(`5c6c`),y=n(`7c73`),b=n(`df75`),x=n(`241c`),S=n(`057f`),C=n(`7418`),w=n(`06cf`),T=n(`9bf2`),E=n(`d1e7`),D=n(`9112`),O=n(`6eeb`),k=n(`5692`),A=n(`f772`),j=n(`d012`),M=n(`90e3`),ee=n(`b622`),te=n(`e538`),ne=n(`746f`),N=n(`d44e`),re=n(`69f3`),ie=n(`b727`).forEach,ae=A(`hidden`),oe=`Symbol`,se=`prototype`,P=ee(`toPrimitive`),ce=re.set,le=re.getterFor(oe),ue=Object[se],de=i.Symbol,fe=a(`JSON`,`stringify`),pe=w.f,me=T.f,he=S.f,ge=E.f,_e=k(`symbols`),ve=k(`op-symbols`),ye=k(`string-to-symbol-registry`),be=k(`symbol-to-string-registry`),xe=k(`wks`),Se=i.QObject,Ce=!Se||!Se[se]||!Se[se].findChild,we=s&&u(function(){return y(me({},`a`,{get:function(){return me(this,`a`,{value:7}).a}})).a!=7})?function(e,t,n){var r=pe(ue,t);r&&delete ue[t],me(e,t,n),r&&e!==ue&&me(ue,t,r)}:me,Te=function(e,t){var n=_e[e]=y(de[se]);return ce(n,{type:oe,tag:e,description:t}),s||(n.description=t),n},Ee=l?function(e){return typeof e==`symbol`}:function(e){return Object(e)instanceof de},De=function(e,t,n){e===ue&&De(ve,t,n),m(e);var r=_(t,!0);return m(n),d(_e,r)?(n.enumerable?(d(e,ae)&&e[ae][r]&&(e[ae][r]=!1),n=y(n,{enumerable:v(0,!1)})):(d(e,ae)||me(e,ae,v(1,{})),e[ae][r]=!0),we(e,r,n)):me(e,r,n)},Oe=function(e,t){m(e);var n=g(t);return ie(b(n).concat(Ne(n)),function(t){(!s||Ae.call(n,t))&&De(e,t,n[t])} Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function m(e,t){return l(e)||u(e,t)||f(e,t)||p()}function h(e){if(Array.isArray(e))return d(e)}function g(e){if(typeof Symbol<`u`&&Symbol.iterator in Object(e))return Array.from(e)}function _(){throw TypeError(`Invalid attempt to spread non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function v(e){return h(e)||g(e)||f(e)||_()}var y=n(`a352`),b=n.n(y);function x(e){e.parentElement!==null&&e.parentElement.removeChild(e)}function S(e,t,n){var r=n===0?e.children[0]:e.children[n-1].nextSibling;e.insertBefore(t,r)}var C=n(`dbf1`);n(`13d5`),n(`4fad`),n(`ac1f`),n(`5319`);function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var T=/-(\w)/g,E=w(function(e){return e.replace(T,function(e,t){return t.toUpperCase()})});n(`5db7`),n(`73d9`);var D=[`Start`,`Add`,`Remove`,`Update`,`End`],O=[`Choose`,`Unchoose`,`Sort`,`Filter`,`Clone`],k=[`Move`],A=[k,D,O].flatMap(function(e){return e}).map(function(e){return`on${e}`}),j={manage:k,manageAndEmit:D,emit:O};function M(e){return A.indexOf(e)!==-1}n(`caad`),n(`2ca0`);var ee=`a.abbr.address.area.article.aside.audio.b.base.bdi.bdo.blockquote.body.br.button.canvas.caption.cite.code.col.colgroup.data.datalist.dd.del.details.dfn.dialog.div.dl.dt.em.embed.fieldset.figcaption.figure.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.iframe.img.input.ins.kbd.label.legend.li.link.main.map.mark.math.menu.menuitem.meta.meter.nav.noscript.object.ol.optgroup.option.output.p.param.picture.pre.progress.q.rb.rp.rt.rtc.ruby.s.samp.script.section.select.slot.small.source.span.strong.style.sub.summary.sup.svg.table.tbody.td.template.textarea.tfoot.th.thead.time.title.tr.track.u.ul.var.video.wbr`.split(`.`);function te(e){return ee.includes(e)}function ne(e){return[`transition-group`,`TransitionGroup`].includes(e)}function N(e){return[`id`,`class`,`role`,`style`].includes(e)||e.startsWith(`data-`)||e.startsWith(`aria-`)||e.startsWith(`on`)}function re(e){return e.reduce(function(e,t){var n=m(t,2),r=n[0];return e[r]=n[1],e},{})}function ie(e){var t=e.$attrs,n=e.componentData,r=n===void 0?{}:n;return c(c({},re(Object.entries(t).filter(function(e){var t=m(e,2),n=t[0];return t[1],N(n)}))),r)}function ae(e){var t=e.$attrs,n=e.callBackBuilder,r=re(oe(t));Object.entries(n).forEach(function(e){var t=m(e,2),n=t[0],i=t[1];j[n].forEach(function(e){r[`on${e}`]=i(e)})});var i=`[data-draggable]${r.draggable||``}`;return c(c({},r),{},{draggable:i})}function oe(e){return Object.entries(e).filter(function(e){var t=m(e,2),n=t[0];return t[1],!N(n)}).map(function(e){var t=m(e,2),n=t[0],r=t[1];return[E(n),r]}).filter(function(e){var t=m(e,2),n=t[0];return t[1],!M(n)})}n(`c740`);function se(e,t){if(!(e instanceof t))throw TypeError(`Cannot call a class as a function`)}function P(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,`value`in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ce(e,t,n){return t&&P(e.prototype,t),n&&P(e,n),e}var le=function(e){return e.el},ue=function(e,t){return e.__draggable_context=t},de=function(e){return e.__draggable_context},fe=function(){function e(t){var n=t.nodes,r=n.header,i=n.default,a=n.footer,o=t.root,s=t.realList;se(this,e),this.defaultNodes=i,this.children=[].concat(v(r),v(i),v(a)),this.externalComponent=o.externalComponent,this.rootTransition=o.transition,this.tag=o.tag,this.realList=s}return ce(e,[{key:`render`,value:function(e,t){var n=this.tag,r=this.children;return e(n,t,this._isRootComponent?{default:function(){return r}}:r)}},{key:`updated`,value:function(){var e=this.defaultNodes,t=this.realList;e.forEach(function(e,n){ue(le(e),{element:t[n],index:n})})}},{key:`getUnderlyingVm`,value:function(e){return de(e)}},{key:`getVmIndexFromDomIndex`,value:function(e,t){var n=this.defaultNodes,r=n.length,i=t.children,a=i.item(e);if(a===null)return r;var o=de(a);if(o)return o.index;if(r===0)return 0;var s=le(n[0]);return e<v(i).findIndex(function(e){return e===s})?0:r}},{key:`_isRootComponent`,get:function(){return this.externalComponent||this.rootTransition}}]),e}(),pe=n(`8bbf`);function me(e,t){var n=e[t];return n?n():[]}function he(e){var t=e.$slots,n=e.realList,r=e.getKey,i=n||[],a=m([`header`,`footer`].map(function(e){return me(t,e)}),2),o=a[0],s=a[1],l=t.item;if(!l)throw Error(`draggable element must have an item slot`);var u=i.flatMap(function(e,t){return l({element:e,index:t}).map(function(t){return t.key=r(e),t.props=c(c({},t.props||{}),{},{"data-draggable":!0}),t})});if(u.length!==i.length)throw Error(`Item slot must have only one child`);return{header:o,footer:s,default:u}}function ge(e){var t=ne(e),n=!te(e)&&!t;return{transition:t,externalComponent:n,tag:n?(0,pe.resolveComponent)(e):t?pe.TransitionGroup:e}}function _e(e){var t=e.$slots,n=e.tag,r=e.realList,i=e.getKey;return new fe({nodes:he({$slots:t,realList:r,getKey:i}),root:ge(n),realList:r})}function ve(e,t){var n=this;(0,pe.nextTick)(function(){return n.$emit(e.toLowerCase(),t)})}function ye(e){var t=this;return function(n,r){if(t.realList!==null)return t[`onDrag${e}`](n,r)}}function be(e){var t=this,n=ye.call(this,e);return function(r,i){n.call(t,r,i),ve.call(t,e,r)}}var xe=null,Se={list:{type:Array,required:!1,default: Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Kpe(e,t){return Upe(e)||Wpe(e,t)||qpe(e,t)||Gpe()}function qpe(e,t){if(e){if(typeof e==`string`)return FF(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?FF(e,t):void 0}}var IF=Object.entries,LF=Object.setPrototypeOf,Jpe=Object.isFrozen,Ype=Object.getPrototypeOf,Xpe=Object.getOwnPropertyDescriptor,RF=Object.freeze,zF=Object.seal,BF=Object.create,VF=typeof Reflect<`u`&&Reflect,HF=VF.apply,UF=VF.construct;RF||=function(e){return e},zF||=function(e){return e},HF||=function(e,t){var n=[...arguments].slice(2);return e.apply(t,n)},UF||=function(e){return new e(...[...arguments].slice(1))};var WF=aI(Array.prototype.forEach),Zpe=aI(Array.prototype.lastIndexOf),GF=aI(Array.prototype.pop),KF=aI(Array.prototype.push),Qpe=aI(Array.prototype.splice),qF=Array.isArray,JF=aI(String.prototype.toLowerCase),YF=aI(String.prototype.toString),XF=aI(String.prototype.match),ZF=aI(String.prototype.replace),QF=aI(String.prototype.indexOf),$pe=aI(String.prototype.trim),eme=aI(Number.prototype.toString),tme=aI(Boolean.prototype.toString),$F=typeof BigInt>`u`?null:aI(BigInt.prototype.toString),eI=typeof Symbol>`u`?null:aI(Symbol.prototype.toString),tI=aI(Object.prototype.hasOwnProperty),nI=aI(Object.prototype.toString),rI=aI(RegExp.prototype.test),iI=oI(TypeError);function aI(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return HF(e,t,n)}}function oI(e){return function(){return UF(e,[...arguments])}}function sI(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JF;if(LF&&LF(e,null),!qF(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(Jpe(t)||(t[r]=e),i=e)}e[i]=!0}return e}function cI(e){for(let t=0;t<e.length;t++)tI(e,t)||(e[t]=null);return e}function lI(e){let t=BF(null);for(let r of IF(e)){var n=Kpe(r,2);let i=n[0],a=n[1];tI(e,i)&&(qF(a)?t[i]=cI(a):a&&typeof a==`object`&&a.constructor===Object?t[i]=lI(a):t[i]=a)}return t}function uI(e){switch(typeof e){case`string`:return e;case`number`:return eme(e);case`boolean`:return tme(e);case`bigint`:return $F?$F(e):`0`;case`symbol`:return eI?eI(e):`Symbol()`;case`undefined`:return nI(e);case`function`:case`object`:{if(e===null)return nI(e);let t=e,n=dI(t,`toString`);if(typeof n==`function`){let e=n(t);return typeof e==`string`?e:nI(e)}return nI(e)}default:return nI(e)}}function dI(e,t){for(;e!==null;){let n=Xpe(e,t);if(n){if(n.get)return aI(n.get);if(typeof n.value==`function`)return aI(n.value)}e=Ype(e)}function n(){return null}return n}function fI(e){try{return rI(e,``),!0}catch{return!1}}var pI=RF(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),mI=RF(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),hI=RF([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),gI=RF([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),_I=RF(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),vI=RF([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),yI=RF([`#text`]),bI=RF(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.bacLine truncated
`+d),Ce&&(d=Ct(d)),x&&Me?D(d):d},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};lt(e),Ee=!0,De=de,Oe=pe},t.clearConfig=function(){ot=null,Ee=!1,De=null,Oe=null,x=C,S=``},t.isValidAttribute=function(e,t,n){ot||lt({});let r=at(e),i=at(t);return Mt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&tI(N,e)&&KF(N[e],t)},t.removeHook=function(e,t){if(tI(N,e)){if(t!==void 0){let n=Zpe(N[e],t);return n===-1?void 0:Qpe(N[e],n,1)[0]}return GF(N[e])}},t.removeHooks=function(e){tI(N,e)&&(N[e]=[])},t.removeAllHooks=function(){N=LI()},t}var ome=zI(),sme=[`innerHTML`],cme=[`src`],lme=`data:image/svg+xml,`,BI=new Map,ume=e=>{let t=e.slice(19),n=BI.get(t);if(n!==void 0)return n;let r=ome.sanitize(t);return BI.set(t,r),r},VI=V({__name:`ProxyIcon`,props:{icon:{},fill:{},size:{default:16},margin:{default:4}},setup(e){let t=e,n=Y(()=>({width:`${t.size}px`,height:`${t.size}px`,marginRight:`${t.margin}px`})),r=Y(()=>t.icon.startsWith(lme)),i=Y(()=>{if(r.value)return ume(t.icon)});return(t,a)=>r.value?(H(),U(`div`,{key:0,class:b([`inline-block`,e.fill||`fill-primary`]),style:_(n.value),innerHTML:i.value},null,14,sme)):(H(),U(`img`,{key:1,class:`inline-block`,style:_(n.value),src:e.icon},null,12,cme))}}),dme={class:`flex shrink-0 items-center`},HI=V({__name:`ProxyName`,props:{name:{},iconSize:{default:16},iconMargin:{default:4},filter:{default:``}},setup(e){let t=e,n=Y(()=>mx.value[t.name]),r=Y(()=>n.value?.icon),i=Y(()=>n.value?.[`dialer-proxy`]);return(t,n)=>(H(),U(`div`,dme,[r.value?(H(),W(VI,{key:0,icon:r.value,margin:e.iconMargin,size:e.iconSize},null,8,[`icon`,`margin`,`size`])):K(``,!0),e.filter?(H(),W(PF,{key:1,text:e.name,filter:e.filter},null,8,[`text`,`filter`])):(H(),U(q,{key:2},[_o(F(e.name),1)],64)),i.value?(H(),U(q,{key:3},[_o(` (`+F(i.value)+`) `,1)],64)):K(``,!0)]))}}),fme=V({props:{conn:Object},name:`ConnectionCard`,setup(e){let{handlerInfo:t}=NF();return AF(),()=>{let n=e.conn,r=sC(n),i={mode:`card`,proxyChainDirection:Zh.value,showFullProxyChain:Qh.value},a=e=>J(PF,{text:wS(n,e,i),filter:XD.value},null),o={[Z.Host]:()=>J(`span`,{class:`text-main w-80 grow truncate`},[a(Z.Host)]),[Z.Destination]:()=>J(`span`,{class:`w-80 grow truncate break-all`},[a(Z.Destination)]),[Z.RemoteAddress]:()=>J(`span`,{class:`w-80 grow truncate break-all`},[a(Z.RemoteAddress)]),[Z.GeoIP]:()=>J(`span`,{class:`w-80 grow truncate break-all`},[a(Z.GeoIP)]),[Z.SourceIP]:()=>J(`span`,{class:`w-40 grow truncate break-all`},[a(Z.SourceIP)]),[Z.SourcePort]:()=>J(`span`,{class:`w-20 grow truncate break-all`},[a(Z.SourcePort)]),[Z.SniffHost]:()=>J(`span`,{class:`w-80 grow truncate break-all`},[a(Z.SniffHost)]),[Z.Type]:()=>J(`span`,{class:`w-60 grow truncate break-all`},[a(Z.Type)]),[Z.Rule]:()=>J(`span`,{class:`w-80 grow truncate break-all`},[a(Z.Rule)]),[Z.Process]:()=>J(`span`,{class:`w-60 grow truncate break-all`},[a(Z.Process)]),[Z.Chains]:()=>J(`span`,{class:[`flex w-80 grow items-center gap-1 truncate break-all`,Zh.value===Jp.REVERSE&&`flex-row-reverse justify-end`]},[J(HI,{name:(0,vg.last)(r),filter:XD.value},null),(0,vg.last)(r)!==(0,vg.first)(r)&&J(q,null,[J(Sf,{class:`h-4 w-4 shrink-0`},null),J(HI,{name:(0,vg.first)(r),filter:XD.value},null)])]),[Z.Outbound]:()=>J(`span`,{class:`w-60 grow truncate break-all`},[a(Z.Outbound)]),[Z.Download]:()=>J(`div`,{class:`mr-1 flex items-center gap-1 text-xs whitespace-nowrap`},[J(gf,{class:`text-success h-3.5 w-3.5 shrink-0`},null),a(Z.Download)]),[Z.Upload]:()=>J(`div`,{class:`mr-1 flex items-center gap-1 text-xs whitespace-nowrap`},[J(wf,{class:`text-info h-3.5 w-3.5 shrink-0`},null),a(Z.Upload)]),[Z.DlSpeed]:()=>J(`div`,{class:`mr-1 flex items-center gap-1 text-xs whitespace-nowrap`},[J(_f,{class:`text-success h-3 w-3 shrink-0 stroke-2`},null),a(Z.DlSpeed)]),[Z.UlSpeed]:()=>J(`div`,{class:`mr-1 flex items-center gap-1 text-xs whitespace-nowrap`},[J(Tf,{class:`text-info h-3 w-3 shrink-0 stroke-2`},null),a(Z.UlSpeed)]),[Z.ConnectTime]:()=>J(`div`,{class:`whitespace-nowrap`},[a(Z.ConnectTime)]),[Z.DestinationType]:()=>J(`div`,{class:`whitespace-nowrap`},[a(Z.DestinationType)]),[Z.InboundUser]:()=>J(`div`,{class:`whitespace-nowrap`},[a(Z.InboundUser)]),[Z.Close]:()=>{let e=J(`button`,{class:`btn btn-circle btn-xs`,onClick:e=>{e.stopPropagation(),bS(n.id).catch(XS)}},[J(bp,{class:`h-4 w-4`},null)]);return pC(n)===`normal`?J(`div`,{class:`flex gap-1`},[J(`button`,{class:`btn btn-circle btn-xs`,onClick:e=>{e.stopPropagation(),xS(n.id).catch(XS)}},[J(lp,{class:`h-4 w-4`},null)]),e]):e}},s=eO(n),c=s&&WD.value===Vp.ALL;return J(`div`,{class:`text-base-content/65 flex cursor-pointer flex-col gap-1 px-3 py-2`,onClick:()=>t(n)},[ng.value.map(e=>J(`div`,{class:[`flex h-5 items-center gap-1 text-sm`,c?`opacity-60`:``]},[e.filter(e=>e!==Z.Close||!s).map(e=>o[e]())]))])}}}),pme=[`aria-expanded`,`onClick`],mme={class:`min-w-0 flex-1`},hme={class:`text-base-content/50 text-xs`},gme=[`title`],_me={class:`badge badge-sm shrink-0`},vme=V({__name:`ConnectionCardList`,setup Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function DR(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}SR.d(CR,{A:()=>Cge});var OR=(kR={Fragment:()=>q,computed:()=>Y,createTextVNode:()=>_o,createVNode:()=>J,defineComponent:()=>V,nextTick:()=>Mr,reactive:()=>tn,ref:()=>I,watch:()=>B,watchEffect:()=>Yr},AR={},SR.d(AR,kR),AR),vge=(0,OR.defineComponent)({props:{data:{required:!0,type:String},onClick:Function},render:function(){var e=this.data,t=this.onClick;return(0,OR.createVNode)(`span`,{class:`vjs-tree-brackets`,onClick:t},[e])}}),yge=(0,OR.defineComponent)({emits:[`change`,`update:modelValue`],props:{checked:{type:Boolean,default:!1},isMultiple:Boolean,onChange:Function},setup:function(e,t){var n=t.emit;return{uiType:(0,OR.computed)((function(){return e.isMultiple?`checkbox`:`radio`})),model:(0,OR.computed)({get:function(){return e.checked},set:function(e){return n(`update:modelValue`,e)}})}},render:function(){var e=this.uiType,t=this.model,n=this.$emit;return(0,OR.createVNode)(`label`,{class:[`vjs-check-controller`,t?`is-checked`:``],onClick:function(e){return e.stopPropagation()}},[(0,OR.createVNode)(`span`,{class:`vjs-check-controller-inner is-${e}`},null),(0,OR.createVNode)(`input`,{checked:t,class:`vjs-check-controller-original is-${e}`,type:e,onChange:function(){return n(`change`,t)}},null)])}}),bge=(0,OR.defineComponent)({props:{nodeType:{required:!0,type:String},onClick:Function},render:function(){var e=this.nodeType,t=this.onClick,n=e===`objectStart`||e===`arrayStart`;return n||e===`objectCollapsed`||e===`arrayCollapsed`?(0,OR.createVNode)(`span`,{class:`vjs-carets vjs-carets-${n?`open`:`close`}`,onClick:t},[(0,OR.createVNode)(`svg`,{viewBox:`0 0 1024 1024`,focusable:`false`,"data-icon":`caret-down`,width:`1em`,height:`1em`,fill:`currentColor`,"aria-hidden":`true`},[(0,OR.createVNode)(`path`,{d:`M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z`},null)])]):null}}),kR,AR;function jR(e){return jR=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},jR(e)}function MR(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function NR(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:`root`,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=(arguments.length>3?arguments[3]:void 0)||{},i=r.key,a=r.index,o=r.type,s=o===void 0?`content`:o,c=r.showComma,l=c!==void 0&&c,u=r.length,d=u===void 0?1:u,f=MR(e);if(f===`array`){var p=PR(e.map((function(e,r,i){return NR(e,`${t}[${r}]`,n+1,{index:r,showComma:r!==i.length-1,length:d,type:s})})));return[NR(`[`,t,n,{showComma:!1,key:i,length:e.length,type:`arrayStart`})[0]].concat(p,NR(`]`,t,n,{showComma:l,length:e.length,type:`arrayEnd`})[0])}if(f===`object`){var m=Object.keys(e),h=PR(m.map((function(r,i,a){return NR(e[r],/^[a-zA-Z_]\w*$/.test(r)?`${t}.${r}`:`${t}["${r}"]`,n+1,{key:r,showComma:i!==a.length-1,length:d,type:s})})));return[NR(`{`,t,n,{showComma:!1,key:i,index:a,length:m.length,type:`objectStart`})[0]].concat(h,NR(`}`,t,n,{showComma:l,length:m.length,type:`objectEnd`})[0])}return[{content:e,level:n,key:i,index:a,path:t,showComma:l,length:d,type:s}]}function PR(e){if(typeof Array.prototype.flat==`function`)return e.flat();for(var t=ER(e),n=[];t.length;){var r=t.shift();Array.isArray(r)?t.unshift.apply(t,ER(r)):n.push(r)}return n}function FR(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:new WeakMap;if(e==null)return e;if(e instanceof Date)return new Date(e);if(e instanceof RegExp)return new RegExp(e);if(jR(e)!==`object`)return e;if(t.get(e))return t.get(e);if(Array.isArray(e)){var n=e.map((function(e){return FR(e,t)}));return t.set(e,n),n}var r={};for(var i in e)r[i]=FR(e[i],t);return t.set(e,r),r}function IR(e,t,n,r,i,a,o){try{var s=e[a](o),c=s.value}catch(e){n(e);return}s.done?t(c):Promise.resolve(c).then(r,i)}var xge=SR(207),LR=SR.n(xge);function RR(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function zR(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?RR(Object(n),!0).forEach((function(t){DR(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):RR(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var BR={data:{type:[String,Number,Boolean,Array,Object],default:null},rootPath:{type:String,default:`root`},indent:{type:Number,default:2},showLength:{type:Boolean,default:!1},showDoubleQuotes:{type:Boolean,default:!0},renderNodeKey:Function,renderNodeValue:Function,renderNodeAction Line truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}())[0],u=a;n(`update:selectedValue`,u),n(`selectedChange`,u,l)}},C=function(e){n(`nodeClick`,e)},w=function(e){n(`nodeMouseover`,e)},T=function(e,t){if(e)s.hiddenPaths=HR(HR({},s.hiddenPaths),{},DR({},t,1));else{var n=HR({},s.hiddenPaths);delete n[t],s.hiddenPaths=n}},E=function(t,r){e.collapsedOnClickBrackets&&T(t,r.path),n(`bracketsClick`,t,r)},D=function(e,t){T(e,t.path),n(`iconClick`,e,t)},O=function(t,r){var i=FR(e.data),a=e.rootPath;Function(`data`,`val`,`data${r.slice(a.length)}=val`)(i,t),n(`update:data`,i)};return(0,OR.watchEffect)((function(){_.value&&function(e){throw Error(`[VueJSONPretty] ${e}`)}(_.value)})),(0,OR.watchEffect)((function(){h.value&&(e.virtual&&e.dynamicHeight&&c.length!==h.value.length&&f(h.value.length),y())})),(0,OR.watch)((function(){return[e.dynamicHeight,e.itemHeight,a.value.length]}),(function(){e.virtual&&e.dynamicHeight&&(f(h.value.length),(0,OR.nextTick)(y))})),(0,OR.watch)((function(){return e.deep}),(function(t){t&&(s.hiddenPaths=o(t,e.collapsedNodeLength))})),(0,OR.watch)((function(){return e.collapsedNodeLength}),(function(t){t&&(s.hiddenPaths=o(e.deep,t))})),function(){var t,n=e.renderNodeKey??r.renderNodeKey,o=e.renderNodeValue??r.renderNodeValue,c=(t=e.renderNodeActions??r.renderNodeActions)!=null&&t,l=s.visibleData?.map((function(t,r){var i=s.startIndex+r;return(0,OR.createVNode)(`div`,{key:t.id,ref:function(e){return function(e,t){t?d[e]=t:delete d[e]}(i,e||null)}},[(0,OR.createVNode)(Sge,{data:e.data,rootPath:e.rootPath,indent:e.indent,node:t,collapsed:!!s.hiddenPaths[t.path],theme:e.theme,showDoubleQuotes:e.showDoubleQuotes,showLength:e.showLength,checked:g.value.includes(t.path),selectableType:e.selectableType,showLine:e.showLine,showLineNumber:e.showLineNumber,showSelectController:e.showSelectController,selectOnClickNode:e.selectOnClickNode,nodeSelectable:e.nodeSelectable,highlightSelectedNode:e.highlightSelectedNode,editable:e.editable,editableTrigger:e.editableTrigger,showIcon:e.showIcon,showKeyValueSpace:e.showKeyValueSpace,renderNodeKey:n,renderNodeValue:o,renderNodeActions:c,onNodeClick:C,onNodeMouseover:w,onBracketsClick:E,onIconClick:D,onSelectedChange:S,onValueChange:O,class:e.dynamicHeight?`dynamic-height`:void 0,style:e.dynamicHeight?{}:e.itemHeight&&e.itemHeight!==20?{lineHeight:`${e.itemHeight}px`}:{}},null)])}));return(0,OR.createVNode)(`div`,{ref:i,class:{"vjs-tree":!0,"is-virtual":e.virtual,dark:e.theme===`dark`},onScroll:e.virtual?x:void 0,style:e.showLineNumber?HR({paddingLeft:`${12*Number(a.value.length.toString().length)}px`},e.style):e.style},[e.virtual?(0,OR.createVNode)(`div`,{class:`vjs-tree-list`,style:{height:`${e.height}px`}},[(0,OR.createVNode)(`div`,{class:`vjs-tree-list-holder`,style:{height:`${v.value}px`}},[(0,OR.createVNode)(`div`,{class:`vjs-tree-list-holder-inner`,style:{transform:`translateY(${s.translateY}px)`}},[l])])]):l])}}}),wge=CR.A,Tge=[`title`],Ege={class:`flex h-[70dvh] max-h-[70dvh] flex-col overflow-hidden`},Dge={class:`m-2 mb-0 shrink-0`},Oge={key:0,class:`flex flex-1 flex-col gap-3 overflow-y-auto p-4`},kge={class:`border-base-content/8 bg-base-200/40 rounded-lg border p-3`},Age={class:`text-primary mb-2 text-sm font-semibold`},jge={class:`grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm`},Mge={class:`text-base-content/60`},Nge={class:`min-w-0 break-all`},Pge={key:0,class:`border-base-content/8 bg-base-200/40 rounded-lg border p-3 text-sm`},Fge={class:`text-primary mb-2 font-semibold`},Ige={class:`flex flex-wrap items-center gap-1`},Lge={class:`mt-1 flex flex-wrap`},Rge={key:0,class:`mr-3 flex items-center gap-1`},zge={class:`flex items-center gap-1`},Bge={key:1,class:`flex-1 overflow-y-auto p-4`},Vge={key:0},Hge={class:`shrink-0 p-3 pb-0`},Uge=V({__name:`ConnectionDetails`,setup(e){let t=Z,{infoConn:n,connectionDetailModalShow:r}=NF(),{t:i}=Wb(),a=I(null),o=I(``),s=I(!1),c={overview:`overview`,raw:`rawData`,proxies:`proxies`},l=I(`overview`),u=Y(()=>n.value?Foe(n.value):void 0),d=Y(()=>n.value?fC(n.value):``),f=Y(()=>!!u.value&&Xx.isValid(u.value)),p=Y(()=>{if(!f.value)return!1;let e=Xx.parse(u.value).range();return[`private`,`uniqueLocal`,`loopback`,`linkLocal`].includes(e)}),m=Y(()=>f.value&&!p.value&&!!a.value),h=Y(()=>!n.value||!sC(n.value).length?null:(0,vg.last)(sC(n.value))),g=Y(()=>h.value?[`overview`,`raw`,`proxies`]:[`overview`,`raw`]),_=Y(()=>g.value.map(e=>({value:e,label:i(c[e])}))),v=[{id:`basic`,keys:[t.Type,t.ConnectTime,t.Rule,t.Process,t.InboundUser]},{id:`sourceAndDestination`,keys:[t.SourceIP,t.SourcePort,t.Host,t.SniffHost,t.Destination,t.DestinationType,t.RemoteAddress]},{id:`traffic`,keys:[t.Download,t.Upload,t.DlSpeed,t.UlSpeed]},{id:`outbound`,keys:[t.Chains,t.Outbound]}],y=Y(()=>{let e=n.value;if(!e)return[];let t={mode:`table`,proxyChainDirection:Zh.value,showFullProxyChain:!0},r=n=>n.map(n=>({label:i(n),value:String(wS(e,n,t)??``)})).filter(e=>e.value&&e.value!==`-`);return v.map(t=>{let n=r(t.ke Line truncated
font-size: .6rem;
font-weight: bold;
color: hsl(${Math.max(0,Math.min(120-120*r,120))}deg 100% 31%);`,n?.key)}return i}}function JR(e,t,n,r){return{debug:()=>e?.debugAll??e[t],key:!1,onChange:r}}function Gge(e,t,n,r){let i={id:`${t.id}_${n.id}`,row:t,column:n,getValue:()=>t.getValue(r),renderValue:()=>i.getValue()??e.options.renderFallbackValue,getContext:qR(()=>[e,n,t,i],(e,t,n,r)=>({table:e,column:t,row:n,cell:r,getValue:r.getValue,renderValue:r.renderValue}),JR(e.options,`debugCells`,`cell.getContext`))};return e._features.forEach(r=>{r.createCell==null||r.createCell(i,n,t,e)},{}),i}function Kge(e,t,n,r){let i={...e._getDefaultColumnDef(),...t},a=i.accessorKey,o=i.id??(a?typeof String.prototype.replaceAll==`function`?a.replaceAll(`.`,`_`):a.replace(/\./g,`_`):void 0)??(typeof i.header==`string`?i.header:void 0),s;if(i.accessorFn?s=i.accessorFn:a&&(s=a.includes(`.`)?e=>{let t=e;for(let e of a.split(`.`))t=t?.[e];return t}:e=>e[i.accessorKey]),!o)throw Error();let c={id:`${String(o)}`,accessorFn:s,parent:r,depth:n,columnDef:i,columns:[],getFlatColumns:qR(()=>[!0],()=>[c,...c.columns?.flatMap(e=>e.getFlatColumns())],JR(e.options,`debugColumns`,`column.getFlatColumns`)),getLeafColumns:qR(()=>[e._getOrderColumnsFn()],e=>{var t;return(t=c.columns)!=null&&t.length?e(c.columns.flatMap(e=>e.getLeafColumns())):[c]},JR(e.options,`debugColumns`,`column.getLeafColumns`))};for(let t of e._features)t.createColumn==null||t.createColumn(c,e);return c}var YR=`debugHeaders`;function XR(e,t,n){let r={id:n.id??t.id,column:t,index:n.index,isPlaceholder:!!n.isPlaceholder,placeholderId:n.placeholderId,depth:n.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{let e=[],t=n=>{n.subHeaders&&n.subHeaders.length&&n.subHeaders.map(t),e.push(n)};return t(r),e},getContext:()=>({table:e,header:r,column:t})};return e._features.forEach(t=>{t.createHeader==null||t.createHeader(r,e)}),r}var qge={createTable:e=>{e.getHeaderGroups=qR(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,i)=>{let a=r?.map(e=>n.find(t=>t.id===e)).filter(Boolean)??[],o=i?.map(e=>n.find(t=>t.id===e)).filter(Boolean)??[],s=n.filter(e=>!(r!=null&&r.includes(e.id))&&!(i!=null&&i.includes(e.id)));return ZR(t,[...a,...s,...o],e)},JR(e.options,YR,`getHeaderGroups`)),e.getCenterHeaderGroups=qR(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(t,n,r,i)=>(n=n.filter(e=>!(r!=null&&r.includes(e.id))&&!(i!=null&&i.includes(e.id))),ZR(t,n,e,`center`)),JR(e.options,YR,`getCenterHeaderGroups`)),e.getLeftHeaderGroups=qR(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(t,n,r)=>ZR(t,r?.map(e=>n.find(t=>t.id===e)).filter(Boolean)??[],e,`left`),JR(e.options,YR,`getLeftHeaderGroups`)),e.getRightHeaderGroups=qR(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(t,n,r)=>ZR(t,r?.map(e=>n.find(t=>t.id===e)).filter(Boolean)??[],e,`right`),JR(e.options,YR,`getRightHeaderGroups`)),e.getFooterGroups=qR(()=>[e.getHeaderGroups()],e=>[...e].reverse(),JR(e.options,YR,`getFooterGroups`)),e.getLeftFooterGroups=qR(()=>[e.getLeftHeaderGroups()],e=>[...e].reverse(),JR(e.options,YR,`getLeftFooterGroups`)),e.getCenterFooterGroups=qR(()=>[e.getCenterHeaderGroups()],e=>[...e].reverse(),JR(e.options,YR,`getCenterFooterGroups`)),e.getRightFooterGroups=qR(()=>[e.getRightHeaderGroups()],e=>[...e].reverse(),JR(e.options,YR,`getRightFooterGroups`)),e.getFlatHeaders=qR(()=>[e.getHeaderGroups()],e=>e.map(e=>e.headers).flat(),JR(e.options,YR,`getFlatHeaders`)),e.getLeftFlatHeaders=qR(()=>[e.getLeftHeaderGroups()],e=>e.map(e=>e.headers).flat(),JR(e.options,YR,`getLeftFlatHeaders`)),e.getCenterFlatHeaders=qR(()=>[e.getCenterHeaderGroups()],e=>e.map(e=>e.headers).flat(),JR(e.options,YR,`getCenterFlatHeaders`)),e.getRightFlatHeaders=qR(()=>[e.getRightHeaderGroups()],e=>e.map(e=>e.headers).flat(),JR(e.options,YR,`getRightFlatHeaders`)),e.getCenterLeafHeaders=qR(()=>[e.getCenterFlatHeaders()],e=>e.filter(e=>{var t;return!((t=e.subHeaders)!=null&&t.length)}),JR(e.options,YR,`getCenterLeafHeaders`)),e.getLeftLeafHeaders=qR(()=>[e.getLeftFlatHeaders()],e=>e.filter(e=>{var t;return!((t=e.subHeaders)!=null&&t.length)}),JR(e.options,YR,`getLeftLeafHeaders`)),e.getRightLeafHeaders=qR(()=>[e.getRightFlatHeaders()],e=>e.filter(e=>{var t;return!((t=e.subHeaders)!=null&&t.length)}),JR(e.options,YR,`getRightLeafHeaders`)),e.getLeafHeaders=qR(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(e,t,n)=>[...e[0]?.headers??[],...t[0]?.headers??[],...n[0]?.headers??[]].map(e=>e.getLeafHeaders()).flat(),JR(e.options,YR,`getLeafHeaders`))}};function ZR(e,t,n,r){let i=0,a=function(e,t){t===void 0&&(t=1),i=Math.max(i,t),e.filter(e=>e.getIsVisible()).forEach(e=>{var n;(n=e.columns)!=null&&n.length&&a(e.columns,t+1)},0)};a(e);let o=[],s=(e,t)=>{let i={depth:t,id:[r,`${t}`].filter(Boolean).join(`_`),headers:[]},a= Line truncated
`);if(i.length===1)return _H(i[0],t,n,r);for(var a=new rH(0,0,0,0),o=0;o<i.length;o++){var s=_H(i[o],t,n,r);o===0?a.copy(s):a.union(s)}return a}function yH(e,t,n,r){return n===`right`?r?e+=t:e-=t:n===`center`&&(r?e+=t/2:e-=t/2),e}function bH(e,t,n,r){return n===`middle`?r?e+=t/2:e-=t/2:n===`bottom`&&(r?e+=t:e-=t),e}function xH(e){return dH(e).stWideCharWidth}function SH(e,t){return typeof e==`string`?e.lastIndexOf(`%`)>=0?parseFloat(e)/100*t:parseFloat(e):e}function CH(e,t,n){var r=t.position||`inside`,i=t.distance==null?5:t.distance,a=n.height,o=n.width,s=a/2,c=n.x,l=n.y,u=`left`,d=`top`;if(r instanceof Array)c+=SH(r[0],n.width),l+=SH(r[1],n.height),u=null,d=null;else switch(r){case`left`:c-=i,l+=s,u=`right`,d=`middle`;break;case`right`:c+=i+o,l+=s,d=`middle`;break;case`top`:c+=o/2,l-=i,u=`center`,d=`bottom`;break;case`bottom`:c+=o/2,l+=a+i,u=`center`;break;case`inside`:c+=o/2,l+=s,u=`center`,d=`middle`;break;case`insideLeft`:c+=i,l+=s,d=`middle`;break;case`insideRight`:c+=o-i,l+=s,u=`right`,d=`middle`;break;case`insideTop`:c+=o/2,l+=i,u=`center`;break;case`insideBottom`:c+=o/2,l+=a-i,u=`center`,d=`bottom`;break;case`insideTopLeft`:c+=i,l+=i;break;case`insideTopRight`:c+=o-i,l+=i,u=`right`;break;case`insideBottomLeft`:c+=i,l+=a-i,d=`bottom`;break;case`insideBottomRight`:c+=o-i,l+=a-i,u=`right`,d=`bottom`;break}return e||={},e.x=c,e.y=l,e.align=u,e.verticalAlign=d,e}var wH=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;function sye(e,t,n,r,i,a){if(!n){e.text=``,e.isTruncated=!1;return}var o=(t+``).split(`
`);a=TH(n,r,i,a);for(var s=!1,c={},l=0,u=o.length;l<u;l++)EH(c,o[l],a),o[l]=c.textLine,s||=c.isTruncated;e.text=o.join(`
`),e.isTruncated=s}function TH(e,t,n,r){r||={};var i=kB({},r);n=QB(n,`...`),i.maxIterations=QB(r.maxIterations,2);var a=i.minChar=QB(r.minChar,0),o=i.fontMeasureInfo=dH(t),s=o.asciiCharWidth;i.placeholder=QB(r.placeholder,``);for(var c=e=Math.max(0,e-1),l=0;l<a&&c>=s;l++)c-=s;var u=gH(o,n);return u>c&&(n=``,u=0),c=e-u,i.ellipsis=n,i.ellipsisWidth=u,i.contentWidth=c,i.containerWidth=e,i}function EH(e,t,n){var r=n.containerWidth,i=n.contentWidth,a=n.fontMeasureInfo;if(!r){e.textLine=``,e.isTruncated=!1;return}var o=gH(a,t);if(o<=r){e.textLine=t,e.isTruncated=!1;return}for(var s=0;;s++){if(o<=i||s>=n.maxIterations){t+=n.ellipsis;break}var c=s===0?cye(t,i,a):o>0?Math.floor(t.length*i/o):0;t=t.substr(0,c),o=gH(a,t)}t===``&&(t=n.placeholder),e.textLine=t,e.isTruncated=!0}function cye(e,t,n){for(var r=0,i=0,a=e.length;i<a&&r<t;i++)r+=hH(n,e.charCodeAt(i));return i}function lye(e,t,n,r){var i=NH(e),a=t.overflow,o=t.padding,s=o?o[1]+o[3]:0,c=o?o[0]+o[2]:0,l=t.font,u=a===`truncate`,d=xH(l),f=QB(t.lineHeight,d),p=t.lineOverflow===`truncate`,m=!1,h=t.width;h==null&&n!=null&&(h=n-s);var g=t.height;g==null&&r!=null&&(g=r-c);var _=h!=null&&(a===`break`||a===`breakAll`)?i?kH(i,t.font,h,a===`breakAll`,0).lines:[]:i?i.split(`
`):[],v=_.length*f;if(g??=v,v>g&&p){var y=Math.floor(g/f);m||=_.length>y,_=_.slice(0,y),v=_.length*f}if(i&&u&&h!=null)for(var b=TH(h,l,t.ellipsis,{minChar:t.truncateMinChar,placeholder:t.placeholder}),x={},S=0;S<_.length;S++)EH(x,_[S],b),_[S]=x.textLine,m||=x.isTruncated;for(var C=g,w=0,T=dH(l),S=0;S<_.length;S++)w=Math.max(gH(T,_[S]),w);h??=w;var E=h;return C+=c,E+=s,{lines:_,height:g,outerWidth:E,outerHeight:C,lineHeight:f,calculatedLineHeight:d,contentWidth:w,contentHeight:v,width:h,isTruncated:m}}var uye=function(){function e(){}return e}(),DH=function(){function e(e){this.tokens=[],e&&(this.tokens=e)}return e}(),dye=function(){function e(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[],this.isTruncated=!1}return e}();function fye(e,t,n,r,i){var a=new dye,o=NH(e);if(!o)return a;var s=t.padding,c=s?s[1]+s[3]:0,l=s?s[0]+s[2]:0,u=t.width;u==null&&n!=null&&(u=n-c);var d=t.height;d==null&&r!=null&&(d=r-l);for(var f=t.overflow,p=(f===`break`||f===`breakAll`)&&u!=null?{width:u,accumWidth:0,breakAll:f===`breakAll`}:null,m=wH.lastIndex=0,h;(h=wH.exec(o))!=null;){var g=h.index;g>m&&OH(a,o.substring(m,g),t,p),OH(a,h[2],t,p,h[1]),m=wH.lastIndex}m<o.length&&OH(a,o.substring(m,o.length),t,p);var _=[],v=0,y=0,b=f===`truncate`,x=t.lineOverflow===`truncate`,S={};function C(e,t,n){e.width=t,e.lineHeight=n,v+=n,y=Math.max(y,t)}outer:for(var w=0;w<a.lines.length;w++){for(var T=a.lines[w],E=0,D=0,O=0;O<T.tokens.length;O++){var k=T.tokens[O],A=k.styleName&&t.rich[k.styleName]||{},j=k.textPadding=A.padding,M=j?j[1]+j[3]:0,ee=k.font=A.font||t.font;k.contentHeight=xH(ee);var te=QB(A.height,k.contentHeight);if(k.innerHeight=te,j&&(te+=j[0]+j[2]),k.height=te,k.lineHeight=$B(A.lineHeight,t.lineHeight,te),k.align=A&&A.align||i,k.verticalAlign=A&&A.verticalAlign||`middle`,x&&d!=null&&v+k.lineHeight>d){var ne=a.lines.length;O>0?(T.tokens=T.tokens.slice(0,O),C(T,D,E),a.lines=a.lines.slice(0,w+1)):a.lines=a.lines.slice(0,w),a.isTruncated=a.isTruncated||a.lines.length<ne;break outer}var N=A.width,re=N==null||N===`auto`;if(typeof N==`string`&&N.charAt(N.length-1)===`%`)k.percentWidth=N,_.push(k),k.contentWidth=gH(dH(ee),k.text);else{if(re){var ie=A.backgroundColor,ae=ie&&ie.image;ae&&(ae=Kve(ae),EV(ae)&&(k.width=Math.max(k.width,ae.width*te/ae.height)))}var oe=b&&u!=null?u-D:null;oe!=null&&oe<k.width?!re||oe<M?(k.text=``,k.width=k.contentWidth=0):(sye(S,k.text,oe-M,ee,t.ellipsis,{minChar:t.truncateMinChar}),k.text=S.text,a.isTruncated=a.isTruncated||S.isTruncated,k.width=k.contentWidth=gH(dH(ee),k.text)):k.contentWidth=gH(dH(ee),k.text)}k.width+=M,D+=k.width,A&&(E=Math.max(E,k.lineHeight))}C(T,D,E)}a.outerWidth=a.width=QB(u,y),a.outerHeight=a.height=QB(d,v),a.contentHeight=v,a.contentWidth=y,a.outerWidth+=c,a.outerHeight+=l;for(var w=0;w<_.length;w++){var k=_[w],se=k.percentWidth;k.width=parseInt(se,10)/100*a.width}return a}function OH(e,t,n,r,i){var a=t===``,o=i&&n.rich[i]||{},s=e.lines,c=o.font||n.font,l=!1,u,d;if(r){var f=o.padding,p=f?f[1]+f[3]:0;if(o.width!=null&&o.width!==`auto`){var m=SH(o.width,r.width)+p;s.length>0&&m+r.accumWidth>r.width&&(u=t.split(`
`),l=!0),r.accumWidth=m}else{var h=kH(t,c,r.width,r.breakAll,r.accumWidth);r.accumWidth=h.accumWidth+p,d=h.linesWidths,u=h.lines}}u||=t.split(`
`);for(var g=dH(c),_=0;_<u.length;_++){var v=u[_],y=new uye;if(y.styleName=i,y.text=v,y.isLineHolder=!v&&!a,typeof o.width==`number`?y.width=o.width:y.width=d?d[_]:gH(g,v),!_&&!l){var b=(s[s.length-1]||(s[0]=new DH)).tokens,x=b.length;x===1&&b[0].isLineHolder?b[0]=y:(v||!x||a)&&b.push(y)}else s.push(new DH([y]))}}function pye(e){var t=e.charCodeAt(0);return t>=32&&t<=591||t>=880&&t<=4351||t>=4608&&t<=5119||t>=7680&&t<=8303}var mye=FB(`,&?/;] `.split(``),function(e,t){return e[t]=!0,e},{});function hye(e){return!pye(e)||!!mye[e]}function kH(e,t,n,r,i){for(var a=[],o=[],s=``,c=``,l=0,u=0,d=dH(t),f=0;f<e.length;f++){var p=e.charAt(f);if(p===`
`){c&&(s+=c,u+=l),a.push(s),o.push(u),s=``,c=``,l=0,u=0;continue}var m=hH(d,p.charCodeAt(0)),h=!r&&!hye(p);if(a.length?u+m>n:i+u+m>n){u?(s||c)&&(h?(s||(s=c,c=``,l=0,u=l),a.push(s),o.push(u-l),c+=p,l+=m,s=``,u=l):(c&&(s+=c,c=``,l=0),a.push(s),o.push(u),s=p,u=m)):h?(a.push(c),o.push(l),c=p,l=m):(a.push(p),o.push(m));continue}u+=m,h?(c+=p,l+=m):(c&&(s+=c,c=``,l=0),s+=p)}return c&&(s+=c),s&&(a.push(s),o.push(u)),a.length===1&&(u+=i),{accumWidth:u,lines:a,linesWidths:o}}function AH(e,t,n,r,i,a){if(e.baseX=n,e.baseY=r,e.outerWidth=e.outerHeight=null,t){var o=t.width*2,s=t.height*2;rH.set(jH,yH(n,o,i),bH(r,s,a),o,s),rH.intersect(t,jH,null,MH);var c=MH.outIntersectRect;e.outerWidth=c.width,e.outerHeight=c.height,e.baseX=yH(c.x,c.width,i,!0),e.baseY=bH(c.y,c.height,a,!0)}}var jH=new rH(0,0,0,0),MH={outIntersectRect:{},clamp:!0};function NH(e){return e==null?e=``:e+=``}function gye(e){var t=NH(e.text),n=e.font;return PH(e,gH(dH(n),t),xH(n),null)}function PH(e,t,n,r){var i=new rH(yH(e.x||0,t,e.textAlign),bH(e.y||0,n,e.textBaseline),t,n),a=r??(FH(e)?e.lineWidth:0);return a>0&&(i.x-=a/2,i.y-=a/2,i.width+=a,i.height+=a),i}function FH(e){var t=e.stroke;return t!=null&&t!==`none`&&e.lineWidth>0}var IH=OV,LH=5e-5;function RH(e){return e>LH||e<-LH}var zH=[],BH=[],VH=DV(),HH=Math.abs,UH=function(){function e(){}return e.prototype.getLocalTransform=function(e){return WH(this,e)},e.prototype.setPosition=function(e){this.x=e[0],this.y=e[1]},e.prototype.setScale=function(e){this.scaleX=e[0],this.scaleY=e[1]},e.prototype.setSkew=function(e){this.skewX=e[0],this.skewY=e[1]},e.prototype.setOrigin=function(e){this.originX=e[0],this.originY=e[1]},e.prototype.needLocalTransform=function(){return RH(this.rotation)||RH(this.x)||RH(this.y)||RH(this.scaleX-1)||RH(this.scaleY-1)||RH(this.skewX)||RH(this.skewY)},e.prototype.updateTransform=function(){var e=this.parent&&this.parent.transform,t=this.needLocalTransform(),n=this.transform;if(!(t||e)){n&&(IH(n),this.invTransform=null);return}n||=DV(),t?this.getLocalTransform(n):IH(n),e&&(t?AV(n,e,n):kV(n,e)),this.transform=n,this._resolveGlobalScaleRatio(n),this.invTransform=this.invTransform||DV(),NV(this.invTransform,n)},e.prototype._resolveGlobalScaleRatio=function(e){var t=this.globalScaleRatio;if(t!=null&&t!==1){this.getGlobalScale(zH);var n=zH[0]<0?-1:1,r=zH[1]<0?-1:1,i=((zH[0]-n)*t+n)/zH[0]||0,a=((zH[1]-r)*t+r)/zH[1]||0;e[0]*=i,e[1]*=i,e[2]*=a,e[3]*=a}},e.prototype.getComputedTransform=function(){for(var e=this,t=[];e;)t.push(e),e=e.parent;for(;e=t.pop();)e.updateTransform();return this.transform},e.prototype.setLocalTransform=function(e){if(e){var t=e[0]*e[0]+e[1]*e[1],n=e[2]*e[2]+e[3]*e[3],r=Math.atan2(e[1],e[0]),i=Math.PI/2+r-Math.atan2(e[3],e[2]);n=Math.sqrt(n)*Math.cos(i),t=Math.sqrt(t),this.skewX=i,this.skewY=0,this.rotation=-r,this.x=+e[4],this.y=+e[5],this.scaleX=t,this.scaleY=n,this.originX=0,this.originY=0}},e.prototype.decomposeTransform=function(){if(this.transform){var e=this.parent,t=this.transform;e&&e.transform&&(e.invTransform=e.invTransform||DV(),AV(BH,e.invTransform,t),t=BH);var n=this.originX,r=this.originY;(n||r)&&(VH[4]=n,VH[5]=r,AV(BH,t,VH),BH[4]-=n,BH[5]-=r,t=BH),this.setLocalTransform(t)}},e.prototype.getGlobalScale=function(e){var t=this.transform;return e||=[],t?(e[0]=Math.sqrt(t[0]*t[0]+t[1]*t[1]),e[1]=Math.sqrt(t[2]*t[2]+t[3]*t[3]),t[0]<0&&(e[0]=-e[0]),t[3]<0&&(e[1]=-e[1]),e):(e[0]=1,e[1]=1,e)},e.prototype.transformCoordToLocal=function(e,t){var n=[e,t],r=this.invTransform;return r&&VV(n,n,r),n},e.prototype.transformCoordToGlobal=function(e,t){var n=[e,t],r=this.transform;return r&&VV(n,n,r),n},e.prototype.getLineScale=function(){var e=this.transform;return e&&HH(e[0]-1)>1e-10&&HH(e[3]-1)>1e-10?Math.sqrt(HH(e[0]*e[3]-e[2]*e[1])):1},e.prototype.copyTransform=function(e){qH(this,e)},e.getLocalTransform=function(e,t){t||=[];var n=e.originX||0,r=e.originY||0,i=e.scaleX,a=e.scaleY,o=e.anchorX,s=e.anchorY,c=e.rotation||0,l=e.x,u=e.y,d=e.skewX?Math.tan(e.skewX):0,f=e.skewY?Math.tan(-e.skewY):0;if(n||r||o||s){var p=n+o,m=r+s;t[4]=-p*i-d*m*a,t[5]=-m*a-f*p*i}else t[4]=t[5]=0;return t[0]=i,t[3]=a,t[1]=f*i,t[2]=d*a,c&&MV(t,t,c),t[4]+=n+l,t[5]+=r+u,t},e.initDefaultProps=(function(){var t=e.prototype;t.scaleX=t.scaleY=t.globalScaleRatio=1,t.x=t.y=t.originX=t.originY=t.skewX=t.skewY=t.rotation=t.anchorX=t.anchorY=0})(),e}(),WH=UH.getLocalTransform;function GH(){return new UH}var KH=[`x`,`y`,`originX`,`originY`,`anchorX`,`anchorY`,`rotation`,`scaleX`,`scaleY`,`skewX`,`skewY`];function qH(e,t){return Cve(e,t,KH)}var JH={linear:function(e){return e},quadraticIn:function(e){return e*e},quadraticOut:function(e){return e*(2-e)},quadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},cubicIn:function(e){return e*e*e},cubicOut:function(e){return--e*e*e+1},cubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},quarticIn:function(e){return e*e*e*e},quarticOut:function(e){return 1- --e*e*e*e},quarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2) Line truncated
`,`
`,`
`];function FQ(e,t){return t.type=e,t}function IQ(e){return e.type===`section`}function LQ(e){return IQ(e)?ZCe:QCe}function RQ(e){if(IQ(e)){var t=0,n=e.blocks.length,r=n>1||n>0&&!e.noHeader;return $(e.blocks,function(e){var n=RQ(e);n>=t&&(t=n+ +(r&&(!n||IQ(e)&&!e.noHeader)))}),t}return 0}function ZCe(e,t,n,r){var i=t.noHeader,a=$Ce(RQ(t)),o=[],s=t.blocks||[];nV(!s||BB(s)),s||=[];var c=e.orderMode;if(t.sortBlocks&&c){s=s.slice();var l={valueAsc:`asc`,valueDesc:`desc`};if(dV(l,c)){var u=new OSe(l[c],null);s.sort(function(e,t){return u.evaluate(e.sortParam,t.sortParam)})}else c===`seriesDesc`&&s.reverse()}$(s,function(n,i){var s=t.valueFormatter,c=LQ(n)(s?kB(kB({},e),{valueFormatter:s}):e,n,i>0?a.html:0,r);c!=null&&o.push(c)});var d=e.renderMode===`richText`?o.join(a.richText):BQ(r,o.join(``),i?n:a.html);if(i)return d;var f=aQ(t.header,`ordinal`,e.useUTC),p=PQ(r,e.renderMode).nameStyle,m=NQ(r);return e.renderMode===`richText`?VQ(e,f,p)+a.richText+d:BQ(r,`<div style="`+p+`;`+m+`;">`+_Z(f)+`</div>`+d,n)}function QCe(e,t,n,r){var i=e.renderMode,a=t.noName,o=t.noValue,s=!t.markerType,c=t.name,l=e.useUTC,u=t.valueFormatter||e.valueFormatter||function(e){return e=BB(e)?e:[e],PB(e,function(e,t){return aQ(e,BB(p)?p[t]:p,l)})};if(!(a&&o)){var d=s?``:e.markupStyleCreator.makeTooltipMarker(t.markerType,t.markerColor||kQ.color.secondary,i),f=a?``:aQ(c,`ordinal`,l),p=t.valueType,m=o?[]:u(t.value,t.rawDataIndex),h=!s||!a,g=!s&&a,_=PQ(r,i),v=_.nameStyle,y=_.valueStyle;return i===`richText`?(s?``:d)+(a?``:VQ(e,f,v))+(o?``:nwe(e,m,h,g,y)):BQ(r,(s?``:d)+(a?``:ewe(f,!s,v))+(o?``:twe(m,h,g,y)),n)}}function zQ(e,t,n,r,i,a){if(e)return LQ(e)({useUTC:i,renderMode:n,orderMode:r,markupStyleCreator:t,valueFormatter:e.valueFormatter},e,0,a)}function $Ce(e){return{html:YCe[e],richText:XCe[e]}}function BQ(e,t,n){var r=`<div style="clear:both"></div>`,i=`margin: `+n+`px 0 0`,a=NQ(e);return`<div style="`+i+`;`+a+`;">`+t+r+`</div>`}function ewe(e,t,n){var r=t?`margin-left:2px`:``;return`<span style="`+n+`;`+r+`">`+_Z(e)+`</span>`}function twe(e,t,n,r){var i=t?`float:right;margin-left:`+(n?`10px`:`20px`):``;return e=BB(e)?e:[e],`<span style="`+i+`;`+r+`">`+PB(e,function(e){return _Z(e)}).join(`&nbsp;&nbsp;`)+`</span>`}function VQ(e,t,n){return e.markupStyleCreator.wrapRichTextStyle(t,n)}function nwe(e,t,n,r,i){var a=[i],o=r?10:20;return n&&a.push({padding:[0,0,0,o],align:`right`}),e.markupStyleCreator.wrapRichTextStyle(BB(t)?t.join(` `):t,a)}function rwe(e,t){var n=e.getData().getItemVisual(t,`style`)[e.visualDrawType];return lQ(n)}function HQ(e,t){return e.get(`padding`)??(t===`richText`?[8,10]:10)}var UQ=function(){function e(){this.richTextStyles={},this._nextStyleNameId=bK()}return e.prototype._generateStyleName=function(){return`__EC_aUTo_`+this._nextStyleNameId++},e.prototype.makeTooltipMarker=function(e,t,n){var r=n===`richText`?this._generateStyleName():null,i=ECe({color:t,type:e,renderMode:n,markerId:r});return HB(i)?i:(this.richTextStyles[r]=i.style,i.content)},e.prototype.wrapRichTextStyle=function(e,t){var n={};BB(t)?$(t,function(e){return kB(n,e)}):kB(n,t);var r=this._generateStyleName();return this.richTextStyles[r]=n,`{`+r+`|`+e+`}`},e}();function iwe(e){var t=e.series,n=e.dataIndex,r=e.multipleSeries,i=t.getData(),a=i.mapDimensionsAll(`defaultedTooltip`),o=a.length,s=t.getRawValue(n),c=BB(s),l=rwe(t,n),u,d,f,p;if(o>1||c&&!o){var m=awe(s,t,n,a,l);u=m.inlineValues,d=m.inlineValueTypes,f=m.blocks,p=m.inlineValues[0]}else if(o){var h=i.getDimensionInfo(a[0]);p=u=DX(i,n,a[0]),d=h.type}else p=u=c?s[0]:s;var g=IK(t),_=g&&t.name||``,v=i.getName(n),y=r?_:v;return FQ(`section`,{header:_,noHeader:r||!g,sortParam:p,blocks:[FQ(`nameValue`,{markerType:`item`,markerColor:l,name:y,noName:!rV(y),value:u,valueType:d,rawDataIndex:i.getRawIndex(n)})].concat(f||[])})}function awe(e,t,n,r,i){var a=t.getData(),o=FB(e,function(e,t,n){var r=a.getDimensionInfo(n);return e||=r&&r.tooltip!==!1&&r.displayName!=null},!1),s=[],c=[],l=[];r.length?$(r,function(e){u(DX(a,n,e),e)}):$(e,u);function u(e,t){var n=a.getDimensionInfo(t);!n||n.otherDims.tooltip===!1||(o?l.push(FQ(`nameValue`,{markerType:`subItem`,markerColor:i,name:n.displayName,value:e,valueType:n.type})):(s.push(e),c.push(n.type)))}return{inlineValues:s,inlineValueTypes:c,blocks:l}}var WQ=zK();function GQ(e,t){return e.getName(t)||e.getId(t)}var KQ=function(e){mB(t,e);function t(){var t=e!==null&&e.apply(this,arguments)||this;return t._selectedDataIndicesMap={},t}return t.prototype.init=function(e,t,n){this.seriesIndex=this.componentIndex,this.dataTask=CQ({count:swe,reset:cwe}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(e,n),(WQ(this).sourceManager=new qCe(this)).prepareSource();var r=this.getInitialData(e,n);JQ(r,this),this.dataTask.context.data=r,WQ(this).dataBeforeProcessed=r,qQ(this),this._initSelectedMapFromData(r)},t.prototype.mergeDefaultAndTheme=function(e,t){var n=gQ(this),r=n?vQ(e):{},i=this.subType;yQ.hasClass(i)&&(i+=`Series`),OB(e,t.getTheme().get(this.subType)),OB(Line truncated
`:`<br/>`,m=l.join(p);this._showOrMove(a,function(){this._updateContentNotChangedOnAxis(e,s)?this._updatePosition(a,d,i[0],i[1],this._tooltipContent,s):this._showTooltipContent(a,m,s,Math.random()+``,i[0],i[1],d,null,u)})},t.prototype._showSeriesItemTooltip=function(e,t,n){var r=this._ecModel,i=rq(t),a=i.seriesIndex,o=r.getSeriesByIndex(a),s=i.dataModel||o,c=i.dataIndex,l=i.dataType,u=s.getData(l),d=this._renderMode,f=e.positionDefault,p=$5([u.getItemModel(c),s,o&&(o.coordinateSystem||{}).model],this._tooltipModel,f?{position:f}:null),m=p.get(`trigger`);if(!(m!=null&&m!==`item`)){var h=s.getDataParams(c,l),g=new UQ;h.marker=g.makeTooltipMarker(`item`,lQ(h.color),d);var _=SQ(s.formatTooltip(c,!1,l)),v=p.get(`order`),y=p.get(`valueFormatter`),b=_.frag,x=b?zQ(y?kB({valueFormatter:y},b):b,g,d,v,r.get(`useUTC`),p.get(`textStyle`)):_.text,S=`item_`+s.name+`_`+c;this._showOrMove(p,function(){this._showTooltipContent(p,x,h,S,e.offsetX,e.offsetY,e.position,e.target,g)}),n({type:`showTip`,dataIndexInside:c,dataIndex:u.getRawIndex(c),seriesIndex:a,from:this.uid})}},t.prototype._showComponentItemTooltip=function(e,t,n){var r=this._renderMode===`html`,i=rq(t),a=i.tooltipConfig.option||{},o=a.encodeHTMLContent;if(HB(a)){var s=a;a={content:s,formatter:s},o=!0}o&&r&&a.content&&(a=DB(a),a.content=_Z(a.content));var c=[a],l=this._ecModel.getComponent(i.componentMainType,i.componentIndex);l&&c.push(l),c.push({formatter:a.content});var u=e.positionDefault,d=$5(c,this._tooltipModel,u?{position:u}:null),f=d.get(`content`),p=Math.random()+``,m=new UQ;this._showOrMove(d,function(){var n=DB(d.get(`formatterParams`)||{});this._showTooltipContent(d,f,n,p,e.offsetX,e.offsetY,e.position,t,m)}),n({type:`showTip`,from:this.uid})},t.prototype._showTooltipContent=function(e,t,n,r,i,a,o,s,c){if(this._ticket=``,!(!e.get(`showContent`)||!e.get(`show`))){var l=this._tooltipContent;l.setEnterable(e.get(`enterable`));var u=e.get(`formatter`);o||=e.get(`position`);var d=t,f=this._getNearestPoint([i,a],n,e.get(`trigger`),e.get(`borderColor`),e.get(`defaultBorderColor`,!0)).color;if(u)if(HB(u)){var p=e.ecModel.get(`useUTC`),m=BB(n)?n[0]:n,h=m&&m.axisType&&m.axisType.indexOf(`time`)>=0;d=u,h&&(d=BZ(m.axisValue,d,p)),d=cQ(d,n,!0)}else if(VB(u)){var g=RB(function(t,r){t===this._ticket&&(l.setContent(r,c,e,f,o),this._updatePosition(e,o,i,a,l,n,s))},this);this._ticket=r,d=u(n,r,g)}else d=u;l.setContent(d,c,e,f,o),l.show(e,f),this._updatePosition(e,o,i,a,l,n,s)}},t.prototype._getNearestPoint=function(e,t,n,r,i){if(n===`axis`||BB(t))return{color:r||i};if(!BB(t))return{color:r||t.color||t.borderColor}},t.prototype._updatePosition=function(e,t,n,r,i,a,o){var s=this._api.getWidth(),c=this._api.getHeight();t||=e.get(`position`);var l=i.getSize(),u=e.get(`align`),d=e.get(`verticalAlign`),f=o&&o.getBoundingRect().clone();if(o&&f.applyTransform(o.transform),VB(t)&&(t=t([n,r],a,i.el,f,{viewSize:[s,c],contentSize:l.slice()})),BB(t))n=oK(t[0],s),r=oK(t[1],c);else if(GB(t)){var p=t;p.width=l[0],p.height=l[1];var m=pQ(p,{width:s,height:c});n=m.x,r=m.y,u=null,d=null}else if(HB(t)&&o){var h=eMe(t,f,l,e.get(`borderWidth`));n=h[0],r=h[1]}else{var h=Qje(n,r,i,s,c,u?null:20,d?null:20);n=h[0],r=h[1]}if(u&&(n-=t7(u)?l[0]/2:u===`right`?l[0]:0),d&&(r-=t7(d)?l[1]/2:d===`bottom`?l[1]:0),U5(e)){var h=$je(n,r,i,s,c);n=h[0],r=h[1]}i.moveTo(n,r)},t.prototype._updateContentNotChangedOnAxis=function(e,t){var n=this._lastDataByCoordSys,r=this._cbParamsList,i=!!n&&n.length===e.length;return i&&$(n,function(n,a){var o=n.dataByAxis||[],s=(e[a]||{}).dataByAxis||[];i&&=o.length===s.length,i&&$(o,function(e,n){var a=s[n]||{},o=e.seriesDataIndices||[],c=a.seriesDataIndices||[];i=i&&e.value===a.value&&e.axisType===a.axisType&&e.axisId===a.axisId&&o.length===c.length,i&&$(o,function(e,t){var n=c[t];i=i&&e.seriesIndex===n.seriesIndex&&e.dataIndex===n.dataIndex}),r&&$(e.seriesDataIndices,function(e){var n=e.seriesIndex,a=t[n],o=r[n];a&&o&&o.data!==a.data&&(i=!1)})})}),this._lastDataByCoordSys=e,this._cbParamsList=t,!!i},t.prototype._hide=function(e){this._lastDataByCoordSys=null,this._cbParamsList=null,e({type:`hideTip`,from:this.uid})},t.prototype.dispose=function(e,t){pV.node||!t.getDom()||(K0(this,`_updatePosition`),this._tooltipContent.dispose(),I5(`itemTooltip`,t),this._tooltipContent=null,this._tooltipModel=null,this._lastDataByCoordSys=null,this._cbParamsList=null)},t.type=`tooltip`,t}(A4);function $5(e,t,n){var r=t.ecModel,i;n?(i=new ZY(n,r,r),i=new ZY(t.option,i,r)):i=t;for(var a=e.length-1;a>=0;a--){var o=e[a];o&&(o instanceof ZY&&(o=o.get(`tooltip`,!0)),HB(o)&&(o={formatter:o}),o&&(i=new ZY(o,i,r)))}return i}function e7(e,t){return e.dispatchAction||RB(t.dispatchAction,t)}function Qje(e,t,n,r,i,a,o){var s=n.getSize(),c=s[0],l=s[1];return a!=null&&(e+c+a+2>r?e-=c+a:e+=a),o!=null&&(t+l+o>i?t-=l+o:t+=o),[e,t]}function $je(e,t,n,r,i){var a=n.getSize(),o=a[0],s=a[1];return e=Math.min(e+o,r)-o,t=Math.min(t+s,i)-s,e=Math.max(e,0),t=Math.max(t,0),[e,t]}function eMe(e,t,n,r){var i=n[0],a=n[1], Line truncated
<div class="flex items-center my-2 gap-1">
<div class="w-4 h-4 rounded-full" style="background-color: ${w7(e)}"></div>
${w7(t)}
${w7(n)}
</div>`,T7=(e,{binary:t,suffix:n=``})=>E7(e,e=>`${xm(e,{binary:t})}${n}`),E7=(e,t)=>{if(uMe(e.data))return``;let[n,r]=S7(e.data);return gMe({color:e.color,label:e.seriesName,detail:`(${(0,fm.default)(n).format(`HH:mm:ss`)}): ${t(r)}`})},_Me=V({__name:`ConnectionsCharts`,setup(e){let{t}=Wb(),n=Y(()=>[{name:t(`connections`),data:zS.value}]),r=e=>String(e),i=e=>e.map(e=>E7(e,String)).join(`
`);return(e,t)=>(H(),W(C7,{title:e.$t(`connections`),data:n.value,"label-formatter":r,"tooltip-formatter":i,"y-axis-floor":100,"window-seconds":L(60)},null,8,[`title`,`data`,`window-seconds`]))}}),vMe=V({__name:`MemoryCharts`,setup(e){let{t}=Wb(),n=Y(()=>[{name:t(`memoryUsage`),data:RS.value}]),r=e=>`${xm(e,{maximumFractionDigits:0,binary:!0})}`,i=e=>e.map(e=>T7(e,{binary:!0})).join(``);return(e,t)=>(H(),W(C7,{title:e.$t(`memoryUsage`),data:n.value,"label-formatter":r,"tooltip-formatter":i,"y-axis-floor":100*1024*1024,"window-seconds":L(60)},null,8,[`title`,`data`,`window-seconds`]))}}),yMe=V({__name:`SpeedCharts`,setup(e){let{t}=Wb(),n=Y(()=>[{name:t(`ulSpeed`),data:US.value},{name:t(`dlSpeed`),data:HS.value}]),r=e=>`${xm(e,{maximumFractionDigits:0,binary:!1})}/s`,i=e=>e.map(e=>T7(e,{binary:!1,suffix:`/s`})).join(``);return(e,t)=>(H(),W(C7,{title:e.$t(`traffic`),data:n.value,"label-formatter":r,"tooltip-formatter":i,"y-axis-floor":60*1e3,"window-seconds":L(60)},null,8,[`title`,`data`,`window-seconds`]))}}),bMe=[`data-rows`],xMe={class:`scrollbar-hidden flex min-h-0 flex-1 flex-col overflow-y-auto`},SMe=WT(V({__name:`OverviewCarousel`,setup(e){return(e,t)=>(H(),U(`div`,{class:`sidebar-chart-group base-container flex min-h-0 flex-2 flex-col`,"data-rows":L(_h)},[G(`div`,xMe,[J(yMe,{class:`sidebar-chart-row h-(--sidebar-chart-row) shrink-0`}),J(vMe,{class:`sidebar-chart-row h-(--sidebar-chart-row) shrink-0`}),J(_Me,{class:`sidebar-chart-row h-(--sidebar-chart-row) shrink-0`})])],8,bMe))}}),[[`__scopeId`,`data-v-cd723e5c`]]),CMe={class:`flex flex-col items-center gap-2 px-1.5 pt-1 pb-2`},wMe={class:`sidebar-stats-card`},TMe=[`onMouseenter`],EMe={class:`sidebar-stat-value`},DMe={key:0,class:`sidebar-stat-unit`},OMe={key:1,class:`sidebar-stat-total`},kMe={class:`flex flex-col items-center`},AMe=WT(V({__name:`VerticalInfos`,setup(e){let{t}=Wb(),{showTip:n}=wD();return(e,r)=>(H(),U(`div`,CMe,[G(`div`,wMe,[(H(!0),U(q,null,Ui(L(ive),e=>(H(),U(`div`,{key:e.key,class:`sidebar-stat-cell`,onMouseenter:r=>L(n)(r,L(ove)(e,L(t)),{placement:`right`})},[(H(),W(zi(e.icon),{class:b([`sidebar-stat-icon`,e.iconClass]),"aria-hidden":`true`},null,8,[`class`])),G(`span`,EMe,F(e.value),1),e.unit?(H(),U(`span`,DMe,F(e.unit),1)):K(``,!0),e.total?(H(),U(`span`,OMe,F(e.total),1)):K(``,!0)],40,TMe))),128))]),G(`div`,kMe,[Gi(e.$slots,`default`,{},void 0,!0)])]))}}),[[`__scopeId`,`data-v-911b9e40`]]),jMe=V({__name:`SideBar`,emits:[`transitionend`],setup(e,{emit:t}){let n=t,{t:r}=Wb(),i=tT(),a=I(),o=I(),s=Y(()=>typeof i.name==`string`?i.name:void 0),c=Y(()=>hC.value.map(e=>({key:e,label:r(e),icon:Wp[e],to:{name:e}}))),l=e=>{e.target!==a.value||e.propertyName!==`width`||(o.value?.syncIndicator(),n(`transitionend`))};return(e,t)=>(H(),U(`div`,{ref_key:`sidebarRef`,ref:a,class:b([`sidebar border-base-300/30 bg-base-200 text-base-content scrollbar-hidden h-full overflow-x-hidden border-r p-2 transition-[width,padding] duration-320 ease-[cubic-bezier(0.34,0.1,0.2,1)]`,L(Um)?`w-18 px-0`:`w-64`]),onTransitionend:l},[G(`div`,{class:b(L(tR)(`flex h-full flex-col gap-2`,L(Um)?`w-18 px-0`:`w-60`))},[J(zz,{ref_key:`navMenuRef`,ref:o,class:`flex-1`,items:c.value,"active-key":s.value,collapsed:L(Um)},null,8,[`items`,`active-key`,`collapsed`]),L(Um)?(H(),U(q,{key:0},[L(gh)?(H(),W(AMe,{key:0},{default:z(()=>[J(cB,{vertical:``})]),_:1})):(H(),W(cB,{key:1,vertical:``}))],64)):(H(),U(q,{key:1},[J(SMe),J(fve,{class:`base-container`})],64))],2)],34))}}),D7=Y(()=>[...pg.value,...im.filter(e=>!pg.value.includes(e))].filter(e=>om.some(t=>t.key===e)&&fR(e))),O7=I(!1),k7=()=>{let e=tT(),t=eT(),n=Y(()=>{let t=e.query.section;if(typeof t==`string`)return D7.value.find(e=>e===t)});return{sectionKey:n,isSettingsSubPage:Y(()=>ym.value&&!!n.value),enterSection:async(r,i)=>{let a=ym.value&&!n.value,o={...e.query,section:r};if(delete o.scrollTo,i?o.setting=i:delete o.setting,!ym.value){O7.value=!1,await t.replace({query:o});return}await t.push({query:o}),a&&(O7.value=!0)},exitSection:async()=>{if(O7.value){O7.value=!1,t.back();return}let n={...e.query};delete n.section,delete n.setting,delete n.scrollTo,await t.replace({query:n})},enteredFromMobileIndex:O7}},A7=I(``),j7=I(Ip.RULES);B(Cg,e=>{e&&(j7.value=Ip.RULES)});var M7=Y(()=>{let e=UD(A7.value);return e?kC.value.filter(t=>e.testAny([t.type,t.payload,t.proxy])):kC.value}),N7=Y(()=>{let e=UD(A7.value);return e?AC.value.filter(t=>e.testAny([t.name,t.behavior,t.vehicleType])):AC.value}),MMe=12,NMe=90,P7=1.25,PMe=[`input`,`textarea`,`select`,`[contenteditable]:not([contenteditable="false"])`,`canvas`,`.drag-handle`,`.folder-drag-handle`,`[data-page-swipe-ignore]`].join(`,`),FMe=()=>{let e=window.getSelection();return!!(e&&!e.isCollapsed&&e.toString().length)},IMe=e=>e?e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable?!0:e instanceof HTMLInputElement&&![`button`,`checkbox`,`color`,`file`,`hidden`,`image`,`radio`,`range`,`reset`,`submit`].includes(e.type):!1,LMe=e=>{let{overflowX:t}=getComputedStyl Line truncated
to top,
rgba(0, 0, 0, 0.18) 0%,
rgba(0, 0, 0, 0.1) 30%,
rgba(0, 0, 0, 0.04) 60%,
rgba(0, 0, 0, 0.01) 85%,
rgba(0, 0, 0, 0) 100%
)`,height:`env(safe-area-inset-bottom)`}},null,-1)],64)):K(``,!0)],512)]),_:1})],2))}}),F7=I(``),I7=I(``),L7=X(`config/log-filter-regex`,``),R7=X(`config/log-filter-enabled`,!1);function WMe(e){return typeof e==`function`||Object.prototype.toString.call(e)===`[object Object]`&&!uo(e)}var z7=V({setup(){let{t:e}=Wb(),t=I(!1),{isLargeCtrlsBar:n}=hO(),{showTip:r,updateTip:i}=wD();B(F7,(0,vg.debounce)(e=>{if(!e)return;let t=dg.value.indexOf(e);t!==-1&&dg.value.splice(t,1),dg.value.unshift(e),dg.value.length>5&&dg.value.pop()},1500));let a=AS,o=Y(()=>{let e=[],t=[];for(let n of DS.value){let r=n.payload.indexOf(` `),i=r===-1?n.payload:n.payload.slice(0,r);e.includes(i)||e.push(i),t.includes(n.type)||t.push(n.type)}return{levels:t.sort((e,t)=>a.value.indexOf(e)-a.value.indexOf(t)),types:e.sort()}}),s=()=>{let e=new Blob([DS.value.map(e=>[e.seq.toString().padEnd(5,` `),e.time,e.type.padEnd(7,` `),e.payload].join(` `)).join(`
`)],{type:`text/plain`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=(0,fm.default)().format(`YYYY-MM-DD HH-mm-ss`)+`.log`,n.click(),URL.revokeObjectURL(t)};return()=>{let c=J(vO,{class:[`select select-sm min-w-30`],modelValue:kS.value,"onUpdate:modelValue":e=>kS.value=e,onChange:NS,options:a.value.map(e=>({value:e,label:e}))},null),l=J(yO,{modelValue:F7.value,"onUpdate:modelValue":e=>F7.value=e,class:`join-item min-w-0 flex-1`,placeholder:`${e(`search`)} | Regex`,clearable:!0,menus:dg.value,menusDeleteable:!0,"onUpdate:menus":e=>dg.value=e},null),u=J(vO,{class:[`join-item select select-sm`,n.value?`w-36`:`w-24 max-w-40 flex-1`],modelValue:I7.value,"onUpdate:modelValue":e=>I7.value=e,options:[{value:``,label:e(`all`)},...o.value.levels.map(t=>({value:t,label:t,group:e(`logLevel`)})),...o.value.types.map(t=>({value:t,label:t,group:e(`logType`)}))]},null),d=J(`div`,{class:`flex items-center gap-2`},[J(q,null,[J(`button`,{class:`btn btn-circle btn-sm`,onClick:()=>t.value=!0},[J(yp,{class:`h-4 w-4`},null)]),J(MD,{modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,title:e(`logSettings`)},{default:()=>[J(`div`,{class:`flex flex-col gap-3 text-sm`},[J(`div`,{class:`settings-grid`},[J(`div`,{class:`setting-item`},[J(`div`,{class:`setting-item-label`},[e(`logStyle`)]),J(vO,{class:`select select-sm min-w-24`,modelValue:ug.value,"onUpdate:modelValue":e=>ug.value=e,options:Object.values(Fp).map(t=>({value:t,label:e(t)}))},null)]),J(`div`,{class:`setting-item`},[J(`div`,{class:`setting-item-label`},[e(`logRetentionLimit`)]),Wr(J(`input`,{class:`input input-sm w-20`,type:`number`,max:`9999`,"onUpdate:modelValue":e=>lg.value=e},null),[[qu,lg.value]])]),J(`div`,{class:`setting-item`},[J(`div`,{class:`setting-item-label shrink-0!`},[e(`hideLogRegex`)]),J(yO,{class:`w-32 max-w-64 flex-1`,modelValue:L7.value,"onUpdate:modelValue":e=>L7.value=e},null)]),J(`div`,{class:`setting-item`},[J(`div`,{class:`setting-item-label flex items-center gap-2`},[J(`span`,null,[e(`hideLog`)]),J(`div`,{onMouseenter:t=>r(t,e(`hideLogTip`),{appendTo:`parent`})},[J(gp,{class:`h-4 w-4`},null)])]),Wr(J(`input`,{type:`checkbox`,class:`toggle`,"onUpdate:modelValue":e=>R7.value=e},null),[[Ju,R7.value]])])])])]})]),J(`button`,{class:`btn btn-circle btn-sm`,onClick:s},[J(gf,{class:`h-4 w-4`},null)]),J(`button`,{class:`btn btn-circle btn-sm`,onClick:()=>{R7.value=!R7.value,i(R7.value?e(`showLog`):e(`hideLog`))},onMouseenter:t=>r(t,R7.value?e(`showLog`):e(`hideLog`),{appendTo:`parent`})},[R7.value?J(tp,{class:`h-4 w-4`},null):J(np,{class:`h-4 w-4`},null)]),J(`button`,{class:`btn btn-circle btn-sm`,onClick:()=>OS.value=!OS.value},[OS.value?J(mp,{class:`h-4 w-4`},null):J(dp,{class:`h-4 w-4`},null)]),J(`button`,{class:`btn btn-circle btn-sm`,onClick:()=>DS.value=[]},[J(bp,{class:`h-4 w-4`},null)])]),f=n.value?J(`div`,{class:`flex items-center justify-between gap-2 p-2`},[J(`div`,{class:`flex items-center gap-2`},[c,J(`div`,{class:`join w-96`},[u,l])]),d]):J(`div`,{class:`flex flex-col gap-2 p-2`},[J(`div`,{class:`flex w-full justify-between gap-2`},[J(`div`,{class:`flex flex-1`},[c]),d]),J(`div`,{class:`join`},[u,l])]);return J(gO,null,WMe(f)?f:{default:()=>[f]})}}}),GMe={class:`hover:bg-base-200/40 flex flex-col gap-1 px-3 py-2.5 text-sm transition-colors`},KMe={class:`flex items-center gap-2`},qMe={class:`text-base-content/40 text-xs tabular-nums`},JMe={class:`w-full leading-snug break-words`},YMe=V({__name:`LogsCard`,props:{log:{}},setup(e){let t=e,n=Y(()=>t.log.seq.toString().padStart(2,`0`)),r={[Hp.Trace]:`text-success`,[Hp.Debug]:`text-accent`,[Hp.Info]:`text-info`,[Hp.Warning]:`text-warning`,[Hp.Error]:`text-error`,[Hp.Fatal]:`text-error`,[Hp.Panic]:`text-error`};return AF(),(t,i)=>(H(),U(`div`,GMe,[G(`div`,KMe,[G(`span`,{class:`text-base-content/40 text-xs tabular-nums`,style:_({minWidth:`${(n.value.length+1)*.62}em`})},F(n.value),5),G(`span`,{class:b([`text-[11px] tracking-wide uppercase`,r[e.log.type]])},[J(PF,{text:e.log.type,filter:L(F7)},null,8,[`text`,`filter`])],2),i[0]||=G(`div`,{class:`flex-1`},null,-1),G(`span`,qMe,[J(PF,{text:e.log.time,filter:L(F7)},null,8,[`text`,`filter`])])]),G(`div`,JMe,[J(PF,{text:e.log.payload,filter:L(F7)},null,8,[`text`,`filter`])])]))}}),XMe={class:`table-glass min-w-min`},ZMe={class:`bg-base-100 border-base-300/60 sticky top-0 z-10 border-b backdrop-blur-none!`},QMe=[`colSpan`,`onClick`],$Me={class:`inline-flex items-center gap-1 whitespace-nowrap`},eNe={key:0},tNe=[`colspan`],nNe={class:`flex h-full flex-col items-center justify-center gap-3 px-6 text-center`},rNe={class:`text-base`},iNe=[`onClick`],aNe=[`title`,`onContextmenu`],B7=V({__name:`VirtualTable`,props:{data:{},columns:{},sortingKey:{},initialSorting:{},estimateSize:{default:36},overscan:{default:24},columnVisibility:{},rowClass:{},tableClass:{}},emits:[`rowClick`],setup(e,{emit:t}){let n=e,r=t,{t:i}=Wb(),a=X(n.sortingKey,()=>n.initialSorting??[]),o=Rz({get data(){return n.data},get columns(){return n.columns},state:{g Line truncated
`);return(e,n)=>(H(),U(`div`,_Ne,[G(`div`,vNe,[G(`div`,yNe,[G(`div`,bNe,F(e.$t(`upload`)),1),G(`div`,xNe,[G(`span`,SNe,F(r.value.value),1),G(`span`,CNe,F(r.value.unit)+`/s`,1)]),G(`div`,wNe,[J(V7,{data:L(US),"y-axis-floor":6e4,"window-seconds":L(60),color:`secondary`,name:L(t)(`upload`),"label-formatter":l,"tooltip-formatter":u},null,8,[`data`,`window-seconds`,`name`])]),G(`div`,TNe,F(e.$t(`total`))+` `+F(a.value),1)]),G(`div`,ENe,[G(`div`,DNe,F(e.$t(`download`)),1),G(`div`,ONe,[G(`span`,kNe,F(i.value.value),1),G(`span`,ANe,F(i.value.unit)+`/s`,1)]),G(`div`,jNe,[J(V7,{data:L(HS),"y-axis-floor":6e4,"window-seconds":L(60),name:L(t)(`download`),"label-formatter":l,"tooltip-formatter":u},null,8,[`data`,`window-seconds`,`name`])]),G(`div`,MNe,F(e.$t(`total`))+` `+F(o.value),1)]),G(`div`,NNe,[G(`div`,PNe,F(e.$t(`connections`)),1),G(`div`,FNe,F(s.value),1),G(`div`,INe,[J(V7,{data:L(zS),"y-axis-floor":10,"window-seconds":L(60),name:L(t)(`connections`),"label-formatter":d,"tooltip-formatter":f},null,8,[`data`,`window-seconds`,`name`])]),G(`div`,LNe,[G(`span`,null,F(e.$t(`memoryUsage`))+` `+F(c.value),1)])])])]))}}),[[`__scopeId`,`data-v-4234590f`]]),RNe={class:`flex w-full flex-col`},zNe={class:`base-container w-full rounded-b-none!`},BNe={class:`flex items-center justify-between p-4 max-sm:flex-col max-sm:items-start max-sm:gap-2`},VNe={class:`text-base-content/60 flex items-center gap-2 text-xs font-semibold tracking-wider uppercase`},HNe={class:`flex items-center gap-2`},UNe={class:`text-base-content/60 text-xs`},WNe={class:`flex items-center gap-2`},GNe={class:`text-base-content/60 text-xs`},KNe={class:`grid grid-cols-2 gap-3 px-4 pb-4 sm:grid-cols-5`},qNe={class:`bg-base-200/30 flex flex-col gap-1.5 rounded-xl p-4`},JNe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},YNe={class:`text-2xl font-extralight tabular-nums`},XNe={class:`bg-base-200/30 flex flex-col gap-1.5 rounded-xl p-4`},ZNe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},QNe={class:`text-2xl font-extralight tabular-nums`},$Ne={class:`bg-base-200/30 flex flex-col gap-1.5 rounded-xl p-4`},ePe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},tPe={class:`text-2xl font-extralight tabular-nums`},nPe={class:`bg-base-200/30 flex flex-col gap-1.5 rounded-xl p-4`},rPe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},iPe={class:`text-2xl font-extralight tabular-nums`},aPe={class:`bg-base-200/30 flex flex-col gap-1.5 rounded-xl p-4`},oPe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},sPe={class:`text-2xl font-extralight tabular-nums`},cPe={class:`h-96`},lPe={class:`flex flex-col gap-4 p-2`},uPe={class:`text-sm`},dPe={class:`flex justify-end gap-2`},fPe=V({__name:`ConnectionHistory`,setup(e){let{t,locale:n}=Wb(),{showTip:r}=wD(),i=X(`cache/connection-history-aggregation-type`,nw.SourceIP),a=Y(()=>uw.value[i.value]),o=Y(()=>{let e=Lw(pS.value,i.value);return Rw(a.value,e)}),s=Y(()=>o.value.reduce((e,t)=>(e.download+=t.download,e.upload+=t.upload,e.count+=t.count,e),{download:0,upload:0,count:0})),c=Y(()=>o.value.length),l=Y(()=>i.value===nw.SourceIP?t(`sourceIP`):i.value===nw.Destination?t(`host`):i.value===nw.Process?t(`process`):i.value===nw.ProxyGroup?t(`proxyGroup`):t(`outbound`)),u=Y(()=>[{header:()=>l.value,id:`key`,accessorFn:e=>e.key,cell:({row:e})=>i.value===nw.SourceIP?fS(e.original.key):i.value===nw.Destination||i.value===nw.Process?e.original.key:Fo(HI,{name:e.original.key})},{header:()=>t(`download`),id:`download`,accessorFn:e=>e.download,cell:({row:e})=>xm(e.original.download),sortingFn:(e,t)=>e.original.download-t.original.download,sortDescFirst:!0},{header:()=>t(`upload`),id:`upload`,accessorFn:e=>e.upload,cell:({row:e})=>xm(e.original.upload),sortingFn:(e,t)=>e.original.upload-t.original.upload,sortDescFirst:!0},{header:()=>t(`totalTraffic`),id:`total`,accessorFn:e=>e.download+e.upload,cell:({row:e})=>xm(e.original.download+e.original.upload),sortingFn:(e,t)=>e.original.download+e.original.upload-(t.original.download+t.original.upload),sortDescFirst:!0},{header:()=>t(`connectionCount`),id:`count`,accessorFn:e=>e.count,cell:({row:e})=>e.original.count.toString(),sortingFn:(e,t)=>e.original.count-t.original.count,sortDescFirst:!0}]),d=I(!1),f=X(`config/connection-history-auto-cleanup-interval`,`month`),p=X(`cache/connection-history-stats-start-time`,Date.now(),void 0,{writeDefaults:!0}),m=Y(()=>{let e=(0,fm.default)(p.value);return t(`totalConnectionsTip`,{statsStartTime:`${e.format(`YYYY-MM-DD HH:mm`)} (${e.fromNow()})`})}),h=e=>{switch(e){case`week`:return 10080*60*1e3;case`month`:return 720*60*60*1e3;case`quarter`:return 2160*60*60*1e3;default:return 0}},g=async()=>{if(f.value===`never`)return;let e=Date.now(),t=h(f.value);if(e-p.value>=t)try{await Iw(),p.value=e}catch(e){console.error(`Failed to perform auto cleanup:`,e)}},_=async()=>{try{await Iw(),p.value=Date.now(),d.value=!1,rx({content:t(`clLine truncated
<div>
<div class="font-semibold">${w7(t.name)}</div>
<div class="text-sm opacity-80 mt-1">${w7(n(i,{count:t.value}))}</div>
</div>
`}},grid:{left:`2%`,right:`2%`,top:`10%`,bottom:`5%`,containLabel:!1},xAxis:{type:`category`,data:s.value.map(e=>e.name),axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:a.text,fontFamily:o.value}},yAxis:{type:`value`,axisLine:{show:!1},axisTick:{show:!1},splitLine:{show:!0,lineStyle:{type:`dashed`,color:a.grid}},axisLabel:{color:a.text,fontFamily:o.value}},series:[{name:n(`rule`),type:`bar`,data:s.value.map(e=>e.value),itemStyle:{color:new VJ(0,0,0,1,[{offset:0,color:e},{offset:1,color:r}]),borderRadius:[4,4,0,0]},label:{show:!0,position:`top`,formatter:e=>e.value,color:a.text,fontFamily:o.value},emphasis:{itemStyle:{color:e}}}]}}),{paused:i,isEmpty:c}),(e,t)=>(H(),U(`div`,LFe,[G(`div`,{ref_key:`chartRef`,ref:r,class:`h-full w-full`},null,512),c.value?(H(),U(`div`,RFe,F(L(n)(`noData`)),1)):K(``,!0),G(`button`,{class:`btn btn-ghost btn-xs absolute right-1 bottom-0`,onClick:t[0]||=e=>i.value=!i.value},[(H(),W(zi(i.value?L(pp):L(up)),{class:`h-4 w-4`}))])]))}}),BFe={key:0,class:`base-container w-full p-4`},VFe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},HFe={class:`bg-base-200/30 mt-4 flex flex-col gap-2 rounded-xl p-3`},UFe=V({__name:`RuleHitCountCard`,setup(e){let t=Y(()=>kC.value.some(e=>e.extra));return(e,n)=>t.value?(H(),U(`div`,BFe,[G(`div`,VFe,F(e.$t(`ruleHitCountCard`)),1),G(`div`,HFe,[J(zFe,{type:`hit`})])])):K(``,!0)}}),WFe=[`#6a6fc5`,`#a8d4a0`,`#fddb8a`,`#f2a0a0`],GFe=(e,t)=>{let n=new Map,r=new Map,i=new Map,a=new Map,o=new Map,s=0,c=(e,t,o)=>{let c=`${t}:${e}`;return n.has(c)||(n.set(c,s++),r.set(c,e),i.set(c,t),a.set(c,o)),n.get(c)},l=(e,t)=>{let n=`${e}:${t}`;o.set(n,(o.get(n)??0)+1)};for(let n of e){if(n.chains.length===0)continue;let e=n.chains[0],r=n.chains.at(-1),i=c(n.source,0,t.sourceIPAddress),a=c(n.rule,1,t.ruleMatch);if(l(i,a),r===e){l(a,c(e,3,t.proxyChainExit));continue}let o=c(r,2,t.proxyChainEntry),s=c(e,3,t.proxyChainExit);l(a,o),l(o,s)}let u=Array.from(n,([e,n])=>{let o=i.get(e)??0;return{id:n,name:r.get(e)??``,nodeType:a.get(e)??t.unknown,layer:o,itemStyle:{color:WFe[o]}}}),d=new Map;for(let e of u){let t=d.get(e.layer)??[];t.push(e),d.set(e.layer,t)}let f=new Map,p=[];for(let e of Array.from(d.keys()).sort((e,t)=>e-t)){let t=d.get(e);t.sort((e,t)=>e.name.localeCompare(t.name));for(let e of t){let t=p.length;f.set(e.id,t),p.push({...e,id:t})}}return{nodes:p,links:Array.from(o,([e,t])=>{let[n,r]=e.split(`:`).map(Number),i=f.get(n),a=f.get(r);return i===void 0||a===void 0||i===a?null:{source:i,target:a,value:Math.log10(t+1)*10,originalValue:t}}).filter(e=>e!==null)}},KFe={class:`base-container p-4`},qFe={class:`flex items-center justify-between gap-2`},JFe={class:`text-base-content/60 text-xs font-semibold tracking-wider uppercase`},YFe={class:`flex items-center gap-1`},XFe=[`title`],ZFe={class:`hidden sm:inline`},QFe=[`aria-label`],$Fe=[`aria-label`,`title`,`aria-pressed`],eIe=[`aria-label`,`title`,`aria-pressed`],tIe={key:0,class:`text-base-content/50 absolute inset-0 flex items-center justify-center`},nIe=V({__name:`TopologyCharts`,setup(e){let{t}=Wb(),n=I(),r=I(!1),i=I(!1),a=I(!1),{width:o,height:s}=pf(),{colors:c,fontFamily:l}=b7(n),u=Y(()=>i.value||a.value),d=Y(()=>r.value&&ym.value&&s.value>o.value),f=Y(()=>{if(!r.value)return{};let e={backdropFilter:`var(--app-glass, none)`,height:`100%`,width:`100%`};return d.value?{...e,position:`absolute`,top:`50%`,left:`50%`,width:`100vh`,height:`100vw`,marginTop:`-50vw`,marginLeft:`-50vh`,transform:`rotate(90deg)`}:e}),p=Y(()=>GFe((bh.value?rde.value:pS.value).map(e=>({source:fS(fC(e)),rule:dC(e),chains:sC(e)})),{sourceIPAddress:t(`sourceIPAddress`),ruleMatch:t(`ruleMatch`),proxyChainEntry:t(`proxyChainEntry`),proxyChainExit:t(`proxyChainExit`),unknown:t(`unknown`)})),m=Y(()=>p.value.nodes.length===0),{resize:h}=x7(n,Y(()=>({backgroundColor:`transparent`,textStyle:{fontFamily:l.value||`inherit`,color:c.text},tooltip:{trigger:`item`,triggerOn:`mousemove`,backgroundColor:c.surface,borderColor:c.border,textStyle:{color:c.text},formatter:e=>{let{dataType:n,data:r}=e;if(n===`node`)return`${w7(r.name)}<br/>${w7(t(`nodeType`))}: ${w7(r.nodeType||t(`unknown`))}`;if(n===`edge`){let e=p.value.nodes.find(e=>e.id===r.source),n=p.value.nodes.find(e=>e.id===r.target),i=r.originalValue??r.value;return e&&n?`${w7(e.name)} → ${w7(n.name)}<br/>${w7(t(`connectionCount`))}: ${w7(i)}`:`${w7(t(`connectionCount`))}: ${w7(i)}`}return``}},series:[{id:`sankey`,type:`sankey`,layout:`none`,data:p.value.nodes,links:p.value.links,emphasis:{focus:`trajectory`},lineStyle:{color:`gradient`,curveness:.5},itemStyle:{borderWidth:0},label:{color:c.text,fontSize:ym.value?10:12,formatter:e=>{let t=r.value?45:ym.value?20:30;return e.name.length>t?`${e.name.substring(0,t)}...`:e.name}},nodeGap:4,nodeWidth:15,nodeAlign:`left`,animation:!0,animationDuration:1e3,animationEasing:`cubicOut`,animationDelay:e=>e*50}]})),{paused:u,isEmpty:m,onInit:e=>{let t=()=>{a.value=!0},n=()=>{a.value=!1};return e.on(`showTip`,t),e.on(`hideTip`,n Line truncated
`)}),checkboxText:Jb.global.t(`dontAskAgainAlwaysApply`)});return i&&a&&(r.value=!0),i},lze=e=>Object.keys(e).filter(t=>t.startsWith(`config/`)&&localStorage.getItem(t)!==e[t]),z9=async({force:e=!1,notify:t=!1,confirm:n=!0}={})=>{let r=await oze();if(!r||(0,vg.isEmpty)(r))return!1;r[`config/auto-sync-settings`]=JSON.stringify(M9.value);let i=await L9(r);return!e&&I9.value===i?!1:n&&!await R9(lze(r),`syncSettingsConfirm`)?(I9.value=i,!1):(wm(r),I9.value=i,t&&rx({content:`syncSettingsSuccess`,type:`alert-success`}),location.reload(),!0)},uze=e=>Object.keys(e).filter(t=>t===k9&&!e[t]?!1:localStorage.getItem(t)!==e[t]),B9=async({force:e=!1,confirm:t=!0}={})=>{let n=await fetch(A9.value),r=()=>{rx({content:`importFailed`,params:{url:n.url},type:`alert-error`})};if(!n.ok)return r(),!1;let i={};try{i=await n.json()}catch{return r(),!1}if(!i)return r(),!1;let a=await L9(i);if(a===F9.value&&!e)return!1;if(t&&!await R9(uze(i),`importSettingsConfirm`))return F9.value=a,!1;rx({content:`importing`}),F9.value=a;for(let e in i)e===k9&&!i[e]||localStorage.setItem(e,i[e]);return location.reload(),!0},dze={class:`settings-section-label`},fze={class:`settings-grid`},pze={class:`setting-item`},mze={class:`setting-item-label`},hze=[`disabled`],gze={class:`setting-item`},_ze={class:`setting-item-label`},vze=[`disabled`],yze={class:`setting-item`},bze={class:`setting-item-label`},xze=[`disabled`],Sze={class:`setting-item`},Cze={class:`setting-item-label`},wze={key:0,class:`setting-item`},Tze={class:`setting-item-label`},Eze={class:`settings-section-label`},Dze={class:`settings-grid`},Oze={class:`setting-item`},kze={class:`setting-item-label`},Aze={class:`setting-item`},jze={class:`setting-item-label`},Mze={class:`settings-section-label`},Nze={class:`settings-grid`},Pze={class:`setting-item max-sm:flex-col max-sm:items-start! max-sm:py-3`},Fze={class:`setting-item-label shrink-0!`},Ize={class:`flex items-center gap-2 max-sm:flex-wrap`},Lze={class:`join flex-1`},Rze={class:`setting-item`},zze={class:`setting-item-label flex items-center gap-2`},Bze={key:0,class:`setting-item`},Vze={class:`setting-item-label`},V9=V({__name:`DashboardSettings`,props:{iconOnly:{type:Boolean,default:!1}},setup(e){let t=I(),n=I(!1),r=I(!1),i=Y(()=>fx(`syncSettings`)),{showTip:a}=wD(),{t:o}=Wb(),s=()=>{window.confirm(o(`resetSettingsConfirm`))&&(n.value=!1,Oee())},c=()=>{rx({content:`importing`});let e=t.value?.files?.[0];if(!e)return;let n=new FileReader;n.onload=async()=>{wm(JSON.parse(n.result)),location.reload()},n.readAsText(e)},l=()=>{t.value?.click()},u=async()=>{n.value=!1,await B9({force:!0})},d=async()=>{if(r.value)return;r.value=!0;let e=nx(`uploadSettings`);try{n.value=!1;let t=Cm(),r=JSON.stringify(t[`config/icon-reflect-list`]||[]).length>800*1024;qm.value.includes(`local-image`)&&delete t[`config/custom-background-image`],r&&delete t[`config/icon-reflect-list`],await sze(t),rx({key:e,content:`uploadSettingsSuccess`,type:`alert-success`}),r&&rx({content:`uploadSettingsIconReflectListRemoved`,type:`alert-warning`})}catch(t){XS(t,e)}finally{r.value=!1}},f=async()=>{if(r.value)return;r.value=!0;let e=nx(`syncSettings`);try{n.value=!1,await z9({force:!0,notify:!0}),tae(e)}catch(t){XS(t,e)}finally{r.value=!1}},p=async()=>{if(r.value||!window.confirm(o(`deleteUploadedSettingsConfirm`)))return;r.value=!0;let e=nx(`deleteUploadedSettings`);try{await cze(),n.value=!1,rx({key:e,content:`deleteUploadedSettingsSuccess`,type:`alert-success`})}catch(t){XS(t,e)}finally{r.value=!1}};return B(M9,async(e,t)=>{if(!(!e||t||r.value)){r.value=!0;try{n.value=!1,await z9()}catch(e){XS(e)}finally{r.value=!1}}}),(o,m)=>(H(),U(q,null,[G(`button`,{class:`btn btn-sm`,onClick:m[0]||=e=>n.value=!0},[e.iconOnly?(H(),W(L(Uf),{key:0,class:`h-4 w-4`})):(H(),U(q,{key:1},[_o(F(o.$t(`dashboardSettings`)),1)],64))]),J(MD,{modelValue:n.value,"onUpdate:modelValue":m[11]||=e=>n.value=e,title:o.$t(`dashboardSettings`)},{"title-right":z(()=>[G(`button`,{class:`btn btn-xs absolute top-2 right-10`,onClick:s},F(o.$t(`resetSettings`)),1)]),default:z(()=>[i.value?(H(),U(q,{key:0},[G(`div`,dze,F(o.$t(`dashboardSettingsCore`)),1),G(`div`,fze,[G(`div`,pze,[G(`div`,mze,F(o.$t(`uploadSettings`)),1),G(`button`,{class:b(L(tR)(`btn btn-sm`,r.value?`btn-disabled`:``)),disabled:r.value,onClick:d},[J(L(wf),{class:`h-4 w-4`})],10,hze)]),G(`div`,gze,[G(`div`,_ze,F(o.$t(`syncSettings`)),1),G(`button`,{class:b(L(tR)(`btn btn-sm`,r.value?`btn-disabled`:``)),disabled:r.value,onClick:f},[J(L(xf),{class:`h-4 w-4`})],10,vze)]),G(`div`,yze,[G(`div`,bze,F(o.$t(`deleteUploadedSettings`)),1),G(`button`,{class:b(L(tR)(`btn btn-sm btn-error btn-soft`,r.value?`btn-disabled`:``)),disabled:r.value,onClick:p},[J(L(vp),{class:`h-4 w-4`})],10,xze)]),G(`div`,Sze,[G(`div`,Cze,F(o.$t(`autoSyncSettings`)),1),Wr(G(`input`,{"onUpdate:modelValue":m[1]||=e=>pn(M9)?M9.value=e:null,type:`checkbox`,class:`toggle`},null,512),[[Ju,L(M9)]])]),L(M9)||L(P9)?(H(),U(`div`,wze,[G(`div`,Tze,F(o.$t(`confirmBeforeOverride`)),1),Wr(G(`input`Line truncated
font-size: 14px;
}`,OBe=V({__name:`CustomCSS`,props:{value:{type:Boolean,default:!1},valueModifiers:{}},emits:[`update:value`],setup(e){let t=wa(e,`value`),n=I(Jm.value);B(t,e=>{e&&(n.value=Jm.value)});let r=()=>{Jm.value=n.value,_C(),t.value=!1},i=()=>{n.value=``,Jm.value=``,_C()};return(e,a)=>(H(),W(MD,{modelValue:t.value,"onUpdate:modelValue":a[1]||=e=>t.value=e,title:e.$t(`customCSS`)},{default:z(()=>[G(`div`,wBe,[G(`div`,TBe,F(e.$t(`customCSSTip`)),1),Wr(G(`textarea`,{class:`textarea textarea-bordered h-64 w-full font-mono text-xs`,spellcheck:`false`,"onUpdate:modelValue":a[0]||=e=>n.value=e,placeholder:DBe},null,512),[[qu,n.value]])]),G(`div`,EBe,[G(`button`,{class:`btn btn-sm`,onClick:i},F(e.$t(`reset`)),1),a[2]||=G(`div`,{class:`flex-1`},null,-1),G(`button`,{class:`btn btn-sm btn-primary`,onClick:r},F(e.$t(`save`)),1)])]),_:1},8,[`modelValue`,`title`]))}}),kBe={class:`grid grid-cols-4 gap-2`},ABe={class:`flex cursor-pointer flex-col items-center gap-1`},jBe={class:`flex h-6 items-center justify-center text-xs`},MBe=[`onUpdate:modelValue`],NBe={class:`grid grid-cols-1 gap-2 md:grid-cols-3`},PBe={class:`grid grid-cols-1 gap-2 md:grid-cols-3`},FBe={class:`flex items-center gap-2`},IBe={class:`grid grid-cols-1 gap-2 pb-12 md:grid-cols-3`},LBe={class:`bg-base-100 border-base-200 absolute right-0 bottom-0 left-0 flex gap-2 border-t p-2 pt-2`},RBe={class:`btn btn-sm`,href:`https://daisyui.com/theme-generator/`,target:`_blank`},zBe=V({__name:`CustomTheme`,props:{value:{type:Boolean,default:!1},valueModifiers:{}},emits:[`update:value`],setup(e){let t=wa(e,`value`),n=I(Zp[0]),r=tn({...Lm.value[0]||Qp}),i=Y(()=>Object.keys(r).filter(e=>e.startsWith(`--color-`))),a=Y(()=>Object.keys(r).filter(e=>e.startsWith(`--radius-`))),o=Y(()=>Object.keys(r).filter(e=>e.startsWith(`--size-`))),s=Y({get:()=>r[`--depth`]===`1`,set:e=>{r[`--depth`]=e?`1`:`0`}}),c=Y({get:()=>r[`--noise`]===`1`,set:e=>{r[`--noise`]=e?`1`:`0`}}),l=Y({get:()=>r[`color-scheme`]===`dark`,set:e=>{r[`color-scheme`]=e?`dark`:`light`}}),u=async()=>{Lm.value=[{...r,id:gg()}],Nm.value=``,Pm.value=``,await Mr(),Nm.value=r.name,Pm.value=r.name,gC()},d=()=>{let e=document.createElement(`div`);e.dataset.theme=n.value,e.style.display=`none`,document.body.appendChild(e);let t=getComputedStyle(e);Object.keys(Qp).forEach(e=>{let n=t.getPropertyValue(e).trim();n&&(r[e]=n)}),e.remove(),u()};return(e,f)=>(H(),W(MD,{modelValue:t.value,"onUpdate:modelValue":f[5]||=e=>t.value=e,title:e.$t(`customTheme`)},{default:z(()=>[f[11]||=G(`div`,{class:`divider`},`Color`,-1),G(`div`,kBe,[(H(!0),U(q,null,Ui(i.value,e=>(H(),U(`div`,{key:e},[G(`label`,ABe,[G(`div`,jBe,F(e.replace(`--color-`,``)),1),G(`div`,{class:`border-base-content h-6 w-6 rounded border-2`,style:_(`background-color: ${r[e]};`)},null,4),Wr((H(),U(`input`,{class:`h-1 w-1 opacity-0`,key:e,type:`color`,"onUpdate:modelValue":t=>r[e]=t},null,8,MBe)),[[qu,r[e]]])])]))),128))]),f[12]||=G(`div`,{class:`divider`},`Radius`,-1),G(`div`,NBe,[(H(!0),U(q,null,Ui(a.value,e=>(H(),U(`div`,{key:e,class:`flex items-center gap-2`},[_o(F(e.replace(`--radius-`,``))+` `,1),J(yO,{class:`w-20`,modelValue:r[e],"onUpdate:modelValue":t=>r[e]=t},null,8,[`modelValue`,`onUpdate:modelValue`])]))),128))]),f[13]||=G(`div`,{class:`divider`},`Size`,-1),G(`div`,PBe,[(H(!0),U(q,null,Ui(o.value,e=>(H(),U(`div`,{key:e,class:`flex items-center gap-2`},[_o(F(e.replace(`--size-`,``))+` `,1),J(yO,{class:`w-20`,modelValue:r[e],"onUpdate:modelValue":t=>r[e]=t},null,8,[`modelValue`,`onUpdate:modelValue`])]))),128)),G(`div`,FBe,[f[6]||=_o(` border `,-1),J(yO,{class:`w-20`,modelValue:r[`--border`],"onUpdate:modelValue":f[0]||=e=>r[`--border`]=e},null,8,[`modelValue`])])]),f[14]||=G(`div`,{class:`divider`},`Effect`,-1),G(`div`,IBe,[G(`div`,null,[f[7]||=_o(` depth `,-1),Wr(G(`input`,{class:`toggle`,"onUpdate:modelValue":f[1]||=e=>s.value=e,type:`checkbox`},null,512),[[Ju,s.value]])]),G(`div`,null,[f[8]||=_o(` noise `,-1),Wr(G(`input`,{class:`toggle`,"onUpdate:modelValue":f[2]||=e=>c.value=e,type:`checkbox`},null,512),[[Ju,c.value]])]),G(`div`,null,[f[9]||=_o(` dark `,-1),Wr(G(`input`,{class:`toggle`,"onUpdate:modelValue":f[3]||=e=>l.value=e,type:`checkbox`},null,512),[[Ju,l.value]])])]),G(`div`,LBe,[J(vO,{class:`select select-sm w-26`,modelValue:n.value,"onUpdate:modelValue":f[4]||=e=>n.value=e,options:L(Zp).map(e=>({value:e,label:e}))},null,8,[`modelValue`,`options`]),G(`button`,{class:`btn btn-sm`,onClick:d},F(e.$t(`reset`)),1),f[10]||=G(`div`,{class:`flex-1`},null,-1),G(`a`,RBe,F(e.$t(`moreDetails`)),1),G(`button`,{class:`btn btn-sm btn-primary`,onClick:u},F(e.$t(`save`)),1)])]),_:1},8,[`modelValue`,`title`]))}}),BBe={class:`flex items-center gap-2`},VBe={class:`truncate`},U9=V({__name:`ThemeSelector`,props:{value:{type:String,required:!0},valueModifiers:{}},emits:[`update:value`],setup(e){let t=wa(e,`value`),n=Y(()=>Lm.value.length?[...Zp,...Lm.value.map(e=>e.name)]:Zp),r=Y(()=>n.value.map(e=>({value:e,label:e,theme:e})));return(e,n)=>(H(),W(vO,{modelValue:t.value,"onUpdate: Line truncated
@@ -1 +0,0 @@
.tippy-box[data-animation=scale][data-placement^=top]{transform-origin:bottom}.tippy-box[data-animation=scale][data-placement^=bottom]{transform-origin:top}.tippy-box[data-animation=scale][data-placement^=left]{transform-origin:100%}.tippy-box[data-animation=scale][data-placement^=right]{transform-origin:0}.tippy-box[data-animation=scale][data-state=hidden]{opacity:0;transform:scale(.5)}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{color:#fff;white-space:normal;background-color:#333;border-radius:4px;outline:0;font-size:14px;line-height:1.4;transition-property:transform,visibility,opacity;position:relative}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-width:8px 8px 0;border-top-color:initial;transform-origin:top;bottom:-7px;left:0}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-width:0 8px 8px;border-bottom-color:initial;transform-origin:bottom;top:-7px;left:0}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;transform-origin:0;right:-7px}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:100%;left:-7px}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;width:16px;height:16px}.tippy-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.tippy-content{z-index:1;padding:5px 9px;position:relative}.connection-error-enter-active[data-v-b201b620],.connection-error-leave-active[data-v-b201b620]{transition:opacity .2s}.connection-error-enter-from[data-v-b201b620],.connection-error-leave-to[data-v-b201b620]{opacity:0}.backend-switch-enter-active[data-v-1110788d],.backend-switch-leave-active[data-v-1110788d]{transition:opacity .2s,transform .2s}.backend-switch-enter-from[data-v-1110788d],.backend-switch-leave-to[data-v-1110788d]{opacity:0;transform:translate(.75rem)}.modal-enter-active[data-v-42b15ed8],.modal-leave-active[data-v-42b15ed8]{transition:opacity .25s ease-out}.modal-enter-from[data-v-42b15ed8],.modal-leave-to[data-v-42b15ed8]{opacity:0}.modal-enter-active .modal-box[data-v-42b15ed8],.modal-leave-active .modal-box[data-v-42b15ed8]{transition:transform .35s cubic-bezier(.32,.72,0,1)}.modal-enter-from .modal-box[data-v-42b15ed8],.modal-leave-to .modal-box[data-v-42b15ed8]{transform:scale(.95)}@media (width<48rem){.modal-enter-from .modal-box[data-v-42b15ed8],.modal-leave-to .modal-box[data-v-42b15ed8]{transform:translateY(100%)}}@media (prefers-reduced-motion:reduce){.modal-enter-active .modal-box[data-v-42b15ed8],.modal-leave-active .modal-box[data-v-42b15ed8]{transition:none}.modal-enter-from .modal-box[data-v-42b15ed8],.modal-leave-to .modal-box[data-v-42b15ed8]{transform:none}}.ghost[data-v-c85809fa],.ghost[data-v-3a4717b8]{opacity:.4}.nav-menu[data-v-f1f0ab3d]{background-color:color-mix(in srgb, var(--color-base-content) 6%, transparent);border-radius:.625rem;flex-direction:row;gap:2px;width:auto;padding:3px}.nav-menu-block[data-v-f1f0ab3d]{width:100%}.nav-indicator[data-v-f1f0ab3d]{background-color:var(--color-primary);box-shadow:0 0 0 1px color-mix(in srgb, var(--color-base-content) 5%, transparent), 0 1px 2px color-mix(in srgb, var(--color-base-content) 10%, transparent)}.nav-item[data-v-f1f0ab3d]{flex-shrink:1;justify-content:center;gap:.375rem;min-height:26px;padding:3px .625rem;font-size:.875rem;line-height:1.25rem}.nav-menu-block .nav-item[data-v-f1f0ab3d]{flex:1}.nav-item-icon[data-v-f1f0ab3d]{width:1rem;height:1rem}.nav-item[data-v-f1f0ab3d]:not([aria-selected=true]){color:color-mix(in srgb, var(--color-base-content) 55%, transparent)}@media (hover:hover){.nav-item[data-v-f1f0ab3d]:not([aria-selected=true]):hover{color:var(--color-base-content)}}.nav-item[aria-selected=true][data-v-f1f0ab3d]{color:var(--color-primary-content)}.nav-item[aria-selected=true] .nav-item-icon[data-v-f1f0ab3d]{color:currentColor}.nav-item[aria-selected=true] .nav-item-count[data-v-f1f0ab3d]{color:color-mix(in srgb, currentcolor 70%, transparent)}.proxy-chain-scroll[data-v-3368cdde]{flex-shrink:1;max-width:100%;padding-bottom:2px;overflow:auto hidden}.proxy-chain-path[data-v-3368cdde]{background-color:color-mix(in srgb, var(--color-base-content) 4%, transparent);border-radius:9999px;align-items:center;gap:0;min-width:max-content;padding:2px;display:inline-flex}.proxy-chain-node[data-v-3368cdde]{cursor:pointer;white-space:nowrap;border-radius:9999px;flex-shrink:0;padding:1px 10px;font-size:.75rem;line-height:1.25rem;transition:all .2s cubic-bezier(.32,.72,0,1)}.proxy-chain-node[data-v-3368cdde]:hover{background-color:color-mix(in srgb, var(--color-base-content) 8%, transparent)}.prLine truncated
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

@@ -1 +0,0 @@
var e={origin:`#ffffff`,destination:`#79d8ff`,direct:`#ff9f43`};export{e as t};
@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<rect width="512" height="512" rx="114" fill="#0D0F13"/>
<g>
<rect x="105" y="131" width="123" height="250" rx="38" fill="#8B9DB4"/>
<rect x="251" y="131" width="156" height="109" rx="38" fill="#BFCBDB"/>
<rect x="251" y="272" width="156" height="109" rx="38" fill="#64748C"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<rect width="512" height="512" rx="114" fill="#FFFFFF"/>
<g>
<rect x="105" y="131" width="123" height="250" rx="38" fill="#7E92AB"/>
<rect x="251" y="131" width="156" height="109" rx="38" fill="#A8B8CC"/>
<rect x="251" y="272" width="156" height="109" rx="38" fill="#5C6E86"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 395 B

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<rect width="512" height="512" rx="114" fill="#FFFFFF"/>
<g>
<rect x="105" y="131" width="123" height="250" rx="38" fill="#7E92AB"/>
<rect x="251" y="131" width="156" height="109" rx="38" fill="#A8B8CC"/>
<rect x="251" y="272" width="156" height="109" rx="38" fill="#5C6E86"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 395 B

@@ -1,54 +0,0 @@
<!doctype html>
<html lang="">
<head>
<meta charset="UTF-8" />
<title>zashboard</title>
<meta
name="viewport"
content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, interactive-widget=resizes-content"
/>
<meta
name="description"
content="A dashboard using clash API"
/>
<link
rel="apple-touch-icon"
href="./apple-touch-icon.png"
/>
<link
rel="icon"
href="./favicon.ico"
sizes="48x48"
/>
<link
id="favicon"
rel="icon"
href="./favicon.svg"
sizes="any"
type="image/svg+xml"
/>
<meta
name="theme-color"
content="#FFFFFF"
/>
<script type="module" crossorigin src="./assets/index-DC9m9n9t.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-aEk9Ew7B.css">
<link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
<body class="h-dvh w-screen">
<div id="app"></div>
<script>
;(function () {
const media = window.matchMedia('(prefers-color-scheme: dark)')
const favicon = document.getElementById('favicon')
const setFavicon = (isDark) => {
favicon.href = isDark ? './favicon-dark.svg' : './favicon.svg'
}
media.addEventListener('change', () => {
setFavicon(media.matches)
})
setFavicon(media.matches)
})()
</script>
</body>
</html>
@@ -1 +0,0 @@
{"name":"zashboard","short_name":"zashboard","description":"a dashboard using clash api","start_url":"./","display":"standalone","background_color":"#ffffff","theme_color":"#000000","lang":"en","scope":"./","icons":[{"src":"./pwa-192x192.png","sizes":"192x192","type":"image/png","purpose":"any"},{"src":"./pwa-512x512.png","sizes":"512x512","type":"image/png","purpose":"any"},{"src":"./pwa-maskable-192x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"./pwa-maskable-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}]}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

@@ -1 +0,0 @@
if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})}
@@ -1 +0,0 @@
if(!self.define){let e,s={};const i=(i,r)=>(i=new URL(i+".js",r).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(r,n)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let l={};const o=e=>i(e,a),c={module:{uri:a},exports:l,require:o};s[a]=Promise.all(r.map(e=>c[e]||o(e))).then(e=>(n(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"pwa-maskable-512x512.png",revision:"22e8f67796beaa01e9a1747631b276e1"},{url:"pwa-maskable-192x192.png",revision:"35751071903c49d22fd41a37c5ab9933"},{url:"pwa-512x512.png",revision:"5df97c9c153e24d401a49c2c9811f605"},{url:"pwa-192x192.png",revision:"832ef8ce73039904eb1d0fc0e1165d90"},{url:"index.html",revision:"ed9f4a3fedc57e2ec3e3180fb94b4adc"},{url:"icon.svg",revision:"e443c91e98d5bd024359f69138d3183e"},{url:"favicon.svg",revision:"e443c91e98d5bd024359f69138d3183e"},{url:"favicon.ico",revision:"ef9f094aebea13b5b462a016971a6fc8"},{url:"favicon-dark.svg",revision:"1e8a3e917bcac348c68ad93de909bfbc"},{url:"apple-touch-icon.png",revision:"14a6ca76babc2cb0abeed47800d1cac9"},{url:"THIRD_PARTY_NOTICES.md",revision:"ac958d2f01f262f59db481a477a8f668"},{url:"assets/palette-DPyxzM37.js",revision:null},{url:"assets/metacubex-BlQkOUXT.jpg",revision:null},{url:"assets/index-aEk9Ew7B.css",revision:null},{url:"assets/index-DC9m9n9t.js",revision:null},{url:"assets/geoip.worker-CYCCgy29.js",revision:null},{url:"assets/earth-surface-DQPefyI6.webp",revision:null},{url:"assets/earth-renderer-Dh_x8rMR.js",revision:null},{url:"assets/earth-night-DiMNTAKM.webp",revision:null},{url:"assets/earth-day-O5DYyPrv.webp",revision:null},{url:"assets/connection-geoip-database-NH8WGZdk.js",revision:null},{url:"assets/background-DTLDDGUj.jpg",revision:null},{url:"assets/TwemojiMozilla-flags-B12sb_Bp.woff2",revision:null},{url:"assets/EarthGlobeCard-DhFkBz8U.js",revision:null},{url:"assets/EarthGlobeCard-DQPfbIzt.css",revision:null},{url:"favicon-dark.svg",revision:"1e8a3e917bcac348c68ad93de909bfbc"},{url:"favicon.svg",revision:"e443c91e98d5bd024359f69138d3183e"},{url:"pwa-192x192.png",revision:"832ef8ce73039904eb1d0fc0e1165d90"},{url:"pwa-512x512.png",revision:"5df97c9c153e24d401a49c2c9811f605"},{url:"pwa-maskable-192x192.png",revision:"35751071903c49d22fd41a37c5ab9933"},{url:"pwa-maskable-512x512.png",revision:"22e8f67796beaa01e9a1747631b276e1"},{url:"manifest.webmanifest",revision:"6437e90df75a01bce95a7c03b16fc311"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
@@ -1 +0,0 @@
define(["exports"],function(t){"use strict";try{self["workbox:core:7.4.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.4.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super(({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)},e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)})}addCacheListener(){self.addEventListener("message",t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map(e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})}));t.waitUntil(s),t.ports&&t.ports[0]&&s.then(()=>t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const c=t.method;if(!o&&this.i.has(c)&&(o=this.i.get(c)),!o)return;let a;try{a=o.handle({url:s,request:t,event:e,params:i})}catch(t){a=Promise.reject(t)}const h=r&&r.catchHandler;return a instanceof Promise&&(this.o||h)&&(a=a.catch(async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n})),a}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const a=()=>(c||(c=new o,c.addFetchListener(),c.addCacheListener()),c);function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new i(({url:t})=>t.href===s.href,e,n)}else if(t instanceof RegExp)o=new r(t,e,n);else if("function"==typeof t)o=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return a().registerRoute(o),o}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter(t=>t&&t.length>0).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.4.0"]&&_()}catch(t){}function p(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class y{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class g{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let R;async function m(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=function(){if(void 0===R){const t=new Response("");if("body"in t)try{new Response(t.body),R=!0}catch(t){R=!1}R=!1}return R}()?i.body:await i.blob();return new Response(o,r)}function v(t,e){const s=new URL(t);for(const t of e)s.searchLine truncated
@@ -1,375 +0,0 @@
#!/bin/bash
# ---------- 最小日志 ----------
# ============================================================
# update_dashboard.sh
# SSR Plus+ 专用
# ============================================================
. /lib/functions.sh
# ---------- 最小日志 ----------
LOG_OUT() {
local msg="$1"
logger -t "shadowsocksr-dashboard" "$msg" 2>/dev/null
echo "$msg"
}
LOG_WARN() {
local msg="$1"
logger -t "shadowsocksr-dashboard" "WARN: $msg" 2>/dev/null
echo "WARN: $msg"
}
# ---------- ETag 缓存(来自 openclash_etag.sh) ----------
ETAG_CACHE="/etc/ssrplus/etag"
GET_ETAG_TIMESTAMP_BY_PATH() {
local path=$1
[ ! -f "$ETAG_CACHE" ] && return 1
local path_hash=$(echo -n "$path" | md5sum | cut -d' ' -f1)
awk -v hash="$path_hash" '
$0 ~ "^\\[" hash "\\]" { found=1; next }
/^\[/ { found=0 }
found && /^time=/ { print $0; exit }
' "$ETAG_CACHE" | cut -d'=' -f2- | sed 's/^"//;s/"$//'
}
GET_ETAG_BY_PATH() {
local path=$1
[ ! -f "$ETAG_CACHE" ] && return 1
local path_hash=$(echo -n "$path" | md5sum | cut -d' ' -f1)
awk -v hash="$path_hash" '
$0 ~ "^\\[" hash "\\]" { found=1; next }
/^\[/ { found=0 }
found && /^etag=/ { print $0; exit }
' "$ETAG_CACHE" | cut -d'=' -f2- | sed 's/^"//;s/"$//'
}
SAVE_ETAG_TO_CACHE() {
local url="\"$1\""
local etag="\"$2\""
local path="\"$3\""
local time="\"$(date '+%Y-%m-%d %H:%M:%S')\""
local path_hash=$(echo -n "$3" | md5sum | cut -d' ' -f1)
mkdir -p "$(dirname "$ETAG_CACHE")"
[ ! -f "$ETAG_CACHE" ] && echo "# ETag Cache File" > "$ETAG_CACHE"
if grep -q "^\[$path_hash\]" "$ETAG_CACHE"; then
local temp_file="${ETAG_CACHE}.tmp"
awk -v hash="$path_hash" \
-v new_url="$url" \
-v new_etag="$etag" \
-v new_path="$path" \
-v new_time="$time" '
$0 ~ "^\\[" hash "\\]" {
print;
found=1;
next
}
/^\[/ { found=0 }
found && /^url=/ {
print "url=" new_url;
next
}
found && /^path=/ {
print "path=" new_path;
next
}
found && /^etag=/ {
print "etag=" new_etag;
next
}
found && /^time=/ {
print "time=" new_time;
next
}
{ print }
' "$ETAG_CACHE" > "$temp_file" && mv "$temp_file" "$ETAG_CACHE"
else
cat >> "$ETAG_CACHE" << EOF
[$path_hash]
url=$url
path=$path
etag=$etag
time=$time
EOF
fi
}
# ---------- 下载器(精简版 + ETag) ----------
DEFAULT_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
DOWNLOAD_FAILURE_OUTPUT() {
local exit_code="$1"
local http_code="$2"
local output="$3"
if [ -n "$output" ]; then
printf '%s' "$output"
elif [ -n "$http_code" ] && [ "$http_code" != "000" ]; then
printf 'HTTP status %s' "$http_code"
elif [ -n "$exit_code" ]; then
printf 'curl exit code %s' "$exit_code"
else
printf 'unknown error'
fi
}
# 精简版 + ETag:只下载 + ETag 304 判断,不 Checksum
DOWNLOAD_FILE_CURL() {
[ -z "$1" ] || [ -z "$2" ] && return 1
local DOWNLOAD_URL="$1"
local DOWNLOAD_PATH="$2"
local FILE_PATH="$3"
local DOWNLOAD_UA="$4"
[ -z "$DOWNLOAD_UA" ] && DOWNLOAD_UA="$DEFAULT_UA"
local HEADER_TMP="/tmp/ssr_dashboard_header.$$"
local DOWNLOAD_TMP="${DOWNLOAD_PATH}.download.$$"
local HTTP_CODE
local EXIR_CODE
local CURL_OUTPUT
local OUTPUT
local CACHED_ETAG
local ETAG_HEADER=""
# ---- ETag 读取 ----
CACHED_ETAG=$(GET_ETAG_BY_PATH "$FILE_PATH")
if [ -n "$CACHED_ETAG" ] && [ -e "$FILE_PATH" ]; then
local FILE_MTIME
local LAST_UPDATE
FILE_MTIME=$(date -r "$FILE_PATH" '+%Y-%m-%d %H:%M:%S' 2>/dev/null)
LAST_UPDATE=$(GET_ETAG_TIMESTAMP_BY_PATH "$FILE_PATH")
if [ -n "$LAST_UPDATE" ] && [ -n "$FILE_MTIME" ] && [ "$LAST_UPDATE" = "$FILE_MTIME" ]; then
ETAG_HEADER="If-None-Match: \"${CACHED_ETAG}\""
fi
fi
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
local DOWNLOAD_TRY=0
local MAX_DOWNLOAD_RETRIES=3
while [ "$DOWNLOAD_TRY" -lt "$MAX_DOWNLOAD_RETRIES" ]; do
DOWNLOAD_TRY=$((DOWNLOAD_TRY + 1))
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
if [ -n "$ETAG_HEADER" ]; then
CURL_OUTPUT=$(curl -w "\n%{http_code}" -SsL \
--connect-timeout 30 -m 180 \
--speed-time 30 --speed-limit 1 \
--retry 2 \
-D "$HEADER_TMP" \
-H "User-Agent: ${DOWNLOAD_UA}" \
-H "$ETAG_HEADER" \
"$DOWNLOAD_URL" -o "$DOWNLOAD_TMP" 2>&1)
else
CURL_OUTPUT=$(curl -w "\n%{http_code}" -SsL \
--connect-timeout 30 -m 180 \
--speed-time 30 --speed-limit 1 \
--retry 2 \
-D "$HEADER_TMP" \
-H "User-Agent: ${DOWNLOAD_UA}" \
"$DOWNLOAD_URL" -o "$DOWNLOAD_TMP" 2>&1)
fi
EXIR_CODE=$?
HTTP_CODE=$(echo "$CURL_OUTPUT" | tail -n1)
# 成功:200(有新内容)或 304(未修改)
if { [ "$EXIR_CODE" -eq 0 ] && [ "$HTTP_CODE" = "200" ]; } || \
{ [ "$EXIR_CODE" -eq 0 ] && [ "$HTTP_CODE" = "304" ] && [ -e "$FILE_PATH" ]; }; then
break
fi
[ "$DOWNLOAD_TRY" -lt "$MAX_DOWNLOAD_RETRIES" ] && sleep 1
done
# ---- 304:文件未修改,直接用旧的 ----
if [ "$EXIR_CODE" -eq 0 ] && [ "$HTTP_CODE" = "304" ] && [ -e "$FILE_PATH" ]; then
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
return 2
fi
# ---- 失败 ----
if [ "$EXIR_CODE" -ne 0 ] || [ "$HTTP_CODE" != "200" ]; then
OUTPUT=$(echo "$CURL_OUTPUT" | sed '$d' | grep -a 'curl:' | tail -n 1)
OUTPUT=$(DOWNLOAD_FAILURE_OUTPUT "$EXIR_CODE" "$HTTP_CODE" "$OUTPUT")
LOG_OUT "【${DOWNLOAD_PATH}】Download Failed:【${OUTPUT}】"
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
return 1
fi
# ---- 200:保存新文件 ----
if ! mv -f "$DOWNLOAD_TMP" "$DOWNLOAD_PATH"; then
LOG_OUT "【${DOWNLOAD_PATH}】Download Failed:【Unable to save download file】"
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
return 1
fi
# ---- ETag 写入 ----
local NEW_ETAG
NEW_ETAG=$(grep -i "^etag:" "$HEADER_TMP" 2>/dev/null | tail -1 | cut -d' ' -f2- | tr -d '\r\n' | sed 's/^"//;s/"$//')
if [ -n "$NEW_ETAG" ] && [ "$HTTP_CODE" = "200" ]; then
SAVE_ETAG_TO_CACHE "$DOWNLOAD_URL" "$NEW_ETAG" "$FILE_PATH"
fi
rm -f "$HEADER_TMP" "$DOWNLOAD_TMP"
return 0
}
set_lock() {
exec 871>"/tmp/lock/shadowsocksr_dashboard.lock" 2>/dev/null
flock -x 871 2>/dev/null
}
del_lock() {
flock -u 871 2>/dev/null
rm -rf "/tmp/lock/shadowsocksr_dashboard.lock" 2>/dev/null
}
validate_dashboard_dir() {
local dashboard_dir="$1"
local index_file="${dashboard_dir%/}/index.html"
local ref=""
local asset=""
local script_found=0
[ -s "$index_file" ] || return 1
while IFS= read -r ref; do
[ -n "$ref" ] || continue
ref="${ref%%#*}"
ref="${ref%%\?*}"
ref="${ref#./}"
case "$ref" in
""|http://*|https://*|//*|/*|data:*|mailto:*) continue ;;
esac
case "$ref" in
*.js|*.css)
asset="${dashboard_dir%/}/$ref"
[ -s "$asset" ] || return 1
[ "${ref##*.}" = "js" ] && script_found=1
;;
esac
done <<-EOF
$(grep -oE "(src|href)[[:space:]]*=[[:space:]]*['\"][^'\"]+['\"]" "$index_file" 2>/dev/null | sed "s/^[^=]*=[[:space:]]*['\"]//;s/['\"]$//")
EOF
[ "$script_found" -eq 1 ]
}
cleanup_dashboard_tmp() {
rm -rf "$DASH_FILE_DIR" "$DASH_FILE_TMP" "$NEW_FILE_DIR" "$OLD_FILE_DIR" >/dev/null 2>&1
}
restore_old_dashboard() {
rm -rf "$TARGET_FILE_DIR" >/dev/null 2>&1
[ -d "$OLD_FILE_DIR" ] && mv "$OLD_FILE_DIR" "$TARGET_FILE_DIR" >/dev/null 2>&1
}
log_unzip_error() {
LOG_OUT "Control Panel【$DASH_NAME - $DASH_TYPE】Unzip Error!"
cleanup_dashboard_tmp
del_lock
exit 2
}
# 主流程
set_lock
DASH_NAME="$1"
DASH_TYPE="$2"
DASH_FILE_DIR="/tmp/dash.zip"
DASH_FILE_TMP="/tmp/dash/"
# 建议:如果 uci_get_config 未在外部定义,可使用 uci 替代或加上防护
github_address_mod=$(uci_get_config "github_address_mod" 2>/dev/null || echo 0)
if [ "$DASH_NAME" == "Dashboard" ]; then
UNPACK_FILE_DIR="/usr/share/shadowsocksr/ui/dashboard/"
if [ "$DASH_TYPE" == "Official" ]; then
DOWNLOAD_PATH="https://codeload.github.com/ayanamist/clash-dashboard/zip/refs/heads/gh-pages"
FILE_PATH_INCLUDE="clash-dashboard-gh-pages"
else
DOWNLOAD_PATH="https://codeload.github.com/MetaCubeX/Razord-meta/zip/refs/heads/gh-pages"
FILE_PATH_INCLUDE="Razord-meta-gh-pages"
fi
elif [ "$DASH_NAME" == "Yacd" ]; then
UNPACK_FILE_DIR="/usr/share/shadowsocksr/ui/yacd/"
if [ "$DASH_TYPE" == "Official" ]; then
DOWNLOAD_PATH="https://codeload.github.com/haishanh/yacd/zip/refs/heads/gh-pages"
FILE_PATH_INCLUDE="yacd-gh-pages"
else
DOWNLOAD_PATH="https://codeload.github.com/MetaCubeX/Yacd-meta/zip/refs/heads/gh-pages"
FILE_PATH_INCLUDE="Yacd-meta-gh-pages"
fi
elif [ "$DASH_NAME" == "Zashboard" ]; then
UNPACK_FILE_DIR="/usr/share/shadowsocksr/ui/zashboard/"
DOWNLOAD_PATH="https://codeload.github.com/Zephyruso/zashboard/zip/refs/heads/gh-pages-cdn-fonts"
FILE_PATH_INCLUDE="zashboard-gh-pages-cdn-fonts"
else
UNPACK_FILE_DIR="/usr/share/shadowsocksr/ui/metacubexd/"
DOWNLOAD_PATH="https://codeload.github.com/MetaCubeX/metacubexd/zip/refs/heads/gh-pages"
FILE_PATH_INCLUDE="metacubexd-gh-pages"
fi
TARGET_FILE_DIR="${UNPACK_FILE_DIR%/}"
TARGET_PARENT_DIR="$(dirname "$TARGET_FILE_DIR")"
NEW_FILE_DIR="${TARGET_PARENT_DIR}/.shadowsocksr_dashboard_new.$$"
OLD_FILE_DIR="${TARGET_PARENT_DIR}/.shadowsocksr_dashboard_old.$$"
DOWNLOAD_FILE_CURL "$DOWNLOAD_PATH" "$DASH_FILE_DIR" "$UNPACK_FILE_DIR"
DOWNLOAD_RESULT=$?
if [ "$DOWNLOAD_RESULT" -eq 0 ] && [ -s "$DASH_FILE_DIR" ]; then
unzip -qt "$DASH_FILE_DIR" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
rm -rf "$DASH_FILE_TMP" "$NEW_FILE_DIR" "$OLD_FILE_DIR" >/dev/null 2>&1
unzip -q "$DASH_FILE_DIR" -d "$DASH_FILE_TMP" >/dev/null 2>&1
if [ "$?" -eq "0" ] && [ -d "$DASH_FILE_TMP$FILE_PATH_INCLUDE" ]; then
mkdir -p "$NEW_FILE_DIR" >/dev/null 2>&1 || log_unzip_error
cp -rf "$DASH_FILE_TMP$FILE_PATH_INCLUDE"/. "$NEW_FILE_DIR" >/dev/null 2>&1 || log_unzip_error
validate_dashboard_dir "$NEW_FILE_DIR" || log_unzip_error
mkdir -p "$TARGET_PARENT_DIR" >/dev/null 2>&1 || log_unzip_error
if [ -d "$TARGET_FILE_DIR" ]; then
mv "$TARGET_FILE_DIR" "$OLD_FILE_DIR" >/dev/null 2>&1 || log_unzip_error
fi
if mv "$NEW_FILE_DIR" "$TARGET_FILE_DIR" >/dev/null 2>&1 && validate_dashboard_dir "$TARGET_FILE_DIR"; then
cleanup_dashboard_tmp
LOG_OUT "Control Panel【$DASH_NAME - $DASH_TYPE】Download Successful!"
del_lock
exit 0
else
restore_old_dashboard
log_unzip_error
fi
else
log_unzip_error
fi
else
log_unzip_error
fi
elif [ "$DOWNLOAD_RESULT" -eq 2 ]; then
if validate_dashboard_dir "$UNPACK_FILE_DIR"; then
cleanup_dashboard_tmp
LOG_OUT "Control Panel【$DASH_NAME - $DASH_TYPE】Download Successful!"
del_lock
exit 0
else
log_unzip_error
fi
else
cleanup_dashboard_tmp
LOG_OUT "Control Panel【$DASH_NAME - $DASH_TYPE】Download Error!"
del_lock
exit 1
fi
del_lock
@@ -16,6 +16,31 @@ const callLogRead = rpc.declare({
expect: { log: [] }
});
function exportLogButton(filename, label) {
return E('button', {
'type': 'button',
'class': 'cbi-button cbi-button-action',
'style': 'margin-left: 10px',
'click': function() {
const log = document.getElementById('syslog');
if (!log)
return;
const blob = new Blob(['\ufeff', log.value], { type: 'text/plain;charset=utf-8' });
const url = URL.createObjectURL(blob);
const link = E('a', {
'href': url,
'download': filename + '-' + new Date().toISOString().replace(/[:.]/g, '-') + '.txt',
'style': 'display: none'
});
document.body.appendChild(link);
link.click();
link.remove();
window.setTimeout(function() { URL.revokeObjectURL(url); }, 1000);
}
}, label);
}
var CBILogreadBox = function(logtag, name) {
return L.view.extend({
@@ -271,7 +296,10 @@ var CBILogreadBox = function(logtag, name) {
E('label', { 'for': 'logMaxRows', 'style': 'margin: 0 5px' }, _('Max rows:')),
filterMaxRows,
]),
E('div', {'style': 'padding-bottom: 20px'}, [scrollDownButton]),
E('div', {'style': 'padding-bottom: 20px'}, [
scrollDownButton,
!logtag ? exportLogButton('system-log', _('Export system log to TXT')) : null
]),
E('textarea', {
'id': 'syslog',
'style': 'font-size:12px',
@@ -292,4 +320,5 @@ var CBILogreadBox = function(logtag, name) {
return L.Class.extend({
LogreadBox: CBILogreadBox,
exportLogButton: exportLogButton,
});
+6
View File
@@ -14173,3 +14173,9 @@ msgstr "连接数"
msgid "Wireless scan failed: %s"
msgstr "无线扫描失败:%s"
msgid "Export system log to TXT"
msgstr "导出系统日志到 TXT"
msgid "Export kernel log to TXT"
msgstr "导出内核日志到 TXT"
+6
View File
@@ -14028,3 +14028,9 @@ msgstr "連線數"
msgid "Wireless scan failed: %s"
msgstr "無線掃描失敗:%s"
msgid "Export system log to TXT"
msgstr "匯出系統日誌至 TXT"
msgid "Export kernel log to TXT"
msgstr "匯出核心日誌至 TXT"
@@ -214,9 +214,9 @@ return baseclass.extend({
_('Hostname'),
_('IP Address'),
_('SSID'),
_('Band'),
'%s / %s'.format(_('Signal'), _('Noise floor')),
_('Up.'),
_('Down.'),
'%s / %s'.format(_('Up.'), _('Down.')),
_('Connected')
],
rows: this.params.wifi.devices.map(device => [
@@ -225,6 +225,7 @@ return baseclass.extend({
? E('div', { 'class': 'dashboard-client-addresses' }, device.addresses.value.map(address => E('div', {}, [ address ])))
: '-',
device.ssid.value,
device.band.value || '-',
E('span', {}, [
charts.badge((device.signal.value.rssi != null) ? '%d %s'.format(device.signal.value.rssi, _('dBm')) : _('No RX signal'), signalGrade(device.signal.value.rssi).kind),
' ',
@@ -232,8 +233,11 @@ return baseclass.extend({
? E('small', {}, [ '/ %d %s'.format(device.signal.value.noise, _('dBm')) ])
: ''
]),
device.transferred.value.rx,
device.transferred.value.tx,
E('span', {}, [
E('span', { 'title': _('Up.') }, [ device.transferred.value.rx ]),
' / ',
E('span', { 'title': _('Down.') }, [ device.transferred.value.tx ])
]),
device.connected.value || '-'
]),
emptyText: _('No wireless clients connected'),
@@ -241,6 +245,32 @@ return baseclass.extend({
});
},
frequencyBand(frequency) {
const freq = Number(frequency);
let band = null;
// Wi-Fi frequency band boundaries (GHz):
// - Sub-1 GHz: < 1 GHz (NL80211_BAND_S1GHZ, covers 802.11ah HaLow / 802.11af)
// - 2.4 GHz: 2.312-2.484 GHz (down to ch -19 in ath9k/ath5k; ch 14 upper bound)
// - 5 GHz: 4.91-5.925 GHz (802.11j public safety through U-NII-4)
// - 6 GHz: 5.925-7.125 GHz (U-NII-5 through U-NII-8)
// - 60 GHz: 58.32-70.2 GHz (802.11ad/ay DMG band)
// 5/6/60 GHz and ch 14 follow Linux kernel ieee80211_freq_khz_to_channel():
// https://github.com/torvalds/linux/blob/165768bb70265b5c38cf0b73fafd75be235f8b14/net/wireless/util.c#L114-L132
if (freq > 0 && freq < 1)
band = 'Sub-1';
else if (freq >= 2.312 && freq <= 2.484)
band = '2.4';
else if (freq >= 4.91 && freq < 5.925)
band = '5';
else if (freq >= 5.925 && freq <= 7.125)
band = '6';
else if (freq >= 58.32 && freq <= 70.2)
band = '60';
return band ? '%s %s'.format(band, _('GHz')) : null;
},
renderTab() {
return E('div', {}, [
E('div', { 'class': 'dashboard-net-grid' }, this.params.wifi.radios.map(radio => this.renderNetworkCard(radio))),
@@ -316,6 +346,8 @@ return baseclass.extend({
}
for (let i = 0; i < networks.length; i++) {
const band = this.frequencyBand(networks[i].getFrequency());
for (let k = 0; k < networks[i].assoclist.length; k++) {
const bss = networks[i].assoclist[k];
const mac = bss.mac.toUpperCase();
@@ -323,6 +355,11 @@ return baseclass.extend({
this.params.wifi.devices.push(
{
band : {
title: _('Band'),
visible: true,
value: band
},
hostname : {
title: _('Hostname'),
visible: true,
+1 -1
View File
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Status Pages
LUCI_DEPENDS:=+luci-base +luci-app-oui +luci-mod-dashboard +libiwinfo +rpcd-mod-iwinfo +rpcd-mod-rrdns +ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-socket
PKG_RELEASE:=14
PKG_RELEASE:=15
PKG_BUILD_DEPENDS:=iwinfo
PKG_LICENSE:=Apache-2.0
@@ -3,6 +3,7 @@
'require fs';
'require poll';
'require ui';
'require tools.views as views';
return view.extend({
logFilterFrom: '0',
@@ -277,7 +278,10 @@ return view.extend({
E('label', { 'for': 'logTextFilter', 'style': 'margin: 0 5px' }, _('including:')),
filterTextInput,
]),
E('div', {'style': 'padding-bottom: 20px'}, [scrollDownButton]),
E('div', {'style': 'padding-bottom: 20px'}, [
scrollDownButton,
views.exportLogButton('kernel-log', _('Export kernel log to TXT'))
]),
E('textarea', {
'id': 'syslog',
'style': 'font-size:12px',
+2 -2
View File
@@ -51,11 +51,11 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=wwand
PKG_VERSION:=1.6.8_p6
PKG_RELEASE:=55
PKG_RELEASE:=56
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/ddimension/wwand.git
PKG_SOURCE_VERSION:=09bf4710f61587ebbece2aa7e8372f105f03d436
PKG_SOURCE_VERSION:=2d7803e46b95f60a8a890ccd961f5154ba672424
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL-2.0-only