'use strict';const fetchRetry=require('./chunks/fetch-retry.D06uBUaW.cjs'),fetchTextByLine=require('./chunks/fetch-text-by-line.YY5b5610.cjs'),normalizeDomain=require('./chunks/normalize-domain.Cfz4j8eP.cjs'),trie=require('./chunks/trie.Vu1FNyv-.cjs'),require$$3$1=require('csv-parse/sync'),require$$0=require('node:path'),require$$3=require('foxts/retrie');require('picocolors'),require('undici'),require('undici-cache-store-better-sqlite3'),require('node:util'),require('node:fs'),require('node:process'),require('node:readline'),require('node:stream/web'),require('foxts/guard'),require('tldts'),require('./chunks/loose-tldts-opt.DLUpGXpj.cjs'),require('foxts/is-probably-ip'),require('./chunks/misc.BpcQjda1.cjs'),require('node:fs/promises'),require('foxts/noop'),require('foxts/fast-string-array-join'),require('foxts/bitwise');var validateGfwlist$1 = {exports: {}};var hasRequiredValidateGfwlist; function requireValidateGfwlist () { if (hasRequiredValidateGfwlist) return validateGfwlist$1.exports; hasRequiredValidateGfwlist = 1; (function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "parseGfwList", { enumerable: true, get: function() { return parseGfwList; } }); const _processline = /*@__PURE__*/ fetchTextByLine.r(); const _normalizedomain = /*@__PURE__*/ normalizeDomain.r(); const _trie = /*@__PURE__*/ trie.r(); const _sync = require$$3$1; const _fetchtextbyline = /*@__PURE__*/ fetchTextByLine.a(); const _nodepath = /*#__PURE__*/ _interop_require_default(require$$0); const _dir = /*@__PURE__*/ fetchRetry.a(); const _retrie = require$$3; const _fetchretry = /*@__PURE__*/ fetchRetry.r(); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function parseGfwList() { const whiteSet = new Set(); const trie = new _trie.HostnameSmolTrie(); const excludeGfwList = (0, _retrie.createRetrieKeywordFilter)([ '.*', '*', '=', '[', '/', '?' ]); const text = await (await (0, _fetchretry.$$fetch)('https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt')).text(); for (const l of atob(text).split('\n')){ const line = (0, _processline.processLine)(l); if (!line) continue; if (excludeGfwList(line)) { continue; } if (line.startsWith('@@||')) { whiteSet.add('.' + line.slice(4)); continue; } if (line.startsWith('@@|http://')) { whiteSet.add(line.slice(10)); continue; } if (line.startsWith('@@|https://')) { whiteSet.add(line.slice(11)); continue; } if (line.startsWith('||')) { trie.add('.' + line.slice(2)); continue; } if (line.startsWith('|')) { trie.add(line.slice(1)); continue; } if (line.startsWith('.')) { trie.add(line); continue; } const d = (0, _normalizedomain.fastNormalizeDomain)(line); if (d) { trie.add(d); continue; } } for (const l of (await (await (0, _fetchretry.$$fetch)('https://raw.githubusercontent.com/Loyalsoldier/cn-blocked-domain/release/domains.txt')).text()).split('\n')){ trie.add(l); } const res = await (await (0, _fetchretry.$$fetch)('https://litter.catbox.moe/sqmgyn.csv', { headers: { accept: '*/*', 'user-agent': 'curl/8.9.1' } })).text(); const topDomains = (0, _sync.parse)(res); const keywordSet = new Set(); const runAgainstRuleset = async (ruleset)=>{ for await (const l of (0, _fetchtextbyline.readFileByLine)(ruleset)){ const line = (0, _processline.processLine)(l); if (!line) continue; const [type, domain] = line.split(','); switch(type){ case 'DOMAIN-SUFFIX': { trie.whitelist('.' + domain); break; } case 'DOMAIN': { trie.whitelist(domain); break; } case 'DOMAIN-KEYWORD': { keywordSet.add(domain); break; } } } }; const runAgainstDomainset = async (ruleset)=>{ for await (const l of (0, _fetchtextbyline.readFileByLine)(ruleset)){ const line = (0, _processline.processLine)(l); if (!line) continue; trie.whitelist(line); } }; await Promise.all([ runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/global.conf')), runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/reject.conf')), runAgainstRuleset(_nodepath.default.join(_dir.OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')), runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/stream.conf')), runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/ai.conf')), runAgainstRuleset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf')), runAgainstDomainset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'domainset/reject.conf')), runAgainstDomainset(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'domainset/cdn.conf')) ]); whiteSet.forEach((domain)=>trie.whitelist(domain)); const kwfilter = (0, _retrie.createRetrieKeywordFilter)([ ...keywordSet ]); const missingTop10000Gfwed = new Set(); console.log(trie.has('.mojim.com')); for await (const [domain] of topDomains){ if (trie.has(domain) && !kwfilter(domain)) { missingTop10000Gfwed.add(domain); } } console.log(JSON.stringify(Array.from(missingTop10000Gfwed), null, 2)); return [ whiteSet, trie, missingTop10000Gfwed ]; } if (require.main === module) { parseGfwList().catch(console.error); } } (validateGfwlist$1, validateGfwlist$1.exports)); return validateGfwlist$1.exports; }var validateGfwlistExports = requireValidateGfwlist(); const validateGfwlist = /*@__PURE__*/fetchRetry.g(validateGfwlistExports);module.exports=validateGfwlist;