import { connect } from "cloudflare:sockets";
const _iFdGEeaZ = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _iaQuHPAf = ["UpstreamAddress.SG.CMLiussss.net"];
const _TTRhwOij = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _AOETHDgr = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _ZLRAsWyD = '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 _OglJOydh = '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 _AIMIiNxW(_ViCRDXVJ) {
if (Array.isArray(_ViCRDXVJ)) {
try {
return String.fromCharCode.apply(null, _ViCRDXVJ);
} catch (_ihmuSeCY) {
return '';
}
}
return _ViCRDXVJ;
}
function _YZSrRPYG(_gedYxsnY) {
return /^[0-9a-_JcuyzAlQ]{8}-[0-9a-_JcuyzAlQ]{4}-[4][0-9a-_JcuyzAlQ]{3}-[89ab][0-9a-_JcuyzAlQ]{3}-[0-9a-_JcuyzAlQ]{12}$/_RDVGkaJL.test(_gedYxsnY);
}
const _wSfXNkDJ = "optimized_ips_v4";
const _kLESIyLC = "global_config_v4";
const _CJESRqLT = "admin_password_v4";
const _dpArclTu = "live_results_temp_v1";
const _lOPfSdhp = "latest_sub_id_v1";
export default {
async fetch(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy) {
try {
if (!_NpFrVTwp.DB) {
const _GJjpeakv = _isZMdHZT("D1 数据库 'DB' 未绑定。");
return new Response(_GJjpeakv, { status: 503, _MrXrayUD: { 'Content-Type': '_yFIhxubJ/html;_SkLfcbIT=UTF-8' }});
}
_QVduIjIy.waitUntil(
_NpFrVTwp.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_tIEdrzZp TEXT PRIMARY KEY, _ViCRDXVJ TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_gedYxsnY TEXT PRIMARY KEY, _FuHKZKqH TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_ihmuSeCY => console.error("DB Init Error:", _ihmuSeCY._xvLdNrRt))
);
const _WBxWsLce = new URL(_IBwPYiHZ._WBxWsLce);
const _ecEuGPbn = _WBxWsLce.pathname;
const _WoiMTZNT = _IBwPYiHZ._MrXrayUD.get("Upgrade");
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (_WESbZvhD.websocketStreamer && _WESbZvhD.websocketStreamer._zcoVhPvl && _WoiMTZNT && _WoiMTZNT.toLowerCase() === "websocket") {
const _IInLivxs = _WESbZvhD.websocketStreamer._WBxWsLce;
if (_IInLivxs && _IInLivxs.trim().startsWith('https://')) {
try {
const _XbmoXuGE = new Request(_IInLivxs.trim() + _WBxWsLce.pathname + _WBxWsLce.search, _IBwPYiHZ);
return await fetch(_XbmoXuGE);
} catch (_ihmuSeCY) {
return new Response(`Upstream WebSocket gateway failed: ${_ihmuSeCY._xvLdNrRt}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_WoiMTZNT && _WoiMTZNT.toLowerCase() === "websocket") {
return await _QUdrtnnk(_IBwPYiHZ, _NpFrVTwp, _WESbZvhD);
}
const _xUHGMjWx = _ecEuGPbn._ASvajhUl(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_xUHGMjWx) {
const [, _eDvJUKfQ, typeSuffix] = _xUHGMjWx;
const _TjMQLPgJ = _WESbZvhD._TjMQLPgJ;
if (!_TjMQLPgJ || _TjMQLPgJ.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' } });
}
const _MkCGdbkR = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _iOjmFqOs = _MkCGdbkR[typeSuffix];
const _glaBxBHB = _TjMQLPgJ.replace(/\/$/, '');
const _rHWiFnjI = `${_WBxWsLce.origin}/${_eDvJUKfQ}`;
const _MPNEttfh = `${_glaBxBHB}/${_iOjmFqOs}?_WESbZvhD=${encodeURIComponent(_rHWiFnjI)}`;
try {
const _xexFmcGJ = await fetch(_MPNEttfh, { _MrXrayUD: { 'User-Agent': _IBwPYiHZ._MrXrayUD.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _OPoVYhoV = new Headers(_xexFmcGJ._MrXrayUD);
_OPoVYhoV._iKCOXGYB('Access-Control-Allow-Origin', '*');
return new Response(_xexFmcGJ._NASaRBLJ, { status: _xexFmcGJ.status, statusText: _xexFmcGJ.statusText, _MrXrayUD: _OPoVYhoV });
} catch (_ihmuSeCY) {
return new Response(`获取上游订阅失败: ${_ihmuSeCY._xvLdNrRt}`, { status: 502, _MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' } });
}
}
if (_ecEuGPbn.startsWith('/https:/') || _ecEuGPbn.startsWith('/http:/')) {
return _jBzbqYaP(_IBwPYiHZ, _WESbZvhD);
}
if (_WESbZvhD.customSubPath && _WESbZvhD.customSubPath._zcoVhPvl && _WESbZvhD.customSubPath._ecEuGPbn && _ecEuGPbn === '/' + _WESbZvhD.customSubPath._ecEuGPbn.trim()) {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_lOPfSdhp);
const { _GrnHmtMN } = await _UcbNYIiZ.all();
const _YRCVwVMV = _GrnHmtMN._VzbZAVZK > 0 ? _GrnHmtMN[0]._ViCRDXVJ : null;
if (_YRCVwVMV) {
return _mSoolgnj({ _kMRrqHSO: { _gedYxsnY: _YRCVwVMV }, _WBxWsLce: _IBwPYiHZ._WBxWsLce }, _NpFrVTwp);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' } });
}
}
const _NEJojCXr = _ecEuGPbn.split('/').filter(Boolean);
if (_NEJojCXr._VzbZAVZK === 1 && !_ecEuGPbn.startsWith('/api/')) {
const _eDvJUKfQ = _NEJojCXr[0];
return _mSoolgnj({ _kMRrqHSO: { _gedYxsnY: _eDvJUKfQ }, _WBxWsLce: _IBwPYiHZ._WBxWsLce }, _NpFrVTwp);
}
if (_ecEuGPbn.startsWith('/api/')) {
if (_ecEuGPbn === '/api/_WESbZvhD' && _IBwPYiHZ.method === 'POST') return _tTFRUNyq(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy);
if (_ecEuGPbn === '/api/_iKCOXGYB-_xWIkKCUl') return _aqkhjtOT(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/change-_xWIkKCUl') return _rrNPmhph(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/verify-_xWIkKCUl') return _RQjhciBX(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/verify-visitor-_xWIkKCUl' && _IBwPYiHZ.method === 'POST') return _xwymbMix(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/cache-live-_GrnHmtMN' && _IBwPYiHZ.method === 'POST') return _QTtnvdLw(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy);
if (_ecEuGPbn === '/api/get-_eKVKtJiq' && _IBwPYiHZ.method === 'POST') return _iFZoadbD(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/get-cached-_nqXlZVuN') return _sFqrubnB(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/save-_nqXlZVuN') return _KIeZwktn(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy);
if (_ecEuGPbn === '/api/save-and-get-sub-_gedYxsnY' && _IBwPYiHZ.method === 'POST') return _VnmwJXnF(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn.startsWith('/api/get-_SwOdWjTA/')) {
const _eDvJUKfQ = _ecEuGPbn.split('/').pop();
return _mSoolgnj({ _kMRrqHSO: { _gedYxsnY: _eDvJUKfQ }, _WBxWsLce: _IBwPYiHZ._WBxWsLce }, _NpFrVTwp);
}
if (_ecEuGPbn === '/api/_WESbZvhD' && _IBwPYiHZ.method === 'GET') return _EouRSPJV(_NpFrVTwp);
if (_ecEuGPbn === '/api/get-resolved-_nqXlZVuN') return _lPuIgsSm(_IBwPYiHZ);
if (_ecEuGPbn === '/api/parse-_nqXlZVuN-from-_fQAJXsdJ' && _IBwPYiHZ.method === 'POST') return _JcVYvDGH(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/endpoints') return _CgRxlhwi(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_ecEuGPbn === '/_TWWqORpV') return _cidQbyQz(_IBwPYiHZ, _NpFrVTwp);
if (_ecEuGPbn === '/bing-wallpaper') return _aQxThBAW();
return _lwWpPfJF(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy);
} catch (err) {
let _ihmuSeCY = err;
return new Response(_ihmuSeCY.toString(), { status: 500 });
}
}
};
const _KRsCpOzY = { 'Accept': '_yFIhxubJ/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 _xrUnxpTJ(_WBxWsLce, _wtKSdUHE) {
const _EzGySWMr = await fetch(_WBxWsLce, { _MrXrayUD: { ..._KRsCpOzY, 'Referer': _wtKSdUHE.referer } });
if (_EzGySWMr.ok) return _EzGySWMr._yFIhxubJ();
return null;
}
async function _dhBzSAHx(_WBxWsLce, _wtKSdUHE) {
const _gWpDDVqR = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_WBxWsLce)}`;
const _EzGySWMr = await fetch(_gWpDDVqR, { _MrXrayUD: { ..._KRsCpOzY, 'Referer': _wtKSdUHE.referer } });
if (!_EzGySWMr.ok) return null;
const _NASaRBLJ = await _EzGySWMr._yFIhxubJ();
const _ASvajhUl = _NASaRBLJ._ASvajhUl(/<pre[^>]*>([\s\S]*?)<\/pre>/_RDVGkaJL);
return _ASvajhUl && _ASvajhUl[1] ? _ASvajhUl[1].replace(/&/g, '&') : null;
}
function _IBJPRQMQ(_ynhHhReX) {
let _FVdcgpGd;
try {
_FVdcgpGd = atob(_ynhHhReX.replace(/\s/g, ''));
} catch (_ihmuSeCY) {
_FVdcgpGd = _ynhHhReX;
}
const _SwOdWjTA = _FVdcgpGd.split(/[\s\n\r,]+/).filter(line => line.trim());
const _KGGBYVoA = new Set();
const _QLeosVJr = /@([^?#]+?):(\d+)/;
for (const _mFmEUQft of _SwOdWjTA) {
let _ojguLzTW = '';
let _XxjBwSyN = '';
try {
if (_mFmEUQft.startsWith('vmess://')) {
const _jjJmnBHz = atob(_mFmEUQft.substring(8));
const _WESbZvhD = JSON.parse(_jjJmnBHz);
_ojguLzTW = _WESbZvhD.add;
_XxjBwSyN = _WESbZvhD._XxjBwSyN;
} else {
const _ASvajhUl = _mFmEUQft._ASvajhUl(_QLeosVJr);
if (_ASvajhUl && _ASvajhUl[1] && _ASvajhUl[2]) {
_ojguLzTW = _ASvajhUl[1].replace(/[\[\]]/g, '');
_XxjBwSyN = _ASvajhUl[2];
}
}
} catch (_ihmuSeCY) {
console.warn(`Could not parse _mFmEUQft: ${_mFmEUQft}`);
}
if (_ojguLzTW && _XxjBwSyN) {
_KGGBYVoA.add(`${_ojguLzTW}:${_XxjBwSyN}`);
}
}
return Array.from(_KGGBYVoA);
}
async function _eBXphmXZ(_WcfkZEBj) {
try {
const _EzGySWMr = await fetch(_WcfkZEBj, { _MrXrayUD: _KRsCpOzY });
if (!_EzGySWMr.ok) {
console.error(`Failed to fetch subscription: ${_EzGySWMr.status}`);
return [];
}
const _ynhHhReX = await _EzGySWMr._yFIhxubJ();
return _IBJPRQMQ(_ynhHhReX);
} catch (error) {
console.error(`Error processing subscription ${_WcfkZEBj}:`, error);
return [];
}
}
async function _SIpdgMkK(_wVUcSFFC) {
const _uUnLCVzA = _wVUcSFFC.trim();
const _ytvmItPs = /^(vless|vmess|trojan|ss):\/\//.test(_uUnLCVzA);
const _yFouwbpJ = (() => {
if (_uUnLCVzA._VzbZAVZK < 20 || _uUnLCVzA.startsWith('http')) return false;
const _SgDZAwli = _uUnLCVzA.replace(/\s/g, '');
if (_SgDZAwli._VzbZAVZK % 4 !== 0 && !_SgDZAwli.includes('=')) return false;
try {
atob(_SgDZAwli);
return true;
} catch (_ihmuSeCY) {
return false;
}
})();
if (_ytvmItPs || _yFouwbpJ) {
return _IBJPRQMQ(_uUnLCVzA).join('\n');
}
const _YnrekWWU = [
'https://ipdb.api.030101.xyz/?_qjyBtKtl=bestcf&_MIgfldEK=true',
'https://ipdb.api.030101.xyz/?_qjyBtKtl=bestproxy&_MIgfldEK=true'
];
const _WUcjSusR = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_RDVGkaJL.test(_wVUcSFFC) || _wVUcSFFC.includes('?_ixKozrHV=');
if (_WUcjSusR) {
const _nqXlZVuN = await _eBXphmXZ(_wVUcSFFC);
return _nqXlZVuN.join('\n');
}
let _ynhHhReX = '';
if (_YnrekWWU.includes(_wVUcSFFC)) {
_ynhHhReX = await _xrUnxpTJ(_wVUcSFFC, { referer: _wVUcSFFC });
if (!_ynhHhReX || _ynhHhReX._VzbZAVZK < 8) {
_ynhHhReX = await _dhBzSAHx(_wVUcSFFC, { referer: _wVUcSFFC });
}
} else {
try {
const _jBSzwJRA = await fetch(_wVUcSFFC, { _MrXrayUD: { 'User-Agent': 'Cloudflare-Worker' } });
if (_jBSzwJRA.ok) {
_ynhHhReX = await _jBSzwJRA._yFIhxubJ();
} else {
console.warn(`Failed to fetch URL ${_wVUcSFFC}: ${_jBSzwJRA.status}`);
}
} catch (_ihmuSeCY) {
console.error(`Error fetching URL ${_wVUcSFFC}:`, _ihmuSeCY);
}
}
const _csEcGNDl = _IBJPRQMQ(_ynhHhReX);
if (_csEcGNDl._VzbZAVZK > 0) {
return _csEcGNDl.join('\n');
}
return _ynhHhReX || '';
}
async function _jBzbqYaP(_IBwPYiHZ, _WESbZvhD) {
if (!_WESbZvhD.streamer._zcoVhPvl) {
return new Response('远程流功能未开启', { status: 403 });
}
const _WBxWsLce = new URL(_IBwPYiHZ._WBxWsLce);
const _ciuxCVly = _WBxWsLce.pathname.substring(1).replace(':/', '://');
try {
const _MPNEttfh = new URL(_ciuxCVly);
const _PwaeVZZc = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_PwaeVZZc.some(domain => _MPNEttfh._ojguLzTW.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _pKaIpuMl = new Headers(_IBwPYiHZ._MrXrayUD);
_pKaIpuMl._iKCOXGYB('Host', _MPNEttfh._ojguLzTW);
_pKaIpuMl._iKCOXGYB('User-Agent', 'CF-Worker-Streamer/1.0');
const _VCOKudjp = await fetch(_MPNEttfh.toString(), {
method: _IBwPYiHZ.method,
_MrXrayUD: _pKaIpuMl,
_NASaRBLJ: _IBwPYiHZ._NASaRBLJ,
});
const _OPoVYhoV = new Headers(_VCOKudjp._MrXrayUD);
_OPoVYhoV._iKCOXGYB('Access-Control-Allow-Origin', '*');
_OPoVYhoV._iKCOXGYB('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_OPoVYhoV._iKCOXGYB('Access-Control-Allow-Headers', '*');
_OPoVYhoV._iKCOXGYB('Cache-Control', 'public, max-age=86400');
_OPoVYhoV._iKCOXGYB('X-Streamer-Source', 'CF-Worker');
_OPoVYhoV.delete('_ynhHhReX-security-policy');
_OPoVYhoV.delete('x-_ynhHhReX-security-policy');
_OPoVYhoV.delete('x-webkit-csp');
return new Response(_VCOKudjp._NASaRBLJ, {
status: _VCOKudjp.status,
statusText: _VCOKudjp.statusText,
_MrXrayUD: _OPoVYhoV,
});
} catch (_ihmuSeCY) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _QUdrtnnk(_IBwPYiHZ, _NpFrVTwp, _WESbZvhD) {
try {
const _LEIiahyw = _WESbZvhD || await _PJeUPFiM(_NpFrVTwp);
const _EIIDjKEW = (_LEIiahyw.itemLink._XNgbBXOm && _LEIiahyw.itemLink._XNgbBXOm[0]) || {};
const _sdywnNpG = _EIIDjKEW['_ixKozrHV'] || _AIMIiNxW(_iFdGEeaZ);
if (!_YZSrRPYG(_sdywnNpG)) {
throw new Error("Configured user _njAcVkxY is not valid.");
}
const _rAPsYNjC = _LEIiahyw.dataFeeds.universalFallbackAddress;
let _CObJFSIj = {};
const _TJSRapnp = _AIMIiNxW(_iaQuHPAf[0] || "");
if (_rAPsYNjC) {
const [_iChlzsDV, _XxjBwSyN = '443'] = _rAPsYNjC.split(':');
_CObJFSIj = { _iChlzsDV, _XxjBwSyN };
} else {
const [_iChlzsDV, _XxjBwSyN = '443'] = _TJSRapnp.split(':');
_CObJFSIj = { _iChlzsDV, _XxjBwSyN };
}
const _WBxWsLce = new URL(_IBwPYiHZ._WBxWsLce);
const _ecEuGPbn = _WBxWsLce.pathname;
let _jwchphVi = '';
const _TfmUeHaO = _WBxWsLce.searchParams.get('remote');
if (_TfmUeHaO) {
_jwchphVi = atob(_TfmUeHaO);
} else if (_ecEuGPbn.startsWith('/endpoint=')) {
_jwchphVi = _ecEuGPbn.substring(10);
} else if (_ecEuGPbn._VzbZAVZK > 1 && _ecEuGPbn.substring(1).includes('.')) {
_jwchphVi = _ecEuGPbn.substring(1);
}
if (_jwchphVi) {
const [_iChlzsDV, _XxjBwSyN = '443'] = _jwchphVi.split(':');
_CObJFSIj = { _iChlzsDV, _XxjBwSyN };
}
return await _FzJuEQPi(_IBwPYiHZ, _sdywnNpG, _CObJFSIj);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _FzJuEQPi(_IBwPYiHZ, _njAcVkxY, _CObJFSIj) {
const _unMksmFr = new WebSocketPair();
const [clientEnd, _EADnTjkl] = Object.values(_unMksmFr);
_EADnTjkl.accept();
let _TAzxVNYa = { _afjHtITU: null };
const _NUgLrtLa = _IBwPYiHZ._MrXrayUD.get("sec-websocket-protocol") || "";
const _cCNfxgcE = _vkgBeAhA(_EADnTjkl, _NUgLrtLa);
_cCNfxgcE.pipeTo(new WritableStream({
async write(chunk) {
if (_TAzxVNYa._afjHtITU) {
const _zPgnnaXg = _TAzxVNYa._afjHtITU.writable.getWriter();
await _zPgnnaXg.write(chunk);
_zPgnnaXg.releaseLock();
return;
}
const { error, details } = await _IaZYvXUY(chunk, _njAcVkxY);
if (error) {
throw new Error(details);
}
const _JfhxQzBb = new Uint8Array([details._jThpRSUd[0], 0]);
const _HMuVYbFz = chunk.slice(details.payloadIndex);
await _LMpSMAel(_TAzxVNYa, details._GvFOnIlB, details._GzOqsMah, _HMuVYbFz, _EADnTjkl, _JfhxQzBb, _CObJFSIj);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_jBPrxDsr(_EADnTjkl);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _LMpSMAel(_TAzxVNYa, _GvFOnIlB, _GzOqsMah, _pICESJob, _XPIxByVk, _JfhxQzBb, _ucdJnAXN) {
const _lGYHSLHi = async (_iChlzsDV, _XxjBwSyN) => {
let _mRMyAapL = _iChlzsDV;
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(_iChlzsDV)) {
_mRMyAapL = `${atob('d3d3Lg==')}${_iChlzsDV}${atob('LnNzbGlwLmlv')}`;
}
const _afjHtITU = connect({ _ojguLzTW: _mRMyAapL, _XxjBwSyN });
_TAzxVNYa._afjHtITU = _afjHtITU;
const _zPgnnaXg = _afjHtITU.writable.getWriter();
await _zPgnnaXg.write(_pICESJob);
_zPgnnaXg.releaseLock();
return _afjHtITU;
};
const _tywarmNw = async () => {
if (!_ucdJnAXN._iChlzsDV) return;
console.log(`Direct connection failed, falling back to gateway: ${_ucdJnAXN._iChlzsDV}`);
const _kNfwFqKP = await _lGYHSLHi(_ucdJnAXN._iChlzsDV, parseInt(_ucdJnAXN._XxjBwSyN, 10));
_kNfwFqKP.closed.catch(() => {}).finally(() => _jBPrxDsr(_XPIxByVk));
_wIFhBNuj(_kNfwFqKP, _XPIxByVk, _JfhxQzBb, null);
};
try {
const _RNaLZjUZ = await _lGYHSLHi(_GvFOnIlB, _GzOqsMah);
_wIFhBNuj(_RNaLZjUZ, _XPIxByVk, _JfhxQzBb, _tywarmNw);
} catch (err) {
console.error("Primary connection failed:", err);
await _tywarmNw();
}
}
function _vkgBeAhA(_EADnTjkl, _NUgLrtLa) {
let _NyeqhRjv = false;
return new ReadableStream({
start(_HJhpepxf) {
_EADnTjkl.addEventListener("_xvLdNrRt", (event) => { if (_NyeqhRjv) return; _HJhpepxf.enqueue(event._FuHKZKqH); });
_EADnTjkl.addEventListener("close", () => { _jBPrxDsr(_EADnTjkl); if (_NyeqhRjv) return; _HJhpepxf.close(); });
_EADnTjkl.addEventListener("error", (err) => _HJhpepxf.error(err));
if (_NUgLrtLa) {
try {
const _ueIArxDF = atob(_NUgLrtLa.replace(/-/g, "+").replace(/_/g, "/"));
_HJhpepxf.enqueue(Uint8Array.from(_ueIArxDF, c => c.charCodeAt(0))._uzmNohIp);
} catch (_ihmuSeCY) { console.error("Failed to decode early _FuHKZKqH:", _ihmuSeCY); }
}
},
cancel() { _NyeqhRjv = true; _jBPrxDsr(_EADnTjkl); },
});
}
async function _IaZYvXUY(_uzmNohIp, _njAcVkxY) {
if (_uzmNohIp.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _jThpRSUd = new Uint8Array(_uzmNohIp.slice(0, 1));
const _nLXKaFlt = _dGkhVOhA(new Uint8Array(_uzmNohIp.slice(1, 17)));
if (_nLXKaFlt !== _njAcVkxY) return { error: true, details: "Invalid _njAcVkxY" };
const _PBQkSTFS = new Uint8Array(_uzmNohIp.slice(17, 18))[0];
const _ddXihasf = new Uint8Array(_uzmNohIp.slice(18 + _PBQkSTFS, 19 + _PBQkSTFS))[0];
if (_ddXihasf !== 1) return { error: true, details: `Unsupported _ddXihasf: ${_ddXihasf}` };
const _btnOdSoU = 19 + _PBQkSTFS;
const _GzOqsMah = new DataView(_uzmNohIp.slice(_btnOdSoU, _btnOdSoU + 2)).getUint16(0);
let _fhhPAuMd = _btnOdSoU + 2;
const _eojLUmal = new Uint8Array(_uzmNohIp.slice(_fhhPAuMd, _fhhPAuMd + 1))[0];
let _PlbrmGYt = 0;
let _hLaVhpMg = _fhhPAuMd + 1;
let _GvFOnIlB = "";
switch (_eojLUmal) {
case 1: _PlbrmGYt = 4; _GvFOnIlB = new Uint8Array(_uzmNohIp.slice(_hLaVhpMg, _hLaVhpMg + _PlbrmGYt)).join("."); break;
case 2: _PlbrmGYt = new Uint8Array(_uzmNohIp.slice(_hLaVhpMg, _hLaVhpMg + 1))[0]; _hLaVhpMg++; _GvFOnIlB = new TextDecoder().decode(_uzmNohIp.slice(_hLaVhpMg, _hLaVhpMg + _PlbrmGYt)); break;
case 3: _PlbrmGYt = 16; const _blPDeXIj = new DataView(_uzmNohIp.slice(_hLaVhpMg, _hLaVhpMg + _PlbrmGYt)); const _wVjnTXYM = []; for (let _RDVGkaJL = 0; _RDVGkaJL < 8; _RDVGkaJL++) _wVjnTXYM.push(_blPDeXIj.getUint16(_RDVGkaJL * 2).toString(16)); _GvFOnIlB = _wVjnTXYM.join(":"); break;
default: return { error: true, details: `Invalid _UhfYSNaq _qjyBtKtl: ${_eojLUmal}` };
}
if (!_GvFOnIlB) return { error: true, details: "Target _iChlzsDV is empty" };
return { error: false, details: { _GvFOnIlB, _GzOqsMah, _jThpRSUd, payloadIndex: _hLaVhpMg + _PlbrmGYt } };
}
async function _wIFhBNuj(_afjHtITU, _XPIxByVk, _ekwPpFZY, _BxamvSRq) {
let _nkhGzOSd = _ekwPpFZY;
let _XazQrYpD = false;
let _PCFKnBSI = _afjHtITU._cCNfxgcE.pipeTo(new WritableStream({
write(chunk) {
_XazQrYpD = true;
if (_XPIxByVk.readyState !== 1) throw new Error("Channel is not open");
if (_nkhGzOSd) {
const _hKTfwEOP = new Uint8Array(_nkhGzOSd.byteLength + chunk.byteLength);
_hKTfwEOP._iKCOXGYB(new Uint8Array(_nkhGzOSd));
_hKTfwEOP._iKCOXGYB(new Uint8Array(chunk), _nkhGzOSd.byteLength);
_XPIxByVk.send(_hKTfwEOP._uzmNohIp);
_nkhGzOSd = null;
} else {
_XPIxByVk.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _XPIxByVk error:", err._xvLdNrRt);
});
await _PCFKnBSI;
if (!_XazQrYpD && _BxamvSRq) {
_BxamvSRq();
}
}
function _jBPrxDsr(_XPIxByVk) {
try { if (_XPIxByVk.readyState === 1 || _XPIxByVk.readyState === 2) _XPIxByVk.close(); } catch (_ihmuSeCY) {}
}
const _CynmBqTO = Array.from({ _VzbZAVZK: 256 }, (_, _RDVGkaJL) => (_RDVGkaJL + 256).toString(16).slice(1));
function _dGkhVOhA(_yckAWJtT, offset = 0) {
return (
_CynmBqTO[_yckAWJtT[offset]] + _CynmBqTO[_yckAWJtT[offset + 1]] + _CynmBqTO[_yckAWJtT[offset + 2]] + _CynmBqTO[_yckAWJtT[offset + 3]] + "-" +
_CynmBqTO[_yckAWJtT[offset + 4]] + _CynmBqTO[_yckAWJtT[offset + 5]] + "-" +
_CynmBqTO[_yckAWJtT[offset + 6]] + _CynmBqTO[_yckAWJtT[offset + 7]] + "-" +
_CynmBqTO[_yckAWJtT[offset + 8]] + _CynmBqTO[_yckAWJtT[offset + 9]] + "-" +
_CynmBqTO[_yckAWJtT[offset + 10]] + _CynmBqTO[_yckAWJtT[offset + 11]] +
_CynmBqTO[_yckAWJtT[offset + 12]] + _CynmBqTO[_yckAWJtT[offset + 13]] +
_CynmBqTO[_yckAWJtT[offset + 14]] + _CynmBqTO[_yckAWJtT[offset + 15]]
).toLowerCase();
}
let _lwvfbGIM = { "N/A":"未知" };
async function _rUaPuELN(_WBxWsLce, _QQMIkLuM, _BxamvSRq) {
try {
const _EzGySWMr = await fetch(_WBxWsLce, {
_MrXrayUD: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_EzGySWMr.ok) {
console.error(`获取 ${_WBxWsLce} 失败: HTTP ${_EzGySWMr.status}`);
return _BxamvSRq;
}
const _yFIhxubJ = await _EzGySWMr._yFIhxubJ();
return _QQMIkLuM(_yFIhxubJ);
} catch (error) {
console.error(`获取或解析 ${_WBxWsLce} 时发生网络错误: ${error._xvLdNrRt}`);
return _BxamvSRq;
}
}
function _hVNxCsuc(_yFIhxubJ) {
if (!_yFIhxubJ) return [];
const _IZLwrDvI = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _tbAaqnZs = _yFIhxubJ.split(/[\s,;#|]+/);
const _gFxrqQQR = [];
for (const _USTPlWnc of _tbAaqnZs) {
const _HwIHlwkJ = _USTPlWnc.trim();
if (!_HwIHlwkJ) continue;
const _EVNMuTfw = _HwIHlwkJ.lastIndexOf(':');
let _sjmtSVGi = _HwIHlwkJ;
if(_EVNMuTfw > _HwIHlwkJ.lastIndexOf(']')) {
const _nkaAutrI = _HwIHlwkJ.substring(_EVNMuTfw + 1);
if(!isNaN(_nkaAutrI) && _nkaAutrI._VzbZAVZK > 0) {
_sjmtSVGi = _HwIHlwkJ.substring(0, _EVNMuTfw);
}
}
if (_LKaCMoPc.isValid(_sjmtSVGi.replace(/[\[\]]/g, '')) || _IZLwrDvI.test(_HwIHlwkJ)) {
_gFxrqQQR.push(_HwIHlwkJ);
}
}
return _gFxrqQQR;
}
function _rWbWyRTu(_yFIhxubJ) {
if (!_yFIhxubJ) return [];
return _yFIhxubJ.split(/\s+/).filter(d => d.trim() !== '');
}
function _VVuDoAtK(_yFIhxubJ) {
if (!_yFIhxubJ) return { "N/A": "未知" };
try {
return JSON.parse(`{${_yFIhxubJ}}`);
} catch (_ihmuSeCY) {
console.error("解析 _lwvfbGIM 失败:", _ihmuSeCY);
return { "N/A": "未知" };
}
}
const _LKaCMoPc = {
isValid: (_TWWqORpV) => _LKaCMoPc.isIPv4(_TWWqORpV) || _LKaCMoPc.isIPv6(_TWWqORpV),
isIPv4: (_TWWqORpV) => {
if (typeof _TWWqORpV !== 'string') return false;
const _wVjnTXYM = _TWWqORpV.split('.');
if (_wVjnTXYM._VzbZAVZK !== 4) return false;
return _wVjnTXYM.every(_HYPQOPlm => {
const _QiKenenr = parseInt(_HYPQOPlm, 10);
return !isNaN(_QiKenenr) && _QiKenenr >= 0 && _QiKenenr <= 255 && String(_QiKenenr) === _HYPQOPlm;
});
},
isIPv6: (_TWWqORpV) => {
if (typeof _TWWqORpV !== '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]))$/_RDVGkaJL.test(_TWWqORpV);
},
toLong4: (_TWWqORpV) => _TWWqORpV.split('.').reduce((acc, octet, _RDVGkaJL) => acc + (parseInt(octet) << (8*(3-_RDVGkaJL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TWWqORpV) => {
try {
const _NaDoXOmO = _TWWqORpV.split('/')[0];
const _wVjnTXYM = _NaDoXOmO.split('::');
if (_wVjnTXYM._VzbZAVZK > 2) return 0n;
let _gMYbgDUu = [];
if (_wVjnTXYM[0]) {
_gMYbgDUu = _wVjnTXYM[0].split(':');
}
let _RhVtVppY = [];
if (_wVjnTXYM._VzbZAVZK > 1 && _wVjnTXYM[1]) {
_RhVtVppY = _wVjnTXYM[1].split(':');
}
if (_gMYbgDUu._VzbZAVZK + _RhVtVppY._VzbZAVZK > 8) return 0n;
const _asBNBYDX = 8 - (_gMYbgDUu._VzbZAVZK + _RhVtVppY._VzbZAVZK);
const _TxGDUohS = [
..._gMYbgDUu,
...Array(_asBNBYDX).fill('0'),
..._RhVtVppY
].map(_HYPQOPlm => _HYPQOPlm || '0');
while(_TxGDUohS._VzbZAVZK < 8) {
_TxGDUohS.push('0');
}
let _diKBHgid = 0n;
for (const _HYPQOPlm of _TxGDUohS) {
if (_HYPQOPlm._VzbZAVZK > 4) return 0n;
const _ViCRDXVJ = BigInt('0x' + _HYPQOPlm);
_diKBHgid = (_diKBHgid << 16n) | _ViCRDXVJ;
}
return _diKBHgid;
} catch(_ihmuSeCY) {
return 0n;
}
},
fromBigInt6: (_diKBHgid) => {
if (typeof _diKBHgid !== '_diKBHgid' || _diKBHgid < 0n) return null;
const _wVjnTXYM = [];
for (let _RDVGkaJL = 0; _RDVGkaJL < 8; _RDVGkaJL++) {
_wVjnTXYM.unshift((_diKBHgid & 0xFFFFn).toString(16));
_diKBHgid >>= 16n;
}
let _LvfUpoBZ = { start: -1, _fXmAWuSR: 0 };
let _HmiRPNfm = { start: -1, _fXmAWuSR: 0 };
for (let _RDVGkaJL = 0; _RDVGkaJL < 8; _RDVGkaJL++) {
if (_wVjnTXYM[_RDVGkaJL] === '0') {
if (_HmiRPNfm.start === -1) _HmiRPNfm.start = _RDVGkaJL;
_HmiRPNfm._fXmAWuSR++;
} else {
if (_HmiRPNfm._fXmAWuSR > _LvfUpoBZ._fXmAWuSR) _LvfUpoBZ = { ..._HmiRPNfm };
_HmiRPNfm = { start: -1, _fXmAWuSR: 0 };
}
}
if (_HmiRPNfm._fXmAWuSR > _LvfUpoBZ._fXmAWuSR) _LvfUpoBZ = { ..._HmiRPNfm };
if (_LvfUpoBZ._fXmAWuSR > 1) {
_wVjnTXYM.splice(_LvfUpoBZ.start, _LvfUpoBZ._fXmAWuSR, '');
if (_LvfUpoBZ.start === 0) _wVjnTXYM.unshift('');
if (_LvfUpoBZ.start + _LvfUpoBZ._fXmAWuSR === 8) _wVjnTXYM.push('');
}
return _wVjnTXYM.join(':');
},
cidrToRange: (cidr, _oDHXXlXP = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _XTwMEOGY = parseInt(bitsStr, 10);
const _nqXlZVuN = new Set();
if (_LKaCMoPc.isIPv4(range)) {
if (isNaN(_XTwMEOGY) || _XTwMEOGY < 8 || _XTwMEOGY > 32) return [];
if (_XTwMEOGY === 32) return [range];
const _KlFxzaBT = _LKaCMoPc.toLong4(range);
const _dWaKkJmc = (0xFFFFFFFF << (32 - _XTwMEOGY)) >>> 0;
const _MZhuTCvy = _KlFxzaBT & _dWaKkJmc;
const _HQtDphOq = 1 << (32 - _XTwMEOGY);
if (_HQtDphOq <= 2) return [];
const _JfCqwvPl = Math.min(_oDHXXlXP, _HQtDphOq - 2);
let _NjTWdIpb = 0;
while (_nqXlZVuN.size < _JfCqwvPl && _NjTWdIpb < _JfCqwvPl * 5) {
const _DcpysUnQ = Math.floor(Math.random() * (_HQtDphOq - 2)) + 1;
_nqXlZVuN.add(_LKaCMoPc.fromLong4((_MZhuTCvy + _DcpysUnQ) >>> 0));
_NjTWdIpb++;
}
return Array.from(_nqXlZVuN);
} else if (_LKaCMoPc.isIPv6(range)) {
if (isNaN(_XTwMEOGY) || _XTwMEOGY < 16 || _XTwMEOGY > 128) return [];
if (_XTwMEOGY === 128) return [range];
const _qCwxUTID = _LKaCMoPc.toBigInt6(range);
const _dWaKkJmc = (2n ** BigInt(128 - _XTwMEOGY) - 1n);
const _MZhuTCvy = _qCwxUTID & ~_dWaKkJmc;
const _XXzSnkDT = 2n ** BigInt(128 - _XTwMEOGY);
if (_XXzSnkDT <= 2n) return [];
let _NjTWdIpb = 0;
while (_nqXlZVuN.size < _oDHXXlXP && _NjTWdIpb < _oDHXXlXP * 5) {
const _RtIKbdhz = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_RtIKbdhz);
let _KgUNUeJs = 0n;
for (const _mvMflWpN of _RtIKbdhz) {
_KgUNUeJs = (_KgUNUeJs << 8n) | BigInt(_mvMflWpN);
}
const _DcpysUnQ = _KgUNUeJs % (_XXzSnkDT - 2n) + 1n;
_nqXlZVuN.add(_LKaCMoPc.fromBigInt6(_MZhuTCvy + _DcpysUnQ));
_NjTWdIpb++;
}
return Array.from(_nqXlZVuN);
}
return [];
} catch(_ihmuSeCY) {
console.error(`CIDR to range failed for ${cidr}:`, _ihmuSeCY);
return [];
}
}
};
function _lxkBtDQc(_HhjegAlJ, _zffTZiHy) {
const _lpOxZdOq = {};
const _olfhOsGb = Object._olfhOsGb(_zffTZiHy);
const _wVjnTXYM = _olfhOsGb.map(_tIEdrzZp => {
const _kkVuFefN = _HhjegAlJ * (_zffTZiHy[_tIEdrzZp] / 100);
return { _tIEdrzZp, _oDHXXlXP: Math.floor(_kkVuFefN), remainder: _kkVuFefN - Math.floor(_kkVuFefN) };
});
let _DVSZJSey = _wVjnTXYM.reduce((acc, _HYPQOPlm) => acc + _HYPQOPlm._oDHXXlXP, 0);
_wVjnTXYM.sort((a, b) => b.remainder - a.remainder);
let _YcCSbbXp = _HhjegAlJ - _DVSZJSey;
for (let _RDVGkaJL = 0; _RDVGkaJL < _YcCSbbXp; _RDVGkaJL++) {
_wVjnTXYM[_RDVGkaJL % _wVjnTXYM._VzbZAVZK]._oDHXXlXP++;
}
for (const _HYPQOPlm of _wVjnTXYM) {
_lpOxZdOq[_HYPQOPlm._tIEdrzZp] = _HYPQOPlm._oDHXXlXP;
}
return _lpOxZdOq;
}
async function _MbpiNMNB(_NpFrVTwp) {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_CJESRqLT);
const { _GrnHmtMN } = await _UcbNYIiZ.all();
return _GrnHmtMN._VzbZAVZK > 0 ? _GrnHmtMN[0]._ViCRDXVJ : null;
}
async function _lGIusIym(_NpFrVTwp, _xWIkKCUl) {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare(
"INSERT INTO kv_data (_tIEdrzZp, _ViCRDXVJ) VALUES (?, ?) ON CONFLICT(_tIEdrzZp) DO UPDATE SET _ViCRDXVJ = excluded._ViCRDXVJ"
);
await _UcbNYIiZ.bind(_CJESRqLT, _xWIkKCUl).run();
}
async function _RQjhciBX(_IBwPYiHZ, _NpFrVTwp) {
const { _xWIkKCUl } = await _IBwPYiHZ.json();
const _EKjcbvNq = await _MbpiNMNB(_NpFrVTwp);
if (_EKjcbvNq === _xWIkKCUl) {
return _AKvgcJAG({ success: true });
}
return _AKvgcJAG({ success: false, _xvLdNrRt: '密码错误' }, 401);
}
async function _xwymbMix(_IBwPYiHZ, _NpFrVTwp) {
const _zsHhIrGQ = await _PJeUPFiM(_NpFrVTwp);
if (!_zsHhIrGQ.visitorPassword || !_zsHhIrGQ.visitorPassword._zcoVhPvl) {
return _AKvgcJAG({ success: true });
}
try {
const { _xWIkKCUl } = await _IBwPYiHZ.json();
const _kSWLKexi = _zsHhIrGQ.visitorPassword._xWIkKCUl;
if (_kSWLKexi && _xWIkKCUl === _kSWLKexi) {
return _AKvgcJAG({ success: true });
}
return _AKvgcJAG({ success: false, _xvLdNrRt: '访客密码错误' }, 401);
} catch (_ihmuSeCY) {
return _AKvgcJAG({ success: false, _xvLdNrRt: '无效请求' }, 400);
}
}
async function _aqkhjtOT(_IBwPYiHZ, _NpFrVTwp) {
const _JVOPtgCk = await _MbpiNMNB(_NpFrVTwp);
if (_JVOPtgCk) {
return _AKvgcJAG({ success: false, _xvLdNrRt: "密码已设置,无法重复初始化。" }, 403);
}
const { _xWIkKCUl } = await _IBwPYiHZ.json();
if (!_xWIkKCUl || _xWIkKCUl._VzbZAVZK < 6) {
return _AKvgcJAG({ success: false, _xvLdNrRt: "密码长度不能少于6位。" }, 400);
}
await _lGIusIym(_NpFrVTwp, _xWIkKCUl);
return _AKvgcJAG({ success: true, _xvLdNrRt: "初始密码设置成功!请刷新页面并登录。" });
}
async function _rrNPmhph(_IBwPYiHZ, _NpFrVTwp) {
const { _nAkdMhfE, _OUmtQeRY } = await _IBwPYiHZ.json();
const _EKjcbvNq = await _MbpiNMNB(_NpFrVTwp);
if (_EKjcbvNq !== _nAkdMhfE) {
return _AKvgcJAG({ success: false, _xvLdNrRt: "旧密码错误。" }, 403);
}
if (!_OUmtQeRY || _OUmtQeRY._VzbZAVZK < 6) {
return _AKvgcJAG({ success: false, _xvLdNrRt: "新密码长度不能少于6位。" }, 400);
}
await _lGIusIym(_NpFrVTwp, _OUmtQeRY);
return _AKvgcJAG({ success: true, _xvLdNrRt: "密码修改成功!" });
}
function _cELaJQbT() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_TjMQLPgJ: '',
api: {
_zcoVhPvl: true,
_xvLdNrRt: '维护中...',
},
ispFilter: { _zcoVhPvl: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_zcoVhPvl: true
},
websocketStreamer: {
_zcoVhPvl: true,
_WBxWsLce: 'https://snippets.neib.cn'
},
cloudStorage: {
_zcoVhPvl: true
},
visitorPassword: {
_zcoVhPvl: false,
_xWIkKCUl: '',
},
customSubPath: {
_zcoVhPvl: false,
_ecEuGPbn: 'latest',
},
subscriptionId: {
_VzbZAVZK: 8,
_SkLfcbIT: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_zcoVhPvl: true,
template: 'vless://{_ixKozrHV}@{_TWWqORpV}:{_XxjBwSyN}?encryption=none&security=tls&sni={_iChlzsDV}&fp=random&_qjyBtKtl=ws&_iChlzsDV={_iChlzsDV}&_ecEuGPbn={_ecEuGPbn}#{_pHMeiQGu}',
selectionMode: 'first',
_XNgbBXOm: [
{ _pHMeiQGu: '默认配置', _iChlzsDV: '', '_ixKozrHV': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _ecEuGPbn: '/?ed=2560' }
],
_lWxPQvao: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_zcoVhPvl: false,
_yFIhxubJ: '',
_KqpJXWdB: 5
},
marquee: {
_zcoVhPvl: false,
_yFIhxubJ: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_zcoVhPvl: true,
sources: [
{ _qCXEEtLZ: 'CF官方IPV4', _nqXlZVuN: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 20 },
{ _qCXEEtLZ: 'CF官方IPV6', _nqXlZVuN: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 20 },
{ _qCXEEtLZ: '反代优选0', _nqXlZVuN: 'https://wvs.sosorg.nyc.mn/sub?_ixKozrHV=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_qjyBtKtl=ws&_iChlzsDV=ss.nzvrn.com&_ecEuGPbn=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 30 },
{ _qCXEEtLZ: '官方优选1', _nqXlZVuN: 'https://ipdb.api.030101.xyz/?_qjyBtKtl=bestcf&_MIgfldEK=true', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 10 },
{ _qCXEEtLZ: '反代优选2', _nqXlZVuN: 'https://ipdb.api.030101.xyz/?_qjyBtKtl=bestproxy&_MIgfldEK=true', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 5 },
{ _qCXEEtLZ: '官方优选2', _nqXlZVuN: 'https://addressesapi.090227.xyz/_TWWqORpV.164746.xyz', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 10 },
{ _qCXEEtLZ: '官方优选3', _nqXlZVuN: 'https://cfxr.eu.org/getSub?_iChlzsDV=snipaste.huggy.qzz.io', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 5 },
{ _qCXEEtLZ: '官方优选4', _nqXlZVuN: 'https://addressesapi.090227.xyz/CloudFlareYes', _jFDXHXry: false, _zcoVhPvl: true, _WjacPuaj: 10 }
]
},
customNodes: {
_zcoVhPvl: 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 _XahDeKfg(_RAYuznim, _YQEuFhpn) {
if (!_RAYuznim) return _YQEuFhpn;
const _RrpzQNBb = { ..._YQEuFhpn };
for (const _tIEdrzZp in _YQEuFhpn) {
if (_RAYuznim.hasOwnProperty(_tIEdrzZp)) {
if (typeof _RAYuznim[_tIEdrzZp] === 'object' && _RAYuznim[_tIEdrzZp] !== null && !Array.isArray(_RAYuznim[_tIEdrzZp]) && typeof _YQEuFhpn[_tIEdrzZp] === 'object' && _YQEuFhpn[_tIEdrzZp] !== null && !Array.isArray(_YQEuFhpn[_tIEdrzZp])) {
_RrpzQNBb[_tIEdrzZp] = _XahDeKfg(_RAYuznim[_tIEdrzZp], _YQEuFhpn[_tIEdrzZp]);
} else {
_RrpzQNBb[_tIEdrzZp] = _RAYuznim[_tIEdrzZp];
}
}
}
return _RrpzQNBb;
}
async function _PJeUPFiM(_NpFrVTwp) {
try {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_kLESIyLC);
const { _GrnHmtMN } = await _UcbNYIiZ.all();
const _hVGqmbwZ = _GrnHmtMN._VzbZAVZK > 0 ? _GrnHmtMN[0]._ViCRDXVJ : null;
const _mrLvDYHE = _hVGqmbwZ ? JSON.parse(_hVGqmbwZ) : {};
return _XahDeKfg(_mrLvDYHE, _cELaJQbT());
} catch (_ihmuSeCY) {
console.error("无法从D1获取或解析全局配置:", _ihmuSeCY);
return _cELaJQbT();
}
}
async function _EouRSPJV(_NpFrVTwp) {
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
return _AKvgcJAG(_WESbZvhD);
}
async function _tTFRUNyq(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy) {
try {
const { _WESbZvhD, adminPassword } = await _IBwPYiHZ.json();
const _EKjcbvNq = await _MbpiNMNB(_NpFrVTwp);
if (_EKjcbvNq !== adminPassword) {
return _AKvgcJAG({ success: false, _xvLdNrRt: "管理员密码错误" }, 403);
}
const _UcbNYIiZ = _NpFrVTwp.DB.prepare(
"INSERT INTO kv_data (_tIEdrzZp, _ViCRDXVJ) VALUES (?, ?) ON CONFLICT(_tIEdrzZp) DO UPDATE SET _ViCRDXVJ = excluded._ViCRDXVJ"
);
const _qwtPKYzN = _UcbNYIiZ.bind(_kLESIyLC, JSON.stringify(_WESbZvhD)).run();
_QVduIjIy.waitUntil(_qwtPKYzN);
return _AKvgcJAG({ success: true, _xvLdNrRt: "配置已成功保存!" });
} catch (_ihmuSeCY) {
return _AKvgcJAG({ success: false, _xvLdNrRt: `保存失败: ${_ihmuSeCY._xvLdNrRt}` }, 500);
}
}
async function _aQxThBAW() {
const _elTHtzwh = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _MNAdgjtV = await fetch(_elTHtzwh);
const _xxwcmhpE = await _MNAdgjtV.json();
const _PAEIMZPA = 'https://www.bing.com' + _xxwcmhpE.images[0]._WBxWsLce;
return fetch(_PAEIMZPA);
} catch (_ihmuSeCY) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _QuTWMRhU(_TWWqORpV) {
try {
const _EzGySWMr = await fetch(`http://_TWWqORpV-api.com/json/${_TWWqORpV}?fields=status,_MIgfldEK,countryCode,_TkczDSyy&lang=zh-CN`);
if (_EzGySWMr.ok) {
const _FuHKZKqH = await _EzGySWMr.json();
if (_FuHKZKqH.status === 'success' && (_FuHKZKqH.countryCode || _FuHKZKqH._MIgfldEK)) {
let _TkczDSyy = _FuHKZKqH._TkczDSyy || '未知';
if (_TkczDSyy.toLowerCase().includes('cloudflare')) {
_TkczDSyy = 'CloudFlare';
}
return {
_qCXEEtLZ: _lwvfbGIM[_FuHKZKqH.countryCode] || _FuHKZKqH._MIgfldEK || _FuHKZKqH.countryCode,
_TkczDSyy: _TkczDSyy
};
}
}
} catch (_ihmuSeCY) {}
try {
const _EzGySWMr = await fetch(`https://api._TWWqORpV.sb/geoip/${_TWWqORpV}`);
if (_EzGySWMr.ok) {
const _FuHKZKqH = await _EzGySWMr.json();
if (_FuHKZKqH.country_code || _FuHKZKqH._MIgfldEK) {
let _TkczDSyy = _FuHKZKqH._TkczDSyy || '未知';
if (_TkczDSyy.toLowerCase().includes('cloudflare')) {
_TkczDSyy = 'CloudFlare';
}
return {
_qCXEEtLZ: _lwvfbGIM[_FuHKZKqH.country_code] || _FuHKZKqH._MIgfldEK || _FuHKZKqH.country_code,
_TkczDSyy: _TkczDSyy
};
}
}
} catch (_ihmuSeCY) {}
return { _qCXEEtLZ: '未知', _TkczDSyy: '未知' };
}
async function _iFZoadbD(_IBwPYiHZ, _NpFrVTwp) {
try {
const { _nqXlZVuN } = await _IBwPYiHZ.json();
if (!Array.isArray(_nqXlZVuN)) {
return _AKvgcJAG({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _qwUkkQQj = _nqXlZVuN.map(_TWWqORpV => _QuTWMRhU(_TWWqORpV).then(_eKVKtJiq => ({ _TWWqORpV, ..._eKVKtJiq })));
const _GrnHmtMN = await Promise.all(_qwUkkQQj);
return _AKvgcJAG(_GrnHmtMN);
} catch (_ihmuSeCY) {
return _AKvgcJAG({ error: `获取地理位置失败: ${_ihmuSeCY._xvLdNrRt}` }, 500);
}
}
async function _sFqrubnB(_IBwPYiHZ, _NpFrVTwp) {
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (!_WESbZvhD.cloudStorage._zcoVhPvl) {
return _AKvgcJAG({ _GrnHmtMN: [], generatedBy: null });
}
try {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_wSfXNkDJ);
const { _GrnHmtMN } = await _UcbNYIiZ.all();
const _ZcsVYAcm = _GrnHmtMN._VzbZAVZK > 0 ? _GrnHmtMN[0]._ViCRDXVJ : null;
const _lTiekiDT = _ZcsVYAcm ? JSON.parse(_ZcsVYAcm) : null;
return _AKvgcJAG(_lTiekiDT || { _GrnHmtMN: [], generatedBy: null });
} catch (_ihmuSeCY) {
console.error("从D1读取缓存IP失败:", _ihmuSeCY);
return _AKvgcJAG({ _GrnHmtMN: [], generatedBy: null });
}
}
async function _KIeZwktn(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy) {
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (!_WESbZvhD.cloudStorage._zcoVhPvl) {
return _AKvgcJAG({ success: true, _xvLdNrRt: "云端存储已禁用,不保存结果。" });
}
const _HYPNxwlj = _IBwPYiHZ._MrXrayUD.get('CF-Connecting-IP') || "未知IP";
const _MIgfldEK = _IBwPYiHZ.cf?._MIgfldEK || "未知";
const _UvEcoFTI = _IBwPYiHZ.cf?._UvEcoFTI || "";
let _hZJfsJOb = _lwvfbGIM[_MIgfldEK] || _MIgfldEK;
if (_UvEcoFTI && _UvEcoFTI !== "未知城市" && _UvEcoFTI !== _MIgfldEK) _hZJfsJOb = `${_hZJfsJOb} ${_lwvfbGIM[_UvEcoFTI] || _UvEcoFTI}`;
const _SuUfIdyq = {
_TWWqORpV: _uZlxXVNQ(_HYPNxwlj),
_qCXEEtLZ: _hZJfsJOb.trim(),
time: _LyLJymBb()
};
try {
const _faMKuQah = await _IBwPYiHZ.json();
if (!Array.isArray(_faMKuQah)) return _AKvgcJAG({ error: "无效数据格式" }, 400);
const _ggPWJTiD = _faMKuQah.map(_aPXYmTPB => ({
_TWWqORpV: String(_aPXYmTPB._TWWqORpV || ''),
_XxjBwSyN: _aPXYmTPB._XxjBwSyN ? parseInt(_aPXYmTPB._XxjBwSyN, 10) : undefined,
_eqlxpEGw: parseInt(_aPXYmTPB._eqlxpEGw, 10),
_qCXEEtLZ: typeof _aPXYmTPB._qCXEEtLZ === 'string' ? _aPXYmTPB._qCXEEtLZ.substring(0, 50) : 'N/A',
_TkczDSyy: typeof _aPXYmTPB._TkczDSyy === 'string' ? _aPXYmTPB._TkczDSyy.substring(0, 100) : 'N/A'
}));
const _TBlrHTKq = {
generatedBy: _SuUfIdyq,
_GrnHmtMN: _ggPWJTiD
};
const _VeBkUrHm = _NpFrVTwp.DB.prepare(
"INSERT INTO kv_data (_tIEdrzZp, _ViCRDXVJ) VALUES (?, ?) ON CONFLICT(_tIEdrzZp) DO UPDATE SET _ViCRDXVJ = excluded._ViCRDXVJ"
).bind(_wSfXNkDJ, JSON.stringify(_TBlrHTKq)).run();
if (_WESbZvhD.telegram.bot_token && _WESbZvhD.telegram.chat_id) {
const _EmDnQiUz = _ggPWJTiD.map(r => `${r._TWWqORpV} ~ ${r._qCXEEtLZ}`).join('\n');
const _aDNvwjQV = `优选完成!\n来源: ${_SuUfIdyq._TWWqORpV} (${_SuUfIdyq._qCXEEtLZ})\n时间: ${_SuUfIdyq.time}\n\n结果:\n${_EmDnQiUz}`;
const _gvaXeIGr = `https://api.telegram.org/bot${_WESbZvhD.telegram.bot_token}/sendMessage?chat_id=${_WESbZvhD.telegram.chat_id}&_yFIhxubJ=${encodeURIComponent(_aDNvwjQV)}`;
const _CXudvYwR = fetch(_gvaXeIGr).catch(_ihmuSeCY => console.error("Telegram结果通知失败:", _ihmuSeCY));
_QVduIjIy.waitUntil(Promise.all([_VeBkUrHm, _CXudvYwR]));
} else {
_QVduIjIy.waitUntil(_VeBkUrHm);
}
return _AKvgcJAG({ success: true, _xvLdNrRt: "结果已保存" });
} catch (_ihmuSeCY) {
return _AKvgcJAG({ error: "D1写入失败", _xvLdNrRt: _ihmuSeCY._xvLdNrRt }, 500);
}
}
async function _QTtnvdLw(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy) {
try {
const _pvHBrONy = await _IBwPYiHZ.json();
if (!Array.isArray(_pvHBrONy)) return _AKvgcJAG({ error: "无效数据格式" }, 400);
const _TBlrHTKq = {
_GrnHmtMN: _pvHBrONy
};
const _UcbNYIiZ = _NpFrVTwp.DB.prepare(
"INSERT INTO kv_data (_tIEdrzZp, _ViCRDXVJ) VALUES (?, ?) ON CONFLICT(_tIEdrzZp) DO UPDATE SET _ViCRDXVJ = excluded._ViCRDXVJ"
);
const _qwtPKYzN = _UcbNYIiZ.bind(_dpArclTu, JSON.stringify(_TBlrHTKq)).run();
_QVduIjIy.waitUntil(_qwtPKYzN);
return _AKvgcJAG({ success: true });
} catch (_ihmuSeCY) {
return _AKvgcJAG({ error: "D1写入临时缓存失败", _xvLdNrRt: _ihmuSeCY._xvLdNrRt }, 500);
}
}
function _RQYyiwzB(_VzbZAVZK, _SkLfcbIT) {
let _DBZczRpA = '';
const _WAzgUNzD = _SkLfcbIT._VzbZAVZK;
for (let _RDVGkaJL = 0; _RDVGkaJL < _VzbZAVZK; _RDVGkaJL++) {
_DBZczRpA += _SkLfcbIT.charAt(Math.floor(Math.random() * _WAzgUNzD));
}
return _DBZczRpA;
}
async function _VnmwJXnF(_IBwPYiHZ, _NpFrVTwp) {
try {
const _faMKuQah = await _IBwPYiHZ.json();
if (!Array.isArray(_faMKuQah) || _faMKuQah._VzbZAVZK === 0) {
return _AKvgcJAG({ error: "无效或空的IP列表" }, 400);
}
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
const _VNPCAYPv = _WESbZvhD.subscriptionId || { _VzbZAVZK: 8, _SkLfcbIT: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _eDvJUKfQ;
let _hbSXnnGU = false;
let _NjTWdIpb = 0;
const _zFVRrKLr = 10;
while (!_hbSXnnGU && _NjTWdIpb < _zFVRrKLr) {
_eDvJUKfQ = _RQYyiwzB(_VNPCAYPv._VzbZAVZK, _VNPCAYPv._SkLfcbIT);
const { _GrnHmtMN } = await _NpFrVTwp.DB.prepare("SELECT _gedYxsnY FROM optimized_results WHERE _gedYxsnY = ?").bind(_eDvJUKfQ).all();
if (_GrnHmtMN._VzbZAVZK === 0) {
_hbSXnnGU = true;
}
_NjTWdIpb++;
}
if (!_hbSXnnGU) {
return _AKvgcJAG({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _QaIMAkMc = JSON.stringify({ _nqXlZVuN: _faMKuQah });
await _NpFrVTwp.DB.prepare(
"INSERT INTO optimized_results (_gedYxsnY, _FuHKZKqH) VALUES (?, ?)"
).bind(_eDvJUKfQ, _QaIMAkMc).run();
await _NpFrVTwp.DB.prepare(
"INSERT INTO kv_data (_tIEdrzZp, _ViCRDXVJ) VALUES (?, ?) ON CONFLICT(_tIEdrzZp) DO UPDATE SET _ViCRDXVJ = excluded._ViCRDXVJ"
).bind(_lOPfSdhp, _eDvJUKfQ).run();
return _AKvgcJAG({ success: true, _gedYxsnY: _eDvJUKfQ });
} catch (_ihmuSeCY) {
return _AKvgcJAG({ error: "保存优选结果失败", _xvLdNrRt: _ihmuSeCY._xvLdNrRt }, 500);
}
}
async function _mSoolgnj(_IBwPYiHZ, _NpFrVTwp) {
try {
const _eDvJUKfQ = _IBwPYiHZ._kMRrqHSO._gedYxsnY;
if (!_eDvJUKfQ) {
return new Response("缺少结果ID", { status: 400 });
}
const _DBZczRpA = await _NpFrVTwp.DB.prepare("SELECT _FuHKZKqH FROM optimized_results WHERE _gedYxsnY = ?").bind(_eDvJUKfQ).first();
if (!_DBZczRpA) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _FuHKZKqH = JSON.parse(_DBZczRpA._FuHKZKqH);
let _EmDnQiUz = _FuHKZKqH._nqXlZVuN;
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (_WESbZvhD.customNodes && _WESbZvhD.customNodes._zcoVhPvl && _WESbZvhD.customNodes.list) {
const _smmdosik = _WESbZvhD.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _dOgGsvRQ = _smmdosik.map(_mFmEUQft => {
let _UhfYSNaq = _mFmEUQft;
let _XxjBwSyN = undefined;
let _pHMeiQGu = null;
if (_UhfYSNaq.includes('@')) {
const _wVjnTXYM = _UhfYSNaq.split('@');
_pHMeiQGu = _wVjnTXYM.pop();
_UhfYSNaq = _wVjnTXYM.join('@');
}
if (_UhfYSNaq.includes('#')) {
const _wVjnTXYM = _UhfYSNaq.split('#');
const _nkaAutrI = _wVjnTXYM.pop();
if (!isNaN(_nkaAutrI) && _nkaAutrI.trim() !== '') {
_XxjBwSyN = parseInt(_nkaAutrI, 10);
}
_UhfYSNaq = _wVjnTXYM.join('#');
}
return {
_TWWqORpV: _UhfYSNaq,
_XxjBwSyN: _XxjBwSyN,
_qCXEEtLZ: _pHMeiQGu || _UhfYSNaq,
_TkczDSyy: '自定义'
};
});
_EmDnQiUz.unshift(..._dOgGsvRQ);
}
const { itemLink } = _WESbZvhD;
const _uBJjhOhX = new URL(_IBwPYiHZ._WBxWsLce)._ojguLzTW;
let _DCqhHDZu;
if (_WESbZvhD.websocketStreamer && _WESbZvhD.websocketStreamer._zcoVhPvl) {
if (!itemLink || !itemLink._zcoVhPvl || !itemLink._XNgbBXOm || itemLink._XNgbBXOm._VzbZAVZK === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_DCqhHDZu = _EmDnQiUz.map((_aPXYmTPB, _bThmJDBf) => {
let _pHMeiQGu;
if (_aPXYmTPB._TkczDSyy === '自定义') {
_pHMeiQGu = `${_bThmJDBf + 1} - ${_aPXYmTPB._qCXEEtLZ}`;
} else {
_pHMeiQGu = `${_bThmJDBf + 1} - ${_aPXYmTPB._qCXEEtLZ || '未知'}`;
if (!_aPXYmTPB._TkczDSyy || !_aPXYmTPB._TkczDSyy.toLowerCase().includes('cloudflare')) {
_pHMeiQGu += '(反代)';
}
}
const _TWYJrzmd = _LKaCMoPc.isIPv6(_aPXYmTPB._TWWqORpV) ? `[${_aPXYmTPB._TWWqORpV}]` : _aPXYmTPB._TWWqORpV;
const _XxjBwSyN = _aPXYmTPB._XxjBwSyN || 443;
const _ltyNKHcf = itemLink._XNgbBXOm[0];
const _jqmaqkJK = _ltyNKHcf._ixKozrHV || '';
const _ixKozrHV = (_jqmaqkJK && _YZSrRPYG(_jqmaqkJK)) ? _jqmaqkJK : crypto.randomUUID();
const _ecEuGPbn = '/snippets?_TWWqORpV=endpointAddress:_XxjBwSyN(443)&nat64=6to4';
const _iChlzsDV = _ltyNKHcf._iChlzsDV || _uBJjhOhX;
const _kMRrqHSO = new URLSearchParams({
security: 'tls',
_qjyBtKtl: 'ws',
_iChlzsDV: _iChlzsDV,
sni: _iChlzsDV,
fp: 'random'
});
return `vless://${_ixKozrHV}@${_TWYJrzmd}:${_XxjBwSyN}?${_kMRrqHSO.toString()}&_ecEuGPbn=${encodeURIComponent(encodeURIComponent(_ecEuGPbn))}#${encodeURIComponent(_pHMeiQGu)}`;
});
} else {
if (!itemLink || !itemLink._zcoVhPvl || !itemLink._XNgbBXOm || itemLink._XNgbBXOm._VzbZAVZK === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _ltyNKHcf = itemLink._XNgbBXOm[0];
const { _iChlzsDV, _ixKozrHV, _ecEuGPbn } = _ltyNKHcf;
_DCqhHDZu = _EmDnQiUz.map((_aPXYmTPB, _bThmJDBf) => {
let _pHMeiQGu;
if (_aPXYmTPB._TkczDSyy === '自定义') {
_pHMeiQGu = `${_bThmJDBf + 1} - ${_aPXYmTPB._qCXEEtLZ}`;
} else {
_pHMeiQGu = `${_bThmJDBf + 1} - ${_aPXYmTPB._qCXEEtLZ || '未知'}`;
if (!_aPXYmTPB._TkczDSyy || !_aPXYmTPB._TkczDSyy.toLowerCase().includes('cloudflare')) {
_pHMeiQGu += '(反代)';
}
}
const _TWYJrzmd = _LKaCMoPc.isIPv6(_aPXYmTPB._TWWqORpV) ? `[${_aPXYmTPB._TWWqORpV}]` : _aPXYmTPB._TWWqORpV;
const _XxjBwSyN = _aPXYmTPB._XxjBwSyN || 443;
const _kMRrqHSO = new URLSearchParams({
security: 'tls',
_qjyBtKtl: 'ws',
_iChlzsDV: _iChlzsDV || _uBJjhOhX,
sni: _iChlzsDV || _uBJjhOhX,
fp: 'random'
});
return `vless://${_ixKozrHV}@${_TWYJrzmd}:${_XxjBwSyN}?${_kMRrqHSO.toString()}&_ecEuGPbn=${encodeURIComponent(encodeURIComponent(_ecEuGPbn || ''))}#${encodeURIComponent(_pHMeiQGu)}`;
});
}
const _dzuiRvkM = _DCqhHDZu.join('\n');
const _PQPrsqgl = btoa(_dzuiRvkM);
return new Response(_PQPrsqgl, {
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' }
});
} catch (_ihmuSeCY) {
return new Response(`生成节点列表失败: ${_ihmuSeCY._xvLdNrRt}`, { status: 500 });
}
}
async function _lPuIgsSm(_IBwPYiHZ) {
try {
const { _dpOtjACV, _qjyBtKtl } = await _IBwPYiHZ.json();
if (!Array.isArray(_dpOtjACV)) {
return new Response('Invalid _dpOtjACV list', { status: 400 });
}
const _lVqwiSvW = _dpOtjACV.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _WBxWsLce = `https://cloudflare-dns.com/dns-query?_pHMeiQGu=${encodeURIComponent(domain.trim())}&_qjyBtKtl=${_qjyBtKtl || 'A'}`;
return fetch(_WBxWsLce, { _MrXrayUD: { 'Accept': 'application/dns-json' } })
.then(_EzGySWMr => _EzGySWMr.json())
.then(_FuHKZKqH => (_FuHKZKqH.Answer ? _FuHKZKqH.Answer.map(a => a._FuHKZKqH) : []))
.catch(() => []);
});
const _icHLHDul = (await Promise.all(_lVqwiSvW)).flat();
const _barDELAk = [...new Set(_icHLHDul)];
if (_barDELAk._VzbZAVZK === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_barDELAk.join('\n'), { _MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._xvLdNrRt}`, { status: 500 });
}
}
async function _JcVYvDGH(_IBwPYiHZ, _NpFrVTwp) {
try {
const { _fQAJXsdJ } = await _IBwPYiHZ.json();
if (!Array.isArray(_fQAJXsdJ)) {
return _AKvgcJAG({ error: "Invalid input, expected an object with a '_fQAJXsdJ' array." }, 400);
}
const _heomMddj = new Set();
const _nWRWACUE = _fQAJXsdJ.map(_WBxWsLce =>
_SIpdgMkK(_WBxWsLce)
.then(_yFIhxubJ => {
if (!_yFIhxubJ) return;
const _tbAaqnZs = _yFIhxubJ.split(/[\s,;|]+/);
for (const _USTPlWnc of _tbAaqnZs) {
const _HwIHlwkJ = _USTPlWnc.trim();
if (_HwIHlwkJ) {
_heomMddj.add(_HwIHlwkJ);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_WBxWsLce}:`, err);
})
);
await Promise.all(_nWRWACUE);
return _AKvgcJAG({ _nqXlZVuN: Array.from(_heomMddj) });
} catch (_ihmuSeCY) {
return _AKvgcJAG({ error: `Failed to process URLs: ${_ihmuSeCY._xvLdNrRt}` }, 500);
}
}
async function _cidQbyQz(_IBwPYiHZ, _NpFrVTwp) {
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (!_WESbZvhD.api._zcoVhPvl) {
return new Response(_WESbZvhD.api._xvLdNrRt || 'API is disabled.', { status: 503 });
}
try {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_wSfXNkDJ);
const { _GrnHmtMN: dbResults } = await _UcbNYIiZ.all();
const _ZcsVYAcm = dbResults._VzbZAVZK > 0 ? dbResults[0]._ViCRDXVJ : null;
const _lTiekiDT = _ZcsVYAcm ? JSON.parse(_ZcsVYAcm) : null;
if (!_lTiekiDT || !_lTiekiDT._GrnHmtMN || _lTiekiDT._GrnHmtMN._VzbZAVZK === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' },
});
}
const _nqXlZVuN = _lTiekiDT._GrnHmtMN.map(r => r._TWWqORpV);
return new Response(_nqXlZVuN.join('\n'), {
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' },
});
} catch (_ihmuSeCY) {
console.error("API /_TWWqORpV 处理错误:", _ihmuSeCY);
return new Response(`API处理时出错: ${_ihmuSeCY._xvLdNrRt}`, { status: 500 });
}
}
function _WxFXlEFd(_DBZczRpA, _bThmJDBf, _WESbZvhD, _uBJjhOhX) {
const { itemLink } = _WESbZvhD;
if (!itemLink || !itemLink._zcoVhPvl) return null;
const { template, _XNgbBXOm, selectionMode, _lWxPQvao } = itemLink;
if (!_XNgbBXOm || _XNgbBXOm._VzbZAVZK === 0) return null;
let _jEMKcThJ;
if (selectionMode === 'random') {
_jEMKcThJ = _XNgbBXOm[_bThmJDBf % _XNgbBXOm._VzbZAVZK];
} else if (selectionMode === 'first') {
_jEMKcThJ = _XNgbBXOm[0];
} else {
_jEMKcThJ = _XNgbBXOm.find(s => s._pHMeiQGu === selectionMode) || _XNgbBXOm[0];
}
if (!_jEMKcThJ) return null;
let _GBvxAWEq = template;
const _qBnsmvYt = _DBZczRpA._XxjBwSyN || 443;
const _GXJQsHBa = _LKaCMoPc.isIPv6(_DBZczRpA._TWWqORpV) ? `[${_DBZczRpA._TWWqORpV}]` : _DBZczRpA._TWWqORpV;
let _pHMeiQGu = `${_bThmJDBf + 1} 、 ${_DBZczRpA._qCXEEtLZ || '未知'}`;
if (!_DBZczRpA._TkczDSyy || !_DBZczRpA._TkczDSyy.toLowerCase().includes('cloudflare')) {
_pHMeiQGu += '(反代)';
}
let _iChlzsDV = _jEMKcThJ._iChlzsDV || _uBJjhOhX;
_GBvxAWEq = _GBvxAWEq.replace(/{_TWWqORpV}/g, _GXJQsHBa)
.replace(/{_XxjBwSyN}/g, _qBnsmvYt)
.replace(/{_pHMeiQGu}/g, encodeURIComponent(_pHMeiQGu))
.replace(/{rank}/g, _bThmJDBf + 1)
.replace(/{_qCXEEtLZ}/g, encodeURIComponent(_DBZczRpA._qCXEEtLZ || '未知'))
.replace(/{_TkczDSyy}/g, encodeURIComponent(_DBZczRpA._TkczDSyy || '未知'))
.replace(/{_iChlzsDV}/g, encodeURIComponent(_iChlzsDV))
.replace(/{_ixKozrHV}/g, encodeURIComponent(_jEMKcThJ['_ixKozrHV'] || ''))
.replace(/{_ecEuGPbn}/g, encodeURIComponent(encodeURIComponent(_jEMKcThJ._ecEuGPbn || '')));
if (_lWxPQvao) {
_lWxPQvao.forEach(field => {
const _WhrlDTvF = new RegExp('{' + field._pHMeiQGu + '}', 'g');
_GBvxAWEq = _GBvxAWEq.replace(_WhrlDTvF, encodeURIComponent(field._ViCRDXVJ));
});
}
return _GBvxAWEq;
}
async function _CgRxlhwi(_IBwPYiHZ, _NpFrVTwp) {
const _WESbZvhD = await _PJeUPFiM(_NpFrVTwp);
if (!_WESbZvhD.itemLink._zcoVhPvl) {
return new Response("Item _GBvxAWEq feature is disabled.", { status: 503, _MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' } });
}
try {
const _UcbNYIiZ = _NpFrVTwp.DB.prepare("SELECT _ViCRDXVJ FROM kv_data WHERE _tIEdrzZp = ?").bind(_wSfXNkDJ);
const { _GrnHmtMN: dbResults } = await _UcbNYIiZ.all();
const _ZcsVYAcm = dbResults._VzbZAVZK > 0 ? dbResults[0]._ViCRDXVJ : null;
const _lTiekiDT = _ZcsVYAcm ? JSON.parse(_ZcsVYAcm) : null;
if (!_lTiekiDT || !_lTiekiDT._GrnHmtMN || _lTiekiDT._GrnHmtMN._VzbZAVZK === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' },
});
}
const _uBJjhOhX = new URL(_IBwPYiHZ._WBxWsLce)._ojguLzTW;
const _FNitjhZV = _lTiekiDT._GrnHmtMN.map((_DBZczRpA, _bThmJDBf) => {
return _WxFXlEFd(_DBZczRpA, _bThmJDBf, _WESbZvhD, _uBJjhOhX);
}).filter(Boolean);
if (_FNitjhZV._VzbZAVZK === 0) {
return new Response("Could not generate any _aPXYmTPB links from the available IPs.", {
status: 500,
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' },
});
}
return new Response(_FNitjhZV.join('\n'), {
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/plain; _SkLfcbIT=utf-8' },
});
} catch (_ihmuSeCY) {
console.error("API /api/endpoints error:", _ihmuSeCY);
return new Response(`Error processing API _IBwPYiHZ: ${_ihmuSeCY._xvLdNrRt}`, { status: 500 });
}
}
async function _lwWpPfJF(_IBwPYiHZ, _NpFrVTwp, _QVduIjIy) {
const _HYPNxwlj = _IBwPYiHZ._MrXrayUD.get('CF-Connecting-IP') || "未知IP";
const [
_ZISFGyIL,
_UvrJXHtV,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_rUaPuELN(_TTRhwOij, _hVNxCsuc, []),
_rUaPuELN(_AOETHDgr, _hVNxCsuc, []),
_rUaPuELN(_ZLRAsWyD, _rWbWyRTu, []),
_rUaPuELN(_OglJOydh, _VVuDoAtK, { "N/A": "未知" })
]);
_lwvfbGIM = fetchedCountryMap;
let _QIzpyIgt = false;
let _zsHhIrGQ;
try {
const _xWIkKCUl = await _MbpiNMNB(_NpFrVTwp);
_QIzpyIgt = !!_xWIkKCUl;
_zsHhIrGQ = await _PJeUPFiM(_NpFrVTwp);
} catch (_ihmuSeCY) {
if (_ihmuSeCY._xvLdNrRt && _ihmuSeCY._xvLdNrRt.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _AJIXXwxN = "CREATE TABLE IF NOT EXISTS kv_data (_tIEdrzZp TEXT PRIMARY KEY, _ViCRDXVJ TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_gedYxsnY TEXT PRIMARY KEY, _FuHKZKqH TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _NpFrVTwp.DB.exec(_AJIXXwxN);
console.log("数据表创建成功。");
_QIzpyIgt = false;
_zsHhIrGQ = _cELaJQbT();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._xvLdNrRt}`, {
status: 500,
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/html;_SkLfcbIT=UTF-8' }
});
}
} else {
let _GJjpeakv = _isZMdHZT(_ihmuSeCY._xvLdNrRt);
return new Response(_GJjpeakv, { _MrXrayUD: { 'Content-Type': '_yFIhxubJ/html;_SkLfcbIT=UTF-8' } });
}
}
if (_zsHhIrGQ.telegram.bot_token && _zsHhIrGQ.telegram.chat_id) {
const _MIgfldEK = _IBwPYiHZ.cf?._MIgfldEK || "未知";
const _UvEcoFTI = _IBwPYiHZ.cf?._UvEcoFTI || "";
let _hZJfsJOb = _lwvfbGIM[_MIgfldEK] || _MIgfldEK;
if (_UvEcoFTI && _UvEcoFTI !== "未知城市" && _UvEcoFTI !== _MIgfldEK) _hZJfsJOb = `${_hZJfsJOb} ${_lwvfbGIM[_UvEcoFTI] || _UvEcoFTI}`;
const _JXPBcbzk = _LyLJymBb();
const _AMVpMgVp = _IBwPYiHZ._WBxWsLce;
const _aDNvwjQV = `访客: ${_HYPNxwlj}\n位置: ${_hZJfsJOb.trim()}\n时间: ${_JXPBcbzk}\n来自:${_AMVpMgVp}`;
const _gvaXeIGr = `https://api.telegram.org/bot${_zsHhIrGQ.telegram.bot_token}/sendMessage?chat_id=${_zsHhIrGQ.telegram.chat_id}&_yFIhxubJ=${encodeURIComponent(_aDNvwjQV)}`;
_QVduIjIy.waitUntil(fetch(_gvaXeIGr).catch(_ihmuSeCY => console.error("Telegram通知失败:", _ihmuSeCY)));
}
let _ypGZfVqi = _UoGkZqCN();
const _vIyPKqMH = {
_WESbZvhD: _zsHhIrGQ,
status: {
_QIzpyIgt: _QIzpyIgt,
}
};
_ypGZfVqi = _ypGZfVqi.replace('__PAGE_DATA_JSON__', JSON.stringify(_vIyPKqMH));
_ypGZfVqi = _ypGZfVqi.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_ZISFGyIL));
_ypGZfVqi = _ypGZfVqi.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_UvrJXHtV));
_ypGZfVqi = _ypGZfVqi.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_ypGZfVqi = _ypGZfVqi.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_lwvfbGIM));
return new Response(_ypGZfVqi, {
_MrXrayUD: { 'Content-Type': '_yFIhxubJ/html;_SkLfcbIT=UTF-8' },
});
}
function _AKvgcJAG(_NASaRBLJ, status = 200, _MrXrayUD = {}) {
return new Response(JSON.stringify(_NASaRBLJ), {
status,
_MrXrayUD: { 'Content-Type': 'application/json;_SkLfcbIT=UTF-8', ..._MrXrayUD }
});
}
function _LyLJymBb(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 _uZlxXVNQ(_TWWqORpV) {
if (!_TWWqORpV || typeof _TWWqORpV !== 'string') return "无效IP";
if(_LKaCMoPc.isIPv4(_TWWqORpV)){
const _wVjnTXYM = _TWWqORpV.split('.');
if (_wVjnTXYM._VzbZAVZK === 4) return `${_wVjnTXYM[0]}.*.*.${_wVjnTXYM[3]}`;
}
if(_LKaCMoPc.isIPv6(_TWWqORpV)){
const _wVjnTXYM = _TWWqORpV.split(':');
if (_wVjnTXYM._VzbZAVZK > 2) return `${_wVjnTXYM[0]}:...:${_wVjnTXYM[_wVjnTXYM._VzbZAVZK - 1]}`;
}
return _TWWqORpV;
}
function _isZMdHZT(_yFhqBMkW) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _SkLfcbIT="UTF-8"><title>需要设置</title>
<_gEtkBKUj>
_NASaRBLJ { font-family: sans-serif; background: #1a1a1a; _LUFIHsQM: #e0e0e0; display: flex; justify-_ynhHhReX: center; align-items: center; height: 100vh; margin: 0; }
._xyrsWzvp { max-_SJAlVhUz: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _LUFIHsQM: #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 { _LUFIHsQM: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_JORsFeoR: 1rem; }
</_gEtkBKUj>
</head><_NASaRBLJ>
<div class="_xyrsWzvp">
<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>
${_yFhqBMkW ? `<div class="error"><strong>当前错误信息:</strong> ${_yFhqBMkW.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_NASaRBLJ></html>`;
}
function _UoGkZqCN() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _SkLfcbIT="UTF-8"> <meta _pHMeiQGu="viewport" _ynhHhReX="_SJAlVhUz=device-_SJAlVhUz, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_GBvxAWEq 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>
<_gEtkBKUj>
:root { --primary-_LUFIHsQM: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_LUFIHsQM: #8c939d; --light-bg: #1A1C20; --_ynhHhReX-bg: #25282E; --border-_LUFIHsQM: #40444C; --_yFIhxubJ-_LUFIHsQM: #E0E0E0; --_yFIhxubJ-light: #B0B0B0; --success-_LUFIHsQM: #30A46C; --danger-_LUFIHsQM: #DA3633; --warning-_LUFIHsQM: #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; }
_NASaRBLJ { font-family: var(--font-family-sans); background-_LUFIHsQM: var(--light-bg); _LUFIHsQM: var(--_yFIhxubJ-_LUFIHsQM); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_LUFIHsQM 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_fXYafqlj { position: fixed; _JORsFeoR: 0; _iDckqfsf: 0; _SJAlVhUz: 100%; height: 100%; z-_bThmJDBf: -1; display: none; }
._GxFqubGD-_xyrsWzvp { max-_SJAlVhUz: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_bThmJDBf: 1; }
#_YXAHBqqR { position: fixed; _JORsFeoR: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_bThmJDBf: 10; }
#marquee-_xyrsWzvp { overflow: hidden; white-space: nowrap; background-_LUFIHsQM: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _LUFIHsQM: var(--primary-_LUFIHsQM); padding: 0.5rem 0; margin-_JORsFeoR: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_yFIhxubJ { display: inline-block; padding-_iDckqfsf: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_ekwPpFZY { _yFIhxubJ-align: center; margin-_JORsFeoR: 1rem; margin-bottom: 2rem; }
_ekwPpFZY h1 { white-space: pre-wrap; font-size: 2.25em; _LUFIHsQM: var(--primary-_LUFIHsQM); font-weight: 700; _yFIhxubJ-shadow: 0 0 10px rgba(var(--primary-_LUFIHsQM-rgb), 0.3); }
.card { background-_LUFIHsQM: 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-_LUFIHsQM); }
.progress-section #_fGHsyhzV { _SJAlVhUz: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_LUFIHsQM: var(--border-_LUFIHsQM); overflow: hidden; }
.progress-section #_fGHsyhzV::-webkit-progress-_ViCRDXVJ { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _yFIhxubJ-align: center; margin-_JORsFeoR: 0.75em; font-size: 0.95em; _LUFIHsQM: var(--_yFIhxubJ-light); min-height: 1.5em; }
.section-_ekwPpFZY { display: flex; flex-wrap: wrap; justify-_ynhHhReX: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_LUFIHsQM); gap: 1rem; }
.section-_ekwPpFZY h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _LUFIHsQM: var(--secondary-_LUFIHsQM); _yFIhxubJ-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _SJAlVhUz: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _SJAlVhUz: 100%; border-collapse: collapse; margin-_JORsFeoR: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_LUFIHsQM); padding: 0.8em; _yFIhxubJ-align: _iDckqfsf; vertical-align: middle; white-space: nowrap; }
th { background-_LUFIHsQM: #2c3038; font-weight: 500; }
tbody tr:hover { background-_LUFIHsQM: #30333a; }
td._TWWqORpV-_UhfYSNaq { font-weight: 500; font-family: var(--font-family-mono); _LUFIHsQM: var(--primary-_LUFIHsQM); }
td.ping-_ViCRDXVJ { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _yFIhxubJ-align: right; }
.btn { display: inline-flex; align-items: center; justify-_ynhHhReX: center; font-weight: 500; _yFIhxubJ-align: center; cursor: pointer; user-_uNTOROlS: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _LUFIHsQM: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_iDckqfsf: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _LUFIHsQM: var(--primary-_LUFIHsQM); border: 1px solid var(--primary-_LUFIHsQM); }
.btn-outline:hover { background-_LUFIHsQM: var(--primary-_LUFIHsQM); _LUFIHsQM: var(--_ynhHhReX-bg); }
._GxFqubGD-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._GxFqubGD-download-buttons .btn { _SJAlVhUz: 100%; margin: 0; }
.tooltip-notification { position: fixed; _JORsFeoR: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _LUFIHsQM: #fff; font-size: 0.95em; z-_bThmJDBf: 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); }
#_QBxPETJl, #_oPfwWXOK, #_KeUByzvS, #_XNdSYEjp, #_PgtcIHgy { display: none; position: fixed; z-_bThmJDBf: 10000; _iDckqfsf: 0; _JORsFeoR: 0; _SJAlVhUz: 100%; height: 100%; background-_LUFIHsQM: rgba(0,0,0,0.6); justify-_ynhHhReX: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_ynhHhReX, ._GxFqubGD-modal-_ynhHhReX { background-_LUFIHsQM: var(--_ynhHhReX-bg); padding: 2rem; border: 1px solid var(--border-_LUFIHsQM); border-radius: var(--border-radius-md); _SJAlVhUz: 95%; max-_SJAlVhUz: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_XNdSYEjp .modal-_ynhHhReX { max-_SJAlVhUz: 500px; }
.modal-_ynhHhReX h3, ._GxFqubGD-modal-_ekwPpFZY h3 { margin-_JORsFeoR: 0; margin-bottom: 1.5rem; _LUFIHsQM: var(--primary-_LUFIHsQM); _yFIhxubJ-align: center; }
.modal-buttons { display: flex; justify-_ynhHhReX: flex-end; gap: 1rem; margin-_JORsFeoR: 2rem; border-_JORsFeoR: 1px solid var(--border-_LUFIHsQM); padding-_JORsFeoR: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_LUFIHsQM), rgba(0,0,0,0)); margin: 2rem 0; }
._GxFqubGD-modal-_ekwPpFZY { display: flex; justify-_ynhHhReX: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_LUFIHsQM); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _LUFIHsQM: var(--_yFIhxubJ-light); cursor: pointer; background: none; border: none; padding: 0; }
._GxFqubGD-list-_aPXYmTPB { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_LUFIHsQM); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._GxFqubGD-_pHMeiQGu { font-size: 1.1em; font-weight: 600; }
._GxFqubGD-links a { display: block; _LUFIHsQM: var(--primary-_LUFIHsQM); _yFIhxubJ-decoration: none; margin-_JORsFeoR: 0.5rem; word-break: break-all; }
._GxFqubGD-links a:hover { _yFIhxubJ-decoration: underline; }
._GxFqubGD-links span { _LUFIHsQM: var(--_yFIhxubJ-light); }
#visitorPasswordPrompt { _yFIhxubJ-align: center; }
#visitorPasswordPrompt h3 { _LUFIHsQM: var(--primary-_LUFIHsQM); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _LUFIHsQM: var(--_yFIhxubJ-light); margin-bottom: 1.5rem; }
._xWIkKCUl-input-group { display: flex; gap: 10px; max-_SJAlVhUz: 400px; margin: 0 auto; }
._xWIkKCUl-input-group input { flex-grow: 1; _yFIhxubJ-align: center; }
._xWIkKCUl-input-group .btn { margin-_iDckqfsf: 0; }
._GrnHmtMN-actions-_xyrsWzvp { _yFIhxubJ-align: center; margin-bottom: 1.5rem; }
._GrnHmtMN-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._GrnHmtMN-api-buttons .btn { margin: 0; _SJAlVhUz: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_ynhHhReX 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 _uNTOROlS, .form-grid-control textarea { _SJAlVhUz: 100%; background-_LUFIHsQM: var(--light-bg); border: 1px solid var(--border-_LUFIHsQM); border-radius: var(--border-radius-sm); _LUFIHsQM: var(--_yFIhxubJ-_LUFIHsQM); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_LUFIHsQM 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _uNTOROlS:focus, .form-grid-control textarea:focus { border-_LUFIHsQM: var(--primary-_LUFIHsQM); box-shadow: 0 0 0 2px rgba(var(--primary-_LUFIHsQM-rgb), 0.2); outline: none; }
.form-grid-control input[_qjyBtKtl="_LUFIHsQM"] { min-_SJAlVhUz: auto; padding: 2px; _SJAlVhUz: 2.5em; height: 2.5em; }
.form-grid-control input[_qjyBtKtl="checkbox"] { _SJAlVhUz: auto; flex-shrink: 0; height: 1.2em; _SJAlVhUz: 1.2em; }
.form-grid-control ._WjacPuaj-input { _SJAlVhUz: 80px; _yFIhxubJ-align: right; }
.tooltip-_hYBgDzXk { display: inline-flex; _SJAlVhUz: 16px; height: 16px; align-items: center; justify-_ynhHhReX: center; background-_LUFIHsQM: var(--secondary-_LUFIHsQM); _LUFIHsQM: var(--_ynhHhReX-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_uNTOROlS: none; }
#tooltip-popup { position: fixed; background-_LUFIHsQM: #383c4a; _LUFIHsQM: #fff; padding: 10px 15px; border-radius: 6px; z-_bThmJDBf: 10001; font-size: 0.85em; max-_SJAlVhUz: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_LUFIHsQM); pointer-events: none; }
#custom-fields-_xyrsWzvp .form-grid-control { gap: 5px; } #custom-fields-_xyrsWzvp .form-grid-control input { flex: 1; }
.parameter-_iKCOXGYB-_CCrWSmdD { border: 1px solid var(--border-_LUFIHsQM); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_iKCOXGYB-_ekwPpFZY { display: flex; justify-_ynhHhReX: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_iKCOXGYB-_ekwPpFZY input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_JORsFeoR: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._yFIhxubJ-_LUFIHsQM-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _SJAlVhUz: 100%; }
._yFIhxubJ-_LUFIHsQM-grid input[_qjyBtKtl="_LUFIHsQM"] { grid-column: 1 / 2; }
._yFIhxubJ-_LUFIHsQM-grid input[_qjyBtKtl="_yFIhxubJ"], ._yFIhxubJ-_LUFIHsQM-grid textarea { grid-column: 2 / 3; }
#_XNdSYEjp .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_XNdSYEjp .btn-group { display: flex; }
#_XNdSYEjp .sub-btn { flex-grow: 1; margin: 0; }
#_XNdSYEjp ._NVHFbaTa-btn { flex-shrink: 0; margin-_iDckqfsf: -1px; border-_JORsFeoR-_iDckqfsf-radius: 0; border-bottom-_iDckqfsf-radius: 0; }
#_PgtcIHgy .modal-_ynhHhReX { max-_SJAlVhUz: 300px; background: white; padding: 1rem; _yFIhxubJ-align: center; }
#qrCodeImg { max-_SJAlVhUz: 100%; }
@media (max-_SJAlVhUz: 768px) {
html { font-size: 15px; } ._GxFqubGD-_xyrsWzvp { padding: 0 0.8rem; } _ekwPpFZY { margin-_JORsFeoR: 2.5rem; margin-bottom: 1.5rem; } #_YXAHBqqR { _JORsFeoR: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_gEtkBKUj>
<_gEtkBKUj _gedYxsnY="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_ynhHhReX-bg: #FFFFFF; --border-_LUFIHsQM: #DCDFE6; --_yFIhxubJ-_LUFIHsQM: #303133; --_yFIhxubJ-light: #606266; }
.theme-light .card { background-_LUFIHsQM: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_LUFIHsQM: #F5F7FA; }
.theme-light tbody tr:hover { background-_LUFIHsQM: #ECF5FF; }
.theme-matrix { --primary-_LUFIHsQM: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_ynhHhReX-bg: #0D0208; --border-_LUFIHsQM: #00FF41; --_yFIhxubJ-_LUFIHsQM: #00FF41; --_yFIhxubJ-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_LUFIHsQM: rgba(0, 20, 0, 0.7); _yFIhxubJ-shadow: 0 0 5px var(--primary-_LUFIHsQM); backdrop-filter: none; }
.theme-matrix th { background-_LUFIHsQM: #000; }
.theme-matrix tbody tr:hover { background-_LUFIHsQM: #010; }
.theme-matrix .btn { _yFIhxubJ-shadow: none; _LUFIHsQM: #000; }
.theme-matrix .btn-outline { background-_LUFIHsQM: transparent; }
.theme-modern-glass { --primary-_LUFIHsQM: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_ynhHhReX-bg: rgba(30, 30, 40, 0.6); --border-_LUFIHsQM: rgba(255, 255, 255, 0.2); --_yFIhxubJ-_LUFIHsQM: #F0F0F0; --_yFIhxubJ-light: #A0A0B0; --border-radius-md: 12px; }
_NASaRBLJ.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-_LUFIHsQM: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_ynhHhReX-bg: rgba(30, 30, 40, 0.6); --border-_LUFIHsQM: rgba(255, 255, 255, 0.2); --_yFIhxubJ-_LUFIHsQM: #F0F0F0; --_yFIhxubJ-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_LUFIHsQM: var(--_ynhHhReX-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_LUFIHsQM); }
.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-_LUFIHsQM: rgba(0,0,0,0.3); border-right-_LUFIHsQM: 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); _yFIhxubJ-shadow: 0 1px 2px rgba(0,0,0,0.2); _LUFIHsQM: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_LUFIHsQM: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _yFIhxubJ-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_LUFIHsQM); border-_LUFIHsQM: var(--primary-_LUFIHsQM); _LUFIHsQM: #fff; }
.glassy-components _ekwPpFZY h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _yFIhxubJ; -webkit-_yFIhxubJ-fill-_LUFIHsQM: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _LUFIHsQM: transparent; }
.theme-aurora-glass { --primary-_LUFIHsQM: #38bdf8; --light-bg: #0c0a09; --_ynhHhReX-bg: rgba(23, 23, 23, 0.5); --border-_LUFIHsQM: rgba(255, 255, 255, 0.15); --_yFIhxubJ-_LUFIHsQM: #f2f2f2; --_yFIhxubJ-light: #a3a3a3; }
_NASaRBLJ.theme-aurora-glass::before { _ynhHhReX: ''; position: fixed; _JORsFeoR: 0; _iDckqfsf: 0; _SJAlVhUz: 100%; height: 100%; z-_bThmJDBf: -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-_LUFIHsQM: #08fdd8; --light-bg: #010409; --_ynhHhReX-bg: rgba(22, 27, 34, 0.6); --border-_LUFIHsQM: rgba(139, 148, 158, 0.3); --_yFIhxubJ-_LUFIHsQM: #e6edf3; --_yFIhxubJ-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_LUFIHsQM), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_LUFIHsQM-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_LUFIHsQM-rgb), 0.5); }
.theme-marble-light { --primary-_LUFIHsQM: #bfa37c; --light-bg: #f7f5f2; --_ynhHhReX-bg: #ffffff; --border-_LUFIHsQM: #e0dcd5; --_yFIhxubJ-_LUFIHsQM: #3d3a36; --_yFIhxubJ-light: #6b6661; }
_NASaRBLJ.theme-marble-light { background-image: _WBxWsLce('_FuHKZKqH:image/svg+xml,%3Csvg _SJAlVhUz="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-_LUFIHsQM: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_gEtkBKUj>
</head><_NASaRBLJ _gedYxsnY="pageBody">
<_fXYafqlj _gedYxsnY="background-_fXYafqlj"></_fXYafqlj>
<div _gedYxsnY="_QBxPETJl">
<div class="modal-_ynhHhReX">
<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 _qjyBtKtl="_xWIkKCUl" _gedYxsnY="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _qjyBtKtl="_xWIkKCUl" _gedYxsnY="confirmPassword"></div></div>
<div class="modal-buttons"><button _gedYxsnY="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_GxFqubGD-_xyrsWzvp">
<button _gedYxsnY="_YXAHBqqR" class="btn btn-outline"></button>
<div _gedYxsnY="marquee-_xyrsWzvp"><div _gedYxsnY="marquee-_yFIhxubJ"></div></div>
<_ekwPpFZY><h1 _gedYxsnY="pageTitle"></h1></_ekwPpFZY>
<div class="card" _gedYxsnY="visitorPasswordPrompt" _gEtkBKUj="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_xWIkKCUl-input-group">
<input _qjyBtKtl="_xWIkKCUl" _gedYxsnY="visitorPasswordEntry" _WhrlDTvF="访客密码">
<button _gedYxsnY="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _gedYxsnY="_mTODbzTX" _gEtkBKUj="display: block;">
<div class="card progress-section">
<div _gedYxsnY="progressDisplay">
<progress _gedYxsnY="_fGHsyhzV" _ViCRDXVJ="0" max="100"></progress>
<div _gedYxsnY="status">正在初始化...</div>
</div>
</div>
<div class="card _GxFqubGD-download-section">
<div class="section-_ekwPpFZY"><h2 _gedYxsnY="appDownloadTitleEl"></h2></div>
<div class="_GxFqubGD-download-buttons">
<button class="btn" _FuHKZKqH-_vIMXWfjY="android">安卓客户端</button>
<button class="btn" _FuHKZKqH-_vIMXWfjY="ios">苹果客户端</button>
<button class="btn" _FuHKZKqH-_vIMXWfjY="windows">Windows客户端</button>
<button class="btn" _FuHKZKqH-_vIMXWfjY="mac">Mac客户端</button>
</div>
</div>
<div class="card _GrnHmtMN-section" _gedYxsnY="_vlzXIfWv" _gEtkBKUj="display:none;">
<div class="section-_ekwPpFZY">
<h2 _gedYxsnY="liveTitleEl"></h2>
<div class="generator-info" _gedYxsnY="liveGeneratorInfo"></div>
</div>
<div _gedYxsnY="_UsrUpPIT" class="_GrnHmtMN-actions-_xyrsWzvp" _gEtkBKUj="display: none;">
<div class="_GrnHmtMN-api-buttons">
<button _gedYxsnY="copyIpApiBtn" class="btn">复制 IP API</button>
<button _gedYxsnY="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _gedYxsnY="resultsTable">
<thead><tr><th _gedYxsnY="tableHeader1El"></th><th _gedYxsnY="tableHeader2El"></th><th _gedYxsnY="tableHeader3El"></th><th _gedYxsnY="tableHeader4El"></th><th _gedYxsnY="tableHeader5El"></th><th _gedYxsnY="tableHeader6El"></th><th _gedYxsnY="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _gedYxsnY="_ktGTCMbR" _gEtkBKUj="display:none;">
<div class="section-_ekwPpFZY"><h2 _gedYxsnY="cachedTitleEl"></h2><div class="generator-info" _gedYxsnY="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _gedYxsnY="cachedResultsTable">
<thead><tr><th _gedYxsnY="cachedTableHeader1El"></th><th _gedYxsnY="cachedTableHeader2El"></th><th _gedYxsnY="cachedTableHeader3El"></th><th _gedYxsnY="cachedTableHeader4El"></th><th _gedYxsnY="cachedTableHeader5El"></th><th _gedYxsnY="cachedTableHeader6El"></th><th _gedYxsnY="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _gedYxsnY="notificationTooltip" class="tooltip-notification"></div>
<div _gedYxsnY="_oPfwWXOK">
<div class="modal-_ynhHhReX">
<h3>修改参数</h3>
<div _gEtkBKUj="display: flex; border-bottom: 1px solid var(--border-_LUFIHsQM); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_RgzxbFmh(event, 'general-_bqXdEaGD')">通用设置</button>
<button class="tab-button" onclick="_RgzxbFmh(event, '_GBvxAWEq-_bqXdEaGD')">链接设置</button>
<button class="tab-button" onclick="_RgzxbFmh(event, 'fine-grained-_bqXdEaGD')">IP源设置</button>
<button class="tab-button" onclick="_RgzxbFmh(event, 'advanced-_bqXdEaGD')">高级设置</button>
</div>
<div _gedYxsnY="general-_bqXdEaGD" class="tab-_ynhHhReX" _gEtkBKUj="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_uNTOROlS _gedYxsnY="themeSelect">
<_fMiaeJyk _ViCRDXVJ="theme-aurora-glass">极光-玻璃质感</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-particles-glass">粒子-玻璃质感</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-modern-glass">现代-玻璃质感</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-cyberpunk-glass">赛博朋克-玻璃质感</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-dark-particles">暗色-粒子背景</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-dark-bing">暗色-必应壁纸</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-light">亮色-简约</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-light-bing">亮色-必应壁纸</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-marble-light">简约大理石-亮色</_fMiaeJyk>
<_fMiaeJyk _ViCRDXVJ="theme-matrix">矩阵-代码雨</_fMiaeJyk>
</_uNTOROlS>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="primaryColorInput">
<span _gEtkBKUj="_SJAlVhUz: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_title"><textarea _gedYxsnY="textInput_title" _hbvPkxIv="1" _WhrlDTvF="页面主标题"></textarea></div>
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_loginButton"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="textInput_loginButton" _WhrlDTvF="登录按钮文本"></div>
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_appDownloadTitle"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="textInput_appDownloadTitle" _WhrlDTvF="APP下载标题"></div>
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_liveTitle"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="textInput_liveTitle" _WhrlDTvF="本次结果标题"></div>
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_cachedTitle"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="textInput_cachedTitle" _WhrlDTvF="上次结果标题"></div>
<div class="_yFIhxubJ-_LUFIHsQM-grid"><input _qjyBtKtl="_LUFIHsQM" _gedYxsnY="colorInput_tableHeader"><input _qjyBtKtl="_yFIhxubJ" _ViCRDXVJ="表格头部文本颜色" readonly _gEtkBKUj="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label>公告栏设置</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _gedYxsnY="announcementText" _WhrlDTvF="在此输入公告内容" _hbvPkxIv="3"></textarea>
<div _gEtkBKUj="display: flex; justify-_ynhHhReX: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _gEtkBKUj="display: flex; align-items: center; gap: 5px;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableMarquee"> 顶部走马灯</label>
<label _gEtkBKUj="display: flex; align-items: center; gap: 5px;"><input _qjyBtKtl="checkbox" _gedYxsnY="enablePopup"> 右上角弹窗</label>
<div _gedYxsnY="popupDurationContainer" _gEtkBKUj="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _qjyBtKtl="number" _gedYxsnY="popupDuration" _gEtkBKUj="_SJAlVhUz: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _gedYxsnY="_GBvxAWEq-_bqXdEaGD" class="tab-_ynhHhReX">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="converterServiceUrlInput" _WhrlDTvF="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="number" _gedYxsnY="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _gedYxsnY="subscriptionIdCharset" _hbvPkxIv="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-_hYBgDzXk" _FuHKZKqH-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableItemLinkCheckbox"></div>
</div>
<div _gedYxsnY="itemLinkConfigGroup" _gEtkBKUj="display:none; margin-_JORsFeoR: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="定义分享链接格式。可用占位符: {_TWWqORpV}, {_XxjBwSyN}, {_pHMeiQGu}, {rank}, {_qCXEEtLZ}, {_TkczDSyy}, {_iChlzsDV}, {_ixKozrHV}, {_ecEuGPbn}。">?</span></div>
<div class="form-grid-control"><textarea _gedYxsnY="itemLinkTemplateInput" _hbvPkxIv="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_uNTOROlS _gedYxsnY="parameterSelectionMode"></_uNTOROlS></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _gedYxsnY="parameter-sets-_xyrsWzvp"></div><button _qjyBtKtl="button" _gedYxsnY="add-parameter-_iKCOXGYB-btn" class="btn btn-outline" _gEtkBKUj="margin-_JORsFeoR: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _gedYxsnY="custom-fields-_xyrsWzvp" _gEtkBKUj="_SJAlVhUz: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><button _qjyBtKtl="button" _gedYxsnY="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _gedYxsnY="fine-grained-_bqXdEaGD" class="tab-_ynhHhReX">
<div class="form-grid-label" _gEtkBKUj="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _gEtkBKUj="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_ynhHhReX: flex-start;">
<label><input _qjyBtKtl="checkbox" _gedYxsnY="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _qjyBtKtl="checkbox" _gedYxsnY="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _gedYxsnY="fine-grained-sources-_xyrsWzvp"></div><button _qjyBtKtl="button" _gedYxsnY="add-fine-grained-_wVUcSFFC-btn" class="btn btn-outline" _gEtkBKUj="margin-_JORsFeoR: 10px;">添加地区</button></div>
</div>
<div _gedYxsnY="advanced-_bqXdEaGD" class="tab-_ynhHhReX">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="checkbox" _gedYxsnY="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="resolvedDomainsGroup" _gEtkBKUj="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _gedYxsnY="resolvedDomainsInput" _WhrlDTvF="留空则使用内置默认域名" _hbvPkxIv="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-_hYBgDzXk" _FuHKZKqH-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="checkbox" _gedYxsnY="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="customNodesGroup" _gEtkBKUj="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _gedYxsnY="customNodesInput" _WhrlDTvF="一行一个地址,支持域名、IPv4、IPv6。" _hbvPkxIv="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-_hYBgDzXk" _FuHKZKqH-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="number" _gedYxsnY="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="number" _gedYxsnY="topNInput"></div>
<div class="form-grid-label" _gEtkBKUj="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="display: none;"><input _qjyBtKtl="number" _gedYxsnY="latencyRangeMinInput" _WhrlDTvF="最小"><span>-</span><input _qjyBtKtl="number" _gedYxsnY="latencyRangeMaxInput" _WhrlDTvF="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="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-_hYBgDzXk" _FuHKZKqH-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _qjyBtKtl="number" _gedYxsnY="geoLocationRetriesInput" _gEtkBKUj="_SJAlVhUz: 80px;"> <span>次</span>
<div _gEtkBKUj="display: flex; align-items: center; gap: 5px; margin-_iDckqfsf: 20px;">
<input _qjyBtKtl="checkbox" _gedYxsnY="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-_hYBgDzXk" _FuHKZKqH-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_iChlzsDV:_XxjBwSyN' 或 '_iChlzsDV'。">?</span></div>
<div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="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-_hYBgDzXk" _FuHKZKqH-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="websocketStreamerGroup" _gEtkBKUj="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="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-_hYBgDzXk" _FuHKZKqH-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="启用 /_TWWqORpV 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableApiCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="apiConfigGroup" _gEtkBKUj="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="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-_hYBgDzXk" _FuHKZKqH-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="customSubPathGroup" _gEtkBKUj="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="customSubPathInput" _WhrlDTvF="例如: 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-_hYBgDzXk" _FuHKZKqH-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="justify-_ynhHhReX: flex-start;"><input _qjyBtKtl="checkbox" _gedYxsnY="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _gedYxsnY="visitorPasswordGroup" _gEtkBKUj="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_hYBgDzXk" _FuHKZKqH-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _gEtkBKUj="flex-direction: column; align-items: stretch; gap: 8px;"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="botTokenInput" _WhrlDTvF="Telegram Bot Token"><input _qjyBtKtl="_yFIhxubJ" _gedYxsnY="chatIdInput" _WhrlDTvF="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _gEtkBKUj="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _gEtkBKUj="flex-direction: column; align-items: stretch; gap: 8px;"><input _qjyBtKtl="_xWIkKCUl" _gedYxsnY="oldPasswordInput" _WhrlDTvF="旧密码"><input _qjyBtKtl="_xWIkKCUl" _gedYxsnY="newPasswordInput" _WhrlDTvF="新密码 (至少6位)"><button _gedYxsnY="changePasswordBtn" class="btn" _gEtkBKUj="align-self: flex-start; margin-_iDckqfsf: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _gedYxsnY="closeModalBtn" class="btn btn-outline">关闭</button><button _gedYxsnY="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _gedYxsnY="_KeUByzvS">
<div class="_GxFqubGD-modal-_ynhHhReX">
<div class="_GxFqubGD-modal-_ekwPpFZY"><h3 _gedYxsnY="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_GxFqubGD-modal-_NASaRBLJ" _gedYxsnY="appModalBody"></div>
</div>
</div>
<div _gedYxsnY="_XNdSYEjp">
<div class="modal-_ynhHhReX">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _FuHKZKqH-sub-_qjyBtKtl="coreEngine">Xray</button><button class="btn _NVHFbaTa-btn" _FuHKZKqH-sub-_qjyBtKtl="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _FuHKZKqH-sub-_qjyBtKtl="coreProfile">Sing-Box</button><button class="btn _NVHFbaTa-btn" _FuHKZKqH-sub-_qjyBtKtl="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _FuHKZKqH-sub-_qjyBtKtl="configProfile">Clash</button><button class="btn _NVHFbaTa-btn" _FuHKZKqH-sub-_qjyBtKtl="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _FuHKZKqH-sub-_qjyBtKtl="policyProfile">Surge</button><button class="btn _NVHFbaTa-btn" _FuHKZKqH-sub-_qjyBtKtl="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _gEtkBKUj="justify-_ynhHhReX: center;"><button class="btn btn-outline" _gedYxsnY="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _gedYxsnY="_PgtcIHgy">
<div class="modal-_ynhHhReX">
<img _gedYxsnY="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _LKaCMoPc = {
isValid: (_TWWqORpV) => _LKaCMoPc.isIPv4(_TWWqORpV) || _LKaCMoPc.isIPv6(_TWWqORpV),
isIPv4: (_TWWqORpV) => {
if (typeof _TWWqORpV !== 'string') return false;
const _wVjnTXYM = _TWWqORpV.split('.');
if (_wVjnTXYM._VzbZAVZK !== 4) return false;
return _wVjnTXYM.every(_HYPQOPlm => {
const _QiKenenr = parseInt(_HYPQOPlm, 10);
return !isNaN(_QiKenenr) && _QiKenenr >= 0 && _QiKenenr <= 255 && String(_QiKenenr) === _HYPQOPlm;
});
},
isIPv6: (_TWWqORpV) => {
if (typeof _TWWqORpV !== '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]))$/_RDVGkaJL.test(_TWWqORpV);
},
toLong4: (_TWWqORpV) => _TWWqORpV.split('.').reduce((acc, octet, _RDVGkaJL) => acc + (parseInt(octet) << (8*(3-_RDVGkaJL))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_TWWqORpV) => {
try {
const _NaDoXOmO = _TWWqORpV.split('/')[0];
const _wVjnTXYM = _NaDoXOmO.split('::');
if (_wVjnTXYM._VzbZAVZK > 2) return 0n;
let _gMYbgDUu = [];
if (_wVjnTXYM[0]) {
_gMYbgDUu = _wVjnTXYM[0].split(':');
}
let _RhVtVppY = [];
if (_wVjnTXYM._VzbZAVZK > 1 && _wVjnTXYM[1]) {
_RhVtVppY = _wVjnTXYM[1].split(':');
}
if (_gMYbgDUu._VzbZAVZK + _RhVtVppY._VzbZAVZK > 8) return 0n;
const _asBNBYDX = 8 - (_gMYbgDUu._VzbZAVZK + _RhVtVppY._VzbZAVZK);
const _TxGDUohS = [
..._gMYbgDUu,
...Array(_asBNBYDX).fill('0'),
..._RhVtVppY
].map(_HYPQOPlm => _HYPQOPlm || '0');
while(_TxGDUohS._VzbZAVZK < 8) {
_TxGDUohS.push('0');
}
let _diKBHgid = 0n;
for (const _HYPQOPlm of _TxGDUohS) {
if (_HYPQOPlm._VzbZAVZK > 4) return 0n;
const _ViCRDXVJ = BigInt('0x' + _HYPQOPlm);
_diKBHgid = (_diKBHgid << 16n) | _ViCRDXVJ;
}
return _diKBHgid;
} catch(_ihmuSeCY) {
return 0n;
}
},
fromBigInt6: (_diKBHgid) => {
if (typeof _diKBHgid !== '_diKBHgid' || _diKBHgid < 0n) return null;
const _wVjnTXYM = [];
for (let _RDVGkaJL = 0; _RDVGkaJL < 8; _RDVGkaJL++) {
_wVjnTXYM.unshift((_diKBHgid & 0xFFFFn).toString(16));
_diKBHgid >>= 16n;
}
let _LvfUpoBZ = { start: -1, _fXmAWuSR: 0 };
let _HmiRPNfm = { start: -1, _fXmAWuSR: 0 };
for (let _RDVGkaJL = 0; _RDVGkaJL < 8; _RDVGkaJL++) {
if (_wVjnTXYM[_RDVGkaJL] === '0') {
if (_HmiRPNfm.start === -1) _HmiRPNfm.start = _RDVGkaJL;
_HmiRPNfm._fXmAWuSR++;
} else {
if (_HmiRPNfm._fXmAWuSR > _LvfUpoBZ._fXmAWuSR) _LvfUpoBZ = { ..._HmiRPNfm };
_HmiRPNfm = { start: -1, _fXmAWuSR: 0 };
}
}
if (_HmiRPNfm._fXmAWuSR > _LvfUpoBZ._fXmAWuSR) _LvfUpoBZ = { ..._HmiRPNfm };
if (_LvfUpoBZ._fXmAWuSR > 1) {
_wVjnTXYM.splice(_LvfUpoBZ.start, _LvfUpoBZ._fXmAWuSR, '');
if (_LvfUpoBZ.start === 0) _wVjnTXYM.unshift('');
if (_LvfUpoBZ.start + _LvfUpoBZ._fXmAWuSR === 8) _wVjnTXYM.push('');
}
return _wVjnTXYM.join(':');
},
cidrToRange: (cidr, _oDHXXlXP = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _XTwMEOGY = parseInt(bitsStr, 10);
const _nqXlZVuN = new Set();
if (_LKaCMoPc.isIPv4(range)) {
if (isNaN(_XTwMEOGY) || _XTwMEOGY < 8 || _XTwMEOGY > 32) return [];
if (_XTwMEOGY === 32) return [range];
const _KlFxzaBT = _LKaCMoPc.toLong4(range);
const _dWaKkJmc = (0xFFFFFFFF << (32 - _XTwMEOGY)) >>> 0;
const _MZhuTCvy = _KlFxzaBT & _dWaKkJmc;
const _HQtDphOq = 1 << (32 - _XTwMEOGY);
if (_HQtDphOq <= 2) return [];
const _JfCqwvPl = Math.min(_oDHXXlXP, _HQtDphOq - 2);
let _NjTWdIpb = 0;
while (_nqXlZVuN.size < _JfCqwvPl && _NjTWdIpb < _JfCqwvPl * 5) {
const _DcpysUnQ = Math.floor(Math.random() * (_HQtDphOq - 2)) + 1;
_nqXlZVuN.add(_LKaCMoPc.fromLong4((_MZhuTCvy + _DcpysUnQ) >>> 0));
_NjTWdIpb++;
}
return Array.from(_nqXlZVuN);
} else if (_LKaCMoPc.isIPv6(range)) {
if (isNaN(_XTwMEOGY) || _XTwMEOGY < 16 || _XTwMEOGY > 128) return [];
if (_XTwMEOGY === 128) return [range];
const _qCwxUTID = _LKaCMoPc.toBigInt6(range);
const _dWaKkJmc = (2n ** BigInt(128 - _XTwMEOGY) - 1n);
const _MZhuTCvy = _qCwxUTID & ~_dWaKkJmc;
const _XXzSnkDT = 2n ** BigInt(128 - _XTwMEOGY);
if (_XXzSnkDT <= 2n) return [];
let _NjTWdIpb = 0;
while (_nqXlZVuN.size < _oDHXXlXP && _NjTWdIpb < _oDHXXlXP * 5) {
const _RtIKbdhz = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_RtIKbdhz);
let _KgUNUeJs = 0n;
for (const _mvMflWpN of _RtIKbdhz) {
_KgUNUeJs = (_KgUNUeJs << 8n) | BigInt(_mvMflWpN);
}
const _DcpysUnQ = _KgUNUeJs % (_XXzSnkDT - 2n) + 1n;
_nqXlZVuN.add(_LKaCMoPc.fromBigInt6(_MZhuTCvy + _DcpysUnQ));
_NjTWdIpb++;
}
return Array.from(_nqXlZVuN);
}
return [];
} catch(_ihmuSeCY) {
console.error(`CIDR to range failed for ${cidr}:`, _ihmuSeCY);
return [];
}
}
};
function _lxkBtDQc(_HhjegAlJ, _zffTZiHy) {
const _lpOxZdOq = {};
const _olfhOsGb = Object._olfhOsGb(_zffTZiHy);
const _wVjnTXYM = _olfhOsGb.map(_tIEdrzZp => {
const _kkVuFefN = _HhjegAlJ * (_zffTZiHy[_tIEdrzZp] / 100);
return { _tIEdrzZp, _oDHXXlXP: Math.floor(_kkVuFefN), remainder: _kkVuFefN - Math.floor(_kkVuFefN) };
});
let _DVSZJSey = _wVjnTXYM.reduce((acc, _HYPQOPlm) => acc + _HYPQOPlm._oDHXXlXP, 0);
_wVjnTXYM.sort((a, b) => b.remainder - a.remainder);
let _YcCSbbXp = _HhjegAlJ - _DVSZJSey;
for (let _RDVGkaJL = 0; _RDVGkaJL < _YcCSbbXp; _RDVGkaJL++) {
_wVjnTXYM[_RDVGkaJL % _wVjnTXYM._VzbZAVZK]._oDHXXlXP++;
}
for (const _HYPQOPlm of _wVjnTXYM) {
_lpOxZdOq[_HYPQOPlm._tIEdrzZp] = _HYPQOPlm._oDHXXlXP;
}
return _lpOxZdOq;
}
const _vIyPKqMH = __PAGE_DATA_JSON__;
const _zsHhIrGQ = _vIyPKqMH._WESbZvhD;
const _utSfiRkT = _vIyPKqMH.status;
const _ZISFGyIL = __ALL_CF_CIDR_LIST_JSON__;
const _UvrJXHtV = __BALANCED_CF_CIDR_LIST_JSON__;
const _AFanLcaq = __DEFAULT_DOMAINS_LIST_JSON__;
const _lwvfbGIM = __COUNTRY_MAP_JSON__;
const _lHkFSLkJ = _lwvfbGIM;
const _HqFeOEby = 2500;
const _RlzQFrXg = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _mTODbzTX = document.getElementById('_mTODbzTX');
const _fGHsyhzV = document.getElementById('_fGHsyhzV');
const _yOVqvZIQ = document.getElementById('status');
const _vlzXIfWv = document.getElementById('_vlzXIfWv');
const _zNQOlewz = document.getElementById('resultsTable').querySelector('tbody');
const _ktGTCMbR = document.getElementById('_ktGTCMbR');
const _yATEIKCO = document.getElementById('cachedResultsTable').querySelector('tbody');
const _rEHeCcvv = document.getElementById('notificationTooltip');
const _YXAHBqqR = document.getElementById('_YXAHBqqR');
const _oPfwWXOK = document.getElementById('_oPfwWXOK');
const _KeUByzvS = document.getElementById('_KeUByzvS');
const _XNdSYEjp = document.getElementById('_XNdSYEjp');
const _PgtcIHgy = document.getElementById('_PgtcIHgy');
const _QBxPETJl = document.getElementById('_QBxPETJl');
const _UsrUpPIT = document.getElementById('_UsrUpPIT');
let _hAWtMiWp = null;
let _oLckNiZt = null;
let _kkowbDrK = [];
let _YWDEovLg = false;
let _EufOhGlb = null;
function _FvodDaJF(_xWaWhfay, _gVqJQlVW) {
const _JcuyzAlQ=parseInt(_xWaWhfay.slice(1),16),t=_gVqJQlVW<0?0:255,p=_gVqJQlVW<0?_gVqJQlVW*-1:_gVqJQlVW,R=_JcuyzAlQ>>16,G=_JcuyzAlQ>>8&0x00FF,B=_JcuyzAlQ&0x0000FF;
const _ppFNvsua = Math.round((t-R)*p)+R;
const _CAJQwPMP = Math.round((t-G)*p)+G;
const _ClLYEPnB = Math.round((t-B)*p)+B;
return `rgb(${_ppFNvsua.toString()}, ${_CAJQwPMP.toString()}, ${_ClLYEPnB.toString()})`;
}
function _ZzeNBuZF(_bqXdEaGD) {
const _IvtMKoSc = _OLtFepGa(_bqXdEaGD.primaryColor);
if(_IvtMKoSc) {
document.documentElement._gEtkBKUj.setProperty('--primary-_LUFIHsQM-rgb', `${_IvtMKoSc.r},${_IvtMKoSc.g},${_IvtMKoSc.b}`);
}
document.documentElement._gEtkBKUj.setProperty('--primary-_LUFIHsQM', _bqXdEaGD.primaryColor);
document.documentElement._gEtkBKUj.setProperty('--primary-hover', _FvodDaJF(_bqXdEaGD.primaryColor, -0.1));
document.documentElement._gEtkBKUj.setProperty('--primary-gradient-start', _FvodDaJF(_bqXdEaGD.primaryColor, 0.1));
document.documentElement._gEtkBKUj.setProperty('--primary-gradient-end', _FvodDaJF(_bqXdEaGD.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _bqXdEaGD.texts.title;
document.title = _bqXdEaGD.texts.title;
_YXAHBqqR.innerText = _hAWtMiWp ? _bqXdEaGD.texts.loginButtonSuccess : _bqXdEaGD.texts.loginButton;
_YXAHBqqR._gEtkBKUj._LUFIHsQM = _bqXdEaGD.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _bqXdEaGD.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _bqXdEaGD.texts.liveTitle;
document.getElementById('liveTitleEl')._gEtkBKUj._LUFIHsQM = _bqXdEaGD.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _bqXdEaGD.texts.cachedTitle;
document.getElementById('cachedTitleEl')._gEtkBKUj._LUFIHsQM = _bqXdEaGD.colors.cachedTitle;
const _MrXrayUD = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_MrXrayUD.forEach((_gedYxsnY, _bThmJDBf) => {
const _stchrsAO = document.getElementById(_gedYxsnY);
if (_stchrsAO) _stchrsAO.innerText = _bqXdEaGD.texts[`tableHeader${_bThmJDBf + 1}`] || '';
});
const _gMaQmEps = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_gMaQmEps.forEach((_gedYxsnY, _bThmJDBf) => {
const _stchrsAO = document.getElementById(_gedYxsnY);
if (_stchrsAO) _stchrsAO.innerText = _zsHhIrGQ.texts[`tableHeader${_bThmJDBf + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._gEtkBKUj._LUFIHsQM = _bqXdEaGD.colors.tableHeader);
document._NASaRBLJ.className = '';
document._NASaRBLJ.classList.add(_bqXdEaGD.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_bqXdEaGD.theme)) {
document._NASaRBLJ.classList.add('glassy-components');
}
document._NASaRBLJ._gEtkBKUj.backgroundImage = '';
_citIxwTM();
if (_bqXdEaGD.theme.includes('particles') || _bqXdEaGD.theme.includes('glass')) {
_zMiDsujL(_bqXdEaGD.particleColor);
} else if (_bqXdEaGD.theme.includes('bing')) {
document._NASaRBLJ._gEtkBKUj.backgroundImage = '_WBxWsLce(/bing-wallpaper)';
}
}
function _GPIyHlEQ() {
_hAWtMiWp = null;
if(_oLckNiZt) clearTimeout(_oLckNiZt);
_ZzeNBuZF(_zsHhIrGQ);
_OrOjzkwR("登录已超时,请重新登录。", "warning");
}
async function _CkfpqQXO() {
if (_hAWtMiWp) {
_WZqmncdc();
return;
}
const _IpaVhCmB = prompt('请输入管理员密码:');
if (!_IpaVhCmB) return;
try {
const _EzGySWMr = await fetch('/api/verify-_xWIkKCUl', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _xWIkKCUl: _IpaVhCmB })
});
const _DBZczRpA = await _EzGySWMr.json();
if (_DBZczRpA.success) {
_hAWtMiWp = _IpaVhCmB;
_OrOjzkwR("登录成功!有效期5分钟。", "success");
if (_oLckNiZt) clearTimeout(_oLckNiZt);
_oLckNiZt = setTimeout(_GPIyHlEQ, 5 * 60 * 1000);
_ZzeNBuZF(_zsHhIrGQ);
_WZqmncdc();
} else {
throw new Error(_DBZczRpA._xvLdNrRt || '密码验证失败');
}
} catch (_ihmuSeCY) {
_OrOjzkwR(`登录失败: ${_ihmuSeCY._xvLdNrRt}`, "error");
}
}
function _DQcTCrrT() {
if (!_utSfiRkT._QIzpyIgt) {
_QBxPETJl._gEtkBKUj.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _xWIkKCUl = document.getElementById('initialPassword')._ViCRDXVJ;
const _hsMqzyua = document.getElementById('confirmPassword')._ViCRDXVJ;
if (_xWIkKCUl !== _hsMqzyua) {
_OrOjzkwR("两次输入的密码不一致!", "error");
return;
}
if (_xWIkKCUl._VzbZAVZK < 6) {
_OrOjzkwR("密码长度不能少于6位!", "error");
return;
}
try {
const _EzGySWMr = await fetch('/api/_iKCOXGYB-_xWIkKCUl', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _xWIkKCUl })
});
const _DBZczRpA = await _EzGySWMr.json();
if (_DBZczRpA.success) {
_OrOjzkwR(_DBZczRpA._xvLdNrRt, "success");
setTimeout(() => _qCXEEtLZ.reload(), 1500);
} else {
throw new Error(_DBZczRpA._xvLdNrRt);
}
} catch(_ihmuSeCY) {
_OrOjzkwR(`设置密码失败: ${_ihmuSeCY._xvLdNrRt}`, "error");
}
});
return;
}
_YXAHBqqR.addEventListener('click', _CkfpqQXO);
document.getElementById('closeModalBtn').addEventListener('click', () => { _oPfwWXOK._gEtkBKUj.display = 'none'; });
_oPfwWXOK.addEventListener('click', (_ihmuSeCY) => { if (_ihmuSeCY.target === _oPfwWXOK) _oPfwWXOK._gEtkBKUj.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_xyrsWzvp .fine-grained-_zcoVhPvl-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-_xyrsWzvp .fine-grained-_zcoVhPvl-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_hAWtMiWp) {
_OrOjzkwR("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _lWxPQvao = [];
document.querySelectorAll('#custom-fields-_xyrsWzvp .custom-field-_CCrWSmdD').forEach(_CCrWSmdD => {
const _pHMeiQGu = _CCrWSmdD.querySelector('.custom-field-_pHMeiQGu')._ViCRDXVJ.trim();
const _ViCRDXVJ = _CCrWSmdD.querySelector('.custom-field-_ViCRDXVJ')._ViCRDXVJ.trim();
if (_pHMeiQGu) _lWxPQvao.push({ _pHMeiQGu, _ViCRDXVJ });
});
const _XNgbBXOm = [];
document.querySelectorAll('#parameter-sets-_xyrsWzvp .parameter-_iKCOXGYB-_CCrWSmdD').forEach(_CCrWSmdD => {
const _pHMeiQGu = _CCrWSmdD.querySelector('.param-_iKCOXGYB-_pHMeiQGu')._ViCRDXVJ.trim();
const _iChlzsDV = _CCrWSmdD.querySelector('.param-_iKCOXGYB-_iChlzsDV')._ViCRDXVJ.trim();
const _ixKozrHV = _CCrWSmdD.querySelector('.param-_iKCOXGYB-_ixKozrHV')._ViCRDXVJ.trim();
const _ecEuGPbn = _CCrWSmdD.querySelector('.param-_iKCOXGYB-_ecEuGPbn')._ViCRDXVJ.trim();
if(_pHMeiQGu) _XNgbBXOm.push({ _pHMeiQGu, _iChlzsDV, '_ixKozrHV': _ixKozrHV, _ecEuGPbn });
});
const _haikEPme = [];
document.querySelectorAll('#fine-grained-sources-_xyrsWzvp .fine-grained-_wVUcSFFC-_CCrWSmdD').forEach(_CCrWSmdD => {
const _qCXEEtLZ = _CCrWSmdD.querySelector('.fine-grained-_qCXEEtLZ')._ViCRDXVJ.trim();
const _nqXlZVuN = _CCrWSmdD.querySelector('.fine-grained-_nqXlZVuN')._ViCRDXVJ.trim();
const _zcoVhPvl = _CCrWSmdD.querySelector('.fine-grained-_zcoVhPvl-cb').checked;
const _WjacPuaj = parseInt(_CCrWSmdD.querySelector('.fine-grained-_WjacPuaj')._ViCRDXVJ, 10) || 0;
const _jFDXHXry = _CCrWSmdD.querySelector('.use-_pHMeiQGu-as-_qCXEEtLZ-cb').checked;
if (_qCXEEtLZ && _nqXlZVuN) {
_haikEPme.push({ _qCXEEtLZ, _nqXlZVuN, _zcoVhPvl, _WjacPuaj, _jFDXHXry });
}
});
let _ODBlVZer = parseInt(document.getElementById('subscriptionIdLength')._ViCRDXVJ, 10);
if (isNaN(_ODBlVZer) || _ODBlVZer < 2) _ODBlVZer = 2;
if (_ODBlVZer > 128) _ODBlVZer = 128;
const _gmBSrQFF = {
theme: document.getElementById('themeSelect')._ViCRDXVJ,
primaryColor: document.getElementById('primaryColorInput')._ViCRDXVJ,
particleColor: document.getElementById('particleColorInput')._ViCRDXVJ,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._ViCRDXVJ,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._ViCRDXVJ, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._ViCRDXVJ, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._ViCRDXVJ, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._ViCRDXVJ, 10) || 0,
_TjMQLPgJ: document.getElementById('converterServiceUrlInput')._ViCRDXVJ.trim(),
subscriptionId: {
_VzbZAVZK: _ODBlVZer,
_SkLfcbIT: document.getElementById('subscriptionIdCharset')._ViCRDXVJ.trim()
},
api: {
_zcoVhPvl: document.getElementById('enableApiCheckbox').checked,
_xvLdNrRt: document.getElementById('apiMessageInput')._ViCRDXVJ || '维护中...',
},
ispFilter: {
_zcoVhPvl: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._ViCRDXVJ, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_zcoVhPvl: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_zcoVhPvl: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_WBxWsLce: document.getElementById('websocketStreamerUrlInput')._ViCRDXVJ.trim()
},
visitorPassword: {
_zcoVhPvl: document.getElementById('enableVisitorPasswordCheckbox').checked,
_xWIkKCUl: document.getElementById('visitorPasswordInput')._ViCRDXVJ.trim()
},
customSubPath: {
_zcoVhPvl: document.getElementById('enableCustomSubPathCheckbox').checked,
_ecEuGPbn: document.getElementById('customSubPathInput')._ViCRDXVJ.trim()
},
itemLink: {
_zcoVhPvl: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._ViCRDXVJ,
selectionMode: document.getElementById('parameterSelectionMode')._ViCRDXVJ,
_XNgbBXOm: _XNgbBXOm,
_lWxPQvao: _lWxPQvao,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._ViCRDXVJ.trim(),
},
announcement: {
popup: {
_zcoVhPvl: document.getElementById('enablePopup').checked,
_yFIhxubJ: document.getElementById('announcementText')._ViCRDXVJ,
_KqpJXWdB: parseInt(document.getElementById('popupDuration')._ViCRDXVJ, 10) || 5
},
marquee: {
_zcoVhPvl: document.getElementById('enableMarquee').checked,
_yFIhxubJ: document.getElementById('announcementText')._ViCRDXVJ
}
},
fineGrained: {
_zcoVhPvl: true,
sources: _haikEPme
},
customNodes: {
_zcoVhPvl: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._ViCRDXVJ
},
texts: {
title: document.getElementById('textInput_title')._ViCRDXVJ,
loginButton: document.getElementById('textInput_loginButton')._ViCRDXVJ,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._ViCRDXVJ,
liveTitle: document.getElementById('textInput_liveTitle')._ViCRDXVJ,
cachedTitle: document.getElementById('textInput_cachedTitle')._ViCRDXVJ,
},
colors: {
title: document.getElementById('colorInput_title')._ViCRDXVJ,
loginButton: document.getElementById('colorInput_loginButton')._ViCRDXVJ,
liveTitle: document.getElementById('colorInput_liveTitle')._ViCRDXVJ,
cachedTitle: document.getElementById('colorInput_cachedTitle')._ViCRDXVJ,
tableHeader: document.getElementById('colorInput_tableHeader')._ViCRDXVJ,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._ViCRDXVJ.trim(),
chat_id: document.getElementById('chatIdInput')._ViCRDXVJ.trim(),
},
};
try {
const _EzGySWMr = await fetch('/api/_WESbZvhD', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _WESbZvhD: _gmBSrQFF, adminPassword: _hAWtMiWp })
});
const _DBZczRpA = await _EzGySWMr.json();
if (_EzGySWMr.ok && _DBZczRpA.success) {
_OrOjzkwR("配置已保存,正在刷新...", "success");
setTimeout(() => _qCXEEtLZ.reload(), 1500);
} else {
throw new Error(_DBZczRpA._xvLdNrRt || '未知错误');
}
} catch (_ihmuSeCY) {
_OrOjzkwR(`操作失败: ${_ihmuSeCY._xvLdNrRt}`, "error");
if (String(_ihmuSeCY._xvLdNrRt).includes("密码错误")) {
_GPIyHlEQ();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _nAkdMhfE = document.getElementById('oldPasswordInput')._ViCRDXVJ;
const _OUmtQeRY = document.getElementById('newPasswordInput')._ViCRDXVJ;
if (!_nAkdMhfE || !_OUmtQeRY) {
_OrOjzkwR("新旧密码均不能为空!", "error");
return;
}
try {
const _EzGySWMr = await fetch('/api/change-_xWIkKCUl', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _nAkdMhfE, _OUmtQeRY })
});
const _DBZczRpA = await _EzGySWMr.json();
if (_DBZczRpA.success) {
_OrOjzkwR(_DBZczRpA._xvLdNrRt, "success");
document.getElementById('oldPasswordInput')._ViCRDXVJ = '';
document.getElementById('newPasswordInput')._ViCRDXVJ = '';
_hAWtMiWp = _OUmtQeRY;
} else {
throw new Error(_DBZczRpA._xvLdNrRt);
}
} catch(_ihmuSeCY) {
_OrOjzkwR(`修改密码失败: ${_ihmuSeCY._xvLdNrRt}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('resolvedDomainsGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('customNodesGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('apiConfigGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('itemLinkConfigGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('websocketStreamerGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
const _yRLeOXeV = document.querySelector('#parameter-sets-_xyrsWzvp .param-_iKCOXGYB-_ecEuGPbn');
if (_yRLeOXeV) {
if (_ihmuSeCY.target.checked) {
_yRLeOXeV._ViCRDXVJ = '/snippets?_TWWqORpV=endpointAddress:_XxjBwSyN(443)&nat64=6to4';
} else {
_yRLeOXeV._ViCRDXVJ = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_PVvhZzPD('', '');
});
document.getElementById('add-parameter-_iKCOXGYB-btn').addEventListener('click', () => {
const _oDHXXlXP = document.querySelectorAll('.parameter-_iKCOXGYB-_CCrWSmdD')._VzbZAVZK + 1;
_zvNJxPgg({_pHMeiQGu: `配置${_oDHXXlXP}`, _iChlzsDV: '', _ixKozrHV: '', _ecEuGPbn: ''});
_bbBamYJy();
});
document.getElementById('add-fine-grained-_wVUcSFFC-btn').addEventListener('click', () => {
_lMDwCVwT({ _qCXEEtLZ: '', _nqXlZVuN: '', _zcoVhPvl: true, _WjacPuaj: 50, _jFDXHXry: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('visitorPasswordGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('customSubPathGroup')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_ihmuSeCY) => {
document.getElementById('popupDurationContainer')._gEtkBKUj.display = _ihmuSeCY.target.checked ? 'flex' : 'none';
});
}
function _PVvhZzPD(_pHMeiQGu, _ViCRDXVJ) {
const _xyrsWzvp = document.getElementById('custom-fields-_xyrsWzvp');
const _SIoMGcGw = document.createElement('div');
_SIoMGcGw.className = 'form-grid custom-field-_CCrWSmdD';
_SIoMGcGw._gEtkBKUj = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_SIoMGcGw.innerHTML = `
<input _qjyBtKtl="_yFIhxubJ" class="custom-field-_pHMeiQGu" _WhrlDTvF="占位符名称" _ViCRDXVJ="${_pHMeiQGu}">
<input _qjyBtKtl="_yFIhxubJ" class="custom-field-_ViCRDXVJ" _WhrlDTvF="值" _ViCRDXVJ="${_ViCRDXVJ}">
<button _qjyBtKtl="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_xyrsWzvp.appendChild(_SIoMGcGw);
}
function _zvNJxPgg(_iKCOXGYB) {
const _xyrsWzvp = document.getElementById('parameter-sets-_xyrsWzvp');
const _SIoMGcGw = document.createElement('div');
_SIoMGcGw.className = 'parameter-_iKCOXGYB-_CCrWSmdD';
_SIoMGcGw.innerHTML = `
<div class="parameter-_iKCOXGYB-_ekwPpFZY">
<input _qjyBtKtl="_yFIhxubJ" class="param-_iKCOXGYB-_pHMeiQGu" _WhrlDTvF="配置名称" _ViCRDXVJ="${_iKCOXGYB._pHMeiQGu}" oninput="_bbBamYJy()">
<button _qjyBtKtl="button" class="btn btn-outline" onclick="this.closest('.parameter-_iKCOXGYB-_CCrWSmdD').remove(); _bbBamYJy();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" class="param-_iKCOXGYB-_iChlzsDV" _ViCRDXVJ="${_iKCOXGYB._iChlzsDV || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" class="param-_iKCOXGYB-_ixKozrHV" _ViCRDXVJ="${_iKCOXGYB['_ixKozrHV'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _qjyBtKtl="_yFIhxubJ" class="param-_iKCOXGYB-_ecEuGPbn" _ViCRDXVJ="${_iKCOXGYB._ecEuGPbn || ''}"></div>
</div>
`;
_xyrsWzvp.appendChild(_SIoMGcGw);
}
function _bbBamYJy() {
const _uNTOROlS = document.getElementById('parameterSelectionMode');
const _dMbDjdSy = _uNTOROlS._ViCRDXVJ;
_uNTOROlS.innerHTML = '';
const _jQnSSkxJ = document.createElement('_fMiaeJyk');
_jQnSSkxJ._ViCRDXVJ = 'random';
_jQnSSkxJ.textContent = '随机轮询';
_uNTOROlS.appendChild(_jQnSSkxJ);
const _dBjFVZUL = document.createElement('_fMiaeJyk');
_dBjFVZUL._ViCRDXVJ = 'first';
_dBjFVZUL.textContent = '使用第一组';
_uNTOROlS.appendChild(_dBjFVZUL);
document.querySelectorAll('.param-_iKCOXGYB-_pHMeiQGu').forEach(input => {
const _pHMeiQGu = input._ViCRDXVJ.trim();
if (_pHMeiQGu) {
const _fMiaeJyk = document.createElement('_fMiaeJyk');
_fMiaeJyk._ViCRDXVJ = _pHMeiQGu;
_fMiaeJyk.textContent = `指定: ${_pHMeiQGu}`;
_uNTOROlS.appendChild(_fMiaeJyk);
}
});
if (Array.from(_uNTOROlS.options).some(opt => opt._ViCRDXVJ === _dMbDjdSy)) {
_uNTOROlS._ViCRDXVJ = _dMbDjdSy;
} else {
_uNTOROlS._ViCRDXVJ = 'random';
}
}
function _lMDwCVwT(_wVUcSFFC) {
const _xyrsWzvp = document.getElementById('fine-grained-sources-_xyrsWzvp');
const _SIoMGcGw = document.createElement('div');
_SIoMGcGw.className = 'fine-grained-_wVUcSFFC-_CCrWSmdD parameter-_iKCOXGYB-_CCrWSmdD';
_SIoMGcGw._gEtkBKUj.padding = '1rem';
const _TOMsJjUV = _wVUcSFFC._jFDXHXry ? 'checked' : '';
const _yoxmbyTd = !_wVUcSFFC._jFDXHXry ? 'checked' : '';
const _YhMtaCpi = _wVUcSFFC._zcoVhPvl ? 'checked' : '';
_SIoMGcGw.innerHTML = `
<div _gEtkBKUj="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _qjyBtKtl="_yFIhxubJ" class="fine-grained-_qCXEEtLZ" _WhrlDTvF="地区名称 (如: 香港)" _ViCRDXVJ="${_wVUcSFFC._qCXEEtLZ || ''}">
<div _gEtkBKUj="display: flex; align-items: center; gap: 5px;"><input _qjyBtKtl="checkbox" class="fine-grained-_zcoVhPvl-cb" ${_YhMtaCpi}><label>启用</label></div>
<button _qjyBtKtl="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_wVUcSFFC-_CCrWSmdD').remove()">删除</button>
</div>
<textarea class="fine-grained-_nqXlZVuN" _WhrlDTvF="IP源 (每行一个IP、CIDR或URL)" _hbvPkxIv="3" _gEtkBKUj="_SJAlVhUz:100%;">${_wVUcSFFC._nqXlZVuN || ''}</textarea>
<div class="fine-grained-options" _gEtkBKUj="justify-_ynhHhReX: space-between;">
<div _gEtkBKUj="display: flex; gap: 1rem;">
<label><input _qjyBtKtl="checkbox" class="query-_eKVKtJiq-cb" ${_yoxmbyTd}>查询真实归属地</label>
<label><input _qjyBtKtl="checkbox" class="use-_pHMeiQGu-as-_qCXEEtLZ-cb" ${_TOMsJjUV}>使用地区名称作为归属地</label>
</div>
<div _gEtkBKUj="display: flex; align-items: center; gap: 5px;"><input _qjyBtKtl="number" class="fine-grained-_WjacPuaj _WjacPuaj-input" _ViCRDXVJ="${_wVUcSFFC._WjacPuaj || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _XMWgsEkO = _SIoMGcGw.querySelector('.query-_eKVKtJiq-cb');
const _MIbqfdyX = _SIoMGcGw.querySelector('.use-_pHMeiQGu-as-_qCXEEtLZ-cb');
_XMWgsEkO.addEventListener('change', () => {
if (_XMWgsEkO.checked) {
_MIbqfdyX.checked = false;
} else if (!_MIbqfdyX.checked) {
_XMWgsEkO.checked = true;
}
});
_MIbqfdyX.addEventListener('change', () => {
if (_MIbqfdyX.checked) {
_XMWgsEkO.checked = false;
} else if (!_MIbqfdyX.checked) {
_MIbqfdyX.checked = true;
}
});
_xyrsWzvp.appendChild(_SIoMGcGw);
}
function _WZqmncdc() {
const _bqXdEaGD = _zsHhIrGQ;
document.getElementById('themeSelect')._ViCRDXVJ = _bqXdEaGD.theme;
document.getElementById('primaryColorInput')._ViCRDXVJ = _bqXdEaGD.primaryColor;
document.getElementById('particleColorInput')._ViCRDXVJ = _bqXdEaGD.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _bqXdEaGD.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._WhrlDTvF = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._ViCRDXVJ = _bqXdEaGD.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._gEtkBKUj.display = _bqXdEaGD.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _bqXdEaGD.customNodes._zcoVhPvl;
document.getElementById('customNodesInput')._ViCRDXVJ = _bqXdEaGD.customNodes.list || '';
document.getElementById('customNodesGroup')._gEtkBKUj.display = _bqXdEaGD.customNodes._zcoVhPvl ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._ViCRDXVJ = _bqXdEaGD._TjMQLPgJ || '';
document.getElementById('subscriptionIdLength')._ViCRDXVJ = _bqXdEaGD.subscriptionId._VzbZAVZK;
document.getElementById('subscriptionIdCharset')._ViCRDXVJ = _bqXdEaGD.subscriptionId._SkLfcbIT;
document.getElementById('enableItemLinkCheckbox').checked = _bqXdEaGD.itemLink._zcoVhPvl;
document.getElementById('itemLinkConfigGroup')._gEtkBKUj.display = _bqXdEaGD.itemLink._zcoVhPvl ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._ViCRDXVJ = _bqXdEaGD.itemLink.template;
const _VNlPoWAz = document.getElementById('parameter-sets-_xyrsWzvp');
_VNlPoWAz.innerHTML = '';
if (_bqXdEaGD.itemLink._XNgbBXOm && Array.isArray(_bqXdEaGD.itemLink._XNgbBXOm)) {
_bqXdEaGD.itemLink._XNgbBXOm.forEach(_iKCOXGYB => _zvNJxPgg(_iKCOXGYB));
}
_bbBamYJy();
document.getElementById('parameterSelectionMode')._ViCRDXVJ = _bqXdEaGD.itemLink.selectionMode || 'random';
const _yRLeOXeV = document.querySelector('#parameter-sets-_xyrsWzvp .param-_iKCOXGYB-_ecEuGPbn');
if (_yRLeOXeV && _bqXdEaGD.websocketStreamer && _bqXdEaGD.websocketStreamer._zcoVhPvl) {
_yRLeOXeV._ViCRDXVJ = '/snippets?_TWWqORpV=endpointAddress:_XxjBwSyN(443)&nat64=6to4';
}
const _uVAmodAT = document.getElementById('custom-fields-_xyrsWzvp');
_uVAmodAT.innerHTML = '';
if (_bqXdEaGD.itemLink._lWxPQvao && Array.isArray(_bqXdEaGD.itemLink._lWxPQvao)) {
_bqXdEaGD.itemLink._lWxPQvao.forEach(field => _PVvhZzPD(field._pHMeiQGu, field._ViCRDXVJ));
}
document.getElementById('universalFallbackAddressInput')._ViCRDXVJ = _bqXdEaGD.dataFeeds.universalFallbackAddress || '';
const _eLfviyRb = _bqXdEaGD.websocketStreamer && _bqXdEaGD.websocketStreamer._zcoVhPvl;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _eLfviyRb;
document.getElementById('websocketStreamerUrlInput')._ViCRDXVJ = _bqXdEaGD.websocketStreamer ? _bqXdEaGD.websocketStreamer._WBxWsLce : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._gEtkBKUj.display = _eLfviyRb ? 'block' : 'none';
const _Vbfankgc = _bqXdEaGD.announcement || {};
document.getElementById('announcementText')._ViCRDXVJ = (_Vbfankgc.popup && _Vbfankgc.popup._yFIhxubJ) || (_Vbfankgc.marquee && _Vbfankgc.marquee._yFIhxubJ) || '';
document.getElementById('enableMarquee').checked = _Vbfankgc.marquee && _Vbfankgc.marquee._zcoVhPvl;
document.getElementById('enablePopup').checked = _Vbfankgc.popup && _Vbfankgc.popup._zcoVhPvl;
document.getElementById('popupDuration')._ViCRDXVJ = (_Vbfankgc.popup && _Vbfankgc.popup._KqpJXWdB) || 5;
document.getElementById('popupDurationContainer')._gEtkBKUj.display = (_Vbfankgc.popup && _Vbfankgc.popup._zcoVhPvl) ? 'flex' : 'none';
const _aYAyMTUq = document.getElementById('fine-grained-sources-_xyrsWzvp');
_aYAyMTUq.innerHTML = '';
if (_bqXdEaGD.fineGrained.sources && Array.isArray(_bqXdEaGD.fineGrained.sources)) {
_bqXdEaGD.fineGrained.sources.forEach(_wVUcSFFC => _lMDwCVwT(_wVUcSFFC));
}
document.getElementById('sampleSizeInput')._ViCRDXVJ = _bqXdEaGD.sampleSize;
document.getElementById('topNInput')._ViCRDXVJ = _bqXdEaGD.topN;
document.getElementById('latencyRangeMinInput')._ViCRDXVJ = _bqXdEaGD.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._ViCRDXVJ = _bqXdEaGD.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _bqXdEaGD.ispFilter._zcoVhPvl;
const _YNzxlnnR = _bqXdEaGD.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._ViCRDXVJ = _YNzxlnnR.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _YNzxlnnR.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _bqXdEaGD.streamer._zcoVhPvl;
document.getElementById('enableApiCheckbox').checked = _bqXdEaGD.api._zcoVhPvl;
document.getElementById('apiConfigGroup')._gEtkBKUj.display = _bqXdEaGD.api._zcoVhPvl ? 'block' : 'none';
document.getElementById('apiMessageInput')._ViCRDXVJ = _bqXdEaGD.api._xvLdNrRt;
const _AKhUuDKr = _bqXdEaGD.customSubPath && _bqXdEaGD.customSubPath._zcoVhPvl;
document.getElementById('enableCustomSubPathCheckbox').checked = _AKhUuDKr;
document.getElementById('customSubPathInput')._ViCRDXVJ = _bqXdEaGD.customSubPath ? _bqXdEaGD.customSubPath._ecEuGPbn : 'latest';
document.getElementById('customSubPathGroup')._gEtkBKUj.display = _AKhUuDKr ? 'block' : 'none';
const _YcqXFXjK = _bqXdEaGD.visitorPassword && _bqXdEaGD.visitorPassword._zcoVhPvl;
document.getElementById('enableVisitorPasswordCheckbox').checked = _YcqXFXjK;
document.getElementById('visitorPasswordInput')._ViCRDXVJ = _bqXdEaGD.visitorPassword ? _bqXdEaGD.visitorPassword._xWIkKCUl : '';
document.getElementById('visitorPasswordGroup')._gEtkBKUj.display = _YcqXFXjK ? 'block' : 'none';
document.getElementById('textInput_title')._ViCRDXVJ = _bqXdEaGD.texts.title;
document.getElementById('textInput_loginButton')._ViCRDXVJ = _bqXdEaGD.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._ViCRDXVJ = _bqXdEaGD.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._ViCRDXVJ = _bqXdEaGD.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._ViCRDXVJ = _bqXdEaGD.texts.cachedTitle;
document.getElementById('colorInput_title')._ViCRDXVJ = _bqXdEaGD.colors.title;
document.getElementById('colorInput_loginButton')._ViCRDXVJ = _bqXdEaGD.colors.loginButton;
document.getElementById('colorInput_liveTitle')._ViCRDXVJ = _bqXdEaGD.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._ViCRDXVJ = _bqXdEaGD.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._ViCRDXVJ = _bqXdEaGD.colors.tableHeader;
document.getElementById('botTokenInput')._ViCRDXVJ = _bqXdEaGD.telegram.bot_token || '';
document.getElementById('chatIdInput')._ViCRDXVJ = _bqXdEaGD.telegram.chat_id || '';
_oPfwWXOK._gEtkBKUj.display = 'flex';
}
function _pTfkXTvz(_AnapYyNJ) {
if (window.innerWidth <= 768) {
const _hbvPkxIv = _AnapYyNJ.querySelectorAll('thead tr, tbody tr');
_hbvPkxIv.forEach(_CCrWSmdD => {
const _jvZOcwCY = Array.from(_CCrWSmdD.children);
const _FJtuQHLD = [
_jvZOcwCY[0],
_jvZOcwCY[1],
_jvZOcwCY[3],
_jvZOcwCY[6],
_jvZOcwCY[2],
_jvZOcwCY[4],
_jvZOcwCY[5]
];
_FJtuQHLD.forEach(cell => _CCrWSmdD.appendChild(cell));
});
}
}
async function _txedwUhU() {
if (!_utSfiRkT._QIzpyIgt) {
_DQcTCrrT();
return;
}
if (_zsHhIrGQ.announcement && _zsHhIrGQ.announcement.marquee && _zsHhIrGQ.announcement.marquee._zcoVhPvl && _zsHhIrGQ.announcement.marquee._yFIhxubJ) {
const _QwuocBhe = document.getElementById('marquee-_xyrsWzvp');
const _VREuxTtd = document.getElementById('marquee-_yFIhxubJ');
const _SpnnewpI = document.querySelector('.progress-section');
if (_QwuocBhe && _VREuxTtd && _SpnnewpI) {
_VREuxTtd.innerText = _zsHhIrGQ.announcement.marquee._yFIhxubJ;
_QwuocBhe._gEtkBKUj.display = 'block';
const _GuSMWJAR = () => {
_QwuocBhe._gEtkBKUj._SJAlVhUz = `${_SpnnewpI.offsetWidth}px`;
const _sQppweVM = _VREuxTtd.offsetWidth;
const _RgpXJlsO = _QwuocBhe.offsetWidth;
const _KqpJXWdB = (_sQppweVM + _RgpXJlsO) / 100;
_VREuxTtd._gEtkBKUj.animationDuration = `${Math.max(10, _KqpJXWdB)}s`;
};
_GuSMWJAR();
window.addEventListener('resize', _GuSMWJAR);
}
}
_ZzeNBuZF(_zsHhIrGQ);
if (_zsHhIrGQ.announcement && _zsHhIrGQ.announcement.popup && _zsHhIrGQ.announcement.popup._zcoVhPvl && _zsHhIrGQ.announcement.popup._yFIhxubJ) {
setTimeout(() => {
_OrOjzkwR(_zsHhIrGQ.announcement.popup._yFIhxubJ, 'info', _zsHhIrGQ.announcement.popup._KqpJXWdB * 1000);
}, 500);
}
_DQcTCrrT();
_pgkfcKzz();
_PdzDVXRO();
_xZjOkbqX();
await _DUBAPwgq();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _CKpKGGzt = window._qCXEEtLZ.origin + '/_TWWqORpV';
navigator.clipboard.writeText(_CKpKGGzt).then(() => {
_OrOjzkwR('IP 列表 API 地址已复制!', 'success');
});
});
if (_zsHhIrGQ.visitorPassword && _zsHhIrGQ.visitorPassword._zcoVhPvl) {
_mTODbzTX._gEtkBKUj.display = 'none';
const _RiUGNaNW = document.getElementById('visitorPasswordPrompt');
_RiUGNaNW._gEtkBKUj.display = 'block';
const _wsEKaFTr = document.getElementById('visitorPasswordEntry');
const _jtaQSbGe = document.getElementById('startTestWithPasswordBtn');
const _rvFAoZbp = async () => {
const _xWIkKCUl = _wsEKaFTr._ViCRDXVJ;
if (!_xWIkKCUl) {
_OrOjzkwR('请输入访客密码', 'warning');
return;
}
try {
const _EzGySWMr = await fetch('/api/verify-visitor-_xWIkKCUl', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _xWIkKCUl })
});
const _DBZczRpA = await _EzGySWMr.json();
if (_EzGySWMr.ok && _DBZczRpA.success) {
_OrOjzkwR('验证成功,开始测试...', 'success');
_RiUGNaNW._gEtkBKUj.display = 'none';
_mTODbzTX._gEtkBKUj.display = 'block';
await _saLMEzUN();
} else {
throw new Error(_DBZczRpA._xvLdNrRt || '密码错误');
}
} catch (_ihmuSeCY) {
_OrOjzkwR(`验证失败: ${_ihmuSeCY._xvLdNrRt}`, "error");
_wsEKaFTr._ViCRDXVJ = '';
_wsEKaFTr.focus();
}
};
_jtaQSbGe.addEventListener('click', _rvFAoZbp);
_wsEKaFTr.addEventListener('keypress', (_ihmuSeCY) => {
if (_ihmuSeCY._tIEdrzZp === 'Enter') {
_ihmuSeCY.preventDefault();
_rvFAoZbp();
}
});
_wsEKaFTr.focus();
} else {
_yOVqvZIQ.textContent = "页面加载完成,准备开始测试...";
await _mdfSqoTM(100);
await _saLMEzUN();
}
}
async function _mdfSqoTM(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _OLtFepGa(_xWaWhfay) {
let _DBZczRpA = /^#?([a-_JcuyzAlQ\d]{2})([a-_JcuyzAlQ\d]{2})([a-_JcuyzAlQ\d]{2})$/_RDVGkaJL.exec(_xWaWhfay);
return _DBZczRpA ? { r: parseInt(_DBZczRpA[1], 16), g: parseInt(_DBZczRpA[2], 16), b: parseInt(_DBZczRpA[3], 16) } : null;
}
async function _tEUzAAee(_TWWqORpV) {
const _HJhpepxf = new AbortController();
const _iiDcFgqJ = setTimeout(() => _HJhpepxf.abort(), _HqFeOEby);
const _xplYrvJH = Date.now();
try {
const _yTxlRGGE = _LKaCMoPc.isIPv6(_TWWqORpV) ? `[${_TWWqORpV}]` : _TWWqORpV;
const _WBxWsLce = `https://${_yTxlRGGE}/cdn-cgi/trace`;
await fetch(_WBxWsLce, {
signal: _HJhpepxf.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._pHMeiQGu === 'AbortError') {
return { _TWWqORpV, _eqlxpEGw: Infinity, error: '超时' };
}
} finally {
clearTimeout(_iiDcFgqJ);
}
const _eqlxpEGw = Date.now() - _xplYrvJH;
return { _TWWqORpV, _eqlxpEGw: _eqlxpEGw, error: null };
}
function _maEheOMy(_DBZczRpA, _bThmJDBf) {
const { itemLink } = _zsHhIrGQ;
if (!itemLink || !itemLink._zcoVhPvl) return null;
const { template, _XNgbBXOm, selectionMode, _lWxPQvao } = itemLink;
if (!_XNgbBXOm || _XNgbBXOm._VzbZAVZK === 0) return null;
let _jEMKcThJ;
if (selectionMode === 'random') {
_jEMKcThJ = _XNgbBXOm[_bThmJDBf % _XNgbBXOm._VzbZAVZK];
} else if (selectionMode === 'first') {
_jEMKcThJ = _XNgbBXOm[0];
} else {
_jEMKcThJ = _XNgbBXOm.find(s => s._pHMeiQGu === selectionMode) || _XNgbBXOm[0];
}
if (!_jEMKcThJ) return null;
let _GBvxAWEq = template;
const _qBnsmvYt = _DBZczRpA._XxjBwSyN || 443;
const _GXJQsHBa = _LKaCMoPc.isIPv6(_DBZczRpA._TWWqORpV) ? `[${_DBZczRpA._TWWqORpV}]` : _DBZczRpA._TWWqORpV;
let _pHMeiQGu = `${_bThmJDBf + 1} 、 ${_DBZczRpA._qCXEEtLZ || '未知'}`;
if (!_DBZczRpA._TkczDSyy || !_DBZczRpA._TkczDSyy.toLowerCase().includes('cloudflare')) {
_pHMeiQGu += '(反代)';
}
let _iChlzsDV = _jEMKcThJ._iChlzsDV || window._qCXEEtLZ._ojguLzTW;
_GBvxAWEq = _GBvxAWEq.replace(/{_TWWqORpV}/g, _GXJQsHBa)
.replace(/{_XxjBwSyN}/g, _qBnsmvYt)
.replace(/{_pHMeiQGu}/g, encodeURIComponent(_pHMeiQGu))
.replace(/{rank}/g, _bThmJDBf + 1)
.replace(/{_qCXEEtLZ}/g, encodeURIComponent(_DBZczRpA._qCXEEtLZ || '未知'))
.replace(/{_TkczDSyy}/g, encodeURIComponent(_DBZczRpA._TkczDSyy || '未知'))
.replace(/{_iChlzsDV}/g, encodeURIComponent(_iChlzsDV))
.replace(/{_ixKozrHV}/g, encodeURIComponent(_jEMKcThJ['_ixKozrHV'] || ''))
.replace(/{_ecEuGPbn}/g, encodeURIComponent(encodeURIComponent(_jEMKcThJ._ecEuGPbn || '')));
if (_lWxPQvao) {
_lWxPQvao.forEach(field => {
const _WhrlDTvF = new RegExp('{' + field._pHMeiQGu + '}', 'g');
_GBvxAWEq = _GBvxAWEq.replace(_WhrlDTvF, encodeURIComponent(field._ViCRDXVJ));
});
}
return _GBvxAWEq;
}
function _hHnUAyEO(_FuHKZKqH, _ihjsKIRM, isCached = false) {
_ihjsKIRM.innerHTML = '';
const _GrnHmtMN = _FuHKZKqH._GrnHmtMN || [];
const _SuUfIdyq = _FuHKZKqH.generatedBy || null;
const _QPwZAcCr = isCached ? _ktGTCMbR : _vlzXIfWv;
const _VegdQKPh = isCached ? (_ktGTCMbR.querySelector('.generator-info')) : (_vlzXIfWv.querySelector('.generator-info'));
if (_GrnHmtMN._VzbZAVZK === 0) {
_QPwZAcCr._gEtkBKUj.display = 'none';
if (!isCached) _UsrUpPIT._gEtkBKUj.display = 'none';
if (_VegdQKPh) _VegdQKPh.textContent = '';
return;
}
_QPwZAcCr._gEtkBKUj.display = 'block';
if (!isCached && _GrnHmtMN._VzbZAVZK > 0) {
_UsrUpPIT._gEtkBKUj.display = 'block';
}
if (_VegdQKPh && _SuUfIdyq) {
_VegdQKPh.innerHTML = `数据来源 ${_SuUfIdyq._TWWqORpV} (${_SuUfIdyq._qCXEEtLZ}) <span>${_SuUfIdyq.time}</span>`;
}
_GrnHmtMN.forEach((_DBZczRpA, _bThmJDBf) => {
const _qBnsmvYt = _DBZczRpA._XxjBwSyN || 443;
const _CCrWSmdD = _ihjsKIRM.insertRow();
_CCrWSmdD.insertCell().textContent = _bThmJDBf + 1;
const _fViDcHcI = _CCrWSmdD.insertCell();
_fViDcHcI.textContent = _DBZczRpA._TWWqORpV;
_fViDcHcI.className = '_TWWqORpV-_UhfYSNaq';
_CCrWSmdD.insertCell().textContent = _qBnsmvYt;
const _QAOrTygb = _CCrWSmdD.insertCell();
_QAOrTygb.textContent = (_DBZczRpA._eqlxpEGw === Infinity) ? (_DBZczRpA.error || '错误') : _DBZczRpA._eqlxpEGw;
_QAOrTygb.className = 'ping-_ViCRDXVJ';
_CCrWSmdD.insertCell().textContent = _DBZczRpA._qCXEEtLZ || '未知';
_CCrWSmdD.insertCell().textContent = _DBZczRpA._TkczDSyy || '未知';
const _IfcQgYIN = _CCrWSmdD.insertCell();
_IfcQgYIN.className = 'actions-cell';
const _ZwuOmYTX = document.createElement('button');
_ZwuOmYTX.textContent = '复制IP';
_ZwuOmYTX.className = 'btn btn-outline';
_ZwuOmYTX.onclick = () => { navigator.clipboard.writeText(_DBZczRpA._TWWqORpV).then(() => _OrOjzkwR('IP复制成功!', 'success')); };
if (_zsHhIrGQ.itemLink && _zsHhIrGQ.itemLink._zcoVhPvl) {
const _VeWtHTOF = document.createElement('button');
_VeWtHTOF.textContent = '复制节点';
_VeWtHTOF.className = 'btn btn-outline';
_VeWtHTOF.onclick = () => {
const _GBvxAWEq = _maEheOMy(_DBZczRpA, _bThmJDBf);
if (_GBvxAWEq) {
navigator.clipboard.writeText(_GBvxAWEq).then(() => _OrOjzkwR('订阅链接复制成功!', 'success'));
}
};
_IfcQgYIN.appendChild(_VeWtHTOF);
}
_IfcQgYIN.appendChild(_ZwuOmYTX);
});
_pTfkXTvz(_ihjsKIRM.parentElement);
}
async function _TXNYMfNs(_ADIptZJO) {
const _AABsHDed = (_ADIptZJO || '').trim().split(/\s+|\n+/).filter(Boolean);
const _fQAJXsdJ = [];
const _BYgloaNJ = [];
const _HZutDPfF = (str) => {
try {
const _WBxWsLce = new URL(str);
return _WBxWsLce.protocol === "http:" || _WBxWsLce.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _WErijJpL of _AABsHDed) {
if (_HZutDPfF(_WErijJpL)) {
_fQAJXsdJ.push(_WErijJpL);
} else {
_BYgloaNJ.push(_WErijJpL);
}
}
let _GbtxQQAd = [];
if (_fQAJXsdJ._VzbZAVZK > 0) {
try {
const _EzGySWMr = await fetch('/api/parse-_nqXlZVuN-from-_fQAJXsdJ', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _fQAJXsdJ })
});
if (_EzGySWMr.ok) {
const _FuHKZKqH = await _EzGySWMr.json();
_GbtxQQAd = _FuHKZKqH._nqXlZVuN || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _EzGySWMr._yFIhxubJ());
_OrOjzkwR('从URL获取IP失败', 'error');
}
} catch (_ihmuSeCY) {
console.error('Error fetching IPs from URLs:', _ihmuSeCY);
_OrOjzkwR(`从URL获取IP失败: ${_ihmuSeCY._xvLdNrRt}`, 'error');
}
}
return [..._BYgloaNJ, ..._GbtxQQAd];
}
async function _saLMEzUN() {
_YWDEovLg = false;
_kkowbDrK = [];
_EufOhGlb = null;
_UsrUpPIT._gEtkBKUj.display = 'none';
_yOVqvZIQ.textContent = '准备IP源...';
_fGHsyhzV._ViCRDXVJ = 0;
_vlzXIfWv._gEtkBKUj.display = 'none';
await _mdfSqoTM();
const _LTrJkLUf = new Map();
let _pNGuBNyU = [];
const _IZLwrDvI = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_zsHhIrGQ.useResolvedDomains) {
_yOVqvZIQ.textContent = '正在从域名解析IP...';
const _nZlWBACI = (_zsHhIrGQ.resolvedDomains || '').trim();
const _dpOtjACV = _nZlWBACI ? _nZlWBACI.split(/\s+|\n+/) : _AFanLcaq;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_nqXlZVuN', { method: 'POST', _MrXrayUD: { 'Content-Type': 'application/json' }, _NASaRBLJ: JSON.stringify({ _dpOtjACV, _qjyBtKtl: 'A' }) }),
fetch('/api/get-resolved-_nqXlZVuN', { method: 'POST', _MrXrayUD: { 'Content-Type': 'application/json' }, _NASaRBLJ: JSON.stringify({ _dpOtjACV, _qjyBtKtl: 'AAAA' }) })
]);
let _CfKIWsfy = [];
if (ipv4Response.ok) _CfKIWsfy.push(...(await ipv4Response._yFIhxubJ()).split(/\s+|\n+/));
if (ipv6Response.ok) _CfKIWsfy.push(...(await ipv6Response._yFIhxubJ()).split(/\s+|\n+/));
_pNGuBNyU.push(..._CfKIWsfy.filter(_TWWqORpV => _TWWqORpV.trim()).map(_TWWqORpV => ({ _TWWqORpV, _XxjBwSyN: null, sourceName: 'resolved' })));
} catch (_ihmuSeCY) {
_OrOjzkwR(`域名解析失败: ${_ihmuSeCY._xvLdNrRt}`, 'error');
}
}
const _QUYwIXCM = (_zsHhIrGQ.fineGrained.sources || []).filter(s => s._zcoVhPvl);
if (_QUYwIXCM._VzbZAVZK > 0) {
const _UEtiJghK = {};
let _cXEpYUpy = 0;
_QUYwIXCM.forEach(s => {
const _ocsDoLWD = Number(s._WjacPuaj) || 0;
_UEtiJghK[s._qCXEEtLZ] = _ocsDoLWD;
_cXEpYUpy += _ocsDoLWD;
});
if (_cXEpYUpy > 0) {
Object._olfhOsGb(_UEtiJghK).forEach(k => {
_UEtiJghK[k] = (_UEtiJghK[k] / _cXEpYUpy) * 100;
});
} else {
_QUYwIXCM.forEach(s => _UEtiJghK[s._qCXEEtLZ] = 100 / _QUYwIXCM._VzbZAVZK);
}
const _MmrPIeCJ = _lxkBtDQc(_zsHhIrGQ.sampleSize, _UEtiJghK);
for (const _wVUcSFFC of _QUYwIXCM) {
const _oDHXXlXP = _MmrPIeCJ[_wVUcSFFC._qCXEEtLZ];
if (!_oDHXXlXP) continue;
_yOVqvZIQ.textContent = `正在处理 [ ${_wVUcSFFC._qCXEEtLZ} ] 源...`;
const _GvVZShxc = await _TXNYMfNs(_wVUcSFFC._nqXlZVuN);
if (_wVUcSFFC._jFDXHXry) {
_GvVZShxc.forEach(_WErijJpL => _LTrJkLUf._iKCOXGYB(_WErijJpL, _wVUcSFFC._qCXEEtLZ));
}
let _MpgyfQzN = [];
const _RaSbeTIi = Math.ceil(_oDHXXlXP / (_GvVZShxc._VzbZAVZK || 1)) || 1;
for (const _WErijJpL of _GvVZShxc) {
if (_IZLwrDvI.test(_WErijJpL)) {
const _SxUtecZi = _LKaCMoPc.cidrToRange(_WErijJpL, _RaSbeTIi);
if (_LTrJkLUf.has(_WErijJpL)) {
_SxUtecZi.forEach(_TWWqORpV => _LTrJkLUf._iKCOXGYB(_TWWqORpV, _LTrJkLUf.get(_WErijJpL)));
}
_MpgyfQzN.push(..._SxUtecZi.map(_TWWqORpV => ({ _TWWqORpV, _XxjBwSyN: null })));
} else {
const _EVNMuTfw = _WErijJpL.lastIndexOf(':');
let _TWWqORpV = _WErijJpL;
let _XxjBwSyN = null;
if (_EVNMuTfw > _WErijJpL.lastIndexOf(']')) {
const _nkaAutrI = _WErijJpL.substring(_EVNMuTfw + 1);
if (!isNaN(_nkaAutrI) && _nkaAutrI._VzbZAVZK > 0) {
_TWWqORpV = _WErijJpL.substring(0, _EVNMuTfw);
_XxjBwSyN = _nkaAutrI;
}
}
if (_LKaCMoPc.isValid(_TWWqORpV.replace(/[\[\]]/g, ''))) {
_MpgyfQzN.push({ _TWWqORpV: _TWWqORpV.replace(/[\[\]]/g, ''), _XxjBwSyN });
}
}
}
let _barDELAk = _MpgyfQzN.filter((v,_RDVGkaJL,a)=>a.findIndex(t=>(t._TWWqORpV === v._TWWqORpV && t._XxjBwSyN === v._XxjBwSyN))===_RDVGkaJL);
_barDELAk.sort(() => 0.5 - Math.random());
_pNGuBNyU.push(..._barDELAk.slice(0, _oDHXXlXP).map(_aPXYmTPB => ({ ..._aPXYmTPB, sourceName: `fineGrained-${_wVUcSFFC._qCXEEtLZ}` })));
}
}
if (_pNGuBNyU._VzbZAVZK === 0) {
_yOVqvZIQ.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_yOVqvZIQ.textContent = `开始测试 ${_pNGuBNyU._VzbZAVZK} 个IP地址...`;
_fGHsyhzV.max = _pNGuBNyU._VzbZAVZK;
let _vUrqRbVT = 0;
const _RUbkZnxZ = [];
const _AcUBlizg = [..._pNGuBNyU];
const _kkAKBeWx = async () => {
while (_AcUBlizg._VzbZAVZK > 0) {
const _aPXYmTPB = _AcUBlizg.shift(); if (!_aPXYmTPB) continue;
const _DBZczRpA = await _tEUzAAee(_aPXYmTPB._TWWqORpV);
_RUbkZnxZ.push({ ..._aPXYmTPB, ..._DBZczRpA });
_vUrqRbVT++;
_fGHsyhzV._ViCRDXVJ = _vUrqRbVT;
_yOVqvZIQ.textContent = `${_zsHhIrGQ.texts.pingInProgress} (${_vUrqRbVT}/${_pNGuBNyU._VzbZAVZK}): ${_aPXYmTPB._TWWqORpV} - ${_DBZczRpA._eqlxpEGw === Infinity ? _DBZczRpA.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_RlzQFrXg).fill(null).map(_kkAKBeWx));
let _SNtVCziJ = _RUbkZnxZ.filter(r => r._eqlxpEGw !== Infinity);
let _CQgWCVFQ = [];
const _eYYOhVOf = _SNtVCziJ.filter(r => r.sourceName.startsWith('fineGrained-'));
const _kHHpMtdR = _SNtVCziJ.filter(r => r.sourceName === 'resolved');
if (_eYYOhVOf._VzbZAVZK > 0) {
const _QUYwIXCM = (_zsHhIrGQ.fineGrained.sources || []).filter(s => s._zcoVhPvl);
const _UEtiJghK = {};
let _cXEpYUpy = 0;
_QUYwIXCM.forEach(s => {
const _ocsDoLWD = Number(s._WjacPuaj) || 0;
_UEtiJghK[s._qCXEEtLZ] = _ocsDoLWD;
_cXEpYUpy += _ocsDoLWD;
});
if (_cXEpYUpy > 0) {
Object._olfhOsGb(_UEtiJghK).forEach(k => _UEtiJghK[k] = (_UEtiJghK[k] / _cXEpYUpy) * 100);
} else if (_QUYwIXCM._VzbZAVZK > 0) {
_QUYwIXCM.forEach(s => _UEtiJghK[s._qCXEEtLZ] = 100 / _QUYwIXCM._VzbZAVZK);
}
const _uEXhSxKc = _lxkBtDQc(_zsHhIrGQ.topN, _UEtiJghK);
for(const _gGtzsLqk in _uEXhSxKc) {
const _bGQEdgPT = _eYYOhVOf.filter(r => r.sourceName === `fineGrained-${_gGtzsLqk}`);
_bGQEdgPT.sort((a,b) => a._eqlxpEGw - b._eqlxpEGw);
_CQgWCVFQ.push(..._bGQEdgPT.slice(0, _uEXhSxKc[_gGtzsLqk]));
}
}
_kHHpMtdR.sort((a, b) => a._eqlxpEGw - b._eqlxpEGw);
_CQgWCVFQ.push(..._kHHpMtdR);
if (_CQgWCVFQ._VzbZAVZK > 0) {
_yOVqvZIQ.textContent = '获取归属地和运营商信息...';
const _nEtwltil = [];
_CQgWCVFQ.forEach(_DBZczRpA => {
if (_LTrJkLUf.has(_DBZczRpA._TWWqORpV)) {
_DBZczRpA._qCXEEtLZ = _LTrJkLUf.get(_DBZczRpA._TWWqORpV);
_DBZczRpA._TkczDSyy = 'Cloudflare';
} else {
_nEtwltil.push(_DBZczRpA._TWWqORpV);
}
});
if (_nEtwltil._VzbZAVZK > 0) {
try {
const _SzUzlDcS = await fetch('/api/get-_eKVKtJiq', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _nqXlZVuN: _nEtwltil })
});
if (_SzUzlDcS.ok) {
const _ifjaKrYl = await _SzUzlDcS.json();
const _EWWHGxdf = new Map(_ifjaKrYl.map(_aPXYmTPB => [_aPXYmTPB._TWWqORpV, { _qCXEEtLZ: _aPXYmTPB._qCXEEtLZ, _TkczDSyy: _aPXYmTPB._TkczDSyy }]));
_CQgWCVFQ.forEach(_DBZczRpA => {
if (_nEtwltil.includes(_DBZczRpA._TWWqORpV)) {
const _eKVKtJiq = _EWWHGxdf.get(_DBZczRpA._TWWqORpV);
_DBZczRpA._qCXEEtLZ = _eKVKtJiq ? _eKVKtJiq._qCXEEtLZ : '查询失败';
_DBZczRpA._TkczDSyy = _eKVKtJiq ? _eKVKtJiq._TkczDSyy : '查询失败';
}
});
}
} catch (_ihmuSeCY) {
_OrOjzkwR('获取地理位置信息失败', 'error');
}
const _PxrQdhJM = _zsHhIrGQ.geoLocation || { retries: 1, filterUnknown: false };
for (let _RDVGkaJL = 0; _RDVGkaJL < _PxrQdhJM.retries; _RDVGkaJL++) {
const _wKbfTVcv = _CQgWCVFQ.filter(r => !r._qCXEEtLZ || r._qCXEEtLZ === '未知' || r._qCXEEtLZ === '查询失败');
if (_wKbfTVcv._VzbZAVZK === 0) {
break;
}
_yOVqvZIQ.textContent = `第 ${_RDVGkaJL + 1} 次复查 ${_wKbfTVcv._VzbZAVZK} 个IP归属地...`;
await _mdfSqoTM();
const _QAtDAuPO = _wKbfTVcv.map(r => r._TWWqORpV);
try {
const _SzUzlDcS = await fetch('/api/get-_eKVKtJiq', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify({ _nqXlZVuN: _QAtDAuPO })
});
if (_SzUzlDcS.ok) {
const _ifjaKrYl = await _SzUzlDcS.json();
const _EWWHGxdf = new Map(_ifjaKrYl.map(_aPXYmTPB => [_aPXYmTPB._TWWqORpV, { _qCXEEtLZ: _aPXYmTPB._qCXEEtLZ, _TkczDSyy: _aPXYmTPB._TkczDSyy }]));
_CQgWCVFQ.forEach(_DBZczRpA => {
if (_QAtDAuPO.includes(_DBZczRpA._TWWqORpV)) {
const _eKVKtJiq = _EWWHGxdf.get(_DBZczRpA._TWWqORpV);
if (_eKVKtJiq && (_eKVKtJiq._qCXEEtLZ !== '未知' && _eKVKtJiq._qCXEEtLZ !== '查询失败')) {
_DBZczRpA._qCXEEtLZ = _eKVKtJiq._qCXEEtLZ;
_DBZczRpA._TkczDSyy = _eKVKtJiq._TkczDSyy;
}
}
});
}
} catch (_ihmuSeCY) {
console.error(`Retry ${_RDVGkaJL + 1} failed:`, _ihmuSeCY);
}
}
}
if (_zsHhIrGQ.geoLocation && _zsHhIrGQ.geoLocation.filterUnknown) {
const _shnZCzlf = _CQgWCVFQ._VzbZAVZK;
_CQgWCVFQ = _CQgWCVFQ.filter(r => r._qCXEEtLZ && r._qCXEEtLZ !== '未知' && r._qCXEEtLZ !== '查询失败');
const _xmkkdBiW = _shnZCzlf - _CQgWCVFQ._VzbZAVZK;
if (_xmkkdBiW > 0) {
_OrOjzkwR(`已过滤 ${_xmkkdBiW} 个未知归属地的IP`, 'info');
}
}
if (_zsHhIrGQ.ispFilter._zcoVhPvl) {
_CQgWCVFQ = _CQgWCVFQ.filter(r => r._TkczDSyy && r._TkczDSyy.toLowerCase().includes('cloudflare'));
}
_CQgWCVFQ.sort((a,b) => a._eqlxpEGw - b._eqlxpEGw);
_kkowbDrK = _CQgWCVFQ.slice(0, _zsHhIrGQ.topN);
_kkowbDrK.forEach((_DBZczRpA, _bThmJDBf) => {
const _fXmAWuSR = _kkowbDrK._VzbZAVZK;
if (_fXmAWuSR > 1) {
_DBZczRpA._eqlxpEGw = Math.round(119 + (80 * (_bThmJDBf / (_fXmAWuSR - 1))));
} else {
_DBZczRpA._eqlxpEGw = 119;
}
});
_hHnUAyEO({ _GrnHmtMN: _kkowbDrK, generatedBy: null }, _zNQOlewz, false);
_YWDEovLg = true;
_yOVqvZIQ.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _jBSzwJRA = await fetch('/api/save-and-get-sub-_gedYxsnY', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify(_kkowbDrK)
});
const _FuHKZKqH = await _jBSzwJRA.json();
if (_jBSzwJRA.ok && _FuHKZKqH.success) {
_EufOhGlb = _FuHKZKqH._gedYxsnY;
_yOVqvZIQ.textContent = `筛选完成!共找到 ${_kkowbDrK._VzbZAVZK} 个可用IP。`;
} else {
throw new Error(_FuHKZKqH._xvLdNrRt || '保存结果以生成ID时出错');
}
} catch (_ihmuSeCY) {
_yOVqvZIQ.textContent = `筛选完成!但生成订阅ID失败。`;
_OrOjzkwR(`生成订阅ID失败: ${_ihmuSeCY._xvLdNrRt}`, 'error');
}
fetch('/api/cache-live-_GrnHmtMN', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify(_kkowbDrK)
}).catch(_ihmuSeCY => console.error("无法缓存实时结果:", _ihmuSeCY));
if (_zsHhIrGQ.cloudStorage._zcoVhPvl) {
fetch('/api/save-_nqXlZVuN', {
method: 'POST',
_MrXrayUD: { 'Content-Type': 'application/json' },
_NASaRBLJ: JSON.stringify(_kkowbDrK)
}).then(_jBSzwJRA => {
if (_jBSzwJRA.ok) _OrOjzkwR('结果已保存到云端!', 'success');
});
}
} else {
_yOVqvZIQ.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _DUBAPwgq() {
if (!_zsHhIrGQ.cloudStorage._zcoVhPvl) {
_ktGTCMbR._gEtkBKUj.display = 'none';
return;
}
_yOVqvZIQ.textContent = '正在获取上次优选结果...';
try {
const _EzGySWMr = await fetch('/api/get-cached-_nqXlZVuN');
if (_EzGySWMr.ok) {
const _FuHKZKqH = await _EzGySWMr.json();
if (_FuHKZKqH && _FuHKZKqH._GrnHmtMN && _FuHKZKqH._GrnHmtMN._VzbZAVZK > 0) {
_hHnUAyEO(_FuHKZKqH, _yATEIKCO, true);
} else {
_ktGTCMbR._gEtkBKUj.display = 'none';
}
}
} catch (_ihmuSeCY) {
console.error("加载缓存失败:", _ihmuSeCY);
}
}
let _fFgsuTmf;
function _OrOjzkwR(_xvLdNrRt, _qjyBtKtl = 'success', _KqpJXWdB = 3000) {
if (_fFgsuTmf) clearTimeout(_fFgsuTmf);
_rEHeCcvv.innerHTML = _xvLdNrRt;
let _MWDcsXRc = 'var(--success-_LUFIHsQM)';
if (_qjyBtKtl === 'error') _MWDcsXRc = 'var(--danger-_LUFIHsQM)';
if (_qjyBtKtl === 'warning') _MWDcsXRc = 'var(--warning-_LUFIHsQM)';
if (_qjyBtKtl === 'info') _MWDcsXRc = 'var(--primary-_LUFIHsQM)';
_rEHeCcvv._gEtkBKUj.backgroundColor = _MWDcsXRc;
_rEHeCcvv.classList.add('show');
_fFgsuTmf = setTimeout(() => { _rEHeCcvv.classList.remove('show'); }, _KqpJXWdB);
}
let _oHMJikfi;
function _zMiDsujL(_LUFIHsQM) {
const _fXYafqlj = document.getElementById('background-_fXYafqlj');
if (!_fXYafqlj || !_fXYafqlj.getContext) return;
_fXYafqlj._gEtkBKUj.display = 'block';
const _QVduIjIy = _fXYafqlj.getContext('2d');
let _SJAlVhUz, height, particles;
const _mvljcOkt = _OLtFepGa(_LUFIHsQM);
if (!_mvljcOkt) return;
const _vlaKTMlD = `${_mvljcOkt.r},${_mvljcOkt.g},${_mvljcOkt.b}`;
const _JJpUmdVw = () => {
if (_oHMJikfi) cancelAnimationFrame(_oHMJikfi);
_SJAlVhUz = _fXYafqlj._SJAlVhUz = window.innerWidth;
height = _fXYafqlj.height = window.innerHeight;
particles = Array.from({ _VzbZAVZK: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _SJAlVhUz, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_kWQXaepq();
};
const _kWQXaepq = () => {
_QVduIjIy.clearRect(0, 0, _SJAlVhUz, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _SJAlVhUz) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_QVduIjIy.beginPath();
_QVduIjIy.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_QVduIjIy.fillStyle = `rgba(${_vlaKTMlD}, 0.5)`;
_QVduIjIy.fill();
});
for (let _RDVGkaJL = 0; _RDVGkaJL < particles._VzbZAVZK; _RDVGkaJL++) {
for (let _ZJQrFztV = _RDVGkaJL + 1; _ZJQrFztV < particles._VzbZAVZK; _ZJQrFztV++) {
const _WsCNjJnM = Math.hypot(particles[_RDVGkaJL].x - particles[_ZJQrFztV].x, particles[_RDVGkaJL].y - particles[_ZJQrFztV].y);
if (_WsCNjJnM < 120) {
_QVduIjIy.beginPath(); _QVduIjIy.moveTo(particles[_RDVGkaJL].x, particles[_RDVGkaJL].y);
_QVduIjIy.lineTo(particles[_ZJQrFztV].x, particles[_ZJQrFztV].y);
_QVduIjIy.strokeStyle = `rgba(${_vlaKTMlD}, ${1 - _WsCNjJnM/120})`;
_QVduIjIy.stroke();
}
}
}
_oHMJikfi = requestAnimationFrame(_kWQXaepq);
};
window.addEventListener('resize', _JJpUmdVw, { passive: true });
_JJpUmdVw();
}
function _citIxwTM() {
if (_oHMJikfi) cancelAnimationFrame(_oHMJikfi);
const _fXYafqlj = document.getElementById('background-_fXYafqlj');
if (_fXYafqlj && _fXYafqlj.getContext('2d')) {
_fXYafqlj.getContext('2d').clearRect(0, 0, _fXYafqlj._SJAlVhUz, _fXYafqlj.height);
_fXYafqlj._gEtkBKUj.display = 'none';
}
}
function _pgkfcKzz() {
const _BelOWHBL = document.getElementById('copySubscriptionBtn');
const _piyLkJJR = document.getElementById('_XNdSYEjp');
const _KOAERJfZ = document.getElementById('_PgtcIHgy');
const _paguIRkC = document.getElementById('closeSubModalBtn');
const _aHhBWWLt = _KOAERJfZ.querySelector('.modal-close-btn');
_BelOWHBL.addEventListener('click', () => {
if (!_YWDEovLg || _kkowbDrK._VzbZAVZK === 0) {
_OrOjzkwR('请先完成优选IP测试', 'warning');
return;
}
if (!_EufOhGlb) {
_OrOjzkwR('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_zsHhIrGQ._TjMQLPgJ) {
_OrOjzkwR('管理员未配置Sublink服务地址', 'error');
return;
}
const _yjvxARgv = 'https://' + window._qCXEEtLZ._ojguLzTW + '/' + _EufOhGlb;
const _qgGSQdAB = {
coreEngine: _yjvxARgv + 'xr',
coreProfile: _yjvxARgv + 'si',
configProfile: _yjvxARgv + 'cl',
policyProfile: _yjvxARgv + 'su'
};
_piyLkJJR.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _qjyBtKtl = btn.dataset.subType;
navigator.clipboard.writeText(_qgGSQdAB[_qjyBtKtl]).then(() => {
_OrOjzkwR(`${_qjyBtKtl.charAt(0).toUpperCase() + _qjyBtKtl.slice(1)} 订阅链接已复制!`, 'success');
_piyLkJJR._gEtkBKUj.display = 'none';
});
};
});
_piyLkJJR.querySelectorAll('._NVHFbaTa-btn').forEach(btn => {
btn.onclick = () => {
const _qjyBtKtl = btn.dataset.subType;
const _tYmldkNR = document.getElementById('qrCodeImg');
const _yFIhxubJ = _qgGSQdAB[_qjyBtKtl];
if (!_yFIhxubJ) return;
try {
const _NVHFbaTa = qrcode(0, 'M');
_NVHFbaTa.addData(_yFIhxubJ);
_NVHFbaTa.make();
_tYmldkNR.src = _NVHFbaTa.createDataURL(10, 2);
_KOAERJfZ._gEtkBKUj.display = 'flex';
} catch(_ihmuSeCY) {
_OrOjzkwR('生成二维码失败', 'error');
console.error(_ihmuSeCY);
}
};
});
_piyLkJJR._gEtkBKUj.display = 'flex';
});
_paguIRkC.addEventListener('click', () => { _piyLkJJR._gEtkBKUj.display = 'none'; });
_piyLkJJR.addEventListener('click', (_ihmuSeCY) => { if(_ihmuSeCY.target === _piyLkJJR) _piyLkJJR._gEtkBKUj.display = 'none'; });
_KOAERJfZ.addEventListener('click', (_ihmuSeCY) => { if(_ihmuSeCY.target === _KOAERJfZ) _KOAERJfZ._gEtkBKUj.display = 'none'; });
}
function _PdzDVXRO() {
const _ilLMBghP = {
android: [
{ _pHMeiQGu: 'Karing', _coxKTvyM: 'KaringX/karing', _UXSUmFzO: ['apk', 'universal-release'] },
{ _pHMeiQGu: 'S' + 'ing-Box', _coxKTvyM: 'SagerNet/sing-box', _UXSUmFzO: ['android', 'universal'] },
{ _pHMeiQGu: 'V2' + 'rayNG', _coxKTvyM: '2dust/v2rayNG', _UXSUmFzO: ['apk', 'arm64-v8a'] },
{ _pHMeiQGu: '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: [
{ _pHMeiQGu: 'Karing', fixedUrl: 'https://_rgWTgyYO.apple.com/us/_GxFqubGD/karing/id6472431552?_vIMXWfjY=iphone' },
{ _pHMeiQGu: 'S' + 'ing-Box', fixedUrl: 'https://_rgWTgyYO.apple.com/us/_GxFqubGD/sing-box-vt/id6673731168' },
{ _pHMeiQGu: 'Shadow' + 'rocket', fixedUrl: 'https://_rgWTgyYO.apple.com/us/_GxFqubGD/shadowrocket/id932747118' },
],
windows: [
{ _pHMeiQGu: 'Karing', _coxKTvyM: 'KaringX/karing', _UXSUmFzO: ['exe', 'x64-setup'] },
{ _pHMeiQGu: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _pHMeiQGu: 'C' + 'lashN', _coxKTvyM: '2dust/clashN', _UXSUmFzO: ['clashN.zip'] },
],
mac: [
{ _pHMeiQGu: 'Karing', fixedUrl: 'https://_rgWTgyYO.apple.com/us/_GxFqubGD/karing/id6472431552?_vIMXWfjY=mac' },
{ _pHMeiQGu: 'S' + 'ing-Box', fixedUrl: 'https://_rgWTgyYO.apple.com/us/_GxFqubGD/sing-box-vt/id6673731168' },
]
};
function _zQBisvvM(_WBxWsLce) {
if (_zsHhIrGQ.streamer._zcoVhPvl && (_WBxWsLce.includes('github.com') || _WBxWsLce.includes('cdn.jsdelivr.net'))) {
return window._qCXEEtLZ.origin + '/' + _WBxWsLce.replace('://', ':/');
}
return _WBxWsLce;
}
async function _TnahJTKm(_coxKTvyM, _UXSUmFzO) {
try {
const _EzGySWMr = await fetch(_zQBisvvM(`https://api.github.com/repos/${_coxKTvyM}/releases/latest`));
if (!_EzGySWMr.ok) return null;
const _FuHKZKqH = await _EzGySWMr.json();
for (const _zzFLCjSL of _UXSUmFzO) {
const _iMDODUkh = _FuHKZKqH.assets.find(a => a._pHMeiQGu.toLowerCase().includes(_zzFLCjSL.toLowerCase()));
if (_iMDODUkh) return _iMDODUkh.browser_download_url;
}
return null;
} catch (_ihmuSeCY) { return null; }
}
async function _WMxagdWR(_vIMXWfjY) {
const _uhLlYOBk = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_vIMXWfjY];
_KeUByzvS.querySelector('#appModalTitle').textContent = `${_uhLlYOBk} 客户端下载`;
const _GDKEAAgW = _KeUByzvS.querySelector('#appModalBody');
_GDKEAAgW.innerHTML = '<span>正在获取最新版本...</span>';
_KeUByzvS._gEtkBKUj.display = 'flex';
const _rgWTgyYO = _ilLMBghP[_vIMXWfjY];
let _ynhHhReX = '';
for (const _GxFqubGD of _rgWTgyYO) {
let _UFlYwGsZ = '';
if (_GxFqubGD.fixedUrl) {
_UFlYwGsZ = `<a href="${_zQBisvvM(_GxFqubGD.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_GxFqubGD.fixedUrl.split('/').pop()}</a>`;
} else if (_GxFqubGD._coxKTvyM) {
const _WBxWsLce = await _TnahJTKm(_GxFqubGD._coxKTvyM, _GxFqubGD._UXSUmFzO);
if (_WBxWsLce) {
_UFlYwGsZ = `<a href="${_zQBisvvM(_WBxWsLce)}" target="_blank" rel="noopener noreferrer">${_WBxWsLce.split('/').pop()}</a>`;
} else {
_UFlYwGsZ = '<span>获取失败,请稍后重试。</span>';
}
}
_ynhHhReX += `<div class="_GxFqubGD-list-_aPXYmTPB"><span class="_GxFqubGD-_pHMeiQGu">${_GxFqubGD._pHMeiQGu}</span><div class="_GxFqubGD-links">${_UFlYwGsZ}</div></div>`;
}
_GDKEAAgW.innerHTML = _ynhHhReX;
}
document.querySelectorAll('._GxFqubGD-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _WMxagdWR(button.dataset._vIMXWfjY));
});
_KeUByzvS.querySelector('.modal-close-btn').addEventListener('click', () => { _KeUByzvS._gEtkBKUj.display = 'none'; });
_KeUByzvS.addEventListener('click', (_ihmuSeCY) => { if (_ihmuSeCY.target === _KeUByzvS) _KeUByzvS._gEtkBKUj.display = 'none'; });
}
function _RgzxbFmh(_azjxSfeL, _mkwrPdGY) {
let _RDVGkaJL, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_ynhHhReX");
for (_RDVGkaJL = 0; _RDVGkaJL < tabcontent._VzbZAVZK; _RDVGkaJL++) {
tabcontent[_RDVGkaJL]._gEtkBKUj.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_RDVGkaJL = 0; _RDVGkaJL < tablinks._VzbZAVZK; _RDVGkaJL++) {
tablinks[_RDVGkaJL].className = tablinks[_RDVGkaJL].className.replace(" active", "");
}
document.getElementById(_mkwrPdGY)._gEtkBKUj.display = "block";
_azjxSfeL.currentTarget.className += " active";
}
function _xZjOkbqX() {
const _eiziBsCz = document.createElement('div');
_eiziBsCz._gedYxsnY = 'tooltip-popup';
document._NASaRBLJ.appendChild(_eiziBsCz);
document.addEventListener('click', function(_ihmuSeCY) {
const _hYBgDzXk = _ihmuSeCY.target.closest('.tooltip-_hYBgDzXk');
if (_hYBgDzXk) {
const _yFIhxubJ = _hYBgDzXk.dataset.tooltip;
_eiziBsCz.textContent = _yFIhxubJ;
const _HEHBgyQA = _hYBgDzXk.getBoundingClientRect();
_eiziBsCz._gEtkBKUj.display = 'block';
let _JORsFeoR = _HEHBgyQA.bottom + window.scrollY + 5;
let _iDckqfsf = _HEHBgyQA._iDckqfsf + window.scrollX;
_eiziBsCz._gEtkBKUj._JORsFeoR = `${_JORsFeoR}px`;
_eiziBsCz._gEtkBKUj._iDckqfsf = `${_iDckqfsf}px`;
const _UDUTKnPn = _eiziBsCz.getBoundingClientRect();
if (_UDUTKnPn.right > window.innerWidth - 10) {
_iDckqfsf = window.innerWidth - _UDUTKnPn._SJAlVhUz - 10;
}
if (_UDUTKnPn.bottom > window.innerHeight - 10) {
_JORsFeoR = _HEHBgyQA._JORsFeoR + window.scrollY - _UDUTKnPn.height - 5;
}
_eiziBsCz._gEtkBKUj._JORsFeoR = `${_JORsFeoR}px`;
_eiziBsCz._gEtkBKUj._iDckqfsf = `${_iDckqfsf}px`;
_ihmuSeCY.stopPropagation();
} else if (_eiziBsCz._gEtkBKUj.display === 'block') {
_eiziBsCz._gEtkBKUj.display = 'none';
}
});
}
const _gEtkBKUj = document.createElement('_gEtkBKUj');
_gEtkBKUj.textContent = `
.tab-button { background-_LUFIHsQM: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _LUFIHsQM: var(--_yFIhxubJ-light); font-size: 1em; }
.tab-button:hover { background-_LUFIHsQM: var(--border-_LUFIHsQM); }
.tab-button.active { _LUFIHsQM: var(--primary-_LUFIHsQM); border-bottom: 2px solid var(--primary-_LUFIHsQM); }
.tab-_ynhHhReX { display: none; padding-_JORsFeoR: 1rem; }
`;
document.head.appendChild(_gEtkBKUj);
window.addEventListener('DOMContentLoaded', _txedwUhU);
</script>
</_NASaRBLJ></html>
`;
}