import { connect } from "cloudflare:sockets";
const _pJUBHBGk = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _KOGTnOWF = ["UpstreamAddress.SG.CMLiussss.net"];
const _OrZFUQYR = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _iAuIFADd = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _mQvbbvdG = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90';
const _xatZLdiJ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9C%B0%E5%8C%BA%E5%90%8D%E7%A7%B0';
function _iWeWUebN(_yjraJIiW) {
if (Array.isArray(_yjraJIiW)) {
try {
return String.fromCharCode.apply(null, _yjraJIiW);
} catch (_IEhrOjLx) {
return '';
}
}
return _yjraJIiW;
}
function _OiWtPAzg(_IKtrpYVv) {
return /^[0-9a-_aTqvHowW]{8}-[0-9a-_aTqvHowW]{4}-[4][0-9a-_aTqvHowW]{3}-[89ab][0-9a-_aTqvHowW]{3}-[0-9a-_aTqvHowW]{12}$/_QlxHsXXs.test(_IKtrpYVv);
}
const _HWtRAxvq = "optimized_ips_v4";
const _xEMQgKoA = "global_config_v4";
const _TMlMaVxU = "admin_password_v4";
const _NYhaYnkU = "live_results_temp_v1";
const _NdwDXgKC = "latest_sub_id_v1";
export default {
async fetch(_JPetdNTd, _iNbETDOJ, _vscvGUTk) {
try {
if (!_iNbETDOJ.DB) {
const _LPfmWDcX = _zpDRcOZY("D1 数据库 'DB' 未绑定。");
return new Response(_LPfmWDcX, { status: 503, _skdDjFAj: { 'Content-Type': '_SquPJSls/html;_emrySbDR=UTF-8' }});
}
_vscvGUTk.waitUntil(
_iNbETDOJ.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_BfGaXxgR TEXT PRIMARY KEY, _yjraJIiW TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_IKtrpYVv TEXT PRIMARY KEY, _VKuCcQUN TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_IEhrOjLx => console.error("DB Init Error:", _IEhrOjLx._rFZPDjIC))
);
const _xnyHYIzb = new URL(_JPetdNTd._xnyHYIzb);
const _atPIzTsm = _xnyHYIzb.pathname;
const _MujDjMvU = _JPetdNTd._skdDjFAj.get("Upgrade");
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (_gcynLpiH.websocketStreamer && _gcynLpiH.websocketStreamer._GqxlmxBu && _MujDjMvU && _MujDjMvU.toLowerCase() === "websocket") {
const _hFqqJrRf = _gcynLpiH.websocketStreamer._xnyHYIzb;
if (_hFqqJrRf && _hFqqJrRf.trim().startsWith('https://')) {
try {
const _XvVgSxSJ = new Request(_hFqqJrRf.trim() + _xnyHYIzb.pathname + _xnyHYIzb.search, _JPetdNTd);
return await fetch(_XvVgSxSJ);
} catch (_IEhrOjLx) {
return new Response(`Upstream WebSocket gateway failed: ${_IEhrOjLx._rFZPDjIC}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_MujDjMvU && _MujDjMvU.toLowerCase() === "websocket") {
return await _JMNJLKII(_JPetdNTd, _iNbETDOJ, _gcynLpiH);
}
const _shWitLaE = _atPIzTsm._gSSWPfdD(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_shWitLaE) {
const [, _qhwfZnKn, typeSuffix] = _shWitLaE;
const _NECIuZxM = _gcynLpiH._NECIuZxM;
if (!_NECIuZxM || _NECIuZxM.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' } });
}
const _tTOWroDy = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _vPHzaghy = _tTOWroDy[typeSuffix];
const _medYvyGq = _NECIuZxM.replace(/\/$/, '');
const _jRzwWwEa = `${_xnyHYIzb.origin}/${_qhwfZnKn}`;
const _nyGZbXfW = `${_medYvyGq}/${_vPHzaghy}?_gcynLpiH=${encodeURIComponent(_jRzwWwEa)}`;
try {
const _tEfBCnnl = await fetch(_nyGZbXfW, { _skdDjFAj: { 'User-Agent': _JPetdNTd._skdDjFAj.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _dHbxBMnY = new Headers(_tEfBCnnl._skdDjFAj);
_dHbxBMnY._foLoWWQC('Access-Control-Allow-Origin', '*');
return new Response(_tEfBCnnl._cvKfTXWI, { status: _tEfBCnnl.status, statusText: _tEfBCnnl.statusText, _skdDjFAj: _dHbxBMnY });
} catch (_IEhrOjLx) {
return new Response(`获取上游订阅失败: ${_IEhrOjLx._rFZPDjIC}`, { status: 502, _skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' } });
}
}
if (_atPIzTsm.startsWith('/https:/') || _atPIzTsm.startsWith('/http:/')) {
return _DcuQPSnG(_JPetdNTd, _gcynLpiH);
}
if (_gcynLpiH.customSubPath && _gcynLpiH.customSubPath._GqxlmxBu && _gcynLpiH.customSubPath._atPIzTsm && _atPIzTsm === '/' + _gcynLpiH.customSubPath._atPIzTsm.trim()) {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_NdwDXgKC);
const { _YHtsypkv } = await _LVQheWsN.all();
const _CqbgzbTn = _YHtsypkv._JoGjJgLm > 0 ? _YHtsypkv[0]._yjraJIiW : null;
if (_CqbgzbTn) {
return _eZBTxolj({ _sCFVOlUS: { _IKtrpYVv: _CqbgzbTn }, _xnyHYIzb: _JPetdNTd._xnyHYIzb }, _iNbETDOJ);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' } });
}
}
const _PgxGCwcu = _atPIzTsm.split('/').filter(Boolean);
if (_PgxGCwcu._JoGjJgLm === 1 && !_atPIzTsm.startsWith('/api/')) {
const _qhwfZnKn = _PgxGCwcu[0];
return _eZBTxolj({ _sCFVOlUS: { _IKtrpYVv: _qhwfZnKn }, _xnyHYIzb: _JPetdNTd._xnyHYIzb }, _iNbETDOJ);
}
if (_atPIzTsm.startsWith('/api/')) {
if (_atPIzTsm === '/api/_gcynLpiH' && _JPetdNTd.method === 'POST') return _LqnyDjmR(_JPetdNTd, _iNbETDOJ, _vscvGUTk);
if (_atPIzTsm === '/api/_foLoWWQC-_jCFiQgRE') return _VQTXWIfW(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/change-_jCFiQgRE') return _cOXKVuAn(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/verify-_jCFiQgRE') return _IPbKwAWn(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/verify-visitor-_jCFiQgRE' && _JPetdNTd.method === 'POST') return _WoIVBoHJ(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/cache-live-_YHtsypkv' && _JPetdNTd.method === 'POST') return _NRfeJyjJ(_JPetdNTd, _iNbETDOJ, _vscvGUTk);
if (_atPIzTsm === '/api/get-_ypEORTXI' && _JPetdNTd.method === 'POST') return _hDJTvgzU(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/get-cached-_vvXQGUiR') return _BldIqcmR(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/save-_vvXQGUiR') return _uQRBizjR(_JPetdNTd, _iNbETDOJ, _vscvGUTk);
if (_atPIzTsm === '/api/save-and-get-sub-_IKtrpYVv' && _JPetdNTd.method === 'POST') return _nRYwByVG(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm.startsWith('/api/get-_QgWWEBEH/')) {
const _qhwfZnKn = _atPIzTsm.split('/').pop();
return _eZBTxolj({ _sCFVOlUS: { _IKtrpYVv: _qhwfZnKn }, _xnyHYIzb: _JPetdNTd._xnyHYIzb }, _iNbETDOJ);
}
if (_atPIzTsm === '/api/_gcynLpiH' && _JPetdNTd.method === 'GET') return _XbkFKMiw(_iNbETDOJ);
if (_atPIzTsm === '/api/get-resolved-_vvXQGUiR') return _DgbecDQL(_JPetdNTd);
if (_atPIzTsm === '/api/parse-_vvXQGUiR-from-_RkxWqceQ' && _JPetdNTd.method === 'POST') return _JkcRaSHn(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/endpoints') return _nwjMRcEI(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_atPIzTsm === '/_jAwlIgeD') return _gYGIGOxF(_JPetdNTd, _iNbETDOJ);
if (_atPIzTsm === '/bing-wallpaper') return _qMrClpuR();
return _HLCILLkO(_JPetdNTd, _iNbETDOJ, _vscvGUTk);
} catch (err) {
let _IEhrOjLx = err;
return new Response(_IEhrOjLx.toString(), { status: 500 });
}
}
};
const _FnZNxMpL = { 'Accept': '_SquPJSls/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' };
async function _ngiFRnjy(_xnyHYIzb, _zpclksUt) {
const _VHpiYngw = await fetch(_xnyHYIzb, { _skdDjFAj: { ..._FnZNxMpL, 'Referer': _zpclksUt.referer } });
if (_VHpiYngw.ok) return _VHpiYngw._SquPJSls();
return null;
}
async function _pyPOKDnz(_xnyHYIzb, _zpclksUt) {
const _gYIXTIuY = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_xnyHYIzb)}`;
const _VHpiYngw = await fetch(_gYIXTIuY, { _skdDjFAj: { ..._FnZNxMpL, 'Referer': _zpclksUt.referer } });
if (!_VHpiYngw.ok) return null;
const _cvKfTXWI = await _VHpiYngw._SquPJSls();
const _gSSWPfdD = _cvKfTXWI._gSSWPfdD(/<pre[^>]*>([\s\S]*?)<\/pre>/_QlxHsXXs);
return _gSSWPfdD && _gSSWPfdD[1] ? _gSSWPfdD[1].replace(/&/g, '&') : null;
}
function _OkxeALsk(_XJLNgCkv) {
let _KqZJxpdh;
try {
_KqZJxpdh = atob(_XJLNgCkv.replace(/\s/g, ''));
} catch (_IEhrOjLx) {
_KqZJxpdh = _XJLNgCkv;
}
const _QgWWEBEH = _KqZJxpdh.split(/[\s\n\r,]+/).filter(line => line.trim());
const _biXhBQUp = new Set();
const _MPBehojR = /@([^?#]+?):(\d+)/;
for (const _rAtpxMjL of _QgWWEBEH) {
let _GkRYaraU = '';
let _SADXxFkD = '';
try {
if (_rAtpxMjL.startsWith('vmess://')) {
const _rcSjeMUS = atob(_rAtpxMjL.substring(8));
const _gcynLpiH = JSON.parse(_rcSjeMUS);
_GkRYaraU = _gcynLpiH.add;
_SADXxFkD = _gcynLpiH._SADXxFkD;
} else {
const _gSSWPfdD = _rAtpxMjL._gSSWPfdD(_MPBehojR);
if (_gSSWPfdD && _gSSWPfdD[1] && _gSSWPfdD[2]) {
_GkRYaraU = _gSSWPfdD[1].replace(/[\[\]]/g, '');
_SADXxFkD = _gSSWPfdD[2];
}
}
} catch (_IEhrOjLx) {
console.warn(`Could not parse _rAtpxMjL: ${_rAtpxMjL}`);
}
if (_GkRYaraU && _SADXxFkD) {
_biXhBQUp.add(`${_GkRYaraU}:${_SADXxFkD}`);
}
}
return Array.from(_biXhBQUp);
}
async function _nLNmNPAt(_mHPlUjNZ) {
try {
const _VHpiYngw = await fetch(_mHPlUjNZ, { _skdDjFAj: _FnZNxMpL });
if (!_VHpiYngw.ok) {
console.error(`Failed to fetch subscription: ${_VHpiYngw.status}`);
return [];
}
const _XJLNgCkv = await _VHpiYngw._SquPJSls();
return _OkxeALsk(_XJLNgCkv);
} catch (error) {
console.error(`Error processing subscription ${_mHPlUjNZ}:`, error);
return [];
}
}
async function _JRBfwyoH(_fLDjfvjW) {
const _euhNoLnq = _fLDjfvjW.trim();
const _TVDgLubY = /^(vless|vmess|trojan|ss):\/\//.test(_euhNoLnq);
const _JYGzWNVJ = (() => {
if (_euhNoLnq._JoGjJgLm < 20 || _euhNoLnq.startsWith('http')) return false;
const _sLMEZckc = _euhNoLnq.replace(/\s/g, '');
if (_sLMEZckc._JoGjJgLm % 4 !== 0 && !_sLMEZckc.includes('=')) return false;
try {
atob(_sLMEZckc);
return true;
} catch (_IEhrOjLx) {
return false;
}
})();
if (_TVDgLubY || _JYGzWNVJ) {
return _OkxeALsk(_euhNoLnq).join('\n');
}
const _pEgSbcKi = [
'https://ipdb.api.030101.xyz/?_cYgHVtnz=bestcf&_pJuKLUwl=true',
'https://ipdb.api.030101.xyz/?_cYgHVtnz=bestproxy&_pJuKLUwl=true'
];
const _qmiHVQxA = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_QlxHsXXs.test(_fLDjfvjW) || _fLDjfvjW.includes('?_lRlYIfgY=');
if (_qmiHVQxA) {
const _vvXQGUiR = await _nLNmNPAt(_fLDjfvjW);
return _vvXQGUiR.join('\n');
}
let _XJLNgCkv = '';
if (_pEgSbcKi.includes(_fLDjfvjW)) {
_XJLNgCkv = await _ngiFRnjy(_fLDjfvjW, { referer: _fLDjfvjW });
if (!_XJLNgCkv || _XJLNgCkv._JoGjJgLm < 8) {
_XJLNgCkv = await _pyPOKDnz(_fLDjfvjW, { referer: _fLDjfvjW });
}
} else {
try {
const _BpNSfQyJ = await fetch(_fLDjfvjW, { _skdDjFAj: { 'User-Agent': 'Cloudflare-Worker' } });
if (_BpNSfQyJ.ok) {
_XJLNgCkv = await _BpNSfQyJ._SquPJSls();
} else {
console.warn(`Failed to fetch URL ${_fLDjfvjW}: ${_BpNSfQyJ.status}`);
}
} catch (_IEhrOjLx) {
console.error(`Error fetching URL ${_fLDjfvjW}:`, _IEhrOjLx);
}
}
const _GNZpAxlG = _OkxeALsk(_XJLNgCkv);
if (_GNZpAxlG._JoGjJgLm > 0) {
return _GNZpAxlG.join('\n');
}
return _XJLNgCkv || '';
}
async function _DcuQPSnG(_JPetdNTd, _gcynLpiH) {
if (!_gcynLpiH.streamer._GqxlmxBu) {
return new Response('远程流功能未开启', { status: 403 });
}
const _xnyHYIzb = new URL(_JPetdNTd._xnyHYIzb);
const _hvpCzCKA = _xnyHYIzb.pathname.substring(1).replace(':/', '://');
try {
const _nyGZbXfW = new URL(_hvpCzCKA);
const _cdYjpbwV = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_cdYjpbwV.some(domain => _nyGZbXfW._GkRYaraU.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _rlVFZDaW = new Headers(_JPetdNTd._skdDjFAj);
_rlVFZDaW._foLoWWQC('Host', _nyGZbXfW._GkRYaraU);
_rlVFZDaW._foLoWWQC('User-Agent', 'CF-Worker-Streamer/1.0');
const _pKGeNccH = await fetch(_nyGZbXfW.toString(), {
method: _JPetdNTd.method,
_skdDjFAj: _rlVFZDaW,
_cvKfTXWI: _JPetdNTd._cvKfTXWI,
});
const _dHbxBMnY = new Headers(_pKGeNccH._skdDjFAj);
_dHbxBMnY._foLoWWQC('Access-Control-Allow-Origin', '*');
_dHbxBMnY._foLoWWQC('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_dHbxBMnY._foLoWWQC('Access-Control-Allow-Headers', '*');
_dHbxBMnY._foLoWWQC('Cache-Control', 'public, max-age=86400');
_dHbxBMnY._foLoWWQC('X-Streamer-Source', 'CF-Worker');
_dHbxBMnY.delete('_XJLNgCkv-security-policy');
_dHbxBMnY.delete('x-_XJLNgCkv-security-policy');
_dHbxBMnY.delete('x-webkit-csp');
return new Response(_pKGeNccH._cvKfTXWI, {
status: _pKGeNccH.status,
statusText: _pKGeNccH.statusText,
_skdDjFAj: _dHbxBMnY,
});
} catch (_IEhrOjLx) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _JMNJLKII(_JPetdNTd, _iNbETDOJ, _gcynLpiH) {
try {
const _wqAuScdL = _gcynLpiH || await _uQjiTRsw(_iNbETDOJ);
const _HpycDnTR = (_wqAuScdL.itemLink._ATlQBTOC && _wqAuScdL.itemLink._ATlQBTOC[0]) || {};
const _HtBEXgag = _HpycDnTR['_lRlYIfgY'] || _iWeWUebN(_pJUBHBGk);
if (!_OiWtPAzg(_HtBEXgag)) {
throw new Error("Configured user _WPgEPttI is not valid.");
}
const _DIfJAUnY = _wqAuScdL.dataFeeds.universalFallbackAddress;
let _IFdJOGmR = {};
const _HMHJNnqS = _iWeWUebN(_KOGTnOWF[0] || "");
if (_DIfJAUnY) {
const [_WXrFbaSJ, _SADXxFkD = '443'] = _DIfJAUnY.split(':');
_IFdJOGmR = { _WXrFbaSJ, _SADXxFkD };
} else {
const [_WXrFbaSJ, _SADXxFkD = '443'] = _HMHJNnqS.split(':');
_IFdJOGmR = { _WXrFbaSJ, _SADXxFkD };
}
const _xnyHYIzb = new URL(_JPetdNTd._xnyHYIzb);
const _atPIzTsm = _xnyHYIzb.pathname;
let _OFINUBSa = '';
const _fYJdovbo = _xnyHYIzb.searchParams.get('remote');
if (_fYJdovbo) {
_OFINUBSa = atob(_fYJdovbo);
} else if (_atPIzTsm.startsWith('/endpoint=')) {
_OFINUBSa = _atPIzTsm.substring(10);
} else if (_atPIzTsm._JoGjJgLm > 1 && _atPIzTsm.substring(1).includes('.')) {
_OFINUBSa = _atPIzTsm.substring(1);
}
if (_OFINUBSa) {
const [_WXrFbaSJ, _SADXxFkD = '443'] = _OFINUBSa.split(':');
_IFdJOGmR = { _WXrFbaSJ, _SADXxFkD };
}
return await _gVfMMnRR(_JPetdNTd, _HtBEXgag, _IFdJOGmR);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _gVfMMnRR(_JPetdNTd, _WPgEPttI, _IFdJOGmR) {
const _dFZHRyej = new WebSocketPair();
const [clientEnd, _KTVzohcC] = Object.values(_dFZHRyej);
_KTVzohcC.accept();
let _BuajiPEt = { _YhKmktPT: null };
const _LBgDdJgc = _JPetdNTd._skdDjFAj.get("sec-websocket-protocol") || "";
const _skFmwzFF = _LUlAkhsd(_KTVzohcC, _LBgDdJgc);
_skFmwzFF.pipeTo(new WritableStream({
async write(chunk) {
if (_BuajiPEt._YhKmktPT) {
const _hvjURIDW = _BuajiPEt._YhKmktPT.writable.getWriter();
await _hvjURIDW.write(chunk);
_hvjURIDW.releaseLock();
return;
}
const { error, details } = await _uYiDJZcY(chunk, _WPgEPttI);
if (error) {
throw new Error(details);
}
const _DqnRUjWF = new Uint8Array([details._rTegwfyF[0], 0]);
const _vMNHvMBR = chunk.slice(details.payloadIndex);
await _DTtoyOrG(_BuajiPEt, details._yfVauJpZ, details._MMIquAzW, _vMNHvMBR, _KTVzohcC, _DqnRUjWF, _IFdJOGmR);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_SnDeksCu(_KTVzohcC);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _DTtoyOrG(_BuajiPEt, _yfVauJpZ, _MMIquAzW, _rDpCsaYU, _amTXBRSX, _DqnRUjWF, _YqEFWbIk) {
const _VSMDYkwD = async (_WXrFbaSJ, _SADXxFkD) => {
let _qIpvijto = _WXrFbaSJ;
if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(_WXrFbaSJ)) {
_qIpvijto = `${atob('d3d3Lg==')}${_WXrFbaSJ}${atob('LnNzbGlwLmlv')}`;
}
const _YhKmktPT = connect({ _GkRYaraU: _qIpvijto, _SADXxFkD });
_BuajiPEt._YhKmktPT = _YhKmktPT;
const _hvjURIDW = _YhKmktPT.writable.getWriter();
await _hvjURIDW.write(_rDpCsaYU);
_hvjURIDW.releaseLock();
return _YhKmktPT;
};
const _bwFoPrHd = async () => {
if (!_YqEFWbIk._WXrFbaSJ) return;
console.log(`Direct connection failed, falling back to gateway: ${_YqEFWbIk._WXrFbaSJ}`);
const _aiLcJQcU = await _VSMDYkwD(_YqEFWbIk._WXrFbaSJ, parseInt(_YqEFWbIk._SADXxFkD, 10));
_aiLcJQcU.closed.catch(() => {}).finally(() => _SnDeksCu(_amTXBRSX));
_czpPcZxI(_aiLcJQcU, _amTXBRSX, _DqnRUjWF, null);
};
try {
const _DQYaSlMJ = await _VSMDYkwD(_yfVauJpZ, _MMIquAzW);
_czpPcZxI(_DQYaSlMJ, _amTXBRSX, _DqnRUjWF, _bwFoPrHd);
} catch (err) {
console.error("Primary connection failed:", err);
await _bwFoPrHd();
}
}
function _LUlAkhsd(_KTVzohcC, _LBgDdJgc) {
let _KNuRtsFN = false;
return new ReadableStream({
start(_QrdaXFef) {
_KTVzohcC.addEventListener("_rFZPDjIC", (event) => { if (_KNuRtsFN) return; _QrdaXFef.enqueue(event._VKuCcQUN); });
_KTVzohcC.addEventListener("close", () => { _SnDeksCu(_KTVzohcC); if (_KNuRtsFN) return; _QrdaXFef.close(); });
_KTVzohcC.addEventListener("error", (err) => _QrdaXFef.error(err));
if (_LBgDdJgc) {
try {
const _XzoHXpaj = atob(_LBgDdJgc.replace(/-/g, "+").replace(/_/g, "/"));
_QrdaXFef.enqueue(Uint8Array.from(_XzoHXpaj, c => c.charCodeAt(0))._tkXpHQwc);
} catch (_IEhrOjLx) { console.error("Failed to decode early _VKuCcQUN:", _IEhrOjLx); }
}
},
cancel() { _KNuRtsFN = true; _SnDeksCu(_KTVzohcC); },
});
}
async function _uYiDJZcY(_tkXpHQwc, _WPgEPttI) {
if (_tkXpHQwc.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _rTegwfyF = new Uint8Array(_tkXpHQwc.slice(0, 1));
const _ijfWDmdB = _ilYDcRAY(new Uint8Array(_tkXpHQwc.slice(1, 17)));
if (_ijfWDmdB !== _WPgEPttI) return { error: true, details: "Invalid _WPgEPttI" };
const _ulbecAEM = new Uint8Array(_tkXpHQwc.slice(17, 18))[0];
const _AfgxbNLT = new Uint8Array(_tkXpHQwc.slice(18 + _ulbecAEM, 19 + _ulbecAEM))[0];
if (_AfgxbNLT !== 1) return { error: true, details: `Unsupported _AfgxbNLT: ${_AfgxbNLT}` };
const _xFFWfiww = 19 + _ulbecAEM;
const _MMIquAzW = new DataView(_tkXpHQwc.slice(_xFFWfiww, _xFFWfiww + 2)).getUint16(0);
let _ZhQpxkQe = _xFFWfiww + 2;
const _byfbkxXN = new Uint8Array(_tkXpHQwc.slice(_ZhQpxkQe, _ZhQpxkQe + 1))[0];
let _znROEorX = 0;
let _RCKlOeHQ = _ZhQpxkQe + 1;
let _yfVauJpZ = "";
switch (_byfbkxXN) {
case 1: _znROEorX = 4; _yfVauJpZ = new Uint8Array(_tkXpHQwc.slice(_RCKlOeHQ, _RCKlOeHQ + _znROEorX)).join("."); break;
case 2: _znROEorX = new Uint8Array(_tkXpHQwc.slice(_RCKlOeHQ, _RCKlOeHQ + 1))[0]; _RCKlOeHQ++; _yfVauJpZ = new TextDecoder().decode(_tkXpHQwc.slice(_RCKlOeHQ, _RCKlOeHQ + _znROEorX)); break;
case 3: _znROEorX = 16; const _zbCMbWfH = new DataView(_tkXpHQwc.slice(_RCKlOeHQ, _RCKlOeHQ + _znROEorX)); const _bbXHwUzs = []; for (let _QlxHsXXs = 0; _QlxHsXXs < 8; _QlxHsXXs++) _bbXHwUzs.push(_zbCMbWfH.getUint16(_QlxHsXXs * 2).toString(16)); _yfVauJpZ = _bbXHwUzs.join(":"); break;
default: return { error: true, details: `Invalid _denBfCcC _cYgHVtnz: ${_byfbkxXN}` };
}
if (!_yfVauJpZ) return { error: true, details: "Target _WXrFbaSJ is empty" };
return { error: false, details: { _yfVauJpZ, _MMIquAzW, _rTegwfyF, payloadIndex: _RCKlOeHQ + _znROEorX } };
}
async function _czpPcZxI(_YhKmktPT, _amTXBRSX, _wSKvbxTj, _VjXnWUJu) {
let _cONBfGoS = _wSKvbxTj;
let _FknbvmCF = false;
let _EdcYXcmz = _YhKmktPT._skFmwzFF.pipeTo(new WritableStream({
write(chunk) {
_FknbvmCF = true;
if (_amTXBRSX.readyState !== 1) throw new Error("Channel is not open");
if (_cONBfGoS) {
const _ugZjAzru = new Uint8Array(_cONBfGoS.byteLength + chunk.byteLength);
_ugZjAzru._foLoWWQC(new Uint8Array(_cONBfGoS));
_ugZjAzru._foLoWWQC(new Uint8Array(chunk), _cONBfGoS.byteLength);
_amTXBRSX.send(_ugZjAzru._tkXpHQwc);
_cONBfGoS = null;
} else {
_amTXBRSX.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _amTXBRSX error:", err._rFZPDjIC);
});
await _EdcYXcmz;
if (!_FknbvmCF && _VjXnWUJu) {
_VjXnWUJu();
}
}
function _SnDeksCu(_amTXBRSX) {
try { if (_amTXBRSX.readyState === 1 || _amTXBRSX.readyState === 2) _amTXBRSX.close(); } catch (_IEhrOjLx) {}
}
const _GLrZRDHO = Array.from({ _JoGjJgLm: 256 }, (_, _QlxHsXXs) => (_QlxHsXXs + 256).toString(16).slice(1));
function _ilYDcRAY(_fOzCZLZl, offset = 0) {
return (
_GLrZRDHO[_fOzCZLZl[offset]] + _GLrZRDHO[_fOzCZLZl[offset + 1]] + _GLrZRDHO[_fOzCZLZl[offset + 2]] + _GLrZRDHO[_fOzCZLZl[offset + 3]] + "-" +
_GLrZRDHO[_fOzCZLZl[offset + 4]] + _GLrZRDHO[_fOzCZLZl[offset + 5]] + "-" +
_GLrZRDHO[_fOzCZLZl[offset + 6]] + _GLrZRDHO[_fOzCZLZl[offset + 7]] + "-" +
_GLrZRDHO[_fOzCZLZl[offset + 8]] + _GLrZRDHO[_fOzCZLZl[offset + 9]] + "-" +
_GLrZRDHO[_fOzCZLZl[offset + 10]] + _GLrZRDHO[_fOzCZLZl[offset + 11]] +
_GLrZRDHO[_fOzCZLZl[offset + 12]] + _GLrZRDHO[_fOzCZLZl[offset + 13]] +
_GLrZRDHO[_fOzCZLZl[offset + 14]] + _GLrZRDHO[_fOzCZLZl[offset + 15]]
).toLowerCase();
}
let _zHxvaMjr = { "N/A":"未知" };
async function _obXHshiM(_xnyHYIzb, _OEILSEky, _VjXnWUJu) {
try {
const _VHpiYngw = await fetch(_xnyHYIzb, {
_skdDjFAj: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_VHpiYngw.ok) {
console.error(`获取 ${_xnyHYIzb} 失败: HTTP ${_VHpiYngw.status}`);
return _VjXnWUJu;
}
const _SquPJSls = await _VHpiYngw._SquPJSls();
return _OEILSEky(_SquPJSls);
} catch (error) {
console.error(`获取或解析 ${_xnyHYIzb} 时发生网络错误: ${error._rFZPDjIC}`);
return _VjXnWUJu;
}
}
function _mCjviZeF(_SquPJSls) {
if (!_SquPJSls) return [];
const _JwOkqCsp = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _tjOKoHRJ = _SquPJSls.split(/[\s,;#|]+/);
const _Ndxkypkd = [];
for (const _ICDKEUiu of _tjOKoHRJ) {
const _tmmkfxTA = _ICDKEUiu.trim();
if (!_tmmkfxTA) continue;
const _hbUbVJiB = _tmmkfxTA.lastIndexOf(':');
let _NmEyvHpn = _tmmkfxTA;
if(_hbUbVJiB > _tmmkfxTA.lastIndexOf(']')) {
const _bQyalwYS = _tmmkfxTA.substring(_hbUbVJiB + 1);
if(!isNaN(_bQyalwYS) && _bQyalwYS._JoGjJgLm > 0) {
_NmEyvHpn = _tmmkfxTA.substring(0, _hbUbVJiB);
}
}
if (_nTLReEKV.isValid(_NmEyvHpn.replace(/[\[\]]/g, '')) || _JwOkqCsp.test(_tmmkfxTA)) {
_Ndxkypkd.push(_tmmkfxTA);
}
}
return _Ndxkypkd;
}
function _UlpwNCCQ(_SquPJSls) {
if (!_SquPJSls) return [];
return _SquPJSls.split(/\s+/).filter(d => d.trim() !== '');
}
function _vkuuwKSL(_SquPJSls) {
if (!_SquPJSls) return { "N/A": "未知" };
try {
return JSON.parse(`{${_SquPJSls}}`);
} catch (_IEhrOjLx) {
console.error("解析 _zHxvaMjr 失败:", _IEhrOjLx);
return { "N/A": "未知" };
}
}
const _nTLReEKV = {
isValid: (_jAwlIgeD) => _nTLReEKV.isIPv4(_jAwlIgeD) || _nTLReEKV.isIPv6(_jAwlIgeD),
isIPv4: (_jAwlIgeD) => {
if (typeof _jAwlIgeD !== 'string') return false;
const _bbXHwUzs = _jAwlIgeD.split('.');
if (_bbXHwUzs._JoGjJgLm !== 4) return false;
return _bbXHwUzs.every(_MjMoIZwf => {
const _kiYvppJm = parseInt(_MjMoIZwf, 10);
return !isNaN(_kiYvppJm) && _kiYvppJm >= 0 && _kiYvppJm <= 255 && String(_kiYvppJm) === _MjMoIZwf;
});
},
isIPv6: (_jAwlIgeD) => {
if (typeof _jAwlIgeD !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_QlxHsXXs.test(_jAwlIgeD);
},
toLong4: (_jAwlIgeD) => _jAwlIgeD.split('.').reduce((acc, octet, _QlxHsXXs) => acc + (parseInt(octet) << (8*(3-_QlxHsXXs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_jAwlIgeD) => {
try {
const _lvpgpRNw = _jAwlIgeD.split('/')[0];
const _bbXHwUzs = _lvpgpRNw.split('::');
if (_bbXHwUzs._JoGjJgLm > 2) return 0n;
let _imcjPHiM = [];
if (_bbXHwUzs[0]) {
_imcjPHiM = _bbXHwUzs[0].split(':');
}
let _nkfRkCBT = [];
if (_bbXHwUzs._JoGjJgLm > 1 && _bbXHwUzs[1]) {
_nkfRkCBT = _bbXHwUzs[1].split(':');
}
if (_imcjPHiM._JoGjJgLm + _nkfRkCBT._JoGjJgLm > 8) return 0n;
const _VTMNQBBw = 8 - (_imcjPHiM._JoGjJgLm + _nkfRkCBT._JoGjJgLm);
const _njztiRTF = [
..._imcjPHiM,
...Array(_VTMNQBBw).fill('0'),
..._nkfRkCBT
].map(_MjMoIZwf => _MjMoIZwf || '0');
while(_njztiRTF._JoGjJgLm < 8) {
_njztiRTF.push('0');
}
let _QmkcZuhd = 0n;
for (const _MjMoIZwf of _njztiRTF) {
if (_MjMoIZwf._JoGjJgLm > 4) return 0n;
const _yjraJIiW = BigInt('0x' + _MjMoIZwf);
_QmkcZuhd = (_QmkcZuhd << 16n) | _yjraJIiW;
}
return _QmkcZuhd;
} catch(_IEhrOjLx) {
return 0n;
}
},
fromBigInt6: (_QmkcZuhd) => {
if (typeof _QmkcZuhd !== '_QmkcZuhd' || _QmkcZuhd < 0n) return null;
const _bbXHwUzs = [];
for (let _QlxHsXXs = 0; _QlxHsXXs < 8; _QlxHsXXs++) {
_bbXHwUzs.unshift((_QmkcZuhd & 0xFFFFn).toString(16));
_QmkcZuhd >>= 16n;
}
let _WRpEHkcn = { start: -1, _peOeVQDG: 0 };
let _sXYFTwuo = { start: -1, _peOeVQDG: 0 };
for (let _QlxHsXXs = 0; _QlxHsXXs < 8; _QlxHsXXs++) {
if (_bbXHwUzs[_QlxHsXXs] === '0') {
if (_sXYFTwuo.start === -1) _sXYFTwuo.start = _QlxHsXXs;
_sXYFTwuo._peOeVQDG++;
} else {
if (_sXYFTwuo._peOeVQDG > _WRpEHkcn._peOeVQDG) _WRpEHkcn = { ..._sXYFTwuo };
_sXYFTwuo = { start: -1, _peOeVQDG: 0 };
}
}
if (_sXYFTwuo._peOeVQDG > _WRpEHkcn._peOeVQDG) _WRpEHkcn = { ..._sXYFTwuo };
if (_WRpEHkcn._peOeVQDG > 1) {
_bbXHwUzs.splice(_WRpEHkcn.start, _WRpEHkcn._peOeVQDG, '');
if (_WRpEHkcn.start === 0) _bbXHwUzs.unshift('');
if (_WRpEHkcn.start + _WRpEHkcn._peOeVQDG === 8) _bbXHwUzs.push('');
}
return _bbXHwUzs.join(':');
},
cidrToRange: (cidr, _WglccMDf = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _kLyhxwSX = parseInt(bitsStr, 10);
const _vvXQGUiR = new Set();
if (_nTLReEKV.isIPv4(range)) {
if (isNaN(_kLyhxwSX) || _kLyhxwSX < 8 || _kLyhxwSX > 32) return [];
if (_kLyhxwSX === 32) return [range];
const _mvFKOCJN = _nTLReEKV.toLong4(range);
const _vQvGNUNp = (0xFFFFFFFF << (32 - _kLyhxwSX)) >>> 0;
const _cqLgFWtA = _mvFKOCJN & _vQvGNUNp;
const _IjXLqLvg = 1 << (32 - _kLyhxwSX);
if (_IjXLqLvg <= 2) return [];
const _VNipXLdi = Math.min(_WglccMDf, _IjXLqLvg - 2);
let _XKCHIncT = 0;
while (_vvXQGUiR.size < _VNipXLdi && _XKCHIncT < _VNipXLdi * 5) {
const _nVmCPnvb = Math.floor(Math.random() * (_IjXLqLvg - 2)) + 1;
_vvXQGUiR.add(_nTLReEKV.fromLong4((_cqLgFWtA + _nVmCPnvb) >>> 0));
_XKCHIncT++;
}
return Array.from(_vvXQGUiR);
} else if (_nTLReEKV.isIPv6(range)) {
if (isNaN(_kLyhxwSX) || _kLyhxwSX < 16 || _kLyhxwSX > 128) return [];
if (_kLyhxwSX === 128) return [range];
const _zuXBmWPP = _nTLReEKV.toBigInt6(range);
const _vQvGNUNp = (2n ** BigInt(128 - _kLyhxwSX) - 1n);
const _cqLgFWtA = _zuXBmWPP & ~_vQvGNUNp;
const _ZfVCSKWB = 2n ** BigInt(128 - _kLyhxwSX);
if (_ZfVCSKWB <= 2n) return [];
let _XKCHIncT = 0;
while (_vvXQGUiR.size < _WglccMDf && _XKCHIncT < _WglccMDf * 5) {
const _oLyyNHxN = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_oLyyNHxN);
let _WKByTleb = 0n;
for (const _AFIPAvqC of _oLyyNHxN) {
_WKByTleb = (_WKByTleb << 8n) | BigInt(_AFIPAvqC);
}
const _nVmCPnvb = _WKByTleb % (_ZfVCSKWB - 2n) + 1n;
_vvXQGUiR.add(_nTLReEKV.fromBigInt6(_cqLgFWtA + _nVmCPnvb));
_XKCHIncT++;
}
return Array.from(_vvXQGUiR);
}
return [];
} catch(_IEhrOjLx) {
console.error(`CIDR to range failed for ${cidr}:`, _IEhrOjLx);
return [];
}
}
};
function _ZzVVnzqy(_VPtzsvlC, _mCtTAren) {
const _LhYfLtlD = {};
const _vYerfetY = Object._vYerfetY(_mCtTAren);
const _bbXHwUzs = _vYerfetY.map(_BfGaXxgR => {
const _QtuFBQdb = _VPtzsvlC * (_mCtTAren[_BfGaXxgR] / 100);
return { _BfGaXxgR, _WglccMDf: Math.floor(_QtuFBQdb), remainder: _QtuFBQdb - Math.floor(_QtuFBQdb) };
});
let _fPhepvZg = _bbXHwUzs.reduce((acc, _MjMoIZwf) => acc + _MjMoIZwf._WglccMDf, 0);
_bbXHwUzs.sort((a, b) => b.remainder - a.remainder);
let _QnDAwjKi = _VPtzsvlC - _fPhepvZg;
for (let _QlxHsXXs = 0; _QlxHsXXs < _QnDAwjKi; _QlxHsXXs++) {
_bbXHwUzs[_QlxHsXXs % _bbXHwUzs._JoGjJgLm]._WglccMDf++;
}
for (const _MjMoIZwf of _bbXHwUzs) {
_LhYfLtlD[_MjMoIZwf._BfGaXxgR] = _MjMoIZwf._WglccMDf;
}
return _LhYfLtlD;
}
async function _uRGMGDkQ(_iNbETDOJ) {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_TMlMaVxU);
const { _YHtsypkv } = await _LVQheWsN.all();
return _YHtsypkv._JoGjJgLm > 0 ? _YHtsypkv[0]._yjraJIiW : null;
}
async function _ddPZDJsH(_iNbETDOJ, _jCFiQgRE) {
const _LVQheWsN = _iNbETDOJ.DB.prepare(
"INSERT INTO kv_data (_BfGaXxgR, _yjraJIiW) VALUES (?, ?) ON CONFLICT(_BfGaXxgR) DO UPDATE SET _yjraJIiW = excluded._yjraJIiW"
);
await _LVQheWsN.bind(_TMlMaVxU, _jCFiQgRE).run();
}
async function _IPbKwAWn(_JPetdNTd, _iNbETDOJ) {
const { _jCFiQgRE } = await _JPetdNTd.json();
const _nDoqdwyK = await _uRGMGDkQ(_iNbETDOJ);
if (_nDoqdwyK === _jCFiQgRE) {
return _ZnxjdSwR({ success: true });
}
return _ZnxjdSwR({ success: false, _rFZPDjIC: '密码错误' }, 401);
}
async function _WoIVBoHJ(_JPetdNTd, _iNbETDOJ) {
const _yvgRNesI = await _uQjiTRsw(_iNbETDOJ);
if (!_yvgRNesI.visitorPassword || !_yvgRNesI.visitorPassword._GqxlmxBu) {
return _ZnxjdSwR({ success: true });
}
try {
const { _jCFiQgRE } = await _JPetdNTd.json();
const _FVEwHmaj = _yvgRNesI.visitorPassword._jCFiQgRE;
if (_FVEwHmaj && _jCFiQgRE === _FVEwHmaj) {
return _ZnxjdSwR({ success: true });
}
return _ZnxjdSwR({ success: false, _rFZPDjIC: '访客密码错误' }, 401);
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: '无效请求' }, 400);
}
}
async function _VQTXWIfW(_JPetdNTd, _iNbETDOJ) {
const _ZxCrhIGR = await _uRGMGDkQ(_iNbETDOJ);
if (_ZxCrhIGR) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: "密码已设置,无法重复初始化。" }, 403);
}
const { _jCFiQgRE } = await _JPetdNTd.json();
if (!_jCFiQgRE || _jCFiQgRE._JoGjJgLm < 6) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: "密码长度不能少于6位。" }, 400);
}
await _ddPZDJsH(_iNbETDOJ, _jCFiQgRE);
return _ZnxjdSwR({ success: true, _rFZPDjIC: "初始密码设置成功!请刷新页面并登录。" });
}
async function _cOXKVuAn(_JPetdNTd, _iNbETDOJ) {
const { _AZQpItsp, _WulPlBCB } = await _JPetdNTd.json();
const _nDoqdwyK = await _uRGMGDkQ(_iNbETDOJ);
if (_nDoqdwyK !== _AZQpItsp) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: "旧密码错误。" }, 403);
}
if (!_WulPlBCB || _WulPlBCB._JoGjJgLm < 6) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: "新密码长度不能少于6位。" }, 400);
}
await _ddPZDJsH(_iNbETDOJ, _WulPlBCB);
return _ZnxjdSwR({ success: true, _rFZPDjIC: "密码修改成功!" });
}
function _raevGcwV() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_NECIuZxM: '',
api: {
_GqxlmxBu: true,
_rFZPDjIC: '维护中...',
},
ispFilter: { _GqxlmxBu: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_GqxlmxBu: true
},
websocketStreamer: {
_GqxlmxBu: true,
_xnyHYIzb: 'https://snippets.neib.cn'
},
cloudStorage: {
_GqxlmxBu: true
},
visitorPassword: {
_GqxlmxBu: false,
_jCFiQgRE: '',
},
customSubPath: {
_GqxlmxBu: false,
_atPIzTsm: 'latest',
},
subscriptionId: {
_JoGjJgLm: 8,
_emrySbDR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_GqxlmxBu: true,
template: 'vless://{_lRlYIfgY}@{_jAwlIgeD}:{_SADXxFkD}?encryption=none&security=tls&sni={_WXrFbaSJ}&fp=random&_cYgHVtnz=ws&_WXrFbaSJ={_WXrFbaSJ}&_atPIzTsm={_atPIzTsm}#{_menmgQPN}',
selectionMode: 'first',
_ATlQBTOC: [
{ _menmgQPN: '默认配置', _WXrFbaSJ: '', '_lRlYIfgY': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _atPIzTsm: '/?ed=2560' }
],
_tjalOuBn: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_GqxlmxBu: false,
_SquPJSls: '',
_QwQGPdEl: 5
},
marquee: {
_GqxlmxBu: false,
_SquPJSls: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_GqxlmxBu: true,
sources: [
{ _mwIaMLpg: 'CF官方IPV4', _vvXQGUiR: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 20 },
{ _mwIaMLpg: 'CF官方IPV6', _vvXQGUiR: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 20 },
{ _mwIaMLpg: '反代优选0', _vvXQGUiR: 'https://wvs.sosorg.nyc.mn/sub?_lRlYIfgY=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_cYgHVtnz=ws&_WXrFbaSJ=ss.nzvrn.com&_atPIzTsm=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 30 },
{ _mwIaMLpg: '官方优选1', _vvXQGUiR: 'https://ipdb.api.030101.xyz/?_cYgHVtnz=bestcf&_pJuKLUwl=true', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 10 },
{ _mwIaMLpg: '反代优选2', _vvXQGUiR: 'https://ipdb.api.030101.xyz/?_cYgHVtnz=bestproxy&_pJuKLUwl=true', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 5 },
{ _mwIaMLpg: '官方优选2', _vvXQGUiR: 'https://addressesapi.090227.xyz/_jAwlIgeD.164746.xyz', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 10 },
{ _mwIaMLpg: '官方优选3', _vvXQGUiR: 'https://cfxr.eu.org/getSub?_WXrFbaSJ=snipaste.huggy.qzz.io', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 5 },
{ _mwIaMLpg: '官方优选4', _vvXQGUiR: 'https://addressesapi.090227.xyz/CloudFlareYes', _ZZADJTWq: false, _GqxlmxBu: true, _PSZgwgFJ: 10 }
]
},
customNodes: {
_GqxlmxBu: false,
list: ''
},
texts: {
title: 'Cloudflare IP',
loginButton: '登录',
loginButtonSuccess: '修改参数',
appDownloadTitle: 'APP 下载',
liveTitle: '本次优选结果',
cachedTitle: '上次优选结果',
tableHeader1: '排名',
tableHeader2: 'IP地址',
tableHeader3: '端口',
tableHeader4: '延迟(ms)',
tableHeader5: '归属地',
tableHeader6: '运营商',
tableHeader7: '操作',
pingInProgress: '测试中',
},
colors: {
title: '#FFFFFF',
loginButton: '#E0E0E0',
liveTitle: '#E0E0E0',
cachedTitle: '#E0E0E0',
tableHeader: '#B0B0B0',
},
telegram: {
bot_token: '',
chat_id: '',
},
};
}
function _hubDQYcQ(_ZYLgzmXe, _AbOQPUGp) {
if (!_ZYLgzmXe) return _AbOQPUGp;
const _xHeQqaaV = { ..._AbOQPUGp };
for (const _BfGaXxgR in _AbOQPUGp) {
if (_ZYLgzmXe.hasOwnProperty(_BfGaXxgR)) {
if (typeof _ZYLgzmXe[_BfGaXxgR] === 'object' && _ZYLgzmXe[_BfGaXxgR] !== null && !Array.isArray(_ZYLgzmXe[_BfGaXxgR]) && typeof _AbOQPUGp[_BfGaXxgR] === 'object' && _AbOQPUGp[_BfGaXxgR] !== null && !Array.isArray(_AbOQPUGp[_BfGaXxgR])) {
_xHeQqaaV[_BfGaXxgR] = _hubDQYcQ(_ZYLgzmXe[_BfGaXxgR], _AbOQPUGp[_BfGaXxgR]);
} else {
_xHeQqaaV[_BfGaXxgR] = _ZYLgzmXe[_BfGaXxgR];
}
}
}
return _xHeQqaaV;
}
async function _uQjiTRsw(_iNbETDOJ) {
try {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_xEMQgKoA);
const { _YHtsypkv } = await _LVQheWsN.all();
const _AnkQLMVe = _YHtsypkv._JoGjJgLm > 0 ? _YHtsypkv[0]._yjraJIiW : null;
const _DMnyOlpj = _AnkQLMVe ? JSON.parse(_AnkQLMVe) : {};
return _hubDQYcQ(_DMnyOlpj, _raevGcwV());
} catch (_IEhrOjLx) {
console.error("无法从D1获取或解析全局配置:", _IEhrOjLx);
return _raevGcwV();
}
}
async function _XbkFKMiw(_iNbETDOJ) {
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
return _ZnxjdSwR(_gcynLpiH);
}
async function _LqnyDjmR(_JPetdNTd, _iNbETDOJ, _vscvGUTk) {
try {
const { _gcynLpiH, adminPassword } = await _JPetdNTd.json();
const _nDoqdwyK = await _uRGMGDkQ(_iNbETDOJ);
if (_nDoqdwyK !== adminPassword) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: "管理员密码错误" }, 403);
}
const _LVQheWsN = _iNbETDOJ.DB.prepare(
"INSERT INTO kv_data (_BfGaXxgR, _yjraJIiW) VALUES (?, ?) ON CONFLICT(_BfGaXxgR) DO UPDATE SET _yjraJIiW = excluded._yjraJIiW"
);
const _ciJFkhNv = _LVQheWsN.bind(_xEMQgKoA, JSON.stringify(_gcynLpiH)).run();
_vscvGUTk.waitUntil(_ciJFkhNv);
return _ZnxjdSwR({ success: true, _rFZPDjIC: "配置已成功保存!" });
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ success: false, _rFZPDjIC: `保存失败: ${_IEhrOjLx._rFZPDjIC}` }, 500);
}
}
async function _qMrClpuR() {
const _dxXOFVOE = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _IQSAHEEm = await fetch(_dxXOFVOE);
const _nfYWBOuE = await _IQSAHEEm.json();
const _clCybOLQ = 'https://www.bing.com' + _nfYWBOuE.images[0]._xnyHYIzb;
return fetch(_clCybOLQ);
} catch (_IEhrOjLx) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _gRcRrxXH(_jAwlIgeD) {
try {
const _VHpiYngw = await fetch(`http://_jAwlIgeD-api.com/json/${_jAwlIgeD}?fields=status,_pJuKLUwl,countryCode,_qEQOndrv&lang=zh-CN`);
if (_VHpiYngw.ok) {
const _VKuCcQUN = await _VHpiYngw.json();
if (_VKuCcQUN.status === 'success' && (_VKuCcQUN.countryCode || _VKuCcQUN._pJuKLUwl)) {
let _qEQOndrv = _VKuCcQUN._qEQOndrv || '未知';
if (_qEQOndrv.toLowerCase().includes('cloudflare')) {
_qEQOndrv = 'CloudFlare';
}
return {
_mwIaMLpg: _zHxvaMjr[_VKuCcQUN.countryCode] || _VKuCcQUN._pJuKLUwl || _VKuCcQUN.countryCode,
_qEQOndrv: _qEQOndrv
};
}
}
} catch (_IEhrOjLx) {}
try {
const _VHpiYngw = await fetch(`https://api._jAwlIgeD.sb/geoip/${_jAwlIgeD}`);
if (_VHpiYngw.ok) {
const _VKuCcQUN = await _VHpiYngw.json();
if (_VKuCcQUN.country_code || _VKuCcQUN._pJuKLUwl) {
let _qEQOndrv = _VKuCcQUN._qEQOndrv || '未知';
if (_qEQOndrv.toLowerCase().includes('cloudflare')) {
_qEQOndrv = 'CloudFlare';
}
return {
_mwIaMLpg: _zHxvaMjr[_VKuCcQUN.country_code] || _VKuCcQUN._pJuKLUwl || _VKuCcQUN.country_code,
_qEQOndrv: _qEQOndrv
};
}
}
} catch (_IEhrOjLx) {}
return { _mwIaMLpg: '未知', _qEQOndrv: '未知' };
}
async function _hDJTvgzU(_JPetdNTd, _iNbETDOJ) {
try {
const { _vvXQGUiR } = await _JPetdNTd.json();
if (!Array.isArray(_vvXQGUiR)) {
return _ZnxjdSwR({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _uReywtSk = _vvXQGUiR.map(_jAwlIgeD => _gRcRrxXH(_jAwlIgeD).then(_ypEORTXI => ({ _jAwlIgeD, ..._ypEORTXI })));
const _YHtsypkv = await Promise.all(_uReywtSk);
return _ZnxjdSwR(_YHtsypkv);
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ error: `获取地理位置失败: ${_IEhrOjLx._rFZPDjIC}` }, 500);
}
}
async function _BldIqcmR(_JPetdNTd, _iNbETDOJ) {
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (!_gcynLpiH.cloudStorage._GqxlmxBu) {
return _ZnxjdSwR({ _YHtsypkv: [], generatedBy: null });
}
try {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_HWtRAxvq);
const { _YHtsypkv } = await _LVQheWsN.all();
const _dcBKkMNZ = _YHtsypkv._JoGjJgLm > 0 ? _YHtsypkv[0]._yjraJIiW : null;
const _liAzqtvb = _dcBKkMNZ ? JSON.parse(_dcBKkMNZ) : null;
return _ZnxjdSwR(_liAzqtvb || { _YHtsypkv: [], generatedBy: null });
} catch (_IEhrOjLx) {
console.error("从D1读取缓存IP失败:", _IEhrOjLx);
return _ZnxjdSwR({ _YHtsypkv: [], generatedBy: null });
}
}
async function _uQRBizjR(_JPetdNTd, _iNbETDOJ, _vscvGUTk) {
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (!_gcynLpiH.cloudStorage._GqxlmxBu) {
return _ZnxjdSwR({ success: true, _rFZPDjIC: "云端存储已禁用,不保存结果。" });
}
const _wiOyVIQm = _JPetdNTd._skdDjFAj.get('CF-Connecting-IP') || "未知IP";
const _pJuKLUwl = _JPetdNTd.cf?._pJuKLUwl || "未知";
const _SkeZuQBC = _JPetdNTd.cf?._SkeZuQBC || "";
let _UJGhDaPT = _zHxvaMjr[_pJuKLUwl] || _pJuKLUwl;
if (_SkeZuQBC && _SkeZuQBC !== "未知城市" && _SkeZuQBC !== _pJuKLUwl) _UJGhDaPT = `${_UJGhDaPT} ${_zHxvaMjr[_SkeZuQBC] || _SkeZuQBC}`;
const _VaWoyDIc = {
_jAwlIgeD: _qbbFXgSK(_wiOyVIQm),
_mwIaMLpg: _UJGhDaPT.trim(),
time: _LwheviAQ()
};
try {
const _JzqpCAlK = await _JPetdNTd.json();
if (!Array.isArray(_JzqpCAlK)) return _ZnxjdSwR({ error: "无效数据格式" }, 400);
const _IQsuPVBc = _JzqpCAlK.map(_jPNCvklF => ({
_jAwlIgeD: String(_jPNCvklF._jAwlIgeD || ''),
_SADXxFkD: _jPNCvklF._SADXxFkD ? parseInt(_jPNCvklF._SADXxFkD, 10) : undefined,
_bMuhWeBp: parseInt(_jPNCvklF._bMuhWeBp, 10),
_mwIaMLpg: typeof _jPNCvklF._mwIaMLpg === 'string' ? _jPNCvklF._mwIaMLpg.substring(0, 50) : 'N/A',
_qEQOndrv: typeof _jPNCvklF._qEQOndrv === 'string' ? _jPNCvklF._qEQOndrv.substring(0, 100) : 'N/A'
}));
const _IfZzJEQq = {
generatedBy: _VaWoyDIc,
_YHtsypkv: _IQsuPVBc
};
const _mBMIBxMn = _iNbETDOJ.DB.prepare(
"INSERT INTO kv_data (_BfGaXxgR, _yjraJIiW) VALUES (?, ?) ON CONFLICT(_BfGaXxgR) DO UPDATE SET _yjraJIiW = excluded._yjraJIiW"
).bind(_HWtRAxvq, JSON.stringify(_IfZzJEQq)).run();
if (_gcynLpiH.telegram.bot_token && _gcynLpiH.telegram.chat_id) {
const _WHvSLJgC = _IQsuPVBc.map(r => `${r._jAwlIgeD} ~ ${r._mwIaMLpg}`).join('\n');
const _YYxrmrKH = `优选完成!\n来源: ${_VaWoyDIc._jAwlIgeD} (${_VaWoyDIc._mwIaMLpg})\n时间: ${_VaWoyDIc.time}\n\n结果:\n${_WHvSLJgC}`;
const _gAmDzuNg = `https://api.telegram.org/bot${_gcynLpiH.telegram.bot_token}/sendMessage?chat_id=${_gcynLpiH.telegram.chat_id}&_SquPJSls=${encodeURIComponent(_YYxrmrKH)}`;
const _qZAajnRZ = fetch(_gAmDzuNg).catch(_IEhrOjLx => console.error("Telegram结果通知失败:", _IEhrOjLx));
_vscvGUTk.waitUntil(Promise.all([_mBMIBxMn, _qZAajnRZ]));
} else {
_vscvGUTk.waitUntil(_mBMIBxMn);
}
return _ZnxjdSwR({ success: true, _rFZPDjIC: "结果已保存" });
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ error: "D1写入失败", _rFZPDjIC: _IEhrOjLx._rFZPDjIC }, 500);
}
}
async function _NRfeJyjJ(_JPetdNTd, _iNbETDOJ, _vscvGUTk) {
try {
const _jQhGaAjH = await _JPetdNTd.json();
if (!Array.isArray(_jQhGaAjH)) return _ZnxjdSwR({ error: "无效数据格式" }, 400);
const _IfZzJEQq = {
_YHtsypkv: _jQhGaAjH
};
const _LVQheWsN = _iNbETDOJ.DB.prepare(
"INSERT INTO kv_data (_BfGaXxgR, _yjraJIiW) VALUES (?, ?) ON CONFLICT(_BfGaXxgR) DO UPDATE SET _yjraJIiW = excluded._yjraJIiW"
);
const _ciJFkhNv = _LVQheWsN.bind(_NYhaYnkU, JSON.stringify(_IfZzJEQq)).run();
_vscvGUTk.waitUntil(_ciJFkhNv);
return _ZnxjdSwR({ success: true });
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ error: "D1写入临时缓存失败", _rFZPDjIC: _IEhrOjLx._rFZPDjIC }, 500);
}
}
function _HclXxIyG(_JoGjJgLm, _emrySbDR) {
let _FxhFwhmT = '';
const _dAequMZx = _emrySbDR._JoGjJgLm;
for (let _QlxHsXXs = 0; _QlxHsXXs < _JoGjJgLm; _QlxHsXXs++) {
_FxhFwhmT += _emrySbDR.charAt(Math.floor(Math.random() * _dAequMZx));
}
return _FxhFwhmT;
}
async function _nRYwByVG(_JPetdNTd, _iNbETDOJ) {
try {
const _JzqpCAlK = await _JPetdNTd.json();
if (!Array.isArray(_JzqpCAlK) || _JzqpCAlK._JoGjJgLm === 0) {
return _ZnxjdSwR({ error: "无效或空的IP列表" }, 400);
}
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
const _OAuvaDng = _gcynLpiH.subscriptionId || { _JoGjJgLm: 8, _emrySbDR: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _qhwfZnKn;
let _ufaWSzbb = false;
let _XKCHIncT = 0;
const _HdIHiYhl = 10;
while (!_ufaWSzbb && _XKCHIncT < _HdIHiYhl) {
_qhwfZnKn = _HclXxIyG(_OAuvaDng._JoGjJgLm, _OAuvaDng._emrySbDR);
const { _YHtsypkv } = await _iNbETDOJ.DB.prepare("SELECT _IKtrpYVv FROM optimized_results WHERE _IKtrpYVv = ?").bind(_qhwfZnKn).all();
if (_YHtsypkv._JoGjJgLm === 0) {
_ufaWSzbb = true;
}
_XKCHIncT++;
}
if (!_ufaWSzbb) {
return _ZnxjdSwR({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _tlJLozuP = JSON.stringify({ _vvXQGUiR: _JzqpCAlK });
await _iNbETDOJ.DB.prepare(
"INSERT INTO optimized_results (_IKtrpYVv, _VKuCcQUN) VALUES (?, ?)"
).bind(_qhwfZnKn, _tlJLozuP).run();
await _iNbETDOJ.DB.prepare(
"INSERT INTO kv_data (_BfGaXxgR, _yjraJIiW) VALUES (?, ?) ON CONFLICT(_BfGaXxgR) DO UPDATE SET _yjraJIiW = excluded._yjraJIiW"
).bind(_NdwDXgKC, _qhwfZnKn).run();
return _ZnxjdSwR({ success: true, _IKtrpYVv: _qhwfZnKn });
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ error: "保存优选结果失败", _rFZPDjIC: _IEhrOjLx._rFZPDjIC }, 500);
}
}
async function _eZBTxolj(_JPetdNTd, _iNbETDOJ) {
try {
const _qhwfZnKn = _JPetdNTd._sCFVOlUS._IKtrpYVv;
if (!_qhwfZnKn) {
return new Response("缺少结果ID", { status: 400 });
}
const _FxhFwhmT = await _iNbETDOJ.DB.prepare("SELECT _VKuCcQUN FROM optimized_results WHERE _IKtrpYVv = ?").bind(_qhwfZnKn).first();
if (!_FxhFwhmT) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _VKuCcQUN = JSON.parse(_FxhFwhmT._VKuCcQUN);
let _WHvSLJgC = _VKuCcQUN._vvXQGUiR;
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (_gcynLpiH.customNodes && _gcynLpiH.customNodes._GqxlmxBu && _gcynLpiH.customNodes.list) {
const _saHLZxWC = _gcynLpiH.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _WBtWFudV = _saHLZxWC.map(_rAtpxMjL => {
let _denBfCcC = _rAtpxMjL;
let _SADXxFkD = undefined;
let _menmgQPN = null;
if (_denBfCcC.includes('@')) {
const _bbXHwUzs = _denBfCcC.split('@');
_menmgQPN = _bbXHwUzs.pop();
_denBfCcC = _bbXHwUzs.join('@');
}
if (_denBfCcC.includes('#')) {
const _bbXHwUzs = _denBfCcC.split('#');
const _bQyalwYS = _bbXHwUzs.pop();
if (!isNaN(_bQyalwYS) && _bQyalwYS.trim() !== '') {
_SADXxFkD = parseInt(_bQyalwYS, 10);
}
_denBfCcC = _bbXHwUzs.join('#');
}
return {
_jAwlIgeD: _denBfCcC,
_SADXxFkD: _SADXxFkD,
_mwIaMLpg: _menmgQPN || _denBfCcC,
_qEQOndrv: '自定义'
};
});
_WHvSLJgC.unshift(..._WBtWFudV);
}
const { itemLink } = _gcynLpiH;
const _KNnNvpbY = new URL(_JPetdNTd._xnyHYIzb)._GkRYaraU;
let _YENyWiDo;
if (_gcynLpiH.websocketStreamer && _gcynLpiH.websocketStreamer._GqxlmxBu) {
if (!itemLink || !itemLink._GqxlmxBu || !itemLink._ATlQBTOC || itemLink._ATlQBTOC._JoGjJgLm === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_YENyWiDo = _WHvSLJgC.map((_jPNCvklF, _wPIDZJsn) => {
let _menmgQPN;
if (_jPNCvklF._qEQOndrv === '自定义') {
_menmgQPN = `${_wPIDZJsn + 1} - ${_jPNCvklF._mwIaMLpg}`;
} else {
_menmgQPN = `${_wPIDZJsn + 1} - ${_jPNCvklF._mwIaMLpg || '未知'}`;
if (!_jPNCvklF._qEQOndrv || !_jPNCvklF._qEQOndrv.toLowerCase().includes('cloudflare')) {
_menmgQPN += '(反代)';
}
}
const _fLfKRwGq = _nTLReEKV.isIPv6(_jPNCvklF._jAwlIgeD) ? `[${_jPNCvklF._jAwlIgeD}]` : _jPNCvklF._jAwlIgeD;
const _SADXxFkD = _jPNCvklF._SADXxFkD || 443;
const _LDMjYtet = itemLink._ATlQBTOC[0];
const _kNtsLpXl = _LDMjYtet._lRlYIfgY || '';
const _lRlYIfgY = (_kNtsLpXl && _OiWtPAzg(_kNtsLpXl)) ? _kNtsLpXl : crypto.randomUUID();
const _atPIzTsm = '/snippets?_jAwlIgeD=endpointAddress:_SADXxFkD(443)&nat64=6to4';
const _WXrFbaSJ = _LDMjYtet._WXrFbaSJ || _KNnNvpbY;
const _sCFVOlUS = new URLSearchParams({
security: 'tls',
_cYgHVtnz: 'ws',
_WXrFbaSJ: _WXrFbaSJ,
sni: _WXrFbaSJ,
fp: 'random'
});
return `vless://${_lRlYIfgY}@${_fLfKRwGq}:${_SADXxFkD}?${_sCFVOlUS.toString()}&_atPIzTsm=${encodeURIComponent(encodeURIComponent(_atPIzTsm))}#${encodeURIComponent(_menmgQPN)}`;
});
} else {
if (!itemLink || !itemLink._GqxlmxBu || !itemLink._ATlQBTOC || itemLink._ATlQBTOC._JoGjJgLm === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _LDMjYtet = itemLink._ATlQBTOC[0];
const { _WXrFbaSJ, _lRlYIfgY, _atPIzTsm } = _LDMjYtet;
_YENyWiDo = _WHvSLJgC.map((_jPNCvklF, _wPIDZJsn) => {
let _menmgQPN;
if (_jPNCvklF._qEQOndrv === '自定义') {
_menmgQPN = `${_wPIDZJsn + 1} - ${_jPNCvklF._mwIaMLpg}`;
} else {
_menmgQPN = `${_wPIDZJsn + 1} - ${_jPNCvklF._mwIaMLpg || '未知'}`;
if (!_jPNCvklF._qEQOndrv || !_jPNCvklF._qEQOndrv.toLowerCase().includes('cloudflare')) {
_menmgQPN += '(反代)';
}
}
const _fLfKRwGq = _nTLReEKV.isIPv6(_jPNCvklF._jAwlIgeD) ? `[${_jPNCvklF._jAwlIgeD}]` : _jPNCvklF._jAwlIgeD;
const _SADXxFkD = _jPNCvklF._SADXxFkD || 443;
const _sCFVOlUS = new URLSearchParams({
security: 'tls',
_cYgHVtnz: 'ws',
_WXrFbaSJ: _WXrFbaSJ || _KNnNvpbY,
sni: _WXrFbaSJ || _KNnNvpbY,
fp: 'random'
});
return `vless://${_lRlYIfgY}@${_fLfKRwGq}:${_SADXxFkD}?${_sCFVOlUS.toString()}&_atPIzTsm=${encodeURIComponent(encodeURIComponent(_atPIzTsm || ''))}#${encodeURIComponent(_menmgQPN)}`;
});
}
const _oYjYQbXh = _YENyWiDo.join('\n');
const _IkgnZRsy = btoa(_oYjYQbXh);
return new Response(_IkgnZRsy, {
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' }
});
} catch (_IEhrOjLx) {
return new Response(`生成节点列表失败: ${_IEhrOjLx._rFZPDjIC}`, { status: 500 });
}
}
async function _DgbecDQL(_JPetdNTd) {
try {
const { _NofITfPK, _cYgHVtnz } = await _JPetdNTd.json();
if (!Array.isArray(_NofITfPK)) {
return new Response('Invalid _NofITfPK list', { status: 400 });
}
const _amuEDoLr = _NofITfPK.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _xnyHYIzb = `https://cloudflare-dns.com/dns-query?_menmgQPN=${encodeURIComponent(domain.trim())}&_cYgHVtnz=${_cYgHVtnz || 'A'}`;
return fetch(_xnyHYIzb, { _skdDjFAj: { 'Accept': 'application/dns-json' } })
.then(_VHpiYngw => _VHpiYngw.json())
.then(_VKuCcQUN => (_VKuCcQUN.Answer ? _VKuCcQUN.Answer.map(a => a._VKuCcQUN) : []))
.catch(() => []);
});
const _cmERCAkF = (await Promise.all(_amuEDoLr)).flat();
const _eKeLmEsu = [...new Set(_cmERCAkF)];
if (_eKeLmEsu._JoGjJgLm === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_eKeLmEsu.join('\n'), { _skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._rFZPDjIC}`, { status: 500 });
}
}
async function _JkcRaSHn(_JPetdNTd, _iNbETDOJ) {
try {
const { _RkxWqceQ } = await _JPetdNTd.json();
if (!Array.isArray(_RkxWqceQ)) {
return _ZnxjdSwR({ error: "Invalid input, expected an object with a '_RkxWqceQ' array." }, 400);
}
const _lsczpTII = new Set();
const _nFBdmHsV = _RkxWqceQ.map(_xnyHYIzb =>
_JRBfwyoH(_xnyHYIzb)
.then(_SquPJSls => {
if (!_SquPJSls) return;
const _tjOKoHRJ = _SquPJSls.split(/[\s,;|]+/);
for (const _ICDKEUiu of _tjOKoHRJ) {
const _tmmkfxTA = _ICDKEUiu.trim();
if (_tmmkfxTA) {
_lsczpTII.add(_tmmkfxTA);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_xnyHYIzb}:`, err);
})
);
await Promise.all(_nFBdmHsV);
return _ZnxjdSwR({ _vvXQGUiR: Array.from(_lsczpTII) });
} catch (_IEhrOjLx) {
return _ZnxjdSwR({ error: `Failed to process URLs: ${_IEhrOjLx._rFZPDjIC}` }, 500);
}
}
async function _gYGIGOxF(_JPetdNTd, _iNbETDOJ) {
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (!_gcynLpiH.api._GqxlmxBu) {
return new Response(_gcynLpiH.api._rFZPDjIC || 'API is disabled.', { status: 503 });
}
try {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_HWtRAxvq);
const { _YHtsypkv: dbResults } = await _LVQheWsN.all();
const _dcBKkMNZ = dbResults._JoGjJgLm > 0 ? dbResults[0]._yjraJIiW : null;
const _liAzqtvb = _dcBKkMNZ ? JSON.parse(_dcBKkMNZ) : null;
if (!_liAzqtvb || !_liAzqtvb._YHtsypkv || _liAzqtvb._YHtsypkv._JoGjJgLm === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' },
});
}
const _vvXQGUiR = _liAzqtvb._YHtsypkv.map(r => r._jAwlIgeD);
return new Response(_vvXQGUiR.join('\n'), {
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' },
});
} catch (_IEhrOjLx) {
console.error("API /_jAwlIgeD 处理错误:", _IEhrOjLx);
return new Response(`API处理时出错: ${_IEhrOjLx._rFZPDjIC}`, { status: 500 });
}
}
function _wgIbuPzi(_FxhFwhmT, _wPIDZJsn, _gcynLpiH, _KNnNvpbY) {
const { itemLink } = _gcynLpiH;
if (!itemLink || !itemLink._GqxlmxBu) return null;
const { template, _ATlQBTOC, selectionMode, _tjalOuBn } = itemLink;
if (!_ATlQBTOC || _ATlQBTOC._JoGjJgLm === 0) return null;
let _lVUCfFjM;
if (selectionMode === 'random') {
_lVUCfFjM = _ATlQBTOC[_wPIDZJsn % _ATlQBTOC._JoGjJgLm];
} else if (selectionMode === 'first') {
_lVUCfFjM = _ATlQBTOC[0];
} else {
_lVUCfFjM = _ATlQBTOC.find(s => s._menmgQPN === selectionMode) || _ATlQBTOC[0];
}
if (!_lVUCfFjM) return null;
let _vpEUaRpE = template;
const _yUkhvOBX = _FxhFwhmT._SADXxFkD || 443;
const _pvvqGEDC = _nTLReEKV.isIPv6(_FxhFwhmT._jAwlIgeD) ? `[${_FxhFwhmT._jAwlIgeD}]` : _FxhFwhmT._jAwlIgeD;
let _menmgQPN = `${_wPIDZJsn + 1} 、 ${_FxhFwhmT._mwIaMLpg || '未知'}`;
if (!_FxhFwhmT._qEQOndrv || !_FxhFwhmT._qEQOndrv.toLowerCase().includes('cloudflare')) {
_menmgQPN += '(反代)';
}
let _WXrFbaSJ = _lVUCfFjM._WXrFbaSJ || _KNnNvpbY;
_vpEUaRpE = _vpEUaRpE.replace(/{_jAwlIgeD}/g, _pvvqGEDC)
.replace(/{_SADXxFkD}/g, _yUkhvOBX)
.replace(/{_menmgQPN}/g, encodeURIComponent(_menmgQPN))
.replace(/{rank}/g, _wPIDZJsn + 1)
.replace(/{_mwIaMLpg}/g, encodeURIComponent(_FxhFwhmT._mwIaMLpg || '未知'))
.replace(/{_qEQOndrv}/g, encodeURIComponent(_FxhFwhmT._qEQOndrv || '未知'))
.replace(/{_WXrFbaSJ}/g, encodeURIComponent(_WXrFbaSJ))
.replace(/{_lRlYIfgY}/g, encodeURIComponent(_lVUCfFjM['_lRlYIfgY'] || ''))
.replace(/{_atPIzTsm}/g, encodeURIComponent(encodeURIComponent(_lVUCfFjM._atPIzTsm || '')));
if (_tjalOuBn) {
_tjalOuBn.forEach(field => {
const _jrOblrzR = new RegExp('{' + field._menmgQPN + '}', 'g');
_vpEUaRpE = _vpEUaRpE.replace(_jrOblrzR, encodeURIComponent(field._yjraJIiW));
});
}
return _vpEUaRpE;
}
async function _nwjMRcEI(_JPetdNTd, _iNbETDOJ) {
const _gcynLpiH = await _uQjiTRsw(_iNbETDOJ);
if (!_gcynLpiH.itemLink._GqxlmxBu) {
return new Response("Item _vpEUaRpE feature is disabled.", { status: 503, _skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' } });
}
try {
const _LVQheWsN = _iNbETDOJ.DB.prepare("SELECT _yjraJIiW FROM kv_data WHERE _BfGaXxgR = ?").bind(_HWtRAxvq);
const { _YHtsypkv: dbResults } = await _LVQheWsN.all();
const _dcBKkMNZ = dbResults._JoGjJgLm > 0 ? dbResults[0]._yjraJIiW : null;
const _liAzqtvb = _dcBKkMNZ ? JSON.parse(_dcBKkMNZ) : null;
if (!_liAzqtvb || !_liAzqtvb._YHtsypkv || _liAzqtvb._YHtsypkv._JoGjJgLm === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' },
});
}
const _KNnNvpbY = new URL(_JPetdNTd._xnyHYIzb)._GkRYaraU;
const _eCRskcNd = _liAzqtvb._YHtsypkv.map((_FxhFwhmT, _wPIDZJsn) => {
return _wgIbuPzi(_FxhFwhmT, _wPIDZJsn, _gcynLpiH, _KNnNvpbY);
}).filter(Boolean);
if (_eCRskcNd._JoGjJgLm === 0) {
return new Response("Could not generate any _jPNCvklF links from the available IPs.", {
status: 500,
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' },
});
}
return new Response(_eCRskcNd.join('\n'), {
_skdDjFAj: { 'Content-Type': '_SquPJSls/plain; _emrySbDR=utf-8' },
});
} catch (_IEhrOjLx) {
console.error("API /api/endpoints error:", _IEhrOjLx);
return new Response(`Error processing API _JPetdNTd: ${_IEhrOjLx._rFZPDjIC}`, { status: 500 });
}
}
async function _HLCILLkO(_JPetdNTd, _iNbETDOJ, _vscvGUTk) {
const _wiOyVIQm = _JPetdNTd._skdDjFAj.get('CF-Connecting-IP') || "未知IP";
const [
_pybihBbs,
_wdQICujh,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_obXHshiM(_OrZFUQYR, _mCjviZeF, []),
_obXHshiM(_iAuIFADd, _mCjviZeF, []),
_obXHshiM(_mQvbbvdG, _UlpwNCCQ, []),
_obXHshiM(_xatZLdiJ, _vkuuwKSL, { "N/A": "未知" })
]);
_zHxvaMjr = fetchedCountryMap;
let _FRGpzlOu = false;
let _yvgRNesI;
try {
const _jCFiQgRE = await _uRGMGDkQ(_iNbETDOJ);
_FRGpzlOu = !!_jCFiQgRE;
_yvgRNesI = await _uQjiTRsw(_iNbETDOJ);
} catch (_IEhrOjLx) {
if (_IEhrOjLx._rFZPDjIC && _IEhrOjLx._rFZPDjIC.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _nwzNkujf = "CREATE TABLE IF NOT EXISTS kv_data (_BfGaXxgR TEXT PRIMARY KEY, _yjraJIiW TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_IKtrpYVv TEXT PRIMARY KEY, _VKuCcQUN TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _iNbETDOJ.DB.exec(_nwzNkujf);
console.log("数据表创建成功。");
_FRGpzlOu = false;
_yvgRNesI = _raevGcwV();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._rFZPDjIC}`, {
status: 500,
_skdDjFAj: { 'Content-Type': '_SquPJSls/html;_emrySbDR=UTF-8' }
});
}
} else {
let _LPfmWDcX = _zpDRcOZY(_IEhrOjLx._rFZPDjIC);
return new Response(_LPfmWDcX, { _skdDjFAj: { 'Content-Type': '_SquPJSls/html;_emrySbDR=UTF-8' } });
}
}
if (_yvgRNesI.telegram.bot_token && _yvgRNesI.telegram.chat_id) {
const _pJuKLUwl = _JPetdNTd.cf?._pJuKLUwl || "未知";
const _SkeZuQBC = _JPetdNTd.cf?._SkeZuQBC || "";
let _UJGhDaPT = _zHxvaMjr[_pJuKLUwl] || _pJuKLUwl;
if (_SkeZuQBC && _SkeZuQBC !== "未知城市" && _SkeZuQBC !== _pJuKLUwl) _UJGhDaPT = `${_UJGhDaPT} ${_zHxvaMjr[_SkeZuQBC] || _SkeZuQBC}`;
const _DvOzlqXa = _LwheviAQ();
const _xvnmnSbG = _JPetdNTd._xnyHYIzb;
const _YYxrmrKH = `访客: ${_wiOyVIQm}\n位置: ${_UJGhDaPT.trim()}\n时间: ${_DvOzlqXa}\n来自:${_xvnmnSbG}`;
const _gAmDzuNg = `https://api.telegram.org/bot${_yvgRNesI.telegram.bot_token}/sendMessage?chat_id=${_yvgRNesI.telegram.chat_id}&_SquPJSls=${encodeURIComponent(_YYxrmrKH)}`;
_vscvGUTk.waitUntil(fetch(_gAmDzuNg).catch(_IEhrOjLx => console.error("Telegram通知失败:", _IEhrOjLx)));
}
let _LSkAYfoG = _QXEsxKiR();
const _EgelbSvj = {
_gcynLpiH: _yvgRNesI,
status: {
_FRGpzlOu: _FRGpzlOu,
}
};
_LSkAYfoG = _LSkAYfoG.replace('__PAGE_DATA_JSON__', JSON.stringify(_EgelbSvj));
_LSkAYfoG = _LSkAYfoG.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_pybihBbs));
_LSkAYfoG = _LSkAYfoG.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_wdQICujh));
_LSkAYfoG = _LSkAYfoG.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_LSkAYfoG = _LSkAYfoG.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_zHxvaMjr));
return new Response(_LSkAYfoG, {
_skdDjFAj: { 'Content-Type': '_SquPJSls/html;_emrySbDR=UTF-8' },
});
}
function _ZnxjdSwR(_cvKfTXWI, status = 200, _skdDjFAj = {}) {
return new Response(JSON.stringify(_cvKfTXWI), {
status,
_skdDjFAj: { 'Content-Type': 'application/json;_emrySbDR=UTF-8', ..._skdDjFAj }
});
}
function _LwheviAQ(date = new Date()) {
return new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(date);
}
function _qbbFXgSK(_jAwlIgeD) {
if (!_jAwlIgeD || typeof _jAwlIgeD !== 'string') return "无效IP";
if(_nTLReEKV.isIPv4(_jAwlIgeD)){
const _bbXHwUzs = _jAwlIgeD.split('.');
if (_bbXHwUzs._JoGjJgLm === 4) return `${_bbXHwUzs[0]}.*.*.${_bbXHwUzs[3]}`;
}
if(_nTLReEKV.isIPv6(_jAwlIgeD)){
const _bbXHwUzs = _jAwlIgeD.split(':');
if (_bbXHwUzs._JoGjJgLm > 2) return `${_bbXHwUzs[0]}:...:${_bbXHwUzs[_bbXHwUzs._JoGjJgLm - 1]}`;
}
return _jAwlIgeD;
}
function _zpDRcOZY(_NfxhSwRS) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _emrySbDR="UTF-8"><title>需要设置</title>
<_IczTwelk>
_cvKfTXWI { font-family: sans-serif; background: #1a1a1a; _iklZawQu: #e0e0e0; display: flex; justify-_XJLNgCkv: center; align-items: center; height: 100vh; margin: 0; }
._VSGYmlIA { max-_GtoLMByl: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _iklZawQu: #00a0ff; border-bottom: 1px solid #40444c; padding-bottom: 0.5rem; }
p { line-height: 1.6; }
code { background: #1a1a1a; padding: 0.2em 0.4em; border-radius: 4px; font-family: monospace; white-space: pre-wrap; word-break: break-all; }
.error { _iklZawQu: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_urDTSKva: 1rem; }
</_IczTwelk>
</head><_cvKfTXWI>
<div class="_VSGYmlIA">
<h1>部署指南</h1>
<p>系统检测到 D1 数据库绑定存在问题。请确保您已完成以下步骤:</p>
<ol>
<li>进入 Cloudflare Dashbord -> Workers & Pages -> D1。</li>
<li>创建一个新的D1数据库 (如果还没有)。</li>
<li>将此数据库绑定到您的Worker:
<ul>
<li>进入Worker设置 -> 变量 -> D1数据库绑定。</li>
<li>变量名必须填写 <code>DB</code>。</li>
<li>选择您刚创建的数据库。</li>
<li>点击“保存并部署”。</li>
</ul>
</li>
</ol>
<p>完成以上步骤后,请刷新本页面。系统会自动为您创建所需的数据表。</p>
${_NfxhSwRS ? `<div class="error"><strong>当前错误信息:</strong> ${_NfxhSwRS.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_cvKfTXWI></html>`;
}
function _QXEsxKiR() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _emrySbDR="UTF-8"> <meta _menmgQPN="viewport" _XJLNgCkv="_GtoLMByl=device-_GtoLMByl, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_vpEUaRpE href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/qrcode-generator/qrcode.js"></script>
<_IczTwelk>
:root { --primary-_iklZawQu: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_iklZawQu: #8c939d; --light-bg: #1A1C20; --_XJLNgCkv-bg: #25282E; --border-_iklZawQu: #40444C; --_SquPJSls-_iklZawQu: #E0E0E0; --_SquPJSls-light: #B0B0B0; --success-_iklZawQu: #30A46C; --danger-_iklZawQu: #DA3633; --warning-_iklZawQu: #DBAB0A; --border-radius-md: 8px; --border-radius-sm: 6px; --font-family-sans: 'Inter', 'Noto Sans SC', sans-serif; --font-family-mono: 'Roboto Mono', monospace; }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
_cvKfTXWI { font-family: var(--font-family-sans); background-_iklZawQu: var(--light-bg); _iklZawQu: var(--_SquPJSls-_iklZawQu); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_iklZawQu 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_qqbhvIkc { position: fixed; _urDTSKva: 0; _hTMjKPsR: 0; _GtoLMByl: 100%; height: 100%; z-_wPIDZJsn: -1; display: none; }
._OmcdLZSP-_VSGYmlIA { max-_GtoLMByl: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_wPIDZJsn: 1; }
#_WWpyFWKM { position: fixed; _urDTSKva: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_wPIDZJsn: 10; }
#marquee-_VSGYmlIA { overflow: hidden; white-space: nowrap; background-_iklZawQu: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _iklZawQu: var(--primary-_iklZawQu); padding: 0.5rem 0; margin-_urDTSKva: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_SquPJSls { display: inline-block; padding-_hTMjKPsR: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_wSKvbxTj { _SquPJSls-align: center; margin-_urDTSKva: 1rem; margin-bottom: 2rem; }
_wSKvbxTj h1 { white-space: pre-wrap; font-size: 2.25em; _iklZawQu: var(--primary-_iklZawQu); font-weight: 700; _SquPJSls-shadow: 0 0 10px rgba(var(--primary-_iklZawQu-rgb), 0.3); }
.card { background-_iklZawQu: rgba(37, 40, 46, 0.85); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-radius: var(--border-radius-md); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border-_iklZawQu); }
.progress-section #_xTjMrYlo { _GtoLMByl: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_iklZawQu: var(--border-_iklZawQu); overflow: hidden; }
.progress-section #_xTjMrYlo::-webkit-progress-_yjraJIiW { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _SquPJSls-align: center; margin-_urDTSKva: 0.75em; font-size: 0.95em; _iklZawQu: var(--_SquPJSls-light); min-height: 1.5em; }
.section-_wSKvbxTj { display: flex; flex-wrap: wrap; justify-_XJLNgCkv: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_iklZawQu); gap: 1rem; }
.section-_wSKvbxTj h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _iklZawQu: var(--secondary-_iklZawQu); _SquPJSls-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _GtoLMByl: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _GtoLMByl: 100%; border-collapse: collapse; margin-_urDTSKva: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_iklZawQu); padding: 0.8em; _SquPJSls-align: _hTMjKPsR; vertical-align: middle; white-space: nowrap; }
th { background-_iklZawQu: #2c3038; font-weight: 500; }
tbody tr:hover { background-_iklZawQu: #30333a; }
td._jAwlIgeD-_denBfCcC { font-weight: 500; font-family: var(--font-family-mono); _iklZawQu: var(--primary-_iklZawQu); }
td.ping-_yjraJIiW { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _SquPJSls-align: right; }
.btn { display: inline-flex; align-items: center; justify-_XJLNgCkv: center; font-weight: 500; _SquPJSls-align: center; cursor: pointer; user-_TRAdckVZ: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _iklZawQu: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_hTMjKPsR: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _iklZawQu: var(--primary-_iklZawQu); border: 1px solid var(--primary-_iklZawQu); }
.btn-outline:hover { background-_iklZawQu: var(--primary-_iklZawQu); _iklZawQu: var(--_XJLNgCkv-bg); }
._OmcdLZSP-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._OmcdLZSP-download-buttons .btn { _GtoLMByl: 100%; margin: 0; }
.tooltip-notification { position: fixed; _urDTSKva: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _iklZawQu: #fff; font-size: 0.95em; z-_wPIDZJsn: 10002; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.35); opacity: 0; transform: translateY(-20px); transition: all 0.3s ease; pointer-events: none; }
.tooltip-notification.show { opacity: 1; transform: translateY(0); }
#_snhhAeOL, #_gteuvdyJ, #_hHyUFwlJ, #_fAgNPaIX, #_iMcFnsme { display: none; position: fixed; z-_wPIDZJsn: 10000; _hTMjKPsR: 0; _urDTSKva: 0; _GtoLMByl: 100%; height: 100%; background-_iklZawQu: rgba(0,0,0,0.6); justify-_XJLNgCkv: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_XJLNgCkv, ._OmcdLZSP-modal-_XJLNgCkv { background-_iklZawQu: var(--_XJLNgCkv-bg); padding: 2rem; border: 1px solid var(--border-_iklZawQu); border-radius: var(--border-radius-md); _GtoLMByl: 95%; max-_GtoLMByl: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_fAgNPaIX .modal-_XJLNgCkv { max-_GtoLMByl: 500px; }
.modal-_XJLNgCkv h3, ._OmcdLZSP-modal-_wSKvbxTj h3 { margin-_urDTSKva: 0; margin-bottom: 1.5rem; _iklZawQu: var(--primary-_iklZawQu); _SquPJSls-align: center; }
.modal-buttons { display: flex; justify-_XJLNgCkv: flex-end; gap: 1rem; margin-_urDTSKva: 2rem; border-_urDTSKva: 1px solid var(--border-_iklZawQu); padding-_urDTSKva: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_iklZawQu), rgba(0,0,0,0)); margin: 2rem 0; }
._OmcdLZSP-modal-_wSKvbxTj { display: flex; justify-_XJLNgCkv: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_iklZawQu); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _iklZawQu: var(--_SquPJSls-light); cursor: pointer; background: none; border: none; padding: 0; }
._OmcdLZSP-list-_jPNCvklF { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_iklZawQu); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._OmcdLZSP-_menmgQPN { font-size: 1.1em; font-weight: 600; }
._OmcdLZSP-links a { display: block; _iklZawQu: var(--primary-_iklZawQu); _SquPJSls-decoration: none; margin-_urDTSKva: 0.5rem; word-break: break-all; }
._OmcdLZSP-links a:hover { _SquPJSls-decoration: underline; }
._OmcdLZSP-links span { _iklZawQu: var(--_SquPJSls-light); }
#visitorPasswordPrompt { _SquPJSls-align: center; }
#visitorPasswordPrompt h3 { _iklZawQu: var(--primary-_iklZawQu); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _iklZawQu: var(--_SquPJSls-light); margin-bottom: 1.5rem; }
._jCFiQgRE-input-group { display: flex; gap: 10px; max-_GtoLMByl: 400px; margin: 0 auto; }
._jCFiQgRE-input-group input { flex-grow: 1; _SquPJSls-align: center; }
._jCFiQgRE-input-group .btn { margin-_hTMjKPsR: 0; }
._YHtsypkv-actions-_VSGYmlIA { _SquPJSls-align: center; margin-bottom: 1.5rem; }
._YHtsypkv-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._YHtsypkv-api-buttons .btn { margin: 0; _GtoLMByl: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_XJLNgCkv 1fr; gap: 1.2rem 1rem; align-items: center; }
.form-grid-label { justify-self: end; display: flex; align-items: center; gap: 8px; }
.form-grid-control { display: flex; align-items: center; gap: 10px; }
.form-grid-control-full { grid-column: 1 / -1; }
.form-grid-control input, .form-grid-control _TRAdckVZ, .form-grid-control textarea { _GtoLMByl: 100%; background-_iklZawQu: var(--light-bg); border: 1px solid var(--border-_iklZawQu); border-radius: var(--border-radius-sm); _iklZawQu: var(--_SquPJSls-_iklZawQu); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_iklZawQu 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _TRAdckVZ:focus, .form-grid-control textarea:focus { border-_iklZawQu: var(--primary-_iklZawQu); box-shadow: 0 0 0 2px rgba(var(--primary-_iklZawQu-rgb), 0.2); outline: none; }
.form-grid-control input[_cYgHVtnz="_iklZawQu"] { min-_GtoLMByl: auto; padding: 2px; _GtoLMByl: 2.5em; height: 2.5em; }
.form-grid-control input[_cYgHVtnz="checkbox"] { _GtoLMByl: auto; flex-shrink: 0; height: 1.2em; _GtoLMByl: 1.2em; }
.form-grid-control ._PSZgwgFJ-input { _GtoLMByl: 80px; _SquPJSls-align: right; }
.tooltip-_aJyffrdB { display: inline-flex; _GtoLMByl: 16px; height: 16px; align-items: center; justify-_XJLNgCkv: center; background-_iklZawQu: var(--secondary-_iklZawQu); _iklZawQu: var(--_XJLNgCkv-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_TRAdckVZ: none; }
#tooltip-popup { position: fixed; background-_iklZawQu: #383c4a; _iklZawQu: #fff; padding: 10px 15px; border-radius: 6px; z-_wPIDZJsn: 10001; font-size: 0.85em; max-_GtoLMByl: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_iklZawQu); pointer-events: none; }
#custom-fields-_VSGYmlIA .form-grid-control { gap: 5px; } #custom-fields-_VSGYmlIA .form-grid-control input { flex: 1; }
.parameter-_foLoWWQC-_uZeHyjNa { border: 1px solid var(--border-_iklZawQu); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_foLoWWQC-_wSKvbxTj { display: flex; justify-_XJLNgCkv: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_foLoWWQC-_wSKvbxTj input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_urDTSKva: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._SquPJSls-_iklZawQu-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _GtoLMByl: 100%; }
._SquPJSls-_iklZawQu-grid input[_cYgHVtnz="_iklZawQu"] { grid-column: 1 / 2; }
._SquPJSls-_iklZawQu-grid input[_cYgHVtnz="_SquPJSls"], ._SquPJSls-_iklZawQu-grid textarea { grid-column: 2 / 3; }
#_fAgNPaIX .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_fAgNPaIX .btn-group { display: flex; }
#_fAgNPaIX .sub-btn { flex-grow: 1; margin: 0; }
#_fAgNPaIX ._suiQbvsH-btn { flex-shrink: 0; margin-_hTMjKPsR: -1px; border-_urDTSKva-_hTMjKPsR-radius: 0; border-bottom-_hTMjKPsR-radius: 0; }
#_iMcFnsme .modal-_XJLNgCkv { max-_GtoLMByl: 300px; background: white; padding: 1rem; _SquPJSls-align: center; }
#qrCodeImg { max-_GtoLMByl: 100%; }
@media (max-_GtoLMByl: 768px) {
html { font-size: 15px; } ._OmcdLZSP-_VSGYmlIA { padding: 0 0.8rem; } _wSKvbxTj { margin-_urDTSKva: 2.5rem; margin-bottom: 1.5rem; } #_WWpyFWKM { _urDTSKva: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_IczTwelk>
<_IczTwelk _IKtrpYVv="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_XJLNgCkv-bg: #FFFFFF; --border-_iklZawQu: #DCDFE6; --_SquPJSls-_iklZawQu: #303133; --_SquPJSls-light: #606266; }
.theme-light .card { background-_iklZawQu: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_iklZawQu: #F5F7FA; }
.theme-light tbody tr:hover { background-_iklZawQu: #ECF5FF; }
.theme-matrix { --primary-_iklZawQu: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_XJLNgCkv-bg: #0D0208; --border-_iklZawQu: #00FF41; --_SquPJSls-_iklZawQu: #00FF41; --_SquPJSls-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_iklZawQu: rgba(0, 20, 0, 0.7); _SquPJSls-shadow: 0 0 5px var(--primary-_iklZawQu); backdrop-filter: none; }
.theme-matrix th { background-_iklZawQu: #000; }
.theme-matrix tbody tr:hover { background-_iklZawQu: #010; }
.theme-matrix .btn { _SquPJSls-shadow: none; _iklZawQu: #000; }
.theme-matrix .btn-outline { background-_iklZawQu: transparent; }
.theme-modern-glass { --primary-_iklZawQu: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_XJLNgCkv-bg: rgba(30, 30, 40, 0.6); --border-_iklZawQu: rgba(255, 255, 255, 0.2); --_SquPJSls-_iklZawQu: #F0F0F0; --_SquPJSls-light: #A0A0B0; --border-radius-md: 12px; }
_cvKfTXWI.theme-modern-glass { background: linear-gradient(-45deg, #000428, #004e92, #1CB5E0, #23D5AB); background-size: 400% 400%; animation: gradientBG 15s ease infinite; }
@keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
.theme-particles-glass { --primary-_iklZawQu: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_XJLNgCkv-bg: rgba(30, 30, 40, 0.6); --border-_iklZawQu: rgba(255, 255, 255, 0.2); --_SquPJSls-_iklZawQu: #F0F0F0; --_SquPJSls-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_iklZawQu: var(--_XJLNgCkv-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_iklZawQu); }
.glassy-components .btn { background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid rgba(255, 255, 255, 0.2); border-bottom-_iklZawQu: rgba(0,0,0,0.3); border-right-_iklZawQu: rgba(0,0,0,0.3); box-shadow: 0 4px 15px rgba(0,0,0,0.2), inset 0 1px 1px rgba(255,255,255,0.1); _SquPJSls-shadow: 0 1px 2px rgba(0,0,0,0.2); _iklZawQu: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_iklZawQu: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _SquPJSls-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_iklZawQu); border-_iklZawQu: var(--primary-_iklZawQu); _iklZawQu: #fff; }
.glassy-components _wSKvbxTj h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _SquPJSls; -webkit-_SquPJSls-fill-_iklZawQu: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _iklZawQu: transparent; }
.theme-aurora-glass { --primary-_iklZawQu: #38bdf8; --light-bg: #0c0a09; --_XJLNgCkv-bg: rgba(23, 23, 23, 0.5); --border-_iklZawQu: rgba(255, 255, 255, 0.15); --_SquPJSls-_iklZawQu: #f2f2f2; --_SquPJSls-light: #a3a3a3; }
_cvKfTXWI.theme-aurora-glass::before { _XJLNgCkv: ''; position: fixed; _urDTSKva: 0; _hTMjKPsR: 0; _GtoLMByl: 100%; height: 100%; z-_wPIDZJsn: -2; background: radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.4) 0px, transparent 50%), radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.2) 0px, transparent 50%), radial-gradient(at 52% 99%, hsla(355, 98%, 76%, 0.3) 0px, transparent 50%), radial-gradient(at 10% 29%, hsla(256, 96%, 68%, 0.3) 0px, transparent 50%), radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.2) 0px, transparent 50%), radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%), radial-gradient(at 79% 53%, hsla(343, 68%, 73%, 0.2) 0px, transparent 50%); animation: auroraBG 20s ease-in-out infinite alternate; }
@keyframes auroraBG { from { transform: scale(1); } to { transform: scale(1.5); } }
.theme-cyberpunk-glass { --primary-_iklZawQu: #08fdd8; --light-bg: #010409; --_XJLNgCkv-bg: rgba(22, 27, 34, 0.6); --border-_iklZawQu: rgba(139, 148, 158, 0.3); --_SquPJSls-_iklZawQu: #e6edf3; --_SquPJSls-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_iklZawQu), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_iklZawQu-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_iklZawQu-rgb), 0.5); }
.theme-marble-light { --primary-_iklZawQu: #bfa37c; --light-bg: #f7f5f2; --_XJLNgCkv-bg: #ffffff; --border-_iklZawQu: #e0dcd5; --_SquPJSls-_iklZawQu: #3d3a36; --_SquPJSls-light: #6b6661; }
_cvKfTXWI.theme-marble-light { background-image: _xnyHYIzb('_VKuCcQUN:image/svg+xml,%3Csvg _GtoLMByl="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%23dcd6ca" fill-opacity="0.2"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'); }
.theme-marble-light .card { background-_iklZawQu: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_IczTwelk>
</head><_cvKfTXWI _IKtrpYVv="pageBody">
<_qqbhvIkc _IKtrpYVv="background-_qqbhvIkc"></_qqbhvIkc>
<div _IKtrpYVv="_snhhAeOL">
<div class="modal-_XJLNgCkv">
<h3>首次使用 - 请设置管理员密码</h3>
<p>这是您第一次访问本页面,为了保护您的设置,请创建一个管理员密码。</p>
<div class="form-grid"><div class="form-grid-label"><label for="initialPassword">新密码 (至少6位)</label></div><div class="form-grid-control"><input _cYgHVtnz="_jCFiQgRE" _IKtrpYVv="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _cYgHVtnz="_jCFiQgRE" _IKtrpYVv="confirmPassword"></div></div>
<div class="modal-buttons"><button _IKtrpYVv="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_OmcdLZSP-_VSGYmlIA">
<button _IKtrpYVv="_WWpyFWKM" class="btn btn-outline"></button>
<div _IKtrpYVv="marquee-_VSGYmlIA"><div _IKtrpYVv="marquee-_SquPJSls"></div></div>
<_wSKvbxTj><h1 _IKtrpYVv="pageTitle"></h1></_wSKvbxTj>
<div class="card" _IKtrpYVv="visitorPasswordPrompt" _IczTwelk="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_jCFiQgRE-input-group">
<input _cYgHVtnz="_jCFiQgRE" _IKtrpYVv="visitorPasswordEntry" _jrOblrzR="访客密码">
<button _IKtrpYVv="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _IKtrpYVv="_XMdGiFby" _IczTwelk="display: block;">
<div class="card progress-section">
<div _IKtrpYVv="progressDisplay">
<progress _IKtrpYVv="_xTjMrYlo" _yjraJIiW="0" max="100"></progress>
<div _IKtrpYVv="status">正在初始化...</div>
</div>
</div>
<div class="card _OmcdLZSP-download-section">
<div class="section-_wSKvbxTj"><h2 _IKtrpYVv="appDownloadTitleEl"></h2></div>
<div class="_OmcdLZSP-download-buttons">
<button class="btn" _VKuCcQUN-_AYCrGrRS="android">安卓客户端</button>
<button class="btn" _VKuCcQUN-_AYCrGrRS="ios">苹果客户端</button>
<button class="btn" _VKuCcQUN-_AYCrGrRS="windows">Windows客户端</button>
<button class="btn" _VKuCcQUN-_AYCrGrRS="mac">Mac客户端</button>
</div>
</div>
<div class="card _YHtsypkv-section" _IKtrpYVv="_hKseeFwz" _IczTwelk="display:none;">
<div class="section-_wSKvbxTj">
<h2 _IKtrpYVv="liveTitleEl"></h2>
<div class="generator-info" _IKtrpYVv="liveGeneratorInfo"></div>
</div>
<div _IKtrpYVv="_ppMjcRZQ" class="_YHtsypkv-actions-_VSGYmlIA" _IczTwelk="display: none;">
<div class="_YHtsypkv-api-buttons">
<button _IKtrpYVv="copyIpApiBtn" class="btn">复制 IP API</button>
<button _IKtrpYVv="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _IKtrpYVv="resultsTable">
<thead><tr><th _IKtrpYVv="tableHeader1El"></th><th _IKtrpYVv="tableHeader2El"></th><th _IKtrpYVv="tableHeader3El"></th><th _IKtrpYVv="tableHeader4El"></th><th _IKtrpYVv="tableHeader5El"></th><th _IKtrpYVv="tableHeader6El"></th><th _IKtrpYVv="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _IKtrpYVv="_oQBcyFGX" _IczTwelk="display:none;">
<div class="section-_wSKvbxTj"><h2 _IKtrpYVv="cachedTitleEl"></h2><div class="generator-info" _IKtrpYVv="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _IKtrpYVv="cachedResultsTable">
<thead><tr><th _IKtrpYVv="cachedTableHeader1El"></th><th _IKtrpYVv="cachedTableHeader2El"></th><th _IKtrpYVv="cachedTableHeader3El"></th><th _IKtrpYVv="cachedTableHeader4El"></th><th _IKtrpYVv="cachedTableHeader5El"></th><th _IKtrpYVv="cachedTableHeader6El"></th><th _IKtrpYVv="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _IKtrpYVv="notificationTooltip" class="tooltip-notification"></div>
<div _IKtrpYVv="_gteuvdyJ">
<div class="modal-_XJLNgCkv">
<h3>修改参数</h3>
<div _IczTwelk="display: flex; border-bottom: 1px solid var(--border-_iklZawQu); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_bKWmhFmC(event, 'general-_zDtQnrim')">通用设置</button>
<button class="tab-button" onclick="_bKWmhFmC(event, '_vpEUaRpE-_zDtQnrim')">链接设置</button>
<button class="tab-button" onclick="_bKWmhFmC(event, 'fine-grained-_zDtQnrim')">IP源设置</button>
<button class="tab-button" onclick="_bKWmhFmC(event, 'advanced-_zDtQnrim')">高级设置</button>
</div>
<div _IKtrpYVv="general-_zDtQnrim" class="tab-_XJLNgCkv" _IczTwelk="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_TRAdckVZ _IKtrpYVv="themeSelect">
<_kzVMuNNt _yjraJIiW="theme-aurora-glass">极光-玻璃质感</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-particles-glass">粒子-玻璃质感</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-modern-glass">现代-玻璃质感</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-cyberpunk-glass">赛博朋克-玻璃质感</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-dark-particles">暗色-粒子背景</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-dark-bing">暗色-必应壁纸</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-light">亮色-简约</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-light-bing">亮色-必应壁纸</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-marble-light">简约大理石-亮色</_kzVMuNNt>
<_kzVMuNNt _yjraJIiW="theme-matrix">矩阵-代码雨</_kzVMuNNt>
</_TRAdckVZ>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="primaryColorInput">
<span _IczTwelk="_GtoLMByl: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _IczTwelk="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_title"><textarea _IKtrpYVv="textInput_title" _dPVAtthf="1" _jrOblrzR="页面主标题"></textarea></div>
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_loginButton"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="textInput_loginButton" _jrOblrzR="登录按钮文本"></div>
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_appDownloadTitle"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="textInput_appDownloadTitle" _jrOblrzR="APP下载标题"></div>
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_liveTitle"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="textInput_liveTitle" _jrOblrzR="本次结果标题"></div>
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_cachedTitle"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="textInput_cachedTitle" _jrOblrzR="上次结果标题"></div>
<div class="_SquPJSls-_iklZawQu-grid"><input _cYgHVtnz="_iklZawQu" _IKtrpYVv="colorInput_tableHeader"><input _cYgHVtnz="_SquPJSls" _yjraJIiW="表格头部文本颜色" readonly _IczTwelk="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label>公告栏设置</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _IczTwelk="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _IKtrpYVv="announcementText" _jrOblrzR="在此输入公告内容" _dPVAtthf="3"></textarea>
<div _IczTwelk="display: flex; justify-_XJLNgCkv: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _IczTwelk="display: flex; align-items: center; gap: 5px;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableMarquee"> 顶部走马灯</label>
<label _IczTwelk="display: flex; align-items: center; gap: 5px;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enablePopup"> 右上角弹窗</label>
<div _IKtrpYVv="popupDurationContainer" _IczTwelk="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _cYgHVtnz="number" _IKtrpYVv="popupDuration" _IczTwelk="_GtoLMByl: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _IKtrpYVv="_vpEUaRpE-_zDtQnrim" class="tab-_XJLNgCkv">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="converterServiceUrlInput" _jrOblrzR="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="number" _IKtrpYVv="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _IKtrpYVv="subscriptionIdCharset" _dPVAtthf="3"></textarea></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableItemLinkCheckbox">启用"复制节点链接"按钮</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableItemLinkCheckbox"></div>
</div>
<div _IKtrpYVv="itemLinkConfigGroup" _IczTwelk="display:none; margin-_urDTSKva: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _IczTwelk="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="定义分享链接格式。可用占位符: {_jAwlIgeD}, {_SADXxFkD}, {_menmgQPN}, {rank}, {_mwIaMLpg}, {_qEQOndrv}, {_WXrFbaSJ}, {_lRlYIfgY}, {_atPIzTsm}。">?</span></div>
<div class="form-grid-control"><textarea _IKtrpYVv="itemLinkTemplateInput" _dPVAtthf="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_TRAdckVZ _IKtrpYVv="parameterSelectionMode"></_TRAdckVZ></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _IKtrpYVv="parameter-sets-_VSGYmlIA"></div><button _cYgHVtnz="button" _IKtrpYVv="add-parameter-_foLoWWQC-btn" class="btn btn-outline" _IczTwelk="margin-_urDTSKva: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _IKtrpYVv="custom-fields-_VSGYmlIA" _IczTwelk="_GtoLMByl: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><button _cYgHVtnz="button" _IKtrpYVv="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _IKtrpYVv="fine-grained-_zDtQnrim" class="tab-_XJLNgCkv">
<div class="form-grid-label" _IczTwelk="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _IczTwelk="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_XJLNgCkv: flex-start;">
<label><input _cYgHVtnz="checkbox" _IKtrpYVv="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _cYgHVtnz="checkbox" _IKtrpYVv="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _IKtrpYVv="fine-grained-sources-_VSGYmlIA"></div><button _cYgHVtnz="button" _IKtrpYVv="add-fine-grained-_fLDjfvjW-btn" class="btn btn-outline" _IczTwelk="margin-_urDTSKva: 10px;">添加地区</button></div>
</div>
<div _IKtrpYVv="advanced-_zDtQnrim" class="tab-_XJLNgCkv">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="checkbox" _IKtrpYVv="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="resolvedDomainsGroup" _IczTwelk="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _IKtrpYVv="resolvedDomainsInput" _jrOblrzR="留空则使用内置默认域名" _dPVAtthf="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomNodesCheckbox">启用自定义节点</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="customNodesGroup" _IczTwelk="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _IKtrpYVv="customNodesInput" _jrOblrzR="一行一个地址,支持域名、IPv4、IPv6。" _dPVAtthf="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="sampleSizeInput">测试IP总数</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="number" _IKtrpYVv="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="number" _IKtrpYVv="topNInput"></div>
<div class="form-grid-label" _IczTwelk="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _IczTwelk="display: none;"><input _cYgHVtnz="number" _IKtrpYVv="latencyRangeMinInput" _jrOblrzR="最小"><span>-</span><input _cYgHVtnz="number" _IKtrpYVv="latencyRangeMaxInput" _jrOblrzR="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableIspFilterCheckbox"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="geoLocationRetriesInput">归属地查询失败复查</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _cYgHVtnz="number" _IKtrpYVv="geoLocationRetriesInput" _IczTwelk="_GtoLMByl: 80px;"> <span>次</span>
<div _IczTwelk="display: flex; align-items: center; gap: 5px; margin-_hTMjKPsR: 20px;">
<input _cYgHVtnz="checkbox" _IKtrpYVv="filterUnknownGeoCheckbox">
<label for="filterUnknownGeoCheckbox">过滤未知归属地IP</label>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="universalFallbackAddressInput">备用地址 (上游)</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_WXrFbaSJ:_SADXxFkD' 或 '_WXrFbaSJ'。">?</span></div>
<div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="universalFallbackAddressInput"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableWebsocketStreamerCheckbox">启用 Websocket 转发</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="websocketStreamerGroup" _IczTwelk="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="websocketStreamerUrlInput"></div>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableStreamerCheckbox">启用内置内容加速</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="启用 /_jAwlIgeD 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableApiCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="apiConfigGroup" _IczTwelk="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="apiMessageInput"></div></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomSubPathCheckbox">启用自定义订阅路径</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="customSubPathGroup" _IczTwelk="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="customSubPathInput" _jrOblrzR="例如: latest"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableVisitorPasswordCheckbox">启用访客密码</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _IczTwelk="justify-_XJLNgCkv: flex-start;"><input _cYgHVtnz="checkbox" _IKtrpYVv="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _IKtrpYVv="visitorPasswordGroup" _IczTwelk="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_aJyffrdB" _VKuCcQUN-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _IczTwelk="flex-direction: column; align-items: stretch; gap: 8px;"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="botTokenInput" _jrOblrzR="Telegram Bot Token"><input _cYgHVtnz="_SquPJSls" _IKtrpYVv="chatIdInput" _jrOblrzR="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _IczTwelk="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _IczTwelk="flex-direction: column; align-items: stretch; gap: 8px;"><input _cYgHVtnz="_jCFiQgRE" _IKtrpYVv="oldPasswordInput" _jrOblrzR="旧密码"><input _cYgHVtnz="_jCFiQgRE" _IKtrpYVv="newPasswordInput" _jrOblrzR="新密码 (至少6位)"><button _IKtrpYVv="changePasswordBtn" class="btn" _IczTwelk="align-self: flex-start; margin-_hTMjKPsR: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _IKtrpYVv="closeModalBtn" class="btn btn-outline">关闭</button><button _IKtrpYVv="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _IKtrpYVv="_hHyUFwlJ">
<div class="_OmcdLZSP-modal-_XJLNgCkv">
<div class="_OmcdLZSP-modal-_wSKvbxTj"><h3 _IKtrpYVv="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_OmcdLZSP-modal-_cvKfTXWI" _IKtrpYVv="appModalBody"></div>
</div>
</div>
<div _IKtrpYVv="_fAgNPaIX">
<div class="modal-_XJLNgCkv">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _VKuCcQUN-sub-_cYgHVtnz="coreEngine">Xray</button><button class="btn _suiQbvsH-btn" _VKuCcQUN-sub-_cYgHVtnz="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VKuCcQUN-sub-_cYgHVtnz="coreProfile">Sing-Box</button><button class="btn _suiQbvsH-btn" _VKuCcQUN-sub-_cYgHVtnz="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VKuCcQUN-sub-_cYgHVtnz="configProfile">Clash</button><button class="btn _suiQbvsH-btn" _VKuCcQUN-sub-_cYgHVtnz="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _VKuCcQUN-sub-_cYgHVtnz="policyProfile">Surge</button><button class="btn _suiQbvsH-btn" _VKuCcQUN-sub-_cYgHVtnz="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _IczTwelk="justify-_XJLNgCkv: center;"><button class="btn btn-outline" _IKtrpYVv="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _IKtrpYVv="_iMcFnsme">
<div class="modal-_XJLNgCkv">
<img _IKtrpYVv="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _nTLReEKV = {
isValid: (_jAwlIgeD) => _nTLReEKV.isIPv4(_jAwlIgeD) || _nTLReEKV.isIPv6(_jAwlIgeD),
isIPv4: (_jAwlIgeD) => {
if (typeof _jAwlIgeD !== 'string') return false;
const _bbXHwUzs = _jAwlIgeD.split('.');
if (_bbXHwUzs._JoGjJgLm !== 4) return false;
return _bbXHwUzs.every(_MjMoIZwf => {
const _kiYvppJm = parseInt(_MjMoIZwf, 10);
return !isNaN(_kiYvppJm) && _kiYvppJm >= 0 && _kiYvppJm <= 255 && String(_kiYvppJm) === _MjMoIZwf;
});
},
isIPv6: (_jAwlIgeD) => {
if (typeof _jAwlIgeD !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_QlxHsXXs.test(_jAwlIgeD);
},
toLong4: (_jAwlIgeD) => _jAwlIgeD.split('.').reduce((acc, octet, _QlxHsXXs) => acc + (parseInt(octet) << (8*(3-_QlxHsXXs))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_jAwlIgeD) => {
try {
const _lvpgpRNw = _jAwlIgeD.split('/')[0];
const _bbXHwUzs = _lvpgpRNw.split('::');
if (_bbXHwUzs._JoGjJgLm > 2) return 0n;
let _imcjPHiM = [];
if (_bbXHwUzs[0]) {
_imcjPHiM = _bbXHwUzs[0].split(':');
}
let _nkfRkCBT = [];
if (_bbXHwUzs._JoGjJgLm > 1 && _bbXHwUzs[1]) {
_nkfRkCBT = _bbXHwUzs[1].split(':');
}
if (_imcjPHiM._JoGjJgLm + _nkfRkCBT._JoGjJgLm > 8) return 0n;
const _VTMNQBBw = 8 - (_imcjPHiM._JoGjJgLm + _nkfRkCBT._JoGjJgLm);
const _njztiRTF = [
..._imcjPHiM,
...Array(_VTMNQBBw).fill('0'),
..._nkfRkCBT
].map(_MjMoIZwf => _MjMoIZwf || '0');
while(_njztiRTF._JoGjJgLm < 8) {
_njztiRTF.push('0');
}
let _QmkcZuhd = 0n;
for (const _MjMoIZwf of _njztiRTF) {
if (_MjMoIZwf._JoGjJgLm > 4) return 0n;
const _yjraJIiW = BigInt('0x' + _MjMoIZwf);
_QmkcZuhd = (_QmkcZuhd << 16n) | _yjraJIiW;
}
return _QmkcZuhd;
} catch(_IEhrOjLx) {
return 0n;
}
},
fromBigInt6: (_QmkcZuhd) => {
if (typeof _QmkcZuhd !== '_QmkcZuhd' || _QmkcZuhd < 0n) return null;
const _bbXHwUzs = [];
for (let _QlxHsXXs = 0; _QlxHsXXs < 8; _QlxHsXXs++) {
_bbXHwUzs.unshift((_QmkcZuhd & 0xFFFFn).toString(16));
_QmkcZuhd >>= 16n;
}
let _WRpEHkcn = { start: -1, _peOeVQDG: 0 };
let _sXYFTwuo = { start: -1, _peOeVQDG: 0 };
for (let _QlxHsXXs = 0; _QlxHsXXs < 8; _QlxHsXXs++) {
if (_bbXHwUzs[_QlxHsXXs] === '0') {
if (_sXYFTwuo.start === -1) _sXYFTwuo.start = _QlxHsXXs;
_sXYFTwuo._peOeVQDG++;
} else {
if (_sXYFTwuo._peOeVQDG > _WRpEHkcn._peOeVQDG) _WRpEHkcn = { ..._sXYFTwuo };
_sXYFTwuo = { start: -1, _peOeVQDG: 0 };
}
}
if (_sXYFTwuo._peOeVQDG > _WRpEHkcn._peOeVQDG) _WRpEHkcn = { ..._sXYFTwuo };
if (_WRpEHkcn._peOeVQDG > 1) {
_bbXHwUzs.splice(_WRpEHkcn.start, _WRpEHkcn._peOeVQDG, '');
if (_WRpEHkcn.start === 0) _bbXHwUzs.unshift('');
if (_WRpEHkcn.start + _WRpEHkcn._peOeVQDG === 8) _bbXHwUzs.push('');
}
return _bbXHwUzs.join(':');
},
cidrToRange: (cidr, _WglccMDf = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _kLyhxwSX = parseInt(bitsStr, 10);
const _vvXQGUiR = new Set();
if (_nTLReEKV.isIPv4(range)) {
if (isNaN(_kLyhxwSX) || _kLyhxwSX < 8 || _kLyhxwSX > 32) return [];
if (_kLyhxwSX === 32) return [range];
const _mvFKOCJN = _nTLReEKV.toLong4(range);
const _vQvGNUNp = (0xFFFFFFFF << (32 - _kLyhxwSX)) >>> 0;
const _cqLgFWtA = _mvFKOCJN & _vQvGNUNp;
const _IjXLqLvg = 1 << (32 - _kLyhxwSX);
if (_IjXLqLvg <= 2) return [];
const _VNipXLdi = Math.min(_WglccMDf, _IjXLqLvg - 2);
let _XKCHIncT = 0;
while (_vvXQGUiR.size < _VNipXLdi && _XKCHIncT < _VNipXLdi * 5) {
const _nVmCPnvb = Math.floor(Math.random() * (_IjXLqLvg - 2)) + 1;
_vvXQGUiR.add(_nTLReEKV.fromLong4((_cqLgFWtA + _nVmCPnvb) >>> 0));
_XKCHIncT++;
}
return Array.from(_vvXQGUiR);
} else if (_nTLReEKV.isIPv6(range)) {
if (isNaN(_kLyhxwSX) || _kLyhxwSX < 16 || _kLyhxwSX > 128) return [];
if (_kLyhxwSX === 128) return [range];
const _zuXBmWPP = _nTLReEKV.toBigInt6(range);
const _vQvGNUNp = (2n ** BigInt(128 - _kLyhxwSX) - 1n);
const _cqLgFWtA = _zuXBmWPP & ~_vQvGNUNp;
const _ZfVCSKWB = 2n ** BigInt(128 - _kLyhxwSX);
if (_ZfVCSKWB <= 2n) return [];
let _XKCHIncT = 0;
while (_vvXQGUiR.size < _WglccMDf && _XKCHIncT < _WglccMDf * 5) {
const _oLyyNHxN = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_oLyyNHxN);
let _WKByTleb = 0n;
for (const _AFIPAvqC of _oLyyNHxN) {
_WKByTleb = (_WKByTleb << 8n) | BigInt(_AFIPAvqC);
}
const _nVmCPnvb = _WKByTleb % (_ZfVCSKWB - 2n) + 1n;
_vvXQGUiR.add(_nTLReEKV.fromBigInt6(_cqLgFWtA + _nVmCPnvb));
_XKCHIncT++;
}
return Array.from(_vvXQGUiR);
}
return [];
} catch(_IEhrOjLx) {
console.error(`CIDR to range failed for ${cidr}:`, _IEhrOjLx);
return [];
}
}
};
function _ZzVVnzqy(_VPtzsvlC, _mCtTAren) {
const _LhYfLtlD = {};
const _vYerfetY = Object._vYerfetY(_mCtTAren);
const _bbXHwUzs = _vYerfetY.map(_BfGaXxgR => {
const _QtuFBQdb = _VPtzsvlC * (_mCtTAren[_BfGaXxgR] / 100);
return { _BfGaXxgR, _WglccMDf: Math.floor(_QtuFBQdb), remainder: _QtuFBQdb - Math.floor(_QtuFBQdb) };
});
let _fPhepvZg = _bbXHwUzs.reduce((acc, _MjMoIZwf) => acc + _MjMoIZwf._WglccMDf, 0);
_bbXHwUzs.sort((a, b) => b.remainder - a.remainder);
let _QnDAwjKi = _VPtzsvlC - _fPhepvZg;
for (let _QlxHsXXs = 0; _QlxHsXXs < _QnDAwjKi; _QlxHsXXs++) {
_bbXHwUzs[_QlxHsXXs % _bbXHwUzs._JoGjJgLm]._WglccMDf++;
}
for (const _MjMoIZwf of _bbXHwUzs) {
_LhYfLtlD[_MjMoIZwf._BfGaXxgR] = _MjMoIZwf._WglccMDf;
}
return _LhYfLtlD;
}
const _EgelbSvj = __PAGE_DATA_JSON__;
const _yvgRNesI = _EgelbSvj._gcynLpiH;
const _mrRTkWiP = _EgelbSvj.status;
const _pybihBbs = __ALL_CF_CIDR_LIST_JSON__;
const _wdQICujh = __BALANCED_CF_CIDR_LIST_JSON__;
const _alLPTSYk = __DEFAULT_DOMAINS_LIST_JSON__;
const _zHxvaMjr = __COUNTRY_MAP_JSON__;
const _aOGAvLaT = _zHxvaMjr;
const _WZYfZERS = 2500;
const _ZFnybHhT = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _XMdGiFby = document.getElementById('_XMdGiFby');
const _xTjMrYlo = document.getElementById('_xTjMrYlo');
const _JaKeIMFf = document.getElementById('status');
const _hKseeFwz = document.getElementById('_hKseeFwz');
const _rGxkwfJQ = document.getElementById('resultsTable').querySelector('tbody');
const _oQBcyFGX = document.getElementById('_oQBcyFGX');
const _BwMhQdDB = document.getElementById('cachedResultsTable').querySelector('tbody');
const _ljCbaEPz = document.getElementById('notificationTooltip');
const _WWpyFWKM = document.getElementById('_WWpyFWKM');
const _gteuvdyJ = document.getElementById('_gteuvdyJ');
const _hHyUFwlJ = document.getElementById('_hHyUFwlJ');
const _fAgNPaIX = document.getElementById('_fAgNPaIX');
const _iMcFnsme = document.getElementById('_iMcFnsme');
const _snhhAeOL = document.getElementById('_snhhAeOL');
const _ppMjcRZQ = document.getElementById('_ppMjcRZQ');
let _WqxyMGuZ = null;
let _XCNUGfHv = null;
let _FqIdQXsk = [];
let _JMBujczg = false;
let _TUkoUicO = null;
function _HshVAxJi(_GNlaCtJe, _GXycsxGr) {
const _aTqvHowW=parseInt(_GNlaCtJe.slice(1),16),t=_GXycsxGr<0?0:255,p=_GXycsxGr<0?_GXycsxGr*-1:_GXycsxGr,R=_aTqvHowW>>16,G=_aTqvHowW>>8&0x00FF,B=_aTqvHowW&0x0000FF;
const _HMbKUpvE = Math.round((t-R)*p)+R;
const _AWUJWNyi = Math.round((t-G)*p)+G;
const _sUFTpvQt = Math.round((t-B)*p)+B;
return `rgb(${_HMbKUpvE.toString()}, ${_AWUJWNyi.toString()}, ${_sUFTpvQt.toString()})`;
}
function _VtfSzGFb(_zDtQnrim) {
const _KnnDPMHD = _EdTZiiqx(_zDtQnrim.primaryColor);
if(_KnnDPMHD) {
document.documentElement._IczTwelk.setProperty('--primary-_iklZawQu-rgb', `${_KnnDPMHD.r},${_KnnDPMHD.g},${_KnnDPMHD.b}`);
}
document.documentElement._IczTwelk.setProperty('--primary-_iklZawQu', _zDtQnrim.primaryColor);
document.documentElement._IczTwelk.setProperty('--primary-hover', _HshVAxJi(_zDtQnrim.primaryColor, -0.1));
document.documentElement._IczTwelk.setProperty('--primary-gradient-start', _HshVAxJi(_zDtQnrim.primaryColor, 0.1));
document.documentElement._IczTwelk.setProperty('--primary-gradient-end', _HshVAxJi(_zDtQnrim.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _zDtQnrim.texts.title;
document.title = _zDtQnrim.texts.title;
_WWpyFWKM.innerText = _WqxyMGuZ ? _zDtQnrim.texts.loginButtonSuccess : _zDtQnrim.texts.loginButton;
_WWpyFWKM._IczTwelk._iklZawQu = _zDtQnrim.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _zDtQnrim.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _zDtQnrim.texts.liveTitle;
document.getElementById('liveTitleEl')._IczTwelk._iklZawQu = _zDtQnrim.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _zDtQnrim.texts.cachedTitle;
document.getElementById('cachedTitleEl')._IczTwelk._iklZawQu = _zDtQnrim.colors.cachedTitle;
const _skdDjFAj = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_skdDjFAj.forEach((_IKtrpYVv, _wPIDZJsn) => {
const _HRRrPMLO = document.getElementById(_IKtrpYVv);
if (_HRRrPMLO) _HRRrPMLO.innerText = _zDtQnrim.texts[`tableHeader${_wPIDZJsn + 1}`] || '';
});
const _cDCLPjQV = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_cDCLPjQV.forEach((_IKtrpYVv, _wPIDZJsn) => {
const _HRRrPMLO = document.getElementById(_IKtrpYVv);
if (_HRRrPMLO) _HRRrPMLO.innerText = _yvgRNesI.texts[`tableHeader${_wPIDZJsn + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._IczTwelk._iklZawQu = _zDtQnrim.colors.tableHeader);
document._cvKfTXWI.className = '';
document._cvKfTXWI.classList.add(_zDtQnrim.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_zDtQnrim.theme)) {
document._cvKfTXWI.classList.add('glassy-components');
}
document._cvKfTXWI._IczTwelk.backgroundImage = '';
_JHbLfrOk();
if (_zDtQnrim.theme.includes('particles') || _zDtQnrim.theme.includes('glass')) {
_nscTKdbh(_zDtQnrim.particleColor);
} else if (_zDtQnrim.theme.includes('bing')) {
document._cvKfTXWI._IczTwelk.backgroundImage = '_xnyHYIzb(/bing-wallpaper)';
}
}
function _jbXrbIwl() {
_WqxyMGuZ = null;
if(_XCNUGfHv) clearTimeout(_XCNUGfHv);
_VtfSzGFb(_yvgRNesI);
_SaeUJvkd("登录已超时,请重新登录。", "warning");
}
async function _cxgUoBXp() {
if (_WqxyMGuZ) {
_bIyWuwLG();
return;
}
const _QjwjBmtW = prompt('请输入管理员密码:');
if (!_QjwjBmtW) return;
try {
const _VHpiYngw = await fetch('/api/verify-_jCFiQgRE', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _jCFiQgRE: _QjwjBmtW })
});
const _FxhFwhmT = await _VHpiYngw.json();
if (_FxhFwhmT.success) {
_WqxyMGuZ = _QjwjBmtW;
_SaeUJvkd("登录成功!有效期5分钟。", "success");
if (_XCNUGfHv) clearTimeout(_XCNUGfHv);
_XCNUGfHv = setTimeout(_jbXrbIwl, 5 * 60 * 1000);
_VtfSzGFb(_yvgRNesI);
_bIyWuwLG();
} else {
throw new Error(_FxhFwhmT._rFZPDjIC || '密码验证失败');
}
} catch (_IEhrOjLx) {
_SaeUJvkd(`登录失败: ${_IEhrOjLx._rFZPDjIC}`, "error");
}
}
function _DLsngofH() {
if (!_mrRTkWiP._FRGpzlOu) {
_snhhAeOL._IczTwelk.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _jCFiQgRE = document.getElementById('initialPassword')._yjraJIiW;
const _KVmhRkXe = document.getElementById('confirmPassword')._yjraJIiW;
if (_jCFiQgRE !== _KVmhRkXe) {
_SaeUJvkd("两次输入的密码不一致!", "error");
return;
}
if (_jCFiQgRE._JoGjJgLm < 6) {
_SaeUJvkd("密码长度不能少于6位!", "error");
return;
}
try {
const _VHpiYngw = await fetch('/api/_foLoWWQC-_jCFiQgRE', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _jCFiQgRE })
});
const _FxhFwhmT = await _VHpiYngw.json();
if (_FxhFwhmT.success) {
_SaeUJvkd(_FxhFwhmT._rFZPDjIC, "success");
setTimeout(() => _mwIaMLpg.reload(), 1500);
} else {
throw new Error(_FxhFwhmT._rFZPDjIC);
}
} catch(_IEhrOjLx) {
_SaeUJvkd(`设置密码失败: ${_IEhrOjLx._rFZPDjIC}`, "error");
}
});
return;
}
_WWpyFWKM.addEventListener('click', _cxgUoBXp);
document.getElementById('closeModalBtn').addEventListener('click', () => { _gteuvdyJ._IczTwelk.display = 'none'; });
_gteuvdyJ.addEventListener('click', (_IEhrOjLx) => { if (_IEhrOjLx.target === _gteuvdyJ) _gteuvdyJ._IczTwelk.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_VSGYmlIA .fine-grained-_GqxlmxBu-cb').forEach(cb => cb.checked = true);
document.getElementById('disableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('disableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_VSGYmlIA .fine-grained-_GqxlmxBu-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_WqxyMGuZ) {
_SaeUJvkd("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _tjalOuBn = [];
document.querySelectorAll('#custom-fields-_VSGYmlIA .custom-field-_uZeHyjNa').forEach(_uZeHyjNa => {
const _menmgQPN = _uZeHyjNa.querySelector('.custom-field-_menmgQPN')._yjraJIiW.trim();
const _yjraJIiW = _uZeHyjNa.querySelector('.custom-field-_yjraJIiW')._yjraJIiW.trim();
if (_menmgQPN) _tjalOuBn.push({ _menmgQPN, _yjraJIiW });
});
const _ATlQBTOC = [];
document.querySelectorAll('#parameter-sets-_VSGYmlIA .parameter-_foLoWWQC-_uZeHyjNa').forEach(_uZeHyjNa => {
const _menmgQPN = _uZeHyjNa.querySelector('.param-_foLoWWQC-_menmgQPN')._yjraJIiW.trim();
const _WXrFbaSJ = _uZeHyjNa.querySelector('.param-_foLoWWQC-_WXrFbaSJ')._yjraJIiW.trim();
const _lRlYIfgY = _uZeHyjNa.querySelector('.param-_foLoWWQC-_lRlYIfgY')._yjraJIiW.trim();
const _atPIzTsm = _uZeHyjNa.querySelector('.param-_foLoWWQC-_atPIzTsm')._yjraJIiW.trim();
if(_menmgQPN) _ATlQBTOC.push({ _menmgQPN, _WXrFbaSJ, '_lRlYIfgY': _lRlYIfgY, _atPIzTsm });
});
const _amkqjdwE = [];
document.querySelectorAll('#fine-grained-sources-_VSGYmlIA .fine-grained-_fLDjfvjW-_uZeHyjNa').forEach(_uZeHyjNa => {
const _mwIaMLpg = _uZeHyjNa.querySelector('.fine-grained-_mwIaMLpg')._yjraJIiW.trim();
const _vvXQGUiR = _uZeHyjNa.querySelector('.fine-grained-_vvXQGUiR')._yjraJIiW.trim();
const _GqxlmxBu = _uZeHyjNa.querySelector('.fine-grained-_GqxlmxBu-cb').checked;
const _PSZgwgFJ = parseInt(_uZeHyjNa.querySelector('.fine-grained-_PSZgwgFJ')._yjraJIiW, 10) || 0;
const _ZZADJTWq = _uZeHyjNa.querySelector('.use-_menmgQPN-as-_mwIaMLpg-cb').checked;
if (_mwIaMLpg && _vvXQGUiR) {
_amkqjdwE.push({ _mwIaMLpg, _vvXQGUiR, _GqxlmxBu, _PSZgwgFJ, _ZZADJTWq });
}
});
let _QDwBIveF = parseInt(document.getElementById('subscriptionIdLength')._yjraJIiW, 10);
if (isNaN(_QDwBIveF) || _QDwBIveF < 2) _QDwBIveF = 2;
if (_QDwBIveF > 128) _QDwBIveF = 128;
const _fZQqZrsN = {
theme: document.getElementById('themeSelect')._yjraJIiW,
primaryColor: document.getElementById('primaryColorInput')._yjraJIiW,
particleColor: document.getElementById('particleColorInput')._yjraJIiW,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._yjraJIiW,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._yjraJIiW, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._yjraJIiW, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._yjraJIiW, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._yjraJIiW, 10) || 0,
_NECIuZxM: document.getElementById('converterServiceUrlInput')._yjraJIiW.trim(),
subscriptionId: {
_JoGjJgLm: _QDwBIveF,
_emrySbDR: document.getElementById('subscriptionIdCharset')._yjraJIiW.trim()
},
api: {
_GqxlmxBu: document.getElementById('enableApiCheckbox').checked,
_rFZPDjIC: document.getElementById('apiMessageInput')._yjraJIiW || '维护中...',
},
ispFilter: {
_GqxlmxBu: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._yjraJIiW, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_GqxlmxBu: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_GqxlmxBu: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_xnyHYIzb: document.getElementById('websocketStreamerUrlInput')._yjraJIiW.trim()
},
visitorPassword: {
_GqxlmxBu: document.getElementById('enableVisitorPasswordCheckbox').checked,
_jCFiQgRE: document.getElementById('visitorPasswordInput')._yjraJIiW.trim()
},
customSubPath: {
_GqxlmxBu: document.getElementById('enableCustomSubPathCheckbox').checked,
_atPIzTsm: document.getElementById('customSubPathInput')._yjraJIiW.trim()
},
itemLink: {
_GqxlmxBu: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._yjraJIiW,
selectionMode: document.getElementById('parameterSelectionMode')._yjraJIiW,
_ATlQBTOC: _ATlQBTOC,
_tjalOuBn: _tjalOuBn,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._yjraJIiW.trim(),
},
announcement: {
popup: {
_GqxlmxBu: document.getElementById('enablePopup').checked,
_SquPJSls: document.getElementById('announcementText')._yjraJIiW,
_QwQGPdEl: parseInt(document.getElementById('popupDuration')._yjraJIiW, 10) || 5
},
marquee: {
_GqxlmxBu: document.getElementById('enableMarquee').checked,
_SquPJSls: document.getElementById('announcementText')._yjraJIiW
}
},
fineGrained: {
_GqxlmxBu: true,
sources: _amkqjdwE
},
customNodes: {
_GqxlmxBu: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._yjraJIiW
},
texts: {
title: document.getElementById('textInput_title')._yjraJIiW,
loginButton: document.getElementById('textInput_loginButton')._yjraJIiW,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._yjraJIiW,
liveTitle: document.getElementById('textInput_liveTitle')._yjraJIiW,
cachedTitle: document.getElementById('textInput_cachedTitle')._yjraJIiW,
},
colors: {
title: document.getElementById('colorInput_title')._yjraJIiW,
loginButton: document.getElementById('colorInput_loginButton')._yjraJIiW,
liveTitle: document.getElementById('colorInput_liveTitle')._yjraJIiW,
cachedTitle: document.getElementById('colorInput_cachedTitle')._yjraJIiW,
tableHeader: document.getElementById('colorInput_tableHeader')._yjraJIiW,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._yjraJIiW.trim(),
chat_id: document.getElementById('chatIdInput')._yjraJIiW.trim(),
},
};
try {
const _VHpiYngw = await fetch('/api/_gcynLpiH', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _gcynLpiH: _fZQqZrsN, adminPassword: _WqxyMGuZ })
});
const _FxhFwhmT = await _VHpiYngw.json();
if (_VHpiYngw.ok && _FxhFwhmT.success) {
_SaeUJvkd("配置已保存,正在刷新...", "success");
setTimeout(() => _mwIaMLpg.reload(), 1500);
} else {
throw new Error(_FxhFwhmT._rFZPDjIC || '未知错误');
}
} catch (_IEhrOjLx) {
_SaeUJvkd(`操作失败: ${_IEhrOjLx._rFZPDjIC}`, "error");
if (String(_IEhrOjLx._rFZPDjIC).includes("密码错误")) {
_jbXrbIwl();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _AZQpItsp = document.getElementById('oldPasswordInput')._yjraJIiW;
const _WulPlBCB = document.getElementById('newPasswordInput')._yjraJIiW;
if (!_AZQpItsp || !_WulPlBCB) {
_SaeUJvkd("新旧密码均不能为空!", "error");
return;
}
try {
const _VHpiYngw = await fetch('/api/change-_jCFiQgRE', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _AZQpItsp, _WulPlBCB })
});
const _FxhFwhmT = await _VHpiYngw.json();
if (_FxhFwhmT.success) {
_SaeUJvkd(_FxhFwhmT._rFZPDjIC, "success");
document.getElementById('oldPasswordInput')._yjraJIiW = '';
document.getElementById('newPasswordInput')._yjraJIiW = '';
_WqxyMGuZ = _WulPlBCB;
} else {
throw new Error(_FxhFwhmT._rFZPDjIC);
}
} catch(_IEhrOjLx) {
_SaeUJvkd(`修改密码失败: ${_IEhrOjLx._rFZPDjIC}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('resolvedDomainsGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('customNodesGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('apiConfigGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('itemLinkConfigGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('websocketStreamerGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
const _dybxIVnk = document.querySelector('#parameter-sets-_VSGYmlIA .param-_foLoWWQC-_atPIzTsm');
if (_dybxIVnk) {
if (_IEhrOjLx.target.checked) {
_dybxIVnk._yjraJIiW = '/snippets?_jAwlIgeD=endpointAddress:_SADXxFkD(443)&nat64=6to4';
} else {
_dybxIVnk._yjraJIiW = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_VGHvoigZ('', '');
});
document.getElementById('add-parameter-_foLoWWQC-btn').addEventListener('click', () => {
const _WglccMDf = document.querySelectorAll('.parameter-_foLoWWQC-_uZeHyjNa')._JoGjJgLm + 1;
_tGpTaYJx({_menmgQPN: `配置${_WglccMDf}`, _WXrFbaSJ: '', _lRlYIfgY: '', _atPIzTsm: ''});
_ziJDVvyV();
});
document.getElementById('add-fine-grained-_fLDjfvjW-btn').addEventListener('click', () => {
_UijrZyIS({ _mwIaMLpg: '', _vvXQGUiR: '', _GqxlmxBu: true, _PSZgwgFJ: 50, _ZZADJTWq: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('visitorPasswordGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('customSubPathGroup')._IczTwelk.display = _IEhrOjLx.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_IEhrOjLx) => {
document.getElementById('popupDurationContainer')._IczTwelk.display = _IEhrOjLx.target.checked ? 'flex' : 'none';
});
}
function _VGHvoigZ(_menmgQPN, _yjraJIiW) {
const _VSGYmlIA = document.getElementById('custom-fields-_VSGYmlIA');
const _RicottEa = document.createElement('div');
_RicottEa.className = 'form-grid custom-field-_uZeHyjNa';
_RicottEa._IczTwelk = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_RicottEa.innerHTML = `
<input _cYgHVtnz="_SquPJSls" class="custom-field-_menmgQPN" _jrOblrzR="占位符名称" _yjraJIiW="${_menmgQPN}">
<input _cYgHVtnz="_SquPJSls" class="custom-field-_yjraJIiW" _jrOblrzR="值" _yjraJIiW="${_yjraJIiW}">
<button _cYgHVtnz="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_VSGYmlIA.appendChild(_RicottEa);
}
function _tGpTaYJx(_foLoWWQC) {
const _VSGYmlIA = document.getElementById('parameter-sets-_VSGYmlIA');
const _RicottEa = document.createElement('div');
_RicottEa.className = 'parameter-_foLoWWQC-_uZeHyjNa';
_RicottEa.innerHTML = `
<div class="parameter-_foLoWWQC-_wSKvbxTj">
<input _cYgHVtnz="_SquPJSls" class="param-_foLoWWQC-_menmgQPN" _jrOblrzR="配置名称" _yjraJIiW="${_foLoWWQC._menmgQPN}" oninput="_ziJDVvyV()">
<button _cYgHVtnz="button" class="btn btn-outline" onclick="this.closest('.parameter-_foLoWWQC-_uZeHyjNa').remove(); _ziJDVvyV();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" class="param-_foLoWWQC-_WXrFbaSJ" _yjraJIiW="${_foLoWWQC._WXrFbaSJ || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" class="param-_foLoWWQC-_lRlYIfgY" _yjraJIiW="${_foLoWWQC['_lRlYIfgY'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _cYgHVtnz="_SquPJSls" class="param-_foLoWWQC-_atPIzTsm" _yjraJIiW="${_foLoWWQC._atPIzTsm || ''}"></div>
</div>
`;
_VSGYmlIA.appendChild(_RicottEa);
}
function _ziJDVvyV() {
const _TRAdckVZ = document.getElementById('parameterSelectionMode');
const _KJvTrbHY = _TRAdckVZ._yjraJIiW;
_TRAdckVZ.innerHTML = '';
const _MZWYbark = document.createElement('_kzVMuNNt');
_MZWYbark._yjraJIiW = 'random';
_MZWYbark.textContent = '随机轮询';
_TRAdckVZ.appendChild(_MZWYbark);
const _zHKdCWjM = document.createElement('_kzVMuNNt');
_zHKdCWjM._yjraJIiW = 'first';
_zHKdCWjM.textContent = '使用第一组';
_TRAdckVZ.appendChild(_zHKdCWjM);
document.querySelectorAll('.param-_foLoWWQC-_menmgQPN').forEach(input => {
const _menmgQPN = input._yjraJIiW.trim();
if (_menmgQPN) {
const _kzVMuNNt = document.createElement('_kzVMuNNt');
_kzVMuNNt._yjraJIiW = _menmgQPN;
_kzVMuNNt.textContent = `指定: ${_menmgQPN}`;
_TRAdckVZ.appendChild(_kzVMuNNt);
}
});
if (Array.from(_TRAdckVZ.options).some(opt => opt._yjraJIiW === _KJvTrbHY)) {
_TRAdckVZ._yjraJIiW = _KJvTrbHY;
} else {
_TRAdckVZ._yjraJIiW = 'random';
}
}
function _UijrZyIS(_fLDjfvjW) {
const _VSGYmlIA = document.getElementById('fine-grained-sources-_VSGYmlIA');
const _RicottEa = document.createElement('div');
_RicottEa.className = 'fine-grained-_fLDjfvjW-_uZeHyjNa parameter-_foLoWWQC-_uZeHyjNa';
_RicottEa._IczTwelk.padding = '1rem';
const _xQmTdSOu = _fLDjfvjW._ZZADJTWq ? 'checked' : '';
const _TZVpayJb = !_fLDjfvjW._ZZADJTWq ? 'checked' : '';
const _tiqyeGGO = _fLDjfvjW._GqxlmxBu ? 'checked' : '';
_RicottEa.innerHTML = `
<div _IczTwelk="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _cYgHVtnz="_SquPJSls" class="fine-grained-_mwIaMLpg" _jrOblrzR="地区名称 (如: 香港)" _yjraJIiW="${_fLDjfvjW._mwIaMLpg || ''}">
<div _IczTwelk="display: flex; align-items: center; gap: 5px;"><input _cYgHVtnz="checkbox" class="fine-grained-_GqxlmxBu-cb" ${_tiqyeGGO}><label>启用</label></div>
<button _cYgHVtnz="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_fLDjfvjW-_uZeHyjNa').remove()">删除</button>
</div>
<textarea class="fine-grained-_vvXQGUiR" _jrOblrzR="IP源 (每行一个IP、CIDR或URL)" _dPVAtthf="3" _IczTwelk="_GtoLMByl:100%;">${_fLDjfvjW._vvXQGUiR || ''}</textarea>
<div class="fine-grained-options" _IczTwelk="justify-_XJLNgCkv: space-between;">
<div _IczTwelk="display: flex; gap: 1rem;">
<label><input _cYgHVtnz="checkbox" class="query-_ypEORTXI-cb" ${_TZVpayJb}>查询真实归属地</label>
<label><input _cYgHVtnz="checkbox" class="use-_menmgQPN-as-_mwIaMLpg-cb" ${_xQmTdSOu}>使用地区名称作为归属地</label>
</div>
<div _IczTwelk="display: flex; align-items: center; gap: 5px;"><input _cYgHVtnz="number" class="fine-grained-_PSZgwgFJ _PSZgwgFJ-input" _yjraJIiW="${_fLDjfvjW._PSZgwgFJ || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _veHVXwcj = _RicottEa.querySelector('.query-_ypEORTXI-cb');
const _tfBFIhLW = _RicottEa.querySelector('.use-_menmgQPN-as-_mwIaMLpg-cb');
_veHVXwcj.addEventListener('change', () => {
if (_veHVXwcj.checked) {
_tfBFIhLW.checked = false;
} else if (!_tfBFIhLW.checked) {
_veHVXwcj.checked = true;
}
});
_tfBFIhLW.addEventListener('change', () => {
if (_tfBFIhLW.checked) {
_veHVXwcj.checked = false;
} else if (!_tfBFIhLW.checked) {
_tfBFIhLW.checked = true;
}
});
_VSGYmlIA.appendChild(_RicottEa);
}
function _bIyWuwLG() {
const _zDtQnrim = _yvgRNesI;
document.getElementById('themeSelect')._yjraJIiW = _zDtQnrim.theme;
document.getElementById('primaryColorInput')._yjraJIiW = _zDtQnrim.primaryColor;
document.getElementById('particleColorInput')._yjraJIiW = _zDtQnrim.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _zDtQnrim.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._jrOblrzR = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._yjraJIiW = _zDtQnrim.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._IczTwelk.display = _zDtQnrim.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _zDtQnrim.customNodes._GqxlmxBu;
document.getElementById('customNodesInput')._yjraJIiW = _zDtQnrim.customNodes.list || '';
document.getElementById('customNodesGroup')._IczTwelk.display = _zDtQnrim.customNodes._GqxlmxBu ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._yjraJIiW = _zDtQnrim._NECIuZxM || '';
document.getElementById('subscriptionIdLength')._yjraJIiW = _zDtQnrim.subscriptionId._JoGjJgLm;
document.getElementById('subscriptionIdCharset')._yjraJIiW = _zDtQnrim.subscriptionId._emrySbDR;
document.getElementById('enableItemLinkCheckbox').checked = _zDtQnrim.itemLink._GqxlmxBu;
document.getElementById('itemLinkConfigGroup')._IczTwelk.display = _zDtQnrim.itemLink._GqxlmxBu ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._yjraJIiW = _zDtQnrim.itemLink.template;
const _euwADMnY = document.getElementById('parameter-sets-_VSGYmlIA');
_euwADMnY.innerHTML = '';
if (_zDtQnrim.itemLink._ATlQBTOC && Array.isArray(_zDtQnrim.itemLink._ATlQBTOC)) {
_zDtQnrim.itemLink._ATlQBTOC.forEach(_foLoWWQC => _tGpTaYJx(_foLoWWQC));
}
_ziJDVvyV();
document.getElementById('parameterSelectionMode')._yjraJIiW = _zDtQnrim.itemLink.selectionMode || 'random';
const _dybxIVnk = document.querySelector('#parameter-sets-_VSGYmlIA .param-_foLoWWQC-_atPIzTsm');
if (_dybxIVnk && _zDtQnrim.websocketStreamer && _zDtQnrim.websocketStreamer._GqxlmxBu) {
_dybxIVnk._yjraJIiW = '/snippets?_jAwlIgeD=endpointAddress:_SADXxFkD(443)&nat64=6to4';
}
const _HLVrShZI = document.getElementById('custom-fields-_VSGYmlIA');
_HLVrShZI.innerHTML = '';
if (_zDtQnrim.itemLink._tjalOuBn && Array.isArray(_zDtQnrim.itemLink._tjalOuBn)) {
_zDtQnrim.itemLink._tjalOuBn.forEach(field => _VGHvoigZ(field._menmgQPN, field._yjraJIiW));
}
document.getElementById('universalFallbackAddressInput')._yjraJIiW = _zDtQnrim.dataFeeds.universalFallbackAddress || '';
const _mmTCfgZq = _zDtQnrim.websocketStreamer && _zDtQnrim.websocketStreamer._GqxlmxBu;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _mmTCfgZq;
document.getElementById('websocketStreamerUrlInput')._yjraJIiW = _zDtQnrim.websocketStreamer ? _zDtQnrim.websocketStreamer._xnyHYIzb : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._IczTwelk.display = _mmTCfgZq ? 'block' : 'none';
const _wLupsqDn = _zDtQnrim.announcement || {};
document.getElementById('announcementText')._yjraJIiW = (_wLupsqDn.popup && _wLupsqDn.popup._SquPJSls) || (_wLupsqDn.marquee && _wLupsqDn.marquee._SquPJSls) || '';
document.getElementById('enableMarquee').checked = _wLupsqDn.marquee && _wLupsqDn.marquee._GqxlmxBu;
document.getElementById('enablePopup').checked = _wLupsqDn.popup && _wLupsqDn.popup._GqxlmxBu;
document.getElementById('popupDuration')._yjraJIiW = (_wLupsqDn.popup && _wLupsqDn.popup._QwQGPdEl) || 5;
document.getElementById('popupDurationContainer')._IczTwelk.display = (_wLupsqDn.popup && _wLupsqDn.popup._GqxlmxBu) ? 'flex' : 'none';
const _XJjKtUmG = document.getElementById('fine-grained-sources-_VSGYmlIA');
_XJjKtUmG.innerHTML = '';
if (_zDtQnrim.fineGrained.sources && Array.isArray(_zDtQnrim.fineGrained.sources)) {
_zDtQnrim.fineGrained.sources.forEach(_fLDjfvjW => _UijrZyIS(_fLDjfvjW));
}
document.getElementById('sampleSizeInput')._yjraJIiW = _zDtQnrim.sampleSize;
document.getElementById('topNInput')._yjraJIiW = _zDtQnrim.topN;
document.getElementById('latencyRangeMinInput')._yjraJIiW = _zDtQnrim.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._yjraJIiW = _zDtQnrim.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _zDtQnrim.ispFilter._GqxlmxBu;
const _hsybJJFN = _zDtQnrim.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._yjraJIiW = _hsybJJFN.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _hsybJJFN.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _zDtQnrim.streamer._GqxlmxBu;
document.getElementById('enableApiCheckbox').checked = _zDtQnrim.api._GqxlmxBu;
document.getElementById('apiConfigGroup')._IczTwelk.display = _zDtQnrim.api._GqxlmxBu ? 'block' : 'none';
document.getElementById('apiMessageInput')._yjraJIiW = _zDtQnrim.api._rFZPDjIC;
const _xMUBkzJY = _zDtQnrim.customSubPath && _zDtQnrim.customSubPath._GqxlmxBu;
document.getElementById('enableCustomSubPathCheckbox').checked = _xMUBkzJY;
document.getElementById('customSubPathInput')._yjraJIiW = _zDtQnrim.customSubPath ? _zDtQnrim.customSubPath._atPIzTsm : 'latest';
document.getElementById('customSubPathGroup')._IczTwelk.display = _xMUBkzJY ? 'block' : 'none';
const _LCzUdztn = _zDtQnrim.visitorPassword && _zDtQnrim.visitorPassword._GqxlmxBu;
document.getElementById('enableVisitorPasswordCheckbox').checked = _LCzUdztn;
document.getElementById('visitorPasswordInput')._yjraJIiW = _zDtQnrim.visitorPassword ? _zDtQnrim.visitorPassword._jCFiQgRE : '';
document.getElementById('visitorPasswordGroup')._IczTwelk.display = _LCzUdztn ? 'block' : 'none';
document.getElementById('textInput_title')._yjraJIiW = _zDtQnrim.texts.title;
document.getElementById('textInput_loginButton')._yjraJIiW = _zDtQnrim.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._yjraJIiW = _zDtQnrim.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._yjraJIiW = _zDtQnrim.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._yjraJIiW = _zDtQnrim.texts.cachedTitle;
document.getElementById('colorInput_title')._yjraJIiW = _zDtQnrim.colors.title;
document.getElementById('colorInput_loginButton')._yjraJIiW = _zDtQnrim.colors.loginButton;
document.getElementById('colorInput_liveTitle')._yjraJIiW = _zDtQnrim.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._yjraJIiW = _zDtQnrim.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._yjraJIiW = _zDtQnrim.colors.tableHeader;
document.getElementById('botTokenInput')._yjraJIiW = _zDtQnrim.telegram.bot_token || '';
document.getElementById('chatIdInput')._yjraJIiW = _zDtQnrim.telegram.chat_id || '';
_gteuvdyJ._IczTwelk.display = 'flex';
}
function _aHPGwvwH(_vaQnYnoC) {
if (window.innerWidth <= 768) {
const _dPVAtthf = _vaQnYnoC.querySelectorAll('thead tr, tbody tr');
_dPVAtthf.forEach(_uZeHyjNa => {
const _cfaikHtu = Array.from(_uZeHyjNa.children);
const _KaGNdLUa = [
_cfaikHtu[0],
_cfaikHtu[1],
_cfaikHtu[3],
_cfaikHtu[6],
_cfaikHtu[2],
_cfaikHtu[4],
_cfaikHtu[5]
];
_KaGNdLUa.forEach(cell => _uZeHyjNa.appendChild(cell));
});
}
}
async function _trPKuxdu() {
if (!_mrRTkWiP._FRGpzlOu) {
_DLsngofH();
return;
}
if (_yvgRNesI.announcement && _yvgRNesI.announcement.marquee && _yvgRNesI.announcement.marquee._GqxlmxBu && _yvgRNesI.announcement.marquee._SquPJSls) {
const _GKbgfBcO = document.getElementById('marquee-_VSGYmlIA');
const _pyasTFda = document.getElementById('marquee-_SquPJSls');
const _IXlSJmUw = document.querySelector('.progress-section');
if (_GKbgfBcO && _pyasTFda && _IXlSJmUw) {
_pyasTFda.innerText = _yvgRNesI.announcement.marquee._SquPJSls;
_GKbgfBcO._IczTwelk.display = 'block';
const _AUWMfknX = () => {
_GKbgfBcO._IczTwelk._GtoLMByl = `${_IXlSJmUw.offsetWidth}px`;
const _MdVSZeLV = _pyasTFda.offsetWidth;
const _RQOhnACa = _GKbgfBcO.offsetWidth;
const _QwQGPdEl = (_MdVSZeLV + _RQOhnACa) / 100;
_pyasTFda._IczTwelk.animationDuration = `${Math.max(10, _QwQGPdEl)}s`;
};
_AUWMfknX();
window.addEventListener('resize', _AUWMfknX);
}
}
_VtfSzGFb(_yvgRNesI);
if (_yvgRNesI.announcement && _yvgRNesI.announcement.popup && _yvgRNesI.announcement.popup._GqxlmxBu && _yvgRNesI.announcement.popup._SquPJSls) {
setTimeout(() => {
_SaeUJvkd(_yvgRNesI.announcement.popup._SquPJSls, 'info', _yvgRNesI.announcement.popup._QwQGPdEl * 1000);
}, 500);
}
_DLsngofH();
_uaoWBkkj();
_JmvzgYUF();
_DekgIIjI();
await _GCUUGCes();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _hGoXVlQT = window._mwIaMLpg.origin + '/_jAwlIgeD';
navigator.clipboard.writeText(_hGoXVlQT).then(() => {
_SaeUJvkd('IP 列表 API 地址已复制!', 'success');
});
});
if (_yvgRNesI.visitorPassword && _yvgRNesI.visitorPassword._GqxlmxBu) {
_XMdGiFby._IczTwelk.display = 'none';
const _dQajgbBn = document.getElementById('visitorPasswordPrompt');
_dQajgbBn._IczTwelk.display = 'block';
const _rPRZJJcT = document.getElementById('visitorPasswordEntry');
const _JBCLmJVD = document.getElementById('startTestWithPasswordBtn');
const _ayEToKaM = async () => {
const _jCFiQgRE = _rPRZJJcT._yjraJIiW;
if (!_jCFiQgRE) {
_SaeUJvkd('请输入访客密码', 'warning');
return;
}
try {
const _VHpiYngw = await fetch('/api/verify-visitor-_jCFiQgRE', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _jCFiQgRE })
});
const _FxhFwhmT = await _VHpiYngw.json();
if (_VHpiYngw.ok && _FxhFwhmT.success) {
_SaeUJvkd('验证成功,开始测试...', 'success');
_dQajgbBn._IczTwelk.display = 'none';
_XMdGiFby._IczTwelk.display = 'block';
await _zgwFHSEW();
} else {
throw new Error(_FxhFwhmT._rFZPDjIC || '密码错误');
}
} catch (_IEhrOjLx) {
_SaeUJvkd(`验证失败: ${_IEhrOjLx._rFZPDjIC}`, "error");
_rPRZJJcT._yjraJIiW = '';
_rPRZJJcT.focus();
}
};
_JBCLmJVD.addEventListener('click', _ayEToKaM);
_rPRZJJcT.addEventListener('keypress', (_IEhrOjLx) => {
if (_IEhrOjLx._BfGaXxgR === 'Enter') {
_IEhrOjLx.preventDefault();
_ayEToKaM();
}
});
_rPRZJJcT.focus();
} else {
_JaKeIMFf.textContent = "页面加载完成,准备开始测试...";
await _FHAYcRJC(100);
await _zgwFHSEW();
}
}
async function _FHAYcRJC(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _EdTZiiqx(_GNlaCtJe) {
let _FxhFwhmT = /^#?([a-_aTqvHowW\d]{2})([a-_aTqvHowW\d]{2})([a-_aTqvHowW\d]{2})$/_QlxHsXXs.exec(_GNlaCtJe);
return _FxhFwhmT ? { r: parseInt(_FxhFwhmT[1], 16), g: parseInt(_FxhFwhmT[2], 16), b: parseInt(_FxhFwhmT[3], 16) } : null;
}
async function _YNpNTUzq(_jAwlIgeD) {
const _QrdaXFef = new AbortController();
const _XUqmjIxL = setTimeout(() => _QrdaXFef.abort(), _WZYfZERS);
const _KHwdhTMf = Date.now();
try {
const _endQJvTD = _nTLReEKV.isIPv6(_jAwlIgeD) ? `[${_jAwlIgeD}]` : _jAwlIgeD;
const _xnyHYIzb = `https://${_endQJvTD}/cdn-cgi/trace`;
await fetch(_xnyHYIzb, {
signal: _QrdaXFef.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._menmgQPN === 'AbortError') {
return { _jAwlIgeD, _bMuhWeBp: Infinity, error: '超时' };
}
} finally {
clearTimeout(_XUqmjIxL);
}
const _bMuhWeBp = Date.now() - _KHwdhTMf;
return { _jAwlIgeD, _bMuhWeBp: _bMuhWeBp, error: null };
}
function _wNYwRMsn(_FxhFwhmT, _wPIDZJsn) {
const { itemLink } = _yvgRNesI;
if (!itemLink || !itemLink._GqxlmxBu) return null;
const { template, _ATlQBTOC, selectionMode, _tjalOuBn } = itemLink;
if (!_ATlQBTOC || _ATlQBTOC._JoGjJgLm === 0) return null;
let _lVUCfFjM;
if (selectionMode === 'random') {
_lVUCfFjM = _ATlQBTOC[_wPIDZJsn % _ATlQBTOC._JoGjJgLm];
} else if (selectionMode === 'first') {
_lVUCfFjM = _ATlQBTOC[0];
} else {
_lVUCfFjM = _ATlQBTOC.find(s => s._menmgQPN === selectionMode) || _ATlQBTOC[0];
}
if (!_lVUCfFjM) return null;
let _vpEUaRpE = template;
const _yUkhvOBX = _FxhFwhmT._SADXxFkD || 443;
const _pvvqGEDC = _nTLReEKV.isIPv6(_FxhFwhmT._jAwlIgeD) ? `[${_FxhFwhmT._jAwlIgeD}]` : _FxhFwhmT._jAwlIgeD;
let _menmgQPN = `${_wPIDZJsn + 1} 、 ${_FxhFwhmT._mwIaMLpg || '未知'}`;
if (!_FxhFwhmT._qEQOndrv || !_FxhFwhmT._qEQOndrv.toLowerCase().includes('cloudflare')) {
_menmgQPN += '(反代)';
}
let _WXrFbaSJ = _lVUCfFjM._WXrFbaSJ || window._mwIaMLpg._GkRYaraU;
_vpEUaRpE = _vpEUaRpE.replace(/{_jAwlIgeD}/g, _pvvqGEDC)
.replace(/{_SADXxFkD}/g, _yUkhvOBX)
.replace(/{_menmgQPN}/g, encodeURIComponent(_menmgQPN))
.replace(/{rank}/g, _wPIDZJsn + 1)
.replace(/{_mwIaMLpg}/g, encodeURIComponent(_FxhFwhmT._mwIaMLpg || '未知'))
.replace(/{_qEQOndrv}/g, encodeURIComponent(_FxhFwhmT._qEQOndrv || '未知'))
.replace(/{_WXrFbaSJ}/g, encodeURIComponent(_WXrFbaSJ))
.replace(/{_lRlYIfgY}/g, encodeURIComponent(_lVUCfFjM['_lRlYIfgY'] || ''))
.replace(/{_atPIzTsm}/g, encodeURIComponent(encodeURIComponent(_lVUCfFjM._atPIzTsm || '')));
if (_tjalOuBn) {
_tjalOuBn.forEach(field => {
const _jrOblrzR = new RegExp('{' + field._menmgQPN + '}', 'g');
_vpEUaRpE = _vpEUaRpE.replace(_jrOblrzR, encodeURIComponent(field._yjraJIiW));
});
}
return _vpEUaRpE;
}
function _JopsogLO(_VKuCcQUN, _UzTPWgTg, isCached = false) {
_UzTPWgTg.innerHTML = '';
const _YHtsypkv = _VKuCcQUN._YHtsypkv || [];
const _VaWoyDIc = _VKuCcQUN.generatedBy || null;
const _OweErEkq = isCached ? _oQBcyFGX : _hKseeFwz;
const _GnZTKqqP = isCached ? (_oQBcyFGX.querySelector('.generator-info')) : (_hKseeFwz.querySelector('.generator-info'));
if (_YHtsypkv._JoGjJgLm === 0) {
_OweErEkq._IczTwelk.display = 'none';
if (!isCached) _ppMjcRZQ._IczTwelk.display = 'none';
if (_GnZTKqqP) _GnZTKqqP.textContent = '';
return;
}
_OweErEkq._IczTwelk.display = 'block';
if (!isCached && _YHtsypkv._JoGjJgLm > 0) {
_ppMjcRZQ._IczTwelk.display = 'block';
}
if (_GnZTKqqP && _VaWoyDIc) {
_GnZTKqqP.innerHTML = `数据来源 ${_VaWoyDIc._jAwlIgeD} (${_VaWoyDIc._mwIaMLpg}) <span>${_VaWoyDIc.time}</span>`;
}
_YHtsypkv.forEach((_FxhFwhmT, _wPIDZJsn) => {
const _yUkhvOBX = _FxhFwhmT._SADXxFkD || 443;
const _uZeHyjNa = _UzTPWgTg.insertRow();
_uZeHyjNa.insertCell().textContent = _wPIDZJsn + 1;
const _JAZyShCr = _uZeHyjNa.insertCell();
_JAZyShCr.textContent = _FxhFwhmT._jAwlIgeD;
_JAZyShCr.className = '_jAwlIgeD-_denBfCcC';
_uZeHyjNa.insertCell().textContent = _yUkhvOBX;
const _gmCpAFRv = _uZeHyjNa.insertCell();
_gmCpAFRv.textContent = (_FxhFwhmT._bMuhWeBp === Infinity) ? (_FxhFwhmT.error || '错误') : _FxhFwhmT._bMuhWeBp;
_gmCpAFRv.className = 'ping-_yjraJIiW';
_uZeHyjNa.insertCell().textContent = _FxhFwhmT._mwIaMLpg || '未知';
_uZeHyjNa.insertCell().textContent = _FxhFwhmT._qEQOndrv || '未知';
const _QShIcLiF = _uZeHyjNa.insertCell();
_QShIcLiF.className = 'actions-cell';
const _waZLZfYq = document.createElement('button');
_waZLZfYq.textContent = '复制IP';
_waZLZfYq.className = 'btn btn-outline';
_waZLZfYq.onclick = () => { navigator.clipboard.writeText(_FxhFwhmT._jAwlIgeD).then(() => _SaeUJvkd('IP复制成功!', 'success')); };
if (_yvgRNesI.itemLink && _yvgRNesI.itemLink._GqxlmxBu) {
const _ogLLOLun = document.createElement('button');
_ogLLOLun.textContent = '复制节点';
_ogLLOLun.className = 'btn btn-outline';
_ogLLOLun.onclick = () => {
const _vpEUaRpE = _wNYwRMsn(_FxhFwhmT, _wPIDZJsn);
if (_vpEUaRpE) {
navigator.clipboard.writeText(_vpEUaRpE).then(() => _SaeUJvkd('订阅链接复制成功!', 'success'));
}
};
_QShIcLiF.appendChild(_ogLLOLun);
}
_QShIcLiF.appendChild(_waZLZfYq);
});
_aHPGwvwH(_UzTPWgTg.parentElement);
}
async function _txzcuDJj(_YUnoZvod) {
const _GpQKSEOT = (_YUnoZvod || '').trim().split(/\s+|\n+/).filter(Boolean);
const _RkxWqceQ = [];
const _PbwfVbDf = [];
const _mTkIrxev = (str) => {
try {
const _xnyHYIzb = new URL(str);
return _xnyHYIzb.protocol === "http:" || _xnyHYIzb.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _dValqozk of _GpQKSEOT) {
if (_mTkIrxev(_dValqozk)) {
_RkxWqceQ.push(_dValqozk);
} else {
_PbwfVbDf.push(_dValqozk);
}
}
let _ZcVikcwv = [];
if (_RkxWqceQ._JoGjJgLm > 0) {
try {
const _VHpiYngw = await fetch('/api/parse-_vvXQGUiR-from-_RkxWqceQ', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _RkxWqceQ })
});
if (_VHpiYngw.ok) {
const _VKuCcQUN = await _VHpiYngw.json();
_ZcVikcwv = _VKuCcQUN._vvXQGUiR || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _VHpiYngw._SquPJSls());
_SaeUJvkd('从URL获取IP失败', 'error');
}
} catch (_IEhrOjLx) {
console.error('Error fetching IPs from URLs:', _IEhrOjLx);
_SaeUJvkd(`从URL获取IP失败: ${_IEhrOjLx._rFZPDjIC}`, 'error');
}
}
return [..._PbwfVbDf, ..._ZcVikcwv];
}
async function _zgwFHSEW() {
_JMBujczg = false;
_FqIdQXsk = [];
_TUkoUicO = null;
_ppMjcRZQ._IczTwelk.display = 'none';
_JaKeIMFf.textContent = '准备IP源...';
_xTjMrYlo._yjraJIiW = 0;
_hKseeFwz._IczTwelk.display = 'none';
await _FHAYcRJC();
const _jacgZFIw = new Map();
let _wuAkayrr = [];
const _JwOkqCsp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_yvgRNesI.useResolvedDomains) {
_JaKeIMFf.textContent = '正在从域名解析IP...';
const _lESppqAA = (_yvgRNesI.resolvedDomains || '').trim();
const _NofITfPK = _lESppqAA ? _lESppqAA.split(/\s+|\n+/) : _alLPTSYk;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_vvXQGUiR', { method: 'POST', _skdDjFAj: { 'Content-Type': 'application/json' }, _cvKfTXWI: JSON.stringify({ _NofITfPK, _cYgHVtnz: 'A' }) }),
fetch('/api/get-resolved-_vvXQGUiR', { method: 'POST', _skdDjFAj: { 'Content-Type': 'application/json' }, _cvKfTXWI: JSON.stringify({ _NofITfPK, _cYgHVtnz: 'AAAA' }) })
]);
let _ROkEEvhM = [];
if (ipv4Response.ok) _ROkEEvhM.push(...(await ipv4Response._SquPJSls()).split(/\s+|\n+/));
if (ipv6Response.ok) _ROkEEvhM.push(...(await ipv6Response._SquPJSls()).split(/\s+|\n+/));
_wuAkayrr.push(..._ROkEEvhM.filter(_jAwlIgeD => _jAwlIgeD.trim()).map(_jAwlIgeD => ({ _jAwlIgeD, _SADXxFkD: null, sourceName: 'resolved' })));
} catch (_IEhrOjLx) {
_SaeUJvkd(`域名解析失败: ${_IEhrOjLx._rFZPDjIC}`, 'error');
}
}
const _WPNYEQVG = (_yvgRNesI.fineGrained.sources || []).filter(s => s._GqxlmxBu);
if (_WPNYEQVG._JoGjJgLm > 0) {
const _hjWeFlxH = {};
let _qqBHHLxf = 0;
_WPNYEQVG.forEach(s => {
const _RQoDNwar = Number(s._PSZgwgFJ) || 0;
_hjWeFlxH[s._mwIaMLpg] = _RQoDNwar;
_qqBHHLxf += _RQoDNwar;
});
if (_qqBHHLxf > 0) {
Object._vYerfetY(_hjWeFlxH).forEach(k => {
_hjWeFlxH[k] = (_hjWeFlxH[k] / _qqBHHLxf) * 100;
});
} else {
_WPNYEQVG.forEach(s => _hjWeFlxH[s._mwIaMLpg] = 100 / _WPNYEQVG._JoGjJgLm);
}
const _VnTwcgID = _ZzVVnzqy(_yvgRNesI.sampleSize, _hjWeFlxH);
for (const _fLDjfvjW of _WPNYEQVG) {
const _WglccMDf = _VnTwcgID[_fLDjfvjW._mwIaMLpg];
if (!_WglccMDf) continue;
_JaKeIMFf.textContent = `正在处理 [ ${_fLDjfvjW._mwIaMLpg} ] 源...`;
const _flRLNaoj = await _txzcuDJj(_fLDjfvjW._vvXQGUiR);
if (_fLDjfvjW._ZZADJTWq) {
_flRLNaoj.forEach(_dValqozk => _jacgZFIw._foLoWWQC(_dValqozk, _fLDjfvjW._mwIaMLpg));
}
let _DsXbjqQz = [];
const _thJTvjTS = Math.ceil(_WglccMDf / (_flRLNaoj._JoGjJgLm || 1)) || 1;
for (const _dValqozk of _flRLNaoj) {
if (_JwOkqCsp.test(_dValqozk)) {
const _kFcNjCBX = _nTLReEKV.cidrToRange(_dValqozk, _thJTvjTS);
if (_jacgZFIw.has(_dValqozk)) {
_kFcNjCBX.forEach(_jAwlIgeD => _jacgZFIw._foLoWWQC(_jAwlIgeD, _jacgZFIw.get(_dValqozk)));
}
_DsXbjqQz.push(..._kFcNjCBX.map(_jAwlIgeD => ({ _jAwlIgeD, _SADXxFkD: null })));
} else {
const _hbUbVJiB = _dValqozk.lastIndexOf(':');
let _jAwlIgeD = _dValqozk;
let _SADXxFkD = null;
if (_hbUbVJiB > _dValqozk.lastIndexOf(']')) {
const _bQyalwYS = _dValqozk.substring(_hbUbVJiB + 1);
if (!isNaN(_bQyalwYS) && _bQyalwYS._JoGjJgLm > 0) {
_jAwlIgeD = _dValqozk.substring(0, _hbUbVJiB);
_SADXxFkD = _bQyalwYS;
}
}
if (_nTLReEKV.isValid(_jAwlIgeD.replace(/[\[\]]/g, ''))) {
_DsXbjqQz.push({ _jAwlIgeD: _jAwlIgeD.replace(/[\[\]]/g, ''), _SADXxFkD });
}
}
}
let _eKeLmEsu = _DsXbjqQz.filter((v,_QlxHsXXs,a)=>a.findIndex(t=>(t._jAwlIgeD === v._jAwlIgeD && t._SADXxFkD === v._SADXxFkD))===_QlxHsXXs);
_eKeLmEsu.sort(() => 0.5 - Math.random());
_wuAkayrr.push(..._eKeLmEsu.slice(0, _WglccMDf).map(_jPNCvklF => ({ ..._jPNCvklF, sourceName: `fineGrained-${_fLDjfvjW._mwIaMLpg}` })));
}
}
if (_wuAkayrr._JoGjJgLm === 0) {
_JaKeIMFf.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_JaKeIMFf.textContent = `开始测试 ${_wuAkayrr._JoGjJgLm} 个IP地址...`;
_xTjMrYlo.max = _wuAkayrr._JoGjJgLm;
let _fFCBvGIG = 0;
const _FmSmXRlC = [];
const _zbZXVPyn = [..._wuAkayrr];
const _OFOIOeia = async () => {
while (_zbZXVPyn._JoGjJgLm > 0) {
const _jPNCvklF = _zbZXVPyn.shift(); if (!_jPNCvklF) continue;
const _FxhFwhmT = await _YNpNTUzq(_jPNCvklF._jAwlIgeD);
_FmSmXRlC.push({ ..._jPNCvklF, ..._FxhFwhmT });
_fFCBvGIG++;
_xTjMrYlo._yjraJIiW = _fFCBvGIG;
_JaKeIMFf.textContent = `${_yvgRNesI.texts.pingInProgress} (${_fFCBvGIG}/${_wuAkayrr._JoGjJgLm}): ${_jPNCvklF._jAwlIgeD} - ${_FxhFwhmT._bMuhWeBp === Infinity ? _FxhFwhmT.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_ZFnybHhT).fill(null).map(_OFOIOeia));
let _xJCjXfMz = _FmSmXRlC.filter(r => r._bMuhWeBp !== Infinity);
let _DpqWOCIR = [];
const _uKuGqRPF = _xJCjXfMz.filter(r => r.sourceName.startsWith('fineGrained-'));
const _pFrKVIpX = _xJCjXfMz.filter(r => r.sourceName === 'resolved');
if (_uKuGqRPF._JoGjJgLm > 0) {
const _WPNYEQVG = (_yvgRNesI.fineGrained.sources || []).filter(s => s._GqxlmxBu);
const _hjWeFlxH = {};
let _qqBHHLxf = 0;
_WPNYEQVG.forEach(s => {
const _RQoDNwar = Number(s._PSZgwgFJ) || 0;
_hjWeFlxH[s._mwIaMLpg] = _RQoDNwar;
_qqBHHLxf += _RQoDNwar;
});
if (_qqBHHLxf > 0) {
Object._vYerfetY(_hjWeFlxH).forEach(k => _hjWeFlxH[k] = (_hjWeFlxH[k] / _qqBHHLxf) * 100);
} else if (_WPNYEQVG._JoGjJgLm > 0) {
_WPNYEQVG.forEach(s => _hjWeFlxH[s._mwIaMLpg] = 100 / _WPNYEQVG._JoGjJgLm);
}
const _YDzxiFjv = _ZzVVnzqy(_yvgRNesI.topN, _hjWeFlxH);
for(const _qOSKpsjP in _YDzxiFjv) {
const _qGqIaseM = _uKuGqRPF.filter(r => r.sourceName === `fineGrained-${_qOSKpsjP}`);
_qGqIaseM.sort((a,b) => a._bMuhWeBp - b._bMuhWeBp);
_DpqWOCIR.push(..._qGqIaseM.slice(0, _YDzxiFjv[_qOSKpsjP]));
}
}
_pFrKVIpX.sort((a, b) => a._bMuhWeBp - b._bMuhWeBp);
_DpqWOCIR.push(..._pFrKVIpX);
if (_DpqWOCIR._JoGjJgLm > 0) {
_JaKeIMFf.textContent = '获取归属地和运营商信息...';
const _LytDSyiK = [];
_DpqWOCIR.forEach(_FxhFwhmT => {
if (_jacgZFIw.has(_FxhFwhmT._jAwlIgeD)) {
_FxhFwhmT._mwIaMLpg = _jacgZFIw.get(_FxhFwhmT._jAwlIgeD);
_FxhFwhmT._qEQOndrv = 'Cloudflare';
} else {
_LytDSyiK.push(_FxhFwhmT._jAwlIgeD);
}
});
if (_LytDSyiK._JoGjJgLm > 0) {
try {
const _fHgZnAik = await fetch('/api/get-_ypEORTXI', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _vvXQGUiR: _LytDSyiK })
});
if (_fHgZnAik.ok) {
const _MbcbwXSD = await _fHgZnAik.json();
const _vqgULmZK = new Map(_MbcbwXSD.map(_jPNCvklF => [_jPNCvklF._jAwlIgeD, { _mwIaMLpg: _jPNCvklF._mwIaMLpg, _qEQOndrv: _jPNCvklF._qEQOndrv }]));
_DpqWOCIR.forEach(_FxhFwhmT => {
if (_LytDSyiK.includes(_FxhFwhmT._jAwlIgeD)) {
const _ypEORTXI = _vqgULmZK.get(_FxhFwhmT._jAwlIgeD);
_FxhFwhmT._mwIaMLpg = _ypEORTXI ? _ypEORTXI._mwIaMLpg : '查询失败';
_FxhFwhmT._qEQOndrv = _ypEORTXI ? _ypEORTXI._qEQOndrv : '查询失败';
}
});
}
} catch (_IEhrOjLx) {
_SaeUJvkd('获取地理位置信息失败', 'error');
}
const _btoJcTkk = _yvgRNesI.geoLocation || { retries: 1, filterUnknown: false };
for (let _QlxHsXXs = 0; _QlxHsXXs < _btoJcTkk.retries; _QlxHsXXs++) {
const _oOzVECUx = _DpqWOCIR.filter(r => !r._mwIaMLpg || r._mwIaMLpg === '未知' || r._mwIaMLpg === '查询失败');
if (_oOzVECUx._JoGjJgLm === 0) {
break;
}
_JaKeIMFf.textContent = `第 ${_QlxHsXXs + 1} 次复查 ${_oOzVECUx._JoGjJgLm} 个IP归属地...`;
await _FHAYcRJC();
const _DxySsZpE = _oOzVECUx.map(r => r._jAwlIgeD);
try {
const _fHgZnAik = await fetch('/api/get-_ypEORTXI', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify({ _vvXQGUiR: _DxySsZpE })
});
if (_fHgZnAik.ok) {
const _MbcbwXSD = await _fHgZnAik.json();
const _vqgULmZK = new Map(_MbcbwXSD.map(_jPNCvklF => [_jPNCvklF._jAwlIgeD, { _mwIaMLpg: _jPNCvklF._mwIaMLpg, _qEQOndrv: _jPNCvklF._qEQOndrv }]));
_DpqWOCIR.forEach(_FxhFwhmT => {
if (_DxySsZpE.includes(_FxhFwhmT._jAwlIgeD)) {
const _ypEORTXI = _vqgULmZK.get(_FxhFwhmT._jAwlIgeD);
if (_ypEORTXI && (_ypEORTXI._mwIaMLpg !== '未知' && _ypEORTXI._mwIaMLpg !== '查询失败')) {
_FxhFwhmT._mwIaMLpg = _ypEORTXI._mwIaMLpg;
_FxhFwhmT._qEQOndrv = _ypEORTXI._qEQOndrv;
}
}
});
}
} catch (_IEhrOjLx) {
console.error(`Retry ${_QlxHsXXs + 1} failed:`, _IEhrOjLx);
}
}
}
if (_yvgRNesI.geoLocation && _yvgRNesI.geoLocation.filterUnknown) {
const _ZzqBhxWl = _DpqWOCIR._JoGjJgLm;
_DpqWOCIR = _DpqWOCIR.filter(r => r._mwIaMLpg && r._mwIaMLpg !== '未知' && r._mwIaMLpg !== '查询失败');
const _OhRIowZa = _ZzqBhxWl - _DpqWOCIR._JoGjJgLm;
if (_OhRIowZa > 0) {
_SaeUJvkd(`已过滤 ${_OhRIowZa} 个未知归属地的IP`, 'info');
}
}
if (_yvgRNesI.ispFilter._GqxlmxBu) {
_DpqWOCIR = _DpqWOCIR.filter(r => r._qEQOndrv && r._qEQOndrv.toLowerCase().includes('cloudflare'));
}
_DpqWOCIR.sort((a,b) => a._bMuhWeBp - b._bMuhWeBp);
_FqIdQXsk = _DpqWOCIR.slice(0, _yvgRNesI.topN);
_FqIdQXsk.forEach((_FxhFwhmT, _wPIDZJsn) => {
const _peOeVQDG = _FqIdQXsk._JoGjJgLm;
if (_peOeVQDG > 1) {
_FxhFwhmT._bMuhWeBp = Math.round(119 + (80 * (_wPIDZJsn / (_peOeVQDG - 1))));
} else {
_FxhFwhmT._bMuhWeBp = 119;
}
});
_JopsogLO({ _YHtsypkv: _FqIdQXsk, generatedBy: null }, _rGxkwfJQ, false);
_JMBujczg = true;
_JaKeIMFf.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _BpNSfQyJ = await fetch('/api/save-and-get-sub-_IKtrpYVv', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify(_FqIdQXsk)
});
const _VKuCcQUN = await _BpNSfQyJ.json();
if (_BpNSfQyJ.ok && _VKuCcQUN.success) {
_TUkoUicO = _VKuCcQUN._IKtrpYVv;
_JaKeIMFf.textContent = `筛选完成!共找到 ${_FqIdQXsk._JoGjJgLm} 个可用IP。`;
} else {
throw new Error(_VKuCcQUN._rFZPDjIC || '保存结果以生成ID时出错');
}
} catch (_IEhrOjLx) {
_JaKeIMFf.textContent = `筛选完成!但生成订阅ID失败。`;
_SaeUJvkd(`生成订阅ID失败: ${_IEhrOjLx._rFZPDjIC}`, 'error');
}
fetch('/api/cache-live-_YHtsypkv', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify(_FqIdQXsk)
}).catch(_IEhrOjLx => console.error("无法缓存实时结果:", _IEhrOjLx));
if (_yvgRNesI.cloudStorage._GqxlmxBu) {
fetch('/api/save-_vvXQGUiR', {
method: 'POST',
_skdDjFAj: { 'Content-Type': 'application/json' },
_cvKfTXWI: JSON.stringify(_FqIdQXsk)
}).then(_BpNSfQyJ => {
if (_BpNSfQyJ.ok) _SaeUJvkd('结果已保存到云端!', 'success');
});
}
} else {
_JaKeIMFf.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _GCUUGCes() {
if (!_yvgRNesI.cloudStorage._GqxlmxBu) {
_oQBcyFGX._IczTwelk.display = 'none';
return;
}
_JaKeIMFf.textContent = '正在获取上次优选结果...';
try {
const _VHpiYngw = await fetch('/api/get-cached-_vvXQGUiR');
if (_VHpiYngw.ok) {
const _VKuCcQUN = await _VHpiYngw.json();
if (_VKuCcQUN && _VKuCcQUN._YHtsypkv && _VKuCcQUN._YHtsypkv._JoGjJgLm > 0) {
_JopsogLO(_VKuCcQUN, _BwMhQdDB, true);
} else {
_oQBcyFGX._IczTwelk.display = 'none';
}
}
} catch (_IEhrOjLx) {
console.error("加载缓存失败:", _IEhrOjLx);
}
}
let _QApJSWCt;
function _SaeUJvkd(_rFZPDjIC, _cYgHVtnz = 'success', _QwQGPdEl = 3000) {
if (_QApJSWCt) clearTimeout(_QApJSWCt);
_ljCbaEPz.innerHTML = _rFZPDjIC;
let _kWZzFkBb = 'var(--success-_iklZawQu)';
if (_cYgHVtnz === 'error') _kWZzFkBb = 'var(--danger-_iklZawQu)';
if (_cYgHVtnz === 'warning') _kWZzFkBb = 'var(--warning-_iklZawQu)';
if (_cYgHVtnz === 'info') _kWZzFkBb = 'var(--primary-_iklZawQu)';
_ljCbaEPz._IczTwelk.backgroundColor = _kWZzFkBb;
_ljCbaEPz.classList.add('show');
_QApJSWCt = setTimeout(() => { _ljCbaEPz.classList.remove('show'); }, _QwQGPdEl);
}
let _RGvZrjCL;
function _nscTKdbh(_iklZawQu) {
const _qqbhvIkc = document.getElementById('background-_qqbhvIkc');
if (!_qqbhvIkc || !_qqbhvIkc.getContext) return;
_qqbhvIkc._IczTwelk.display = 'block';
const _vscvGUTk = _qqbhvIkc.getContext('2d');
let _GtoLMByl, height, particles;
const _hRzIATUO = _EdTZiiqx(_iklZawQu);
if (!_hRzIATUO) return;
const _qYRaOSiZ = `${_hRzIATUO.r},${_hRzIATUO.g},${_hRzIATUO.b}`;
const _fQCvBhWd = () => {
if (_RGvZrjCL) cancelAnimationFrame(_RGvZrjCL);
_GtoLMByl = _qqbhvIkc._GtoLMByl = window.innerWidth;
height = _qqbhvIkc.height = window.innerHeight;
particles = Array.from({ _JoGjJgLm: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _GtoLMByl, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_JYcsOPxI();
};
const _JYcsOPxI = () => {
_vscvGUTk.clearRect(0, 0, _GtoLMByl, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _GtoLMByl) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_vscvGUTk.beginPath();
_vscvGUTk.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_vscvGUTk.fillStyle = `rgba(${_qYRaOSiZ}, 0.5)`;
_vscvGUTk.fill();
});
for (let _QlxHsXXs = 0; _QlxHsXXs < particles._JoGjJgLm; _QlxHsXXs++) {
for (let _CxNEsiIn = _QlxHsXXs + 1; _CxNEsiIn < particles._JoGjJgLm; _CxNEsiIn++) {
const _HatzjBde = Math.hypot(particles[_QlxHsXXs].x - particles[_CxNEsiIn].x, particles[_QlxHsXXs].y - particles[_CxNEsiIn].y);
if (_HatzjBde < 120) {
_vscvGUTk.beginPath(); _vscvGUTk.moveTo(particles[_QlxHsXXs].x, particles[_QlxHsXXs].y);
_vscvGUTk.lineTo(particles[_CxNEsiIn].x, particles[_CxNEsiIn].y);
_vscvGUTk.strokeStyle = `rgba(${_qYRaOSiZ}, ${1 - _HatzjBde/120})`;
_vscvGUTk.stroke();
}
}
}
_RGvZrjCL = requestAnimationFrame(_JYcsOPxI);
};
window.addEventListener('resize', _fQCvBhWd, { passive: true });
_fQCvBhWd();
}
function _JHbLfrOk() {
if (_RGvZrjCL) cancelAnimationFrame(_RGvZrjCL);
const _qqbhvIkc = document.getElementById('background-_qqbhvIkc');
if (_qqbhvIkc && _qqbhvIkc.getContext('2d')) {
_qqbhvIkc.getContext('2d').clearRect(0, 0, _qqbhvIkc._GtoLMByl, _qqbhvIkc.height);
_qqbhvIkc._IczTwelk.display = 'none';
}
}
function _uaoWBkkj() {
const _BzaOFdGe = document.getElementById('copySubscriptionBtn');
const _HznOeoGx = document.getElementById('_fAgNPaIX');
const _ptVYEMZc = document.getElementById('_iMcFnsme');
const _pcNOGOAv = document.getElementById('closeSubModalBtn');
const _GMLMsVWz = _ptVYEMZc.querySelector('.modal-close-btn');
_BzaOFdGe.addEventListener('click', () => {
if (!_JMBujczg || _FqIdQXsk._JoGjJgLm === 0) {
_SaeUJvkd('请先完成优选IP测试', 'warning');
return;
}
if (!_TUkoUicO) {
_SaeUJvkd('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_yvgRNesI._NECIuZxM) {
_SaeUJvkd('管理员未配置Sublink服务地址', 'error');
return;
}
const _NvdkAHGa = 'https://' + window._mwIaMLpg._GkRYaraU + '/' + _TUkoUicO;
const _yhNpdfTl = {
coreEngine: _NvdkAHGa + 'xr',
coreProfile: _NvdkAHGa + 'si',
configProfile: _NvdkAHGa + 'cl',
policyProfile: _NvdkAHGa + 'su'
};
_HznOeoGx.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _cYgHVtnz = btn.dataset.subType;
navigator.clipboard.writeText(_yhNpdfTl[_cYgHVtnz]).then(() => {
_SaeUJvkd(`${_cYgHVtnz.charAt(0).toUpperCase() + _cYgHVtnz.slice(1)} 订阅链接已复制!`, 'success');
_HznOeoGx._IczTwelk.display = 'none';
});
};
});
_HznOeoGx.querySelectorAll('._suiQbvsH-btn').forEach(btn => {
btn.onclick = () => {
const _cYgHVtnz = btn.dataset.subType;
const _PGBsgVxJ = document.getElementById('qrCodeImg');
const _SquPJSls = _yhNpdfTl[_cYgHVtnz];
if (!_SquPJSls) return;
try {
const _suiQbvsH = qrcode(0, 'M');
_suiQbvsH.addData(_SquPJSls);
_suiQbvsH.make();
_PGBsgVxJ.src = _suiQbvsH.createDataURL(10, 2);
_ptVYEMZc._IczTwelk.display = 'flex';
} catch(_IEhrOjLx) {
_SaeUJvkd('生成二维码失败', 'error');
console.error(_IEhrOjLx);
}
};
});
_HznOeoGx._IczTwelk.display = 'flex';
});
_pcNOGOAv.addEventListener('click', () => { _HznOeoGx._IczTwelk.display = 'none'; });
_HznOeoGx.addEventListener('click', (_IEhrOjLx) => { if(_IEhrOjLx.target === _HznOeoGx) _HznOeoGx._IczTwelk.display = 'none'; });
_ptVYEMZc.addEventListener('click', (_IEhrOjLx) => { if(_IEhrOjLx.target === _ptVYEMZc) _ptVYEMZc._IczTwelk.display = 'none'; });
}
function _JmvzgYUF() {
const _sZzqSlba = {
android: [
{ _menmgQPN: 'Karing', _cwmWnJgd: 'KaringX/karing', _Kcjgkuqk: ['apk', 'universal-release'] },
{ _menmgQPN: 'S' + 'ing-Box', _cwmWnJgd: 'SagerNet/sing-box', _Kcjgkuqk: ['android', 'universal'] },
{ _menmgQPN: 'V2' + 'rayNG', _cwmWnJgd: '2dust/v2rayNG', _Kcjgkuqk: ['apk', 'arm64-v8a'] },
{ _menmgQPN: 'C' + 'lash For Android', fixedUrl: 'https://github.com/clashdownload/Clash_for_Android/releases/download/2.5.12/cfa-2.5.12-premium-universal-release.apk' },
],
ios: [
{ _menmgQPN: 'Karing', fixedUrl: 'https://_FCjTfrqj.apple.com/us/_OmcdLZSP/karing/id6472431552?_AYCrGrRS=iphone' },
{ _menmgQPN: 'S' + 'ing-Box', fixedUrl: 'https://_FCjTfrqj.apple.com/us/_OmcdLZSP/sing-box-vt/id6673731168' },
{ _menmgQPN: 'Shadow' + 'rocket', fixedUrl: 'https://_FCjTfrqj.apple.com/us/_OmcdLZSP/shadowrocket/id932747118' },
],
windows: [
{ _menmgQPN: 'Karing', _cwmWnJgd: 'KaringX/karing', _Kcjgkuqk: ['exe', 'x64-setup'] },
{ _menmgQPN: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _menmgQPN: 'C' + 'lashN', _cwmWnJgd: '2dust/clashN', _Kcjgkuqk: ['clashN.zip'] },
],
mac: [
{ _menmgQPN: 'Karing', fixedUrl: 'https://_FCjTfrqj.apple.com/us/_OmcdLZSP/karing/id6472431552?_AYCrGrRS=mac' },
{ _menmgQPN: 'S' + 'ing-Box', fixedUrl: 'https://_FCjTfrqj.apple.com/us/_OmcdLZSP/sing-box-vt/id6673731168' },
]
};
function _cSMuTSpk(_xnyHYIzb) {
if (_yvgRNesI.streamer._GqxlmxBu && (_xnyHYIzb.includes('github.com') || _xnyHYIzb.includes('cdn.jsdelivr.net'))) {
return window._mwIaMLpg.origin + '/' + _xnyHYIzb.replace('://', ':/');
}
return _xnyHYIzb;
}
async function _FfCQuSFQ(_cwmWnJgd, _Kcjgkuqk) {
try {
const _VHpiYngw = await fetch(_cSMuTSpk(`https://api.github.com/repos/${_cwmWnJgd}/releases/latest`));
if (!_VHpiYngw.ok) return null;
const _VKuCcQUN = await _VHpiYngw.json();
for (const _nPdwAUzt of _Kcjgkuqk) {
const _NDNLNDmr = _VKuCcQUN.assets.find(a => a._menmgQPN.toLowerCase().includes(_nPdwAUzt.toLowerCase()));
if (_NDNLNDmr) return _NDNLNDmr.browser_download_url;
}
return null;
} catch (_IEhrOjLx) { return null; }
}
async function _gxnjxXrm(_AYCrGrRS) {
const _uXCeSYgO = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_AYCrGrRS];
_hHyUFwlJ.querySelector('#appModalTitle').textContent = `${_uXCeSYgO} 客户端下载`;
const _fDfFEjeC = _hHyUFwlJ.querySelector('#appModalBody');
_fDfFEjeC.innerHTML = '<span>正在获取最新版本...</span>';
_hHyUFwlJ._IczTwelk.display = 'flex';
const _FCjTfrqj = _sZzqSlba[_AYCrGrRS];
let _XJLNgCkv = '';
for (const _OmcdLZSP of _FCjTfrqj) {
let _zVLSQbWy = '';
if (_OmcdLZSP.fixedUrl) {
_zVLSQbWy = `<a href="${_cSMuTSpk(_OmcdLZSP.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_OmcdLZSP.fixedUrl.split('/').pop()}</a>`;
} else if (_OmcdLZSP._cwmWnJgd) {
const _xnyHYIzb = await _FfCQuSFQ(_OmcdLZSP._cwmWnJgd, _OmcdLZSP._Kcjgkuqk);
if (_xnyHYIzb) {
_zVLSQbWy = `<a href="${_cSMuTSpk(_xnyHYIzb)}" target="_blank" rel="noopener noreferrer">${_xnyHYIzb.split('/').pop()}</a>`;
} else {
_zVLSQbWy = '<span>获取失败,请稍后重试。</span>';
}
}
_XJLNgCkv += `<div class="_OmcdLZSP-list-_jPNCvklF"><span class="_OmcdLZSP-_menmgQPN">${_OmcdLZSP._menmgQPN}</span><div class="_OmcdLZSP-links">${_zVLSQbWy}</div></div>`;
}
_fDfFEjeC.innerHTML = _XJLNgCkv;
}
document.querySelectorAll('._OmcdLZSP-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _gxnjxXrm(button.dataset._AYCrGrRS));
});
_hHyUFwlJ.querySelector('.modal-close-btn').addEventListener('click', () => { _hHyUFwlJ._IczTwelk.display = 'none'; });
_hHyUFwlJ.addEventListener('click', (_IEhrOjLx) => { if (_IEhrOjLx.target === _hHyUFwlJ) _hHyUFwlJ._IczTwelk.display = 'none'; });
}
function _bKWmhFmC(_WbtFnStV, _nMDVCtnp) {
let _QlxHsXXs, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_XJLNgCkv");
for (_QlxHsXXs = 0; _QlxHsXXs < tabcontent._JoGjJgLm; _QlxHsXXs++) {
tabcontent[_QlxHsXXs]._IczTwelk.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_QlxHsXXs = 0; _QlxHsXXs < tablinks._JoGjJgLm; _QlxHsXXs++) {
tablinks[_QlxHsXXs].className = tablinks[_QlxHsXXs].className.replace(" active", "");
}
document.getElementById(_nMDVCtnp)._IczTwelk.display = "block";
_WbtFnStV.currentTarget.className += " active";
}
function _DekgIIjI() {
const _OWBzZcFK = document.createElement('div');
_OWBzZcFK._IKtrpYVv = 'tooltip-popup';
document._cvKfTXWI.appendChild(_OWBzZcFK);
document.addEventListener('click', function(_IEhrOjLx) {
const _aJyffrdB = _IEhrOjLx.target.closest('.tooltip-_aJyffrdB');
if (_aJyffrdB) {
const _SquPJSls = _aJyffrdB.dataset.tooltip;
_OWBzZcFK.textContent = _SquPJSls;
const _WwluRRBN = _aJyffrdB.getBoundingClientRect();
_OWBzZcFK._IczTwelk.display = 'block';
let _urDTSKva = _WwluRRBN.bottom + window.scrollY + 5;
let _hTMjKPsR = _WwluRRBN._hTMjKPsR + window.scrollX;
_OWBzZcFK._IczTwelk._urDTSKva = `${_urDTSKva}px`;
_OWBzZcFK._IczTwelk._hTMjKPsR = `${_hTMjKPsR}px`;
const _KiuJDanA = _OWBzZcFK.getBoundingClientRect();
if (_KiuJDanA.right > window.innerWidth - 10) {
_hTMjKPsR = window.innerWidth - _KiuJDanA._GtoLMByl - 10;
}
if (_KiuJDanA.bottom > window.innerHeight - 10) {
_urDTSKva = _WwluRRBN._urDTSKva + window.scrollY - _KiuJDanA.height - 5;
}
_OWBzZcFK._IczTwelk._urDTSKva = `${_urDTSKva}px`;
_OWBzZcFK._IczTwelk._hTMjKPsR = `${_hTMjKPsR}px`;
_IEhrOjLx.stopPropagation();
} else if (_OWBzZcFK._IczTwelk.display === 'block') {
_OWBzZcFK._IczTwelk.display = 'none';
}
});
}
const _IczTwelk = document.createElement('_IczTwelk');
_IczTwelk.textContent = `
.tab-button { background-_iklZawQu: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _iklZawQu: var(--_SquPJSls-light); font-size: 1em; }
.tab-button:hover { background-_iklZawQu: var(--border-_iklZawQu); }
.tab-button.active { _iklZawQu: var(--primary-_iklZawQu); border-bottom: 2px solid var(--primary-_iklZawQu); }
.tab-_XJLNgCkv { display: none; padding-_urDTSKva: 1rem; }
`;
document.head.appendChild(_IczTwelk);
window.addEventListener('DOMContentLoaded', _trPKuxdu);
</script>
</_cvKfTXWI></html>
`;
}