import { connect } from "cloudflare:sockets";
const _LdIVjFES = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _NelsIFol = ["UpstreamAddress.SG.CMLiussss.net"];
const _HBoGSXay = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _VpEZptzr = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _VTYRGcDi = '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 _eIdtJgni = '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 _hSQUsrcG(_FBQbAyCC) {
if (Array.isArray(_FBQbAyCC)) {
try {
return String.fromCharCode.apply(null, _FBQbAyCC);
} catch (_GeVMwtrS) {
return '';
}
}
return _FBQbAyCC;
}
function _cIeynTEL(_THtSeuPG) {
return /^[0-9a-_izitsuQo]{8}-[0-9a-_izitsuQo]{4}-[4][0-9a-_izitsuQo]{3}-[89ab][0-9a-_izitsuQo]{3}-[0-9a-_izitsuQo]{12}$/_BBAXsRLo.test(_THtSeuPG);
}
const _KPHYccvg = "optimized_ips_v4";
const _sNCGYMlM = "global_config_v4";
const _oqEggTZq = "admin_password_v4";
const _rkPrdMxk = "live_results_temp_v1";
const _aDmtRkLx = "latest_sub_id_v1";
export default {
async fetch(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB) {
try {
if (!_iRqWjQOz.DB) {
const _CBFzdFjE = _VeajSVzu("D1 数据库 'DB' 未绑定。");
return new Response(_CBFzdFjE, { status: 503, _paUAWFeo: { 'Content-Type': '_BUoTWGoa/html;_IIzcGMEL=UTF-8' }});
}
_PJxNWIzB.waitUntil(
_iRqWjQOz.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_YDUZLBvr TEXT PRIMARY KEY, _FBQbAyCC TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_THtSeuPG TEXT PRIMARY KEY, _TkYsDiBj TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_GeVMwtrS => console.error("DB Init Error:", _GeVMwtrS._sTMRczLI))
);
const _zAaODIsh = new URL(_MYqTjBQQ._zAaODIsh);
const _DLiwXEbL = _zAaODIsh.pathname;
const _aeGbhfDQ = _MYqTjBQQ._paUAWFeo.get("Upgrade");
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (_ZZzxFnKC.websocketStreamer && _ZZzxFnKC.websocketStreamer._lcNlehfu && _aeGbhfDQ && _aeGbhfDQ.toLowerCase() === "websocket") {
const _KRXErsmk = _ZZzxFnKC.websocketStreamer._zAaODIsh;
if (_KRXErsmk && _KRXErsmk.trim().startsWith('https://')) {
try {
const _rEyXXpXD = new Request(_KRXErsmk.trim() + _zAaODIsh.pathname + _zAaODIsh.search, _MYqTjBQQ);
return await fetch(_rEyXXpXD);
} catch (_GeVMwtrS) {
return new Response(`Upstream WebSocket gateway failed: ${_GeVMwtrS._sTMRczLI}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_aeGbhfDQ && _aeGbhfDQ.toLowerCase() === "websocket") {
return await _zgEzyyMa(_MYqTjBQQ, _iRqWjQOz, _ZZzxFnKC);
}
const _nQujRyus = _DLiwXEbL._iozZJGwg(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_nQujRyus) {
const [, _tQeAkzkt, typeSuffix] = _nQujRyus;
const _GRYxeaSS = _ZZzxFnKC._GRYxeaSS;
if (!_GRYxeaSS || _GRYxeaSS.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' } });
}
const _zWQizEEQ = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _aMDrkuZI = _zWQizEEQ[typeSuffix];
const _vNrNjpVb = _GRYxeaSS.replace(/\/$/, '');
const _gCqDXgpF = `${_zAaODIsh.origin}/${_tQeAkzkt}`;
const _FgBZaLXl = `${_vNrNjpVb}/${_aMDrkuZI}?_ZZzxFnKC=${encodeURIComponent(_gCqDXgpF)}`;
try {
const _NBzMpVTM = await fetch(_FgBZaLXl, { _paUAWFeo: { 'User-Agent': _MYqTjBQQ._paUAWFeo.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _zbeNgMYU = new Headers(_NBzMpVTM._paUAWFeo);
_zbeNgMYU._arelwzqZ('Access-Control-Allow-Origin', '*');
return new Response(_NBzMpVTM._kXbnAASj, { status: _NBzMpVTM.status, statusText: _NBzMpVTM.statusText, _paUAWFeo: _zbeNgMYU });
} catch (_GeVMwtrS) {
return new Response(`获取上游订阅失败: ${_GeVMwtrS._sTMRczLI}`, { status: 502, _paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' } });
}
}
if (_DLiwXEbL.startsWith('/https:/') || _DLiwXEbL.startsWith('/http:/')) {
return _KKjCOyTS(_MYqTjBQQ, _ZZzxFnKC);
}
if (_ZZzxFnKC.customSubPath && _ZZzxFnKC.customSubPath._lcNlehfu && _ZZzxFnKC.customSubPath._DLiwXEbL && _DLiwXEbL === '/' + _ZZzxFnKC.customSubPath._DLiwXEbL.trim()) {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_aDmtRkLx);
const { _MnpFDbXe } = await _qQkHGXFd.all();
const _XUgEeHzn = _MnpFDbXe._jInLcehe > 0 ? _MnpFDbXe[0]._FBQbAyCC : null;
if (_XUgEeHzn) {
return _kqbCzhcl({ _wOlchvnm: { _THtSeuPG: _XUgEeHzn }, _zAaODIsh: _MYqTjBQQ._zAaODIsh }, _iRqWjQOz);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' } });
}
}
const _dJBebSIn = _DLiwXEbL.split('/').filter(Boolean);
if (_dJBebSIn._jInLcehe === 1 && !_DLiwXEbL.startsWith('/api/')) {
const _tQeAkzkt = _dJBebSIn[0];
return _kqbCzhcl({ _wOlchvnm: { _THtSeuPG: _tQeAkzkt }, _zAaODIsh: _MYqTjBQQ._zAaODIsh }, _iRqWjQOz);
}
if (_DLiwXEbL.startsWith('/api/')) {
if (_DLiwXEbL === '/api/_ZZzxFnKC' && _MYqTjBQQ.method === 'POST') return _NeydJJRo(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB);
if (_DLiwXEbL === '/api/_arelwzqZ-_XpDwJwbK') return _gqMNMtGC(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/change-_XpDwJwbK') return _PppAVneU(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/verify-_XpDwJwbK') return _WzcryJVF(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/verify-visitor-_XpDwJwbK' && _MYqTjBQQ.method === 'POST') return _lAmsYiql(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/cache-live-_MnpFDbXe' && _MYqTjBQQ.method === 'POST') return _UPeMGLGv(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB);
if (_DLiwXEbL === '/api/get-_hbltXOGW' && _MYqTjBQQ.method === 'POST') return _kfIWORaQ(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/get-cached-_HFYCrqGN') return _ecvhsalZ(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/save-_HFYCrqGN') return _MfaRCpiK(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB);
if (_DLiwXEbL === '/api/save-and-get-sub-_THtSeuPG' && _MYqTjBQQ.method === 'POST') return _FqkbhawH(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL.startsWith('/api/get-_tTIovRgR/')) {
const _tQeAkzkt = _DLiwXEbL.split('/').pop();
return _kqbCzhcl({ _wOlchvnm: { _THtSeuPG: _tQeAkzkt }, _zAaODIsh: _MYqTjBQQ._zAaODIsh }, _iRqWjQOz);
}
if (_DLiwXEbL === '/api/_ZZzxFnKC' && _MYqTjBQQ.method === 'GET') return _FAXqlycc(_iRqWjQOz);
if (_DLiwXEbL === '/api/get-resolved-_HFYCrqGN') return _qRkkuHRS(_MYqTjBQQ);
if (_DLiwXEbL === '/api/parse-_HFYCrqGN-from-_qlNZxhhW' && _MYqTjBQQ.method === 'POST') return _mZtBdril(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/endpoints') return _rdpJuzCA(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_DLiwXEbL === '/_IlyHmPLV') return _YwMilwXL(_MYqTjBQQ, _iRqWjQOz);
if (_DLiwXEbL === '/bing-wallpaper') return _mpjIKYVe();
return _UZONOrkh(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB);
} catch (err) {
let _GeVMwtrS = err;
return new Response(_GeVMwtrS.toString(), { status: 500 });
}
}
};
const _vPpGGVUl = { 'Accept': '_BUoTWGoa/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 _fNvmNqGf(_zAaODIsh, _fhCfnAPH) {
const _MAgoOwST = await fetch(_zAaODIsh, { _paUAWFeo: { ..._vPpGGVUl, 'Referer': _fhCfnAPH.referer } });
if (_MAgoOwST.ok) return _MAgoOwST._BUoTWGoa();
return null;
}
async function _HVuqKOVf(_zAaODIsh, _fhCfnAPH) {
const _dhMXITew = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_zAaODIsh)}`;
const _MAgoOwST = await fetch(_dhMXITew, { _paUAWFeo: { ..._vPpGGVUl, 'Referer': _fhCfnAPH.referer } });
if (!_MAgoOwST.ok) return null;
const _kXbnAASj = await _MAgoOwST._BUoTWGoa();
const _iozZJGwg = _kXbnAASj._iozZJGwg(/<pre[^>]*>([\s\S]*?)<\/pre>/_BBAXsRLo);
return _iozZJGwg && _iozZJGwg[1] ? _iozZJGwg[1].replace(/&/g, '&') : null;
}
function _KGQDLlnO(_KRZgPwRW) {
let _GoUriuLC;
try {
_GoUriuLC = atob(_KRZgPwRW.replace(/\s/g, ''));
} catch (_GeVMwtrS) {
_GoUriuLC = _KRZgPwRW;
}
const _tTIovRgR = _GoUriuLC.split(/[\s\n\r,]+/).filter(line => line.trim());
const _BxSOrMFB = new Set();
const _vVerGqfN = /@([^?#]+?):(\d+)/;
for (const _oQhFmxOg of _tTIovRgR) {
let _aYgbMerc = '';
let _PHBtRDqv = '';
try {
if (_oQhFmxOg.startsWith('vmess://')) {
const _ykWNTdnv = atob(_oQhFmxOg.substring(8));
const _ZZzxFnKC = JSON.parse(_ykWNTdnv);
_aYgbMerc = _ZZzxFnKC.add;
_PHBtRDqv = _ZZzxFnKC._PHBtRDqv;
} else {
const _iozZJGwg = _oQhFmxOg._iozZJGwg(_vVerGqfN);
if (_iozZJGwg && _iozZJGwg[1] && _iozZJGwg[2]) {
_aYgbMerc = _iozZJGwg[1].replace(/[\[\]]/g, '');
_PHBtRDqv = _iozZJGwg[2];
}
}
} catch (_GeVMwtrS) {
console.warn(`Could not parse _oQhFmxOg: ${_oQhFmxOg}`);
}
if (_aYgbMerc && _PHBtRDqv) {
_BxSOrMFB.add(`${_aYgbMerc}:${_PHBtRDqv}`);
}
}
return Array.from(_BxSOrMFB);
}
async function _zLuIoCao(_ZjDoQcBx) {
try {
const _MAgoOwST = await fetch(_ZjDoQcBx, { _paUAWFeo: _vPpGGVUl });
if (!_MAgoOwST.ok) {
console.error(`Failed to fetch subscription: ${_MAgoOwST.status}`);
return [];
}
const _KRZgPwRW = await _MAgoOwST._BUoTWGoa();
return _KGQDLlnO(_KRZgPwRW);
} catch (error) {
console.error(`Error processing subscription ${_ZjDoQcBx}:`, error);
return [];
}
}
async function _LFMKekJe(_NlDfrBNS) {
const _yDnZIpZV = _NlDfrBNS.trim();
const _vccwDUXP = /^(vless|vmess|trojan|ss):\/\//.test(_yDnZIpZV);
const _DLYXWdpZ = (() => {
if (_yDnZIpZV._jInLcehe < 20 || _yDnZIpZV.startsWith('http')) return false;
const _WcyfztxR = _yDnZIpZV.replace(/\s/g, '');
if (_WcyfztxR._jInLcehe % 4 !== 0 && !_WcyfztxR.includes('=')) return false;
try {
atob(_WcyfztxR);
return true;
} catch (_GeVMwtrS) {
return false;
}
})();
if (_vccwDUXP || _DLYXWdpZ) {
return _KGQDLlnO(_yDnZIpZV).join('\n');
}
const _dAiqVeLV = [
'https://ipdb.api.030101.xyz/?_JqCvMdDD=bestcf&_azSgHiXU=true',
'https://ipdb.api.030101.xyz/?_JqCvMdDD=bestproxy&_azSgHiXU=true'
];
const _LjSOkUEB = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_BBAXsRLo.test(_NlDfrBNS) || _NlDfrBNS.includes('?_telLvYWN=');
if (_LjSOkUEB) {
const _HFYCrqGN = await _zLuIoCao(_NlDfrBNS);
return _HFYCrqGN.join('\n');
}
let _KRZgPwRW = '';
if (_dAiqVeLV.includes(_NlDfrBNS)) {
_KRZgPwRW = await _fNvmNqGf(_NlDfrBNS, { referer: _NlDfrBNS });
if (!_KRZgPwRW || _KRZgPwRW._jInLcehe < 8) {
_KRZgPwRW = await _HVuqKOVf(_NlDfrBNS, { referer: _NlDfrBNS });
}
} else {
try {
const _arLFutSv = await fetch(_NlDfrBNS, { _paUAWFeo: { 'User-Agent': 'Cloudflare-Worker' } });
if (_arLFutSv.ok) {
_KRZgPwRW = await _arLFutSv._BUoTWGoa();
} else {
console.warn(`Failed to fetch URL ${_NlDfrBNS}: ${_arLFutSv.status}`);
}
} catch (_GeVMwtrS) {
console.error(`Error fetching URL ${_NlDfrBNS}:`, _GeVMwtrS);
}
}
const _KEvTfQqI = _KGQDLlnO(_KRZgPwRW);
if (_KEvTfQqI._jInLcehe > 0) {
return _KEvTfQqI.join('\n');
}
return _KRZgPwRW || '';
}
async function _KKjCOyTS(_MYqTjBQQ, _ZZzxFnKC) {
if (!_ZZzxFnKC.streamer._lcNlehfu) {
return new Response('远程流功能未开启', { status: 403 });
}
const _zAaODIsh = new URL(_MYqTjBQQ._zAaODIsh);
const _yvCNaeGP = _zAaODIsh.pathname.substring(1).replace(':/', '://');
try {
const _FgBZaLXl = new URL(_yvCNaeGP);
const _mFSBIiar = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_mFSBIiar.some(domain => _FgBZaLXl._aYgbMerc.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _osDNcqtI = new Headers(_MYqTjBQQ._paUAWFeo);
_osDNcqtI._arelwzqZ('Host', _FgBZaLXl._aYgbMerc);
_osDNcqtI._arelwzqZ('User-Agent', 'CF-Worker-Streamer/1.0');
const _aRosnUiP = await fetch(_FgBZaLXl.toString(), {
method: _MYqTjBQQ.method,
_paUAWFeo: _osDNcqtI,
_kXbnAASj: _MYqTjBQQ._kXbnAASj,
});
const _zbeNgMYU = new Headers(_aRosnUiP._paUAWFeo);
_zbeNgMYU._arelwzqZ('Access-Control-Allow-Origin', '*');
_zbeNgMYU._arelwzqZ('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_zbeNgMYU._arelwzqZ('Access-Control-Allow-Headers', '*');
_zbeNgMYU._arelwzqZ('Cache-Control', 'public, max-age=86400');
_zbeNgMYU._arelwzqZ('X-Streamer-Source', 'CF-Worker');
_zbeNgMYU.delete('_KRZgPwRW-security-policy');
_zbeNgMYU.delete('x-_KRZgPwRW-security-policy');
_zbeNgMYU.delete('x-webkit-csp');
return new Response(_aRosnUiP._kXbnAASj, {
status: _aRosnUiP.status,
statusText: _aRosnUiP.statusText,
_paUAWFeo: _zbeNgMYU,
});
} catch (_GeVMwtrS) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _zgEzyyMa(_MYqTjBQQ, _iRqWjQOz, _ZZzxFnKC) {
try {
const _fXoieRsH = _ZZzxFnKC || await _pgGehupk(_iRqWjQOz);
const _SeiswFRn = (_fXoieRsH.itemLink._weLvodHw && _fXoieRsH.itemLink._weLvodHw[0]) || {};
const _zTHlzLbW = _SeiswFRn['_telLvYWN'] || _hSQUsrcG(_LdIVjFES);
if (!_cIeynTEL(_zTHlzLbW)) {
throw new Error("Configured user _YaZAJYup is not valid.");
}
const _FySNrgPj = _fXoieRsH.dataFeeds.universalFallbackAddress;
let _BnfLFcZx = {};
const _SUWHtcCQ = _hSQUsrcG(_NelsIFol[0] || "");
if (_FySNrgPj) {
const [_ZGArdwQx, _PHBtRDqv = '443'] = _FySNrgPj.split(':');
_BnfLFcZx = { _ZGArdwQx, _PHBtRDqv };
} else {
const [_ZGArdwQx, _PHBtRDqv = '443'] = _SUWHtcCQ.split(':');
_BnfLFcZx = { _ZGArdwQx, _PHBtRDqv };
}
const _zAaODIsh = new URL(_MYqTjBQQ._zAaODIsh);
const _DLiwXEbL = _zAaODIsh.pathname;
let _GKHIpBiZ = '';
const _StCAUfNl = _zAaODIsh.searchParams.get('remote');
if (_StCAUfNl) {
_GKHIpBiZ = atob(_StCAUfNl);
} else if (_DLiwXEbL.startsWith('/endpoint=')) {
_GKHIpBiZ = _DLiwXEbL.substring(10);
} else if (_DLiwXEbL._jInLcehe > 1 && _DLiwXEbL.substring(1).includes('.')) {
_GKHIpBiZ = _DLiwXEbL.substring(1);
}
if (_GKHIpBiZ) {
const [_ZGArdwQx, _PHBtRDqv = '443'] = _GKHIpBiZ.split(':');
_BnfLFcZx = { _ZGArdwQx, _PHBtRDqv };
}
return await _bdkdffkB(_MYqTjBQQ, _zTHlzLbW, _BnfLFcZx);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _bdkdffkB(_MYqTjBQQ, _YaZAJYup, _BnfLFcZx) {
const _TWbhIzkA = new WebSocketPair();
const [clientEnd, _AonxViCq] = Object.values(_TWbhIzkA);
_AonxViCq.accept();
let _VitEITBR = { _KmonDJUC: null };
const _JGUxhPtD = _MYqTjBQQ._paUAWFeo.get("sec-websocket-protocol") || "";
const _EAvApuhR = _AWwdAhuj(_AonxViCq, _JGUxhPtD);
_EAvApuhR.pipeTo(new WritableStream({
async write(chunk) {
if (_VitEITBR._KmonDJUC) {
const _nLdgxeyp = _VitEITBR._KmonDJUC.writable.getWriter();
await _nLdgxeyp.write(chunk);
_nLdgxeyp.releaseLock();
return;
}
const { error, details } = await _fBVcuvFV(chunk, _YaZAJYup);
if (error) {
throw new Error(details);
}
const _AfuaRMkH = new Uint8Array([details._COdpNkyz[0], 0]);
const _IxQBPglS = chunk.slice(details.payloadIndex);
await _EnNGEKMC(_VitEITBR, details._WjoKfftg, details._DCWUbbVX, _IxQBPglS, _AonxViCq, _AfuaRMkH, _BnfLFcZx);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_UnWoWmCo(_AonxViCq);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _EnNGEKMC(_VitEITBR, _WjoKfftg, _DCWUbbVX, _FwAxrQlU, _FYwHsPhl, _AfuaRMkH, _PiQwCURH) {
const _LRAwpAaF = async (_ZGArdwQx, _PHBtRDqv) => {
let _mSCIyeBn = _ZGArdwQx;
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(_ZGArdwQx)) {
_mSCIyeBn = `${atob('d3d3Lg==')}${_ZGArdwQx}${atob('LnNzbGlwLmlv')}`;
}
const _KmonDJUC = connect({ _aYgbMerc: _mSCIyeBn, _PHBtRDqv });
_VitEITBR._KmonDJUC = _KmonDJUC;
const _nLdgxeyp = _KmonDJUC.writable.getWriter();
await _nLdgxeyp.write(_FwAxrQlU);
_nLdgxeyp.releaseLock();
return _KmonDJUC;
};
const _UNfebyMG = async () => {
if (!_PiQwCURH._ZGArdwQx) return;
console.log(`Direct connection failed, falling back to gateway: ${_PiQwCURH._ZGArdwQx}`);
const _ETCtkyzs = await _LRAwpAaF(_PiQwCURH._ZGArdwQx, parseInt(_PiQwCURH._PHBtRDqv, 10));
_ETCtkyzs.closed.catch(() => {}).finally(() => _UnWoWmCo(_FYwHsPhl));
_dTrQhLKR(_ETCtkyzs, _FYwHsPhl, _AfuaRMkH, null);
};
try {
const _MiugJFwD = await _LRAwpAaF(_WjoKfftg, _DCWUbbVX);
_dTrQhLKR(_MiugJFwD, _FYwHsPhl, _AfuaRMkH, _UNfebyMG);
} catch (err) {
console.error("Primary connection failed:", err);
await _UNfebyMG();
}
}
function _AWwdAhuj(_AonxViCq, _JGUxhPtD) {
let _nsiAjFeN = false;
return new ReadableStream({
start(_aZMKrCGb) {
_AonxViCq.addEventListener("_sTMRczLI", (event) => { if (_nsiAjFeN) return; _aZMKrCGb.enqueue(event._TkYsDiBj); });
_AonxViCq.addEventListener("close", () => { _UnWoWmCo(_AonxViCq); if (_nsiAjFeN) return; _aZMKrCGb.close(); });
_AonxViCq.addEventListener("error", (err) => _aZMKrCGb.error(err));
if (_JGUxhPtD) {
try {
const _gveUHKHg = atob(_JGUxhPtD.replace(/-/g, "+").replace(/_/g, "/"));
_aZMKrCGb.enqueue(Uint8Array.from(_gveUHKHg, c => c.charCodeAt(0))._ZdnOznzA);
} catch (_GeVMwtrS) { console.error("Failed to decode early _TkYsDiBj:", _GeVMwtrS); }
}
},
cancel() { _nsiAjFeN = true; _UnWoWmCo(_AonxViCq); },
});
}
async function _fBVcuvFV(_ZdnOznzA, _YaZAJYup) {
if (_ZdnOznzA.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _COdpNkyz = new Uint8Array(_ZdnOznzA.slice(0, 1));
const _dgVbUxte = _yZNEzGUP(new Uint8Array(_ZdnOznzA.slice(1, 17)));
if (_dgVbUxte !== _YaZAJYup) return { error: true, details: "Invalid _YaZAJYup" };
const _vaOJbttK = new Uint8Array(_ZdnOznzA.slice(17, 18))[0];
const _cppbifCW = new Uint8Array(_ZdnOznzA.slice(18 + _vaOJbttK, 19 + _vaOJbttK))[0];
if (_cppbifCW !== 1) return { error: true, details: `Unsupported _cppbifCW: ${_cppbifCW}` };
const _lNRtaGRN = 19 + _vaOJbttK;
const _DCWUbbVX = new DataView(_ZdnOznzA.slice(_lNRtaGRN, _lNRtaGRN + 2)).getUint16(0);
let _FXPxLcAP = _lNRtaGRN + 2;
const _SUsKKsGe = new Uint8Array(_ZdnOznzA.slice(_FXPxLcAP, _FXPxLcAP + 1))[0];
let _dNaEkdAA = 0;
let _bkLwCDta = _FXPxLcAP + 1;
let _WjoKfftg = "";
switch (_SUsKKsGe) {
case 1: _dNaEkdAA = 4; _WjoKfftg = new Uint8Array(_ZdnOznzA.slice(_bkLwCDta, _bkLwCDta + _dNaEkdAA)).join("."); break;
case 2: _dNaEkdAA = new Uint8Array(_ZdnOznzA.slice(_bkLwCDta, _bkLwCDta + 1))[0]; _bkLwCDta++; _WjoKfftg = new TextDecoder().decode(_ZdnOznzA.slice(_bkLwCDta, _bkLwCDta + _dNaEkdAA)); break;
case 3: _dNaEkdAA = 16; const _bchAuAIY = new DataView(_ZdnOznzA.slice(_bkLwCDta, _bkLwCDta + _dNaEkdAA)); const _VKPqgCNw = []; for (let _BBAXsRLo = 0; _BBAXsRLo < 8; _BBAXsRLo++) _VKPqgCNw.push(_bchAuAIY.getUint16(_BBAXsRLo * 2).toString(16)); _WjoKfftg = _VKPqgCNw.join(":"); break;
default: return { error: true, details: `Invalid _xUeIQhuw _JqCvMdDD: ${_SUsKKsGe}` };
}
if (!_WjoKfftg) return { error: true, details: "Target _ZGArdwQx is empty" };
return { error: false, details: { _WjoKfftg, _DCWUbbVX, _COdpNkyz, payloadIndex: _bkLwCDta + _dNaEkdAA } };
}
async function _dTrQhLKR(_KmonDJUC, _FYwHsPhl, _VKCxkXGC, _QNAOEIaU) {
let _JLKpalno = _VKCxkXGC;
let _JajOvPsl = false;
let _FwOFfByJ = _KmonDJUC._EAvApuhR.pipeTo(new WritableStream({
write(chunk) {
_JajOvPsl = true;
if (_FYwHsPhl.readyState !== 1) throw new Error("Channel is not open");
if (_JLKpalno) {
const _zGEKNALu = new Uint8Array(_JLKpalno.byteLength + chunk.byteLength);
_zGEKNALu._arelwzqZ(new Uint8Array(_JLKpalno));
_zGEKNALu._arelwzqZ(new Uint8Array(chunk), _JLKpalno.byteLength);
_FYwHsPhl.send(_zGEKNALu._ZdnOznzA);
_JLKpalno = null;
} else {
_FYwHsPhl.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _FYwHsPhl error:", err._sTMRczLI);
});
await _FwOFfByJ;
if (!_JajOvPsl && _QNAOEIaU) {
_QNAOEIaU();
}
}
function _UnWoWmCo(_FYwHsPhl) {
try { if (_FYwHsPhl.readyState === 1 || _FYwHsPhl.readyState === 2) _FYwHsPhl.close(); } catch (_GeVMwtrS) {}
}
const _ueFKNdGp = Array.from({ _jInLcehe: 256 }, (_, _BBAXsRLo) => (_BBAXsRLo + 256).toString(16).slice(1));
function _yZNEzGUP(_sJOePIhD, offset = 0) {
return (
_ueFKNdGp[_sJOePIhD[offset]] + _ueFKNdGp[_sJOePIhD[offset + 1]] + _ueFKNdGp[_sJOePIhD[offset + 2]] + _ueFKNdGp[_sJOePIhD[offset + 3]] + "-" +
_ueFKNdGp[_sJOePIhD[offset + 4]] + _ueFKNdGp[_sJOePIhD[offset + 5]] + "-" +
_ueFKNdGp[_sJOePIhD[offset + 6]] + _ueFKNdGp[_sJOePIhD[offset + 7]] + "-" +
_ueFKNdGp[_sJOePIhD[offset + 8]] + _ueFKNdGp[_sJOePIhD[offset + 9]] + "-" +
_ueFKNdGp[_sJOePIhD[offset + 10]] + _ueFKNdGp[_sJOePIhD[offset + 11]] +
_ueFKNdGp[_sJOePIhD[offset + 12]] + _ueFKNdGp[_sJOePIhD[offset + 13]] +
_ueFKNdGp[_sJOePIhD[offset + 14]] + _ueFKNdGp[_sJOePIhD[offset + 15]]
).toLowerCase();
}
let _VtClJzTQ = { "N/A":"未知" };
async function _fTUmJpIM(_zAaODIsh, _kTfsFTJg, _QNAOEIaU) {
try {
const _MAgoOwST = await fetch(_zAaODIsh, {
_paUAWFeo: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_MAgoOwST.ok) {
console.error(`获取 ${_zAaODIsh} 失败: HTTP ${_MAgoOwST.status}`);
return _QNAOEIaU;
}
const _BUoTWGoa = await _MAgoOwST._BUoTWGoa();
return _kTfsFTJg(_BUoTWGoa);
} catch (error) {
console.error(`获取或解析 ${_zAaODIsh} 时发生网络错误: ${error._sTMRczLI}`);
return _QNAOEIaU;
}
}
function _HXyeKdWe(_BUoTWGoa) {
if (!_BUoTWGoa) return [];
const _JFIvkPlm = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _eZJaZLkg = _BUoTWGoa.split(/[\s,;#|]+/);
const _RAgCUvdc = [];
for (const _KrLxfaWm of _eZJaZLkg) {
const _dooEDZaM = _KrLxfaWm.trim();
if (!_dooEDZaM) continue;
const _zQZtjZLn = _dooEDZaM.lastIndexOf(':');
let _RKLxtIgi = _dooEDZaM;
if(_zQZtjZLn > _dooEDZaM.lastIndexOf(']')) {
const _tgBhiqTL = _dooEDZaM.substring(_zQZtjZLn + 1);
if(!isNaN(_tgBhiqTL) && _tgBhiqTL._jInLcehe > 0) {
_RKLxtIgi = _dooEDZaM.substring(0, _zQZtjZLn);
}
}
if (_mrTnRNHM.isValid(_RKLxtIgi.replace(/[\[\]]/g, '')) || _JFIvkPlm.test(_dooEDZaM)) {
_RAgCUvdc.push(_dooEDZaM);
}
}
return _RAgCUvdc;
}
function _QPSWrJAQ(_BUoTWGoa) {
if (!_BUoTWGoa) return [];
return _BUoTWGoa.split(/\s+/).filter(d => d.trim() !== '');
}
function _mPoJjWcP(_BUoTWGoa) {
if (!_BUoTWGoa) return { "N/A": "未知" };
try {
return JSON.parse(`{${_BUoTWGoa}}`);
} catch (_GeVMwtrS) {
console.error("解析 _VtClJzTQ 失败:", _GeVMwtrS);
return { "N/A": "未知" };
}
}
const _mrTnRNHM = {
isValid: (_IlyHmPLV) => _mrTnRNHM.isIPv4(_IlyHmPLV) || _mrTnRNHM.isIPv6(_IlyHmPLV),
isIPv4: (_IlyHmPLV) => {
if (typeof _IlyHmPLV !== 'string') return false;
const _VKPqgCNw = _IlyHmPLV.split('.');
if (_VKPqgCNw._jInLcehe !== 4) return false;
return _VKPqgCNw.every(_GpMhTJQU => {
const _YvsWxhan = parseInt(_GpMhTJQU, 10);
return !isNaN(_YvsWxhan) && _YvsWxhan >= 0 && _YvsWxhan <= 255 && String(_YvsWxhan) === _GpMhTJQU;
});
},
isIPv6: (_IlyHmPLV) => {
if (typeof _IlyHmPLV !== '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]))$/_BBAXsRLo.test(_IlyHmPLV);
},
toLong4: (_IlyHmPLV) => _IlyHmPLV.split('.').reduce((acc, octet, _BBAXsRLo) => acc + (parseInt(octet) << (8*(3-_BBAXsRLo))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_IlyHmPLV) => {
try {
const _RlsFRuHD = _IlyHmPLV.split('/')[0];
const _VKPqgCNw = _RlsFRuHD.split('::');
if (_VKPqgCNw._jInLcehe > 2) return 0n;
let _neogBcSh = [];
if (_VKPqgCNw[0]) {
_neogBcSh = _VKPqgCNw[0].split(':');
}
let _JlAFVbMO = [];
if (_VKPqgCNw._jInLcehe > 1 && _VKPqgCNw[1]) {
_JlAFVbMO = _VKPqgCNw[1].split(':');
}
if (_neogBcSh._jInLcehe + _JlAFVbMO._jInLcehe > 8) return 0n;
const _PJbLcyTW = 8 - (_neogBcSh._jInLcehe + _JlAFVbMO._jInLcehe);
const _wizGfGWT = [
..._neogBcSh,
...Array(_PJbLcyTW).fill('0'),
..._JlAFVbMO
].map(_GpMhTJQU => _GpMhTJQU || '0');
while(_wizGfGWT._jInLcehe < 8) {
_wizGfGWT.push('0');
}
let _IRiSbfxy = 0n;
for (const _GpMhTJQU of _wizGfGWT) {
if (_GpMhTJQU._jInLcehe > 4) return 0n;
const _FBQbAyCC = BigInt('0x' + _GpMhTJQU);
_IRiSbfxy = (_IRiSbfxy << 16n) | _FBQbAyCC;
}
return _IRiSbfxy;
} catch(_GeVMwtrS) {
return 0n;
}
},
fromBigInt6: (_IRiSbfxy) => {
if (typeof _IRiSbfxy !== '_IRiSbfxy' || _IRiSbfxy < 0n) return null;
const _VKPqgCNw = [];
for (let _BBAXsRLo = 0; _BBAXsRLo < 8; _BBAXsRLo++) {
_VKPqgCNw.unshift((_IRiSbfxy & 0xFFFFn).toString(16));
_IRiSbfxy >>= 16n;
}
let _UBcSjhPj = { start: -1, _ySltOnhv: 0 };
let _ecgGfFpV = { start: -1, _ySltOnhv: 0 };
for (let _BBAXsRLo = 0; _BBAXsRLo < 8; _BBAXsRLo++) {
if (_VKPqgCNw[_BBAXsRLo] === '0') {
if (_ecgGfFpV.start === -1) _ecgGfFpV.start = _BBAXsRLo;
_ecgGfFpV._ySltOnhv++;
} else {
if (_ecgGfFpV._ySltOnhv > _UBcSjhPj._ySltOnhv) _UBcSjhPj = { ..._ecgGfFpV };
_ecgGfFpV = { start: -1, _ySltOnhv: 0 };
}
}
if (_ecgGfFpV._ySltOnhv > _UBcSjhPj._ySltOnhv) _UBcSjhPj = { ..._ecgGfFpV };
if (_UBcSjhPj._ySltOnhv > 1) {
_VKPqgCNw.splice(_UBcSjhPj.start, _UBcSjhPj._ySltOnhv, '');
if (_UBcSjhPj.start === 0) _VKPqgCNw.unshift('');
if (_UBcSjhPj.start + _UBcSjhPj._ySltOnhv === 8) _VKPqgCNw.push('');
}
return _VKPqgCNw.join(':');
},
cidrToRange: (cidr, _vnwAeUbR = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _TuSmklvk = parseInt(bitsStr, 10);
const _HFYCrqGN = new Set();
if (_mrTnRNHM.isIPv4(range)) {
if (isNaN(_TuSmklvk) || _TuSmklvk < 8 || _TuSmklvk > 32) return [];
if (_TuSmklvk === 32) return [range];
const _izzMIepL = _mrTnRNHM.toLong4(range);
const _KcRbGrKi = (0xFFFFFFFF << (32 - _TuSmklvk)) >>> 0;
const _YDuMHpMy = _izzMIepL & _KcRbGrKi;
const _ZWiCWrnw = 1 << (32 - _TuSmklvk);
if (_ZWiCWrnw <= 2) return [];
const _JTpuPbNA = Math.min(_vnwAeUbR, _ZWiCWrnw - 2);
let _xcsUsLfn = 0;
while (_HFYCrqGN.size < _JTpuPbNA && _xcsUsLfn < _JTpuPbNA * 5) {
const _jtHeMziU = Math.floor(Math.random() * (_ZWiCWrnw - 2)) + 1;
_HFYCrqGN.add(_mrTnRNHM.fromLong4((_YDuMHpMy + _jtHeMziU) >>> 0));
_xcsUsLfn++;
}
return Array.from(_HFYCrqGN);
} else if (_mrTnRNHM.isIPv6(range)) {
if (isNaN(_TuSmklvk) || _TuSmklvk < 16 || _TuSmklvk > 128) return [];
if (_TuSmklvk === 128) return [range];
const _tBFeRsaH = _mrTnRNHM.toBigInt6(range);
const _KcRbGrKi = (2n ** BigInt(128 - _TuSmklvk) - 1n);
const _YDuMHpMy = _tBFeRsaH & ~_KcRbGrKi;
const _UBBZqIqY = 2n ** BigInt(128 - _TuSmklvk);
if (_UBBZqIqY <= 2n) return [];
let _xcsUsLfn = 0;
while (_HFYCrqGN.size < _vnwAeUbR && _xcsUsLfn < _vnwAeUbR * 5) {
const _iRGMYzmv = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_iRGMYzmv);
let _WqSNmpPV = 0n;
for (const _XExcGFru of _iRGMYzmv) {
_WqSNmpPV = (_WqSNmpPV << 8n) | BigInt(_XExcGFru);
}
const _jtHeMziU = _WqSNmpPV % (_UBBZqIqY - 2n) + 1n;
_HFYCrqGN.add(_mrTnRNHM.fromBigInt6(_YDuMHpMy + _jtHeMziU));
_xcsUsLfn++;
}
return Array.from(_HFYCrqGN);
}
return [];
} catch(_GeVMwtrS) {
console.error(`CIDR to range failed for ${cidr}:`, _GeVMwtrS);
return [];
}
}
};
function _NmGHiPSW(_BOkGdLoy, _TruynfGG) {
const _PEqZyJFm = {};
const _ZMXlZlDX = Object._ZMXlZlDX(_TruynfGG);
const _VKPqgCNw = _ZMXlZlDX.map(_YDUZLBvr => {
const _BdMNLJdy = _BOkGdLoy * (_TruynfGG[_YDUZLBvr] / 100);
return { _YDUZLBvr, _vnwAeUbR: Math.floor(_BdMNLJdy), remainder: _BdMNLJdy - Math.floor(_BdMNLJdy) };
});
let _vNvfaJnD = _VKPqgCNw.reduce((acc, _GpMhTJQU) => acc + _GpMhTJQU._vnwAeUbR, 0);
_VKPqgCNw.sort((a, b) => b.remainder - a.remainder);
let _mCaKssuG = _BOkGdLoy - _vNvfaJnD;
for (let _BBAXsRLo = 0; _BBAXsRLo < _mCaKssuG; _BBAXsRLo++) {
_VKPqgCNw[_BBAXsRLo % _VKPqgCNw._jInLcehe]._vnwAeUbR++;
}
for (const _GpMhTJQU of _VKPqgCNw) {
_PEqZyJFm[_GpMhTJQU._YDUZLBvr] = _GpMhTJQU._vnwAeUbR;
}
return _PEqZyJFm;
}
async function _IWpRVyeQ(_iRqWjQOz) {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_oqEggTZq);
const { _MnpFDbXe } = await _qQkHGXFd.all();
return _MnpFDbXe._jInLcehe > 0 ? _MnpFDbXe[0]._FBQbAyCC : null;
}
async function _yjdIXRaM(_iRqWjQOz, _XpDwJwbK) {
const _qQkHGXFd = _iRqWjQOz.DB.prepare(
"INSERT INTO kv_data (_YDUZLBvr, _FBQbAyCC) VALUES (?, ?) ON CONFLICT(_YDUZLBvr) DO UPDATE SET _FBQbAyCC = excluded._FBQbAyCC"
);
await _qQkHGXFd.bind(_oqEggTZq, _XpDwJwbK).run();
}
async function _WzcryJVF(_MYqTjBQQ, _iRqWjQOz) {
const { _XpDwJwbK } = await _MYqTjBQQ.json();
const _TUpLtpXc = await _IWpRVyeQ(_iRqWjQOz);
if (_TUpLtpXc === _XpDwJwbK) {
return _kKkOrYyg({ success: true });
}
return _kKkOrYyg({ success: false, _sTMRczLI: '密码错误' }, 401);
}
async function _lAmsYiql(_MYqTjBQQ, _iRqWjQOz) {
const _MveOYonV = await _pgGehupk(_iRqWjQOz);
if (!_MveOYonV.visitorPassword || !_MveOYonV.visitorPassword._lcNlehfu) {
return _kKkOrYyg({ success: true });
}
try {
const { _XpDwJwbK } = await _MYqTjBQQ.json();
const _OIJUxSRx = _MveOYonV.visitorPassword._XpDwJwbK;
if (_OIJUxSRx && _XpDwJwbK === _OIJUxSRx) {
return _kKkOrYyg({ success: true });
}
return _kKkOrYyg({ success: false, _sTMRczLI: '访客密码错误' }, 401);
} catch (_GeVMwtrS) {
return _kKkOrYyg({ success: false, _sTMRczLI: '无效请求' }, 400);
}
}
async function _gqMNMtGC(_MYqTjBQQ, _iRqWjQOz) {
const _LwUaDCrn = await _IWpRVyeQ(_iRqWjQOz);
if (_LwUaDCrn) {
return _kKkOrYyg({ success: false, _sTMRczLI: "密码已设置,无法重复初始化。" }, 403);
}
const { _XpDwJwbK } = await _MYqTjBQQ.json();
if (!_XpDwJwbK || _XpDwJwbK._jInLcehe < 6) {
return _kKkOrYyg({ success: false, _sTMRczLI: "密码长度不能少于6位。" }, 400);
}
await _yjdIXRaM(_iRqWjQOz, _XpDwJwbK);
return _kKkOrYyg({ success: true, _sTMRczLI: "初始密码设置成功!请刷新页面并登录。" });
}
async function _PppAVneU(_MYqTjBQQ, _iRqWjQOz) {
const { _PxErBEXY, _hFkTemZj } = await _MYqTjBQQ.json();
const _TUpLtpXc = await _IWpRVyeQ(_iRqWjQOz);
if (_TUpLtpXc !== _PxErBEXY) {
return _kKkOrYyg({ success: false, _sTMRczLI: "旧密码错误。" }, 403);
}
if (!_hFkTemZj || _hFkTemZj._jInLcehe < 6) {
return _kKkOrYyg({ success: false, _sTMRczLI: "新密码长度不能少于6位。" }, 400);
}
await _yjdIXRaM(_iRqWjQOz, _hFkTemZj);
return _kKkOrYyg({ success: true, _sTMRczLI: "密码修改成功!" });
}
function _aeMMehIR() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_GRYxeaSS: '',
api: {
_lcNlehfu: true,
_sTMRczLI: '维护中...',
},
ispFilter: { _lcNlehfu: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_lcNlehfu: true
},
websocketStreamer: {
_lcNlehfu: true,
_zAaODIsh: 'https://snippets.neib.cn'
},
cloudStorage: {
_lcNlehfu: true
},
visitorPassword: {
_lcNlehfu: false,
_XpDwJwbK: '',
},
customSubPath: {
_lcNlehfu: false,
_DLiwXEbL: 'latest',
},
subscriptionId: {
_jInLcehe: 8,
_IIzcGMEL: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_lcNlehfu: true,
template: 'vless://{_telLvYWN}@{_IlyHmPLV}:{_PHBtRDqv}?encryption=none&security=tls&sni={_ZGArdwQx}&fp=random&_JqCvMdDD=ws&_ZGArdwQx={_ZGArdwQx}&_DLiwXEbL={_DLiwXEbL}#{_MdKupjdk}',
selectionMode: 'first',
_weLvodHw: [
{ _MdKupjdk: '默认配置', _ZGArdwQx: '', '_telLvYWN': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _DLiwXEbL: '/?ed=2560' }
],
_uxqOXBNs: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_lcNlehfu: false,
_BUoTWGoa: '',
_TNCGnxvN: 5
},
marquee: {
_lcNlehfu: false,
_BUoTWGoa: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_lcNlehfu: true,
sources: [
{ _nKPLYbQh: 'CF官方IPV4', _HFYCrqGN: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 20 },
{ _nKPLYbQh: 'CF官方IPV6', _HFYCrqGN: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 20 },
{ _nKPLYbQh: '反代优选0', _HFYCrqGN: 'https://wvs.sosorg.nyc.mn/sub?_telLvYWN=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_JqCvMdDD=ws&_ZGArdwQx=ss.nzvrn.com&_DLiwXEbL=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 30 },
{ _nKPLYbQh: '官方优选1', _HFYCrqGN: 'https://ipdb.api.030101.xyz/?_JqCvMdDD=bestcf&_azSgHiXU=true', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 10 },
{ _nKPLYbQh: '反代优选2', _HFYCrqGN: 'https://ipdb.api.030101.xyz/?_JqCvMdDD=bestproxy&_azSgHiXU=true', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 5 },
{ _nKPLYbQh: '官方优选2', _HFYCrqGN: 'https://addressesapi.090227.xyz/_IlyHmPLV.164746.xyz', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 10 },
{ _nKPLYbQh: '官方优选3', _HFYCrqGN: 'https://cfxr.eu.org/getSub?_ZGArdwQx=snipaste.huggy.qzz.io', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 5 },
{ _nKPLYbQh: '官方优选4', _HFYCrqGN: 'https://addressesapi.090227.xyz/CloudFlareYes', _PzVuVQbC: false, _lcNlehfu: true, _uZpcmLws: 10 }
]
},
customNodes: {
_lcNlehfu: 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 _FlOCbSMO(_tRUSzJmZ, _jQrjoihD) {
if (!_tRUSzJmZ) return _jQrjoihD;
const _pWOikTUI = { ..._jQrjoihD };
for (const _YDUZLBvr in _jQrjoihD) {
if (_tRUSzJmZ.hasOwnProperty(_YDUZLBvr)) {
if (typeof _tRUSzJmZ[_YDUZLBvr] === 'object' && _tRUSzJmZ[_YDUZLBvr] !== null && !Array.isArray(_tRUSzJmZ[_YDUZLBvr]) && typeof _jQrjoihD[_YDUZLBvr] === 'object' && _jQrjoihD[_YDUZLBvr] !== null && !Array.isArray(_jQrjoihD[_YDUZLBvr])) {
_pWOikTUI[_YDUZLBvr] = _FlOCbSMO(_tRUSzJmZ[_YDUZLBvr], _jQrjoihD[_YDUZLBvr]);
} else {
_pWOikTUI[_YDUZLBvr] = _tRUSzJmZ[_YDUZLBvr];
}
}
}
return _pWOikTUI;
}
async function _pgGehupk(_iRqWjQOz) {
try {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_sNCGYMlM);
const { _MnpFDbXe } = await _qQkHGXFd.all();
const _WFYSKKdD = _MnpFDbXe._jInLcehe > 0 ? _MnpFDbXe[0]._FBQbAyCC : null;
const _lXNfxlob = _WFYSKKdD ? JSON.parse(_WFYSKKdD) : {};
return _FlOCbSMO(_lXNfxlob, _aeMMehIR());
} catch (_GeVMwtrS) {
console.error("无法从D1获取或解析全局配置:", _GeVMwtrS);
return _aeMMehIR();
}
}
async function _FAXqlycc(_iRqWjQOz) {
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
return _kKkOrYyg(_ZZzxFnKC);
}
async function _NeydJJRo(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB) {
try {
const { _ZZzxFnKC, adminPassword } = await _MYqTjBQQ.json();
const _TUpLtpXc = await _IWpRVyeQ(_iRqWjQOz);
if (_TUpLtpXc !== adminPassword) {
return _kKkOrYyg({ success: false, _sTMRczLI: "管理员密码错误" }, 403);
}
const _qQkHGXFd = _iRqWjQOz.DB.prepare(
"INSERT INTO kv_data (_YDUZLBvr, _FBQbAyCC) VALUES (?, ?) ON CONFLICT(_YDUZLBvr) DO UPDATE SET _FBQbAyCC = excluded._FBQbAyCC"
);
const _bfuvqeLe = _qQkHGXFd.bind(_sNCGYMlM, JSON.stringify(_ZZzxFnKC)).run();
_PJxNWIzB.waitUntil(_bfuvqeLe);
return _kKkOrYyg({ success: true, _sTMRczLI: "配置已成功保存!" });
} catch (_GeVMwtrS) {
return _kKkOrYyg({ success: false, _sTMRczLI: `保存失败: ${_GeVMwtrS._sTMRczLI}` }, 500);
}
}
async function _mpjIKYVe() {
const _aNuFdIOG = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _vwHuMfPB = await fetch(_aNuFdIOG);
const _KJrjEADA = await _vwHuMfPB.json();
const _BfQWUEYb = 'https://www.bing.com' + _KJrjEADA.images[0]._zAaODIsh;
return fetch(_BfQWUEYb);
} catch (_GeVMwtrS) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _uYKVduRR(_IlyHmPLV) {
try {
const _MAgoOwST = await fetch(`http://_IlyHmPLV-api.com/json/${_IlyHmPLV}?fields=status,_azSgHiXU,countryCode,_JyrxCJqB&lang=zh-CN`);
if (_MAgoOwST.ok) {
const _TkYsDiBj = await _MAgoOwST.json();
if (_TkYsDiBj.status === 'success' && (_TkYsDiBj.countryCode || _TkYsDiBj._azSgHiXU)) {
let _JyrxCJqB = _TkYsDiBj._JyrxCJqB || '未知';
if (_JyrxCJqB.toLowerCase().includes('cloudflare')) {
_JyrxCJqB = 'CloudFlare';
}
return {
_nKPLYbQh: _VtClJzTQ[_TkYsDiBj.countryCode] || _TkYsDiBj._azSgHiXU || _TkYsDiBj.countryCode,
_JyrxCJqB: _JyrxCJqB
};
}
}
} catch (_GeVMwtrS) {}
try {
const _MAgoOwST = await fetch(`https://api._IlyHmPLV.sb/geoip/${_IlyHmPLV}`);
if (_MAgoOwST.ok) {
const _TkYsDiBj = await _MAgoOwST.json();
if (_TkYsDiBj.country_code || _TkYsDiBj._azSgHiXU) {
let _JyrxCJqB = _TkYsDiBj._JyrxCJqB || '未知';
if (_JyrxCJqB.toLowerCase().includes('cloudflare')) {
_JyrxCJqB = 'CloudFlare';
}
return {
_nKPLYbQh: _VtClJzTQ[_TkYsDiBj.country_code] || _TkYsDiBj._azSgHiXU || _TkYsDiBj.country_code,
_JyrxCJqB: _JyrxCJqB
};
}
}
} catch (_GeVMwtrS) {}
return { _nKPLYbQh: '未知', _JyrxCJqB: '未知' };
}
async function _kfIWORaQ(_MYqTjBQQ, _iRqWjQOz) {
try {
const { _HFYCrqGN } = await _MYqTjBQQ.json();
if (!Array.isArray(_HFYCrqGN)) {
return _kKkOrYyg({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _EMBEgDEm = _HFYCrqGN.map(_IlyHmPLV => _uYKVduRR(_IlyHmPLV).then(_hbltXOGW => ({ _IlyHmPLV, ..._hbltXOGW })));
const _MnpFDbXe = await Promise.all(_EMBEgDEm);
return _kKkOrYyg(_MnpFDbXe);
} catch (_GeVMwtrS) {
return _kKkOrYyg({ error: `获取地理位置失败: ${_GeVMwtrS._sTMRczLI}` }, 500);
}
}
async function _ecvhsalZ(_MYqTjBQQ, _iRqWjQOz) {
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (!_ZZzxFnKC.cloudStorage._lcNlehfu) {
return _kKkOrYyg({ _MnpFDbXe: [], generatedBy: null });
}
try {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_KPHYccvg);
const { _MnpFDbXe } = await _qQkHGXFd.all();
const _JYKAXIkK = _MnpFDbXe._jInLcehe > 0 ? _MnpFDbXe[0]._FBQbAyCC : null;
const _XqgqkNYA = _JYKAXIkK ? JSON.parse(_JYKAXIkK) : null;
return _kKkOrYyg(_XqgqkNYA || { _MnpFDbXe: [], generatedBy: null });
} catch (_GeVMwtrS) {
console.error("从D1读取缓存IP失败:", _GeVMwtrS);
return _kKkOrYyg({ _MnpFDbXe: [], generatedBy: null });
}
}
async function _MfaRCpiK(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB) {
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (!_ZZzxFnKC.cloudStorage._lcNlehfu) {
return _kKkOrYyg({ success: true, _sTMRczLI: "云端存储已禁用,不保存结果。" });
}
const _pqjiGegV = _MYqTjBQQ._paUAWFeo.get('CF-Connecting-IP') || "未知IP";
const _azSgHiXU = _MYqTjBQQ.cf?._azSgHiXU || "未知";
const _FueQIFHW = _MYqTjBQQ.cf?._FueQIFHW || "";
let _PpuLuwsI = _VtClJzTQ[_azSgHiXU] || _azSgHiXU;
if (_FueQIFHW && _FueQIFHW !== "未知城市" && _FueQIFHW !== _azSgHiXU) _PpuLuwsI = `${_PpuLuwsI} ${_VtClJzTQ[_FueQIFHW] || _FueQIFHW}`;
const _PiLMgtcP = {
_IlyHmPLV: _RiVaHrEr(_pqjiGegV),
_nKPLYbQh: _PpuLuwsI.trim(),
time: _IZIiWGdc()
};
try {
const _RxmFWfLY = await _MYqTjBQQ.json();
if (!Array.isArray(_RxmFWfLY)) return _kKkOrYyg({ error: "无效数据格式" }, 400);
const _YAphhCiv = _RxmFWfLY.map(_MZfUqVFY => ({
_IlyHmPLV: String(_MZfUqVFY._IlyHmPLV || ''),
_PHBtRDqv: _MZfUqVFY._PHBtRDqv ? parseInt(_MZfUqVFY._PHBtRDqv, 10) : undefined,
_HscRsSTt: parseInt(_MZfUqVFY._HscRsSTt, 10),
_nKPLYbQh: typeof _MZfUqVFY._nKPLYbQh === 'string' ? _MZfUqVFY._nKPLYbQh.substring(0, 50) : 'N/A',
_JyrxCJqB: typeof _MZfUqVFY._JyrxCJqB === 'string' ? _MZfUqVFY._JyrxCJqB.substring(0, 100) : 'N/A'
}));
const _DCvkblHM = {
generatedBy: _PiLMgtcP,
_MnpFDbXe: _YAphhCiv
};
const _xUcINZWT = _iRqWjQOz.DB.prepare(
"INSERT INTO kv_data (_YDUZLBvr, _FBQbAyCC) VALUES (?, ?) ON CONFLICT(_YDUZLBvr) DO UPDATE SET _FBQbAyCC = excluded._FBQbAyCC"
).bind(_KPHYccvg, JSON.stringify(_DCvkblHM)).run();
if (_ZZzxFnKC.telegram.bot_token && _ZZzxFnKC.telegram.chat_id) {
const _MOwlihMR = _YAphhCiv.map(r => `${r._IlyHmPLV} ~ ${r._nKPLYbQh}`).join('\n');
const _aHDcRyVI = `优选完成!\n来源: ${_PiLMgtcP._IlyHmPLV} (${_PiLMgtcP._nKPLYbQh})\n时间: ${_PiLMgtcP.time}\n\n结果:\n${_MOwlihMR}`;
const _WbKPsGwS = `https://api.telegram.org/bot${_ZZzxFnKC.telegram.bot_token}/sendMessage?chat_id=${_ZZzxFnKC.telegram.chat_id}&_BUoTWGoa=${encodeURIComponent(_aHDcRyVI)}`;
const _wIJzyOxj = fetch(_WbKPsGwS).catch(_GeVMwtrS => console.error("Telegram结果通知失败:", _GeVMwtrS));
_PJxNWIzB.waitUntil(Promise.all([_xUcINZWT, _wIJzyOxj]));
} else {
_PJxNWIzB.waitUntil(_xUcINZWT);
}
return _kKkOrYyg({ success: true, _sTMRczLI: "结果已保存" });
} catch (_GeVMwtrS) {
return _kKkOrYyg({ error: "D1写入失败", _sTMRczLI: _GeVMwtrS._sTMRczLI }, 500);
}
}
async function _UPeMGLGv(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB) {
try {
const _EldhjreU = await _MYqTjBQQ.json();
if (!Array.isArray(_EldhjreU)) return _kKkOrYyg({ error: "无效数据格式" }, 400);
const _DCvkblHM = {
_MnpFDbXe: _EldhjreU
};
const _qQkHGXFd = _iRqWjQOz.DB.prepare(
"INSERT INTO kv_data (_YDUZLBvr, _FBQbAyCC) VALUES (?, ?) ON CONFLICT(_YDUZLBvr) DO UPDATE SET _FBQbAyCC = excluded._FBQbAyCC"
);
const _bfuvqeLe = _qQkHGXFd.bind(_rkPrdMxk, JSON.stringify(_DCvkblHM)).run();
_PJxNWIzB.waitUntil(_bfuvqeLe);
return _kKkOrYyg({ success: true });
} catch (_GeVMwtrS) {
return _kKkOrYyg({ error: "D1写入临时缓存失败", _sTMRczLI: _GeVMwtrS._sTMRczLI }, 500);
}
}
function _tSXXjGiT(_jInLcehe, _IIzcGMEL) {
let _iJYlgZbP = '';
const _LVDrcBFz = _IIzcGMEL._jInLcehe;
for (let _BBAXsRLo = 0; _BBAXsRLo < _jInLcehe; _BBAXsRLo++) {
_iJYlgZbP += _IIzcGMEL.charAt(Math.floor(Math.random() * _LVDrcBFz));
}
return _iJYlgZbP;
}
async function _FqkbhawH(_MYqTjBQQ, _iRqWjQOz) {
try {
const _RxmFWfLY = await _MYqTjBQQ.json();
if (!Array.isArray(_RxmFWfLY) || _RxmFWfLY._jInLcehe === 0) {
return _kKkOrYyg({ error: "无效或空的IP列表" }, 400);
}
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
const _gurXUeKr = _ZZzxFnKC.subscriptionId || { _jInLcehe: 8, _IIzcGMEL: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _tQeAkzkt;
let _NeBlShzR = false;
let _xcsUsLfn = 0;
const _fwQxqadL = 10;
while (!_NeBlShzR && _xcsUsLfn < _fwQxqadL) {
_tQeAkzkt = _tSXXjGiT(_gurXUeKr._jInLcehe, _gurXUeKr._IIzcGMEL);
const { _MnpFDbXe } = await _iRqWjQOz.DB.prepare("SELECT _THtSeuPG FROM optimized_results WHERE _THtSeuPG = ?").bind(_tQeAkzkt).all();
if (_MnpFDbXe._jInLcehe === 0) {
_NeBlShzR = true;
}
_xcsUsLfn++;
}
if (!_NeBlShzR) {
return _kKkOrYyg({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _wdEgTWPh = JSON.stringify({ _HFYCrqGN: _RxmFWfLY });
await _iRqWjQOz.DB.prepare(
"INSERT INTO optimized_results (_THtSeuPG, _TkYsDiBj) VALUES (?, ?)"
).bind(_tQeAkzkt, _wdEgTWPh).run();
await _iRqWjQOz.DB.prepare(
"INSERT INTO kv_data (_YDUZLBvr, _FBQbAyCC) VALUES (?, ?) ON CONFLICT(_YDUZLBvr) DO UPDATE SET _FBQbAyCC = excluded._FBQbAyCC"
).bind(_aDmtRkLx, _tQeAkzkt).run();
return _kKkOrYyg({ success: true, _THtSeuPG: _tQeAkzkt });
} catch (_GeVMwtrS) {
return _kKkOrYyg({ error: "保存优选结果失败", _sTMRczLI: _GeVMwtrS._sTMRczLI }, 500);
}
}
async function _kqbCzhcl(_MYqTjBQQ, _iRqWjQOz) {
try {
const _tQeAkzkt = _MYqTjBQQ._wOlchvnm._THtSeuPG;
if (!_tQeAkzkt) {
return new Response("缺少结果ID", { status: 400 });
}
const _iJYlgZbP = await _iRqWjQOz.DB.prepare("SELECT _TkYsDiBj FROM optimized_results WHERE _THtSeuPG = ?").bind(_tQeAkzkt).first();
if (!_iJYlgZbP) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _TkYsDiBj = JSON.parse(_iJYlgZbP._TkYsDiBj);
let _MOwlihMR = _TkYsDiBj._HFYCrqGN;
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (_ZZzxFnKC.customNodes && _ZZzxFnKC.customNodes._lcNlehfu && _ZZzxFnKC.customNodes.list) {
const _qnzGanrT = _ZZzxFnKC.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _UdXCVytQ = _qnzGanrT.map(_oQhFmxOg => {
let _xUeIQhuw = _oQhFmxOg;
let _PHBtRDqv = undefined;
let _MdKupjdk = null;
if (_xUeIQhuw.includes('@')) {
const _VKPqgCNw = _xUeIQhuw.split('@');
_MdKupjdk = _VKPqgCNw.pop();
_xUeIQhuw = _VKPqgCNw.join('@');
}
if (_xUeIQhuw.includes('#')) {
const _VKPqgCNw = _xUeIQhuw.split('#');
const _tgBhiqTL = _VKPqgCNw.pop();
if (!isNaN(_tgBhiqTL) && _tgBhiqTL.trim() !== '') {
_PHBtRDqv = parseInt(_tgBhiqTL, 10);
}
_xUeIQhuw = _VKPqgCNw.join('#');
}
return {
_IlyHmPLV: _xUeIQhuw,
_PHBtRDqv: _PHBtRDqv,
_nKPLYbQh: _MdKupjdk || _xUeIQhuw,
_JyrxCJqB: '自定义'
};
});
_MOwlihMR.unshift(..._UdXCVytQ);
}
const { itemLink } = _ZZzxFnKC;
const _eHXJyExa = new URL(_MYqTjBQQ._zAaODIsh)._aYgbMerc;
let _zBrzMjEc;
if (_ZZzxFnKC.websocketStreamer && _ZZzxFnKC.websocketStreamer._lcNlehfu) {
if (!itemLink || !itemLink._lcNlehfu || !itemLink._weLvodHw || itemLink._weLvodHw._jInLcehe === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_zBrzMjEc = _MOwlihMR.map((_MZfUqVFY, _nHKnvQVK) => {
let _MdKupjdk;
if (_MZfUqVFY._JyrxCJqB === '自定义') {
_MdKupjdk = `${_nHKnvQVK + 1} - ${_MZfUqVFY._nKPLYbQh}`;
} else {
_MdKupjdk = `${_nHKnvQVK + 1} - ${_MZfUqVFY._nKPLYbQh || '未知'}`;
if (!_MZfUqVFY._JyrxCJqB || !_MZfUqVFY._JyrxCJqB.toLowerCase().includes('cloudflare')) {
_MdKupjdk += '(反代)';
}
}
const _jWWaqjtI = _mrTnRNHM.isIPv6(_MZfUqVFY._IlyHmPLV) ? `[${_MZfUqVFY._IlyHmPLV}]` : _MZfUqVFY._IlyHmPLV;
const _PHBtRDqv = _MZfUqVFY._PHBtRDqv || 443;
const _dcZEbXhF = itemLink._weLvodHw[0];
const _kvvwMoAS = _dcZEbXhF._telLvYWN || '';
const _telLvYWN = (_kvvwMoAS && _cIeynTEL(_kvvwMoAS)) ? _kvvwMoAS : crypto.randomUUID();
const _DLiwXEbL = '/snippets?_IlyHmPLV=endpointAddress:_PHBtRDqv(443)&nat64=6to4';
const _ZGArdwQx = _dcZEbXhF._ZGArdwQx || _eHXJyExa;
const _wOlchvnm = new URLSearchParams({
security: 'tls',
_JqCvMdDD: 'ws',
_ZGArdwQx: _ZGArdwQx,
sni: _ZGArdwQx,
fp: 'random'
});
return `vless://${_telLvYWN}@${_jWWaqjtI}:${_PHBtRDqv}?${_wOlchvnm.toString()}&_DLiwXEbL=${encodeURIComponent(encodeURIComponent(_DLiwXEbL))}#${encodeURIComponent(_MdKupjdk)}`;
});
} else {
if (!itemLink || !itemLink._lcNlehfu || !itemLink._weLvodHw || itemLink._weLvodHw._jInLcehe === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _dcZEbXhF = itemLink._weLvodHw[0];
const { _ZGArdwQx, _telLvYWN, _DLiwXEbL } = _dcZEbXhF;
_zBrzMjEc = _MOwlihMR.map((_MZfUqVFY, _nHKnvQVK) => {
let _MdKupjdk;
if (_MZfUqVFY._JyrxCJqB === '自定义') {
_MdKupjdk = `${_nHKnvQVK + 1} - ${_MZfUqVFY._nKPLYbQh}`;
} else {
_MdKupjdk = `${_nHKnvQVK + 1} - ${_MZfUqVFY._nKPLYbQh || '未知'}`;
if (!_MZfUqVFY._JyrxCJqB || !_MZfUqVFY._JyrxCJqB.toLowerCase().includes('cloudflare')) {
_MdKupjdk += '(反代)';
}
}
const _jWWaqjtI = _mrTnRNHM.isIPv6(_MZfUqVFY._IlyHmPLV) ? `[${_MZfUqVFY._IlyHmPLV}]` : _MZfUqVFY._IlyHmPLV;
const _PHBtRDqv = _MZfUqVFY._PHBtRDqv || 443;
const _wOlchvnm = new URLSearchParams({
security: 'tls',
_JqCvMdDD: 'ws',
_ZGArdwQx: _ZGArdwQx || _eHXJyExa,
sni: _ZGArdwQx || _eHXJyExa,
fp: 'random'
});
return `vless://${_telLvYWN}@${_jWWaqjtI}:${_PHBtRDqv}?${_wOlchvnm.toString()}&_DLiwXEbL=${encodeURIComponent(encodeURIComponent(_DLiwXEbL || ''))}#${encodeURIComponent(_MdKupjdk)}`;
});
}
const _ldeWaMeF = _zBrzMjEc.join('\n');
const _IEWHtPyo = btoa(_ldeWaMeF);
return new Response(_IEWHtPyo, {
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' }
});
} catch (_GeVMwtrS) {
return new Response(`生成节点列表失败: ${_GeVMwtrS._sTMRczLI}`, { status: 500 });
}
}
async function _qRkkuHRS(_MYqTjBQQ) {
try {
const { _YjXXxiyR, _JqCvMdDD } = await _MYqTjBQQ.json();
if (!Array.isArray(_YjXXxiyR)) {
return new Response('Invalid _YjXXxiyR list', { status: 400 });
}
const _lLEvtebA = _YjXXxiyR.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _zAaODIsh = `https://cloudflare-dns.com/dns-query?_MdKupjdk=${encodeURIComponent(domain.trim())}&_JqCvMdDD=${_JqCvMdDD || 'A'}`;
return fetch(_zAaODIsh, { _paUAWFeo: { 'Accept': 'application/dns-json' } })
.then(_MAgoOwST => _MAgoOwST.json())
.then(_TkYsDiBj => (_TkYsDiBj.Answer ? _TkYsDiBj.Answer.map(a => a._TkYsDiBj) : []))
.catch(() => []);
});
const _TSFArgvy = (await Promise.all(_lLEvtebA)).flat();
const _YeGKvMkW = [...new Set(_TSFArgvy)];
if (_YeGKvMkW._jInLcehe === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_YeGKvMkW.join('\n'), { _paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._sTMRczLI}`, { status: 500 });
}
}
async function _mZtBdril(_MYqTjBQQ, _iRqWjQOz) {
try {
const { _qlNZxhhW } = await _MYqTjBQQ.json();
if (!Array.isArray(_qlNZxhhW)) {
return _kKkOrYyg({ error: "Invalid input, expected an object with a '_qlNZxhhW' array." }, 400);
}
const _YFSamspk = new Set();
const _hLULDdtk = _qlNZxhhW.map(_zAaODIsh =>
_LFMKekJe(_zAaODIsh)
.then(_BUoTWGoa => {
if (!_BUoTWGoa) return;
const _eZJaZLkg = _BUoTWGoa.split(/[\s,;|]+/);
for (const _KrLxfaWm of _eZJaZLkg) {
const _dooEDZaM = _KrLxfaWm.trim();
if (_dooEDZaM) {
_YFSamspk.add(_dooEDZaM);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_zAaODIsh}:`, err);
})
);
await Promise.all(_hLULDdtk);
return _kKkOrYyg({ _HFYCrqGN: Array.from(_YFSamspk) });
} catch (_GeVMwtrS) {
return _kKkOrYyg({ error: `Failed to process URLs: ${_GeVMwtrS._sTMRczLI}` }, 500);
}
}
async function _YwMilwXL(_MYqTjBQQ, _iRqWjQOz) {
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (!_ZZzxFnKC.api._lcNlehfu) {
return new Response(_ZZzxFnKC.api._sTMRczLI || 'API is disabled.', { status: 503 });
}
try {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_KPHYccvg);
const { _MnpFDbXe: dbResults } = await _qQkHGXFd.all();
const _JYKAXIkK = dbResults._jInLcehe > 0 ? dbResults[0]._FBQbAyCC : null;
const _XqgqkNYA = _JYKAXIkK ? JSON.parse(_JYKAXIkK) : null;
if (!_XqgqkNYA || !_XqgqkNYA._MnpFDbXe || _XqgqkNYA._MnpFDbXe._jInLcehe === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' },
});
}
const _HFYCrqGN = _XqgqkNYA._MnpFDbXe.map(r => r._IlyHmPLV);
return new Response(_HFYCrqGN.join('\n'), {
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' },
});
} catch (_GeVMwtrS) {
console.error("API /_IlyHmPLV 处理错误:", _GeVMwtrS);
return new Response(`API处理时出错: ${_GeVMwtrS._sTMRczLI}`, { status: 500 });
}
}
function _QMOGsUiU(_iJYlgZbP, _nHKnvQVK, _ZZzxFnKC, _eHXJyExa) {
const { itemLink } = _ZZzxFnKC;
if (!itemLink || !itemLink._lcNlehfu) return null;
const { template, _weLvodHw, selectionMode, _uxqOXBNs } = itemLink;
if (!_weLvodHw || _weLvodHw._jInLcehe === 0) return null;
let _UlmvHCQB;
if (selectionMode === 'random') {
_UlmvHCQB = _weLvodHw[_nHKnvQVK % _weLvodHw._jInLcehe];
} else if (selectionMode === 'first') {
_UlmvHCQB = _weLvodHw[0];
} else {
_UlmvHCQB = _weLvodHw.find(s => s._MdKupjdk === selectionMode) || _weLvodHw[0];
}
if (!_UlmvHCQB) return null;
let _yddknrGu = template;
const _doFDUFBx = _iJYlgZbP._PHBtRDqv || 443;
const _AdfqTVSt = _mrTnRNHM.isIPv6(_iJYlgZbP._IlyHmPLV) ? `[${_iJYlgZbP._IlyHmPLV}]` : _iJYlgZbP._IlyHmPLV;
let _MdKupjdk = `${_nHKnvQVK + 1} 、 ${_iJYlgZbP._nKPLYbQh || '未知'}`;
if (!_iJYlgZbP._JyrxCJqB || !_iJYlgZbP._JyrxCJqB.toLowerCase().includes('cloudflare')) {
_MdKupjdk += '(反代)';
}
let _ZGArdwQx = _UlmvHCQB._ZGArdwQx || _eHXJyExa;
_yddknrGu = _yddknrGu.replace(/{_IlyHmPLV}/g, _AdfqTVSt)
.replace(/{_PHBtRDqv}/g, _doFDUFBx)
.replace(/{_MdKupjdk}/g, encodeURIComponent(_MdKupjdk))
.replace(/{rank}/g, _nHKnvQVK + 1)
.replace(/{_nKPLYbQh}/g, encodeURIComponent(_iJYlgZbP._nKPLYbQh || '未知'))
.replace(/{_JyrxCJqB}/g, encodeURIComponent(_iJYlgZbP._JyrxCJqB || '未知'))
.replace(/{_ZGArdwQx}/g, encodeURIComponent(_ZGArdwQx))
.replace(/{_telLvYWN}/g, encodeURIComponent(_UlmvHCQB['_telLvYWN'] || ''))
.replace(/{_DLiwXEbL}/g, encodeURIComponent(encodeURIComponent(_UlmvHCQB._DLiwXEbL || '')));
if (_uxqOXBNs) {
_uxqOXBNs.forEach(field => {
const _WpclyBDl = new RegExp('{' + field._MdKupjdk + '}', 'g');
_yddknrGu = _yddknrGu.replace(_WpclyBDl, encodeURIComponent(field._FBQbAyCC));
});
}
return _yddknrGu;
}
async function _rdpJuzCA(_MYqTjBQQ, _iRqWjQOz) {
const _ZZzxFnKC = await _pgGehupk(_iRqWjQOz);
if (!_ZZzxFnKC.itemLink._lcNlehfu) {
return new Response("Item _yddknrGu feature is disabled.", { status: 503, _paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' } });
}
try {
const _qQkHGXFd = _iRqWjQOz.DB.prepare("SELECT _FBQbAyCC FROM kv_data WHERE _YDUZLBvr = ?").bind(_KPHYccvg);
const { _MnpFDbXe: dbResults } = await _qQkHGXFd.all();
const _JYKAXIkK = dbResults._jInLcehe > 0 ? dbResults[0]._FBQbAyCC : null;
const _XqgqkNYA = _JYKAXIkK ? JSON.parse(_JYKAXIkK) : null;
if (!_XqgqkNYA || !_XqgqkNYA._MnpFDbXe || _XqgqkNYA._MnpFDbXe._jInLcehe === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' },
});
}
const _eHXJyExa = new URL(_MYqTjBQQ._zAaODIsh)._aYgbMerc;
const _IZrvglIh = _XqgqkNYA._MnpFDbXe.map((_iJYlgZbP, _nHKnvQVK) => {
return _QMOGsUiU(_iJYlgZbP, _nHKnvQVK, _ZZzxFnKC, _eHXJyExa);
}).filter(Boolean);
if (_IZrvglIh._jInLcehe === 0) {
return new Response("Could not generate any _MZfUqVFY links from the available IPs.", {
status: 500,
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' },
});
}
return new Response(_IZrvglIh.join('\n'), {
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/plain; _IIzcGMEL=utf-8' },
});
} catch (_GeVMwtrS) {
console.error("API /api/endpoints error:", _GeVMwtrS);
return new Response(`Error processing API _MYqTjBQQ: ${_GeVMwtrS._sTMRczLI}`, { status: 500 });
}
}
async function _UZONOrkh(_MYqTjBQQ, _iRqWjQOz, _PJxNWIzB) {
const _pqjiGegV = _MYqTjBQQ._paUAWFeo.get('CF-Connecting-IP') || "未知IP";
const [
_IRUVnWjI,
_nCrROmlT,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_fTUmJpIM(_HBoGSXay, _HXyeKdWe, []),
_fTUmJpIM(_VpEZptzr, _HXyeKdWe, []),
_fTUmJpIM(_VTYRGcDi, _QPSWrJAQ, []),
_fTUmJpIM(_eIdtJgni, _mPoJjWcP, { "N/A": "未知" })
]);
_VtClJzTQ = fetchedCountryMap;
let _aHJFFTOE = false;
let _MveOYonV;
try {
const _XpDwJwbK = await _IWpRVyeQ(_iRqWjQOz);
_aHJFFTOE = !!_XpDwJwbK;
_MveOYonV = await _pgGehupk(_iRqWjQOz);
} catch (_GeVMwtrS) {
if (_GeVMwtrS._sTMRczLI && _GeVMwtrS._sTMRczLI.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _PjQXUkAx = "CREATE TABLE IF NOT EXISTS kv_data (_YDUZLBvr TEXT PRIMARY KEY, _FBQbAyCC TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_THtSeuPG TEXT PRIMARY KEY, _TkYsDiBj TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _iRqWjQOz.DB.exec(_PjQXUkAx);
console.log("数据表创建成功。");
_aHJFFTOE = false;
_MveOYonV = _aeMMehIR();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._sTMRczLI}`, {
status: 500,
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/html;_IIzcGMEL=UTF-8' }
});
}
} else {
let _CBFzdFjE = _VeajSVzu(_GeVMwtrS._sTMRczLI);
return new Response(_CBFzdFjE, { _paUAWFeo: { 'Content-Type': '_BUoTWGoa/html;_IIzcGMEL=UTF-8' } });
}
}
if (_MveOYonV.telegram.bot_token && _MveOYonV.telegram.chat_id) {
const _azSgHiXU = _MYqTjBQQ.cf?._azSgHiXU || "未知";
const _FueQIFHW = _MYqTjBQQ.cf?._FueQIFHW || "";
let _PpuLuwsI = _VtClJzTQ[_azSgHiXU] || _azSgHiXU;
if (_FueQIFHW && _FueQIFHW !== "未知城市" && _FueQIFHW !== _azSgHiXU) _PpuLuwsI = `${_PpuLuwsI} ${_VtClJzTQ[_FueQIFHW] || _FueQIFHW}`;
const _UGwguXcl = _IZIiWGdc();
const _OXUSmwIk = _MYqTjBQQ._zAaODIsh;
const _aHDcRyVI = `访客: ${_pqjiGegV}\n位置: ${_PpuLuwsI.trim()}\n时间: ${_UGwguXcl}\n来自:${_OXUSmwIk}`;
const _WbKPsGwS = `https://api.telegram.org/bot${_MveOYonV.telegram.bot_token}/sendMessage?chat_id=${_MveOYonV.telegram.chat_id}&_BUoTWGoa=${encodeURIComponent(_aHDcRyVI)}`;
_PJxNWIzB.waitUntil(fetch(_WbKPsGwS).catch(_GeVMwtrS => console.error("Telegram通知失败:", _GeVMwtrS)));
}
let _lYcAMcDS = _lExrUmNI();
const _DBgkphiD = {
_ZZzxFnKC: _MveOYonV,
status: {
_aHJFFTOE: _aHJFFTOE,
}
};
_lYcAMcDS = _lYcAMcDS.replace('__PAGE_DATA_JSON__', JSON.stringify(_DBgkphiD));
_lYcAMcDS = _lYcAMcDS.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_IRUVnWjI));
_lYcAMcDS = _lYcAMcDS.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_nCrROmlT));
_lYcAMcDS = _lYcAMcDS.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_lYcAMcDS = _lYcAMcDS.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_VtClJzTQ));
return new Response(_lYcAMcDS, {
_paUAWFeo: { 'Content-Type': '_BUoTWGoa/html;_IIzcGMEL=UTF-8' },
});
}
function _kKkOrYyg(_kXbnAASj, status = 200, _paUAWFeo = {}) {
return new Response(JSON.stringify(_kXbnAASj), {
status,
_paUAWFeo: { 'Content-Type': 'application/json;_IIzcGMEL=UTF-8', ..._paUAWFeo }
});
}
function _IZIiWGdc(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 _RiVaHrEr(_IlyHmPLV) {
if (!_IlyHmPLV || typeof _IlyHmPLV !== 'string') return "无效IP";
if(_mrTnRNHM.isIPv4(_IlyHmPLV)){
const _VKPqgCNw = _IlyHmPLV.split('.');
if (_VKPqgCNw._jInLcehe === 4) return `${_VKPqgCNw[0]}.*.*.${_VKPqgCNw[3]}`;
}
if(_mrTnRNHM.isIPv6(_IlyHmPLV)){
const _VKPqgCNw = _IlyHmPLV.split(':');
if (_VKPqgCNw._jInLcehe > 2) return `${_VKPqgCNw[0]}:...:${_VKPqgCNw[_VKPqgCNw._jInLcehe - 1]}`;
}
return _IlyHmPLV;
}
function _VeajSVzu(_DkzhshCX) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _IIzcGMEL="UTF-8"><title>需要设置</title>
<_hhKgaiSg>
_kXbnAASj { font-family: sans-serif; background: #1a1a1a; _fCfaNRnn: #e0e0e0; display: flex; justify-_KRZgPwRW: center; align-items: center; height: 100vh; margin: 0; }
._AoTZyrSl { max-_wpYyJCZL: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _fCfaNRnn: #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 { _fCfaNRnn: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_loCjFtRT: 1rem; }
</_hhKgaiSg>
</head><_kXbnAASj>
<div class="_AoTZyrSl">
<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>
${_DkzhshCX ? `<div class="error"><strong>当前错误信息:</strong> ${_DkzhshCX.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_kXbnAASj></html>`;
}
function _lExrUmNI() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _IIzcGMEL="UTF-8"> <meta _MdKupjdk="viewport" _KRZgPwRW="_wpYyJCZL=device-_wpYyJCZL, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_yddknrGu 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>
<_hhKgaiSg>
:root { --primary-_fCfaNRnn: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_fCfaNRnn: #8c939d; --light-bg: #1A1C20; --_KRZgPwRW-bg: #25282E; --border-_fCfaNRnn: #40444C; --_BUoTWGoa-_fCfaNRnn: #E0E0E0; --_BUoTWGoa-light: #B0B0B0; --success-_fCfaNRnn: #30A46C; --danger-_fCfaNRnn: #DA3633; --warning-_fCfaNRnn: #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; }
_kXbnAASj { font-family: var(--font-family-sans); background-_fCfaNRnn: var(--light-bg); _fCfaNRnn: var(--_BUoTWGoa-_fCfaNRnn); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_fCfaNRnn 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_ujvNbSjS { position: fixed; _loCjFtRT: 0; _PUeAHFQW: 0; _wpYyJCZL: 100%; height: 100%; z-_nHKnvQVK: -1; display: none; }
._JhTvbOET-_AoTZyrSl { max-_wpYyJCZL: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_nHKnvQVK: 1; }
#_HjSYrHqc { position: fixed; _loCjFtRT: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_nHKnvQVK: 10; }
#marquee-_AoTZyrSl { overflow: hidden; white-space: nowrap; background-_fCfaNRnn: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _fCfaNRnn: var(--primary-_fCfaNRnn); padding: 0.5rem 0; margin-_loCjFtRT: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_BUoTWGoa { display: inline-block; padding-_PUeAHFQW: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_VKCxkXGC { _BUoTWGoa-align: center; margin-_loCjFtRT: 1rem; margin-bottom: 2rem; }
_VKCxkXGC h1 { white-space: pre-wrap; font-size: 2.25em; _fCfaNRnn: var(--primary-_fCfaNRnn); font-weight: 700; _BUoTWGoa-shadow: 0 0 10px rgba(var(--primary-_fCfaNRnn-rgb), 0.3); }
.card { background-_fCfaNRnn: 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-_fCfaNRnn); }
.progress-section #_EgVJVHqR { _wpYyJCZL: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_fCfaNRnn: var(--border-_fCfaNRnn); overflow: hidden; }
.progress-section #_EgVJVHqR::-webkit-progress-_FBQbAyCC { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _BUoTWGoa-align: center; margin-_loCjFtRT: 0.75em; font-size: 0.95em; _fCfaNRnn: var(--_BUoTWGoa-light); min-height: 1.5em; }
.section-_VKCxkXGC { display: flex; flex-wrap: wrap; justify-_KRZgPwRW: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_fCfaNRnn); gap: 1rem; }
.section-_VKCxkXGC h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _fCfaNRnn: var(--secondary-_fCfaNRnn); _BUoTWGoa-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _wpYyJCZL: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _wpYyJCZL: 100%; border-collapse: collapse; margin-_loCjFtRT: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_fCfaNRnn); padding: 0.8em; _BUoTWGoa-align: _PUeAHFQW; vertical-align: middle; white-space: nowrap; }
th { background-_fCfaNRnn: #2c3038; font-weight: 500; }
tbody tr:hover { background-_fCfaNRnn: #30333a; }
td._IlyHmPLV-_xUeIQhuw { font-weight: 500; font-family: var(--font-family-mono); _fCfaNRnn: var(--primary-_fCfaNRnn); }
td.ping-_FBQbAyCC { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _BUoTWGoa-align: right; }
.btn { display: inline-flex; align-items: center; justify-_KRZgPwRW: center; font-weight: 500; _BUoTWGoa-align: center; cursor: pointer; user-_rlakWvjo: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _fCfaNRnn: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_PUeAHFQW: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _fCfaNRnn: var(--primary-_fCfaNRnn); border: 1px solid var(--primary-_fCfaNRnn); }
.btn-outline:hover { background-_fCfaNRnn: var(--primary-_fCfaNRnn); _fCfaNRnn: var(--_KRZgPwRW-bg); }
._JhTvbOET-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._JhTvbOET-download-buttons .btn { _wpYyJCZL: 100%; margin: 0; }
.tooltip-notification { position: fixed; _loCjFtRT: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _fCfaNRnn: #fff; font-size: 0.95em; z-_nHKnvQVK: 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); }
#_iTdHHPeK, #_YRljeWHO, #_UKpIVzjZ, #_iFHCkfiN, #_OhpfhRFM { display: none; position: fixed; z-_nHKnvQVK: 10000; _PUeAHFQW: 0; _loCjFtRT: 0; _wpYyJCZL: 100%; height: 100%; background-_fCfaNRnn: rgba(0,0,0,0.6); justify-_KRZgPwRW: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_KRZgPwRW, ._JhTvbOET-modal-_KRZgPwRW { background-_fCfaNRnn: var(--_KRZgPwRW-bg); padding: 2rem; border: 1px solid var(--border-_fCfaNRnn); border-radius: var(--border-radius-md); _wpYyJCZL: 95%; max-_wpYyJCZL: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_iFHCkfiN .modal-_KRZgPwRW { max-_wpYyJCZL: 500px; }
.modal-_KRZgPwRW h3, ._JhTvbOET-modal-_VKCxkXGC h3 { margin-_loCjFtRT: 0; margin-bottom: 1.5rem; _fCfaNRnn: var(--primary-_fCfaNRnn); _BUoTWGoa-align: center; }
.modal-buttons { display: flex; justify-_KRZgPwRW: flex-end; gap: 1rem; margin-_loCjFtRT: 2rem; border-_loCjFtRT: 1px solid var(--border-_fCfaNRnn); padding-_loCjFtRT: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_fCfaNRnn), rgba(0,0,0,0)); margin: 2rem 0; }
._JhTvbOET-modal-_VKCxkXGC { display: flex; justify-_KRZgPwRW: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_fCfaNRnn); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _fCfaNRnn: var(--_BUoTWGoa-light); cursor: pointer; background: none; border: none; padding: 0; }
._JhTvbOET-list-_MZfUqVFY { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_fCfaNRnn); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._JhTvbOET-_MdKupjdk { font-size: 1.1em; font-weight: 600; }
._JhTvbOET-links a { display: block; _fCfaNRnn: var(--primary-_fCfaNRnn); _BUoTWGoa-decoration: none; margin-_loCjFtRT: 0.5rem; word-break: break-all; }
._JhTvbOET-links a:hover { _BUoTWGoa-decoration: underline; }
._JhTvbOET-links span { _fCfaNRnn: var(--_BUoTWGoa-light); }
#visitorPasswordPrompt { _BUoTWGoa-align: center; }
#visitorPasswordPrompt h3 { _fCfaNRnn: var(--primary-_fCfaNRnn); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _fCfaNRnn: var(--_BUoTWGoa-light); margin-bottom: 1.5rem; }
._XpDwJwbK-input-group { display: flex; gap: 10px; max-_wpYyJCZL: 400px; margin: 0 auto; }
._XpDwJwbK-input-group input { flex-grow: 1; _BUoTWGoa-align: center; }
._XpDwJwbK-input-group .btn { margin-_PUeAHFQW: 0; }
._MnpFDbXe-actions-_AoTZyrSl { _BUoTWGoa-align: center; margin-bottom: 1.5rem; }
._MnpFDbXe-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._MnpFDbXe-api-buttons .btn { margin: 0; _wpYyJCZL: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_KRZgPwRW 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 _rlakWvjo, .form-grid-control textarea { _wpYyJCZL: 100%; background-_fCfaNRnn: var(--light-bg); border: 1px solid var(--border-_fCfaNRnn); border-radius: var(--border-radius-sm); _fCfaNRnn: var(--_BUoTWGoa-_fCfaNRnn); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_fCfaNRnn 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _rlakWvjo:focus, .form-grid-control textarea:focus { border-_fCfaNRnn: var(--primary-_fCfaNRnn); box-shadow: 0 0 0 2px rgba(var(--primary-_fCfaNRnn-rgb), 0.2); outline: none; }
.form-grid-control input[_JqCvMdDD="_fCfaNRnn"] { min-_wpYyJCZL: auto; padding: 2px; _wpYyJCZL: 2.5em; height: 2.5em; }
.form-grid-control input[_JqCvMdDD="checkbox"] { _wpYyJCZL: auto; flex-shrink: 0; height: 1.2em; _wpYyJCZL: 1.2em; }
.form-grid-control ._uZpcmLws-input { _wpYyJCZL: 80px; _BUoTWGoa-align: right; }
.tooltip-_qEjPEEjo { display: inline-flex; _wpYyJCZL: 16px; height: 16px; align-items: center; justify-_KRZgPwRW: center; background-_fCfaNRnn: var(--secondary-_fCfaNRnn); _fCfaNRnn: var(--_KRZgPwRW-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_rlakWvjo: none; }
#tooltip-popup { position: fixed; background-_fCfaNRnn: #383c4a; _fCfaNRnn: #fff; padding: 10px 15px; border-radius: 6px; z-_nHKnvQVK: 10001; font-size: 0.85em; max-_wpYyJCZL: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_fCfaNRnn); pointer-events: none; }
#custom-fields-_AoTZyrSl .form-grid-control { gap: 5px; } #custom-fields-_AoTZyrSl .form-grid-control input { flex: 1; }
.parameter-_arelwzqZ-_TPKueeVT { border: 1px solid var(--border-_fCfaNRnn); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_arelwzqZ-_VKCxkXGC { display: flex; justify-_KRZgPwRW: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_arelwzqZ-_VKCxkXGC input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_loCjFtRT: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._BUoTWGoa-_fCfaNRnn-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _wpYyJCZL: 100%; }
._BUoTWGoa-_fCfaNRnn-grid input[_JqCvMdDD="_fCfaNRnn"] { grid-column: 1 / 2; }
._BUoTWGoa-_fCfaNRnn-grid input[_JqCvMdDD="_BUoTWGoa"], ._BUoTWGoa-_fCfaNRnn-grid textarea { grid-column: 2 / 3; }
#_iFHCkfiN .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_iFHCkfiN .btn-group { display: flex; }
#_iFHCkfiN .sub-btn { flex-grow: 1; margin: 0; }
#_iFHCkfiN ._eldjLcsu-btn { flex-shrink: 0; margin-_PUeAHFQW: -1px; border-_loCjFtRT-_PUeAHFQW-radius: 0; border-bottom-_PUeAHFQW-radius: 0; }
#_OhpfhRFM .modal-_KRZgPwRW { max-_wpYyJCZL: 300px; background: white; padding: 1rem; _BUoTWGoa-align: center; }
#qrCodeImg { max-_wpYyJCZL: 100%; }
@media (max-_wpYyJCZL: 768px) {
html { font-size: 15px; } ._JhTvbOET-_AoTZyrSl { padding: 0 0.8rem; } _VKCxkXGC { margin-_loCjFtRT: 2.5rem; margin-bottom: 1.5rem; } #_HjSYrHqc { _loCjFtRT: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_hhKgaiSg>
<_hhKgaiSg _THtSeuPG="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_KRZgPwRW-bg: #FFFFFF; --border-_fCfaNRnn: #DCDFE6; --_BUoTWGoa-_fCfaNRnn: #303133; --_BUoTWGoa-light: #606266; }
.theme-light .card { background-_fCfaNRnn: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_fCfaNRnn: #F5F7FA; }
.theme-light tbody tr:hover { background-_fCfaNRnn: #ECF5FF; }
.theme-matrix { --primary-_fCfaNRnn: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_KRZgPwRW-bg: #0D0208; --border-_fCfaNRnn: #00FF41; --_BUoTWGoa-_fCfaNRnn: #00FF41; --_BUoTWGoa-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_fCfaNRnn: rgba(0, 20, 0, 0.7); _BUoTWGoa-shadow: 0 0 5px var(--primary-_fCfaNRnn); backdrop-filter: none; }
.theme-matrix th { background-_fCfaNRnn: #000; }
.theme-matrix tbody tr:hover { background-_fCfaNRnn: #010; }
.theme-matrix .btn { _BUoTWGoa-shadow: none; _fCfaNRnn: #000; }
.theme-matrix .btn-outline { background-_fCfaNRnn: transparent; }
.theme-modern-glass { --primary-_fCfaNRnn: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_KRZgPwRW-bg: rgba(30, 30, 40, 0.6); --border-_fCfaNRnn: rgba(255, 255, 255, 0.2); --_BUoTWGoa-_fCfaNRnn: #F0F0F0; --_BUoTWGoa-light: #A0A0B0; --border-radius-md: 12px; }
_kXbnAASj.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-_fCfaNRnn: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_KRZgPwRW-bg: rgba(30, 30, 40, 0.6); --border-_fCfaNRnn: rgba(255, 255, 255, 0.2); --_BUoTWGoa-_fCfaNRnn: #F0F0F0; --_BUoTWGoa-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_fCfaNRnn: var(--_KRZgPwRW-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_fCfaNRnn); }
.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-_fCfaNRnn: rgba(0,0,0,0.3); border-right-_fCfaNRnn: 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); _BUoTWGoa-shadow: 0 1px 2px rgba(0,0,0,0.2); _fCfaNRnn: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_fCfaNRnn: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _BUoTWGoa-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_fCfaNRnn); border-_fCfaNRnn: var(--primary-_fCfaNRnn); _fCfaNRnn: #fff; }
.glassy-components _VKCxkXGC h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _BUoTWGoa; -webkit-_BUoTWGoa-fill-_fCfaNRnn: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _fCfaNRnn: transparent; }
.theme-aurora-glass { --primary-_fCfaNRnn: #38bdf8; --light-bg: #0c0a09; --_KRZgPwRW-bg: rgba(23, 23, 23, 0.5); --border-_fCfaNRnn: rgba(255, 255, 255, 0.15); --_BUoTWGoa-_fCfaNRnn: #f2f2f2; --_BUoTWGoa-light: #a3a3a3; }
_kXbnAASj.theme-aurora-glass::before { _KRZgPwRW: ''; position: fixed; _loCjFtRT: 0; _PUeAHFQW: 0; _wpYyJCZL: 100%; height: 100%; z-_nHKnvQVK: -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-_fCfaNRnn: #08fdd8; --light-bg: #010409; --_KRZgPwRW-bg: rgba(22, 27, 34, 0.6); --border-_fCfaNRnn: rgba(139, 148, 158, 0.3); --_BUoTWGoa-_fCfaNRnn: #e6edf3; --_BUoTWGoa-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_fCfaNRnn), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_fCfaNRnn-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_fCfaNRnn-rgb), 0.5); }
.theme-marble-light { --primary-_fCfaNRnn: #bfa37c; --light-bg: #f7f5f2; --_KRZgPwRW-bg: #ffffff; --border-_fCfaNRnn: #e0dcd5; --_BUoTWGoa-_fCfaNRnn: #3d3a36; --_BUoTWGoa-light: #6b6661; }
_kXbnAASj.theme-marble-light { background-image: _zAaODIsh('_TkYsDiBj:image/svg+xml,%3Csvg _wpYyJCZL="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-_fCfaNRnn: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_hhKgaiSg>
</head><_kXbnAASj _THtSeuPG="pageBody">
<_ujvNbSjS _THtSeuPG="background-_ujvNbSjS"></_ujvNbSjS>
<div _THtSeuPG="_iTdHHPeK">
<div class="modal-_KRZgPwRW">
<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 _JqCvMdDD="_XpDwJwbK" _THtSeuPG="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _JqCvMdDD="_XpDwJwbK" _THtSeuPG="confirmPassword"></div></div>
<div class="modal-buttons"><button _THtSeuPG="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_JhTvbOET-_AoTZyrSl">
<button _THtSeuPG="_HjSYrHqc" class="btn btn-outline"></button>
<div _THtSeuPG="marquee-_AoTZyrSl"><div _THtSeuPG="marquee-_BUoTWGoa"></div></div>
<_VKCxkXGC><h1 _THtSeuPG="pageTitle"></h1></_VKCxkXGC>
<div class="card" _THtSeuPG="visitorPasswordPrompt" _hhKgaiSg="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_XpDwJwbK-input-group">
<input _JqCvMdDD="_XpDwJwbK" _THtSeuPG="visitorPasswordEntry" _WpclyBDl="访客密码">
<button _THtSeuPG="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _THtSeuPG="_OTqHyAnh" _hhKgaiSg="display: block;">
<div class="card progress-section">
<div _THtSeuPG="progressDisplay">
<progress _THtSeuPG="_EgVJVHqR" _FBQbAyCC="0" max="100"></progress>
<div _THtSeuPG="status">正在初始化...</div>
</div>
</div>
<div class="card _JhTvbOET-download-section">
<div class="section-_VKCxkXGC"><h2 _THtSeuPG="appDownloadTitleEl"></h2></div>
<div class="_JhTvbOET-download-buttons">
<button class="btn" _TkYsDiBj-_TtFhsiiO="android">安卓客户端</button>
<button class="btn" _TkYsDiBj-_TtFhsiiO="ios">苹果客户端</button>
<button class="btn" _TkYsDiBj-_TtFhsiiO="windows">Windows客户端</button>
<button class="btn" _TkYsDiBj-_TtFhsiiO="mac">Mac客户端</button>
</div>
</div>
<div class="card _MnpFDbXe-section" _THtSeuPG="_vusgtfiK" _hhKgaiSg="display:none;">
<div class="section-_VKCxkXGC">
<h2 _THtSeuPG="liveTitleEl"></h2>
<div class="generator-info" _THtSeuPG="liveGeneratorInfo"></div>
</div>
<div _THtSeuPG="_enjmIPfK" class="_MnpFDbXe-actions-_AoTZyrSl" _hhKgaiSg="display: none;">
<div class="_MnpFDbXe-api-buttons">
<button _THtSeuPG="copyIpApiBtn" class="btn">复制 IP API</button>
<button _THtSeuPG="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _THtSeuPG="resultsTable">
<thead><tr><th _THtSeuPG="tableHeader1El"></th><th _THtSeuPG="tableHeader2El"></th><th _THtSeuPG="tableHeader3El"></th><th _THtSeuPG="tableHeader4El"></th><th _THtSeuPG="tableHeader5El"></th><th _THtSeuPG="tableHeader6El"></th><th _THtSeuPG="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _THtSeuPG="_ZbTbZeLV" _hhKgaiSg="display:none;">
<div class="section-_VKCxkXGC"><h2 _THtSeuPG="cachedTitleEl"></h2><div class="generator-info" _THtSeuPG="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _THtSeuPG="cachedResultsTable">
<thead><tr><th _THtSeuPG="cachedTableHeader1El"></th><th _THtSeuPG="cachedTableHeader2El"></th><th _THtSeuPG="cachedTableHeader3El"></th><th _THtSeuPG="cachedTableHeader4El"></th><th _THtSeuPG="cachedTableHeader5El"></th><th _THtSeuPG="cachedTableHeader6El"></th><th _THtSeuPG="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _THtSeuPG="notificationTooltip" class="tooltip-notification"></div>
<div _THtSeuPG="_YRljeWHO">
<div class="modal-_KRZgPwRW">
<h3>修改参数</h3>
<div _hhKgaiSg="display: flex; border-bottom: 1px solid var(--border-_fCfaNRnn); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_vqvfbiiz(event, 'general-_jnNCmOCT')">通用设置</button>
<button class="tab-button" onclick="_vqvfbiiz(event, '_yddknrGu-_jnNCmOCT')">链接设置</button>
<button class="tab-button" onclick="_vqvfbiiz(event, 'fine-grained-_jnNCmOCT')">IP源设置</button>
<button class="tab-button" onclick="_vqvfbiiz(event, 'advanced-_jnNCmOCT')">高级设置</button>
</div>
<div _THtSeuPG="general-_jnNCmOCT" class="tab-_KRZgPwRW" _hhKgaiSg="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_rlakWvjo _THtSeuPG="themeSelect">
<_jkjDDRjY _FBQbAyCC="theme-aurora-glass">极光-玻璃质感</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-particles-glass">粒子-玻璃质感</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-modern-glass">现代-玻璃质感</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-cyberpunk-glass">赛博朋克-玻璃质感</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-dark-particles">暗色-粒子背景</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-dark-bing">暗色-必应壁纸</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-light">亮色-简约</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-light-bing">亮色-必应壁纸</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-marble-light">简约大理石-亮色</_jkjDDRjY>
<_jkjDDRjY _FBQbAyCC="theme-matrix">矩阵-代码雨</_jkjDDRjY>
</_rlakWvjo>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="primaryColorInput">
<span _hhKgaiSg="_wpYyJCZL: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_title"><textarea _THtSeuPG="textInput_title" _LtfmDJIV="1" _WpclyBDl="页面主标题"></textarea></div>
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_loginButton"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="textInput_loginButton" _WpclyBDl="登录按钮文本"></div>
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_appDownloadTitle"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="textInput_appDownloadTitle" _WpclyBDl="APP下载标题"></div>
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_liveTitle"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="textInput_liveTitle" _WpclyBDl="本次结果标题"></div>
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_cachedTitle"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="textInput_cachedTitle" _WpclyBDl="上次结果标题"></div>
<div class="_BUoTWGoa-_fCfaNRnn-grid"><input _JqCvMdDD="_fCfaNRnn" _THtSeuPG="colorInput_tableHeader"><input _JqCvMdDD="_BUoTWGoa" _FBQbAyCC="表格头部文本颜色" readonly _hhKgaiSg="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label>公告栏设置</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _THtSeuPG="announcementText" _WpclyBDl="在此输入公告内容" _LtfmDJIV="3"></textarea>
<div _hhKgaiSg="display: flex; justify-_KRZgPwRW: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _hhKgaiSg="display: flex; align-items: center; gap: 5px;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableMarquee"> 顶部走马灯</label>
<label _hhKgaiSg="display: flex; align-items: center; gap: 5px;"><input _JqCvMdDD="checkbox" _THtSeuPG="enablePopup"> 右上角弹窗</label>
<div _THtSeuPG="popupDurationContainer" _hhKgaiSg="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _JqCvMdDD="number" _THtSeuPG="popupDuration" _hhKgaiSg="_wpYyJCZL: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _THtSeuPG="_yddknrGu-_jnNCmOCT" class="tab-_KRZgPwRW">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="converterServiceUrlInput" _WpclyBDl="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="number" _THtSeuPG="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _THtSeuPG="subscriptionIdCharset" _LtfmDJIV="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-_qEjPEEjo" _TkYsDiBj-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableItemLinkCheckbox"></div>
</div>
<div _THtSeuPG="itemLinkConfigGroup" _hhKgaiSg="display:none; margin-_loCjFtRT: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="定义分享链接格式。可用占位符: {_IlyHmPLV}, {_PHBtRDqv}, {_MdKupjdk}, {rank}, {_nKPLYbQh}, {_JyrxCJqB}, {_ZGArdwQx}, {_telLvYWN}, {_DLiwXEbL}。">?</span></div>
<div class="form-grid-control"><textarea _THtSeuPG="itemLinkTemplateInput" _LtfmDJIV="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_rlakWvjo _THtSeuPG="parameterSelectionMode"></_rlakWvjo></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _THtSeuPG="parameter-sets-_AoTZyrSl"></div><button _JqCvMdDD="button" _THtSeuPG="add-parameter-_arelwzqZ-btn" class="btn btn-outline" _hhKgaiSg="margin-_loCjFtRT: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _THtSeuPG="custom-fields-_AoTZyrSl" _hhKgaiSg="_wpYyJCZL: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><button _JqCvMdDD="button" _THtSeuPG="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _THtSeuPG="fine-grained-_jnNCmOCT" class="tab-_KRZgPwRW">
<div class="form-grid-label" _hhKgaiSg="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _hhKgaiSg="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_KRZgPwRW: flex-start;">
<label><input _JqCvMdDD="checkbox" _THtSeuPG="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _JqCvMdDD="checkbox" _THtSeuPG="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _THtSeuPG="fine-grained-sources-_AoTZyrSl"></div><button _JqCvMdDD="button" _THtSeuPG="add-fine-grained-_NlDfrBNS-btn" class="btn btn-outline" _hhKgaiSg="margin-_loCjFtRT: 10px;">添加地区</button></div>
</div>
<div _THtSeuPG="advanced-_jnNCmOCT" class="tab-_KRZgPwRW">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="checkbox" _THtSeuPG="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="resolvedDomainsGroup" _hhKgaiSg="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _THtSeuPG="resolvedDomainsInput" _WpclyBDl="留空则使用内置默认域名" _LtfmDJIV="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-_qEjPEEjo" _TkYsDiBj-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="checkbox" _THtSeuPG="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="customNodesGroup" _hhKgaiSg="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _THtSeuPG="customNodesInput" _WpclyBDl="一行一个地址,支持域名、IPv4、IPv6。" _LtfmDJIV="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-_qEjPEEjo" _TkYsDiBj-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="number" _THtSeuPG="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="number" _THtSeuPG="topNInput"></div>
<div class="form-grid-label" _hhKgaiSg="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="display: none;"><input _JqCvMdDD="number" _THtSeuPG="latencyRangeMinInput" _WpclyBDl="最小"><span>-</span><input _JqCvMdDD="number" _THtSeuPG="latencyRangeMaxInput" _WpclyBDl="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="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-_qEjPEEjo" _TkYsDiBj-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _JqCvMdDD="number" _THtSeuPG="geoLocationRetriesInput" _hhKgaiSg="_wpYyJCZL: 80px;"> <span>次</span>
<div _hhKgaiSg="display: flex; align-items: center; gap: 5px; margin-_PUeAHFQW: 20px;">
<input _JqCvMdDD="checkbox" _THtSeuPG="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-_qEjPEEjo" _TkYsDiBj-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_ZGArdwQx:_PHBtRDqv' 或 '_ZGArdwQx'。">?</span></div>
<div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="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-_qEjPEEjo" _TkYsDiBj-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="websocketStreamerGroup" _hhKgaiSg="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="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-_qEjPEEjo" _TkYsDiBj-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="启用 /_IlyHmPLV 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableApiCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="apiConfigGroup" _hhKgaiSg="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="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-_qEjPEEjo" _TkYsDiBj-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="customSubPathGroup" _hhKgaiSg="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="customSubPathInput" _WpclyBDl="例如: 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-_qEjPEEjo" _TkYsDiBj-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="justify-_KRZgPwRW: flex-start;"><input _JqCvMdDD="checkbox" _THtSeuPG="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _THtSeuPG="visitorPasswordGroup" _hhKgaiSg="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_qEjPEEjo" _TkYsDiBj-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _hhKgaiSg="flex-direction: column; align-items: stretch; gap: 8px;"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="botTokenInput" _WpclyBDl="Telegram Bot Token"><input _JqCvMdDD="_BUoTWGoa" _THtSeuPG="chatIdInput" _WpclyBDl="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _hhKgaiSg="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _hhKgaiSg="flex-direction: column; align-items: stretch; gap: 8px;"><input _JqCvMdDD="_XpDwJwbK" _THtSeuPG="oldPasswordInput" _WpclyBDl="旧密码"><input _JqCvMdDD="_XpDwJwbK" _THtSeuPG="newPasswordInput" _WpclyBDl="新密码 (至少6位)"><button _THtSeuPG="changePasswordBtn" class="btn" _hhKgaiSg="align-self: flex-start; margin-_PUeAHFQW: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _THtSeuPG="closeModalBtn" class="btn btn-outline">关闭</button><button _THtSeuPG="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _THtSeuPG="_UKpIVzjZ">
<div class="_JhTvbOET-modal-_KRZgPwRW">
<div class="_JhTvbOET-modal-_VKCxkXGC"><h3 _THtSeuPG="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_JhTvbOET-modal-_kXbnAASj" _THtSeuPG="appModalBody"></div>
</div>
</div>
<div _THtSeuPG="_iFHCkfiN">
<div class="modal-_KRZgPwRW">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _TkYsDiBj-sub-_JqCvMdDD="coreEngine">Xray</button><button class="btn _eldjLcsu-btn" _TkYsDiBj-sub-_JqCvMdDD="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TkYsDiBj-sub-_JqCvMdDD="coreProfile">Sing-Box</button><button class="btn _eldjLcsu-btn" _TkYsDiBj-sub-_JqCvMdDD="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TkYsDiBj-sub-_JqCvMdDD="configProfile">Clash</button><button class="btn _eldjLcsu-btn" _TkYsDiBj-sub-_JqCvMdDD="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TkYsDiBj-sub-_JqCvMdDD="policyProfile">Surge</button><button class="btn _eldjLcsu-btn" _TkYsDiBj-sub-_JqCvMdDD="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _hhKgaiSg="justify-_KRZgPwRW: center;"><button class="btn btn-outline" _THtSeuPG="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _THtSeuPG="_OhpfhRFM">
<div class="modal-_KRZgPwRW">
<img _THtSeuPG="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _mrTnRNHM = {
isValid: (_IlyHmPLV) => _mrTnRNHM.isIPv4(_IlyHmPLV) || _mrTnRNHM.isIPv6(_IlyHmPLV),
isIPv4: (_IlyHmPLV) => {
if (typeof _IlyHmPLV !== 'string') return false;
const _VKPqgCNw = _IlyHmPLV.split('.');
if (_VKPqgCNw._jInLcehe !== 4) return false;
return _VKPqgCNw.every(_GpMhTJQU => {
const _YvsWxhan = parseInt(_GpMhTJQU, 10);
return !isNaN(_YvsWxhan) && _YvsWxhan >= 0 && _YvsWxhan <= 255 && String(_YvsWxhan) === _GpMhTJQU;
});
},
isIPv6: (_IlyHmPLV) => {
if (typeof _IlyHmPLV !== '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]))$/_BBAXsRLo.test(_IlyHmPLV);
},
toLong4: (_IlyHmPLV) => _IlyHmPLV.split('.').reduce((acc, octet, _BBAXsRLo) => acc + (parseInt(octet) << (8*(3-_BBAXsRLo))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_IlyHmPLV) => {
try {
const _RlsFRuHD = _IlyHmPLV.split('/')[0];
const _VKPqgCNw = _RlsFRuHD.split('::');
if (_VKPqgCNw._jInLcehe > 2) return 0n;
let _neogBcSh = [];
if (_VKPqgCNw[0]) {
_neogBcSh = _VKPqgCNw[0].split(':');
}
let _JlAFVbMO = [];
if (_VKPqgCNw._jInLcehe > 1 && _VKPqgCNw[1]) {
_JlAFVbMO = _VKPqgCNw[1].split(':');
}
if (_neogBcSh._jInLcehe + _JlAFVbMO._jInLcehe > 8) return 0n;
const _PJbLcyTW = 8 - (_neogBcSh._jInLcehe + _JlAFVbMO._jInLcehe);
const _wizGfGWT = [
..._neogBcSh,
...Array(_PJbLcyTW).fill('0'),
..._JlAFVbMO
].map(_GpMhTJQU => _GpMhTJQU || '0');
while(_wizGfGWT._jInLcehe < 8) {
_wizGfGWT.push('0');
}
let _IRiSbfxy = 0n;
for (const _GpMhTJQU of _wizGfGWT) {
if (_GpMhTJQU._jInLcehe > 4) return 0n;
const _FBQbAyCC = BigInt('0x' + _GpMhTJQU);
_IRiSbfxy = (_IRiSbfxy << 16n) | _FBQbAyCC;
}
return _IRiSbfxy;
} catch(_GeVMwtrS) {
return 0n;
}
},
fromBigInt6: (_IRiSbfxy) => {
if (typeof _IRiSbfxy !== '_IRiSbfxy' || _IRiSbfxy < 0n) return null;
const _VKPqgCNw = [];
for (let _BBAXsRLo = 0; _BBAXsRLo < 8; _BBAXsRLo++) {
_VKPqgCNw.unshift((_IRiSbfxy & 0xFFFFn).toString(16));
_IRiSbfxy >>= 16n;
}
let _UBcSjhPj = { start: -1, _ySltOnhv: 0 };
let _ecgGfFpV = { start: -1, _ySltOnhv: 0 };
for (let _BBAXsRLo = 0; _BBAXsRLo < 8; _BBAXsRLo++) {
if (_VKPqgCNw[_BBAXsRLo] === '0') {
if (_ecgGfFpV.start === -1) _ecgGfFpV.start = _BBAXsRLo;
_ecgGfFpV._ySltOnhv++;
} else {
if (_ecgGfFpV._ySltOnhv > _UBcSjhPj._ySltOnhv) _UBcSjhPj = { ..._ecgGfFpV };
_ecgGfFpV = { start: -1, _ySltOnhv: 0 };
}
}
if (_ecgGfFpV._ySltOnhv > _UBcSjhPj._ySltOnhv) _UBcSjhPj = { ..._ecgGfFpV };
if (_UBcSjhPj._ySltOnhv > 1) {
_VKPqgCNw.splice(_UBcSjhPj.start, _UBcSjhPj._ySltOnhv, '');
if (_UBcSjhPj.start === 0) _VKPqgCNw.unshift('');
if (_UBcSjhPj.start + _UBcSjhPj._ySltOnhv === 8) _VKPqgCNw.push('');
}
return _VKPqgCNw.join(':');
},
cidrToRange: (cidr, _vnwAeUbR = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _TuSmklvk = parseInt(bitsStr, 10);
const _HFYCrqGN = new Set();
if (_mrTnRNHM.isIPv4(range)) {
if (isNaN(_TuSmklvk) || _TuSmklvk < 8 || _TuSmklvk > 32) return [];
if (_TuSmklvk === 32) return [range];
const _izzMIepL = _mrTnRNHM.toLong4(range);
const _KcRbGrKi = (0xFFFFFFFF << (32 - _TuSmklvk)) >>> 0;
const _YDuMHpMy = _izzMIepL & _KcRbGrKi;
const _ZWiCWrnw = 1 << (32 - _TuSmklvk);
if (_ZWiCWrnw <= 2) return [];
const _JTpuPbNA = Math.min(_vnwAeUbR, _ZWiCWrnw - 2);
let _xcsUsLfn = 0;
while (_HFYCrqGN.size < _JTpuPbNA && _xcsUsLfn < _JTpuPbNA * 5) {
const _jtHeMziU = Math.floor(Math.random() * (_ZWiCWrnw - 2)) + 1;
_HFYCrqGN.add(_mrTnRNHM.fromLong4((_YDuMHpMy + _jtHeMziU) >>> 0));
_xcsUsLfn++;
}
return Array.from(_HFYCrqGN);
} else if (_mrTnRNHM.isIPv6(range)) {
if (isNaN(_TuSmklvk) || _TuSmklvk < 16 || _TuSmklvk > 128) return [];
if (_TuSmklvk === 128) return [range];
const _tBFeRsaH = _mrTnRNHM.toBigInt6(range);
const _KcRbGrKi = (2n ** BigInt(128 - _TuSmklvk) - 1n);
const _YDuMHpMy = _tBFeRsaH & ~_KcRbGrKi;
const _UBBZqIqY = 2n ** BigInt(128 - _TuSmklvk);
if (_UBBZqIqY <= 2n) return [];
let _xcsUsLfn = 0;
while (_HFYCrqGN.size < _vnwAeUbR && _xcsUsLfn < _vnwAeUbR * 5) {
const _iRGMYzmv = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_iRGMYzmv);
let _WqSNmpPV = 0n;
for (const _XExcGFru of _iRGMYzmv) {
_WqSNmpPV = (_WqSNmpPV << 8n) | BigInt(_XExcGFru);
}
const _jtHeMziU = _WqSNmpPV % (_UBBZqIqY - 2n) + 1n;
_HFYCrqGN.add(_mrTnRNHM.fromBigInt6(_YDuMHpMy + _jtHeMziU));
_xcsUsLfn++;
}
return Array.from(_HFYCrqGN);
}
return [];
} catch(_GeVMwtrS) {
console.error(`CIDR to range failed for ${cidr}:`, _GeVMwtrS);
return [];
}
}
};
function _NmGHiPSW(_BOkGdLoy, _TruynfGG) {
const _PEqZyJFm = {};
const _ZMXlZlDX = Object._ZMXlZlDX(_TruynfGG);
const _VKPqgCNw = _ZMXlZlDX.map(_YDUZLBvr => {
const _BdMNLJdy = _BOkGdLoy * (_TruynfGG[_YDUZLBvr] / 100);
return { _YDUZLBvr, _vnwAeUbR: Math.floor(_BdMNLJdy), remainder: _BdMNLJdy - Math.floor(_BdMNLJdy) };
});
let _vNvfaJnD = _VKPqgCNw.reduce((acc, _GpMhTJQU) => acc + _GpMhTJQU._vnwAeUbR, 0);
_VKPqgCNw.sort((a, b) => b.remainder - a.remainder);
let _mCaKssuG = _BOkGdLoy - _vNvfaJnD;
for (let _BBAXsRLo = 0; _BBAXsRLo < _mCaKssuG; _BBAXsRLo++) {
_VKPqgCNw[_BBAXsRLo % _VKPqgCNw._jInLcehe]._vnwAeUbR++;
}
for (const _GpMhTJQU of _VKPqgCNw) {
_PEqZyJFm[_GpMhTJQU._YDUZLBvr] = _GpMhTJQU._vnwAeUbR;
}
return _PEqZyJFm;
}
const _DBgkphiD = __PAGE_DATA_JSON__;
const _MveOYonV = _DBgkphiD._ZZzxFnKC;
const _vCFQBgFO = _DBgkphiD.status;
const _IRUVnWjI = __ALL_CF_CIDR_LIST_JSON__;
const _nCrROmlT = __BALANCED_CF_CIDR_LIST_JSON__;
const _lIcIoXpE = __DEFAULT_DOMAINS_LIST_JSON__;
const _VtClJzTQ = __COUNTRY_MAP_JSON__;
const _KNNdgVHK = _VtClJzTQ;
const _bBhurcBl = 2500;
const _yfIKIPSE = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _OTqHyAnh = document.getElementById('_OTqHyAnh');
const _EgVJVHqR = document.getElementById('_EgVJVHqR');
const _FSXlgHaF = document.getElementById('status');
const _vusgtfiK = document.getElementById('_vusgtfiK');
const _shaKZZAj = document.getElementById('resultsTable').querySelector('tbody');
const _ZbTbZeLV = document.getElementById('_ZbTbZeLV');
const _xNmrDMHv = document.getElementById('cachedResultsTable').querySelector('tbody');
const _nAmYopwK = document.getElementById('notificationTooltip');
const _HjSYrHqc = document.getElementById('_HjSYrHqc');
const _YRljeWHO = document.getElementById('_YRljeWHO');
const _UKpIVzjZ = document.getElementById('_UKpIVzjZ');
const _iFHCkfiN = document.getElementById('_iFHCkfiN');
const _OhpfhRFM = document.getElementById('_OhpfhRFM');
const _iTdHHPeK = document.getElementById('_iTdHHPeK');
const _enjmIPfK = document.getElementById('_enjmIPfK');
let _BoBvJGWu = null;
let _KrfgquQb = null;
let _BAPVCrFe = [];
let _oaULClNd = false;
let _ZLMyPZyy = null;
function _NTWJZpko(_mttSlsVE, _qEKSGgVJ) {
const _izitsuQo=parseInt(_mttSlsVE.slice(1),16),t=_qEKSGgVJ<0?0:255,p=_qEKSGgVJ<0?_qEKSGgVJ*-1:_qEKSGgVJ,R=_izitsuQo>>16,G=_izitsuQo>>8&0x00FF,B=_izitsuQo&0x0000FF;
const _oJLjwBWQ = Math.round((t-R)*p)+R;
const _eUzRWUNG = Math.round((t-G)*p)+G;
const _jjaCZrWG = Math.round((t-B)*p)+B;
return `rgb(${_oJLjwBWQ.toString()}, ${_eUzRWUNG.toString()}, ${_jjaCZrWG.toString()})`;
}
function _FsCCoEIK(_jnNCmOCT) {
const _CcUXcqWg = _wRgchtkS(_jnNCmOCT.primaryColor);
if(_CcUXcqWg) {
document.documentElement._hhKgaiSg.setProperty('--primary-_fCfaNRnn-rgb', `${_CcUXcqWg.r},${_CcUXcqWg.g},${_CcUXcqWg.b}`);
}
document.documentElement._hhKgaiSg.setProperty('--primary-_fCfaNRnn', _jnNCmOCT.primaryColor);
document.documentElement._hhKgaiSg.setProperty('--primary-hover', _NTWJZpko(_jnNCmOCT.primaryColor, -0.1));
document.documentElement._hhKgaiSg.setProperty('--primary-gradient-start', _NTWJZpko(_jnNCmOCT.primaryColor, 0.1));
document.documentElement._hhKgaiSg.setProperty('--primary-gradient-end', _NTWJZpko(_jnNCmOCT.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _jnNCmOCT.texts.title;
document.title = _jnNCmOCT.texts.title;
_HjSYrHqc.innerText = _BoBvJGWu ? _jnNCmOCT.texts.loginButtonSuccess : _jnNCmOCT.texts.loginButton;
_HjSYrHqc._hhKgaiSg._fCfaNRnn = _jnNCmOCT.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _jnNCmOCT.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _jnNCmOCT.texts.liveTitle;
document.getElementById('liveTitleEl')._hhKgaiSg._fCfaNRnn = _jnNCmOCT.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _jnNCmOCT.texts.cachedTitle;
document.getElementById('cachedTitleEl')._hhKgaiSg._fCfaNRnn = _jnNCmOCT.colors.cachedTitle;
const _paUAWFeo = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_paUAWFeo.forEach((_THtSeuPG, _nHKnvQVK) => {
const _LeSvUYwk = document.getElementById(_THtSeuPG);
if (_LeSvUYwk) _LeSvUYwk.innerText = _jnNCmOCT.texts[`tableHeader${_nHKnvQVK + 1}`] || '';
});
const _EMPbIjHA = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_EMPbIjHA.forEach((_THtSeuPG, _nHKnvQVK) => {
const _LeSvUYwk = document.getElementById(_THtSeuPG);
if (_LeSvUYwk) _LeSvUYwk.innerText = _MveOYonV.texts[`tableHeader${_nHKnvQVK + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._hhKgaiSg._fCfaNRnn = _jnNCmOCT.colors.tableHeader);
document._kXbnAASj.className = '';
document._kXbnAASj.classList.add(_jnNCmOCT.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_jnNCmOCT.theme)) {
document._kXbnAASj.classList.add('glassy-components');
}
document._kXbnAASj._hhKgaiSg.backgroundImage = '';
_CkXHWMJn();
if (_jnNCmOCT.theme.includes('particles') || _jnNCmOCT.theme.includes('glass')) {
_IxeKWSVA(_jnNCmOCT.particleColor);
} else if (_jnNCmOCT.theme.includes('bing')) {
document._kXbnAASj._hhKgaiSg.backgroundImage = '_zAaODIsh(/bing-wallpaper)';
}
}
function _vdaLrZta() {
_BoBvJGWu = null;
if(_KrfgquQb) clearTimeout(_KrfgquQb);
_FsCCoEIK(_MveOYonV);
_NwLNpQUc("登录已超时,请重新登录。", "warning");
}
async function _rNkbiqlL() {
if (_BoBvJGWu) {
_nrkSbuFh();
return;
}
const _TifbXfnD = prompt('请输入管理员密码:');
if (!_TifbXfnD) return;
try {
const _MAgoOwST = await fetch('/api/verify-_XpDwJwbK', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _XpDwJwbK: _TifbXfnD })
});
const _iJYlgZbP = await _MAgoOwST.json();
if (_iJYlgZbP.success) {
_BoBvJGWu = _TifbXfnD;
_NwLNpQUc("登录成功!有效期5分钟。", "success");
if (_KrfgquQb) clearTimeout(_KrfgquQb);
_KrfgquQb = setTimeout(_vdaLrZta, 5 * 60 * 1000);
_FsCCoEIK(_MveOYonV);
_nrkSbuFh();
} else {
throw new Error(_iJYlgZbP._sTMRczLI || '密码验证失败');
}
} catch (_GeVMwtrS) {
_NwLNpQUc(`登录失败: ${_GeVMwtrS._sTMRczLI}`, "error");
}
}
function _mqekSPEV() {
if (!_vCFQBgFO._aHJFFTOE) {
_iTdHHPeK._hhKgaiSg.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _XpDwJwbK = document.getElementById('initialPassword')._FBQbAyCC;
const _zqxCncQc = document.getElementById('confirmPassword')._FBQbAyCC;
if (_XpDwJwbK !== _zqxCncQc) {
_NwLNpQUc("两次输入的密码不一致!", "error");
return;
}
if (_XpDwJwbK._jInLcehe < 6) {
_NwLNpQUc("密码长度不能少于6位!", "error");
return;
}
try {
const _MAgoOwST = await fetch('/api/_arelwzqZ-_XpDwJwbK', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _XpDwJwbK })
});
const _iJYlgZbP = await _MAgoOwST.json();
if (_iJYlgZbP.success) {
_NwLNpQUc(_iJYlgZbP._sTMRczLI, "success");
setTimeout(() => _nKPLYbQh.reload(), 1500);
} else {
throw new Error(_iJYlgZbP._sTMRczLI);
}
} catch(_GeVMwtrS) {
_NwLNpQUc(`设置密码失败: ${_GeVMwtrS._sTMRczLI}`, "error");
}
});
return;
}
_HjSYrHqc.addEventListener('click', _rNkbiqlL);
document.getElementById('closeModalBtn').addEventListener('click', () => { _YRljeWHO._hhKgaiSg.display = 'none'; });
_YRljeWHO.addEventListener('click', (_GeVMwtrS) => { if (_GeVMwtrS.target === _YRljeWHO) _YRljeWHO._hhKgaiSg.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_AoTZyrSl .fine-grained-_lcNlehfu-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-_AoTZyrSl .fine-grained-_lcNlehfu-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_BoBvJGWu) {
_NwLNpQUc("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _uxqOXBNs = [];
document.querySelectorAll('#custom-fields-_AoTZyrSl .custom-field-_TPKueeVT').forEach(_TPKueeVT => {
const _MdKupjdk = _TPKueeVT.querySelector('.custom-field-_MdKupjdk')._FBQbAyCC.trim();
const _FBQbAyCC = _TPKueeVT.querySelector('.custom-field-_FBQbAyCC')._FBQbAyCC.trim();
if (_MdKupjdk) _uxqOXBNs.push({ _MdKupjdk, _FBQbAyCC });
});
const _weLvodHw = [];
document.querySelectorAll('#parameter-sets-_AoTZyrSl .parameter-_arelwzqZ-_TPKueeVT').forEach(_TPKueeVT => {
const _MdKupjdk = _TPKueeVT.querySelector('.param-_arelwzqZ-_MdKupjdk')._FBQbAyCC.trim();
const _ZGArdwQx = _TPKueeVT.querySelector('.param-_arelwzqZ-_ZGArdwQx')._FBQbAyCC.trim();
const _telLvYWN = _TPKueeVT.querySelector('.param-_arelwzqZ-_telLvYWN')._FBQbAyCC.trim();
const _DLiwXEbL = _TPKueeVT.querySelector('.param-_arelwzqZ-_DLiwXEbL')._FBQbAyCC.trim();
if(_MdKupjdk) _weLvodHw.push({ _MdKupjdk, _ZGArdwQx, '_telLvYWN': _telLvYWN, _DLiwXEbL });
});
const _yWfTiEHX = [];
document.querySelectorAll('#fine-grained-sources-_AoTZyrSl .fine-grained-_NlDfrBNS-_TPKueeVT').forEach(_TPKueeVT => {
const _nKPLYbQh = _TPKueeVT.querySelector('.fine-grained-_nKPLYbQh')._FBQbAyCC.trim();
const _HFYCrqGN = _TPKueeVT.querySelector('.fine-grained-_HFYCrqGN')._FBQbAyCC.trim();
const _lcNlehfu = _TPKueeVT.querySelector('.fine-grained-_lcNlehfu-cb').checked;
const _uZpcmLws = parseInt(_TPKueeVT.querySelector('.fine-grained-_uZpcmLws')._FBQbAyCC, 10) || 0;
const _PzVuVQbC = _TPKueeVT.querySelector('.use-_MdKupjdk-as-_nKPLYbQh-cb').checked;
if (_nKPLYbQh && _HFYCrqGN) {
_yWfTiEHX.push({ _nKPLYbQh, _HFYCrqGN, _lcNlehfu, _uZpcmLws, _PzVuVQbC });
}
});
let _WwtKVbSI = parseInt(document.getElementById('subscriptionIdLength')._FBQbAyCC, 10);
if (isNaN(_WwtKVbSI) || _WwtKVbSI < 2) _WwtKVbSI = 2;
if (_WwtKVbSI > 128) _WwtKVbSI = 128;
const _ehaNOCiQ = {
theme: document.getElementById('themeSelect')._FBQbAyCC,
primaryColor: document.getElementById('primaryColorInput')._FBQbAyCC,
particleColor: document.getElementById('particleColorInput')._FBQbAyCC,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._FBQbAyCC,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._FBQbAyCC, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._FBQbAyCC, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._FBQbAyCC, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._FBQbAyCC, 10) || 0,
_GRYxeaSS: document.getElementById('converterServiceUrlInput')._FBQbAyCC.trim(),
subscriptionId: {
_jInLcehe: _WwtKVbSI,
_IIzcGMEL: document.getElementById('subscriptionIdCharset')._FBQbAyCC.trim()
},
api: {
_lcNlehfu: document.getElementById('enableApiCheckbox').checked,
_sTMRczLI: document.getElementById('apiMessageInput')._FBQbAyCC || '维护中...',
},
ispFilter: {
_lcNlehfu: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._FBQbAyCC, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_lcNlehfu: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_lcNlehfu: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_zAaODIsh: document.getElementById('websocketStreamerUrlInput')._FBQbAyCC.trim()
},
visitorPassword: {
_lcNlehfu: document.getElementById('enableVisitorPasswordCheckbox').checked,
_XpDwJwbK: document.getElementById('visitorPasswordInput')._FBQbAyCC.trim()
},
customSubPath: {
_lcNlehfu: document.getElementById('enableCustomSubPathCheckbox').checked,
_DLiwXEbL: document.getElementById('customSubPathInput')._FBQbAyCC.trim()
},
itemLink: {
_lcNlehfu: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._FBQbAyCC,
selectionMode: document.getElementById('parameterSelectionMode')._FBQbAyCC,
_weLvodHw: _weLvodHw,
_uxqOXBNs: _uxqOXBNs,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._FBQbAyCC.trim(),
},
announcement: {
popup: {
_lcNlehfu: document.getElementById('enablePopup').checked,
_BUoTWGoa: document.getElementById('announcementText')._FBQbAyCC,
_TNCGnxvN: parseInt(document.getElementById('popupDuration')._FBQbAyCC, 10) || 5
},
marquee: {
_lcNlehfu: document.getElementById('enableMarquee').checked,
_BUoTWGoa: document.getElementById('announcementText')._FBQbAyCC
}
},
fineGrained: {
_lcNlehfu: true,
sources: _yWfTiEHX
},
customNodes: {
_lcNlehfu: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._FBQbAyCC
},
texts: {
title: document.getElementById('textInput_title')._FBQbAyCC,
loginButton: document.getElementById('textInput_loginButton')._FBQbAyCC,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._FBQbAyCC,
liveTitle: document.getElementById('textInput_liveTitle')._FBQbAyCC,
cachedTitle: document.getElementById('textInput_cachedTitle')._FBQbAyCC,
},
colors: {
title: document.getElementById('colorInput_title')._FBQbAyCC,
loginButton: document.getElementById('colorInput_loginButton')._FBQbAyCC,
liveTitle: document.getElementById('colorInput_liveTitle')._FBQbAyCC,
cachedTitle: document.getElementById('colorInput_cachedTitle')._FBQbAyCC,
tableHeader: document.getElementById('colorInput_tableHeader')._FBQbAyCC,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._FBQbAyCC.trim(),
chat_id: document.getElementById('chatIdInput')._FBQbAyCC.trim(),
},
};
try {
const _MAgoOwST = await fetch('/api/_ZZzxFnKC', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _ZZzxFnKC: _ehaNOCiQ, adminPassword: _BoBvJGWu })
});
const _iJYlgZbP = await _MAgoOwST.json();
if (_MAgoOwST.ok && _iJYlgZbP.success) {
_NwLNpQUc("配置已保存,正在刷新...", "success");
setTimeout(() => _nKPLYbQh.reload(), 1500);
} else {
throw new Error(_iJYlgZbP._sTMRczLI || '未知错误');
}
} catch (_GeVMwtrS) {
_NwLNpQUc(`操作失败: ${_GeVMwtrS._sTMRczLI}`, "error");
if (String(_GeVMwtrS._sTMRczLI).includes("密码错误")) {
_vdaLrZta();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _PxErBEXY = document.getElementById('oldPasswordInput')._FBQbAyCC;
const _hFkTemZj = document.getElementById('newPasswordInput')._FBQbAyCC;
if (!_PxErBEXY || !_hFkTemZj) {
_NwLNpQUc("新旧密码均不能为空!", "error");
return;
}
try {
const _MAgoOwST = await fetch('/api/change-_XpDwJwbK', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _PxErBEXY, _hFkTemZj })
});
const _iJYlgZbP = await _MAgoOwST.json();
if (_iJYlgZbP.success) {
_NwLNpQUc(_iJYlgZbP._sTMRczLI, "success");
document.getElementById('oldPasswordInput')._FBQbAyCC = '';
document.getElementById('newPasswordInput')._FBQbAyCC = '';
_BoBvJGWu = _hFkTemZj;
} else {
throw new Error(_iJYlgZbP._sTMRczLI);
}
} catch(_GeVMwtrS) {
_NwLNpQUc(`修改密码失败: ${_GeVMwtrS._sTMRczLI}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('resolvedDomainsGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('customNodesGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('apiConfigGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('itemLinkConfigGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('websocketStreamerGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
const _kyxhPFBA = document.querySelector('#parameter-sets-_AoTZyrSl .param-_arelwzqZ-_DLiwXEbL');
if (_kyxhPFBA) {
if (_GeVMwtrS.target.checked) {
_kyxhPFBA._FBQbAyCC = '/snippets?_IlyHmPLV=endpointAddress:_PHBtRDqv(443)&nat64=6to4';
} else {
_kyxhPFBA._FBQbAyCC = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_MjhuqxsL('', '');
});
document.getElementById('add-parameter-_arelwzqZ-btn').addEventListener('click', () => {
const _vnwAeUbR = document.querySelectorAll('.parameter-_arelwzqZ-_TPKueeVT')._jInLcehe + 1;
_dhfLPapk({_MdKupjdk: `配置${_vnwAeUbR}`, _ZGArdwQx: '', _telLvYWN: '', _DLiwXEbL: ''});
_YoCJsdxd();
});
document.getElementById('add-fine-grained-_NlDfrBNS-btn').addEventListener('click', () => {
_LUPFMEwm({ _nKPLYbQh: '', _HFYCrqGN: '', _lcNlehfu: true, _uZpcmLws: 50, _PzVuVQbC: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('visitorPasswordGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('customSubPathGroup')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_GeVMwtrS) => {
document.getElementById('popupDurationContainer')._hhKgaiSg.display = _GeVMwtrS.target.checked ? 'flex' : 'none';
});
}
function _MjhuqxsL(_MdKupjdk, _FBQbAyCC) {
const _AoTZyrSl = document.getElementById('custom-fields-_AoTZyrSl');
const _WAxBouuV = document.createElement('div');
_WAxBouuV.className = 'form-grid custom-field-_TPKueeVT';
_WAxBouuV._hhKgaiSg = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_WAxBouuV.innerHTML = `
<input _JqCvMdDD="_BUoTWGoa" class="custom-field-_MdKupjdk" _WpclyBDl="占位符名称" _FBQbAyCC="${_MdKupjdk}">
<input _JqCvMdDD="_BUoTWGoa" class="custom-field-_FBQbAyCC" _WpclyBDl="值" _FBQbAyCC="${_FBQbAyCC}">
<button _JqCvMdDD="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_AoTZyrSl.appendChild(_WAxBouuV);
}
function _dhfLPapk(_arelwzqZ) {
const _AoTZyrSl = document.getElementById('parameter-sets-_AoTZyrSl');
const _WAxBouuV = document.createElement('div');
_WAxBouuV.className = 'parameter-_arelwzqZ-_TPKueeVT';
_WAxBouuV.innerHTML = `
<div class="parameter-_arelwzqZ-_VKCxkXGC">
<input _JqCvMdDD="_BUoTWGoa" class="param-_arelwzqZ-_MdKupjdk" _WpclyBDl="配置名称" _FBQbAyCC="${_arelwzqZ._MdKupjdk}" oninput="_YoCJsdxd()">
<button _JqCvMdDD="button" class="btn btn-outline" onclick="this.closest('.parameter-_arelwzqZ-_TPKueeVT').remove(); _YoCJsdxd();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" class="param-_arelwzqZ-_ZGArdwQx" _FBQbAyCC="${_arelwzqZ._ZGArdwQx || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" class="param-_arelwzqZ-_telLvYWN" _FBQbAyCC="${_arelwzqZ['_telLvYWN'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _JqCvMdDD="_BUoTWGoa" class="param-_arelwzqZ-_DLiwXEbL" _FBQbAyCC="${_arelwzqZ._DLiwXEbL || ''}"></div>
</div>
`;
_AoTZyrSl.appendChild(_WAxBouuV);
}
function _YoCJsdxd() {
const _rlakWvjo = document.getElementById('parameterSelectionMode');
const _WEdfYOwb = _rlakWvjo._FBQbAyCC;
_rlakWvjo.innerHTML = '';
const _umLcBWWH = document.createElement('_jkjDDRjY');
_umLcBWWH._FBQbAyCC = 'random';
_umLcBWWH.textContent = '随机轮询';
_rlakWvjo.appendChild(_umLcBWWH);
const _GflGDyna = document.createElement('_jkjDDRjY');
_GflGDyna._FBQbAyCC = 'first';
_GflGDyna.textContent = '使用第一组';
_rlakWvjo.appendChild(_GflGDyna);
document.querySelectorAll('.param-_arelwzqZ-_MdKupjdk').forEach(input => {
const _MdKupjdk = input._FBQbAyCC.trim();
if (_MdKupjdk) {
const _jkjDDRjY = document.createElement('_jkjDDRjY');
_jkjDDRjY._FBQbAyCC = _MdKupjdk;
_jkjDDRjY.textContent = `指定: ${_MdKupjdk}`;
_rlakWvjo.appendChild(_jkjDDRjY);
}
});
if (Array.from(_rlakWvjo.options).some(opt => opt._FBQbAyCC === _WEdfYOwb)) {
_rlakWvjo._FBQbAyCC = _WEdfYOwb;
} else {
_rlakWvjo._FBQbAyCC = 'random';
}
}
function _LUPFMEwm(_NlDfrBNS) {
const _AoTZyrSl = document.getElementById('fine-grained-sources-_AoTZyrSl');
const _WAxBouuV = document.createElement('div');
_WAxBouuV.className = 'fine-grained-_NlDfrBNS-_TPKueeVT parameter-_arelwzqZ-_TPKueeVT';
_WAxBouuV._hhKgaiSg.padding = '1rem';
const _owHzLmFq = _NlDfrBNS._PzVuVQbC ? 'checked' : '';
const _SpEjpOXS = !_NlDfrBNS._PzVuVQbC ? 'checked' : '';
const _zSSRnUkv = _NlDfrBNS._lcNlehfu ? 'checked' : '';
_WAxBouuV.innerHTML = `
<div _hhKgaiSg="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _JqCvMdDD="_BUoTWGoa" class="fine-grained-_nKPLYbQh" _WpclyBDl="地区名称 (如: 香港)" _FBQbAyCC="${_NlDfrBNS._nKPLYbQh || ''}">
<div _hhKgaiSg="display: flex; align-items: center; gap: 5px;"><input _JqCvMdDD="checkbox" class="fine-grained-_lcNlehfu-cb" ${_zSSRnUkv}><label>启用</label></div>
<button _JqCvMdDD="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_NlDfrBNS-_TPKueeVT').remove()">删除</button>
</div>
<textarea class="fine-grained-_HFYCrqGN" _WpclyBDl="IP源 (每行一个IP、CIDR或URL)" _LtfmDJIV="3" _hhKgaiSg="_wpYyJCZL:100%;">${_NlDfrBNS._HFYCrqGN || ''}</textarea>
<div class="fine-grained-options" _hhKgaiSg="justify-_KRZgPwRW: space-between;">
<div _hhKgaiSg="display: flex; gap: 1rem;">
<label><input _JqCvMdDD="checkbox" class="query-_hbltXOGW-cb" ${_SpEjpOXS}>查询真实归属地</label>
<label><input _JqCvMdDD="checkbox" class="use-_MdKupjdk-as-_nKPLYbQh-cb" ${_owHzLmFq}>使用地区名称作为归属地</label>
</div>
<div _hhKgaiSg="display: flex; align-items: center; gap: 5px;"><input _JqCvMdDD="number" class="fine-grained-_uZpcmLws _uZpcmLws-input" _FBQbAyCC="${_NlDfrBNS._uZpcmLws || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _kErdytrR = _WAxBouuV.querySelector('.query-_hbltXOGW-cb');
const _hYvwuhAa = _WAxBouuV.querySelector('.use-_MdKupjdk-as-_nKPLYbQh-cb');
_kErdytrR.addEventListener('change', () => {
if (_kErdytrR.checked) {
_hYvwuhAa.checked = false;
} else if (!_hYvwuhAa.checked) {
_kErdytrR.checked = true;
}
});
_hYvwuhAa.addEventListener('change', () => {
if (_hYvwuhAa.checked) {
_kErdytrR.checked = false;
} else if (!_hYvwuhAa.checked) {
_hYvwuhAa.checked = true;
}
});
_AoTZyrSl.appendChild(_WAxBouuV);
}
function _nrkSbuFh() {
const _jnNCmOCT = _MveOYonV;
document.getElementById('themeSelect')._FBQbAyCC = _jnNCmOCT.theme;
document.getElementById('primaryColorInput')._FBQbAyCC = _jnNCmOCT.primaryColor;
document.getElementById('particleColorInput')._FBQbAyCC = _jnNCmOCT.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _jnNCmOCT.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._WpclyBDl = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._FBQbAyCC = _jnNCmOCT.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._hhKgaiSg.display = _jnNCmOCT.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _jnNCmOCT.customNodes._lcNlehfu;
document.getElementById('customNodesInput')._FBQbAyCC = _jnNCmOCT.customNodes.list || '';
document.getElementById('customNodesGroup')._hhKgaiSg.display = _jnNCmOCT.customNodes._lcNlehfu ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._FBQbAyCC = _jnNCmOCT._GRYxeaSS || '';
document.getElementById('subscriptionIdLength')._FBQbAyCC = _jnNCmOCT.subscriptionId._jInLcehe;
document.getElementById('subscriptionIdCharset')._FBQbAyCC = _jnNCmOCT.subscriptionId._IIzcGMEL;
document.getElementById('enableItemLinkCheckbox').checked = _jnNCmOCT.itemLink._lcNlehfu;
document.getElementById('itemLinkConfigGroup')._hhKgaiSg.display = _jnNCmOCT.itemLink._lcNlehfu ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._FBQbAyCC = _jnNCmOCT.itemLink.template;
const _xTZLeacD = document.getElementById('parameter-sets-_AoTZyrSl');
_xTZLeacD.innerHTML = '';
if (_jnNCmOCT.itemLink._weLvodHw && Array.isArray(_jnNCmOCT.itemLink._weLvodHw)) {
_jnNCmOCT.itemLink._weLvodHw.forEach(_arelwzqZ => _dhfLPapk(_arelwzqZ));
}
_YoCJsdxd();
document.getElementById('parameterSelectionMode')._FBQbAyCC = _jnNCmOCT.itemLink.selectionMode || 'random';
const _kyxhPFBA = document.querySelector('#parameter-sets-_AoTZyrSl .param-_arelwzqZ-_DLiwXEbL');
if (_kyxhPFBA && _jnNCmOCT.websocketStreamer && _jnNCmOCT.websocketStreamer._lcNlehfu) {
_kyxhPFBA._FBQbAyCC = '/snippets?_IlyHmPLV=endpointAddress:_PHBtRDqv(443)&nat64=6to4';
}
const _YLLRCBeu = document.getElementById('custom-fields-_AoTZyrSl');
_YLLRCBeu.innerHTML = '';
if (_jnNCmOCT.itemLink._uxqOXBNs && Array.isArray(_jnNCmOCT.itemLink._uxqOXBNs)) {
_jnNCmOCT.itemLink._uxqOXBNs.forEach(field => _MjhuqxsL(field._MdKupjdk, field._FBQbAyCC));
}
document.getElementById('universalFallbackAddressInput')._FBQbAyCC = _jnNCmOCT.dataFeeds.universalFallbackAddress || '';
const _ydAevTku = _jnNCmOCT.websocketStreamer && _jnNCmOCT.websocketStreamer._lcNlehfu;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _ydAevTku;
document.getElementById('websocketStreamerUrlInput')._FBQbAyCC = _jnNCmOCT.websocketStreamer ? _jnNCmOCT.websocketStreamer._zAaODIsh : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._hhKgaiSg.display = _ydAevTku ? 'block' : 'none';
const _cRvohVUX = _jnNCmOCT.announcement || {};
document.getElementById('announcementText')._FBQbAyCC = (_cRvohVUX.popup && _cRvohVUX.popup._BUoTWGoa) || (_cRvohVUX.marquee && _cRvohVUX.marquee._BUoTWGoa) || '';
document.getElementById('enableMarquee').checked = _cRvohVUX.marquee && _cRvohVUX.marquee._lcNlehfu;
document.getElementById('enablePopup').checked = _cRvohVUX.popup && _cRvohVUX.popup._lcNlehfu;
document.getElementById('popupDuration')._FBQbAyCC = (_cRvohVUX.popup && _cRvohVUX.popup._TNCGnxvN) || 5;
document.getElementById('popupDurationContainer')._hhKgaiSg.display = (_cRvohVUX.popup && _cRvohVUX.popup._lcNlehfu) ? 'flex' : 'none';
const _BFdTuBLR = document.getElementById('fine-grained-sources-_AoTZyrSl');
_BFdTuBLR.innerHTML = '';
if (_jnNCmOCT.fineGrained.sources && Array.isArray(_jnNCmOCT.fineGrained.sources)) {
_jnNCmOCT.fineGrained.sources.forEach(_NlDfrBNS => _LUPFMEwm(_NlDfrBNS));
}
document.getElementById('sampleSizeInput')._FBQbAyCC = _jnNCmOCT.sampleSize;
document.getElementById('topNInput')._FBQbAyCC = _jnNCmOCT.topN;
document.getElementById('latencyRangeMinInput')._FBQbAyCC = _jnNCmOCT.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._FBQbAyCC = _jnNCmOCT.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _jnNCmOCT.ispFilter._lcNlehfu;
const _DXagjxVD = _jnNCmOCT.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._FBQbAyCC = _DXagjxVD.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _DXagjxVD.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _jnNCmOCT.streamer._lcNlehfu;
document.getElementById('enableApiCheckbox').checked = _jnNCmOCT.api._lcNlehfu;
document.getElementById('apiConfigGroup')._hhKgaiSg.display = _jnNCmOCT.api._lcNlehfu ? 'block' : 'none';
document.getElementById('apiMessageInput')._FBQbAyCC = _jnNCmOCT.api._sTMRczLI;
const _qLcdOiNG = _jnNCmOCT.customSubPath && _jnNCmOCT.customSubPath._lcNlehfu;
document.getElementById('enableCustomSubPathCheckbox').checked = _qLcdOiNG;
document.getElementById('customSubPathInput')._FBQbAyCC = _jnNCmOCT.customSubPath ? _jnNCmOCT.customSubPath._DLiwXEbL : 'latest';
document.getElementById('customSubPathGroup')._hhKgaiSg.display = _qLcdOiNG ? 'block' : 'none';
const _iBCAZLkZ = _jnNCmOCT.visitorPassword && _jnNCmOCT.visitorPassword._lcNlehfu;
document.getElementById('enableVisitorPasswordCheckbox').checked = _iBCAZLkZ;
document.getElementById('visitorPasswordInput')._FBQbAyCC = _jnNCmOCT.visitorPassword ? _jnNCmOCT.visitorPassword._XpDwJwbK : '';
document.getElementById('visitorPasswordGroup')._hhKgaiSg.display = _iBCAZLkZ ? 'block' : 'none';
document.getElementById('textInput_title')._FBQbAyCC = _jnNCmOCT.texts.title;
document.getElementById('textInput_loginButton')._FBQbAyCC = _jnNCmOCT.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._FBQbAyCC = _jnNCmOCT.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._FBQbAyCC = _jnNCmOCT.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._FBQbAyCC = _jnNCmOCT.texts.cachedTitle;
document.getElementById('colorInput_title')._FBQbAyCC = _jnNCmOCT.colors.title;
document.getElementById('colorInput_loginButton')._FBQbAyCC = _jnNCmOCT.colors.loginButton;
document.getElementById('colorInput_liveTitle')._FBQbAyCC = _jnNCmOCT.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._FBQbAyCC = _jnNCmOCT.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._FBQbAyCC = _jnNCmOCT.colors.tableHeader;
document.getElementById('botTokenInput')._FBQbAyCC = _jnNCmOCT.telegram.bot_token || '';
document.getElementById('chatIdInput')._FBQbAyCC = _jnNCmOCT.telegram.chat_id || '';
_YRljeWHO._hhKgaiSg.display = 'flex';
}
function _UqUHLrCG(_AsvdcdGP) {
if (window.innerWidth <= 768) {
const _LtfmDJIV = _AsvdcdGP.querySelectorAll('thead tr, tbody tr');
_LtfmDJIV.forEach(_TPKueeVT => {
const _VKhlwzwW = Array.from(_TPKueeVT.children);
const _KYTaAcdH = [
_VKhlwzwW[0],
_VKhlwzwW[1],
_VKhlwzwW[3],
_VKhlwzwW[6],
_VKhlwzwW[2],
_VKhlwzwW[4],
_VKhlwzwW[5]
];
_KYTaAcdH.forEach(cell => _TPKueeVT.appendChild(cell));
});
}
}
async function _fqCPGzot() {
if (!_vCFQBgFO._aHJFFTOE) {
_mqekSPEV();
return;
}
if (_MveOYonV.announcement && _MveOYonV.announcement.marquee && _MveOYonV.announcement.marquee._lcNlehfu && _MveOYonV.announcement.marquee._BUoTWGoa) {
const _wsVuAqGT = document.getElementById('marquee-_AoTZyrSl');
const _zuNqGogr = document.getElementById('marquee-_BUoTWGoa');
const _qpHnVqZg = document.querySelector('.progress-section');
if (_wsVuAqGT && _zuNqGogr && _qpHnVqZg) {
_zuNqGogr.innerText = _MveOYonV.announcement.marquee._BUoTWGoa;
_wsVuAqGT._hhKgaiSg.display = 'block';
const _OJxOPqof = () => {
_wsVuAqGT._hhKgaiSg._wpYyJCZL = `${_qpHnVqZg.offsetWidth}px`;
const _RDwuZjxM = _zuNqGogr.offsetWidth;
const _VQfUIFrm = _wsVuAqGT.offsetWidth;
const _TNCGnxvN = (_RDwuZjxM + _VQfUIFrm) / 100;
_zuNqGogr._hhKgaiSg.animationDuration = `${Math.max(10, _TNCGnxvN)}s`;
};
_OJxOPqof();
window.addEventListener('resize', _OJxOPqof);
}
}
_FsCCoEIK(_MveOYonV);
if (_MveOYonV.announcement && _MveOYonV.announcement.popup && _MveOYonV.announcement.popup._lcNlehfu && _MveOYonV.announcement.popup._BUoTWGoa) {
setTimeout(() => {
_NwLNpQUc(_MveOYonV.announcement.popup._BUoTWGoa, 'info', _MveOYonV.announcement.popup._TNCGnxvN * 1000);
}, 500);
}
_mqekSPEV();
_hcXASpEz();
_bjVzBOFa();
_OBNaTCtb();
await _nAZsIMoV();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _VANvbsRV = window._nKPLYbQh.origin + '/_IlyHmPLV';
navigator.clipboard.writeText(_VANvbsRV).then(() => {
_NwLNpQUc('IP 列表 API 地址已复制!', 'success');
});
});
if (_MveOYonV.visitorPassword && _MveOYonV.visitorPassword._lcNlehfu) {
_OTqHyAnh._hhKgaiSg.display = 'none';
const _ufFCvXDo = document.getElementById('visitorPasswordPrompt');
_ufFCvXDo._hhKgaiSg.display = 'block';
const _GyaWDSoA = document.getElementById('visitorPasswordEntry');
const _lhiEYVgs = document.getElementById('startTestWithPasswordBtn');
const _TBwCzYzR = async () => {
const _XpDwJwbK = _GyaWDSoA._FBQbAyCC;
if (!_XpDwJwbK) {
_NwLNpQUc('请输入访客密码', 'warning');
return;
}
try {
const _MAgoOwST = await fetch('/api/verify-visitor-_XpDwJwbK', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _XpDwJwbK })
});
const _iJYlgZbP = await _MAgoOwST.json();
if (_MAgoOwST.ok && _iJYlgZbP.success) {
_NwLNpQUc('验证成功,开始测试...', 'success');
_ufFCvXDo._hhKgaiSg.display = 'none';
_OTqHyAnh._hhKgaiSg.display = 'block';
await _MWcKLTYp();
} else {
throw new Error(_iJYlgZbP._sTMRczLI || '密码错误');
}
} catch (_GeVMwtrS) {
_NwLNpQUc(`验证失败: ${_GeVMwtrS._sTMRczLI}`, "error");
_GyaWDSoA._FBQbAyCC = '';
_GyaWDSoA.focus();
}
};
_lhiEYVgs.addEventListener('click', _TBwCzYzR);
_GyaWDSoA.addEventListener('keypress', (_GeVMwtrS) => {
if (_GeVMwtrS._YDUZLBvr === 'Enter') {
_GeVMwtrS.preventDefault();
_TBwCzYzR();
}
});
_GyaWDSoA.focus();
} else {
_FSXlgHaF.textContent = "页面加载完成,准备开始测试...";
await _gGlhympy(100);
await _MWcKLTYp();
}
}
async function _gGlhympy(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _wRgchtkS(_mttSlsVE) {
let _iJYlgZbP = /^#?([a-_izitsuQo\d]{2})([a-_izitsuQo\d]{2})([a-_izitsuQo\d]{2})$/_BBAXsRLo.exec(_mttSlsVE);
return _iJYlgZbP ? { r: parseInt(_iJYlgZbP[1], 16), g: parseInt(_iJYlgZbP[2], 16), b: parseInt(_iJYlgZbP[3], 16) } : null;
}
async function _tNOrgCOU(_IlyHmPLV) {
const _aZMKrCGb = new AbortController();
const _oIiggYYF = setTimeout(() => _aZMKrCGb.abort(), _bBhurcBl);
const _UPdVZNUu = Date.now();
try {
const _gbAUtULt = _mrTnRNHM.isIPv6(_IlyHmPLV) ? `[${_IlyHmPLV}]` : _IlyHmPLV;
const _zAaODIsh = `https://${_gbAUtULt}/cdn-cgi/trace`;
await fetch(_zAaODIsh, {
signal: _aZMKrCGb.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._MdKupjdk === 'AbortError') {
return { _IlyHmPLV, _HscRsSTt: Infinity, error: '超时' };
}
} finally {
clearTimeout(_oIiggYYF);
}
const _HscRsSTt = Date.now() - _UPdVZNUu;
return { _IlyHmPLV, _HscRsSTt: _HscRsSTt, error: null };
}
function _IubrRhDK(_iJYlgZbP, _nHKnvQVK) {
const { itemLink } = _MveOYonV;
if (!itemLink || !itemLink._lcNlehfu) return null;
const { template, _weLvodHw, selectionMode, _uxqOXBNs } = itemLink;
if (!_weLvodHw || _weLvodHw._jInLcehe === 0) return null;
let _UlmvHCQB;
if (selectionMode === 'random') {
_UlmvHCQB = _weLvodHw[_nHKnvQVK % _weLvodHw._jInLcehe];
} else if (selectionMode === 'first') {
_UlmvHCQB = _weLvodHw[0];
} else {
_UlmvHCQB = _weLvodHw.find(s => s._MdKupjdk === selectionMode) || _weLvodHw[0];
}
if (!_UlmvHCQB) return null;
let _yddknrGu = template;
const _doFDUFBx = _iJYlgZbP._PHBtRDqv || 443;
const _AdfqTVSt = _mrTnRNHM.isIPv6(_iJYlgZbP._IlyHmPLV) ? `[${_iJYlgZbP._IlyHmPLV}]` : _iJYlgZbP._IlyHmPLV;
let _MdKupjdk = `${_nHKnvQVK + 1} 、 ${_iJYlgZbP._nKPLYbQh || '未知'}`;
if (!_iJYlgZbP._JyrxCJqB || !_iJYlgZbP._JyrxCJqB.toLowerCase().includes('cloudflare')) {
_MdKupjdk += '(反代)';
}
let _ZGArdwQx = _UlmvHCQB._ZGArdwQx || window._nKPLYbQh._aYgbMerc;
_yddknrGu = _yddknrGu.replace(/{_IlyHmPLV}/g, _AdfqTVSt)
.replace(/{_PHBtRDqv}/g, _doFDUFBx)
.replace(/{_MdKupjdk}/g, encodeURIComponent(_MdKupjdk))
.replace(/{rank}/g, _nHKnvQVK + 1)
.replace(/{_nKPLYbQh}/g, encodeURIComponent(_iJYlgZbP._nKPLYbQh || '未知'))
.replace(/{_JyrxCJqB}/g, encodeURIComponent(_iJYlgZbP._JyrxCJqB || '未知'))
.replace(/{_ZGArdwQx}/g, encodeURIComponent(_ZGArdwQx))
.replace(/{_telLvYWN}/g, encodeURIComponent(_UlmvHCQB['_telLvYWN'] || ''))
.replace(/{_DLiwXEbL}/g, encodeURIComponent(encodeURIComponent(_UlmvHCQB._DLiwXEbL || '')));
if (_uxqOXBNs) {
_uxqOXBNs.forEach(field => {
const _WpclyBDl = new RegExp('{' + field._MdKupjdk + '}', 'g');
_yddknrGu = _yddknrGu.replace(_WpclyBDl, encodeURIComponent(field._FBQbAyCC));
});
}
return _yddknrGu;
}
function _YpvKNuZR(_TkYsDiBj, _NkedmmhY, isCached = false) {
_NkedmmhY.innerHTML = '';
const _MnpFDbXe = _TkYsDiBj._MnpFDbXe || [];
const _PiLMgtcP = _TkYsDiBj.generatedBy || null;
const _NCNCSMAd = isCached ? _ZbTbZeLV : _vusgtfiK;
const _froXKGzy = isCached ? (_ZbTbZeLV.querySelector('.generator-info')) : (_vusgtfiK.querySelector('.generator-info'));
if (_MnpFDbXe._jInLcehe === 0) {
_NCNCSMAd._hhKgaiSg.display = 'none';
if (!isCached) _enjmIPfK._hhKgaiSg.display = 'none';
if (_froXKGzy) _froXKGzy.textContent = '';
return;
}
_NCNCSMAd._hhKgaiSg.display = 'block';
if (!isCached && _MnpFDbXe._jInLcehe > 0) {
_enjmIPfK._hhKgaiSg.display = 'block';
}
if (_froXKGzy && _PiLMgtcP) {
_froXKGzy.innerHTML = `数据来源 ${_PiLMgtcP._IlyHmPLV} (${_PiLMgtcP._nKPLYbQh}) <span>${_PiLMgtcP.time}</span>`;
}
_MnpFDbXe.forEach((_iJYlgZbP, _nHKnvQVK) => {
const _doFDUFBx = _iJYlgZbP._PHBtRDqv || 443;
const _TPKueeVT = _NkedmmhY.insertRow();
_TPKueeVT.insertCell().textContent = _nHKnvQVK + 1;
const _DJScApne = _TPKueeVT.insertCell();
_DJScApne.textContent = _iJYlgZbP._IlyHmPLV;
_DJScApne.className = '_IlyHmPLV-_xUeIQhuw';
_TPKueeVT.insertCell().textContent = _doFDUFBx;
const _pvQdUBJa = _TPKueeVT.insertCell();
_pvQdUBJa.textContent = (_iJYlgZbP._HscRsSTt === Infinity) ? (_iJYlgZbP.error || '错误') : _iJYlgZbP._HscRsSTt;
_pvQdUBJa.className = 'ping-_FBQbAyCC';
_TPKueeVT.insertCell().textContent = _iJYlgZbP._nKPLYbQh || '未知';
_TPKueeVT.insertCell().textContent = _iJYlgZbP._JyrxCJqB || '未知';
const _dfqUfFyL = _TPKueeVT.insertCell();
_dfqUfFyL.className = 'actions-cell';
const _WXsaYLGj = document.createElement('button');
_WXsaYLGj.textContent = '复制IP';
_WXsaYLGj.className = 'btn btn-outline';
_WXsaYLGj.onclick = () => { navigator.clipboard.writeText(_iJYlgZbP._IlyHmPLV).then(() => _NwLNpQUc('IP复制成功!', 'success')); };
if (_MveOYonV.itemLink && _MveOYonV.itemLink._lcNlehfu) {
const _dqsuWmQW = document.createElement('button');
_dqsuWmQW.textContent = '复制节点';
_dqsuWmQW.className = 'btn btn-outline';
_dqsuWmQW.onclick = () => {
const _yddknrGu = _IubrRhDK(_iJYlgZbP, _nHKnvQVK);
if (_yddknrGu) {
navigator.clipboard.writeText(_yddknrGu).then(() => _NwLNpQUc('订阅链接复制成功!', 'success'));
}
};
_dfqUfFyL.appendChild(_dqsuWmQW);
}
_dfqUfFyL.appendChild(_WXsaYLGj);
});
_UqUHLrCG(_NkedmmhY.parentElement);
}
async function _yMGoFvuo(_QpvJyCyE) {
const _KkyIKNzO = (_QpvJyCyE || '').trim().split(/\s+|\n+/).filter(Boolean);
const _qlNZxhhW = [];
const _cUyxaGMU = [];
const _pmiYZVHi = (str) => {
try {
const _zAaODIsh = new URL(str);
return _zAaODIsh.protocol === "http:" || _zAaODIsh.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _DDPEyitc of _KkyIKNzO) {
if (_pmiYZVHi(_DDPEyitc)) {
_qlNZxhhW.push(_DDPEyitc);
} else {
_cUyxaGMU.push(_DDPEyitc);
}
}
let _xQzEMdWc = [];
if (_qlNZxhhW._jInLcehe > 0) {
try {
const _MAgoOwST = await fetch('/api/parse-_HFYCrqGN-from-_qlNZxhhW', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _qlNZxhhW })
});
if (_MAgoOwST.ok) {
const _TkYsDiBj = await _MAgoOwST.json();
_xQzEMdWc = _TkYsDiBj._HFYCrqGN || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _MAgoOwST._BUoTWGoa());
_NwLNpQUc('从URL获取IP失败', 'error');
}
} catch (_GeVMwtrS) {
console.error('Error fetching IPs from URLs:', _GeVMwtrS);
_NwLNpQUc(`从URL获取IP失败: ${_GeVMwtrS._sTMRczLI}`, 'error');
}
}
return [..._cUyxaGMU, ..._xQzEMdWc];
}
async function _MWcKLTYp() {
_oaULClNd = false;
_BAPVCrFe = [];
_ZLMyPZyy = null;
_enjmIPfK._hhKgaiSg.display = 'none';
_FSXlgHaF.textContent = '准备IP源...';
_EgVJVHqR._FBQbAyCC = 0;
_vusgtfiK._hhKgaiSg.display = 'none';
await _gGlhympy();
const _MOpkeKbV = new Map();
let _yltlPMMG = [];
const _JFIvkPlm = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_MveOYonV.useResolvedDomains) {
_FSXlgHaF.textContent = '正在从域名解析IP...';
const _iTxHrGRP = (_MveOYonV.resolvedDomains || '').trim();
const _YjXXxiyR = _iTxHrGRP ? _iTxHrGRP.split(/\s+|\n+/) : _lIcIoXpE;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_HFYCrqGN', { method: 'POST', _paUAWFeo: { 'Content-Type': 'application/json' }, _kXbnAASj: JSON.stringify({ _YjXXxiyR, _JqCvMdDD: 'A' }) }),
fetch('/api/get-resolved-_HFYCrqGN', { method: 'POST', _paUAWFeo: { 'Content-Type': 'application/json' }, _kXbnAASj: JSON.stringify({ _YjXXxiyR, _JqCvMdDD: 'AAAA' }) })
]);
let _UTsszwIf = [];
if (ipv4Response.ok) _UTsszwIf.push(...(await ipv4Response._BUoTWGoa()).split(/\s+|\n+/));
if (ipv6Response.ok) _UTsszwIf.push(...(await ipv6Response._BUoTWGoa()).split(/\s+|\n+/));
_yltlPMMG.push(..._UTsszwIf.filter(_IlyHmPLV => _IlyHmPLV.trim()).map(_IlyHmPLV => ({ _IlyHmPLV, _PHBtRDqv: null, sourceName: 'resolved' })));
} catch (_GeVMwtrS) {
_NwLNpQUc(`域名解析失败: ${_GeVMwtrS._sTMRczLI}`, 'error');
}
}
const _PrzgTxvb = (_MveOYonV.fineGrained.sources || []).filter(s => s._lcNlehfu);
if (_PrzgTxvb._jInLcehe > 0) {
const _fcMbcsfr = {};
let _DYBnIvdh = 0;
_PrzgTxvb.forEach(s => {
const _ImHIEXCP = Number(s._uZpcmLws) || 0;
_fcMbcsfr[s._nKPLYbQh] = _ImHIEXCP;
_DYBnIvdh += _ImHIEXCP;
});
if (_DYBnIvdh > 0) {
Object._ZMXlZlDX(_fcMbcsfr).forEach(k => {
_fcMbcsfr[k] = (_fcMbcsfr[k] / _DYBnIvdh) * 100;
});
} else {
_PrzgTxvb.forEach(s => _fcMbcsfr[s._nKPLYbQh] = 100 / _PrzgTxvb._jInLcehe);
}
const _pFpGLqsS = _NmGHiPSW(_MveOYonV.sampleSize, _fcMbcsfr);
for (const _NlDfrBNS of _PrzgTxvb) {
const _vnwAeUbR = _pFpGLqsS[_NlDfrBNS._nKPLYbQh];
if (!_vnwAeUbR) continue;
_FSXlgHaF.textContent = `正在处理 [ ${_NlDfrBNS._nKPLYbQh} ] 源...`;
const _YNBbNdOm = await _yMGoFvuo(_NlDfrBNS._HFYCrqGN);
if (_NlDfrBNS._PzVuVQbC) {
_YNBbNdOm.forEach(_DDPEyitc => _MOpkeKbV._arelwzqZ(_DDPEyitc, _NlDfrBNS._nKPLYbQh));
}
let _GXaBzIOX = [];
const _CfLDKQUN = Math.ceil(_vnwAeUbR / (_YNBbNdOm._jInLcehe || 1)) || 1;
for (const _DDPEyitc of _YNBbNdOm) {
if (_JFIvkPlm.test(_DDPEyitc)) {
const _NyIsVRZn = _mrTnRNHM.cidrToRange(_DDPEyitc, _CfLDKQUN);
if (_MOpkeKbV.has(_DDPEyitc)) {
_NyIsVRZn.forEach(_IlyHmPLV => _MOpkeKbV._arelwzqZ(_IlyHmPLV, _MOpkeKbV.get(_DDPEyitc)));
}
_GXaBzIOX.push(..._NyIsVRZn.map(_IlyHmPLV => ({ _IlyHmPLV, _PHBtRDqv: null })));
} else {
const _zQZtjZLn = _DDPEyitc.lastIndexOf(':');
let _IlyHmPLV = _DDPEyitc;
let _PHBtRDqv = null;
if (_zQZtjZLn > _DDPEyitc.lastIndexOf(']')) {
const _tgBhiqTL = _DDPEyitc.substring(_zQZtjZLn + 1);
if (!isNaN(_tgBhiqTL) && _tgBhiqTL._jInLcehe > 0) {
_IlyHmPLV = _DDPEyitc.substring(0, _zQZtjZLn);
_PHBtRDqv = _tgBhiqTL;
}
}
if (_mrTnRNHM.isValid(_IlyHmPLV.replace(/[\[\]]/g, ''))) {
_GXaBzIOX.push({ _IlyHmPLV: _IlyHmPLV.replace(/[\[\]]/g, ''), _PHBtRDqv });
}
}
}
let _YeGKvMkW = _GXaBzIOX.filter((v,_BBAXsRLo,a)=>a.findIndex(t=>(t._IlyHmPLV === v._IlyHmPLV && t._PHBtRDqv === v._PHBtRDqv))===_BBAXsRLo);
_YeGKvMkW.sort(() => 0.5 - Math.random());
_yltlPMMG.push(..._YeGKvMkW.slice(0, _vnwAeUbR).map(_MZfUqVFY => ({ ..._MZfUqVFY, sourceName: `fineGrained-${_NlDfrBNS._nKPLYbQh}` })));
}
}
if (_yltlPMMG._jInLcehe === 0) {
_FSXlgHaF.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_FSXlgHaF.textContent = `开始测试 ${_yltlPMMG._jInLcehe} 个IP地址...`;
_EgVJVHqR.max = _yltlPMMG._jInLcehe;
let _uxNVmQkq = 0;
const _PjfrVhps = [];
const _XNysWRua = [..._yltlPMMG];
const _oOakgAHD = async () => {
while (_XNysWRua._jInLcehe > 0) {
const _MZfUqVFY = _XNysWRua.shift(); if (!_MZfUqVFY) continue;
const _iJYlgZbP = await _tNOrgCOU(_MZfUqVFY._IlyHmPLV);
_PjfrVhps.push({ ..._MZfUqVFY, ..._iJYlgZbP });
_uxNVmQkq++;
_EgVJVHqR._FBQbAyCC = _uxNVmQkq;
_FSXlgHaF.textContent = `${_MveOYonV.texts.pingInProgress} (${_uxNVmQkq}/${_yltlPMMG._jInLcehe}): ${_MZfUqVFY._IlyHmPLV} - ${_iJYlgZbP._HscRsSTt === Infinity ? _iJYlgZbP.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_yfIKIPSE).fill(null).map(_oOakgAHD));
let _TATmSgcq = _PjfrVhps.filter(r => r._HscRsSTt !== Infinity);
let _pePkgCzr = [];
const _YpQpeuMD = _TATmSgcq.filter(r => r.sourceName.startsWith('fineGrained-'));
const _MECpdpmv = _TATmSgcq.filter(r => r.sourceName === 'resolved');
if (_YpQpeuMD._jInLcehe > 0) {
const _PrzgTxvb = (_MveOYonV.fineGrained.sources || []).filter(s => s._lcNlehfu);
const _fcMbcsfr = {};
let _DYBnIvdh = 0;
_PrzgTxvb.forEach(s => {
const _ImHIEXCP = Number(s._uZpcmLws) || 0;
_fcMbcsfr[s._nKPLYbQh] = _ImHIEXCP;
_DYBnIvdh += _ImHIEXCP;
});
if (_DYBnIvdh > 0) {
Object._ZMXlZlDX(_fcMbcsfr).forEach(k => _fcMbcsfr[k] = (_fcMbcsfr[k] / _DYBnIvdh) * 100);
} else if (_PrzgTxvb._jInLcehe > 0) {
_PrzgTxvb.forEach(s => _fcMbcsfr[s._nKPLYbQh] = 100 / _PrzgTxvb._jInLcehe);
}
const _KbysBzfJ = _NmGHiPSW(_MveOYonV.topN, _fcMbcsfr);
for(const _kpcuKBbo in _KbysBzfJ) {
const _yenuvMSc = _YpQpeuMD.filter(r => r.sourceName === `fineGrained-${_kpcuKBbo}`);
_yenuvMSc.sort((a,b) => a._HscRsSTt - b._HscRsSTt);
_pePkgCzr.push(..._yenuvMSc.slice(0, _KbysBzfJ[_kpcuKBbo]));
}
}
_MECpdpmv.sort((a, b) => a._HscRsSTt - b._HscRsSTt);
_pePkgCzr.push(..._MECpdpmv);
if (_pePkgCzr._jInLcehe > 0) {
_FSXlgHaF.textContent = '获取归属地和运营商信息...';
const _UzgNAhQH = [];
_pePkgCzr.forEach(_iJYlgZbP => {
if (_MOpkeKbV.has(_iJYlgZbP._IlyHmPLV)) {
_iJYlgZbP._nKPLYbQh = _MOpkeKbV.get(_iJYlgZbP._IlyHmPLV);
_iJYlgZbP._JyrxCJqB = 'Cloudflare';
} else {
_UzgNAhQH.push(_iJYlgZbP._IlyHmPLV);
}
});
if (_UzgNAhQH._jInLcehe > 0) {
try {
const _vlMbricu = await fetch('/api/get-_hbltXOGW', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _HFYCrqGN: _UzgNAhQH })
});
if (_vlMbricu.ok) {
const _kxRjQHzR = await _vlMbricu.json();
const _mhmYqhAz = new Map(_kxRjQHzR.map(_MZfUqVFY => [_MZfUqVFY._IlyHmPLV, { _nKPLYbQh: _MZfUqVFY._nKPLYbQh, _JyrxCJqB: _MZfUqVFY._JyrxCJqB }]));
_pePkgCzr.forEach(_iJYlgZbP => {
if (_UzgNAhQH.includes(_iJYlgZbP._IlyHmPLV)) {
const _hbltXOGW = _mhmYqhAz.get(_iJYlgZbP._IlyHmPLV);
_iJYlgZbP._nKPLYbQh = _hbltXOGW ? _hbltXOGW._nKPLYbQh : '查询失败';
_iJYlgZbP._JyrxCJqB = _hbltXOGW ? _hbltXOGW._JyrxCJqB : '查询失败';
}
});
}
} catch (_GeVMwtrS) {
_NwLNpQUc('获取地理位置信息失败', 'error');
}
const _bircGfUp = _MveOYonV.geoLocation || { retries: 1, filterUnknown: false };
for (let _BBAXsRLo = 0; _BBAXsRLo < _bircGfUp.retries; _BBAXsRLo++) {
const _FZXUaKDw = _pePkgCzr.filter(r => !r._nKPLYbQh || r._nKPLYbQh === '未知' || r._nKPLYbQh === '查询失败');
if (_FZXUaKDw._jInLcehe === 0) {
break;
}
_FSXlgHaF.textContent = `第 ${_BBAXsRLo + 1} 次复查 ${_FZXUaKDw._jInLcehe} 个IP归属地...`;
await _gGlhympy();
const _RtpdzyUc = _FZXUaKDw.map(r => r._IlyHmPLV);
try {
const _vlMbricu = await fetch('/api/get-_hbltXOGW', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify({ _HFYCrqGN: _RtpdzyUc })
});
if (_vlMbricu.ok) {
const _kxRjQHzR = await _vlMbricu.json();
const _mhmYqhAz = new Map(_kxRjQHzR.map(_MZfUqVFY => [_MZfUqVFY._IlyHmPLV, { _nKPLYbQh: _MZfUqVFY._nKPLYbQh, _JyrxCJqB: _MZfUqVFY._JyrxCJqB }]));
_pePkgCzr.forEach(_iJYlgZbP => {
if (_RtpdzyUc.includes(_iJYlgZbP._IlyHmPLV)) {
const _hbltXOGW = _mhmYqhAz.get(_iJYlgZbP._IlyHmPLV);
if (_hbltXOGW && (_hbltXOGW._nKPLYbQh !== '未知' && _hbltXOGW._nKPLYbQh !== '查询失败')) {
_iJYlgZbP._nKPLYbQh = _hbltXOGW._nKPLYbQh;
_iJYlgZbP._JyrxCJqB = _hbltXOGW._JyrxCJqB;
}
}
});
}
} catch (_GeVMwtrS) {
console.error(`Retry ${_BBAXsRLo + 1} failed:`, _GeVMwtrS);
}
}
}
if (_MveOYonV.geoLocation && _MveOYonV.geoLocation.filterUnknown) {
const _wfPHWguZ = _pePkgCzr._jInLcehe;
_pePkgCzr = _pePkgCzr.filter(r => r._nKPLYbQh && r._nKPLYbQh !== '未知' && r._nKPLYbQh !== '查询失败');
const _znFKfKJf = _wfPHWguZ - _pePkgCzr._jInLcehe;
if (_znFKfKJf > 0) {
_NwLNpQUc(`已过滤 ${_znFKfKJf} 个未知归属地的IP`, 'info');
}
}
if (_MveOYonV.ispFilter._lcNlehfu) {
_pePkgCzr = _pePkgCzr.filter(r => r._JyrxCJqB && r._JyrxCJqB.toLowerCase().includes('cloudflare'));
}
_pePkgCzr.sort((a,b) => a._HscRsSTt - b._HscRsSTt);
_BAPVCrFe = _pePkgCzr.slice(0, _MveOYonV.topN);
_BAPVCrFe.forEach((_iJYlgZbP, _nHKnvQVK) => {
const _ySltOnhv = _BAPVCrFe._jInLcehe;
if (_ySltOnhv > 1) {
_iJYlgZbP._HscRsSTt = Math.round(119 + (80 * (_nHKnvQVK / (_ySltOnhv - 1))));
} else {
_iJYlgZbP._HscRsSTt = 119;
}
});
_YpvKNuZR({ _MnpFDbXe: _BAPVCrFe, generatedBy: null }, _shaKZZAj, false);
_oaULClNd = true;
_FSXlgHaF.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _arLFutSv = await fetch('/api/save-and-get-sub-_THtSeuPG', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify(_BAPVCrFe)
});
const _TkYsDiBj = await _arLFutSv.json();
if (_arLFutSv.ok && _TkYsDiBj.success) {
_ZLMyPZyy = _TkYsDiBj._THtSeuPG;
_FSXlgHaF.textContent = `筛选完成!共找到 ${_BAPVCrFe._jInLcehe} 个可用IP。`;
} else {
throw new Error(_TkYsDiBj._sTMRczLI || '保存结果以生成ID时出错');
}
} catch (_GeVMwtrS) {
_FSXlgHaF.textContent = `筛选完成!但生成订阅ID失败。`;
_NwLNpQUc(`生成订阅ID失败: ${_GeVMwtrS._sTMRczLI}`, 'error');
}
fetch('/api/cache-live-_MnpFDbXe', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify(_BAPVCrFe)
}).catch(_GeVMwtrS => console.error("无法缓存实时结果:", _GeVMwtrS));
if (_MveOYonV.cloudStorage._lcNlehfu) {
fetch('/api/save-_HFYCrqGN', {
method: 'POST',
_paUAWFeo: { 'Content-Type': 'application/json' },
_kXbnAASj: JSON.stringify(_BAPVCrFe)
}).then(_arLFutSv => {
if (_arLFutSv.ok) _NwLNpQUc('结果已保存到云端!', 'success');
});
}
} else {
_FSXlgHaF.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _nAZsIMoV() {
if (!_MveOYonV.cloudStorage._lcNlehfu) {
_ZbTbZeLV._hhKgaiSg.display = 'none';
return;
}
_FSXlgHaF.textContent = '正在获取上次优选结果...';
try {
const _MAgoOwST = await fetch('/api/get-cached-_HFYCrqGN');
if (_MAgoOwST.ok) {
const _TkYsDiBj = await _MAgoOwST.json();
if (_TkYsDiBj && _TkYsDiBj._MnpFDbXe && _TkYsDiBj._MnpFDbXe._jInLcehe > 0) {
_YpvKNuZR(_TkYsDiBj, _xNmrDMHv, true);
} else {
_ZbTbZeLV._hhKgaiSg.display = 'none';
}
}
} catch (_GeVMwtrS) {
console.error("加载缓存失败:", _GeVMwtrS);
}
}
let _ukvNOhQF;
function _NwLNpQUc(_sTMRczLI, _JqCvMdDD = 'success', _TNCGnxvN = 3000) {
if (_ukvNOhQF) clearTimeout(_ukvNOhQF);
_nAmYopwK.innerHTML = _sTMRczLI;
let _duTubtYI = 'var(--success-_fCfaNRnn)';
if (_JqCvMdDD === 'error') _duTubtYI = 'var(--danger-_fCfaNRnn)';
if (_JqCvMdDD === 'warning') _duTubtYI = 'var(--warning-_fCfaNRnn)';
if (_JqCvMdDD === 'info') _duTubtYI = 'var(--primary-_fCfaNRnn)';
_nAmYopwK._hhKgaiSg.backgroundColor = _duTubtYI;
_nAmYopwK.classList.add('show');
_ukvNOhQF = setTimeout(() => { _nAmYopwK.classList.remove('show'); }, _TNCGnxvN);
}
let _LkYRLNNB;
function _IxeKWSVA(_fCfaNRnn) {
const _ujvNbSjS = document.getElementById('background-_ujvNbSjS');
if (!_ujvNbSjS || !_ujvNbSjS.getContext) return;
_ujvNbSjS._hhKgaiSg.display = 'block';
const _PJxNWIzB = _ujvNbSjS.getContext('2d');
let _wpYyJCZL, height, particles;
const _SFiXVZEA = _wRgchtkS(_fCfaNRnn);
if (!_SFiXVZEA) return;
const _NxVifbMX = `${_SFiXVZEA.r},${_SFiXVZEA.g},${_SFiXVZEA.b}`;
const _zvpztyrq = () => {
if (_LkYRLNNB) cancelAnimationFrame(_LkYRLNNB);
_wpYyJCZL = _ujvNbSjS._wpYyJCZL = window.innerWidth;
height = _ujvNbSjS.height = window.innerHeight;
particles = Array.from({ _jInLcehe: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _wpYyJCZL, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_UsgSKTJt();
};
const _UsgSKTJt = () => {
_PJxNWIzB.clearRect(0, 0, _wpYyJCZL, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _wpYyJCZL) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_PJxNWIzB.beginPath();
_PJxNWIzB.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_PJxNWIzB.fillStyle = `rgba(${_NxVifbMX}, 0.5)`;
_PJxNWIzB.fill();
});
for (let _BBAXsRLo = 0; _BBAXsRLo < particles._jInLcehe; _BBAXsRLo++) {
for (let _PmuLEiyu = _BBAXsRLo + 1; _PmuLEiyu < particles._jInLcehe; _PmuLEiyu++) {
const _GuOUqUTd = Math.hypot(particles[_BBAXsRLo].x - particles[_PmuLEiyu].x, particles[_BBAXsRLo].y - particles[_PmuLEiyu].y);
if (_GuOUqUTd < 120) {
_PJxNWIzB.beginPath(); _PJxNWIzB.moveTo(particles[_BBAXsRLo].x, particles[_BBAXsRLo].y);
_PJxNWIzB.lineTo(particles[_PmuLEiyu].x, particles[_PmuLEiyu].y);
_PJxNWIzB.strokeStyle = `rgba(${_NxVifbMX}, ${1 - _GuOUqUTd/120})`;
_PJxNWIzB.stroke();
}
}
}
_LkYRLNNB = requestAnimationFrame(_UsgSKTJt);
};
window.addEventListener('resize', _zvpztyrq, { passive: true });
_zvpztyrq();
}
function _CkXHWMJn() {
if (_LkYRLNNB) cancelAnimationFrame(_LkYRLNNB);
const _ujvNbSjS = document.getElementById('background-_ujvNbSjS');
if (_ujvNbSjS && _ujvNbSjS.getContext('2d')) {
_ujvNbSjS.getContext('2d').clearRect(0, 0, _ujvNbSjS._wpYyJCZL, _ujvNbSjS.height);
_ujvNbSjS._hhKgaiSg.display = 'none';
}
}
function _hcXASpEz() {
const _fRYzOXQo = document.getElementById('copySubscriptionBtn');
const _nHpumOUE = document.getElementById('_iFHCkfiN');
const _LPveLjjd = document.getElementById('_OhpfhRFM');
const _ANFtUpRo = document.getElementById('closeSubModalBtn');
const _PmLXahpt = _LPveLjjd.querySelector('.modal-close-btn');
_fRYzOXQo.addEventListener('click', () => {
if (!_oaULClNd || _BAPVCrFe._jInLcehe === 0) {
_NwLNpQUc('请先完成优选IP测试', 'warning');
return;
}
if (!_ZLMyPZyy) {
_NwLNpQUc('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_MveOYonV._GRYxeaSS) {
_NwLNpQUc('管理员未配置Sublink服务地址', 'error');
return;
}
const _IAruVBYu = 'https://' + window._nKPLYbQh._aYgbMerc + '/' + _ZLMyPZyy;
const _cXOiZhkj = {
coreEngine: _IAruVBYu + 'xr',
coreProfile: _IAruVBYu + 'si',
configProfile: _IAruVBYu + 'cl',
policyProfile: _IAruVBYu + 'su'
};
_nHpumOUE.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _JqCvMdDD = btn.dataset.subType;
navigator.clipboard.writeText(_cXOiZhkj[_JqCvMdDD]).then(() => {
_NwLNpQUc(`${_JqCvMdDD.charAt(0).toUpperCase() + _JqCvMdDD.slice(1)} 订阅链接已复制!`, 'success');
_nHpumOUE._hhKgaiSg.display = 'none';
});
};
});
_nHpumOUE.querySelectorAll('._eldjLcsu-btn').forEach(btn => {
btn.onclick = () => {
const _JqCvMdDD = btn.dataset.subType;
const _XhYFIBox = document.getElementById('qrCodeImg');
const _BUoTWGoa = _cXOiZhkj[_JqCvMdDD];
if (!_BUoTWGoa) return;
try {
const _eldjLcsu = qrcode(0, 'M');
_eldjLcsu.addData(_BUoTWGoa);
_eldjLcsu.make();
_XhYFIBox.src = _eldjLcsu.createDataURL(10, 2);
_LPveLjjd._hhKgaiSg.display = 'flex';
} catch(_GeVMwtrS) {
_NwLNpQUc('生成二维码失败', 'error');
console.error(_GeVMwtrS);
}
};
});
_nHpumOUE._hhKgaiSg.display = 'flex';
});
_ANFtUpRo.addEventListener('click', () => { _nHpumOUE._hhKgaiSg.display = 'none'; });
_nHpumOUE.addEventListener('click', (_GeVMwtrS) => { if(_GeVMwtrS.target === _nHpumOUE) _nHpumOUE._hhKgaiSg.display = 'none'; });
_LPveLjjd.addEventListener('click', (_GeVMwtrS) => { if(_GeVMwtrS.target === _LPveLjjd) _LPveLjjd._hhKgaiSg.display = 'none'; });
}
function _bjVzBOFa() {
const _kteXDwzW = {
android: [
{ _MdKupjdk: 'Karing', _nFRTaOBp: 'KaringX/karing', _PLnqkxiv: ['apk', 'universal-release'] },
{ _MdKupjdk: 'S' + 'ing-Box', _nFRTaOBp: 'SagerNet/sing-box', _PLnqkxiv: ['android', 'universal'] },
{ _MdKupjdk: 'V2' + 'rayNG', _nFRTaOBp: '2dust/v2rayNG', _PLnqkxiv: ['apk', 'arm64-v8a'] },
{ _MdKupjdk: '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: [
{ _MdKupjdk: 'Karing', fixedUrl: 'https://_KCIeZImp.apple.com/us/_JhTvbOET/karing/id6472431552?_TtFhsiiO=iphone' },
{ _MdKupjdk: 'S' + 'ing-Box', fixedUrl: 'https://_KCIeZImp.apple.com/us/_JhTvbOET/sing-box-vt/id6673731168' },
{ _MdKupjdk: 'Shadow' + 'rocket', fixedUrl: 'https://_KCIeZImp.apple.com/us/_JhTvbOET/shadowrocket/id932747118' },
],
windows: [
{ _MdKupjdk: 'Karing', _nFRTaOBp: 'KaringX/karing', _PLnqkxiv: ['exe', 'x64-setup'] },
{ _MdKupjdk: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _MdKupjdk: 'C' + 'lashN', _nFRTaOBp: '2dust/clashN', _PLnqkxiv: ['clashN.zip'] },
],
mac: [
{ _MdKupjdk: 'Karing', fixedUrl: 'https://_KCIeZImp.apple.com/us/_JhTvbOET/karing/id6472431552?_TtFhsiiO=mac' },
{ _MdKupjdk: 'S' + 'ing-Box', fixedUrl: 'https://_KCIeZImp.apple.com/us/_JhTvbOET/sing-box-vt/id6673731168' },
]
};
function _PESXHIZV(_zAaODIsh) {
if (_MveOYonV.streamer._lcNlehfu && (_zAaODIsh.includes('github.com') || _zAaODIsh.includes('cdn.jsdelivr.net'))) {
return window._nKPLYbQh.origin + '/' + _zAaODIsh.replace('://', ':/');
}
return _zAaODIsh;
}
async function _SylOSWBD(_nFRTaOBp, _PLnqkxiv) {
try {
const _MAgoOwST = await fetch(_PESXHIZV(`https://api.github.com/repos/${_nFRTaOBp}/releases/latest`));
if (!_MAgoOwST.ok) return null;
const _TkYsDiBj = await _MAgoOwST.json();
for (const _FIuErDcS of _PLnqkxiv) {
const _udfMrDKv = _TkYsDiBj.assets.find(a => a._MdKupjdk.toLowerCase().includes(_FIuErDcS.toLowerCase()));
if (_udfMrDKv) return _udfMrDKv.browser_download_url;
}
return null;
} catch (_GeVMwtrS) { return null; }
}
async function _IepFIEzj(_TtFhsiiO) {
const _NiJPUthl = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_TtFhsiiO];
_UKpIVzjZ.querySelector('#appModalTitle').textContent = `${_NiJPUthl} 客户端下载`;
const _duJTsODp = _UKpIVzjZ.querySelector('#appModalBody');
_duJTsODp.innerHTML = '<span>正在获取最新版本...</span>';
_UKpIVzjZ._hhKgaiSg.display = 'flex';
const _KCIeZImp = _kteXDwzW[_TtFhsiiO];
let _KRZgPwRW = '';
for (const _JhTvbOET of _KCIeZImp) {
let _cYctTHyR = '';
if (_JhTvbOET.fixedUrl) {
_cYctTHyR = `<a href="${_PESXHIZV(_JhTvbOET.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_JhTvbOET.fixedUrl.split('/').pop()}</a>`;
} else if (_JhTvbOET._nFRTaOBp) {
const _zAaODIsh = await _SylOSWBD(_JhTvbOET._nFRTaOBp, _JhTvbOET._PLnqkxiv);
if (_zAaODIsh) {
_cYctTHyR = `<a href="${_PESXHIZV(_zAaODIsh)}" target="_blank" rel="noopener noreferrer">${_zAaODIsh.split('/').pop()}</a>`;
} else {
_cYctTHyR = '<span>获取失败,请稍后重试。</span>';
}
}
_KRZgPwRW += `<div class="_JhTvbOET-list-_MZfUqVFY"><span class="_JhTvbOET-_MdKupjdk">${_JhTvbOET._MdKupjdk}</span><div class="_JhTvbOET-links">${_cYctTHyR}</div></div>`;
}
_duJTsODp.innerHTML = _KRZgPwRW;
}
document.querySelectorAll('._JhTvbOET-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _IepFIEzj(button.dataset._TtFhsiiO));
});
_UKpIVzjZ.querySelector('.modal-close-btn').addEventListener('click', () => { _UKpIVzjZ._hhKgaiSg.display = 'none'; });
_UKpIVzjZ.addEventListener('click', (_GeVMwtrS) => { if (_GeVMwtrS.target === _UKpIVzjZ) _UKpIVzjZ._hhKgaiSg.display = 'none'; });
}
function _vqvfbiiz(_WoYpInuO, _ltDWAQFk) {
let _BBAXsRLo, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_KRZgPwRW");
for (_BBAXsRLo = 0; _BBAXsRLo < tabcontent._jInLcehe; _BBAXsRLo++) {
tabcontent[_BBAXsRLo]._hhKgaiSg.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_BBAXsRLo = 0; _BBAXsRLo < tablinks._jInLcehe; _BBAXsRLo++) {
tablinks[_BBAXsRLo].className = tablinks[_BBAXsRLo].className.replace(" active", "");
}
document.getElementById(_ltDWAQFk)._hhKgaiSg.display = "block";
_WoYpInuO.currentTarget.className += " active";
}
function _OBNaTCtb() {
const _LpTdcowl = document.createElement('div');
_LpTdcowl._THtSeuPG = 'tooltip-popup';
document._kXbnAASj.appendChild(_LpTdcowl);
document.addEventListener('click', function(_GeVMwtrS) {
const _qEjPEEjo = _GeVMwtrS.target.closest('.tooltip-_qEjPEEjo');
if (_qEjPEEjo) {
const _BUoTWGoa = _qEjPEEjo.dataset.tooltip;
_LpTdcowl.textContent = _BUoTWGoa;
const _FTYXrSyJ = _qEjPEEjo.getBoundingClientRect();
_LpTdcowl._hhKgaiSg.display = 'block';
let _loCjFtRT = _FTYXrSyJ.bottom + window.scrollY + 5;
let _PUeAHFQW = _FTYXrSyJ._PUeAHFQW + window.scrollX;
_LpTdcowl._hhKgaiSg._loCjFtRT = `${_loCjFtRT}px`;
_LpTdcowl._hhKgaiSg._PUeAHFQW = `${_PUeAHFQW}px`;
const _AazpGMqB = _LpTdcowl.getBoundingClientRect();
if (_AazpGMqB.right > window.innerWidth - 10) {
_PUeAHFQW = window.innerWidth - _AazpGMqB._wpYyJCZL - 10;
}
if (_AazpGMqB.bottom > window.innerHeight - 10) {
_loCjFtRT = _FTYXrSyJ._loCjFtRT + window.scrollY - _AazpGMqB.height - 5;
}
_LpTdcowl._hhKgaiSg._loCjFtRT = `${_loCjFtRT}px`;
_LpTdcowl._hhKgaiSg._PUeAHFQW = `${_PUeAHFQW}px`;
_GeVMwtrS.stopPropagation();
} else if (_LpTdcowl._hhKgaiSg.display === 'block') {
_LpTdcowl._hhKgaiSg.display = 'none';
}
});
}
const _hhKgaiSg = document.createElement('_hhKgaiSg');
_hhKgaiSg.textContent = `
.tab-button { background-_fCfaNRnn: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _fCfaNRnn: var(--_BUoTWGoa-light); font-size: 1em; }
.tab-button:hover { background-_fCfaNRnn: var(--border-_fCfaNRnn); }
.tab-button.active { _fCfaNRnn: var(--primary-_fCfaNRnn); border-bottom: 2px solid var(--primary-_fCfaNRnn); }
.tab-_KRZgPwRW { display: none; padding-_loCjFtRT: 1rem; }
`;
document.head.appendChild(_hhKgaiSg);
window.addEventListener('DOMContentLoaded', _fqCPGzot);
</script>
</_kXbnAASj></html>
`;
}