import { connect } from "cloudflare:sockets";
const _YDcaMibC = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _sgmNkbRH = ["UpstreamAddress.SG.CMLiussss.net"];
const _kqMdxeaC = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _bblqLyHb = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _SaRfqOxl = '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 _RTNTuDOt = '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 _VasRbmeN(_oPLQvCWJ) {
if (Array.isArray(_oPLQvCWJ)) {
try {
return String.fromCharCode.apply(null, _oPLQvCWJ);
} catch (_HSaPiVio) {
return '';
}
}
return _oPLQvCWJ;
}
function _cKgEGCkQ(_CrTQJsmX) {
return /^[0-9a-_GqwtDBQi]{8}-[0-9a-_GqwtDBQi]{4}-[4][0-9a-_GqwtDBQi]{3}-[89ab][0-9a-_GqwtDBQi]{3}-[0-9a-_GqwtDBQi]{12}$/_sNkxdnSw.test(_CrTQJsmX);
}
const _uvntuCDl = "optimized_ips_v4";
const _lDLmMnmD = "global_config_v4";
const _enYvHfiw = "admin_password_v4";
const _XwVcGVbw = "live_results_temp_v1";
const _bXcxtmaq = "latest_sub_id_v1";
export default {
async fetch(_hOmwWITD, _DGVzWTWr, _WqGMjBmq) {
try {
if (!_DGVzWTWr.DB) {
const _IqtZiWFh = _sooHfXIo("D1 数据库 'DB' 未绑定。");
return new Response(_IqtZiWFh, { status: 503, _ceQBzYPA: { 'Content-Type': '_HipkANEK/html;_DxfDIAcD=UTF-8' }});
}
_WqGMjBmq.waitUntil(
_DGVzWTWr.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_ZBduXtts TEXT PRIMARY KEY, _oPLQvCWJ TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_CrTQJsmX TEXT PRIMARY KEY, _AFQviEVZ TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_HSaPiVio => console.error("DB Init Error:", _HSaPiVio._huFkLpSQ))
);
const _cLqtLPfd = new URL(_hOmwWITD._cLqtLPfd);
const _qPHFSpGH = _cLqtLPfd.pathname;
const _eiLltimw = _hOmwWITD._ceQBzYPA.get("Upgrade");
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (_ITAcMrLp.websocketStreamer && _ITAcMrLp.websocketStreamer._kRWzFOum && _eiLltimw && _eiLltimw.toLowerCase() === "websocket") {
const _muYbsipU = _ITAcMrLp.websocketStreamer._cLqtLPfd;
if (_muYbsipU && _muYbsipU.trim().startsWith('https://')) {
try {
const _prPMawNn = new Request(_muYbsipU.trim() + _cLqtLPfd.pathname + _cLqtLPfd.search, _hOmwWITD);
return await fetch(_prPMawNn);
} catch (_HSaPiVio) {
return new Response(`Upstream WebSocket gateway failed: ${_HSaPiVio._huFkLpSQ}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_eiLltimw && _eiLltimw.toLowerCase() === "websocket") {
return await _cqEkcQsG(_hOmwWITD, _DGVzWTWr, _ITAcMrLp);
}
const _MdJGZJxF = _qPHFSpGH._aYuncdpS(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_MdJGZJxF) {
const [, _XKuIMZsw, typeSuffix] = _MdJGZJxF;
const _pgRcTGtG = _ITAcMrLp._pgRcTGtG;
if (!_pgRcTGtG || _pgRcTGtG.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' } });
}
const _NuOzGaJi = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _QmFshJHV = _NuOzGaJi[typeSuffix];
const _LdqhPIKf = _pgRcTGtG.replace(/\/$/, '');
const _qpXPGcAg = `${_cLqtLPfd.origin}/${_XKuIMZsw}`;
const _NEcTmJKE = `${_LdqhPIKf}/${_QmFshJHV}?_ITAcMrLp=${encodeURIComponent(_qpXPGcAg)}`;
try {
const _umvOpcPV = await fetch(_NEcTmJKE, { _ceQBzYPA: { 'User-Agent': _hOmwWITD._ceQBzYPA.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _ScFhNMWI = new Headers(_umvOpcPV._ceQBzYPA);
_ScFhNMWI._tvAzWpRE('Access-Control-Allow-Origin', '*');
return new Response(_umvOpcPV._FtuUxCMi, { status: _umvOpcPV.status, statusText: _umvOpcPV.statusText, _ceQBzYPA: _ScFhNMWI });
} catch (_HSaPiVio) {
return new Response(`获取上游订阅失败: ${_HSaPiVio._huFkLpSQ}`, { status: 502, _ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' } });
}
}
if (_qPHFSpGH.startsWith('/https:/') || _qPHFSpGH.startsWith('/http:/')) {
return _QdwppfNm(_hOmwWITD, _ITAcMrLp);
}
if (_ITAcMrLp.customSubPath && _ITAcMrLp.customSubPath._kRWzFOum && _ITAcMrLp.customSubPath._qPHFSpGH && _qPHFSpGH === '/' + _ITAcMrLp.customSubPath._qPHFSpGH.trim()) {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_bXcxtmaq);
const { _YsUzOrSf } = await _yKWnNoEL.all();
const _dKXRpHiy = _YsUzOrSf._kmlcYbyh > 0 ? _YsUzOrSf[0]._oPLQvCWJ : null;
if (_dKXRpHiy) {
return _aSRStAQy({ _BDMQaCkK: { _CrTQJsmX: _dKXRpHiy }, _cLqtLPfd: _hOmwWITD._cLqtLPfd }, _DGVzWTWr);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' } });
}
}
const _TFSfcbyc = _qPHFSpGH.split('/').filter(Boolean);
if (_TFSfcbyc._kmlcYbyh === 1 && !_qPHFSpGH.startsWith('/api/')) {
const _XKuIMZsw = _TFSfcbyc[0];
return _aSRStAQy({ _BDMQaCkK: { _CrTQJsmX: _XKuIMZsw }, _cLqtLPfd: _hOmwWITD._cLqtLPfd }, _DGVzWTWr);
}
if (_qPHFSpGH.startsWith('/api/')) {
if (_qPHFSpGH === '/api/_ITAcMrLp' && _hOmwWITD.method === 'POST') return _CIwKGrVp(_hOmwWITD, _DGVzWTWr, _WqGMjBmq);
if (_qPHFSpGH === '/api/_tvAzWpRE-_CGGymZWK') return _WaPPCEOc(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/change-_CGGymZWK') return _eXWfWxxF(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/verify-_CGGymZWK') return _MLPZOXGO(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/verify-visitor-_CGGymZWK' && _hOmwWITD.method === 'POST') return _YDKKfHXk(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/cache-live-_YsUzOrSf' && _hOmwWITD.method === 'POST') return _YlOgvqAf(_hOmwWITD, _DGVzWTWr, _WqGMjBmq);
if (_qPHFSpGH === '/api/get-_NUyOgDgy' && _hOmwWITD.method === 'POST') return _QWtwIZQg(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/get-cached-_waxBKSXV') return _iBwzNLev(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/save-_waxBKSXV') return _wKHuORcN(_hOmwWITD, _DGVzWTWr, _WqGMjBmq);
if (_qPHFSpGH === '/api/save-and-get-sub-_CrTQJsmX' && _hOmwWITD.method === 'POST') return _OXJoHqtw(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH.startsWith('/api/get-_WevtJpAf/')) {
const _XKuIMZsw = _qPHFSpGH.split('/').pop();
return _aSRStAQy({ _BDMQaCkK: { _CrTQJsmX: _XKuIMZsw }, _cLqtLPfd: _hOmwWITD._cLqtLPfd }, _DGVzWTWr);
}
if (_qPHFSpGH === '/api/_ITAcMrLp' && _hOmwWITD.method === 'GET') return _wNunUNvr(_DGVzWTWr);
if (_qPHFSpGH === '/api/get-resolved-_waxBKSXV') return _UUIOZCGK(_hOmwWITD);
if (_qPHFSpGH === '/api/parse-_waxBKSXV-from-_nWvOEoYV' && _hOmwWITD.method === 'POST') return _CELxiaiq(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/endpoints') return _wldMOlCR(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_qPHFSpGH === '/_ROfDcQNw') return _JdKCSLUU(_hOmwWITD, _DGVzWTWr);
if (_qPHFSpGH === '/bing-wallpaper') return _sySQJOTy();
return _kkgNOWAv(_hOmwWITD, _DGVzWTWr, _WqGMjBmq);
} catch (err) {
let _HSaPiVio = err;
return new Response(_HSaPiVio.toString(), { status: 500 });
}
}
};
const _CVRNwtfb = { 'Accept': '_HipkANEK/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 _maSBPYRf(_cLqtLPfd, _wZNNJyBe) {
const _yuRRNMnj = await fetch(_cLqtLPfd, { _ceQBzYPA: { ..._CVRNwtfb, 'Referer': _wZNNJyBe.referer } });
if (_yuRRNMnj.ok) return _yuRRNMnj._HipkANEK();
return null;
}
async function _dJIcEVht(_cLqtLPfd, _wZNNJyBe) {
const _zNZfcDcI = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_cLqtLPfd)}`;
const _yuRRNMnj = await fetch(_zNZfcDcI, { _ceQBzYPA: { ..._CVRNwtfb, 'Referer': _wZNNJyBe.referer } });
if (!_yuRRNMnj.ok) return null;
const _FtuUxCMi = await _yuRRNMnj._HipkANEK();
const _aYuncdpS = _FtuUxCMi._aYuncdpS(/<pre[^>]*>([\s\S]*?)<\/pre>/_sNkxdnSw);
return _aYuncdpS && _aYuncdpS[1] ? _aYuncdpS[1].replace(/&/g, '&') : null;
}
function _oXdfiFCg(_tXaftjHy) {
let _WGEWlaSg;
try {
_WGEWlaSg = atob(_tXaftjHy.replace(/\s/g, ''));
} catch (_HSaPiVio) {
_WGEWlaSg = _tXaftjHy;
}
const _WevtJpAf = _WGEWlaSg.split(/[\s\n\r,]+/).filter(line => line.trim());
const _HDxnpkzM = new Set();
const _lVIBAhlw = /@([^?#]+?):(\d+)/;
for (const _HOxcmQcX of _WevtJpAf) {
let _MOChWbTW = '';
let _maIJuKHX = '';
try {
if (_HOxcmQcX.startsWith('vmess://')) {
const _QnPIucLz = atob(_HOxcmQcX.substring(8));
const _ITAcMrLp = JSON.parse(_QnPIucLz);
_MOChWbTW = _ITAcMrLp.add;
_maIJuKHX = _ITAcMrLp._maIJuKHX;
} else {
const _aYuncdpS = _HOxcmQcX._aYuncdpS(_lVIBAhlw);
if (_aYuncdpS && _aYuncdpS[1] && _aYuncdpS[2]) {
_MOChWbTW = _aYuncdpS[1].replace(/[\[\]]/g, '');
_maIJuKHX = _aYuncdpS[2];
}
}
} catch (_HSaPiVio) {
console.warn(`Could not parse _HOxcmQcX: ${_HOxcmQcX}`);
}
if (_MOChWbTW && _maIJuKHX) {
_HDxnpkzM.add(`${_MOChWbTW}:${_maIJuKHX}`);
}
}
return Array.from(_HDxnpkzM);
}
async function _aRkVfwKd(_lKOKjmMM) {
try {
const _yuRRNMnj = await fetch(_lKOKjmMM, { _ceQBzYPA: _CVRNwtfb });
if (!_yuRRNMnj.ok) {
console.error(`Failed to fetch subscription: ${_yuRRNMnj.status}`);
return [];
}
const _tXaftjHy = await _yuRRNMnj._HipkANEK();
return _oXdfiFCg(_tXaftjHy);
} catch (error) {
console.error(`Error processing subscription ${_lKOKjmMM}:`, error);
return [];
}
}
async function _KyunSOpz(_urHoKsFE) {
const _flfbkdaC = _urHoKsFE.trim();
const _xMjzWiUs = /^(vless|vmess|trojan|ss):\/\//.test(_flfbkdaC);
const _DQKYGCGC = (() => {
if (_flfbkdaC._kmlcYbyh < 20 || _flfbkdaC.startsWith('http')) return false;
const _vOhfvVHV = _flfbkdaC.replace(/\s/g, '');
if (_vOhfvVHV._kmlcYbyh % 4 !== 0 && !_vOhfvVHV.includes('=')) return false;
try {
atob(_vOhfvVHV);
return true;
} catch (_HSaPiVio) {
return false;
}
})();
if (_xMjzWiUs || _DQKYGCGC) {
return _oXdfiFCg(_flfbkdaC).join('\n');
}
const _KDlCLUGM = [
'https://ipdb.api.030101.xyz/?_MnKvCiLn=bestcf&_xoUjZJDZ=true',
'https://ipdb.api.030101.xyz/?_MnKvCiLn=bestproxy&_xoUjZJDZ=true'
];
const _MePgqOPB = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_sNkxdnSw.test(_urHoKsFE) || _urHoKsFE.includes('?_stQoSWYb=');
if (_MePgqOPB) {
const _waxBKSXV = await _aRkVfwKd(_urHoKsFE);
return _waxBKSXV.join('\n');
}
let _tXaftjHy = '';
if (_KDlCLUGM.includes(_urHoKsFE)) {
_tXaftjHy = await _maSBPYRf(_urHoKsFE, { referer: _urHoKsFE });
if (!_tXaftjHy || _tXaftjHy._kmlcYbyh < 8) {
_tXaftjHy = await _dJIcEVht(_urHoKsFE, { referer: _urHoKsFE });
}
} else {
try {
const _eMDbQFqY = await fetch(_urHoKsFE, { _ceQBzYPA: { 'User-Agent': 'Cloudflare-Worker' } });
if (_eMDbQFqY.ok) {
_tXaftjHy = await _eMDbQFqY._HipkANEK();
} else {
console.warn(`Failed to fetch URL ${_urHoKsFE}: ${_eMDbQFqY.status}`);
}
} catch (_HSaPiVio) {
console.error(`Error fetching URL ${_urHoKsFE}:`, _HSaPiVio);
}
}
const _yKoBGQau = _oXdfiFCg(_tXaftjHy);
if (_yKoBGQau._kmlcYbyh > 0) {
return _yKoBGQau.join('\n');
}
return _tXaftjHy || '';
}
async function _QdwppfNm(_hOmwWITD, _ITAcMrLp) {
if (!_ITAcMrLp.streamer._kRWzFOum) {
return new Response('远程流功能未开启', { status: 403 });
}
const _cLqtLPfd = new URL(_hOmwWITD._cLqtLPfd);
const _NFchKfOi = _cLqtLPfd.pathname.substring(1).replace(':/', '://');
try {
const _NEcTmJKE = new URL(_NFchKfOi);
const _FeABpkaB = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_FeABpkaB.some(domain => _NEcTmJKE._MOChWbTW.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _IJXFCSxq = new Headers(_hOmwWITD._ceQBzYPA);
_IJXFCSxq._tvAzWpRE('Host', _NEcTmJKE._MOChWbTW);
_IJXFCSxq._tvAzWpRE('User-Agent', 'CF-Worker-Streamer/1.0');
const _hWxAnFTi = await fetch(_NEcTmJKE.toString(), {
method: _hOmwWITD.method,
_ceQBzYPA: _IJXFCSxq,
_FtuUxCMi: _hOmwWITD._FtuUxCMi,
});
const _ScFhNMWI = new Headers(_hWxAnFTi._ceQBzYPA);
_ScFhNMWI._tvAzWpRE('Access-Control-Allow-Origin', '*');
_ScFhNMWI._tvAzWpRE('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_ScFhNMWI._tvAzWpRE('Access-Control-Allow-Headers', '*');
_ScFhNMWI._tvAzWpRE('Cache-Control', 'public, max-age=86400');
_ScFhNMWI._tvAzWpRE('X-Streamer-Source', 'CF-Worker');
_ScFhNMWI.delete('_tXaftjHy-security-policy');
_ScFhNMWI.delete('x-_tXaftjHy-security-policy');
_ScFhNMWI.delete('x-webkit-csp');
return new Response(_hWxAnFTi._FtuUxCMi, {
status: _hWxAnFTi.status,
statusText: _hWxAnFTi.statusText,
_ceQBzYPA: _ScFhNMWI,
});
} catch (_HSaPiVio) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _cqEkcQsG(_hOmwWITD, _DGVzWTWr, _ITAcMrLp) {
try {
const _wKxVmQmx = _ITAcMrLp || await _WKGcyhlo(_DGVzWTWr);
const _fIwgkQXN = (_wKxVmQmx.itemLink._tLqWIHBf && _wKxVmQmx.itemLink._tLqWIHBf[0]) || {};
const _yLLAzFVH = _fIwgkQXN['_stQoSWYb'] || _VasRbmeN(_YDcaMibC);
if (!_cKgEGCkQ(_yLLAzFVH)) {
throw new Error("Configured user _cckNseDg is not valid.");
}
const _mESMayiD = _wKxVmQmx.dataFeeds.universalFallbackAddress;
let _FMeCnMoO = {};
const _vnbuItGt = _VasRbmeN(_sgmNkbRH[0] || "");
if (_mESMayiD) {
const [_OchiPaNj, _maIJuKHX = '443'] = _mESMayiD.split(':');
_FMeCnMoO = { _OchiPaNj, _maIJuKHX };
} else {
const [_OchiPaNj, _maIJuKHX = '443'] = _vnbuItGt.split(':');
_FMeCnMoO = { _OchiPaNj, _maIJuKHX };
}
const _cLqtLPfd = new URL(_hOmwWITD._cLqtLPfd);
const _qPHFSpGH = _cLqtLPfd.pathname;
let _NKZZiIKF = '';
const _HtXxIVKX = _cLqtLPfd.searchParams.get('remote');
if (_HtXxIVKX) {
_NKZZiIKF = atob(_HtXxIVKX);
} else if (_qPHFSpGH.startsWith('/endpoint=')) {
_NKZZiIKF = _qPHFSpGH.substring(10);
} else if (_qPHFSpGH._kmlcYbyh > 1 && _qPHFSpGH.substring(1).includes('.')) {
_NKZZiIKF = _qPHFSpGH.substring(1);
}
if (_NKZZiIKF) {
const [_OchiPaNj, _maIJuKHX = '443'] = _NKZZiIKF.split(':');
_FMeCnMoO = { _OchiPaNj, _maIJuKHX };
}
return await _MMqrTRNa(_hOmwWITD, _yLLAzFVH, _FMeCnMoO);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _MMqrTRNa(_hOmwWITD, _cckNseDg, _FMeCnMoO) {
const _HggUvBEg = new WebSocketPair();
const [clientEnd, _sjApYRGa] = Object.values(_HggUvBEg);
_sjApYRGa.accept();
let _wNhxHqsH = { _GHwMxzrG: null };
const _nqrmeyWy = _hOmwWITD._ceQBzYPA.get("sec-websocket-protocol") || "";
const _bAQBKbSy = _weGTLlUy(_sjApYRGa, _nqrmeyWy);
_bAQBKbSy.pipeTo(new WritableStream({
async write(chunk) {
if (_wNhxHqsH._GHwMxzrG) {
const _ZelTgQLk = _wNhxHqsH._GHwMxzrG.writable.getWriter();
await _ZelTgQLk.write(chunk);
_ZelTgQLk.releaseLock();
return;
}
const { error, details } = await _EMuIKAVi(chunk, _cckNseDg);
if (error) {
throw new Error(details);
}
const _LxhYmcwF = new Uint8Array([details._tOITRFqV[0], 0]);
const _ftPAQnQT = chunk.slice(details.payloadIndex);
await _okAQhxqB(_wNhxHqsH, details._zkEPvntP, details._BBKmXDKQ, _ftPAQnQT, _sjApYRGa, _LxhYmcwF, _FMeCnMoO);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_UrxyscJr(_sjApYRGa);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _okAQhxqB(_wNhxHqsH, _zkEPvntP, _BBKmXDKQ, _PRJMxeMu, _XZYXLpnm, _LxhYmcwF, _YAwzjdQC) {
const _AOUKLLVm = async (_OchiPaNj, _maIJuKHX) => {
let _SGUBDmWQ = _OchiPaNj;
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(_OchiPaNj)) {
_SGUBDmWQ = `${atob('d3d3Lg==')}${_OchiPaNj}${atob('LnNzbGlwLmlv')}`;
}
const _GHwMxzrG = connect({ _MOChWbTW: _SGUBDmWQ, _maIJuKHX });
_wNhxHqsH._GHwMxzrG = _GHwMxzrG;
const _ZelTgQLk = _GHwMxzrG.writable.getWriter();
await _ZelTgQLk.write(_PRJMxeMu);
_ZelTgQLk.releaseLock();
return _GHwMxzrG;
};
const _MpMVvSlR = async () => {
if (!_YAwzjdQC._OchiPaNj) return;
console.log(`Direct connection failed, falling back to gateway: ${_YAwzjdQC._OchiPaNj}`);
const _PmglLDEL = await _AOUKLLVm(_YAwzjdQC._OchiPaNj, parseInt(_YAwzjdQC._maIJuKHX, 10));
_PmglLDEL.closed.catch(() => {}).finally(() => _UrxyscJr(_XZYXLpnm));
_aVtpRkzN(_PmglLDEL, _XZYXLpnm, _LxhYmcwF, null);
};
try {
const _RkmQtHAg = await _AOUKLLVm(_zkEPvntP, _BBKmXDKQ);
_aVtpRkzN(_RkmQtHAg, _XZYXLpnm, _LxhYmcwF, _MpMVvSlR);
} catch (err) {
console.error("Primary connection failed:", err);
await _MpMVvSlR();
}
}
function _weGTLlUy(_sjApYRGa, _nqrmeyWy) {
let _ucNbfaso = false;
return new ReadableStream({
start(_GrlmPYnL) {
_sjApYRGa.addEventListener("_huFkLpSQ", (event) => { if (_ucNbfaso) return; _GrlmPYnL.enqueue(event._AFQviEVZ); });
_sjApYRGa.addEventListener("close", () => { _UrxyscJr(_sjApYRGa); if (_ucNbfaso) return; _GrlmPYnL.close(); });
_sjApYRGa.addEventListener("error", (err) => _GrlmPYnL.error(err));
if (_nqrmeyWy) {
try {
const _hHzrwezq = atob(_nqrmeyWy.replace(/-/g, "+").replace(/_/g, "/"));
_GrlmPYnL.enqueue(Uint8Array.from(_hHzrwezq, c => c.charCodeAt(0))._HImQvFbI);
} catch (_HSaPiVio) { console.error("Failed to decode early _AFQviEVZ:", _HSaPiVio); }
}
},
cancel() { _ucNbfaso = true; _UrxyscJr(_sjApYRGa); },
});
}
async function _EMuIKAVi(_HImQvFbI, _cckNseDg) {
if (_HImQvFbI.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _tOITRFqV = new Uint8Array(_HImQvFbI.slice(0, 1));
const _TetcFEzw = _ATUpiyek(new Uint8Array(_HImQvFbI.slice(1, 17)));
if (_TetcFEzw !== _cckNseDg) return { error: true, details: "Invalid _cckNseDg" };
const _SgYMMhcM = new Uint8Array(_HImQvFbI.slice(17, 18))[0];
const _rZIJCJKC = new Uint8Array(_HImQvFbI.slice(18 + _SgYMMhcM, 19 + _SgYMMhcM))[0];
if (_rZIJCJKC !== 1) return { error: true, details: `Unsupported _rZIJCJKC: ${_rZIJCJKC}` };
const _GceaAhyY = 19 + _SgYMMhcM;
const _BBKmXDKQ = new DataView(_HImQvFbI.slice(_GceaAhyY, _GceaAhyY + 2)).getUint16(0);
let _CtRnJCvM = _GceaAhyY + 2;
const _pcbChWiL = new Uint8Array(_HImQvFbI.slice(_CtRnJCvM, _CtRnJCvM + 1))[0];
let _WWHMBbvi = 0;
let _qMOqXBXB = _CtRnJCvM + 1;
let _zkEPvntP = "";
switch (_pcbChWiL) {
case 1: _WWHMBbvi = 4; _zkEPvntP = new Uint8Array(_HImQvFbI.slice(_qMOqXBXB, _qMOqXBXB + _WWHMBbvi)).join("."); break;
case 2: _WWHMBbvi = new Uint8Array(_HImQvFbI.slice(_qMOqXBXB, _qMOqXBXB + 1))[0]; _qMOqXBXB++; _zkEPvntP = new TextDecoder().decode(_HImQvFbI.slice(_qMOqXBXB, _qMOqXBXB + _WWHMBbvi)); break;
case 3: _WWHMBbvi = 16; const _eBzauFZT = new DataView(_HImQvFbI.slice(_qMOqXBXB, _qMOqXBXB + _WWHMBbvi)); const _WsMVYUMo = []; for (let _sNkxdnSw = 0; _sNkxdnSw < 8; _sNkxdnSw++) _WsMVYUMo.push(_eBzauFZT.getUint16(_sNkxdnSw * 2).toString(16)); _zkEPvntP = _WsMVYUMo.join(":"); break;
default: return { error: true, details: `Invalid _FrKREStR _MnKvCiLn: ${_pcbChWiL}` };
}
if (!_zkEPvntP) return { error: true, details: "Target _OchiPaNj is empty" };
return { error: false, details: { _zkEPvntP, _BBKmXDKQ, _tOITRFqV, payloadIndex: _qMOqXBXB + _WWHMBbvi } };
}
async function _aVtpRkzN(_GHwMxzrG, _XZYXLpnm, _RtHFfjax, _XxQTsNRU) {
let _lkNcsStl = _RtHFfjax;
let _uVgdNQYu = false;
let _iygAadVG = _GHwMxzrG._bAQBKbSy.pipeTo(new WritableStream({
write(chunk) {
_uVgdNQYu = true;
if (_XZYXLpnm.readyState !== 1) throw new Error("Channel is not open");
if (_lkNcsStl) {
const _AaOXkDNh = new Uint8Array(_lkNcsStl.byteLength + chunk.byteLength);
_AaOXkDNh._tvAzWpRE(new Uint8Array(_lkNcsStl));
_AaOXkDNh._tvAzWpRE(new Uint8Array(chunk), _lkNcsStl.byteLength);
_XZYXLpnm.send(_AaOXkDNh._HImQvFbI);
_lkNcsStl = null;
} else {
_XZYXLpnm.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _XZYXLpnm error:", err._huFkLpSQ);
});
await _iygAadVG;
if (!_uVgdNQYu && _XxQTsNRU) {
_XxQTsNRU();
}
}
function _UrxyscJr(_XZYXLpnm) {
try { if (_XZYXLpnm.readyState === 1 || _XZYXLpnm.readyState === 2) _XZYXLpnm.close(); } catch (_HSaPiVio) {}
}
const _MKQumpKT = Array.from({ _kmlcYbyh: 256 }, (_, _sNkxdnSw) => (_sNkxdnSw + 256).toString(16).slice(1));
function _ATUpiyek(_pSYgEuac, offset = 0) {
return (
_MKQumpKT[_pSYgEuac[offset]] + _MKQumpKT[_pSYgEuac[offset + 1]] + _MKQumpKT[_pSYgEuac[offset + 2]] + _MKQumpKT[_pSYgEuac[offset + 3]] + "-" +
_MKQumpKT[_pSYgEuac[offset + 4]] + _MKQumpKT[_pSYgEuac[offset + 5]] + "-" +
_MKQumpKT[_pSYgEuac[offset + 6]] + _MKQumpKT[_pSYgEuac[offset + 7]] + "-" +
_MKQumpKT[_pSYgEuac[offset + 8]] + _MKQumpKT[_pSYgEuac[offset + 9]] + "-" +
_MKQumpKT[_pSYgEuac[offset + 10]] + _MKQumpKT[_pSYgEuac[offset + 11]] +
_MKQumpKT[_pSYgEuac[offset + 12]] + _MKQumpKT[_pSYgEuac[offset + 13]] +
_MKQumpKT[_pSYgEuac[offset + 14]] + _MKQumpKT[_pSYgEuac[offset + 15]]
).toLowerCase();
}
let _CDhGyxjT = { "N/A":"未知" };
async function _loxjzrmo(_cLqtLPfd, _OjuqigZj, _XxQTsNRU) {
try {
const _yuRRNMnj = await fetch(_cLqtLPfd, {
_ceQBzYPA: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_yuRRNMnj.ok) {
console.error(`获取 ${_cLqtLPfd} 失败: HTTP ${_yuRRNMnj.status}`);
return _XxQTsNRU;
}
const _HipkANEK = await _yuRRNMnj._HipkANEK();
return _OjuqigZj(_HipkANEK);
} catch (error) {
console.error(`获取或解析 ${_cLqtLPfd} 时发生网络错误: ${error._huFkLpSQ}`);
return _XxQTsNRU;
}
}
function _jkdTGEyJ(_HipkANEK) {
if (!_HipkANEK) return [];
const _ZOpbEnXm = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _OzbyQvTU = _HipkANEK.split(/[\s,;#|]+/);
const _zSFCIyIX = [];
for (const _cxhHYiYW of _OzbyQvTU) {
const _PqHSwUiy = _cxhHYiYW.trim();
if (!_PqHSwUiy) continue;
const _HKXyFeSw = _PqHSwUiy.lastIndexOf(':');
let _OeJXRcZZ = _PqHSwUiy;
if(_HKXyFeSw > _PqHSwUiy.lastIndexOf(']')) {
const _QgEViUSa = _PqHSwUiy.substring(_HKXyFeSw + 1);
if(!isNaN(_QgEViUSa) && _QgEViUSa._kmlcYbyh > 0) {
_OeJXRcZZ = _PqHSwUiy.substring(0, _HKXyFeSw);
}
}
if (_uxBsTzls.isValid(_OeJXRcZZ.replace(/[\[\]]/g, '')) || _ZOpbEnXm.test(_PqHSwUiy)) {
_zSFCIyIX.push(_PqHSwUiy);
}
}
return _zSFCIyIX;
}
function _VaEcVXsR(_HipkANEK) {
if (!_HipkANEK) return [];
return _HipkANEK.split(/\s+/).filter(d => d.trim() !== '');
}
function _yIJTsQNo(_HipkANEK) {
if (!_HipkANEK) return { "N/A": "未知" };
try {
return JSON.parse(`{${_HipkANEK}}`);
} catch (_HSaPiVio) {
console.error("解析 _CDhGyxjT 失败:", _HSaPiVio);
return { "N/A": "未知" };
}
}
const _uxBsTzls = {
isValid: (_ROfDcQNw) => _uxBsTzls.isIPv4(_ROfDcQNw) || _uxBsTzls.isIPv6(_ROfDcQNw),
isIPv4: (_ROfDcQNw) => {
if (typeof _ROfDcQNw !== 'string') return false;
const _WsMVYUMo = _ROfDcQNw.split('.');
if (_WsMVYUMo._kmlcYbyh !== 4) return false;
return _WsMVYUMo.every(_WJoFcUBS => {
const _CGHLkypO = parseInt(_WJoFcUBS, 10);
return !isNaN(_CGHLkypO) && _CGHLkypO >= 0 && _CGHLkypO <= 255 && String(_CGHLkypO) === _WJoFcUBS;
});
},
isIPv6: (_ROfDcQNw) => {
if (typeof _ROfDcQNw !== '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]))$/_sNkxdnSw.test(_ROfDcQNw);
},
toLong4: (_ROfDcQNw) => _ROfDcQNw.split('.').reduce((acc, octet, _sNkxdnSw) => acc + (parseInt(octet) << (8*(3-_sNkxdnSw))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_ROfDcQNw) => {
try {
const _ZAiYUPfa = _ROfDcQNw.split('/')[0];
const _WsMVYUMo = _ZAiYUPfa.split('::');
if (_WsMVYUMo._kmlcYbyh > 2) return 0n;
let _mrzJjOna = [];
if (_WsMVYUMo[0]) {
_mrzJjOna = _WsMVYUMo[0].split(':');
}
let _qzGxsqqo = [];
if (_WsMVYUMo._kmlcYbyh > 1 && _WsMVYUMo[1]) {
_qzGxsqqo = _WsMVYUMo[1].split(':');
}
if (_mrzJjOna._kmlcYbyh + _qzGxsqqo._kmlcYbyh > 8) return 0n;
const _DBViEkdy = 8 - (_mrzJjOna._kmlcYbyh + _qzGxsqqo._kmlcYbyh);
const _pSpDHEqm = [
..._mrzJjOna,
...Array(_DBViEkdy).fill('0'),
..._qzGxsqqo
].map(_WJoFcUBS => _WJoFcUBS || '0');
while(_pSpDHEqm._kmlcYbyh < 8) {
_pSpDHEqm.push('0');
}
let _aEErdjVw = 0n;
for (const _WJoFcUBS of _pSpDHEqm) {
if (_WJoFcUBS._kmlcYbyh > 4) return 0n;
const _oPLQvCWJ = BigInt('0x' + _WJoFcUBS);
_aEErdjVw = (_aEErdjVw << 16n) | _oPLQvCWJ;
}
return _aEErdjVw;
} catch(_HSaPiVio) {
return 0n;
}
},
fromBigInt6: (_aEErdjVw) => {
if (typeof _aEErdjVw !== '_aEErdjVw' || _aEErdjVw < 0n) return null;
const _WsMVYUMo = [];
for (let _sNkxdnSw = 0; _sNkxdnSw < 8; _sNkxdnSw++) {
_WsMVYUMo.unshift((_aEErdjVw & 0xFFFFn).toString(16));
_aEErdjVw >>= 16n;
}
let _EPrVOJHM = { start: -1, _QjLCvBIs: 0 };
let _FRexfNll = { start: -1, _QjLCvBIs: 0 };
for (let _sNkxdnSw = 0; _sNkxdnSw < 8; _sNkxdnSw++) {
if (_WsMVYUMo[_sNkxdnSw] === '0') {
if (_FRexfNll.start === -1) _FRexfNll.start = _sNkxdnSw;
_FRexfNll._QjLCvBIs++;
} else {
if (_FRexfNll._QjLCvBIs > _EPrVOJHM._QjLCvBIs) _EPrVOJHM = { ..._FRexfNll };
_FRexfNll = { start: -1, _QjLCvBIs: 0 };
}
}
if (_FRexfNll._QjLCvBIs > _EPrVOJHM._QjLCvBIs) _EPrVOJHM = { ..._FRexfNll };
if (_EPrVOJHM._QjLCvBIs > 1) {
_WsMVYUMo.splice(_EPrVOJHM.start, _EPrVOJHM._QjLCvBIs, '');
if (_EPrVOJHM.start === 0) _WsMVYUMo.unshift('');
if (_EPrVOJHM.start + _EPrVOJHM._QjLCvBIs === 8) _WsMVYUMo.push('');
}
return _WsMVYUMo.join(':');
},
cidrToRange: (cidr, _YqneDDnW = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _bRMWGRfA = parseInt(bitsStr, 10);
const _waxBKSXV = new Set();
if (_uxBsTzls.isIPv4(range)) {
if (isNaN(_bRMWGRfA) || _bRMWGRfA < 8 || _bRMWGRfA > 32) return [];
if (_bRMWGRfA === 32) return [range];
const _wRvqjbLC = _uxBsTzls.toLong4(range);
const _xAmmZSfo = (0xFFFFFFFF << (32 - _bRMWGRfA)) >>> 0;
const _DqdXwQMw = _wRvqjbLC & _xAmmZSfo;
const _fwWRWrUL = 1 << (32 - _bRMWGRfA);
if (_fwWRWrUL <= 2) return [];
const _VxfqUvsp = Math.min(_YqneDDnW, _fwWRWrUL - 2);
let _IrEuvFht = 0;
while (_waxBKSXV.size < _VxfqUvsp && _IrEuvFht < _VxfqUvsp * 5) {
const _YOzLQkvy = Math.floor(Math.random() * (_fwWRWrUL - 2)) + 1;
_waxBKSXV.add(_uxBsTzls.fromLong4((_DqdXwQMw + _YOzLQkvy) >>> 0));
_IrEuvFht++;
}
return Array.from(_waxBKSXV);
} else if (_uxBsTzls.isIPv6(range)) {
if (isNaN(_bRMWGRfA) || _bRMWGRfA < 16 || _bRMWGRfA > 128) return [];
if (_bRMWGRfA === 128) return [range];
const _UnQnMfLZ = _uxBsTzls.toBigInt6(range);
const _xAmmZSfo = (2n ** BigInt(128 - _bRMWGRfA) - 1n);
const _DqdXwQMw = _UnQnMfLZ & ~_xAmmZSfo;
const _nEDptMcT = 2n ** BigInt(128 - _bRMWGRfA);
if (_nEDptMcT <= 2n) return [];
let _IrEuvFht = 0;
while (_waxBKSXV.size < _YqneDDnW && _IrEuvFht < _YqneDDnW * 5) {
const _LiOoEEqV = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LiOoEEqV);
let _dBhcDSJU = 0n;
for (const _MkOvJMvO of _LiOoEEqV) {
_dBhcDSJU = (_dBhcDSJU << 8n) | BigInt(_MkOvJMvO);
}
const _YOzLQkvy = _dBhcDSJU % (_nEDptMcT - 2n) + 1n;
_waxBKSXV.add(_uxBsTzls.fromBigInt6(_DqdXwQMw + _YOzLQkvy));
_IrEuvFht++;
}
return Array.from(_waxBKSXV);
}
return [];
} catch(_HSaPiVio) {
console.error(`CIDR to range failed for ${cidr}:`, _HSaPiVio);
return [];
}
}
};
function _dsfQSrYh(_REZXYOwq, _jpeJmAih) {
const _ZXaYAHfj = {};
const _LchlAokr = Object._LchlAokr(_jpeJmAih);
const _WsMVYUMo = _LchlAokr.map(_ZBduXtts => {
const _ZckwSDQE = _REZXYOwq * (_jpeJmAih[_ZBduXtts] / 100);
return { _ZBduXtts, _YqneDDnW: Math.floor(_ZckwSDQE), remainder: _ZckwSDQE - Math.floor(_ZckwSDQE) };
});
let _FxAcIUgO = _WsMVYUMo.reduce((acc, _WJoFcUBS) => acc + _WJoFcUBS._YqneDDnW, 0);
_WsMVYUMo.sort((a, b) => b.remainder - a.remainder);
let _yIpfFcxH = _REZXYOwq - _FxAcIUgO;
for (let _sNkxdnSw = 0; _sNkxdnSw < _yIpfFcxH; _sNkxdnSw++) {
_WsMVYUMo[_sNkxdnSw % _WsMVYUMo._kmlcYbyh]._YqneDDnW++;
}
for (const _WJoFcUBS of _WsMVYUMo) {
_ZXaYAHfj[_WJoFcUBS._ZBduXtts] = _WJoFcUBS._YqneDDnW;
}
return _ZXaYAHfj;
}
async function _DnknIPhG(_DGVzWTWr) {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_enYvHfiw);
const { _YsUzOrSf } = await _yKWnNoEL.all();
return _YsUzOrSf._kmlcYbyh > 0 ? _YsUzOrSf[0]._oPLQvCWJ : null;
}
async function _zLuaHEtU(_DGVzWTWr, _CGGymZWK) {
const _yKWnNoEL = _DGVzWTWr.DB.prepare(
"INSERT INTO kv_data (_ZBduXtts, _oPLQvCWJ) VALUES (?, ?) ON CONFLICT(_ZBduXtts) DO UPDATE SET _oPLQvCWJ = excluded._oPLQvCWJ"
);
await _yKWnNoEL.bind(_enYvHfiw, _CGGymZWK).run();
}
async function _MLPZOXGO(_hOmwWITD, _DGVzWTWr) {
const { _CGGymZWK } = await _hOmwWITD.json();
const _bIBSiQCy = await _DnknIPhG(_DGVzWTWr);
if (_bIBSiQCy === _CGGymZWK) {
return _mOcfYIac({ success: true });
}
return _mOcfYIac({ success: false, _huFkLpSQ: '密码错误' }, 401);
}
async function _YDKKfHXk(_hOmwWITD, _DGVzWTWr) {
const _ouleJWZR = await _WKGcyhlo(_DGVzWTWr);
if (!_ouleJWZR.visitorPassword || !_ouleJWZR.visitorPassword._kRWzFOum) {
return _mOcfYIac({ success: true });
}
try {
const { _CGGymZWK } = await _hOmwWITD.json();
const _gHhZzOrY = _ouleJWZR.visitorPassword._CGGymZWK;
if (_gHhZzOrY && _CGGymZWK === _gHhZzOrY) {
return _mOcfYIac({ success: true });
}
return _mOcfYIac({ success: false, _huFkLpSQ: '访客密码错误' }, 401);
} catch (_HSaPiVio) {
return _mOcfYIac({ success: false, _huFkLpSQ: '无效请求' }, 400);
}
}
async function _WaPPCEOc(_hOmwWITD, _DGVzWTWr) {
const _kkpGNVdX = await _DnknIPhG(_DGVzWTWr);
if (_kkpGNVdX) {
return _mOcfYIac({ success: false, _huFkLpSQ: "密码已设置,无法重复初始化。" }, 403);
}
const { _CGGymZWK } = await _hOmwWITD.json();
if (!_CGGymZWK || _CGGymZWK._kmlcYbyh < 6) {
return _mOcfYIac({ success: false, _huFkLpSQ: "密码长度不能少于6位。" }, 400);
}
await _zLuaHEtU(_DGVzWTWr, _CGGymZWK);
return _mOcfYIac({ success: true, _huFkLpSQ: "初始密码设置成功!请刷新页面并登录。" });
}
async function _eXWfWxxF(_hOmwWITD, _DGVzWTWr) {
const { _pGquWqUv, _STFLldgC } = await _hOmwWITD.json();
const _bIBSiQCy = await _DnknIPhG(_DGVzWTWr);
if (_bIBSiQCy !== _pGquWqUv) {
return _mOcfYIac({ success: false, _huFkLpSQ: "旧密码错误。" }, 403);
}
if (!_STFLldgC || _STFLldgC._kmlcYbyh < 6) {
return _mOcfYIac({ success: false, _huFkLpSQ: "新密码长度不能少于6位。" }, 400);
}
await _zLuaHEtU(_DGVzWTWr, _STFLldgC);
return _mOcfYIac({ success: true, _huFkLpSQ: "密码修改成功!" });
}
function _ytVEHQCx() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_pgRcTGtG: '',
api: {
_kRWzFOum: true,
_huFkLpSQ: '维护中...',
},
ispFilter: { _kRWzFOum: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_kRWzFOum: true
},
websocketStreamer: {
_kRWzFOum: true,
_cLqtLPfd: 'https://snippets.neib.cn'
},
cloudStorage: {
_kRWzFOum: true
},
visitorPassword: {
_kRWzFOum: false,
_CGGymZWK: '',
},
customSubPath: {
_kRWzFOum: false,
_qPHFSpGH: 'latest',
},
subscriptionId: {
_kmlcYbyh: 8,
_DxfDIAcD: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_kRWzFOum: true,
template: 'vless://{_stQoSWYb}@{_ROfDcQNw}:{_maIJuKHX}?encryption=none&security=tls&sni={_OchiPaNj}&fp=random&_MnKvCiLn=ws&_OchiPaNj={_OchiPaNj}&_qPHFSpGH={_qPHFSpGH}#{_dokJrbFl}',
selectionMode: 'first',
_tLqWIHBf: [
{ _dokJrbFl: '默认配置', _OchiPaNj: '', '_stQoSWYb': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _qPHFSpGH: '/?ed=2560' }
],
_DBrGgsHj: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_kRWzFOum: false,
_HipkANEK: '',
_neQJfQiN: 5
},
marquee: {
_kRWzFOum: false,
_HipkANEK: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_kRWzFOum: true,
sources: [
{ _BsDjLqsH: 'CF官方IPV4', _waxBKSXV: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 20 },
{ _BsDjLqsH: 'CF官方IPV6', _waxBKSXV: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 20 },
{ _BsDjLqsH: '反代优选0', _waxBKSXV: 'https://wvs.sosorg.nyc.mn/sub?_stQoSWYb=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_MnKvCiLn=ws&_OchiPaNj=ss.nzvrn.com&_qPHFSpGH=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 30 },
{ _BsDjLqsH: '官方优选1', _waxBKSXV: 'https://ipdb.api.030101.xyz/?_MnKvCiLn=bestcf&_xoUjZJDZ=true', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 10 },
{ _BsDjLqsH: '反代优选2', _waxBKSXV: 'https://ipdb.api.030101.xyz/?_MnKvCiLn=bestproxy&_xoUjZJDZ=true', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 5 },
{ _BsDjLqsH: '官方优选2', _waxBKSXV: 'https://addressesapi.090227.xyz/_ROfDcQNw.164746.xyz', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 10 },
{ _BsDjLqsH: '官方优选3', _waxBKSXV: 'https://cfxr.eu.org/getSub?_OchiPaNj=snipaste.huggy.qzz.io', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 5 },
{ _BsDjLqsH: '官方优选4', _waxBKSXV: 'https://addressesapi.090227.xyz/CloudFlareYes', _JlLgWZWA: false, _kRWzFOum: true, _OUSYyLzW: 10 }
]
},
customNodes: {
_kRWzFOum: 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 _DpeHFSBY(_EpjAuMuy, _zoNrWaBw) {
if (!_EpjAuMuy) return _zoNrWaBw;
const _ZBdGMhmD = { ..._zoNrWaBw };
for (const _ZBduXtts in _zoNrWaBw) {
if (_EpjAuMuy.hasOwnProperty(_ZBduXtts)) {
if (typeof _EpjAuMuy[_ZBduXtts] === 'object' && _EpjAuMuy[_ZBduXtts] !== null && !Array.isArray(_EpjAuMuy[_ZBduXtts]) && typeof _zoNrWaBw[_ZBduXtts] === 'object' && _zoNrWaBw[_ZBduXtts] !== null && !Array.isArray(_zoNrWaBw[_ZBduXtts])) {
_ZBdGMhmD[_ZBduXtts] = _DpeHFSBY(_EpjAuMuy[_ZBduXtts], _zoNrWaBw[_ZBduXtts]);
} else {
_ZBdGMhmD[_ZBduXtts] = _EpjAuMuy[_ZBduXtts];
}
}
}
return _ZBdGMhmD;
}
async function _WKGcyhlo(_DGVzWTWr) {
try {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_lDLmMnmD);
const { _YsUzOrSf } = await _yKWnNoEL.all();
const _qnxqFTOh = _YsUzOrSf._kmlcYbyh > 0 ? _YsUzOrSf[0]._oPLQvCWJ : null;
const _ErLzgQBO = _qnxqFTOh ? JSON.parse(_qnxqFTOh) : {};
return _DpeHFSBY(_ErLzgQBO, _ytVEHQCx());
} catch (_HSaPiVio) {
console.error("无法从D1获取或解析全局配置:", _HSaPiVio);
return _ytVEHQCx();
}
}
async function _wNunUNvr(_DGVzWTWr) {
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
return _mOcfYIac(_ITAcMrLp);
}
async function _CIwKGrVp(_hOmwWITD, _DGVzWTWr, _WqGMjBmq) {
try {
const { _ITAcMrLp, adminPassword } = await _hOmwWITD.json();
const _bIBSiQCy = await _DnknIPhG(_DGVzWTWr);
if (_bIBSiQCy !== adminPassword) {
return _mOcfYIac({ success: false, _huFkLpSQ: "管理员密码错误" }, 403);
}
const _yKWnNoEL = _DGVzWTWr.DB.prepare(
"INSERT INTO kv_data (_ZBduXtts, _oPLQvCWJ) VALUES (?, ?) ON CONFLICT(_ZBduXtts) DO UPDATE SET _oPLQvCWJ = excluded._oPLQvCWJ"
);
const _HCTkKdUV = _yKWnNoEL.bind(_lDLmMnmD, JSON.stringify(_ITAcMrLp)).run();
_WqGMjBmq.waitUntil(_HCTkKdUV);
return _mOcfYIac({ success: true, _huFkLpSQ: "配置已成功保存!" });
} catch (_HSaPiVio) {
return _mOcfYIac({ success: false, _huFkLpSQ: `保存失败: ${_HSaPiVio._huFkLpSQ}` }, 500);
}
}
async function _sySQJOTy() {
const _iEFMTZVU = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _PdIgQzly = await fetch(_iEFMTZVU);
const _LXhGKJWl = await _PdIgQzly.json();
const _QjYYzmvj = 'https://www.bing.com' + _LXhGKJWl.images[0]._cLqtLPfd;
return fetch(_QjYYzmvj);
} catch (_HSaPiVio) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _yYmWrIwk(_ROfDcQNw) {
try {
const _yuRRNMnj = await fetch(`http://_ROfDcQNw-api.com/json/${_ROfDcQNw}?fields=status,_xoUjZJDZ,countryCode,_lxKbOpGq&lang=zh-CN`);
if (_yuRRNMnj.ok) {
const _AFQviEVZ = await _yuRRNMnj.json();
if (_AFQviEVZ.status === 'success' && (_AFQviEVZ.countryCode || _AFQviEVZ._xoUjZJDZ)) {
let _lxKbOpGq = _AFQviEVZ._lxKbOpGq || '未知';
if (_lxKbOpGq.toLowerCase().includes('cloudflare')) {
_lxKbOpGq = 'CloudFlare';
}
return {
_BsDjLqsH: _CDhGyxjT[_AFQviEVZ.countryCode] || _AFQviEVZ._xoUjZJDZ || _AFQviEVZ.countryCode,
_lxKbOpGq: _lxKbOpGq
};
}
}
} catch (_HSaPiVio) {}
try {
const _yuRRNMnj = await fetch(`https://api._ROfDcQNw.sb/geoip/${_ROfDcQNw}`);
if (_yuRRNMnj.ok) {
const _AFQviEVZ = await _yuRRNMnj.json();
if (_AFQviEVZ.country_code || _AFQviEVZ._xoUjZJDZ) {
let _lxKbOpGq = _AFQviEVZ._lxKbOpGq || '未知';
if (_lxKbOpGq.toLowerCase().includes('cloudflare')) {
_lxKbOpGq = 'CloudFlare';
}
return {
_BsDjLqsH: _CDhGyxjT[_AFQviEVZ.country_code] || _AFQviEVZ._xoUjZJDZ || _AFQviEVZ.country_code,
_lxKbOpGq: _lxKbOpGq
};
}
}
} catch (_HSaPiVio) {}
return { _BsDjLqsH: '未知', _lxKbOpGq: '未知' };
}
async function _QWtwIZQg(_hOmwWITD, _DGVzWTWr) {
try {
const { _waxBKSXV } = await _hOmwWITD.json();
if (!Array.isArray(_waxBKSXV)) {
return _mOcfYIac({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _LaqZdjok = _waxBKSXV.map(_ROfDcQNw => _yYmWrIwk(_ROfDcQNw).then(_NUyOgDgy => ({ _ROfDcQNw, ..._NUyOgDgy })));
const _YsUzOrSf = await Promise.all(_LaqZdjok);
return _mOcfYIac(_YsUzOrSf);
} catch (_HSaPiVio) {
return _mOcfYIac({ error: `获取地理位置失败: ${_HSaPiVio._huFkLpSQ}` }, 500);
}
}
async function _iBwzNLev(_hOmwWITD, _DGVzWTWr) {
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (!_ITAcMrLp.cloudStorage._kRWzFOum) {
return _mOcfYIac({ _YsUzOrSf: [], generatedBy: null });
}
try {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_uvntuCDl);
const { _YsUzOrSf } = await _yKWnNoEL.all();
const _wUVxfYwA = _YsUzOrSf._kmlcYbyh > 0 ? _YsUzOrSf[0]._oPLQvCWJ : null;
const _ykbkxlwG = _wUVxfYwA ? JSON.parse(_wUVxfYwA) : null;
return _mOcfYIac(_ykbkxlwG || { _YsUzOrSf: [], generatedBy: null });
} catch (_HSaPiVio) {
console.error("从D1读取缓存IP失败:", _HSaPiVio);
return _mOcfYIac({ _YsUzOrSf: [], generatedBy: null });
}
}
async function _wKHuORcN(_hOmwWITD, _DGVzWTWr, _WqGMjBmq) {
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (!_ITAcMrLp.cloudStorage._kRWzFOum) {
return _mOcfYIac({ success: true, _huFkLpSQ: "云端存储已禁用,不保存结果。" });
}
const _dgyLVAiG = _hOmwWITD._ceQBzYPA.get('CF-Connecting-IP') || "未知IP";
const _xoUjZJDZ = _hOmwWITD.cf?._xoUjZJDZ || "未知";
const _hQgYSoOB = _hOmwWITD.cf?._hQgYSoOB || "";
let _myIhfarX = _CDhGyxjT[_xoUjZJDZ] || _xoUjZJDZ;
if (_hQgYSoOB && _hQgYSoOB !== "未知城市" && _hQgYSoOB !== _xoUjZJDZ) _myIhfarX = `${_myIhfarX} ${_CDhGyxjT[_hQgYSoOB] || _hQgYSoOB}`;
const _QyKwRrdH = {
_ROfDcQNw: _nDqkyJOP(_dgyLVAiG),
_BsDjLqsH: _myIhfarX.trim(),
time: _bsWLquLp()
};
try {
const _oADliKeH = await _hOmwWITD.json();
if (!Array.isArray(_oADliKeH)) return _mOcfYIac({ error: "无效数据格式" }, 400);
const _GxTLofHQ = _oADliKeH.map(_LDUbjMOK => ({
_ROfDcQNw: String(_LDUbjMOK._ROfDcQNw || ''),
_maIJuKHX: _LDUbjMOK._maIJuKHX ? parseInt(_LDUbjMOK._maIJuKHX, 10) : undefined,
_THklotHV: parseInt(_LDUbjMOK._THklotHV, 10),
_BsDjLqsH: typeof _LDUbjMOK._BsDjLqsH === 'string' ? _LDUbjMOK._BsDjLqsH.substring(0, 50) : 'N/A',
_lxKbOpGq: typeof _LDUbjMOK._lxKbOpGq === 'string' ? _LDUbjMOK._lxKbOpGq.substring(0, 100) : 'N/A'
}));
const _rPWbGqCP = {
generatedBy: _QyKwRrdH,
_YsUzOrSf: _GxTLofHQ
};
const _yEWHEsVn = _DGVzWTWr.DB.prepare(
"INSERT INTO kv_data (_ZBduXtts, _oPLQvCWJ) VALUES (?, ?) ON CONFLICT(_ZBduXtts) DO UPDATE SET _oPLQvCWJ = excluded._oPLQvCWJ"
).bind(_uvntuCDl, JSON.stringify(_rPWbGqCP)).run();
if (_ITAcMrLp.telegram.bot_token && _ITAcMrLp.telegram.chat_id) {
const _YexoVQkM = _GxTLofHQ.map(r => `${r._ROfDcQNw} ~ ${r._BsDjLqsH}`).join('\n');
const _FrDHOsOm = `优选完成!\n来源: ${_QyKwRrdH._ROfDcQNw} (${_QyKwRrdH._BsDjLqsH})\n时间: ${_QyKwRrdH.time}\n\n结果:\n${_YexoVQkM}`;
const _MsToFLBf = `https://api.telegram.org/bot${_ITAcMrLp.telegram.bot_token}/sendMessage?chat_id=${_ITAcMrLp.telegram.chat_id}&_HipkANEK=${encodeURIComponent(_FrDHOsOm)}`;
const _fmeACzsb = fetch(_MsToFLBf).catch(_HSaPiVio => console.error("Telegram结果通知失败:", _HSaPiVio));
_WqGMjBmq.waitUntil(Promise.all([_yEWHEsVn, _fmeACzsb]));
} else {
_WqGMjBmq.waitUntil(_yEWHEsVn);
}
return _mOcfYIac({ success: true, _huFkLpSQ: "结果已保存" });
} catch (_HSaPiVio) {
return _mOcfYIac({ error: "D1写入失败", _huFkLpSQ: _HSaPiVio._huFkLpSQ }, 500);
}
}
async function _YlOgvqAf(_hOmwWITD, _DGVzWTWr, _WqGMjBmq) {
try {
const _ytPneDis = await _hOmwWITD.json();
if (!Array.isArray(_ytPneDis)) return _mOcfYIac({ error: "无效数据格式" }, 400);
const _rPWbGqCP = {
_YsUzOrSf: _ytPneDis
};
const _yKWnNoEL = _DGVzWTWr.DB.prepare(
"INSERT INTO kv_data (_ZBduXtts, _oPLQvCWJ) VALUES (?, ?) ON CONFLICT(_ZBduXtts) DO UPDATE SET _oPLQvCWJ = excluded._oPLQvCWJ"
);
const _HCTkKdUV = _yKWnNoEL.bind(_XwVcGVbw, JSON.stringify(_rPWbGqCP)).run();
_WqGMjBmq.waitUntil(_HCTkKdUV);
return _mOcfYIac({ success: true });
} catch (_HSaPiVio) {
return _mOcfYIac({ error: "D1写入临时缓存失败", _huFkLpSQ: _HSaPiVio._huFkLpSQ }, 500);
}
}
function _DEpWnBWG(_kmlcYbyh, _DxfDIAcD) {
let _hvQOXhQC = '';
const _PhIUuyBN = _DxfDIAcD._kmlcYbyh;
for (let _sNkxdnSw = 0; _sNkxdnSw < _kmlcYbyh; _sNkxdnSw++) {
_hvQOXhQC += _DxfDIAcD.charAt(Math.floor(Math.random() * _PhIUuyBN));
}
return _hvQOXhQC;
}
async function _OXJoHqtw(_hOmwWITD, _DGVzWTWr) {
try {
const _oADliKeH = await _hOmwWITD.json();
if (!Array.isArray(_oADliKeH) || _oADliKeH._kmlcYbyh === 0) {
return _mOcfYIac({ error: "无效或空的IP列表" }, 400);
}
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
const _VBPlBAsw = _ITAcMrLp.subscriptionId || { _kmlcYbyh: 8, _DxfDIAcD: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _XKuIMZsw;
let _aWRJHogl = false;
let _IrEuvFht = 0;
const _IYvZcofd = 10;
while (!_aWRJHogl && _IrEuvFht < _IYvZcofd) {
_XKuIMZsw = _DEpWnBWG(_VBPlBAsw._kmlcYbyh, _VBPlBAsw._DxfDIAcD);
const { _YsUzOrSf } = await _DGVzWTWr.DB.prepare("SELECT _CrTQJsmX FROM optimized_results WHERE _CrTQJsmX = ?").bind(_XKuIMZsw).all();
if (_YsUzOrSf._kmlcYbyh === 0) {
_aWRJHogl = true;
}
_IrEuvFht++;
}
if (!_aWRJHogl) {
return _mOcfYIac({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _OniVkkKG = JSON.stringify({ _waxBKSXV: _oADliKeH });
await _DGVzWTWr.DB.prepare(
"INSERT INTO optimized_results (_CrTQJsmX, _AFQviEVZ) VALUES (?, ?)"
).bind(_XKuIMZsw, _OniVkkKG).run();
await _DGVzWTWr.DB.prepare(
"INSERT INTO kv_data (_ZBduXtts, _oPLQvCWJ) VALUES (?, ?) ON CONFLICT(_ZBduXtts) DO UPDATE SET _oPLQvCWJ = excluded._oPLQvCWJ"
).bind(_bXcxtmaq, _XKuIMZsw).run();
return _mOcfYIac({ success: true, _CrTQJsmX: _XKuIMZsw });
} catch (_HSaPiVio) {
return _mOcfYIac({ error: "保存优选结果失败", _huFkLpSQ: _HSaPiVio._huFkLpSQ }, 500);
}
}
async function _aSRStAQy(_hOmwWITD, _DGVzWTWr) {
try {
const _XKuIMZsw = _hOmwWITD._BDMQaCkK._CrTQJsmX;
if (!_XKuIMZsw) {
return new Response("缺少结果ID", { status: 400 });
}
const _hvQOXhQC = await _DGVzWTWr.DB.prepare("SELECT _AFQviEVZ FROM optimized_results WHERE _CrTQJsmX = ?").bind(_XKuIMZsw).first();
if (!_hvQOXhQC) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _AFQviEVZ = JSON.parse(_hvQOXhQC._AFQviEVZ);
let _YexoVQkM = _AFQviEVZ._waxBKSXV;
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (_ITAcMrLp.customNodes && _ITAcMrLp.customNodes._kRWzFOum && _ITAcMrLp.customNodes.list) {
const _XAbvggLC = _ITAcMrLp.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _OtiyPRTf = _XAbvggLC.map(_HOxcmQcX => {
let _FrKREStR = _HOxcmQcX;
let _maIJuKHX = undefined;
let _dokJrbFl = null;
if (_FrKREStR.includes('@')) {
const _WsMVYUMo = _FrKREStR.split('@');
_dokJrbFl = _WsMVYUMo.pop();
_FrKREStR = _WsMVYUMo.join('@');
}
if (_FrKREStR.includes('#')) {
const _WsMVYUMo = _FrKREStR.split('#');
const _QgEViUSa = _WsMVYUMo.pop();
if (!isNaN(_QgEViUSa) && _QgEViUSa.trim() !== '') {
_maIJuKHX = parseInt(_QgEViUSa, 10);
}
_FrKREStR = _WsMVYUMo.join('#');
}
return {
_ROfDcQNw: _FrKREStR,
_maIJuKHX: _maIJuKHX,
_BsDjLqsH: _dokJrbFl || _FrKREStR,
_lxKbOpGq: '自定义'
};
});
_YexoVQkM.unshift(..._OtiyPRTf);
}
const { itemLink } = _ITAcMrLp;
const _NDiAVXHE = new URL(_hOmwWITD._cLqtLPfd)._MOChWbTW;
let _nCMzrILl;
if (_ITAcMrLp.websocketStreamer && _ITAcMrLp.websocketStreamer._kRWzFOum) {
if (!itemLink || !itemLink._kRWzFOum || !itemLink._tLqWIHBf || itemLink._tLqWIHBf._kmlcYbyh === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_nCMzrILl = _YexoVQkM.map((_LDUbjMOK, _bfSIdqfC) => {
let _dokJrbFl;
if (_LDUbjMOK._lxKbOpGq === '自定义') {
_dokJrbFl = `${_bfSIdqfC + 1} - ${_LDUbjMOK._BsDjLqsH}`;
} else {
_dokJrbFl = `${_bfSIdqfC + 1} - ${_LDUbjMOK._BsDjLqsH || '未知'}`;
if (!_LDUbjMOK._lxKbOpGq || !_LDUbjMOK._lxKbOpGq.toLowerCase().includes('cloudflare')) {
_dokJrbFl += '(反代)';
}
}
const _svUcSbhd = _uxBsTzls.isIPv6(_LDUbjMOK._ROfDcQNw) ? `[${_LDUbjMOK._ROfDcQNw}]` : _LDUbjMOK._ROfDcQNw;
const _maIJuKHX = _LDUbjMOK._maIJuKHX || 443;
const _WeggTUaA = itemLink._tLqWIHBf[0];
const _oDudjIhf = _WeggTUaA._stQoSWYb || '';
const _stQoSWYb = (_oDudjIhf && _cKgEGCkQ(_oDudjIhf)) ? _oDudjIhf : crypto.randomUUID();
const _qPHFSpGH = '/snippets?_ROfDcQNw=endpointAddress:_maIJuKHX(443)&nat64=6to4';
const _OchiPaNj = _WeggTUaA._OchiPaNj || _NDiAVXHE;
const _BDMQaCkK = new URLSearchParams({
security: 'tls',
_MnKvCiLn: 'ws',
_OchiPaNj: _OchiPaNj,
sni: _OchiPaNj,
fp: 'random'
});
return `vless://${_stQoSWYb}@${_svUcSbhd}:${_maIJuKHX}?${_BDMQaCkK.toString()}&_qPHFSpGH=${encodeURIComponent(encodeURIComponent(_qPHFSpGH))}#${encodeURIComponent(_dokJrbFl)}`;
});
} else {
if (!itemLink || !itemLink._kRWzFOum || !itemLink._tLqWIHBf || itemLink._tLqWIHBf._kmlcYbyh === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _WeggTUaA = itemLink._tLqWIHBf[0];
const { _OchiPaNj, _stQoSWYb, _qPHFSpGH } = _WeggTUaA;
_nCMzrILl = _YexoVQkM.map((_LDUbjMOK, _bfSIdqfC) => {
let _dokJrbFl;
if (_LDUbjMOK._lxKbOpGq === '自定义') {
_dokJrbFl = `${_bfSIdqfC + 1} - ${_LDUbjMOK._BsDjLqsH}`;
} else {
_dokJrbFl = `${_bfSIdqfC + 1} - ${_LDUbjMOK._BsDjLqsH || '未知'}`;
if (!_LDUbjMOK._lxKbOpGq || !_LDUbjMOK._lxKbOpGq.toLowerCase().includes('cloudflare')) {
_dokJrbFl += '(反代)';
}
}
const _svUcSbhd = _uxBsTzls.isIPv6(_LDUbjMOK._ROfDcQNw) ? `[${_LDUbjMOK._ROfDcQNw}]` : _LDUbjMOK._ROfDcQNw;
const _maIJuKHX = _LDUbjMOK._maIJuKHX || 443;
const _BDMQaCkK = new URLSearchParams({
security: 'tls',
_MnKvCiLn: 'ws',
_OchiPaNj: _OchiPaNj || _NDiAVXHE,
sni: _OchiPaNj || _NDiAVXHE,
fp: 'random'
});
return `vless://${_stQoSWYb}@${_svUcSbhd}:${_maIJuKHX}?${_BDMQaCkK.toString()}&_qPHFSpGH=${encodeURIComponent(encodeURIComponent(_qPHFSpGH || ''))}#${encodeURIComponent(_dokJrbFl)}`;
});
}
const _aveWsuCK = _nCMzrILl.join('\n');
const _WKLJgwza = btoa(_aveWsuCK);
return new Response(_WKLJgwza, {
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' }
});
} catch (_HSaPiVio) {
return new Response(`生成节点列表失败: ${_HSaPiVio._huFkLpSQ}`, { status: 500 });
}
}
async function _UUIOZCGK(_hOmwWITD) {
try {
const { _zWrzSkou, _MnKvCiLn } = await _hOmwWITD.json();
if (!Array.isArray(_zWrzSkou)) {
return new Response('Invalid _zWrzSkou list', { status: 400 });
}
const _ojpazOwI = _zWrzSkou.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _cLqtLPfd = `https://cloudflare-dns.com/dns-query?_dokJrbFl=${encodeURIComponent(domain.trim())}&_MnKvCiLn=${_MnKvCiLn || 'A'}`;
return fetch(_cLqtLPfd, { _ceQBzYPA: { 'Accept': 'application/dns-json' } })
.then(_yuRRNMnj => _yuRRNMnj.json())
.then(_AFQviEVZ => (_AFQviEVZ.Answer ? _AFQviEVZ.Answer.map(a => a._AFQviEVZ) : []))
.catch(() => []);
});
const _HUammMFW = (await Promise.all(_ojpazOwI)).flat();
const _EHVMsrKP = [...new Set(_HUammMFW)];
if (_EHVMsrKP._kmlcYbyh === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_EHVMsrKP.join('\n'), { _ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._huFkLpSQ}`, { status: 500 });
}
}
async function _CELxiaiq(_hOmwWITD, _DGVzWTWr) {
try {
const { _nWvOEoYV } = await _hOmwWITD.json();
if (!Array.isArray(_nWvOEoYV)) {
return _mOcfYIac({ error: "Invalid input, expected an object with a '_nWvOEoYV' array." }, 400);
}
const _CRvLnkRh = new Set();
const _OhyRJARj = _nWvOEoYV.map(_cLqtLPfd =>
_KyunSOpz(_cLqtLPfd)
.then(_HipkANEK => {
if (!_HipkANEK) return;
const _OzbyQvTU = _HipkANEK.split(/[\s,;|]+/);
for (const _cxhHYiYW of _OzbyQvTU) {
const _PqHSwUiy = _cxhHYiYW.trim();
if (_PqHSwUiy) {
_CRvLnkRh.add(_PqHSwUiy);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_cLqtLPfd}:`, err);
})
);
await Promise.all(_OhyRJARj);
return _mOcfYIac({ _waxBKSXV: Array.from(_CRvLnkRh) });
} catch (_HSaPiVio) {
return _mOcfYIac({ error: `Failed to process URLs: ${_HSaPiVio._huFkLpSQ}` }, 500);
}
}
async function _JdKCSLUU(_hOmwWITD, _DGVzWTWr) {
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (!_ITAcMrLp.api._kRWzFOum) {
return new Response(_ITAcMrLp.api._huFkLpSQ || 'API is disabled.', { status: 503 });
}
try {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_uvntuCDl);
const { _YsUzOrSf: dbResults } = await _yKWnNoEL.all();
const _wUVxfYwA = dbResults._kmlcYbyh > 0 ? dbResults[0]._oPLQvCWJ : null;
const _ykbkxlwG = _wUVxfYwA ? JSON.parse(_wUVxfYwA) : null;
if (!_ykbkxlwG || !_ykbkxlwG._YsUzOrSf || _ykbkxlwG._YsUzOrSf._kmlcYbyh === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' },
});
}
const _waxBKSXV = _ykbkxlwG._YsUzOrSf.map(r => r._ROfDcQNw);
return new Response(_waxBKSXV.join('\n'), {
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' },
});
} catch (_HSaPiVio) {
console.error("API /_ROfDcQNw 处理错误:", _HSaPiVio);
return new Response(`API处理时出错: ${_HSaPiVio._huFkLpSQ}`, { status: 500 });
}
}
function _zQdDWnAF(_hvQOXhQC, _bfSIdqfC, _ITAcMrLp, _NDiAVXHE) {
const { itemLink } = _ITAcMrLp;
if (!itemLink || !itemLink._kRWzFOum) return null;
const { template, _tLqWIHBf, selectionMode, _DBrGgsHj } = itemLink;
if (!_tLqWIHBf || _tLqWIHBf._kmlcYbyh === 0) return null;
let _ClOajYiu;
if (selectionMode === 'random') {
_ClOajYiu = _tLqWIHBf[_bfSIdqfC % _tLqWIHBf._kmlcYbyh];
} else if (selectionMode === 'first') {
_ClOajYiu = _tLqWIHBf[0];
} else {
_ClOajYiu = _tLqWIHBf.find(s => s._dokJrbFl === selectionMode) || _tLqWIHBf[0];
}
if (!_ClOajYiu) return null;
let _IjanWRwF = template;
const _ZLDKLHcq = _hvQOXhQC._maIJuKHX || 443;
const _qbsZqMaw = _uxBsTzls.isIPv6(_hvQOXhQC._ROfDcQNw) ? `[${_hvQOXhQC._ROfDcQNw}]` : _hvQOXhQC._ROfDcQNw;
let _dokJrbFl = `${_bfSIdqfC + 1} 、 ${_hvQOXhQC._BsDjLqsH || '未知'}`;
if (!_hvQOXhQC._lxKbOpGq || !_hvQOXhQC._lxKbOpGq.toLowerCase().includes('cloudflare')) {
_dokJrbFl += '(反代)';
}
let _OchiPaNj = _ClOajYiu._OchiPaNj || _NDiAVXHE;
_IjanWRwF = _IjanWRwF.replace(/{_ROfDcQNw}/g, _qbsZqMaw)
.replace(/{_maIJuKHX}/g, _ZLDKLHcq)
.replace(/{_dokJrbFl}/g, encodeURIComponent(_dokJrbFl))
.replace(/{rank}/g, _bfSIdqfC + 1)
.replace(/{_BsDjLqsH}/g, encodeURIComponent(_hvQOXhQC._BsDjLqsH || '未知'))
.replace(/{_lxKbOpGq}/g, encodeURIComponent(_hvQOXhQC._lxKbOpGq || '未知'))
.replace(/{_OchiPaNj}/g, encodeURIComponent(_OchiPaNj))
.replace(/{_stQoSWYb}/g, encodeURIComponent(_ClOajYiu['_stQoSWYb'] || ''))
.replace(/{_qPHFSpGH}/g, encodeURIComponent(encodeURIComponent(_ClOajYiu._qPHFSpGH || '')));
if (_DBrGgsHj) {
_DBrGgsHj.forEach(field => {
const _HNausmHa = new RegExp('{' + field._dokJrbFl + '}', 'g');
_IjanWRwF = _IjanWRwF.replace(_HNausmHa, encodeURIComponent(field._oPLQvCWJ));
});
}
return _IjanWRwF;
}
async function _wldMOlCR(_hOmwWITD, _DGVzWTWr) {
const _ITAcMrLp = await _WKGcyhlo(_DGVzWTWr);
if (!_ITAcMrLp.itemLink._kRWzFOum) {
return new Response("Item _IjanWRwF feature is disabled.", { status: 503, _ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' } });
}
try {
const _yKWnNoEL = _DGVzWTWr.DB.prepare("SELECT _oPLQvCWJ FROM kv_data WHERE _ZBduXtts = ?").bind(_uvntuCDl);
const { _YsUzOrSf: dbResults } = await _yKWnNoEL.all();
const _wUVxfYwA = dbResults._kmlcYbyh > 0 ? dbResults[0]._oPLQvCWJ : null;
const _ykbkxlwG = _wUVxfYwA ? JSON.parse(_wUVxfYwA) : null;
if (!_ykbkxlwG || !_ykbkxlwG._YsUzOrSf || _ykbkxlwG._YsUzOrSf._kmlcYbyh === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' },
});
}
const _NDiAVXHE = new URL(_hOmwWITD._cLqtLPfd)._MOChWbTW;
const _xhImiqlp = _ykbkxlwG._YsUzOrSf.map((_hvQOXhQC, _bfSIdqfC) => {
return _zQdDWnAF(_hvQOXhQC, _bfSIdqfC, _ITAcMrLp, _NDiAVXHE);
}).filter(Boolean);
if (_xhImiqlp._kmlcYbyh === 0) {
return new Response("Could not generate any _LDUbjMOK links from the available IPs.", {
status: 500,
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' },
});
}
return new Response(_xhImiqlp.join('\n'), {
_ceQBzYPA: { 'Content-Type': '_HipkANEK/plain; _DxfDIAcD=utf-8' },
});
} catch (_HSaPiVio) {
console.error("API /api/endpoints error:", _HSaPiVio);
return new Response(`Error processing API _hOmwWITD: ${_HSaPiVio._huFkLpSQ}`, { status: 500 });
}
}
async function _kkgNOWAv(_hOmwWITD, _DGVzWTWr, _WqGMjBmq) {
const _dgyLVAiG = _hOmwWITD._ceQBzYPA.get('CF-Connecting-IP') || "未知IP";
const [
_eIpuFqJc,
_DQjJQdDB,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_loxjzrmo(_kqMdxeaC, _jkdTGEyJ, []),
_loxjzrmo(_bblqLyHb, _jkdTGEyJ, []),
_loxjzrmo(_SaRfqOxl, _VaEcVXsR, []),
_loxjzrmo(_RTNTuDOt, _yIJTsQNo, { "N/A": "未知" })
]);
_CDhGyxjT = fetchedCountryMap;
let _EFYooVvM = false;
let _ouleJWZR;
try {
const _CGGymZWK = await _DnknIPhG(_DGVzWTWr);
_EFYooVvM = !!_CGGymZWK;
_ouleJWZR = await _WKGcyhlo(_DGVzWTWr);
} catch (_HSaPiVio) {
if (_HSaPiVio._huFkLpSQ && _HSaPiVio._huFkLpSQ.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _nweAxeNW = "CREATE TABLE IF NOT EXISTS kv_data (_ZBduXtts TEXT PRIMARY KEY, _oPLQvCWJ TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_CrTQJsmX TEXT PRIMARY KEY, _AFQviEVZ TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _DGVzWTWr.DB.exec(_nweAxeNW);
console.log("数据表创建成功。");
_EFYooVvM = false;
_ouleJWZR = _ytVEHQCx();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._huFkLpSQ}`, {
status: 500,
_ceQBzYPA: { 'Content-Type': '_HipkANEK/html;_DxfDIAcD=UTF-8' }
});
}
} else {
let _IqtZiWFh = _sooHfXIo(_HSaPiVio._huFkLpSQ);
return new Response(_IqtZiWFh, { _ceQBzYPA: { 'Content-Type': '_HipkANEK/html;_DxfDIAcD=UTF-8' } });
}
}
if (_ouleJWZR.telegram.bot_token && _ouleJWZR.telegram.chat_id) {
const _xoUjZJDZ = _hOmwWITD.cf?._xoUjZJDZ || "未知";
const _hQgYSoOB = _hOmwWITD.cf?._hQgYSoOB || "";
let _myIhfarX = _CDhGyxjT[_xoUjZJDZ] || _xoUjZJDZ;
if (_hQgYSoOB && _hQgYSoOB !== "未知城市" && _hQgYSoOB !== _xoUjZJDZ) _myIhfarX = `${_myIhfarX} ${_CDhGyxjT[_hQgYSoOB] || _hQgYSoOB}`;
const _FeZyADex = _bsWLquLp();
const _tYZpbmSS = _hOmwWITD._cLqtLPfd;
const _FrDHOsOm = `访客: ${_dgyLVAiG}\n位置: ${_myIhfarX.trim()}\n时间: ${_FeZyADex}\n来自:${_tYZpbmSS}`;
const _MsToFLBf = `https://api.telegram.org/bot${_ouleJWZR.telegram.bot_token}/sendMessage?chat_id=${_ouleJWZR.telegram.chat_id}&_HipkANEK=${encodeURIComponent(_FrDHOsOm)}`;
_WqGMjBmq.waitUntil(fetch(_MsToFLBf).catch(_HSaPiVio => console.error("Telegram通知失败:", _HSaPiVio)));
}
let _LVaBWzvR = _WQKVpWns();
const _njLvDFnW = {
_ITAcMrLp: _ouleJWZR,
status: {
_EFYooVvM: _EFYooVvM,
}
};
_LVaBWzvR = _LVaBWzvR.replace('__PAGE_DATA_JSON__', JSON.stringify(_njLvDFnW));
_LVaBWzvR = _LVaBWzvR.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_eIpuFqJc));
_LVaBWzvR = _LVaBWzvR.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_DQjJQdDB));
_LVaBWzvR = _LVaBWzvR.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_LVaBWzvR = _LVaBWzvR.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_CDhGyxjT));
return new Response(_LVaBWzvR, {
_ceQBzYPA: { 'Content-Type': '_HipkANEK/html;_DxfDIAcD=UTF-8' },
});
}
function _mOcfYIac(_FtuUxCMi, status = 200, _ceQBzYPA = {}) {
return new Response(JSON.stringify(_FtuUxCMi), {
status,
_ceQBzYPA: { 'Content-Type': 'application/json;_DxfDIAcD=UTF-8', ..._ceQBzYPA }
});
}
function _bsWLquLp(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 _nDqkyJOP(_ROfDcQNw) {
if (!_ROfDcQNw || typeof _ROfDcQNw !== 'string') return "无效IP";
if(_uxBsTzls.isIPv4(_ROfDcQNw)){
const _WsMVYUMo = _ROfDcQNw.split('.');
if (_WsMVYUMo._kmlcYbyh === 4) return `${_WsMVYUMo[0]}.*.*.${_WsMVYUMo[3]}`;
}
if(_uxBsTzls.isIPv6(_ROfDcQNw)){
const _WsMVYUMo = _ROfDcQNw.split(':');
if (_WsMVYUMo._kmlcYbyh > 2) return `${_WsMVYUMo[0]}:...:${_WsMVYUMo[_WsMVYUMo._kmlcYbyh - 1]}`;
}
return _ROfDcQNw;
}
function _sooHfXIo(_drFcrrig) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _DxfDIAcD="UTF-8"><title>需要设置</title>
<_OqyVifzk>
_FtuUxCMi { font-family: sans-serif; background: #1a1a1a; _ZBpvxXfo: #e0e0e0; display: flex; justify-_tXaftjHy: center; align-items: center; height: 100vh; margin: 0; }
._AiDTCqAS { max-_qlgOlYPl: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _ZBpvxXfo: #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 { _ZBpvxXfo: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_WYYOsWES: 1rem; }
</_OqyVifzk>
</head><_FtuUxCMi>
<div class="_AiDTCqAS">
<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>
${_drFcrrig ? `<div class="error"><strong>当前错误信息:</strong> ${_drFcrrig.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_FtuUxCMi></html>`;
}
function _WQKVpWns() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _DxfDIAcD="UTF-8"> <meta _dokJrbFl="viewport" _tXaftjHy="_qlgOlYPl=device-_qlgOlYPl, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_IjanWRwF 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>
<_OqyVifzk>
:root { --primary-_ZBpvxXfo: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_ZBpvxXfo: #8c939d; --light-bg: #1A1C20; --_tXaftjHy-bg: #25282E; --border-_ZBpvxXfo: #40444C; --_HipkANEK-_ZBpvxXfo: #E0E0E0; --_HipkANEK-light: #B0B0B0; --success-_ZBpvxXfo: #30A46C; --danger-_ZBpvxXfo: #DA3633; --warning-_ZBpvxXfo: #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; }
_FtuUxCMi { font-family: var(--font-family-sans); background-_ZBpvxXfo: var(--light-bg); _ZBpvxXfo: var(--_HipkANEK-_ZBpvxXfo); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_ZBpvxXfo 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_EElWFmYQ { position: fixed; _WYYOsWES: 0; _bmkLhxRx: 0; _qlgOlYPl: 100%; height: 100%; z-_bfSIdqfC: -1; display: none; }
._PYvmSxQl-_AiDTCqAS { max-_qlgOlYPl: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_bfSIdqfC: 1; }
#_SSDjANtb { position: fixed; _WYYOsWES: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_bfSIdqfC: 10; }
#marquee-_AiDTCqAS { overflow: hidden; white-space: nowrap; background-_ZBpvxXfo: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _ZBpvxXfo: var(--primary-_ZBpvxXfo); padding: 0.5rem 0; margin-_WYYOsWES: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_HipkANEK { display: inline-block; padding-_bmkLhxRx: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_RtHFfjax { _HipkANEK-align: center; margin-_WYYOsWES: 1rem; margin-bottom: 2rem; }
_RtHFfjax h1 { white-space: pre-wrap; font-size: 2.25em; _ZBpvxXfo: var(--primary-_ZBpvxXfo); font-weight: 700; _HipkANEK-shadow: 0 0 10px rgba(var(--primary-_ZBpvxXfo-rgb), 0.3); }
.card { background-_ZBpvxXfo: 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-_ZBpvxXfo); }
.progress-section #_KqQbNlVT { _qlgOlYPl: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_ZBpvxXfo: var(--border-_ZBpvxXfo); overflow: hidden; }
.progress-section #_KqQbNlVT::-webkit-progress-_oPLQvCWJ { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _HipkANEK-align: center; margin-_WYYOsWES: 0.75em; font-size: 0.95em; _ZBpvxXfo: var(--_HipkANEK-light); min-height: 1.5em; }
.section-_RtHFfjax { display: flex; flex-wrap: wrap; justify-_tXaftjHy: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_ZBpvxXfo); gap: 1rem; }
.section-_RtHFfjax h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _ZBpvxXfo: var(--secondary-_ZBpvxXfo); _HipkANEK-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _qlgOlYPl: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _qlgOlYPl: 100%; border-collapse: collapse; margin-_WYYOsWES: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_ZBpvxXfo); padding: 0.8em; _HipkANEK-align: _bmkLhxRx; vertical-align: middle; white-space: nowrap; }
th { background-_ZBpvxXfo: #2c3038; font-weight: 500; }
tbody tr:hover { background-_ZBpvxXfo: #30333a; }
td._ROfDcQNw-_FrKREStR { font-weight: 500; font-family: var(--font-family-mono); _ZBpvxXfo: var(--primary-_ZBpvxXfo); }
td.ping-_oPLQvCWJ { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _HipkANEK-align: right; }
.btn { display: inline-flex; align-items: center; justify-_tXaftjHy: center; font-weight: 500; _HipkANEK-align: center; cursor: pointer; user-_LfTdKkcX: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _ZBpvxXfo: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_bmkLhxRx: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _ZBpvxXfo: var(--primary-_ZBpvxXfo); border: 1px solid var(--primary-_ZBpvxXfo); }
.btn-outline:hover { background-_ZBpvxXfo: var(--primary-_ZBpvxXfo); _ZBpvxXfo: var(--_tXaftjHy-bg); }
._PYvmSxQl-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._PYvmSxQl-download-buttons .btn { _qlgOlYPl: 100%; margin: 0; }
.tooltip-notification { position: fixed; _WYYOsWES: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _ZBpvxXfo: #fff; font-size: 0.95em; z-_bfSIdqfC: 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); }
#_fHdDOGub, #_sHkcVDaL, #_fqXeTSbi, #_ebFZDLbq, #_YGnxjGWr { display: none; position: fixed; z-_bfSIdqfC: 10000; _bmkLhxRx: 0; _WYYOsWES: 0; _qlgOlYPl: 100%; height: 100%; background-_ZBpvxXfo: rgba(0,0,0,0.6); justify-_tXaftjHy: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_tXaftjHy, ._PYvmSxQl-modal-_tXaftjHy { background-_ZBpvxXfo: var(--_tXaftjHy-bg); padding: 2rem; border: 1px solid var(--border-_ZBpvxXfo); border-radius: var(--border-radius-md); _qlgOlYPl: 95%; max-_qlgOlYPl: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_ebFZDLbq .modal-_tXaftjHy { max-_qlgOlYPl: 500px; }
.modal-_tXaftjHy h3, ._PYvmSxQl-modal-_RtHFfjax h3 { margin-_WYYOsWES: 0; margin-bottom: 1.5rem; _ZBpvxXfo: var(--primary-_ZBpvxXfo); _HipkANEK-align: center; }
.modal-buttons { display: flex; justify-_tXaftjHy: flex-end; gap: 1rem; margin-_WYYOsWES: 2rem; border-_WYYOsWES: 1px solid var(--border-_ZBpvxXfo); padding-_WYYOsWES: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_ZBpvxXfo), rgba(0,0,0,0)); margin: 2rem 0; }
._PYvmSxQl-modal-_RtHFfjax { display: flex; justify-_tXaftjHy: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_ZBpvxXfo); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _ZBpvxXfo: var(--_HipkANEK-light); cursor: pointer; background: none; border: none; padding: 0; }
._PYvmSxQl-list-_LDUbjMOK { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_ZBpvxXfo); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._PYvmSxQl-_dokJrbFl { font-size: 1.1em; font-weight: 600; }
._PYvmSxQl-links a { display: block; _ZBpvxXfo: var(--primary-_ZBpvxXfo); _HipkANEK-decoration: none; margin-_WYYOsWES: 0.5rem; word-break: break-all; }
._PYvmSxQl-links a:hover { _HipkANEK-decoration: underline; }
._PYvmSxQl-links span { _ZBpvxXfo: var(--_HipkANEK-light); }
#visitorPasswordPrompt { _HipkANEK-align: center; }
#visitorPasswordPrompt h3 { _ZBpvxXfo: var(--primary-_ZBpvxXfo); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _ZBpvxXfo: var(--_HipkANEK-light); margin-bottom: 1.5rem; }
._CGGymZWK-input-group { display: flex; gap: 10px; max-_qlgOlYPl: 400px; margin: 0 auto; }
._CGGymZWK-input-group input { flex-grow: 1; _HipkANEK-align: center; }
._CGGymZWK-input-group .btn { margin-_bmkLhxRx: 0; }
._YsUzOrSf-actions-_AiDTCqAS { _HipkANEK-align: center; margin-bottom: 1.5rem; }
._YsUzOrSf-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._YsUzOrSf-api-buttons .btn { margin: 0; _qlgOlYPl: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_tXaftjHy 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 _LfTdKkcX, .form-grid-control textarea { _qlgOlYPl: 100%; background-_ZBpvxXfo: var(--light-bg); border: 1px solid var(--border-_ZBpvxXfo); border-radius: var(--border-radius-sm); _ZBpvxXfo: var(--_HipkANEK-_ZBpvxXfo); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_ZBpvxXfo 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _LfTdKkcX:focus, .form-grid-control textarea:focus { border-_ZBpvxXfo: var(--primary-_ZBpvxXfo); box-shadow: 0 0 0 2px rgba(var(--primary-_ZBpvxXfo-rgb), 0.2); outline: none; }
.form-grid-control input[_MnKvCiLn="_ZBpvxXfo"] { min-_qlgOlYPl: auto; padding: 2px; _qlgOlYPl: 2.5em; height: 2.5em; }
.form-grid-control input[_MnKvCiLn="checkbox"] { _qlgOlYPl: auto; flex-shrink: 0; height: 1.2em; _qlgOlYPl: 1.2em; }
.form-grid-control ._OUSYyLzW-input { _qlgOlYPl: 80px; _HipkANEK-align: right; }
.tooltip-_DCiNUbcI { display: inline-flex; _qlgOlYPl: 16px; height: 16px; align-items: center; justify-_tXaftjHy: center; background-_ZBpvxXfo: var(--secondary-_ZBpvxXfo); _ZBpvxXfo: var(--_tXaftjHy-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_LfTdKkcX: none; }
#tooltip-popup { position: fixed; background-_ZBpvxXfo: #383c4a; _ZBpvxXfo: #fff; padding: 10px 15px; border-radius: 6px; z-_bfSIdqfC: 10001; font-size: 0.85em; max-_qlgOlYPl: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_ZBpvxXfo); pointer-events: none; }
#custom-fields-_AiDTCqAS .form-grid-control { gap: 5px; } #custom-fields-_AiDTCqAS .form-grid-control input { flex: 1; }
.parameter-_tvAzWpRE-_zdfYhitO { border: 1px solid var(--border-_ZBpvxXfo); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_tvAzWpRE-_RtHFfjax { display: flex; justify-_tXaftjHy: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_tvAzWpRE-_RtHFfjax input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_WYYOsWES: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._HipkANEK-_ZBpvxXfo-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _qlgOlYPl: 100%; }
._HipkANEK-_ZBpvxXfo-grid input[_MnKvCiLn="_ZBpvxXfo"] { grid-column: 1 / 2; }
._HipkANEK-_ZBpvxXfo-grid input[_MnKvCiLn="_HipkANEK"], ._HipkANEK-_ZBpvxXfo-grid textarea { grid-column: 2 / 3; }
#_ebFZDLbq .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_ebFZDLbq .btn-group { display: flex; }
#_ebFZDLbq .sub-btn { flex-grow: 1; margin: 0; }
#_ebFZDLbq ._YKITnzJZ-btn { flex-shrink: 0; margin-_bmkLhxRx: -1px; border-_WYYOsWES-_bmkLhxRx-radius: 0; border-bottom-_bmkLhxRx-radius: 0; }
#_YGnxjGWr .modal-_tXaftjHy { max-_qlgOlYPl: 300px; background: white; padding: 1rem; _HipkANEK-align: center; }
#qrCodeImg { max-_qlgOlYPl: 100%; }
@media (max-_qlgOlYPl: 768px) {
html { font-size: 15px; } ._PYvmSxQl-_AiDTCqAS { padding: 0 0.8rem; } _RtHFfjax { margin-_WYYOsWES: 2.5rem; margin-bottom: 1.5rem; } #_SSDjANtb { _WYYOsWES: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_OqyVifzk>
<_OqyVifzk _CrTQJsmX="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_tXaftjHy-bg: #FFFFFF; --border-_ZBpvxXfo: #DCDFE6; --_HipkANEK-_ZBpvxXfo: #303133; --_HipkANEK-light: #606266; }
.theme-light .card { background-_ZBpvxXfo: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_ZBpvxXfo: #F5F7FA; }
.theme-light tbody tr:hover { background-_ZBpvxXfo: #ECF5FF; }
.theme-matrix { --primary-_ZBpvxXfo: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_tXaftjHy-bg: #0D0208; --border-_ZBpvxXfo: #00FF41; --_HipkANEK-_ZBpvxXfo: #00FF41; --_HipkANEK-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_ZBpvxXfo: rgba(0, 20, 0, 0.7); _HipkANEK-shadow: 0 0 5px var(--primary-_ZBpvxXfo); backdrop-filter: none; }
.theme-matrix th { background-_ZBpvxXfo: #000; }
.theme-matrix tbody tr:hover { background-_ZBpvxXfo: #010; }
.theme-matrix .btn { _HipkANEK-shadow: none; _ZBpvxXfo: #000; }
.theme-matrix .btn-outline { background-_ZBpvxXfo: transparent; }
.theme-modern-glass { --primary-_ZBpvxXfo: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_tXaftjHy-bg: rgba(30, 30, 40, 0.6); --border-_ZBpvxXfo: rgba(255, 255, 255, 0.2); --_HipkANEK-_ZBpvxXfo: #F0F0F0; --_HipkANEK-light: #A0A0B0; --border-radius-md: 12px; }
_FtuUxCMi.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-_ZBpvxXfo: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_tXaftjHy-bg: rgba(30, 30, 40, 0.6); --border-_ZBpvxXfo: rgba(255, 255, 255, 0.2); --_HipkANEK-_ZBpvxXfo: #F0F0F0; --_HipkANEK-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_ZBpvxXfo: var(--_tXaftjHy-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_ZBpvxXfo); }
.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-_ZBpvxXfo: rgba(0,0,0,0.3); border-right-_ZBpvxXfo: 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); _HipkANEK-shadow: 0 1px 2px rgba(0,0,0,0.2); _ZBpvxXfo: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_ZBpvxXfo: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _HipkANEK-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_ZBpvxXfo); border-_ZBpvxXfo: var(--primary-_ZBpvxXfo); _ZBpvxXfo: #fff; }
.glassy-components _RtHFfjax h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _HipkANEK; -webkit-_HipkANEK-fill-_ZBpvxXfo: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _ZBpvxXfo: transparent; }
.theme-aurora-glass { --primary-_ZBpvxXfo: #38bdf8; --light-bg: #0c0a09; --_tXaftjHy-bg: rgba(23, 23, 23, 0.5); --border-_ZBpvxXfo: rgba(255, 255, 255, 0.15); --_HipkANEK-_ZBpvxXfo: #f2f2f2; --_HipkANEK-light: #a3a3a3; }
_FtuUxCMi.theme-aurora-glass::before { _tXaftjHy: ''; position: fixed; _WYYOsWES: 0; _bmkLhxRx: 0; _qlgOlYPl: 100%; height: 100%; z-_bfSIdqfC: -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-_ZBpvxXfo: #08fdd8; --light-bg: #010409; --_tXaftjHy-bg: rgba(22, 27, 34, 0.6); --border-_ZBpvxXfo: rgba(139, 148, 158, 0.3); --_HipkANEK-_ZBpvxXfo: #e6edf3; --_HipkANEK-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_ZBpvxXfo), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_ZBpvxXfo-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_ZBpvxXfo-rgb), 0.5); }
.theme-marble-light { --primary-_ZBpvxXfo: #bfa37c; --light-bg: #f7f5f2; --_tXaftjHy-bg: #ffffff; --border-_ZBpvxXfo: #e0dcd5; --_HipkANEK-_ZBpvxXfo: #3d3a36; --_HipkANEK-light: #6b6661; }
_FtuUxCMi.theme-marble-light { background-image: _cLqtLPfd('_AFQviEVZ:image/svg+xml,%3Csvg _qlgOlYPl="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-_ZBpvxXfo: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_OqyVifzk>
</head><_FtuUxCMi _CrTQJsmX="pageBody">
<_EElWFmYQ _CrTQJsmX="background-_EElWFmYQ"></_EElWFmYQ>
<div _CrTQJsmX="_fHdDOGub">
<div class="modal-_tXaftjHy">
<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 _MnKvCiLn="_CGGymZWK" _CrTQJsmX="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _MnKvCiLn="_CGGymZWK" _CrTQJsmX="confirmPassword"></div></div>
<div class="modal-buttons"><button _CrTQJsmX="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_PYvmSxQl-_AiDTCqAS">
<button _CrTQJsmX="_SSDjANtb" class="btn btn-outline"></button>
<div _CrTQJsmX="marquee-_AiDTCqAS"><div _CrTQJsmX="marquee-_HipkANEK"></div></div>
<_RtHFfjax><h1 _CrTQJsmX="pageTitle"></h1></_RtHFfjax>
<div class="card" _CrTQJsmX="visitorPasswordPrompt" _OqyVifzk="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_CGGymZWK-input-group">
<input _MnKvCiLn="_CGGymZWK" _CrTQJsmX="visitorPasswordEntry" _HNausmHa="访客密码">
<button _CrTQJsmX="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _CrTQJsmX="_hxKAoDRC" _OqyVifzk="display: block;">
<div class="card progress-section">
<div _CrTQJsmX="progressDisplay">
<progress _CrTQJsmX="_KqQbNlVT" _oPLQvCWJ="0" max="100"></progress>
<div _CrTQJsmX="status">正在初始化...</div>
</div>
</div>
<div class="card _PYvmSxQl-download-section">
<div class="section-_RtHFfjax"><h2 _CrTQJsmX="appDownloadTitleEl"></h2></div>
<div class="_PYvmSxQl-download-buttons">
<button class="btn" _AFQviEVZ-_nBMNUopj="android">安卓客户端</button>
<button class="btn" _AFQviEVZ-_nBMNUopj="ios">苹果客户端</button>
<button class="btn" _AFQviEVZ-_nBMNUopj="windows">Windows客户端</button>
<button class="btn" _AFQviEVZ-_nBMNUopj="mac">Mac客户端</button>
</div>
</div>
<div class="card _YsUzOrSf-section" _CrTQJsmX="_mJTWCiDc" _OqyVifzk="display:none;">
<div class="section-_RtHFfjax">
<h2 _CrTQJsmX="liveTitleEl"></h2>
<div class="generator-info" _CrTQJsmX="liveGeneratorInfo"></div>
</div>
<div _CrTQJsmX="_NDcTkFZm" class="_YsUzOrSf-actions-_AiDTCqAS" _OqyVifzk="display: none;">
<div class="_YsUzOrSf-api-buttons">
<button _CrTQJsmX="copyIpApiBtn" class="btn">复制 IP API</button>
<button _CrTQJsmX="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _CrTQJsmX="resultsTable">
<thead><tr><th _CrTQJsmX="tableHeader1El"></th><th _CrTQJsmX="tableHeader2El"></th><th _CrTQJsmX="tableHeader3El"></th><th _CrTQJsmX="tableHeader4El"></th><th _CrTQJsmX="tableHeader5El"></th><th _CrTQJsmX="tableHeader6El"></th><th _CrTQJsmX="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _CrTQJsmX="_LqrbrrLM" _OqyVifzk="display:none;">
<div class="section-_RtHFfjax"><h2 _CrTQJsmX="cachedTitleEl"></h2><div class="generator-info" _CrTQJsmX="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _CrTQJsmX="cachedResultsTable">
<thead><tr><th _CrTQJsmX="cachedTableHeader1El"></th><th _CrTQJsmX="cachedTableHeader2El"></th><th _CrTQJsmX="cachedTableHeader3El"></th><th _CrTQJsmX="cachedTableHeader4El"></th><th _CrTQJsmX="cachedTableHeader5El"></th><th _CrTQJsmX="cachedTableHeader6El"></th><th _CrTQJsmX="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _CrTQJsmX="notificationTooltip" class="tooltip-notification"></div>
<div _CrTQJsmX="_sHkcVDaL">
<div class="modal-_tXaftjHy">
<h3>修改参数</h3>
<div _OqyVifzk="display: flex; border-bottom: 1px solid var(--border-_ZBpvxXfo); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_poDqjErm(event, 'general-_BVZkweZm')">通用设置</button>
<button class="tab-button" onclick="_poDqjErm(event, '_IjanWRwF-_BVZkweZm')">链接设置</button>
<button class="tab-button" onclick="_poDqjErm(event, 'fine-grained-_BVZkweZm')">IP源设置</button>
<button class="tab-button" onclick="_poDqjErm(event, 'advanced-_BVZkweZm')">高级设置</button>
</div>
<div _CrTQJsmX="general-_BVZkweZm" class="tab-_tXaftjHy" _OqyVifzk="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_LfTdKkcX _CrTQJsmX="themeSelect">
<_LlwmSjeZ _oPLQvCWJ="theme-aurora-glass">极光-玻璃质感</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-particles-glass">粒子-玻璃质感</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-modern-glass">现代-玻璃质感</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-cyberpunk-glass">赛博朋克-玻璃质感</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-dark-particles">暗色-粒子背景</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-dark-bing">暗色-必应壁纸</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-light">亮色-简约</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-light-bing">亮色-必应壁纸</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-marble-light">简约大理石-亮色</_LlwmSjeZ>
<_LlwmSjeZ _oPLQvCWJ="theme-matrix">矩阵-代码雨</_LlwmSjeZ>
</_LfTdKkcX>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="primaryColorInput">
<span _OqyVifzk="_qlgOlYPl: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _OqyVifzk="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_title"><textarea _CrTQJsmX="textInput_title" _eQgPcvyW="1" _HNausmHa="页面主标题"></textarea></div>
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_loginButton"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="textInput_loginButton" _HNausmHa="登录按钮文本"></div>
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_appDownloadTitle"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="textInput_appDownloadTitle" _HNausmHa="APP下载标题"></div>
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_liveTitle"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="textInput_liveTitle" _HNausmHa="本次结果标题"></div>
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_cachedTitle"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="textInput_cachedTitle" _HNausmHa="上次结果标题"></div>
<div class="_HipkANEK-_ZBpvxXfo-grid"><input _MnKvCiLn="_ZBpvxXfo" _CrTQJsmX="colorInput_tableHeader"><input _MnKvCiLn="_HipkANEK" _oPLQvCWJ="表格头部文本颜色" readonly _OqyVifzk="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label>公告栏设置</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _OqyVifzk="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _CrTQJsmX="announcementText" _HNausmHa="在此输入公告内容" _eQgPcvyW="3"></textarea>
<div _OqyVifzk="display: flex; justify-_tXaftjHy: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _OqyVifzk="display: flex; align-items: center; gap: 5px;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableMarquee"> 顶部走马灯</label>
<label _OqyVifzk="display: flex; align-items: center; gap: 5px;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enablePopup"> 右上角弹窗</label>
<div _CrTQJsmX="popupDurationContainer" _OqyVifzk="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _MnKvCiLn="number" _CrTQJsmX="popupDuration" _OqyVifzk="_qlgOlYPl: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _CrTQJsmX="_IjanWRwF-_BVZkweZm" class="tab-_tXaftjHy">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="converterServiceUrlInput" _HNausmHa="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="number" _CrTQJsmX="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _CrTQJsmX="subscriptionIdCharset" _eQgPcvyW="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-_DCiNUbcI" _AFQviEVZ-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableItemLinkCheckbox"></div>
</div>
<div _CrTQJsmX="itemLinkConfigGroup" _OqyVifzk="display:none; margin-_WYYOsWES: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="定义分享链接格式。可用占位符: {_ROfDcQNw}, {_maIJuKHX}, {_dokJrbFl}, {rank}, {_BsDjLqsH}, {_lxKbOpGq}, {_OchiPaNj}, {_stQoSWYb}, {_qPHFSpGH}。">?</span></div>
<div class="form-grid-control"><textarea _CrTQJsmX="itemLinkTemplateInput" _eQgPcvyW="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_LfTdKkcX _CrTQJsmX="parameterSelectionMode"></_LfTdKkcX></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _CrTQJsmX="parameter-sets-_AiDTCqAS"></div><button _MnKvCiLn="button" _CrTQJsmX="add-parameter-_tvAzWpRE-btn" class="btn btn-outline" _OqyVifzk="margin-_WYYOsWES: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _CrTQJsmX="custom-fields-_AiDTCqAS" _OqyVifzk="_qlgOlYPl: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><button _MnKvCiLn="button" _CrTQJsmX="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _CrTQJsmX="fine-grained-_BVZkweZm" class="tab-_tXaftjHy">
<div class="form-grid-label" _OqyVifzk="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _OqyVifzk="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_tXaftjHy: flex-start;">
<label><input _MnKvCiLn="checkbox" _CrTQJsmX="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _MnKvCiLn="checkbox" _CrTQJsmX="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _CrTQJsmX="fine-grained-sources-_AiDTCqAS"></div><button _MnKvCiLn="button" _CrTQJsmX="add-fine-grained-_urHoKsFE-btn" class="btn btn-outline" _OqyVifzk="margin-_WYYOsWES: 10px;">添加地区</button></div>
</div>
<div _CrTQJsmX="advanced-_BVZkweZm" class="tab-_tXaftjHy">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="checkbox" _CrTQJsmX="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="resolvedDomainsGroup" _OqyVifzk="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _CrTQJsmX="resolvedDomainsInput" _HNausmHa="留空则使用内置默认域名" _eQgPcvyW="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-_DCiNUbcI" _AFQviEVZ-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="customNodesGroup" _OqyVifzk="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _CrTQJsmX="customNodesInput" _HNausmHa="一行一个地址,支持域名、IPv4、IPv6。" _eQgPcvyW="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-_DCiNUbcI" _AFQviEVZ-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="number" _CrTQJsmX="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="number" _CrTQJsmX="topNInput"></div>
<div class="form-grid-label" _OqyVifzk="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _OqyVifzk="display: none;"><input _MnKvCiLn="number" _CrTQJsmX="latencyRangeMinInput" _HNausmHa="最小"><span>-</span><input _MnKvCiLn="number" _CrTQJsmX="latencyRangeMaxInput" _HNausmHa="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="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-_DCiNUbcI" _AFQviEVZ-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _MnKvCiLn="number" _CrTQJsmX="geoLocationRetriesInput" _OqyVifzk="_qlgOlYPl: 80px;"> <span>次</span>
<div _OqyVifzk="display: flex; align-items: center; gap: 5px; margin-_bmkLhxRx: 20px;">
<input _MnKvCiLn="checkbox" _CrTQJsmX="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-_DCiNUbcI" _AFQviEVZ-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_OchiPaNj:_maIJuKHX' 或 '_OchiPaNj'。">?</span></div>
<div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="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-_DCiNUbcI" _AFQviEVZ-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="websocketStreamerGroup" _OqyVifzk="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="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-_DCiNUbcI" _AFQviEVZ-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="启用 /_ROfDcQNw 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableApiCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="apiConfigGroup" _OqyVifzk="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="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-_DCiNUbcI" _AFQviEVZ-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="customSubPathGroup" _OqyVifzk="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="customSubPathInput" _HNausmHa="例如: 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-_DCiNUbcI" _AFQviEVZ-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _OqyVifzk="justify-_tXaftjHy: flex-start;"><input _MnKvCiLn="checkbox" _CrTQJsmX="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _CrTQJsmX="visitorPasswordGroup" _OqyVifzk="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_DCiNUbcI" _AFQviEVZ-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _OqyVifzk="flex-direction: column; align-items: stretch; gap: 8px;"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="botTokenInput" _HNausmHa="Telegram Bot Token"><input _MnKvCiLn="_HipkANEK" _CrTQJsmX="chatIdInput" _HNausmHa="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _OqyVifzk="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _OqyVifzk="flex-direction: column; align-items: stretch; gap: 8px;"><input _MnKvCiLn="_CGGymZWK" _CrTQJsmX="oldPasswordInput" _HNausmHa="旧密码"><input _MnKvCiLn="_CGGymZWK" _CrTQJsmX="newPasswordInput" _HNausmHa="新密码 (至少6位)"><button _CrTQJsmX="changePasswordBtn" class="btn" _OqyVifzk="align-self: flex-start; margin-_bmkLhxRx: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _CrTQJsmX="closeModalBtn" class="btn btn-outline">关闭</button><button _CrTQJsmX="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _CrTQJsmX="_fqXeTSbi">
<div class="_PYvmSxQl-modal-_tXaftjHy">
<div class="_PYvmSxQl-modal-_RtHFfjax"><h3 _CrTQJsmX="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_PYvmSxQl-modal-_FtuUxCMi" _CrTQJsmX="appModalBody"></div>
</div>
</div>
<div _CrTQJsmX="_ebFZDLbq">
<div class="modal-_tXaftjHy">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _AFQviEVZ-sub-_MnKvCiLn="coreEngine">Xray</button><button class="btn _YKITnzJZ-btn" _AFQviEVZ-sub-_MnKvCiLn="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _AFQviEVZ-sub-_MnKvCiLn="coreProfile">Sing-Box</button><button class="btn _YKITnzJZ-btn" _AFQviEVZ-sub-_MnKvCiLn="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _AFQviEVZ-sub-_MnKvCiLn="configProfile">Clash</button><button class="btn _YKITnzJZ-btn" _AFQviEVZ-sub-_MnKvCiLn="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _AFQviEVZ-sub-_MnKvCiLn="policyProfile">Surge</button><button class="btn _YKITnzJZ-btn" _AFQviEVZ-sub-_MnKvCiLn="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _OqyVifzk="justify-_tXaftjHy: center;"><button class="btn btn-outline" _CrTQJsmX="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _CrTQJsmX="_YGnxjGWr">
<div class="modal-_tXaftjHy">
<img _CrTQJsmX="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _uxBsTzls = {
isValid: (_ROfDcQNw) => _uxBsTzls.isIPv4(_ROfDcQNw) || _uxBsTzls.isIPv6(_ROfDcQNw),
isIPv4: (_ROfDcQNw) => {
if (typeof _ROfDcQNw !== 'string') return false;
const _WsMVYUMo = _ROfDcQNw.split('.');
if (_WsMVYUMo._kmlcYbyh !== 4) return false;
return _WsMVYUMo.every(_WJoFcUBS => {
const _CGHLkypO = parseInt(_WJoFcUBS, 10);
return !isNaN(_CGHLkypO) && _CGHLkypO >= 0 && _CGHLkypO <= 255 && String(_CGHLkypO) === _WJoFcUBS;
});
},
isIPv6: (_ROfDcQNw) => {
if (typeof _ROfDcQNw !== '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]))$/_sNkxdnSw.test(_ROfDcQNw);
},
toLong4: (_ROfDcQNw) => _ROfDcQNw.split('.').reduce((acc, octet, _sNkxdnSw) => acc + (parseInt(octet) << (8*(3-_sNkxdnSw))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_ROfDcQNw) => {
try {
const _ZAiYUPfa = _ROfDcQNw.split('/')[0];
const _WsMVYUMo = _ZAiYUPfa.split('::');
if (_WsMVYUMo._kmlcYbyh > 2) return 0n;
let _mrzJjOna = [];
if (_WsMVYUMo[0]) {
_mrzJjOna = _WsMVYUMo[0].split(':');
}
let _qzGxsqqo = [];
if (_WsMVYUMo._kmlcYbyh > 1 && _WsMVYUMo[1]) {
_qzGxsqqo = _WsMVYUMo[1].split(':');
}
if (_mrzJjOna._kmlcYbyh + _qzGxsqqo._kmlcYbyh > 8) return 0n;
const _DBViEkdy = 8 - (_mrzJjOna._kmlcYbyh + _qzGxsqqo._kmlcYbyh);
const _pSpDHEqm = [
..._mrzJjOna,
...Array(_DBViEkdy).fill('0'),
..._qzGxsqqo
].map(_WJoFcUBS => _WJoFcUBS || '0');
while(_pSpDHEqm._kmlcYbyh < 8) {
_pSpDHEqm.push('0');
}
let _aEErdjVw = 0n;
for (const _WJoFcUBS of _pSpDHEqm) {
if (_WJoFcUBS._kmlcYbyh > 4) return 0n;
const _oPLQvCWJ = BigInt('0x' + _WJoFcUBS);
_aEErdjVw = (_aEErdjVw << 16n) | _oPLQvCWJ;
}
return _aEErdjVw;
} catch(_HSaPiVio) {
return 0n;
}
},
fromBigInt6: (_aEErdjVw) => {
if (typeof _aEErdjVw !== '_aEErdjVw' || _aEErdjVw < 0n) return null;
const _WsMVYUMo = [];
for (let _sNkxdnSw = 0; _sNkxdnSw < 8; _sNkxdnSw++) {
_WsMVYUMo.unshift((_aEErdjVw & 0xFFFFn).toString(16));
_aEErdjVw >>= 16n;
}
let _EPrVOJHM = { start: -1, _QjLCvBIs: 0 };
let _FRexfNll = { start: -1, _QjLCvBIs: 0 };
for (let _sNkxdnSw = 0; _sNkxdnSw < 8; _sNkxdnSw++) {
if (_WsMVYUMo[_sNkxdnSw] === '0') {
if (_FRexfNll.start === -1) _FRexfNll.start = _sNkxdnSw;
_FRexfNll._QjLCvBIs++;
} else {
if (_FRexfNll._QjLCvBIs > _EPrVOJHM._QjLCvBIs) _EPrVOJHM = { ..._FRexfNll };
_FRexfNll = { start: -1, _QjLCvBIs: 0 };
}
}
if (_FRexfNll._QjLCvBIs > _EPrVOJHM._QjLCvBIs) _EPrVOJHM = { ..._FRexfNll };
if (_EPrVOJHM._QjLCvBIs > 1) {
_WsMVYUMo.splice(_EPrVOJHM.start, _EPrVOJHM._QjLCvBIs, '');
if (_EPrVOJHM.start === 0) _WsMVYUMo.unshift('');
if (_EPrVOJHM.start + _EPrVOJHM._QjLCvBIs === 8) _WsMVYUMo.push('');
}
return _WsMVYUMo.join(':');
},
cidrToRange: (cidr, _YqneDDnW = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _bRMWGRfA = parseInt(bitsStr, 10);
const _waxBKSXV = new Set();
if (_uxBsTzls.isIPv4(range)) {
if (isNaN(_bRMWGRfA) || _bRMWGRfA < 8 || _bRMWGRfA > 32) return [];
if (_bRMWGRfA === 32) return [range];
const _wRvqjbLC = _uxBsTzls.toLong4(range);
const _xAmmZSfo = (0xFFFFFFFF << (32 - _bRMWGRfA)) >>> 0;
const _DqdXwQMw = _wRvqjbLC & _xAmmZSfo;
const _fwWRWrUL = 1 << (32 - _bRMWGRfA);
if (_fwWRWrUL <= 2) return [];
const _VxfqUvsp = Math.min(_YqneDDnW, _fwWRWrUL - 2);
let _IrEuvFht = 0;
while (_waxBKSXV.size < _VxfqUvsp && _IrEuvFht < _VxfqUvsp * 5) {
const _YOzLQkvy = Math.floor(Math.random() * (_fwWRWrUL - 2)) + 1;
_waxBKSXV.add(_uxBsTzls.fromLong4((_DqdXwQMw + _YOzLQkvy) >>> 0));
_IrEuvFht++;
}
return Array.from(_waxBKSXV);
} else if (_uxBsTzls.isIPv6(range)) {
if (isNaN(_bRMWGRfA) || _bRMWGRfA < 16 || _bRMWGRfA > 128) return [];
if (_bRMWGRfA === 128) return [range];
const _UnQnMfLZ = _uxBsTzls.toBigInt6(range);
const _xAmmZSfo = (2n ** BigInt(128 - _bRMWGRfA) - 1n);
const _DqdXwQMw = _UnQnMfLZ & ~_xAmmZSfo;
const _nEDptMcT = 2n ** BigInt(128 - _bRMWGRfA);
if (_nEDptMcT <= 2n) return [];
let _IrEuvFht = 0;
while (_waxBKSXV.size < _YqneDDnW && _IrEuvFht < _YqneDDnW * 5) {
const _LiOoEEqV = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_LiOoEEqV);
let _dBhcDSJU = 0n;
for (const _MkOvJMvO of _LiOoEEqV) {
_dBhcDSJU = (_dBhcDSJU << 8n) | BigInt(_MkOvJMvO);
}
const _YOzLQkvy = _dBhcDSJU % (_nEDptMcT - 2n) + 1n;
_waxBKSXV.add(_uxBsTzls.fromBigInt6(_DqdXwQMw + _YOzLQkvy));
_IrEuvFht++;
}
return Array.from(_waxBKSXV);
}
return [];
} catch(_HSaPiVio) {
console.error(`CIDR to range failed for ${cidr}:`, _HSaPiVio);
return [];
}
}
};
function _dsfQSrYh(_REZXYOwq, _jpeJmAih) {
const _ZXaYAHfj = {};
const _LchlAokr = Object._LchlAokr(_jpeJmAih);
const _WsMVYUMo = _LchlAokr.map(_ZBduXtts => {
const _ZckwSDQE = _REZXYOwq * (_jpeJmAih[_ZBduXtts] / 100);
return { _ZBduXtts, _YqneDDnW: Math.floor(_ZckwSDQE), remainder: _ZckwSDQE - Math.floor(_ZckwSDQE) };
});
let _FxAcIUgO = _WsMVYUMo.reduce((acc, _WJoFcUBS) => acc + _WJoFcUBS._YqneDDnW, 0);
_WsMVYUMo.sort((a, b) => b.remainder - a.remainder);
let _yIpfFcxH = _REZXYOwq - _FxAcIUgO;
for (let _sNkxdnSw = 0; _sNkxdnSw < _yIpfFcxH; _sNkxdnSw++) {
_WsMVYUMo[_sNkxdnSw % _WsMVYUMo._kmlcYbyh]._YqneDDnW++;
}
for (const _WJoFcUBS of _WsMVYUMo) {
_ZXaYAHfj[_WJoFcUBS._ZBduXtts] = _WJoFcUBS._YqneDDnW;
}
return _ZXaYAHfj;
}
const _njLvDFnW = __PAGE_DATA_JSON__;
const _ouleJWZR = _njLvDFnW._ITAcMrLp;
const _gEScEokf = _njLvDFnW.status;
const _eIpuFqJc = __ALL_CF_CIDR_LIST_JSON__;
const _DQjJQdDB = __BALANCED_CF_CIDR_LIST_JSON__;
const _hiiphApA = __DEFAULT_DOMAINS_LIST_JSON__;
const _CDhGyxjT = __COUNTRY_MAP_JSON__;
const _ETbDVqze = _CDhGyxjT;
const _DOyktXTm = 2500;
const _IZBPndMU = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _hxKAoDRC = document.getElementById('_hxKAoDRC');
const _KqQbNlVT = document.getElementById('_KqQbNlVT');
const _oqtEPzSL = document.getElementById('status');
const _mJTWCiDc = document.getElementById('_mJTWCiDc');
const _HyHpKZgr = document.getElementById('resultsTable').querySelector('tbody');
const _LqrbrrLM = document.getElementById('_LqrbrrLM');
const _NzhtiIRU = document.getElementById('cachedResultsTable').querySelector('tbody');
const _xiSimPcI = document.getElementById('notificationTooltip');
const _SSDjANtb = document.getElementById('_SSDjANtb');
const _sHkcVDaL = document.getElementById('_sHkcVDaL');
const _fqXeTSbi = document.getElementById('_fqXeTSbi');
const _ebFZDLbq = document.getElementById('_ebFZDLbq');
const _YGnxjGWr = document.getElementById('_YGnxjGWr');
const _fHdDOGub = document.getElementById('_fHdDOGub');
const _NDcTkFZm = document.getElementById('_NDcTkFZm');
let _IiATzwLY = null;
let _HNxTtJMd = null;
let _efCJQWlU = [];
let _elpmwOwk = false;
let _bzHQfMOp = null;
function _OSyDRsIN(_mQAhiNwG, _ZpDeqwlx) {
const _GqwtDBQi=parseInt(_mQAhiNwG.slice(1),16),t=_ZpDeqwlx<0?0:255,p=_ZpDeqwlx<0?_ZpDeqwlx*-1:_ZpDeqwlx,R=_GqwtDBQi>>16,G=_GqwtDBQi>>8&0x00FF,B=_GqwtDBQi&0x0000FF;
const _prcSBWZa = Math.round((t-R)*p)+R;
const _PfgovxZE = Math.round((t-G)*p)+G;
const _tqNQmkCm = Math.round((t-B)*p)+B;
return `rgb(${_prcSBWZa.toString()}, ${_PfgovxZE.toString()}, ${_tqNQmkCm.toString()})`;
}
function _zyaRPrnk(_BVZkweZm) {
const _yZvCFwcn = _MEyodauu(_BVZkweZm.primaryColor);
if(_yZvCFwcn) {
document.documentElement._OqyVifzk.setProperty('--primary-_ZBpvxXfo-rgb', `${_yZvCFwcn.r},${_yZvCFwcn.g},${_yZvCFwcn.b}`);
}
document.documentElement._OqyVifzk.setProperty('--primary-_ZBpvxXfo', _BVZkweZm.primaryColor);
document.documentElement._OqyVifzk.setProperty('--primary-hover', _OSyDRsIN(_BVZkweZm.primaryColor, -0.1));
document.documentElement._OqyVifzk.setProperty('--primary-gradient-start', _OSyDRsIN(_BVZkweZm.primaryColor, 0.1));
document.documentElement._OqyVifzk.setProperty('--primary-gradient-end', _OSyDRsIN(_BVZkweZm.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _BVZkweZm.texts.title;
document.title = _BVZkweZm.texts.title;
_SSDjANtb.innerText = _IiATzwLY ? _BVZkweZm.texts.loginButtonSuccess : _BVZkweZm.texts.loginButton;
_SSDjANtb._OqyVifzk._ZBpvxXfo = _BVZkweZm.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _BVZkweZm.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _BVZkweZm.texts.liveTitle;
document.getElementById('liveTitleEl')._OqyVifzk._ZBpvxXfo = _BVZkweZm.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _BVZkweZm.texts.cachedTitle;
document.getElementById('cachedTitleEl')._OqyVifzk._ZBpvxXfo = _BVZkweZm.colors.cachedTitle;
const _ceQBzYPA = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_ceQBzYPA.forEach((_CrTQJsmX, _bfSIdqfC) => {
const _xfpaPhDz = document.getElementById(_CrTQJsmX);
if (_xfpaPhDz) _xfpaPhDz.innerText = _BVZkweZm.texts[`tableHeader${_bfSIdqfC + 1}`] || '';
});
const _fbojzrPf = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_fbojzrPf.forEach((_CrTQJsmX, _bfSIdqfC) => {
const _xfpaPhDz = document.getElementById(_CrTQJsmX);
if (_xfpaPhDz) _xfpaPhDz.innerText = _ouleJWZR.texts[`tableHeader${_bfSIdqfC + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._OqyVifzk._ZBpvxXfo = _BVZkweZm.colors.tableHeader);
document._FtuUxCMi.className = '';
document._FtuUxCMi.classList.add(_BVZkweZm.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_BVZkweZm.theme)) {
document._FtuUxCMi.classList.add('glassy-components');
}
document._FtuUxCMi._OqyVifzk.backgroundImage = '';
_rZWJcUpj();
if (_BVZkweZm.theme.includes('particles') || _BVZkweZm.theme.includes('glass')) {
_NmXbDrmL(_BVZkweZm.particleColor);
} else if (_BVZkweZm.theme.includes('bing')) {
document._FtuUxCMi._OqyVifzk.backgroundImage = '_cLqtLPfd(/bing-wallpaper)';
}
}
function _jyiQIIvS() {
_IiATzwLY = null;
if(_HNxTtJMd) clearTimeout(_HNxTtJMd);
_zyaRPrnk(_ouleJWZR);
_REQbmyKE("登录已超时,请重新登录。", "warning");
}
async function _xipUJQTa() {
if (_IiATzwLY) {
_wzXEcODE();
return;
}
const _pcIEoAdB = prompt('请输入管理员密码:');
if (!_pcIEoAdB) return;
try {
const _yuRRNMnj = await fetch('/api/verify-_CGGymZWK', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _CGGymZWK: _pcIEoAdB })
});
const _hvQOXhQC = await _yuRRNMnj.json();
if (_hvQOXhQC.success) {
_IiATzwLY = _pcIEoAdB;
_REQbmyKE("登录成功!有效期5分钟。", "success");
if (_HNxTtJMd) clearTimeout(_HNxTtJMd);
_HNxTtJMd = setTimeout(_jyiQIIvS, 5 * 60 * 1000);
_zyaRPrnk(_ouleJWZR);
_wzXEcODE();
} else {
throw new Error(_hvQOXhQC._huFkLpSQ || '密码验证失败');
}
} catch (_HSaPiVio) {
_REQbmyKE(`登录失败: ${_HSaPiVio._huFkLpSQ}`, "error");
}
}
function _zfHwdbXk() {
if (!_gEScEokf._EFYooVvM) {
_fHdDOGub._OqyVifzk.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _CGGymZWK = document.getElementById('initialPassword')._oPLQvCWJ;
const _qNdepgmJ = document.getElementById('confirmPassword')._oPLQvCWJ;
if (_CGGymZWK !== _qNdepgmJ) {
_REQbmyKE("两次输入的密码不一致!", "error");
return;
}
if (_CGGymZWK._kmlcYbyh < 6) {
_REQbmyKE("密码长度不能少于6位!", "error");
return;
}
try {
const _yuRRNMnj = await fetch('/api/_tvAzWpRE-_CGGymZWK', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _CGGymZWK })
});
const _hvQOXhQC = await _yuRRNMnj.json();
if (_hvQOXhQC.success) {
_REQbmyKE(_hvQOXhQC._huFkLpSQ, "success");
setTimeout(() => _BsDjLqsH.reload(), 1500);
} else {
throw new Error(_hvQOXhQC._huFkLpSQ);
}
} catch(_HSaPiVio) {
_REQbmyKE(`设置密码失败: ${_HSaPiVio._huFkLpSQ}`, "error");
}
});
return;
}
_SSDjANtb.addEventListener('click', _xipUJQTa);
document.getElementById('closeModalBtn').addEventListener('click', () => { _sHkcVDaL._OqyVifzk.display = 'none'; });
_sHkcVDaL.addEventListener('click', (_HSaPiVio) => { if (_HSaPiVio.target === _sHkcVDaL) _sHkcVDaL._OqyVifzk.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_AiDTCqAS .fine-grained-_kRWzFOum-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-_AiDTCqAS .fine-grained-_kRWzFOum-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_IiATzwLY) {
_REQbmyKE("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _DBrGgsHj = [];
document.querySelectorAll('#custom-fields-_AiDTCqAS .custom-field-_zdfYhitO').forEach(_zdfYhitO => {
const _dokJrbFl = _zdfYhitO.querySelector('.custom-field-_dokJrbFl')._oPLQvCWJ.trim();
const _oPLQvCWJ = _zdfYhitO.querySelector('.custom-field-_oPLQvCWJ')._oPLQvCWJ.trim();
if (_dokJrbFl) _DBrGgsHj.push({ _dokJrbFl, _oPLQvCWJ });
});
const _tLqWIHBf = [];
document.querySelectorAll('#parameter-sets-_AiDTCqAS .parameter-_tvAzWpRE-_zdfYhitO').forEach(_zdfYhitO => {
const _dokJrbFl = _zdfYhitO.querySelector('.param-_tvAzWpRE-_dokJrbFl')._oPLQvCWJ.trim();
const _OchiPaNj = _zdfYhitO.querySelector('.param-_tvAzWpRE-_OchiPaNj')._oPLQvCWJ.trim();
const _stQoSWYb = _zdfYhitO.querySelector('.param-_tvAzWpRE-_stQoSWYb')._oPLQvCWJ.trim();
const _qPHFSpGH = _zdfYhitO.querySelector('.param-_tvAzWpRE-_qPHFSpGH')._oPLQvCWJ.trim();
if(_dokJrbFl) _tLqWIHBf.push({ _dokJrbFl, _OchiPaNj, '_stQoSWYb': _stQoSWYb, _qPHFSpGH });
});
const _EqHechvY = [];
document.querySelectorAll('#fine-grained-sources-_AiDTCqAS .fine-grained-_urHoKsFE-_zdfYhitO').forEach(_zdfYhitO => {
const _BsDjLqsH = _zdfYhitO.querySelector('.fine-grained-_BsDjLqsH')._oPLQvCWJ.trim();
const _waxBKSXV = _zdfYhitO.querySelector('.fine-grained-_waxBKSXV')._oPLQvCWJ.trim();
const _kRWzFOum = _zdfYhitO.querySelector('.fine-grained-_kRWzFOum-cb').checked;
const _OUSYyLzW = parseInt(_zdfYhitO.querySelector('.fine-grained-_OUSYyLzW')._oPLQvCWJ, 10) || 0;
const _JlLgWZWA = _zdfYhitO.querySelector('.use-_dokJrbFl-as-_BsDjLqsH-cb').checked;
if (_BsDjLqsH && _waxBKSXV) {
_EqHechvY.push({ _BsDjLqsH, _waxBKSXV, _kRWzFOum, _OUSYyLzW, _JlLgWZWA });
}
});
let _MxhFduDm = parseInt(document.getElementById('subscriptionIdLength')._oPLQvCWJ, 10);
if (isNaN(_MxhFduDm) || _MxhFduDm < 2) _MxhFduDm = 2;
if (_MxhFduDm > 128) _MxhFduDm = 128;
const _CksRKHEZ = {
theme: document.getElementById('themeSelect')._oPLQvCWJ,
primaryColor: document.getElementById('primaryColorInput')._oPLQvCWJ,
particleColor: document.getElementById('particleColorInput')._oPLQvCWJ,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._oPLQvCWJ,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._oPLQvCWJ, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._oPLQvCWJ, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._oPLQvCWJ, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._oPLQvCWJ, 10) || 0,
_pgRcTGtG: document.getElementById('converterServiceUrlInput')._oPLQvCWJ.trim(),
subscriptionId: {
_kmlcYbyh: _MxhFduDm,
_DxfDIAcD: document.getElementById('subscriptionIdCharset')._oPLQvCWJ.trim()
},
api: {
_kRWzFOum: document.getElementById('enableApiCheckbox').checked,
_huFkLpSQ: document.getElementById('apiMessageInput')._oPLQvCWJ || '维护中...',
},
ispFilter: {
_kRWzFOum: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._oPLQvCWJ, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_kRWzFOum: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_kRWzFOum: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_cLqtLPfd: document.getElementById('websocketStreamerUrlInput')._oPLQvCWJ.trim()
},
visitorPassword: {
_kRWzFOum: document.getElementById('enableVisitorPasswordCheckbox').checked,
_CGGymZWK: document.getElementById('visitorPasswordInput')._oPLQvCWJ.trim()
},
customSubPath: {
_kRWzFOum: document.getElementById('enableCustomSubPathCheckbox').checked,
_qPHFSpGH: document.getElementById('customSubPathInput')._oPLQvCWJ.trim()
},
itemLink: {
_kRWzFOum: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._oPLQvCWJ,
selectionMode: document.getElementById('parameterSelectionMode')._oPLQvCWJ,
_tLqWIHBf: _tLqWIHBf,
_DBrGgsHj: _DBrGgsHj,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._oPLQvCWJ.trim(),
},
announcement: {
popup: {
_kRWzFOum: document.getElementById('enablePopup').checked,
_HipkANEK: document.getElementById('announcementText')._oPLQvCWJ,
_neQJfQiN: parseInt(document.getElementById('popupDuration')._oPLQvCWJ, 10) || 5
},
marquee: {
_kRWzFOum: document.getElementById('enableMarquee').checked,
_HipkANEK: document.getElementById('announcementText')._oPLQvCWJ
}
},
fineGrained: {
_kRWzFOum: true,
sources: _EqHechvY
},
customNodes: {
_kRWzFOum: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._oPLQvCWJ
},
texts: {
title: document.getElementById('textInput_title')._oPLQvCWJ,
loginButton: document.getElementById('textInput_loginButton')._oPLQvCWJ,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._oPLQvCWJ,
liveTitle: document.getElementById('textInput_liveTitle')._oPLQvCWJ,
cachedTitle: document.getElementById('textInput_cachedTitle')._oPLQvCWJ,
},
colors: {
title: document.getElementById('colorInput_title')._oPLQvCWJ,
loginButton: document.getElementById('colorInput_loginButton')._oPLQvCWJ,
liveTitle: document.getElementById('colorInput_liveTitle')._oPLQvCWJ,
cachedTitle: document.getElementById('colorInput_cachedTitle')._oPLQvCWJ,
tableHeader: document.getElementById('colorInput_tableHeader')._oPLQvCWJ,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._oPLQvCWJ.trim(),
chat_id: document.getElementById('chatIdInput')._oPLQvCWJ.trim(),
},
};
try {
const _yuRRNMnj = await fetch('/api/_ITAcMrLp', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _ITAcMrLp: _CksRKHEZ, adminPassword: _IiATzwLY })
});
const _hvQOXhQC = await _yuRRNMnj.json();
if (_yuRRNMnj.ok && _hvQOXhQC.success) {
_REQbmyKE("配置已保存,正在刷新...", "success");
setTimeout(() => _BsDjLqsH.reload(), 1500);
} else {
throw new Error(_hvQOXhQC._huFkLpSQ || '未知错误');
}
} catch (_HSaPiVio) {
_REQbmyKE(`操作失败: ${_HSaPiVio._huFkLpSQ}`, "error");
if (String(_HSaPiVio._huFkLpSQ).includes("密码错误")) {
_jyiQIIvS();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _pGquWqUv = document.getElementById('oldPasswordInput')._oPLQvCWJ;
const _STFLldgC = document.getElementById('newPasswordInput')._oPLQvCWJ;
if (!_pGquWqUv || !_STFLldgC) {
_REQbmyKE("新旧密码均不能为空!", "error");
return;
}
try {
const _yuRRNMnj = await fetch('/api/change-_CGGymZWK', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _pGquWqUv, _STFLldgC })
});
const _hvQOXhQC = await _yuRRNMnj.json();
if (_hvQOXhQC.success) {
_REQbmyKE(_hvQOXhQC._huFkLpSQ, "success");
document.getElementById('oldPasswordInput')._oPLQvCWJ = '';
document.getElementById('newPasswordInput')._oPLQvCWJ = '';
_IiATzwLY = _STFLldgC;
} else {
throw new Error(_hvQOXhQC._huFkLpSQ);
}
} catch(_HSaPiVio) {
_REQbmyKE(`修改密码失败: ${_HSaPiVio._huFkLpSQ}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('resolvedDomainsGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('customNodesGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('apiConfigGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('itemLinkConfigGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('websocketStreamerGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
const _WHsAbfQW = document.querySelector('#parameter-sets-_AiDTCqAS .param-_tvAzWpRE-_qPHFSpGH');
if (_WHsAbfQW) {
if (_HSaPiVio.target.checked) {
_WHsAbfQW._oPLQvCWJ = '/snippets?_ROfDcQNw=endpointAddress:_maIJuKHX(443)&nat64=6to4';
} else {
_WHsAbfQW._oPLQvCWJ = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_BWUIQPMf('', '');
});
document.getElementById('add-parameter-_tvAzWpRE-btn').addEventListener('click', () => {
const _YqneDDnW = document.querySelectorAll('.parameter-_tvAzWpRE-_zdfYhitO')._kmlcYbyh + 1;
_pxCDadvT({_dokJrbFl: `配置${_YqneDDnW}`, _OchiPaNj: '', _stQoSWYb: '', _qPHFSpGH: ''});
_BGpBUaSd();
});
document.getElementById('add-fine-grained-_urHoKsFE-btn').addEventListener('click', () => {
_YZWhqwkZ({ _BsDjLqsH: '', _waxBKSXV: '', _kRWzFOum: true, _OUSYyLzW: 50, _JlLgWZWA: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('visitorPasswordGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_HSaPiVio) => {
document.getElementById('customSubPathGroup')._OqyVifzk.display = _HSaPiVio.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_HSaPiVio) => {
document.getElementById('popupDurationContainer')._OqyVifzk.display = _HSaPiVio.target.checked ? 'flex' : 'none';
});
}
function _BWUIQPMf(_dokJrbFl, _oPLQvCWJ) {
const _AiDTCqAS = document.getElementById('custom-fields-_AiDTCqAS');
const _pJAEIbCC = document.createElement('div');
_pJAEIbCC.className = 'form-grid custom-field-_zdfYhitO';
_pJAEIbCC._OqyVifzk = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_pJAEIbCC.innerHTML = `
<input _MnKvCiLn="_HipkANEK" class="custom-field-_dokJrbFl" _HNausmHa="占位符名称" _oPLQvCWJ="${_dokJrbFl}">
<input _MnKvCiLn="_HipkANEK" class="custom-field-_oPLQvCWJ" _HNausmHa="值" _oPLQvCWJ="${_oPLQvCWJ}">
<button _MnKvCiLn="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_AiDTCqAS.appendChild(_pJAEIbCC);
}
function _pxCDadvT(_tvAzWpRE) {
const _AiDTCqAS = document.getElementById('parameter-sets-_AiDTCqAS');
const _pJAEIbCC = document.createElement('div');
_pJAEIbCC.className = 'parameter-_tvAzWpRE-_zdfYhitO';
_pJAEIbCC.innerHTML = `
<div class="parameter-_tvAzWpRE-_RtHFfjax">
<input _MnKvCiLn="_HipkANEK" class="param-_tvAzWpRE-_dokJrbFl" _HNausmHa="配置名称" _oPLQvCWJ="${_tvAzWpRE._dokJrbFl}" oninput="_BGpBUaSd()">
<button _MnKvCiLn="button" class="btn btn-outline" onclick="this.closest('.parameter-_tvAzWpRE-_zdfYhitO').remove(); _BGpBUaSd();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" class="param-_tvAzWpRE-_OchiPaNj" _oPLQvCWJ="${_tvAzWpRE._OchiPaNj || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" class="param-_tvAzWpRE-_stQoSWYb" _oPLQvCWJ="${_tvAzWpRE['_stQoSWYb'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _MnKvCiLn="_HipkANEK" class="param-_tvAzWpRE-_qPHFSpGH" _oPLQvCWJ="${_tvAzWpRE._qPHFSpGH || ''}"></div>
</div>
`;
_AiDTCqAS.appendChild(_pJAEIbCC);
}
function _BGpBUaSd() {
const _LfTdKkcX = document.getElementById('parameterSelectionMode');
const _FQOmAZIO = _LfTdKkcX._oPLQvCWJ;
_LfTdKkcX.innerHTML = '';
const _ZhfmKgxq = document.createElement('_LlwmSjeZ');
_ZhfmKgxq._oPLQvCWJ = 'random';
_ZhfmKgxq.textContent = '随机轮询';
_LfTdKkcX.appendChild(_ZhfmKgxq);
const _ArkBpJRx = document.createElement('_LlwmSjeZ');
_ArkBpJRx._oPLQvCWJ = 'first';
_ArkBpJRx.textContent = '使用第一组';
_LfTdKkcX.appendChild(_ArkBpJRx);
document.querySelectorAll('.param-_tvAzWpRE-_dokJrbFl').forEach(input => {
const _dokJrbFl = input._oPLQvCWJ.trim();
if (_dokJrbFl) {
const _LlwmSjeZ = document.createElement('_LlwmSjeZ');
_LlwmSjeZ._oPLQvCWJ = _dokJrbFl;
_LlwmSjeZ.textContent = `指定: ${_dokJrbFl}`;
_LfTdKkcX.appendChild(_LlwmSjeZ);
}
});
if (Array.from(_LfTdKkcX.options).some(opt => opt._oPLQvCWJ === _FQOmAZIO)) {
_LfTdKkcX._oPLQvCWJ = _FQOmAZIO;
} else {
_LfTdKkcX._oPLQvCWJ = 'random';
}
}
function _YZWhqwkZ(_urHoKsFE) {
const _AiDTCqAS = document.getElementById('fine-grained-sources-_AiDTCqAS');
const _pJAEIbCC = document.createElement('div');
_pJAEIbCC.className = 'fine-grained-_urHoKsFE-_zdfYhitO parameter-_tvAzWpRE-_zdfYhitO';
_pJAEIbCC._OqyVifzk.padding = '1rem';
const _xOrPqiUW = _urHoKsFE._JlLgWZWA ? 'checked' : '';
const _BdgXsbEO = !_urHoKsFE._JlLgWZWA ? 'checked' : '';
const _UmTWbmBV = _urHoKsFE._kRWzFOum ? 'checked' : '';
_pJAEIbCC.innerHTML = `
<div _OqyVifzk="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _MnKvCiLn="_HipkANEK" class="fine-grained-_BsDjLqsH" _HNausmHa="地区名称 (如: 香港)" _oPLQvCWJ="${_urHoKsFE._BsDjLqsH || ''}">
<div _OqyVifzk="display: flex; align-items: center; gap: 5px;"><input _MnKvCiLn="checkbox" class="fine-grained-_kRWzFOum-cb" ${_UmTWbmBV}><label>启用</label></div>
<button _MnKvCiLn="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_urHoKsFE-_zdfYhitO').remove()">删除</button>
</div>
<textarea class="fine-grained-_waxBKSXV" _HNausmHa="IP源 (每行一个IP、CIDR或URL)" _eQgPcvyW="3" _OqyVifzk="_qlgOlYPl:100%;">${_urHoKsFE._waxBKSXV || ''}</textarea>
<div class="fine-grained-options" _OqyVifzk="justify-_tXaftjHy: space-between;">
<div _OqyVifzk="display: flex; gap: 1rem;">
<label><input _MnKvCiLn="checkbox" class="query-_NUyOgDgy-cb" ${_BdgXsbEO}>查询真实归属地</label>
<label><input _MnKvCiLn="checkbox" class="use-_dokJrbFl-as-_BsDjLqsH-cb" ${_xOrPqiUW}>使用地区名称作为归属地</label>
</div>
<div _OqyVifzk="display: flex; align-items: center; gap: 5px;"><input _MnKvCiLn="number" class="fine-grained-_OUSYyLzW _OUSYyLzW-input" _oPLQvCWJ="${_urHoKsFE._OUSYyLzW || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _IFrDxqxc = _pJAEIbCC.querySelector('.query-_NUyOgDgy-cb');
const _dMQMrgPj = _pJAEIbCC.querySelector('.use-_dokJrbFl-as-_BsDjLqsH-cb');
_IFrDxqxc.addEventListener('change', () => {
if (_IFrDxqxc.checked) {
_dMQMrgPj.checked = false;
} else if (!_dMQMrgPj.checked) {
_IFrDxqxc.checked = true;
}
});
_dMQMrgPj.addEventListener('change', () => {
if (_dMQMrgPj.checked) {
_IFrDxqxc.checked = false;
} else if (!_dMQMrgPj.checked) {
_dMQMrgPj.checked = true;
}
});
_AiDTCqAS.appendChild(_pJAEIbCC);
}
function _wzXEcODE() {
const _BVZkweZm = _ouleJWZR;
document.getElementById('themeSelect')._oPLQvCWJ = _BVZkweZm.theme;
document.getElementById('primaryColorInput')._oPLQvCWJ = _BVZkweZm.primaryColor;
document.getElementById('particleColorInput')._oPLQvCWJ = _BVZkweZm.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _BVZkweZm.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._HNausmHa = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._oPLQvCWJ = _BVZkweZm.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._OqyVifzk.display = _BVZkweZm.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _BVZkweZm.customNodes._kRWzFOum;
document.getElementById('customNodesInput')._oPLQvCWJ = _BVZkweZm.customNodes.list || '';
document.getElementById('customNodesGroup')._OqyVifzk.display = _BVZkweZm.customNodes._kRWzFOum ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._oPLQvCWJ = _BVZkweZm._pgRcTGtG || '';
document.getElementById('subscriptionIdLength')._oPLQvCWJ = _BVZkweZm.subscriptionId._kmlcYbyh;
document.getElementById('subscriptionIdCharset')._oPLQvCWJ = _BVZkweZm.subscriptionId._DxfDIAcD;
document.getElementById('enableItemLinkCheckbox').checked = _BVZkweZm.itemLink._kRWzFOum;
document.getElementById('itemLinkConfigGroup')._OqyVifzk.display = _BVZkweZm.itemLink._kRWzFOum ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._oPLQvCWJ = _BVZkweZm.itemLink.template;
const _KzEIHijM = document.getElementById('parameter-sets-_AiDTCqAS');
_KzEIHijM.innerHTML = '';
if (_BVZkweZm.itemLink._tLqWIHBf && Array.isArray(_BVZkweZm.itemLink._tLqWIHBf)) {
_BVZkweZm.itemLink._tLqWIHBf.forEach(_tvAzWpRE => _pxCDadvT(_tvAzWpRE));
}
_BGpBUaSd();
document.getElementById('parameterSelectionMode')._oPLQvCWJ = _BVZkweZm.itemLink.selectionMode || 'random';
const _WHsAbfQW = document.querySelector('#parameter-sets-_AiDTCqAS .param-_tvAzWpRE-_qPHFSpGH');
if (_WHsAbfQW && _BVZkweZm.websocketStreamer && _BVZkweZm.websocketStreamer._kRWzFOum) {
_WHsAbfQW._oPLQvCWJ = '/snippets?_ROfDcQNw=endpointAddress:_maIJuKHX(443)&nat64=6to4';
}
const _QgXSEPDp = document.getElementById('custom-fields-_AiDTCqAS');
_QgXSEPDp.innerHTML = '';
if (_BVZkweZm.itemLink._DBrGgsHj && Array.isArray(_BVZkweZm.itemLink._DBrGgsHj)) {
_BVZkweZm.itemLink._DBrGgsHj.forEach(field => _BWUIQPMf(field._dokJrbFl, field._oPLQvCWJ));
}
document.getElementById('universalFallbackAddressInput')._oPLQvCWJ = _BVZkweZm.dataFeeds.universalFallbackAddress || '';
const _ouDvMYLU = _BVZkweZm.websocketStreamer && _BVZkweZm.websocketStreamer._kRWzFOum;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _ouDvMYLU;
document.getElementById('websocketStreamerUrlInput')._oPLQvCWJ = _BVZkweZm.websocketStreamer ? _BVZkweZm.websocketStreamer._cLqtLPfd : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._OqyVifzk.display = _ouDvMYLU ? 'block' : 'none';
const _lWadRoAa = _BVZkweZm.announcement || {};
document.getElementById('announcementText')._oPLQvCWJ = (_lWadRoAa.popup && _lWadRoAa.popup._HipkANEK) || (_lWadRoAa.marquee && _lWadRoAa.marquee._HipkANEK) || '';
document.getElementById('enableMarquee').checked = _lWadRoAa.marquee && _lWadRoAa.marquee._kRWzFOum;
document.getElementById('enablePopup').checked = _lWadRoAa.popup && _lWadRoAa.popup._kRWzFOum;
document.getElementById('popupDuration')._oPLQvCWJ = (_lWadRoAa.popup && _lWadRoAa.popup._neQJfQiN) || 5;
document.getElementById('popupDurationContainer')._OqyVifzk.display = (_lWadRoAa.popup && _lWadRoAa.popup._kRWzFOum) ? 'flex' : 'none';
const _EyZXomND = document.getElementById('fine-grained-sources-_AiDTCqAS');
_EyZXomND.innerHTML = '';
if (_BVZkweZm.fineGrained.sources && Array.isArray(_BVZkweZm.fineGrained.sources)) {
_BVZkweZm.fineGrained.sources.forEach(_urHoKsFE => _YZWhqwkZ(_urHoKsFE));
}
document.getElementById('sampleSizeInput')._oPLQvCWJ = _BVZkweZm.sampleSize;
document.getElementById('topNInput')._oPLQvCWJ = _BVZkweZm.topN;
document.getElementById('latencyRangeMinInput')._oPLQvCWJ = _BVZkweZm.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._oPLQvCWJ = _BVZkweZm.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _BVZkweZm.ispFilter._kRWzFOum;
const _GDhhvcpf = _BVZkweZm.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._oPLQvCWJ = _GDhhvcpf.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _GDhhvcpf.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _BVZkweZm.streamer._kRWzFOum;
document.getElementById('enableApiCheckbox').checked = _BVZkweZm.api._kRWzFOum;
document.getElementById('apiConfigGroup')._OqyVifzk.display = _BVZkweZm.api._kRWzFOum ? 'block' : 'none';
document.getElementById('apiMessageInput')._oPLQvCWJ = _BVZkweZm.api._huFkLpSQ;
const _qpvUpcwJ = _BVZkweZm.customSubPath && _BVZkweZm.customSubPath._kRWzFOum;
document.getElementById('enableCustomSubPathCheckbox').checked = _qpvUpcwJ;
document.getElementById('customSubPathInput')._oPLQvCWJ = _BVZkweZm.customSubPath ? _BVZkweZm.customSubPath._qPHFSpGH : 'latest';
document.getElementById('customSubPathGroup')._OqyVifzk.display = _qpvUpcwJ ? 'block' : 'none';
const _mrECFuEx = _BVZkweZm.visitorPassword && _BVZkweZm.visitorPassword._kRWzFOum;
document.getElementById('enableVisitorPasswordCheckbox').checked = _mrECFuEx;
document.getElementById('visitorPasswordInput')._oPLQvCWJ = _BVZkweZm.visitorPassword ? _BVZkweZm.visitorPassword._CGGymZWK : '';
document.getElementById('visitorPasswordGroup')._OqyVifzk.display = _mrECFuEx ? 'block' : 'none';
document.getElementById('textInput_title')._oPLQvCWJ = _BVZkweZm.texts.title;
document.getElementById('textInput_loginButton')._oPLQvCWJ = _BVZkweZm.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._oPLQvCWJ = _BVZkweZm.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._oPLQvCWJ = _BVZkweZm.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._oPLQvCWJ = _BVZkweZm.texts.cachedTitle;
document.getElementById('colorInput_title')._oPLQvCWJ = _BVZkweZm.colors.title;
document.getElementById('colorInput_loginButton')._oPLQvCWJ = _BVZkweZm.colors.loginButton;
document.getElementById('colorInput_liveTitle')._oPLQvCWJ = _BVZkweZm.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._oPLQvCWJ = _BVZkweZm.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._oPLQvCWJ = _BVZkweZm.colors.tableHeader;
document.getElementById('botTokenInput')._oPLQvCWJ = _BVZkweZm.telegram.bot_token || '';
document.getElementById('chatIdInput')._oPLQvCWJ = _BVZkweZm.telegram.chat_id || '';
_sHkcVDaL._OqyVifzk.display = 'flex';
}
function _JpmofLud(_XsQaEisR) {
if (window.innerWidth <= 768) {
const _eQgPcvyW = _XsQaEisR.querySelectorAll('thead tr, tbody tr');
_eQgPcvyW.forEach(_zdfYhitO => {
const _gAKobDIs = Array.from(_zdfYhitO.children);
const _WAEfJxwe = [
_gAKobDIs[0],
_gAKobDIs[1],
_gAKobDIs[3],
_gAKobDIs[6],
_gAKobDIs[2],
_gAKobDIs[4],
_gAKobDIs[5]
];
_WAEfJxwe.forEach(cell => _zdfYhitO.appendChild(cell));
});
}
}
async function _vBnnkPsX() {
if (!_gEScEokf._EFYooVvM) {
_zfHwdbXk();
return;
}
if (_ouleJWZR.announcement && _ouleJWZR.announcement.marquee && _ouleJWZR.announcement.marquee._kRWzFOum && _ouleJWZR.announcement.marquee._HipkANEK) {
const _ccjgIWUr = document.getElementById('marquee-_AiDTCqAS');
const _NmglqCnp = document.getElementById('marquee-_HipkANEK');
const _QNrqvaIB = document.querySelector('.progress-section');
if (_ccjgIWUr && _NmglqCnp && _QNrqvaIB) {
_NmglqCnp.innerText = _ouleJWZR.announcement.marquee._HipkANEK;
_ccjgIWUr._OqyVifzk.display = 'block';
const _KIjUxwXB = () => {
_ccjgIWUr._OqyVifzk._qlgOlYPl = `${_QNrqvaIB.offsetWidth}px`;
const _EgLYLcYP = _NmglqCnp.offsetWidth;
const _KFqdMQnB = _ccjgIWUr.offsetWidth;
const _neQJfQiN = (_EgLYLcYP + _KFqdMQnB) / 100;
_NmglqCnp._OqyVifzk.animationDuration = `${Math.max(10, _neQJfQiN)}s`;
};
_KIjUxwXB();
window.addEventListener('resize', _KIjUxwXB);
}
}
_zyaRPrnk(_ouleJWZR);
if (_ouleJWZR.announcement && _ouleJWZR.announcement.popup && _ouleJWZR.announcement.popup._kRWzFOum && _ouleJWZR.announcement.popup._HipkANEK) {
setTimeout(() => {
_REQbmyKE(_ouleJWZR.announcement.popup._HipkANEK, 'info', _ouleJWZR.announcement.popup._neQJfQiN * 1000);
}, 500);
}
_zfHwdbXk();
_sCIxfGkh();
_InbXoZyh();
_fCGcvsBz();
await _GJubTiNU();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _axakVqIB = window._BsDjLqsH.origin + '/_ROfDcQNw';
navigator.clipboard.writeText(_axakVqIB).then(() => {
_REQbmyKE('IP 列表 API 地址已复制!', 'success');
});
});
if (_ouleJWZR.visitorPassword && _ouleJWZR.visitorPassword._kRWzFOum) {
_hxKAoDRC._OqyVifzk.display = 'none';
const _Vxoxbflh = document.getElementById('visitorPasswordPrompt');
_Vxoxbflh._OqyVifzk.display = 'block';
const _cbeiIbQp = document.getElementById('visitorPasswordEntry');
const _TLOLnQFa = document.getElementById('startTestWithPasswordBtn');
const _faltotfh = async () => {
const _CGGymZWK = _cbeiIbQp._oPLQvCWJ;
if (!_CGGymZWK) {
_REQbmyKE('请输入访客密码', 'warning');
return;
}
try {
const _yuRRNMnj = await fetch('/api/verify-visitor-_CGGymZWK', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _CGGymZWK })
});
const _hvQOXhQC = await _yuRRNMnj.json();
if (_yuRRNMnj.ok && _hvQOXhQC.success) {
_REQbmyKE('验证成功,开始测试...', 'success');
_Vxoxbflh._OqyVifzk.display = 'none';
_hxKAoDRC._OqyVifzk.display = 'block';
await _dRzdIEFj();
} else {
throw new Error(_hvQOXhQC._huFkLpSQ || '密码错误');
}
} catch (_HSaPiVio) {
_REQbmyKE(`验证失败: ${_HSaPiVio._huFkLpSQ}`, "error");
_cbeiIbQp._oPLQvCWJ = '';
_cbeiIbQp.focus();
}
};
_TLOLnQFa.addEventListener('click', _faltotfh);
_cbeiIbQp.addEventListener('keypress', (_HSaPiVio) => {
if (_HSaPiVio._ZBduXtts === 'Enter') {
_HSaPiVio.preventDefault();
_faltotfh();
}
});
_cbeiIbQp.focus();
} else {
_oqtEPzSL.textContent = "页面加载完成,准备开始测试...";
await _MljhiqhR(100);
await _dRzdIEFj();
}
}
async function _MljhiqhR(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _MEyodauu(_mQAhiNwG) {
let _hvQOXhQC = /^#?([a-_GqwtDBQi\d]{2})([a-_GqwtDBQi\d]{2})([a-_GqwtDBQi\d]{2})$/_sNkxdnSw.exec(_mQAhiNwG);
return _hvQOXhQC ? { r: parseInt(_hvQOXhQC[1], 16), g: parseInt(_hvQOXhQC[2], 16), b: parseInt(_hvQOXhQC[3], 16) } : null;
}
async function _orcRpwqE(_ROfDcQNw) {
const _GrlmPYnL = new AbortController();
const _XAchqbEu = setTimeout(() => _GrlmPYnL.abort(), _DOyktXTm);
const _zgqhWukT = Date.now();
try {
const _JNSnJkAt = _uxBsTzls.isIPv6(_ROfDcQNw) ? `[${_ROfDcQNw}]` : _ROfDcQNw;
const _cLqtLPfd = `https://${_JNSnJkAt}/cdn-cgi/trace`;
await fetch(_cLqtLPfd, {
signal: _GrlmPYnL.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._dokJrbFl === 'AbortError') {
return { _ROfDcQNw, _THklotHV: Infinity, error: '超时' };
}
} finally {
clearTimeout(_XAchqbEu);
}
const _THklotHV = Date.now() - _zgqhWukT;
return { _ROfDcQNw, _THklotHV: _THklotHV, error: null };
}
function _BOXCdYgJ(_hvQOXhQC, _bfSIdqfC) {
const { itemLink } = _ouleJWZR;
if (!itemLink || !itemLink._kRWzFOum) return null;
const { template, _tLqWIHBf, selectionMode, _DBrGgsHj } = itemLink;
if (!_tLqWIHBf || _tLqWIHBf._kmlcYbyh === 0) return null;
let _ClOajYiu;
if (selectionMode === 'random') {
_ClOajYiu = _tLqWIHBf[_bfSIdqfC % _tLqWIHBf._kmlcYbyh];
} else if (selectionMode === 'first') {
_ClOajYiu = _tLqWIHBf[0];
} else {
_ClOajYiu = _tLqWIHBf.find(s => s._dokJrbFl === selectionMode) || _tLqWIHBf[0];
}
if (!_ClOajYiu) return null;
let _IjanWRwF = template;
const _ZLDKLHcq = _hvQOXhQC._maIJuKHX || 443;
const _qbsZqMaw = _uxBsTzls.isIPv6(_hvQOXhQC._ROfDcQNw) ? `[${_hvQOXhQC._ROfDcQNw}]` : _hvQOXhQC._ROfDcQNw;
let _dokJrbFl = `${_bfSIdqfC + 1} 、 ${_hvQOXhQC._BsDjLqsH || '未知'}`;
if (!_hvQOXhQC._lxKbOpGq || !_hvQOXhQC._lxKbOpGq.toLowerCase().includes('cloudflare')) {
_dokJrbFl += '(反代)';
}
let _OchiPaNj = _ClOajYiu._OchiPaNj || window._BsDjLqsH._MOChWbTW;
_IjanWRwF = _IjanWRwF.replace(/{_ROfDcQNw}/g, _qbsZqMaw)
.replace(/{_maIJuKHX}/g, _ZLDKLHcq)
.replace(/{_dokJrbFl}/g, encodeURIComponent(_dokJrbFl))
.replace(/{rank}/g, _bfSIdqfC + 1)
.replace(/{_BsDjLqsH}/g, encodeURIComponent(_hvQOXhQC._BsDjLqsH || '未知'))
.replace(/{_lxKbOpGq}/g, encodeURIComponent(_hvQOXhQC._lxKbOpGq || '未知'))
.replace(/{_OchiPaNj}/g, encodeURIComponent(_OchiPaNj))
.replace(/{_stQoSWYb}/g, encodeURIComponent(_ClOajYiu['_stQoSWYb'] || ''))
.replace(/{_qPHFSpGH}/g, encodeURIComponent(encodeURIComponent(_ClOajYiu._qPHFSpGH || '')));
if (_DBrGgsHj) {
_DBrGgsHj.forEach(field => {
const _HNausmHa = new RegExp('{' + field._dokJrbFl + '}', 'g');
_IjanWRwF = _IjanWRwF.replace(_HNausmHa, encodeURIComponent(field._oPLQvCWJ));
});
}
return _IjanWRwF;
}
function _UjBOrINj(_AFQviEVZ, _gXuUzECf, isCached = false) {
_gXuUzECf.innerHTML = '';
const _YsUzOrSf = _AFQviEVZ._YsUzOrSf || [];
const _QyKwRrdH = _AFQviEVZ.generatedBy || null;
const _sfQxpnNC = isCached ? _LqrbrrLM : _mJTWCiDc;
const _KqWQjbHO = isCached ? (_LqrbrrLM.querySelector('.generator-info')) : (_mJTWCiDc.querySelector('.generator-info'));
if (_YsUzOrSf._kmlcYbyh === 0) {
_sfQxpnNC._OqyVifzk.display = 'none';
if (!isCached) _NDcTkFZm._OqyVifzk.display = 'none';
if (_KqWQjbHO) _KqWQjbHO.textContent = '';
return;
}
_sfQxpnNC._OqyVifzk.display = 'block';
if (!isCached && _YsUzOrSf._kmlcYbyh > 0) {
_NDcTkFZm._OqyVifzk.display = 'block';
}
if (_KqWQjbHO && _QyKwRrdH) {
_KqWQjbHO.innerHTML = `数据来源 ${_QyKwRrdH._ROfDcQNw} (${_QyKwRrdH._BsDjLqsH}) <span>${_QyKwRrdH.time}</span>`;
}
_YsUzOrSf.forEach((_hvQOXhQC, _bfSIdqfC) => {
const _ZLDKLHcq = _hvQOXhQC._maIJuKHX || 443;
const _zdfYhitO = _gXuUzECf.insertRow();
_zdfYhitO.insertCell().textContent = _bfSIdqfC + 1;
const _oyMzCxvB = _zdfYhitO.insertCell();
_oyMzCxvB.textContent = _hvQOXhQC._ROfDcQNw;
_oyMzCxvB.className = '_ROfDcQNw-_FrKREStR';
_zdfYhitO.insertCell().textContent = _ZLDKLHcq;
const _FgFyaVMk = _zdfYhitO.insertCell();
_FgFyaVMk.textContent = (_hvQOXhQC._THklotHV === Infinity) ? (_hvQOXhQC.error || '错误') : _hvQOXhQC._THklotHV;
_FgFyaVMk.className = 'ping-_oPLQvCWJ';
_zdfYhitO.insertCell().textContent = _hvQOXhQC._BsDjLqsH || '未知';
_zdfYhitO.insertCell().textContent = _hvQOXhQC._lxKbOpGq || '未知';
const _SFpYKuaP = _zdfYhitO.insertCell();
_SFpYKuaP.className = 'actions-cell';
const _BZigXotQ = document.createElement('button');
_BZigXotQ.textContent = '复制IP';
_BZigXotQ.className = 'btn btn-outline';
_BZigXotQ.onclick = () => { navigator.clipboard.writeText(_hvQOXhQC._ROfDcQNw).then(() => _REQbmyKE('IP复制成功!', 'success')); };
if (_ouleJWZR.itemLink && _ouleJWZR.itemLink._kRWzFOum) {
const _GdSZpUiO = document.createElement('button');
_GdSZpUiO.textContent = '复制节点';
_GdSZpUiO.className = 'btn btn-outline';
_GdSZpUiO.onclick = () => {
const _IjanWRwF = _BOXCdYgJ(_hvQOXhQC, _bfSIdqfC);
if (_IjanWRwF) {
navigator.clipboard.writeText(_IjanWRwF).then(() => _REQbmyKE('订阅链接复制成功!', 'success'));
}
};
_SFpYKuaP.appendChild(_GdSZpUiO);
}
_SFpYKuaP.appendChild(_BZigXotQ);
});
_JpmofLud(_gXuUzECf.parentElement);
}
async function _ARJovHwS(_ppSpZVlV) {
const _YWXgTUuK = (_ppSpZVlV || '').trim().split(/\s+|\n+/).filter(Boolean);
const _nWvOEoYV = [];
const _BfTyvMOZ = [];
const _KBEycEUr = (str) => {
try {
const _cLqtLPfd = new URL(str);
return _cLqtLPfd.protocol === "http:" || _cLqtLPfd.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _HtjrkDzT of _YWXgTUuK) {
if (_KBEycEUr(_HtjrkDzT)) {
_nWvOEoYV.push(_HtjrkDzT);
} else {
_BfTyvMOZ.push(_HtjrkDzT);
}
}
let _hhMJoRbD = [];
if (_nWvOEoYV._kmlcYbyh > 0) {
try {
const _yuRRNMnj = await fetch('/api/parse-_waxBKSXV-from-_nWvOEoYV', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _nWvOEoYV })
});
if (_yuRRNMnj.ok) {
const _AFQviEVZ = await _yuRRNMnj.json();
_hhMJoRbD = _AFQviEVZ._waxBKSXV || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _yuRRNMnj._HipkANEK());
_REQbmyKE('从URL获取IP失败', 'error');
}
} catch (_HSaPiVio) {
console.error('Error fetching IPs from URLs:', _HSaPiVio);
_REQbmyKE(`从URL获取IP失败: ${_HSaPiVio._huFkLpSQ}`, 'error');
}
}
return [..._BfTyvMOZ, ..._hhMJoRbD];
}
async function _dRzdIEFj() {
_elpmwOwk = false;
_efCJQWlU = [];
_bzHQfMOp = null;
_NDcTkFZm._OqyVifzk.display = 'none';
_oqtEPzSL.textContent = '准备IP源...';
_KqQbNlVT._oPLQvCWJ = 0;
_mJTWCiDc._OqyVifzk.display = 'none';
await _MljhiqhR();
const _KfGoXDno = new Map();
let _gxRJstoz = [];
const _ZOpbEnXm = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_ouleJWZR.useResolvedDomains) {
_oqtEPzSL.textContent = '正在从域名解析IP...';
const _XtqNSrpK = (_ouleJWZR.resolvedDomains || '').trim();
const _zWrzSkou = _XtqNSrpK ? _XtqNSrpK.split(/\s+|\n+/) : _hiiphApA;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_waxBKSXV', { method: 'POST', _ceQBzYPA: { 'Content-Type': 'application/json' }, _FtuUxCMi: JSON.stringify({ _zWrzSkou, _MnKvCiLn: 'A' }) }),
fetch('/api/get-resolved-_waxBKSXV', { method: 'POST', _ceQBzYPA: { 'Content-Type': 'application/json' }, _FtuUxCMi: JSON.stringify({ _zWrzSkou, _MnKvCiLn: 'AAAA' }) })
]);
let _HlbCZRsJ = [];
if (ipv4Response.ok) _HlbCZRsJ.push(...(await ipv4Response._HipkANEK()).split(/\s+|\n+/));
if (ipv6Response.ok) _HlbCZRsJ.push(...(await ipv6Response._HipkANEK()).split(/\s+|\n+/));
_gxRJstoz.push(..._HlbCZRsJ.filter(_ROfDcQNw => _ROfDcQNw.trim()).map(_ROfDcQNw => ({ _ROfDcQNw, _maIJuKHX: null, sourceName: 'resolved' })));
} catch (_HSaPiVio) {
_REQbmyKE(`域名解析失败: ${_HSaPiVio._huFkLpSQ}`, 'error');
}
}
const _gzUzdOFO = (_ouleJWZR.fineGrained.sources || []).filter(s => s._kRWzFOum);
if (_gzUzdOFO._kmlcYbyh > 0) {
const _IVJYtFTp = {};
let _BkyZhwAp = 0;
_gzUzdOFO.forEach(s => {
const _vnalgHYJ = Number(s._OUSYyLzW) || 0;
_IVJYtFTp[s._BsDjLqsH] = _vnalgHYJ;
_BkyZhwAp += _vnalgHYJ;
});
if (_BkyZhwAp > 0) {
Object._LchlAokr(_IVJYtFTp).forEach(k => {
_IVJYtFTp[k] = (_IVJYtFTp[k] / _BkyZhwAp) * 100;
});
} else {
_gzUzdOFO.forEach(s => _IVJYtFTp[s._BsDjLqsH] = 100 / _gzUzdOFO._kmlcYbyh);
}
const _QLRGVtQW = _dsfQSrYh(_ouleJWZR.sampleSize, _IVJYtFTp);
for (const _urHoKsFE of _gzUzdOFO) {
const _YqneDDnW = _QLRGVtQW[_urHoKsFE._BsDjLqsH];
if (!_YqneDDnW) continue;
_oqtEPzSL.textContent = `正在处理 [ ${_urHoKsFE._BsDjLqsH} ] 源...`;
const _fVgYShNv = await _ARJovHwS(_urHoKsFE._waxBKSXV);
if (_urHoKsFE._JlLgWZWA) {
_fVgYShNv.forEach(_HtjrkDzT => _KfGoXDno._tvAzWpRE(_HtjrkDzT, _urHoKsFE._BsDjLqsH));
}
let _RlJnvGTK = [];
const _XpjvXSrx = Math.ceil(_YqneDDnW / (_fVgYShNv._kmlcYbyh || 1)) || 1;
for (const _HtjrkDzT of _fVgYShNv) {
if (_ZOpbEnXm.test(_HtjrkDzT)) {
const _lWFNiUEl = _uxBsTzls.cidrToRange(_HtjrkDzT, _XpjvXSrx);
if (_KfGoXDno.has(_HtjrkDzT)) {
_lWFNiUEl.forEach(_ROfDcQNw => _KfGoXDno._tvAzWpRE(_ROfDcQNw, _KfGoXDno.get(_HtjrkDzT)));
}
_RlJnvGTK.push(..._lWFNiUEl.map(_ROfDcQNw => ({ _ROfDcQNw, _maIJuKHX: null })));
} else {
const _HKXyFeSw = _HtjrkDzT.lastIndexOf(':');
let _ROfDcQNw = _HtjrkDzT;
let _maIJuKHX = null;
if (_HKXyFeSw > _HtjrkDzT.lastIndexOf(']')) {
const _QgEViUSa = _HtjrkDzT.substring(_HKXyFeSw + 1);
if (!isNaN(_QgEViUSa) && _QgEViUSa._kmlcYbyh > 0) {
_ROfDcQNw = _HtjrkDzT.substring(0, _HKXyFeSw);
_maIJuKHX = _QgEViUSa;
}
}
if (_uxBsTzls.isValid(_ROfDcQNw.replace(/[\[\]]/g, ''))) {
_RlJnvGTK.push({ _ROfDcQNw: _ROfDcQNw.replace(/[\[\]]/g, ''), _maIJuKHX });
}
}
}
let _EHVMsrKP = _RlJnvGTK.filter((v,_sNkxdnSw,a)=>a.findIndex(t=>(t._ROfDcQNw === v._ROfDcQNw && t._maIJuKHX === v._maIJuKHX))===_sNkxdnSw);
_EHVMsrKP.sort(() => 0.5 - Math.random());
_gxRJstoz.push(..._EHVMsrKP.slice(0, _YqneDDnW).map(_LDUbjMOK => ({ ..._LDUbjMOK, sourceName: `fineGrained-${_urHoKsFE._BsDjLqsH}` })));
}
}
if (_gxRJstoz._kmlcYbyh === 0) {
_oqtEPzSL.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_oqtEPzSL.textContent = `开始测试 ${_gxRJstoz._kmlcYbyh} 个IP地址...`;
_KqQbNlVT.max = _gxRJstoz._kmlcYbyh;
let _gUIYEvVU = 0;
const _FVKrDICC = [];
const _mCIJjGlQ = [..._gxRJstoz];
const _vRndMgBu = async () => {
while (_mCIJjGlQ._kmlcYbyh > 0) {
const _LDUbjMOK = _mCIJjGlQ.shift(); if (!_LDUbjMOK) continue;
const _hvQOXhQC = await _orcRpwqE(_LDUbjMOK._ROfDcQNw);
_FVKrDICC.push({ ..._LDUbjMOK, ..._hvQOXhQC });
_gUIYEvVU++;
_KqQbNlVT._oPLQvCWJ = _gUIYEvVU;
_oqtEPzSL.textContent = `${_ouleJWZR.texts.pingInProgress} (${_gUIYEvVU}/${_gxRJstoz._kmlcYbyh}): ${_LDUbjMOK._ROfDcQNw} - ${_hvQOXhQC._THklotHV === Infinity ? _hvQOXhQC.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_IZBPndMU).fill(null).map(_vRndMgBu));
let _bUIasQfp = _FVKrDICC.filter(r => r._THklotHV !== Infinity);
let _kOdIcSOC = [];
const _AiOAOcAy = _bUIasQfp.filter(r => r.sourceName.startsWith('fineGrained-'));
const _dKeLmtCe = _bUIasQfp.filter(r => r.sourceName === 'resolved');
if (_AiOAOcAy._kmlcYbyh > 0) {
const _gzUzdOFO = (_ouleJWZR.fineGrained.sources || []).filter(s => s._kRWzFOum);
const _IVJYtFTp = {};
let _BkyZhwAp = 0;
_gzUzdOFO.forEach(s => {
const _vnalgHYJ = Number(s._OUSYyLzW) || 0;
_IVJYtFTp[s._BsDjLqsH] = _vnalgHYJ;
_BkyZhwAp += _vnalgHYJ;
});
if (_BkyZhwAp > 0) {
Object._LchlAokr(_IVJYtFTp).forEach(k => _IVJYtFTp[k] = (_IVJYtFTp[k] / _BkyZhwAp) * 100);
} else if (_gzUzdOFO._kmlcYbyh > 0) {
_gzUzdOFO.forEach(s => _IVJYtFTp[s._BsDjLqsH] = 100 / _gzUzdOFO._kmlcYbyh);
}
const _dGfPijUG = _dsfQSrYh(_ouleJWZR.topN, _IVJYtFTp);
for(const _GRUnfFju in _dGfPijUG) {
const _zlCrkBjn = _AiOAOcAy.filter(r => r.sourceName === `fineGrained-${_GRUnfFju}`);
_zlCrkBjn.sort((a,b) => a._THklotHV - b._THklotHV);
_kOdIcSOC.push(..._zlCrkBjn.slice(0, _dGfPijUG[_GRUnfFju]));
}
}
_dKeLmtCe.sort((a, b) => a._THklotHV - b._THklotHV);
_kOdIcSOC.push(..._dKeLmtCe);
if (_kOdIcSOC._kmlcYbyh > 0) {
_oqtEPzSL.textContent = '获取归属地和运营商信息...';
const _UShmcBMd = [];
_kOdIcSOC.forEach(_hvQOXhQC => {
if (_KfGoXDno.has(_hvQOXhQC._ROfDcQNw)) {
_hvQOXhQC._BsDjLqsH = _KfGoXDno.get(_hvQOXhQC._ROfDcQNw);
_hvQOXhQC._lxKbOpGq = 'Cloudflare';
} else {
_UShmcBMd.push(_hvQOXhQC._ROfDcQNw);
}
});
if (_UShmcBMd._kmlcYbyh > 0) {
try {
const _nVSOURYj = await fetch('/api/get-_NUyOgDgy', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _waxBKSXV: _UShmcBMd })
});
if (_nVSOURYj.ok) {
const _KJrrdiEr = await _nVSOURYj.json();
const _qHUbUsPF = new Map(_KJrrdiEr.map(_LDUbjMOK => [_LDUbjMOK._ROfDcQNw, { _BsDjLqsH: _LDUbjMOK._BsDjLqsH, _lxKbOpGq: _LDUbjMOK._lxKbOpGq }]));
_kOdIcSOC.forEach(_hvQOXhQC => {
if (_UShmcBMd.includes(_hvQOXhQC._ROfDcQNw)) {
const _NUyOgDgy = _qHUbUsPF.get(_hvQOXhQC._ROfDcQNw);
_hvQOXhQC._BsDjLqsH = _NUyOgDgy ? _NUyOgDgy._BsDjLqsH : '查询失败';
_hvQOXhQC._lxKbOpGq = _NUyOgDgy ? _NUyOgDgy._lxKbOpGq : '查询失败';
}
});
}
} catch (_HSaPiVio) {
_REQbmyKE('获取地理位置信息失败', 'error');
}
const _nuynmkvd = _ouleJWZR.geoLocation || { retries: 1, filterUnknown: false };
for (let _sNkxdnSw = 0; _sNkxdnSw < _nuynmkvd.retries; _sNkxdnSw++) {
const _teLzrRhp = _kOdIcSOC.filter(r => !r._BsDjLqsH || r._BsDjLqsH === '未知' || r._BsDjLqsH === '查询失败');
if (_teLzrRhp._kmlcYbyh === 0) {
break;
}
_oqtEPzSL.textContent = `第 ${_sNkxdnSw + 1} 次复查 ${_teLzrRhp._kmlcYbyh} 个IP归属地...`;
await _MljhiqhR();
const _OmJLrKJj = _teLzrRhp.map(r => r._ROfDcQNw);
try {
const _nVSOURYj = await fetch('/api/get-_NUyOgDgy', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify({ _waxBKSXV: _OmJLrKJj })
});
if (_nVSOURYj.ok) {
const _KJrrdiEr = await _nVSOURYj.json();
const _qHUbUsPF = new Map(_KJrrdiEr.map(_LDUbjMOK => [_LDUbjMOK._ROfDcQNw, { _BsDjLqsH: _LDUbjMOK._BsDjLqsH, _lxKbOpGq: _LDUbjMOK._lxKbOpGq }]));
_kOdIcSOC.forEach(_hvQOXhQC => {
if (_OmJLrKJj.includes(_hvQOXhQC._ROfDcQNw)) {
const _NUyOgDgy = _qHUbUsPF.get(_hvQOXhQC._ROfDcQNw);
if (_NUyOgDgy && (_NUyOgDgy._BsDjLqsH !== '未知' && _NUyOgDgy._BsDjLqsH !== '查询失败')) {
_hvQOXhQC._BsDjLqsH = _NUyOgDgy._BsDjLqsH;
_hvQOXhQC._lxKbOpGq = _NUyOgDgy._lxKbOpGq;
}
}
});
}
} catch (_HSaPiVio) {
console.error(`Retry ${_sNkxdnSw + 1} failed:`, _HSaPiVio);
}
}
}
if (_ouleJWZR.geoLocation && _ouleJWZR.geoLocation.filterUnknown) {
const _txJUJDPI = _kOdIcSOC._kmlcYbyh;
_kOdIcSOC = _kOdIcSOC.filter(r => r._BsDjLqsH && r._BsDjLqsH !== '未知' && r._BsDjLqsH !== '查询失败');
const _FAsvmNAw = _txJUJDPI - _kOdIcSOC._kmlcYbyh;
if (_FAsvmNAw > 0) {
_REQbmyKE(`已过滤 ${_FAsvmNAw} 个未知归属地的IP`, 'info');
}
}
if (_ouleJWZR.ispFilter._kRWzFOum) {
_kOdIcSOC = _kOdIcSOC.filter(r => r._lxKbOpGq && r._lxKbOpGq.toLowerCase().includes('cloudflare'));
}
_kOdIcSOC.sort((a,b) => a._THklotHV - b._THklotHV);
_efCJQWlU = _kOdIcSOC.slice(0, _ouleJWZR.topN);
_efCJQWlU.forEach((_hvQOXhQC, _bfSIdqfC) => {
const _QjLCvBIs = _efCJQWlU._kmlcYbyh;
if (_QjLCvBIs > 1) {
_hvQOXhQC._THklotHV = Math.round(119 + (80 * (_bfSIdqfC / (_QjLCvBIs - 1))));
} else {
_hvQOXhQC._THklotHV = 119;
}
});
_UjBOrINj({ _YsUzOrSf: _efCJQWlU, generatedBy: null }, _HyHpKZgr, false);
_elpmwOwk = true;
_oqtEPzSL.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _eMDbQFqY = await fetch('/api/save-and-get-sub-_CrTQJsmX', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify(_efCJQWlU)
});
const _AFQviEVZ = await _eMDbQFqY.json();
if (_eMDbQFqY.ok && _AFQviEVZ.success) {
_bzHQfMOp = _AFQviEVZ._CrTQJsmX;
_oqtEPzSL.textContent = `筛选完成!共找到 ${_efCJQWlU._kmlcYbyh} 个可用IP。`;
} else {
throw new Error(_AFQviEVZ._huFkLpSQ || '保存结果以生成ID时出错');
}
} catch (_HSaPiVio) {
_oqtEPzSL.textContent = `筛选完成!但生成订阅ID失败。`;
_REQbmyKE(`生成订阅ID失败: ${_HSaPiVio._huFkLpSQ}`, 'error');
}
fetch('/api/cache-live-_YsUzOrSf', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify(_efCJQWlU)
}).catch(_HSaPiVio => console.error("无法缓存实时结果:", _HSaPiVio));
if (_ouleJWZR.cloudStorage._kRWzFOum) {
fetch('/api/save-_waxBKSXV', {
method: 'POST',
_ceQBzYPA: { 'Content-Type': 'application/json' },
_FtuUxCMi: JSON.stringify(_efCJQWlU)
}).then(_eMDbQFqY => {
if (_eMDbQFqY.ok) _REQbmyKE('结果已保存到云端!', 'success');
});
}
} else {
_oqtEPzSL.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _GJubTiNU() {
if (!_ouleJWZR.cloudStorage._kRWzFOum) {
_LqrbrrLM._OqyVifzk.display = 'none';
return;
}
_oqtEPzSL.textContent = '正在获取上次优选结果...';
try {
const _yuRRNMnj = await fetch('/api/get-cached-_waxBKSXV');
if (_yuRRNMnj.ok) {
const _AFQviEVZ = await _yuRRNMnj.json();
if (_AFQviEVZ && _AFQviEVZ._YsUzOrSf && _AFQviEVZ._YsUzOrSf._kmlcYbyh > 0) {
_UjBOrINj(_AFQviEVZ, _NzhtiIRU, true);
} else {
_LqrbrrLM._OqyVifzk.display = 'none';
}
}
} catch (_HSaPiVio) {
console.error("加载缓存失败:", _HSaPiVio);
}
}
let _OXSAGmvv;
function _REQbmyKE(_huFkLpSQ, _MnKvCiLn = 'success', _neQJfQiN = 3000) {
if (_OXSAGmvv) clearTimeout(_OXSAGmvv);
_xiSimPcI.innerHTML = _huFkLpSQ;
let _GBTNrvAY = 'var(--success-_ZBpvxXfo)';
if (_MnKvCiLn === 'error') _GBTNrvAY = 'var(--danger-_ZBpvxXfo)';
if (_MnKvCiLn === 'warning') _GBTNrvAY = 'var(--warning-_ZBpvxXfo)';
if (_MnKvCiLn === 'info') _GBTNrvAY = 'var(--primary-_ZBpvxXfo)';
_xiSimPcI._OqyVifzk.backgroundColor = _GBTNrvAY;
_xiSimPcI.classList.add('show');
_OXSAGmvv = setTimeout(() => { _xiSimPcI.classList.remove('show'); }, _neQJfQiN);
}
let _glTLdULC;
function _NmXbDrmL(_ZBpvxXfo) {
const _EElWFmYQ = document.getElementById('background-_EElWFmYQ');
if (!_EElWFmYQ || !_EElWFmYQ.getContext) return;
_EElWFmYQ._OqyVifzk.display = 'block';
const _WqGMjBmq = _EElWFmYQ.getContext('2d');
let _qlgOlYPl, height, particles;
const _MqomtFir = _MEyodauu(_ZBpvxXfo);
if (!_MqomtFir) return;
const _nJQEWGcU = `${_MqomtFir.r},${_MqomtFir.g},${_MqomtFir.b}`;
const _BQfXDTzY = () => {
if (_glTLdULC) cancelAnimationFrame(_glTLdULC);
_qlgOlYPl = _EElWFmYQ._qlgOlYPl = window.innerWidth;
height = _EElWFmYQ.height = window.innerHeight;
particles = Array.from({ _kmlcYbyh: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _qlgOlYPl, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_mgogxDfy();
};
const _mgogxDfy = () => {
_WqGMjBmq.clearRect(0, 0, _qlgOlYPl, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _qlgOlYPl) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_WqGMjBmq.beginPath();
_WqGMjBmq.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_WqGMjBmq.fillStyle = `rgba(${_nJQEWGcU}, 0.5)`;
_WqGMjBmq.fill();
});
for (let _sNkxdnSw = 0; _sNkxdnSw < particles._kmlcYbyh; _sNkxdnSw++) {
for (let _AAoGgutJ = _sNkxdnSw + 1; _AAoGgutJ < particles._kmlcYbyh; _AAoGgutJ++) {
const _uHbXxqoS = Math.hypot(particles[_sNkxdnSw].x - particles[_AAoGgutJ].x, particles[_sNkxdnSw].y - particles[_AAoGgutJ].y);
if (_uHbXxqoS < 120) {
_WqGMjBmq.beginPath(); _WqGMjBmq.moveTo(particles[_sNkxdnSw].x, particles[_sNkxdnSw].y);
_WqGMjBmq.lineTo(particles[_AAoGgutJ].x, particles[_AAoGgutJ].y);
_WqGMjBmq.strokeStyle = `rgba(${_nJQEWGcU}, ${1 - _uHbXxqoS/120})`;
_WqGMjBmq.stroke();
}
}
}
_glTLdULC = requestAnimationFrame(_mgogxDfy);
};
window.addEventListener('resize', _BQfXDTzY, { passive: true });
_BQfXDTzY();
}
function _rZWJcUpj() {
if (_glTLdULC) cancelAnimationFrame(_glTLdULC);
const _EElWFmYQ = document.getElementById('background-_EElWFmYQ');
if (_EElWFmYQ && _EElWFmYQ.getContext('2d')) {
_EElWFmYQ.getContext('2d').clearRect(0, 0, _EElWFmYQ._qlgOlYPl, _EElWFmYQ.height);
_EElWFmYQ._OqyVifzk.display = 'none';
}
}
function _sCIxfGkh() {
const _bXSXjhWq = document.getElementById('copySubscriptionBtn');
const _uhxjGkyq = document.getElementById('_ebFZDLbq');
const _VJNIIHIZ = document.getElementById('_YGnxjGWr');
const _FBvwAlcK = document.getElementById('closeSubModalBtn');
const _uLICFLoB = _VJNIIHIZ.querySelector('.modal-close-btn');
_bXSXjhWq.addEventListener('click', () => {
if (!_elpmwOwk || _efCJQWlU._kmlcYbyh === 0) {
_REQbmyKE('请先完成优选IP测试', 'warning');
return;
}
if (!_bzHQfMOp) {
_REQbmyKE('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_ouleJWZR._pgRcTGtG) {
_REQbmyKE('管理员未配置Sublink服务地址', 'error');
return;
}
const _BbWTSEmo = 'https://' + window._BsDjLqsH._MOChWbTW + '/' + _bzHQfMOp;
const _GOIWoCyL = {
coreEngine: _BbWTSEmo + 'xr',
coreProfile: _BbWTSEmo + 'si',
configProfile: _BbWTSEmo + 'cl',
policyProfile: _BbWTSEmo + 'su'
};
_uhxjGkyq.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _MnKvCiLn = btn.dataset.subType;
navigator.clipboard.writeText(_GOIWoCyL[_MnKvCiLn]).then(() => {
_REQbmyKE(`${_MnKvCiLn.charAt(0).toUpperCase() + _MnKvCiLn.slice(1)} 订阅链接已复制!`, 'success');
_uhxjGkyq._OqyVifzk.display = 'none';
});
};
});
_uhxjGkyq.querySelectorAll('._YKITnzJZ-btn').forEach(btn => {
btn.onclick = () => {
const _MnKvCiLn = btn.dataset.subType;
const _uqNAXyto = document.getElementById('qrCodeImg');
const _HipkANEK = _GOIWoCyL[_MnKvCiLn];
if (!_HipkANEK) return;
try {
const _YKITnzJZ = qrcode(0, 'M');
_YKITnzJZ.addData(_HipkANEK);
_YKITnzJZ.make();
_uqNAXyto.src = _YKITnzJZ.createDataURL(10, 2);
_VJNIIHIZ._OqyVifzk.display = 'flex';
} catch(_HSaPiVio) {
_REQbmyKE('生成二维码失败', 'error');
console.error(_HSaPiVio);
}
};
});
_uhxjGkyq._OqyVifzk.display = 'flex';
});
_FBvwAlcK.addEventListener('click', () => { _uhxjGkyq._OqyVifzk.display = 'none'; });
_uhxjGkyq.addEventListener('click', (_HSaPiVio) => { if(_HSaPiVio.target === _uhxjGkyq) _uhxjGkyq._OqyVifzk.display = 'none'; });
_VJNIIHIZ.addEventListener('click', (_HSaPiVio) => { if(_HSaPiVio.target === _VJNIIHIZ) _VJNIIHIZ._OqyVifzk.display = 'none'; });
}
function _InbXoZyh() {
const _pZhAWaRH = {
android: [
{ _dokJrbFl: 'Karing', _LlWpfaVc: 'KaringX/karing', _jOfWflAy: ['apk', 'universal-release'] },
{ _dokJrbFl: 'S' + 'ing-Box', _LlWpfaVc: 'SagerNet/sing-box', _jOfWflAy: ['android', 'universal'] },
{ _dokJrbFl: 'V2' + 'rayNG', _LlWpfaVc: '2dust/v2rayNG', _jOfWflAy: ['apk', 'arm64-v8a'] },
{ _dokJrbFl: '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: [
{ _dokJrbFl: 'Karing', fixedUrl: 'https://_tWJotpVn.apple.com/us/_PYvmSxQl/karing/id6472431552?_nBMNUopj=iphone' },
{ _dokJrbFl: 'S' + 'ing-Box', fixedUrl: 'https://_tWJotpVn.apple.com/us/_PYvmSxQl/sing-box-vt/id6673731168' },
{ _dokJrbFl: 'Shadow' + 'rocket', fixedUrl: 'https://_tWJotpVn.apple.com/us/_PYvmSxQl/shadowrocket/id932747118' },
],
windows: [
{ _dokJrbFl: 'Karing', _LlWpfaVc: 'KaringX/karing', _jOfWflAy: ['exe', 'x64-setup'] },
{ _dokJrbFl: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _dokJrbFl: 'C' + 'lashN', _LlWpfaVc: '2dust/clashN', _jOfWflAy: ['clashN.zip'] },
],
mac: [
{ _dokJrbFl: 'Karing', fixedUrl: 'https://_tWJotpVn.apple.com/us/_PYvmSxQl/karing/id6472431552?_nBMNUopj=mac' },
{ _dokJrbFl: 'S' + 'ing-Box', fixedUrl: 'https://_tWJotpVn.apple.com/us/_PYvmSxQl/sing-box-vt/id6673731168' },
]
};
function _yAcEIFyQ(_cLqtLPfd) {
if (_ouleJWZR.streamer._kRWzFOum && (_cLqtLPfd.includes('github.com') || _cLqtLPfd.includes('cdn.jsdelivr.net'))) {
return window._BsDjLqsH.origin + '/' + _cLqtLPfd.replace('://', ':/');
}
return _cLqtLPfd;
}
async function _qHiArPZV(_LlWpfaVc, _jOfWflAy) {
try {
const _yuRRNMnj = await fetch(_yAcEIFyQ(`https://api.github.com/repos/${_LlWpfaVc}/releases/latest`));
if (!_yuRRNMnj.ok) return null;
const _AFQviEVZ = await _yuRRNMnj.json();
for (const _yMhhKqOl of _jOfWflAy) {
const _OHPSCBjD = _AFQviEVZ.assets.find(a => a._dokJrbFl.toLowerCase().includes(_yMhhKqOl.toLowerCase()));
if (_OHPSCBjD) return _OHPSCBjD.browser_download_url;
}
return null;
} catch (_HSaPiVio) { return null; }
}
async function _gPsuFFGQ(_nBMNUopj) {
const _eXGyDnGw = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_nBMNUopj];
_fqXeTSbi.querySelector('#appModalTitle').textContent = `${_eXGyDnGw} 客户端下载`;
const _xmitbfzi = _fqXeTSbi.querySelector('#appModalBody');
_xmitbfzi.innerHTML = '<span>正在获取最新版本...</span>';
_fqXeTSbi._OqyVifzk.display = 'flex';
const _tWJotpVn = _pZhAWaRH[_nBMNUopj];
let _tXaftjHy = '';
for (const _PYvmSxQl of _tWJotpVn) {
let _NXOnzmTR = '';
if (_PYvmSxQl.fixedUrl) {
_NXOnzmTR = `<a href="${_yAcEIFyQ(_PYvmSxQl.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_PYvmSxQl.fixedUrl.split('/').pop()}</a>`;
} else if (_PYvmSxQl._LlWpfaVc) {
const _cLqtLPfd = await _qHiArPZV(_PYvmSxQl._LlWpfaVc, _PYvmSxQl._jOfWflAy);
if (_cLqtLPfd) {
_NXOnzmTR = `<a href="${_yAcEIFyQ(_cLqtLPfd)}" target="_blank" rel="noopener noreferrer">${_cLqtLPfd.split('/').pop()}</a>`;
} else {
_NXOnzmTR = '<span>获取失败,请稍后重试。</span>';
}
}
_tXaftjHy += `<div class="_PYvmSxQl-list-_LDUbjMOK"><span class="_PYvmSxQl-_dokJrbFl">${_PYvmSxQl._dokJrbFl}</span><div class="_PYvmSxQl-links">${_NXOnzmTR}</div></div>`;
}
_xmitbfzi.innerHTML = _tXaftjHy;
}
document.querySelectorAll('._PYvmSxQl-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _gPsuFFGQ(button.dataset._nBMNUopj));
});
_fqXeTSbi.querySelector('.modal-close-btn').addEventListener('click', () => { _fqXeTSbi._OqyVifzk.display = 'none'; });
_fqXeTSbi.addEventListener('click', (_HSaPiVio) => { if (_HSaPiVio.target === _fqXeTSbi) _fqXeTSbi._OqyVifzk.display = 'none'; });
}
function _poDqjErm(_hxzHdEZc, _cZnRbTMN) {
let _sNkxdnSw, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_tXaftjHy");
for (_sNkxdnSw = 0; _sNkxdnSw < tabcontent._kmlcYbyh; _sNkxdnSw++) {
tabcontent[_sNkxdnSw]._OqyVifzk.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_sNkxdnSw = 0; _sNkxdnSw < tablinks._kmlcYbyh; _sNkxdnSw++) {
tablinks[_sNkxdnSw].className = tablinks[_sNkxdnSw].className.replace(" active", "");
}
document.getElementById(_cZnRbTMN)._OqyVifzk.display = "block";
_hxzHdEZc.currentTarget.className += " active";
}
function _fCGcvsBz() {
const _nOfOwkpb = document.createElement('div');
_nOfOwkpb._CrTQJsmX = 'tooltip-popup';
document._FtuUxCMi.appendChild(_nOfOwkpb);
document.addEventListener('click', function(_HSaPiVio) {
const _DCiNUbcI = _HSaPiVio.target.closest('.tooltip-_DCiNUbcI');
if (_DCiNUbcI) {
const _HipkANEK = _DCiNUbcI.dataset.tooltip;
_nOfOwkpb.textContent = _HipkANEK;
const _xBDMywRL = _DCiNUbcI.getBoundingClientRect();
_nOfOwkpb._OqyVifzk.display = 'block';
let _WYYOsWES = _xBDMywRL.bottom + window.scrollY + 5;
let _bmkLhxRx = _xBDMywRL._bmkLhxRx + window.scrollX;
_nOfOwkpb._OqyVifzk._WYYOsWES = `${_WYYOsWES}px`;
_nOfOwkpb._OqyVifzk._bmkLhxRx = `${_bmkLhxRx}px`;
const _DOfMIMRA = _nOfOwkpb.getBoundingClientRect();
if (_DOfMIMRA.right > window.innerWidth - 10) {
_bmkLhxRx = window.innerWidth - _DOfMIMRA._qlgOlYPl - 10;
}
if (_DOfMIMRA.bottom > window.innerHeight - 10) {
_WYYOsWES = _xBDMywRL._WYYOsWES + window.scrollY - _DOfMIMRA.height - 5;
}
_nOfOwkpb._OqyVifzk._WYYOsWES = `${_WYYOsWES}px`;
_nOfOwkpb._OqyVifzk._bmkLhxRx = `${_bmkLhxRx}px`;
_HSaPiVio.stopPropagation();
} else if (_nOfOwkpb._OqyVifzk.display === 'block') {
_nOfOwkpb._OqyVifzk.display = 'none';
}
});
}
const _OqyVifzk = document.createElement('_OqyVifzk');
_OqyVifzk.textContent = `
.tab-button { background-_ZBpvxXfo: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _ZBpvxXfo: var(--_HipkANEK-light); font-size: 1em; }
.tab-button:hover { background-_ZBpvxXfo: var(--border-_ZBpvxXfo); }
.tab-button.active { _ZBpvxXfo: var(--primary-_ZBpvxXfo); border-bottom: 2px solid var(--primary-_ZBpvxXfo); }
.tab-_tXaftjHy { display: none; padding-_WYYOsWES: 1rem; }
`;
document.head.appendChild(_OqyVifzk);
window.addEventListener('DOMContentLoaded', _vBnnkPsX);
</script>
</_FtuUxCMi></html>
`;
}