@riavzon/shield-base 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -92,8 +92,10 @@ import {
92
92
  getGeoDatas,
93
93
  getListOfProxies,
94
94
  getThreatLists,
95
- getTorLists
96
- } from './scripts/index.js';
95
+ getTorLists,
96
+ restartData,
97
+ run
98
+ } from '@riavzon/shield-base"';
97
99
  const contactInfo = `<name> [url] - <email>`
98
100
 
99
101
  const mmdbPath = 'path to mmdbctl binary'
@@ -116,6 +118,12 @@ const results = await Promise.allSettled([
116
118
  getListOfProxies(outputDirectory, mmdbPath),
117
119
  getThreatLists(outputDirectory, mmdbPath, selectedSources)
118
120
  ]);
121
+ const restartAllData = true;
122
+
123
+ const restart = restartData(outputDirectory, restartAllData)
124
+
125
+ // A utility to run shell commands
126
+ await run('ls')
119
127
  ```
120
128
 
121
129
  ### Flag Based
@@ -393,4 +401,4 @@ Output:
393
401
 
394
402
  ---
395
403
 
396
- MIT License
404
+ MIT License
@@ -0,0 +1,45 @@
1
+ import {createRegExp,exactly,oneOrMore,digit,charNotIn,anyOf}from'magic-regexp';import*as G from'fs';import G__default,{existsSync}from'fs';import bt from'child_process';import wt from'util';import*as j from'path';import j__default from'path';import O,{consola}from'consola';import {fileURLToPath}from'url';import at from'ipaddr.js';import kt from'os';import {readFile}from'fs/promises';var _t=wt.promisify(bt.exec),v=async(o,S={})=>{try{let{stdout:a,stderr:e}=await _t(o,{...S,maxBuffer:S.maxBuffer??10485760}),i={stdout:typeof a=="string"?a.trim():a,stderr:typeof e=="string"?e.trim():e};return console.log(`[run]: ${o}`),i.stdout&&console.log("stdout:",i.stdout),i.stderr&&console.error("stderr:",i.stderr),i}catch(a){if(console.error(`Execution failed for command: "${o}"`),typeof a=="object"&&a!==null){let e=a;e.stderr&&console.error("Error Output:",e.stderr);}throw a}};async function Q(o,S,a){let e=["https://bgp.tools/asns.csv","https://bgp.tools/table.jsonl"],i=j__default.resolve(S,"asn.mmdb"),n=j__default.resolve(S,"temp_asn_data.json");try{consola.info(`
2
+ [ASN/BGP] Fetching ASN Dictionary from BGP.tools...`);let l=await(await fetch(e[0],{method:"GET",headers:{"User-Agent":o}})).text(),r=new Map,R=l.split(`
3
+ `).slice(1),y=createRegExp(exactly("AS").and(oneOrMore(digit).groupedAs("asnNumber"))),t=charNotIn('"').times.any(),h=t.and(exactly('"')).times(2),b=createRegExp(exactly(",").before(h.times.any().and(t).at.lineEnd()));for(let x of R){if(!x)continue;let w=x.split(b),C=w[0].match(y),d=C?.groups.asnNumber?parseInt(C.groups.asnNumber,10):null,_=createRegExp(exactly('"').at.lineStart().or(exactly('"').at.lineEnd()),["g"]),N=w[1]?.replace(_,"").trim()||"Unknown",m=w[2]?.trim()||"Unknown";d!==null&&r.set(d,{name:N,type:m});}consola.success(`[ASN/BGP] SUCCESS: Loaded ${String(r.size)} ASN definitions.`),consola.info("[ASN/BGP] Fetching Routing Table...");let g=await(await fetch(e[1],{method:"GET",headers:{"User-Agent":o}})).text();consola.info("[ASN/BGP] Mapping CIDR to ASN data...");let T=g.split(`
4
+ `),f=[];for(let x of T){if(!x)continue;let w=JSON.parse(x);if(w.Hits<10)continue;let C=r.get(w.ASN)??{name:"Unknown",type:"Unknown"},d={range:w.CIDR,asn_id:String(w.ASN),asn_name:C.name,classification:C.type,hits:String(w.Hits)};f.push(JSON.stringify(d));}f.length>0&&consola.log("[ASN/BGP] SAMPLE:",f[0]),consola.info(`[ASN/BGP] Writing ${String(f.length)} enriched entries to temporary JSON...`),G.writeFileSync(n,f.join(`
5
+ `),"utf-8"),consola.info(`[ASN/BGP] Compiling MMDB with mmdbctl to ${i}...`);let u=`${a} import --in ${n} --out ${i}`,s=await v(u);s.stdout&&consola.log(`[ASN/BGP] mmdbctl: ${s.stdout.toString().trim()}`),consola.success(`[ASN/BGP] COMPLETED: Successfully compiled ASN MMDB to ${i}
6
+ `);}catch(c){consola.error(`
7
+ [ASN/BGP] ERROR during processing:`,c),process.exit(1);}finally{G.existsSync(n)&&G.unlinkSync(n);}}var it=j.dirname(fileURLToPath(import.meta.url)),$t=[j.resolve(it,"./countries+states+cities.json"),j.resolve(it,"../../public/countries+states+cities.json")].find(o=>G.existsSync(o))??j.resolve(it,"./countries+states+cities.json");async function Z(o,S){consola.info(`
8
+ [CITY/GEO] Building global geographic index from hierarchical database...`);let a=j.resolve(o,"city.mmdb"),e=j.resolve(o,"temp_city_data.json"),i=G.readFileSync($t,"utf8"),n=JSON.parse(i),c=new Map;for(let l of n){let r=new Map;if(l.states)for(let R of l.states){let y=new Map;if(R.cities)for(let t of R.cities)y.set(t.name.toLowerCase(),t);r.set(R.state_code,{meta:R,cities:y});}c.set(l.iso2.toUpperCase(),{meta:l,states:r});}try{consola.info("[CITY/GEO] Fetching validated geofeed CSV...");let R=(await(await fetch("https://geolocatemuch.com/geofeeds/validated-all.csv")).text()).split(`
9
+ `),y=createRegExp(exactly("#").at.lineStart());consola.success(`[CITY/GEO] SUCCESS: Received ${String(R.length)} IP ranges. Mapping to geographic index...`);let t=[];for(let p of R){if(!p.trim()||y.test(p))continue;let g=p.split(","),T=g[0]?.trim()||"",f=g[1]?.trim()||"",u=g[2]?.trim()||"",s=g[3]?.trim()||"",x=g[4]?.trim()||"";if(!f&&!s&&!x)continue;let w=f.toUpperCase()||"",C="",d="",_="",N="",m={},I=c.get(w);if(I){if(m=I.meta,C=I.meta.emoji||"",u){let J=u.includes("-")?u.split("-").pop():u,E=I.states.get(J);if(E){if(N=E.meta.name||E.meta.state_code||"",s){let nt=E.cities.get(s.toLowerCase());nt&&(d=nt.latitude||"",_=nt.longitude||"");}!d&&E.meta.latitude&&E.meta.longitude&&(d=E.meta.latitude||"",_=E.meta.longitude||"");}}if(!d&&s)for(let[,J]of I.states){let E=J.cities.get(s.toLowerCase());if(E){d=E.latitude||"",_=E.longitude||"",N||(N=J.meta.name||J.meta.state_code||"");break}}!d&&m.latitude&&m.longitude&&(d=m.latitude||"",_=m.longitude||"");}let Ot={range:T,country_code:f,region:u||(m.region??""),subregion:m.subregion??"",city:s,zip_code:x,latitude:d,longitude:_,state:N,name:m.name??"Unknown",native:m.native??"",phone:m.phonecode??"",numericCode:m.numeric_code??"",continent:m.region??"",capital:m.capital??"",currency:m.currency??"",currency_name:m.currency_name??"",languages:m.translations?Object.values(m.translations)[0]??"":"",emoji:C,timezone:m.timezones?.[0]?.zoneName??"",utc_offset:m.timezones?.[0]?.gmtOffsetName??"",timeZoneName:m.timezones?.[0]?.tzName??"",tld:m.tld??"",nationality:m.nationality??""};t.push(JSON.stringify(Ot));}consola.info(`[CITY/GEO] Writing ${String(t.length)} enriched entries to temporary JSON...`),G.writeFileSync(e,t.join(`
10
+ `),"utf-8"),consola.start("[CITY/GEO] Compiling MMDB with mmdbctl...");let h=`${S} import --in ${e} --out ${a}`,b=await v(h);b.stdout&&consola.log(`[CITY/GEO] mmdbctl: ${b.stdout.toString().trim()}`),consola.success(`[CITY/GEO] COMPLETED: Successfully compiled City MMDB to ${a}
11
+ `);}catch(l){consola.error(`
12
+ [CITY/GEO] ERROR during processing:`,l),process.exit(1);}finally{G.existsSync(e)&&G.unlinkSync(e);}}async function V(o,S){let a="https://onionoo.torproject.org/details",e=j__default.resolve(o,"tor.mmdb"),i=j__default.resolve(o,"temp_tor_nodes.json");try{O.info(`
13
+ [TOR] Fetching node data from Onionoo API...`);let n=await fetch(a,{method:"GET",headers:{"Accept-Encoding":"gzip",Accept:"application/json"}});if(!n.ok){O.error(`[TOR] ERROR: API fetch failed with status ${String(n.status)}`);return}let c=await n.json();O.success("[TOR] SUCCESS: Data received, mapping relay nodes...");let r=(c.relays||[]).filter(t=>{let h=t.flags?.map(b=>b.toLowerCase())??[];return h.includes("exit")||h.includes("valid")||h.includes("running")||h.includes("stable")||h.includes("hsdir")&&t.exit_addresses&&t.or_addresses});if(r.length===0){O.warn("[TOR] WARNING: No relay nodes found matching criteria.");return}let R=[];for(let t of r){let h=[...t.exit_addresses??[],...t.or_addresses??[]];if(h)for(let b of h){let p=b;p.startsWith("[")?p=p.split("]:")[0].substring(1):p=p.split(":")[0];let g=at.parse(p),T;if(g.kind()==="ipv4"){let f=g;T=`${at.IPv4.networkAddressFromCIDR(`${f.toString()}/24`).toString()}/24`;}else if(g.kind()==="ipv6"){let f=g;T=`${at.IPv6.networkAddressFromCIDR(`${f.toString()}/64`).toString()}/64`;}else continue;R.push({range:T,or_addresses:t.or_addresses?.join(",")??"",exit_addresses:t.exit_addresses?.join(",")??"",last_seen:t.last_seen??"",last_changed_address_or_port:t.last_changed_address_or_port??"",first_seen:t.first_seen??"",running:t.running??!1,flags:t.flags?.join(",")??"",country:t.country??"",country_name:t.country_name??"",as:t.as??"",as_name:t.as_name??"",last_restarted:t.last_restarted??"",exit_policy:t.exit_policy?.join(",")??"",exit_policy_summary:JSON.stringify(t.exit_policy_summary)||"",exit_policy_v6_summary:t.exit_policy_v6_summary?JSON.stringify(t.exit_policy_v6_summary):void 0,contact:t.contact??"Unknown",version_status:t.version_status??"",guard_probability:t.guard_probability??0,middle_probability:t.middle_probability??0,exit_probability:t.exit_probability??0,recommended_version:t.recommended_version??!1,measured:t.measured??!1});}}O.info("[TOR] SAMPLE:",R[0]);let y=R.map(t=>JSON.stringify(t)).join(`
14
+ `);G.writeFileSync(i,y,"utf-8");try{O.info("[TOR] Compiling MMDB with mmdbctl...");let t=await v(`${S} import -j -i ${i} -o ${e}`);t.stdout&&O.info(`[TOR] mmdbctl: ${t.stdout.toString().trim()}`),O.success(`[TOR] COMPLETED: Successfully compiled Tor MMDB to ${e}
15
+ `);}catch(t){O.error("[TOR] ERROR: MMDB compilation failed:",t);return}}catch(n){O.error("[TOR] ERROR: Unexpected failure while fetching node list:",n);return}finally{G.existsSync(i)&&G.unlinkSync(i);}}var ct=j.dirname(fileURLToPath(import.meta.url)),Gt=[j.resolve(ct,"./countries+states+cities.json"),j.resolve(ct,"../../public/countries+states+cities.json")].find(o=>G.existsSync(o))??j.resolve(ct,"./countries+states+cities.json");async function K(o,S){O.info(`
16
+ [GEO/COUNTRY] Building country index from local database...`);let a=j.resolve(o,"country.mmdb"),e=j.resolve(o,"temp_country_data.json"),i=G.readFileSync(Gt,"utf8"),n=JSON.parse(i),c=new Map;for(let r of n)c.set(r.iso2.toUpperCase(),r);O.info("[GEO/COUNTRY] Fetching global IPv4 Country mapping from Sapics...");let l="https://raw.githubusercontent.com/sapics/ip-location-db/refs/heads/main/geo-asn-country/geo-asn-country-ipv4.csv";try{let r=await fetch(l);if(!r.ok)throw new Error(`[GEO/COUNTRY] ERROR: Failed to fetch country data: ${r.statusText}`);let y=(await r.text()).split(`
17
+ `);O.success(`[GEO/COUNTRY] SUCCESS: Received ${String(y.length)} global IP ranges. Enriching data...`);let t=[];for(let p of y){if(!p.trim())continue;let g=p.split(","),T=g[0]?.trim(),f=g[1]?.trim(),u=g[2]?.trim().toUpperCase();if(!T||!f||!u)continue;let s=c.get(u),x={range:`${T}-${f}`,country_code:u,region:s?.region??"",numericCode:s?.numeric_code??"",name:s?.name??"",native:s?.native??"",phone:s?.phonecode??"",capital:s?.capital??"",currency:s?.currency??"",currency_name:s?.currency_name??"",currency_symbol:s?.currency_symbol??"",languages:s?.translations?Object.values(s.translations)[0]??"":"",emoji:s?.emoji??"",timezone:s?.timezones?.[0]?.zoneName??"",utc_offset:s?.timezones?.[0]?.gmtOffsetName??"",timeZoneName:s?.timezones?.[0]?.tzName??"",tld:s?.tld??"",nationality:s?.nationality??"",subregion:s?.subregion??""};t.push(JSON.stringify(x));}O.info(`[GEO/COUNTRY] Writing ${String(t.length)} enriched entries to temporary JSON...`),G.writeFileSync(e,t.join(`
18
+ `),"utf-8"),O.start("[GEO/COUNTRY] Compiling MMDB with mmdbctl...");let h=`${S} import --in ${e} --out ${a}`,b=await v(h);b.stdout&&O.log(`[GEO/COUNTRY] mmdbctl: ${b.stdout.toString().trim()}`),O.success(`[GEO/COUNTRY] COMPLETED: Successfully compiled Country MMDB to ${a}
19
+ `);}catch(r){O.error(`
20
+ [GEO/COUNTRY] ERROR during processing:`,r),process.exit(1);}finally{G.existsSync(e)&&G.unlinkSync(e);}}async function et(o,S){O.log(`
21
+ [PROXY] Fetching initial Proxy list from Awesome-lists...`);let a=j__default.resolve(o,"proxy.mmdb"),e=j__default.resolve(o,"temp_proxy_data.json"),i=new Set,n=[],c=["https://raw.githubusercontent.com/mthcht/awesome-lists/refs/heads/main/Lists/PROXY/ALL_PROXY_Lists.csv","https://raw.githubusercontent.com/firehol/blocklist-ipsets/refs/heads/master/firehol_proxies.netset"],l=createRegExp(exactly(oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit)).and(exactly("/",oneOrMore(digit)).optionally()).at.lineStart().at.lineEnd());try{let r=await fetch(c[0]);if(!r.ok)throw new Error(`[PROXY] ERROR: Failed to fetch awesome list: ${r.statusText}`);let y=(await r.text()).split(`
22
+ `).slice(1),t=charNotIn('"').times.any(),h=t.and(exactly('"')).times(2),b=createRegExp(exactly(",").before(h.times.any().and(t).at.lineEnd())),p=createRegExp(anyOf(exactly("PROXY_ALL_"),exactly("_list.csv"),exactly('"')),["g","i"]);for(let C of y){if(!C.trim())continue;let[d,_,N]=C.split(b);if(!d||!l.test(d)||i.has(d))continue;i.add(d);let m=N.replace(p,"").trim(),I={range:`${d}/32`,port:_,comment:m};n.push(JSON.stringify(I));}O.success(`[PROXY] SUCCESS: Finished Awesome-list. Discovered ${String(n.length)} unique IPs.`),O.log("[PROXY] Fetching secondary data from FireHOL proxy list...");let g=await fetch(c[1]);if(!g.ok)throw new Error(`[PROXY] ERROR: Failed to fetch FireHOL list: ${g.statusText}`);let f=(await g.text()).split(`
23
+ `),u=createRegExp(exactly("#").at.lineStart()),s=0;for(let C of f){let d=C.trim();if(!d||u.test(d))continue;let _=d;if(!l.test(_)||i.has(_))continue;i.add(_);let N={range:_,port:"unknown",comment:"Ip from Firehol"};n.push(JSON.stringify(N)),s++;}O.success(`[PROXY] SUCCESS: Finished FireHOL. Added ${String(s)} NEW unique proxies. Total unique: ${String(n.length)}`),n.length>0&&O.log("[PROXY] SAMPLE:",n[0]),O.log(`[PROXY] Writing ${String(n.length)} unique proxies to temporary JSON...`),G__default.writeFileSync(e,n.join(`
24
+ `),"utf-8"),O.log("[PROXY] Compiling MMDB with mmdbctl...");let x=`${S} import --in ${e} --out ${a}`,w=await v(x);w.stdout&&O.log(`[PROXY] mmdbctl: ${w.stdout.toString().trim()}`),O.success(`[PROXY] COMPLETED: Successfully compiled Proxy MMDB to ${a}
25
+ `);}catch(r){O.error(`
26
+ [PROXY] ERROR during processing:`,r),process.exit(1);}finally{G__default.existsSync(e)&&G__default.unlinkSync(e);}}var ht={firehol_anonymous:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_anonymous.netset",firehol_l1:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level1.netset",firehol_l2:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level2.netset",firehol_l3:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level3.netset",firehol_l4:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level4.netset"};async function ot(o,S,a){let e=" Maintainer: http://iplists.firehol.org/",i=createRegExp(exactly(oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit)).and(exactly("/",oneOrMore(digit)).optionally()).at.lineStart().at.lineEnd()),n=createRegExp(exactly("#").at.lineStart()),c=[];if(Array.isArray(a)?c=Object.entries(ht).filter(([l])=>a.includes(l)).map(([l,r])=>({id:l,url:r})):a&&(c=Object.entries(ht).map(([l,r])=>({id:l,url:r}))),c.length===0){O.info("No valid FireHOL data sources selected. Skipping.");return}try{O.start(`Initializing fetch for ${String(c.length)} FireHOL stream(s)...`);let l=c.map(async y=>{let t=await fetch(y.url);return {id:y.id,res:t}}),r=await Promise.allSettled(l);O.success(`[THREATS] SUCCESS: Fetched ${String(r.length)} data streams from FireHOL.`);let R=0;for(let y of r){if(y.status==="rejected"){O.error("Promise rejected:",y.reason);continue}let{id:t,res:h}=y.value,b=`${t} ${e}`,p=[];if(O.info(`[THREATS] Processing stream: ${t}...`),!h.ok){O.error(`Failed fetching ${t}: ${h.statusText}`);continue}let T=(await h.text()).split(`
27
+ `);for(let f of T){let u=f.trim();if(!u||n.test(u))continue;let s=u;if(!i.test(s))continue;let x={range:s,comment:b};R++,p.push(JSON.stringify(x));}if(O.info(`[THREATS] ${t} summary:`),O.info(` -> IPs Discovered: ${String(p.length)}`),O.info(` -> Rolling Total: ${String(R)}`),p.length>0){O.info(`[THREATS] SAMPLE: ${p[0]}`),O.info(`[THREATS] Writing entries to temporary JSON: temp_${t}.json`);let f=j__default.resolve(o,`temp_${t}.json`),u=j__default.resolve(o,`${t}.mmdb`);G__default.writeFileSync(f,p.join(`
28
+ `),"utf-8"),console.log(`[THREATS] Compiling MMDB with mmdbctl to ${u}...`);let s=`${S} import --in ${f} --out ${u}`,x=await v(s);x.stdout&&O.box(`[THREATS] mmdbctl: ${x.stdout.toString().trim()}`),G__default.existsSync(f)&&G__default.unlinkSync(f),O.success(`[THREATS] SUCCESS: Compiled ${t}.mmdb
29
+ `);}else O.warn(`[THREATS] WARNING: No valid IPs found for ${t}. Skipping.
30
+ `);}O.success(`[THREATS] COMPLETED: All threat intelligence sources processed successfully.
31
+ `);}catch(l){O.error(`
32
+ [THREATS] FATAL ERROR during processing:`,l),process.exit(1);}}async function Rt(o,S,a,e){O.box(`
33
+ =========================================
34
+ === Starting data generation pipeline ===
35
+ =========================================
36
+ `);let i=j__default.resolve(o,"threats-lists");G__default.existsSync(i)||G__default.mkdirSync(i,{recursive:true});try{(await Promise.allSettled([Q(S,o,e),Z(o,e),V(o,e),K(o,e),et(o,e),ot(o,e,a)])).forEach((c,l)=>{c.status==="rejected"&&O.error(`Script cluster [${String(l)}] failed:`,String(c.reason));}),O.info(`
37
+ ====================================
38
+ Pipeline execution finished.
39
+ ====================================
40
+ `);}catch(n){O.error(`
41
+ ====================================
42
+ Fatal error in pipeline: ${String(n)}
43
+ ====================================
44
+ `);}}var xt=j__default.join(kt.homedir(),".shield-base",".cache.json");async function Le(o,S){existsSync(xt)||(O.error("No cache found. Cannot restart. Please run a standard compilation first."),process.exit(1));let a=await readFile(xt,"utf-8"),e=JSON.parse(a);if(!e.selectedDataTypes||e.selectedDataTypes.length===0){O.warn("Cache is empty. No data sources to restart.");return}if(S){O.info("Restarting ALL data sources..."),await Rt(o,e.useragent,true,e.mmdbctlPath),O.success("\u2728 All data successfully refreshed!");return}O.info(`Restarting data compilation from cache: ${e.selectedDataTypes.join(", ")}`);let i=e.selectedDataTypes.filter(c=>c.startsWith("firehol_")||c==="anonymous"),n=e.selectedDataTypes.filter(c=>!c.startsWith("firehol_")&&c!=="anonymous");n.includes("BGP")&&await Q(e.useragent||"",o,e.mmdbctlPath),n.includes("City")&&await Z(o,e.mmdbctlPath),n.includes("Geography")&&await K(o,e.mmdbctlPath),n.includes("Proxy")&&await et(o,e.mmdbctlPath),n.includes("Tor")&&await V(o,e.mmdbctlPath),i.length>0&&await ot(o,e.mmdbctlPath,i),O.success("\u2728 Cached data successfully refreshed!");}export{v as a,Q as b,Z as c,V as d,K as e,et as f,ot as g,Rt as h,Le as i};//# sourceMappingURL=chunk-IXNJSTI7.js.map
45
+ //# sourceMappingURL=chunk-IXNJSTI7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/run.ts","../src/scripts/bgp.ts","../src/scripts/city.ts","../src/scripts/tor.ts","../src/scripts/geo.ts","../src/scripts/proxy.ts","../src/scripts/threats.ts","../src/scripts/executeAll.ts","../src/utils/restart.ts"],"names":["execAsync","util","child","run","command","options","stdout","stderr","result","error","getBGPAndASN","userAgent","outputPath","mmdbPath","urls","output","path","tempASNJson","consola","rawAsnCsv","asnDictionary","asnLines","regex","createRegExp","exactly","oneOrMore","digit","nonQuotes","charNotIn","quotePair","splitRegex","line","parts","match","asnNumber","quoteStripRegex","asnName","asnClass","rawTable","routes","results","route","parsed","dictionaryLookup","record","B","cmd","convert","currentDir","fileURLToPath","dbPath","p","buildCitiesData","tempGeoJson","rawData","dbJson","countryIndex","country","stateMap","state","cityMap","city","lines","commentRegex","prefix","region","zip","cc","emoji","lat","lon","stateName","countryMeta","countryData","regionCode","stateData","cityData","geoRecord","getTorLists","url","tempFileName","response","data","toMap","flags","fl","f","node","ipsToProcess","ip","cleanIp","parsedIp","ipaddr","finalNetworkAddress","ipv4","ipv6","ndjsonOutput","U","k","D","getGeoDatas","res","start","end","getListOfProxies","tempProxyJson","seenIps","ipv4Regex","resAwesome","splitAwesomeListRegex","stripAwesomeListRegex","anyOf","dest_ip","dest_port","metadata_comment","cleanComment","resFirehol","fireholLines","fireholCount","trimmed","fs","THREAT_CONFIG","getThreatLists","selectedSources","maintainerUrl","tasks","id","promises","task","resultsSettled","ipsCount","finalMsg","jsonName","generateData","threatsPath","index","cacheOutput","os","restartData","all","existsSync","cachedFile","readFile","cache","fireholSources","s","standardSources"],"mappings":"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","file":"chunk-IXNJSTI7.js","sourcesContent":["import child from 'node:child_process';\nimport util from 'node:util';\nimport type { ExecOptions } from 'node:child_process';\n\nexport interface RunResult {\n stdout: string | Buffer;\n stderr: string | Buffer;\n}\n\nconst execAsync = util.promisify(child.exec);\n\nexport const run = async (command: string, options: ExecOptions = {}): Promise<RunResult> => {\n try {\n const { stdout, stderr } = await execAsync(command, {\n ...options,\n maxBuffer: options.maxBuffer ?? 1024 * 1024 * 10, \n });\n\n const result: RunResult = {\n stdout: typeof stdout === 'string' ? stdout.trim() : stdout,\n stderr: typeof stderr === 'string' ? stderr.trim() : stderr,\n };\n\n console.log(`[run]: ${command}`);\n if (result.stdout) console.log('stdout:', result.stdout);\n if (result.stderr) console.error('stderr:', result.stderr);\n\n return result;\n } catch (error: unknown) {\n console.error(`Execution failed for command: \"${command}\"`);\n \n if (typeof error === 'object' && error !== null) {\n const e = error as { stderr?: string; stdout?: string };\n if (e.stderr) console.error('Error Output:', e.stderr);\n }\n \n throw error;\n }\n};","import { createRegExp, exactly, digit, oneOrMore, charNotIn } from \"magic-regexp\";\nimport * as fs from 'fs';\nimport { run } from \"../utils/run.js\";\nimport path from \"path\";\nimport { AsnDictionaryEntry, BGPRouteRaw, BgpRecord } from \"../types/bgp.js\";\nimport { consola } from \"consola\";\n\n\nexport async function getBGPAndASN(userAgent: string, outputPath: string, mmdbPath: string) {\n const urls = ['https://bgp.tools/asns.csv', 'https://bgp.tools/table.jsonl'];\n const output = path.resolve(outputPath, 'asn.mmdb');\n const tempASNJson = path.resolve(outputPath, 'temp_asn_data.json');\n try {\n consola.info(\"\\n[ASN/BGP] Fetching ASN Dictionary from BGP.tools...\");\n const ansRes = await fetch(urls[0], {\n method: 'GET',\n headers: {\n 'User-Agent': userAgent\n }\n });\n\n // AS1,\"Level 3 Parent, LLC\",Unknown\n // AS10,CSNET Coordination and Information Center,Unknown\n\n const rawAsnCsv = await ansRes.text();\n const asnDictionary = new Map<number, AsnDictionaryEntry>();\n const asnLines = rawAsnCsv.split('\\n').slice(1);\n \n const regex = createRegExp(exactly('AS').and(oneOrMore(digit).groupedAs('asnNumber')));\n \n const nonQuotes = charNotIn('\"').times.any();\n const quotePair = nonQuotes.and(exactly('\"')).times(2);\n const splitRegex = createRegExp(\n exactly(',').before(quotePair.times.any().and(nonQuotes).at.lineEnd())\n );\n\n for (const line of asnLines) {\n if (!line) continue;\n const parts = line.split(splitRegex);\n\n const match = parts[0].match(regex);\n const asnNumber = match?.groups.asnNumber ? parseInt(match.groups.asnNumber, 10) : null;\n \n const quoteStripRegex = createRegExp(exactly('\"').at.lineStart().or(exactly('\"').at.lineEnd()), ['g']);\n const asnName = parts[1]?.replace(quoteStripRegex, '').trim() || 'Unknown';\n const asnClass = parts[2]?.trim() || 'Unknown';\n \n if (asnNumber !== null) {\n asnDictionary.set(asnNumber, { name: asnName, type: asnClass });\n }\n }\n consola.success(`[ASN/BGP] SUCCESS: Loaded ${String(asnDictionary.size)} ASN definitions.`);\n consola.info(\"[ASN/BGP] Fetching Routing Table...\");\n const tableRes = await fetch(urls[1], {\n method: 'GET',\n headers: {\n 'User-Agent': userAgent\n }\n });\n\n const rawTable = await tableRes.text();\n consola.info(\"[ASN/BGP] Mapping CIDR to ASN data...\");\n const routes = rawTable.split('\\n');\n const results = [];\n\n for (const route of routes) {\n if (!route) continue;\n // {\"CIDR\":\"1.1.1.0/24\",\"ASN\":13335,\"Hits\":509}\n const parsed = JSON.parse(route) as BGPRouteRaw;\n if (parsed.Hits < 10) continue; \n \n const dictionaryLookup = asnDictionary.get(parsed.ASN) ?? { name: 'Unknown', type: 'Unknown' };\n\n const record: BgpRecord = {\n range: parsed.CIDR,\n asn_id: String(parsed.ASN),\n asn_name: dictionaryLookup.name,\n classification: dictionaryLookup.type,\n hits: String(parsed.Hits)\n };\n results.push(JSON.stringify(record));\n }\n\n if (results.length > 0) {\n consola.log('[ASN/BGP] SAMPLE:', results[0]);\n }\n\n consola.info(`[ASN/BGP] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempASNJson, results.join('\\n'), 'utf-8');\n consola.info(`[ASN/BGP] Compiling MMDB with mmdbctl to ${output}...`);\n \n const cmd = `${mmdbPath} import --in ${tempASNJson} --out ${output}`;\n const convert = await run(cmd);\n\n if (convert.stdout) consola.log(`[ASN/BGP] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[ASN/BGP] COMPLETED: Successfully compiled ASN MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error(`\\n[ASN/BGP] ERROR during processing:`, error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempASNJson)) {\n fs.unlinkSync(tempASNJson);\n }\n }\n}\n","import { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport type { GlobalCountry, GlobalState, GlobalCity, CityGeoRecord } from \"../types/geography.js\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createRegExp, exactly } from \"magic-regexp\";\nimport { consola } from \"consola\";\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url));\nconst dbPath = [\n path.resolve(currentDir, './countries+states+cities.json'),\n path.resolve(currentDir, '../../public/countries+states+cities.json')\n].find(p => fs.existsSync(p)) ?? path.resolve(currentDir, './countries+states+cities.json');\n\nexport async function buildCitiesData(outputPath: string, mmdbPath: string) {\n consola.info('\\n[CITY/GEO] Building global geographic index from hierarchical database...');\n const output = path.resolve(outputPath, 'city.mmdb');\n const tempGeoJson = path.resolve(outputPath, 'temp_city_data.json');\n \n\n const rawData = fs.readFileSync(dbPath, 'utf8');\n const dbJson = JSON.parse(rawData) as GlobalCountry[];\n\n const countryIndex = new Map<string, { meta: GlobalCountry, states: Map<string, { meta: GlobalState, cities: Map<string, GlobalCity> }> }>();\n \n for (const country of dbJson) {\n const stateMap = new Map<string, { meta: GlobalState, cities: Map<string, GlobalCity> }>();\n \n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (country.states) {\n for (const state of country.states) {\n const cityMap = new Map<string, GlobalCity>();\n \n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (state.cities) {\n for (const city of state.cities) {\n cityMap.set(city.name.toLowerCase(), city);\n }\n }\n \n stateMap.set(state.state_code, { meta: state, cities: cityMap });\n }\n }\n \n countryIndex.set(country.iso2.toUpperCase(), { meta: country, states: stateMap });\n }\n\n try {\n consola.info('[CITY/GEO] Fetching validated geofeed CSV...');\n\n const res = await fetch('https://geolocatemuch.com/geofeeds/validated-all.csv');\n const csvText = await res.text();\n const lines = csvText.split('\\n');\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n \n consola.success(`[CITY/GEO] SUCCESS: Received ${String(lines.length)} IP ranges. Mapping to geographic index...`);\n const results: string[] = [];\n\n for (const line of lines) {\n if (!line.trim() || commentRegex.test(line)) continue;\n\n const parts = line.split(',');\n const prefix = parts[0]?.trim() || \"\";\n const country = parts[1]?.trim() || \"\";\n const region = parts[2]?.trim() || \"\";\n const city = parts[3]?.trim() || \"\";\n const zip = parts[4]?.trim() || \"\";\n\n if (!country && !city && !zip) continue;\n\n const cc = country.toUpperCase() || \"\";\n\n let emoji = \"\";\n let lat = '';\n let lon = '';\n let stateName = '';\n let countryMeta: Partial<GlobalCountry> = {};\n \n const countryData = countryIndex.get(cc);\n if (countryData) {\n countryMeta = countryData.meta;\n emoji = countryData.meta.emoji || \"\";\n \n \n if (region) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const regionCode = region.includes('-') ? region.split('-').pop()! : region;\n const stateData = countryData.states.get(regionCode);\n \n if (stateData) {\n stateName = stateData.meta.name || stateData.meta.state_code || \"\";\n \n if (city) {\n const cityData = stateData.cities.get(city.toLowerCase());\n if (cityData) {\n lat = cityData.latitude || \"\";\n lon = cityData.longitude || \"\";\n }\n }\n\n if (!lat && stateData.meta.latitude && stateData.meta.longitude) {\n lat = stateData.meta.latitude || \"\";\n lon = stateData.meta.longitude || \"\";\n }\n }\n }\n \n\n if (!lat && city) {\n for (const [, stateData] of countryData.states) {\n const cityData = stateData.cities.get(city.toLowerCase());\n if (cityData) {\n lat = cityData.latitude || \"\";\n lon = cityData.longitude || \"\";\n if (!stateName) stateName = stateData.meta.name || stateData.meta.state_code || \"\";\n break;\n }\n }\n }\n\n if (!lat && countryMeta.latitude && countryMeta.longitude) {\n lat = countryMeta.latitude || \"\";\n lon = countryMeta.longitude || \"\";\n }\n }\n\n const geoRecord: CityGeoRecord = {\n range: prefix,\n country_code: country,\n region: region || (countryMeta.region ?? \"\"),\n subregion: countryMeta.subregion ?? \"\",\n city: city,\n zip_code: zip,\n latitude: lat,\n longitude: lon,\n state: stateName,\n name: countryMeta.name ?? \"Unknown\",\n native: countryMeta.native ?? \"\",\n phone: countryMeta.phonecode ?? '',\n numericCode: countryMeta.numeric_code ?? \"\",\n continent: countryMeta.region ?? \"\",\n capital: countryMeta.capital ?? \"\",\n currency: countryMeta.currency ?? '',\n currency_name: countryMeta.currency_name ?? \"\",\n languages: countryMeta.translations ? Object.values(countryMeta.translations)[0] ?? \"\" : \"\",\n emoji: emoji,\n timezone: countryMeta.timezones?.[0]?.zoneName ?? \"\",\n utc_offset: countryMeta.timezones?.[0]?.gmtOffsetName ?? \"\",\n timeZoneName: countryMeta.timezones?.[0]?.tzName ?? \"\",\n tld: countryMeta.tld ?? \"\",\n nationality: countryMeta.nationality ?? \"\",\n };\n \n results.push(JSON.stringify(geoRecord));\n }\n \n consola.info(`[CITY/GEO] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempGeoJson, results.join('\\n'), 'utf-8');\n\n consola.start('[CITY/GEO] Compiling MMDB with mmdbctl...');\n \n const cmd = `${mmdbPath} import --in ${tempGeoJson} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.log(`[CITY/GEO] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[CITY/GEO] COMPLETED: Successfully compiled City MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error('\\n[CITY/GEO] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempGeoJson)) {\n fs.unlinkSync(tempGeoJson);\n }\n }\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport ipaddr from 'ipaddr.js';\nimport path from \"path\";\nimport type { OnionooPayload, TorRecord } from \"../types/tor.js\";\nimport consola from \"consola\";\n\n\n\nexport async function getTorLists(outputPath: string, mmdbPath: string): Promise<void> {\n const url = 'https://onionoo.torproject.org/details';\n const output = path.resolve(outputPath, 'tor.mmdb');\n const tempFileName = path.resolve(outputPath, 'temp_tor_nodes.json');\n\ntry {\n\n consola.info(\"\\n[TOR] Fetching node data from Onionoo API...\");\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Accept-Encoding': 'gzip',\n 'Accept': 'application/json'\n }\n\n });\n\n\n\n if (!response.ok) {\n consola.error(`[TOR] ERROR: API fetch failed with status ${String(response.status)}`);\n return;\n }\n\n const data = await response.json() as OnionooPayload;\n consola.success('[TOR] SUCCESS: Data received, mapping relay nodes...');\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const rawNodes = data.relays || [];\n const toMap = rawNodes.filter((flags) => {\n\n const fl = flags.flags?.map(f => f.toLowerCase()) ?? [];\n return fl.includes(\"exit\") ||\n fl.includes(\"valid\") ||\n fl.includes(\"running\") ||\n fl.includes(\"stable\") ||\n fl.includes(\"hsdir\") &&\n flags.exit_addresses &&\n flags.or_addresses;\n });\n\n\n\n if (toMap.length === 0) {\n consola.warn(\"[TOR] WARNING: No relay nodes found matching criteria.\");\n return;\n }\n\n const results: TorRecord[] = [];\n\n for (const node of toMap) {\n const ipsToProcess = [\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(node.exit_addresses ?? []),\n ...(node.or_addresses ?? [])\n ];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!ipsToProcess) continue;\n\n for (const ip of ipsToProcess) {\n\n let cleanIp = ip;\n if (cleanIp.startsWith('[')) {\n cleanIp = cleanIp.split(']:')[0].substring(1);\n } else {\n cleanIp = cleanIp.split(':')[0];\n }\n\n const parsedIp = ipaddr.parse(cleanIp);\n let finalNetworkAddress: string;\n\n if (parsedIp.kind() === 'ipv4') {\n const ipv4 = parsedIp as ipaddr.IPv4;\n const networkAddress = ipaddr.IPv4.networkAddressFromCIDR(`${ipv4.toString()}/24`);\n finalNetworkAddress = `${networkAddress.toString()}/24`;\n } else if (parsedIp.kind() === 'ipv6') {\n const ipv6 = parsedIp as ipaddr.IPv6;\n const networkAddress = ipaddr.IPv6.networkAddressFromCIDR(`${ipv6.toString()}/64`);\n finalNetworkAddress = `${networkAddress.toString()}/64`;\n } else {\n continue;\n }\n\n results.push({\n range: finalNetworkAddress,\n or_addresses: node.or_addresses?.join(',') ?? '',\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n exit_addresses: node.exit_addresses?.join(',') ?? '',\n last_seen: node.last_seen ?? \"\",\n last_changed_address_or_port: node.last_changed_address_or_port ?? \"\",\n first_seen: node.first_seen ?? \"\",\n running: node.running ?? false,\n flags: node.flags?.join(',') ?? \"\",\n country: node.country ?? \"\",\n country_name: node.country_name ?? \"\",\n as: node.as ?? \"\",\n as_name: node.as_name ?? \"\",\n last_restarted: node.last_restarted ?? \"\",\n exit_policy: node.exit_policy?.join(',') ?? '',\n exit_policy_summary: JSON.stringify(node.exit_policy_summary) || '',\n exit_policy_v6_summary: node.exit_policy_v6_summary ? JSON.stringify(node.exit_policy_v6_summary) : undefined,\n contact: node.contact ?? \"Unknown\",\n version_status: node.version_status ?? \"\",\n guard_probability: node.guard_probability ?? 0,\n middle_probability: node.middle_probability ?? 0,\n exit_probability: node.exit_probability ?? 0,\n recommended_version: node.recommended_version ?? false,\n measured: node.measured ?? false,\n });\n }\n\n }\n\n consola.info('[TOR] SAMPLE:', results[0]);\n const ndjsonOutput = results.map(record => JSON.stringify(record)).join('\\n');\n fs.writeFileSync(tempFileName, ndjsonOutput, 'utf-8');\n try {\n consola.info('[TOR] Compiling MMDB with mmdbctl...');\n const convert = await run(`${mmdbPath} import -j -i ${tempFileName} -o ${output}`);\n if (convert.stdout) consola.info(`[TOR] mmdbctl: ${convert.stdout.toString().trim()}`);\n\n consola.success(`[TOR] COMPLETED: Successfully compiled Tor MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error(\"[TOR] ERROR: MMDB compilation failed:\", error);\n return;\n }\n\n } catch (error: unknown) {\n consola.error(\"[TOR] ERROR: Unexpected failure while fetching node list:\", error);\n return;\n } finally {\n if (fs.existsSync(tempFileName)) {\n fs.unlinkSync(tempFileName);\n }\n \n }\n\n} ","import { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { GlobalCountry, GeoRecord } from \"../types/geography.js\";\nimport consola from \"consola\";\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url));\nconst dbPath = [\n path.resolve(currentDir, './countries+states+cities.json'),\n path.resolve(currentDir, '../../public/countries+states+cities.json')\n].find(p => fs.existsSync(p)) ?? path.resolve(currentDir, './countries+states+cities.json');\n\nexport async function getGeoDatas(outputPath: string, mmdbPath: string) {\n consola.info(\"\\n[GEO/COUNTRY] Building country index from local database...\");\n\n const output = path.resolve(outputPath, 'country.mmdb');\n const tempGeoJson = path.resolve(outputPath, 'temp_country_data.json');\n const rawData = fs.readFileSync(dbPath, 'utf8');\n const dbJson = JSON.parse(rawData) as GlobalCountry[];\n\n const countryIndex = new Map<string, GlobalCountry>();\n for (const country of dbJson) {\n countryIndex.set(country.iso2.toUpperCase(), country);\n }\n\n consola.info('[GEO/COUNTRY] Fetching global IPv4 Country mapping from Sapics...');\n const url = 'https://raw.githubusercontent.com/sapics/ip-location-db/refs/heads/main/geo-asn-country/geo-asn-country-ipv4.csv';\n\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`[GEO/COUNTRY] ERROR: Failed to fetch country data: ${res.statusText}`);\n }\n\n const csvText = await res.text();\n const lines = csvText.split('\\n');\n \n consola.success(`[GEO/COUNTRY] SUCCESS: Received ${String(lines.length)} global IP ranges. Enriching data...`);\n const results: string[] = [];\n\n for (const line of lines) {\n if (!line.trim()) continue;\n \n const parts = line.split(',');\n const start = parts[0]?.trim();\n const end = parts[1]?.trim();\n const cc = parts[2]?.trim().toUpperCase();\n \n if (!start || !end || !cc) continue;\n\n const countryMeta = countryIndex.get(cc);\n\n const record: GeoRecord = {\n range: `${start}-${end}`,\n country_code: cc,\n region: countryMeta?.region ?? '',\n numericCode: countryMeta?.numeric_code ?? \"\",\n name: countryMeta?.name ?? \"\",\n native: countryMeta?.native ?? \"\",\n phone: countryMeta?.phonecode ?? \"\",\n capital: countryMeta?.capital ?? \"\",\n currency: countryMeta?.currency ?? \"\",\n currency_name: countryMeta?.currency_name ?? \"\",\n currency_symbol: countryMeta?.currency_symbol ?? \"\",\n languages: countryMeta?.translations ? Object.values(countryMeta.translations)[0] ?? \"\" : \"\",\n emoji: countryMeta?.emoji ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n timezone: countryMeta?.timezones?.[0]?.zoneName ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n utc_offset: countryMeta?.timezones?.[0]?.gmtOffsetName ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n timeZoneName: countryMeta?.timezones?.[0]?.tzName ?? \"\",\n tld: countryMeta?.tld ?? \"\",\n nationality: countryMeta?.nationality ?? \"\",\n subregion: countryMeta?.subregion ?? \"\"\n };\n\n results.push(JSON.stringify(record));\n }\n\n consola.info(`[GEO/COUNTRY] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempGeoJson, results.join('\\n'), 'utf-8');\n\n consola.start('[GEO/COUNTRY] Compiling MMDB with mmdbctl...');\n\n const cmd = `${mmdbPath} import --in ${tempGeoJson} --out ${output}`;\n const convert = await run(cmd);\n \n if (convert.stdout) consola.log(`[GEO/COUNTRY] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[GEO/COUNTRY] COMPLETED: Successfully compiled Country MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error('\\n[GEO/COUNTRY] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempGeoJson)) {\n fs.unlinkSync(tempGeoJson);\n }\n }\n}\n","import fs from 'node:fs';\nimport { run } from \"../utils/run.js\";\nimport { createRegExp, exactly, charNotIn, anyOf, digit, oneOrMore } from 'magic-regexp';\nimport path from 'node:path';\nimport consola from 'consola';\n\n\nexport async function getListOfProxies(outputPath: string, mmdbPath: string) {\n consola.log(\"\\n[PROXY] Fetching initial Proxy list from Awesome-lists...\");\n const output = path.resolve(outputPath, 'proxy.mmdb');\n const tempProxyJson = path.resolve(outputPath, 'temp_proxy_data.json');\n\n const seenIps = new Set<string>();\n const results: string[] = [];\n const urls = ['https://raw.githubusercontent.com/mthcht/awesome-lists/refs/heads/main/Lists/PROXY/ALL_PROXY_Lists.csv', 'https://raw.githubusercontent.com/firehol/blocklist-ipsets/refs/heads/master/firehol_proxies.netset'];\n \n const ipv4Regex = createRegExp(\n exactly(oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit))\n .and(exactly('/', oneOrMore(digit)).optionally()) \n .at.lineStart().at.lineEnd()\n );\n\n try {\n const resAwesome = await fetch(urls[0]);\n if (!resAwesome.ok) throw new Error(`[PROXY] ERROR: Failed to fetch awesome list: ${resAwesome.statusText}`);\n\n const csvText = await resAwesome.text();\n const lines = csvText.split('\\n').slice(1);\n\n const nonQuotes = charNotIn('\"').times.any();\n const quotePair = nonQuotes.and(exactly('\"')).times(2);\n const splitAwesomeListRegex = createRegExp(\n exactly(',').before(quotePair.times.any().and(nonQuotes).at.lineEnd())\n );\n\n const stripAwesomeListRegex = createRegExp(\n anyOf(exactly('PROXY_ALL_'), exactly('_list.csv'), exactly('\"')), \n ['g', 'i']\n );\n\n\n\n for (const line of lines) {\n if (!line.trim()) continue;\n \n const [dest_ip, dest_port, metadata_comment] = line.split(splitAwesomeListRegex);\n\n if (!dest_ip || !ipv4Regex.test(dest_ip)) continue;\n \n if (seenIps.has(dest_ip)) continue;\n seenIps.add(dest_ip);\n\n const cleanComment = metadata_comment.replace(stripAwesomeListRegex, '').trim();\n\n const record = {\n range: `${dest_ip}/32`, \n port: dest_port,\n comment: cleanComment\n };\n \n results.push(JSON.stringify(record));\n }\n \n consola.success(`[PROXY] SUCCESS: Finished Awesome-list. Discovered ${String(results.length)} unique IPs.`);\n consola.log('[PROXY] Fetching secondary data from FireHOL proxy list...');\n const resFirehol = await fetch(urls[1]);\n\n if (!resFirehol.ok) throw new Error(`[PROXY] ERROR: Failed to fetch FireHOL list: ${resFirehol.statusText}`);\n const textFirehol = await resFirehol.text();\n const fireholLines = textFirehol.split('\\n');\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n let fireholCount = 0;\n\n\n for (const line of fireholLines) {\n const trimmed = line.trim();\n if (!trimmed || commentRegex.test(trimmed)) continue;\n\n const ip = trimmed;\n \n if (!ipv4Regex.test(ip)) continue;\n \n if (seenIps.has(ip)) continue;\n seenIps.add(ip);\n\n const record = {\n range: ip,\n port: 'unknown',\n comment: `Ip from Firehol`\n };\n\n results.push(JSON.stringify(record));\n fireholCount++;\n }\n\n consola.success(`[PROXY] SUCCESS: Finished FireHOL. Added ${String(fireholCount)} NEW unique proxies. Total unique: ${String(results.length)}`);\n\n if (results.length > 0) {\n consola.log('[PROXY] SAMPLE:', results[0]);\n }\n\n consola.log(`[PROXY] Writing ${String(results.length)} unique proxies to temporary JSON...`);\n fs.writeFileSync(tempProxyJson, results.join('\\n'), 'utf-8');\n consola.log('[PROXY] Compiling MMDB with mmdbctl...');\n\n const cmd = `${mmdbPath} import --in ${tempProxyJson} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.log(`[PROXY] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[PROXY] COMPLETED: Successfully compiled Proxy MMDB to ${output}\\n`);\n\n\n } catch (error) {\n consola.error('\\n[PROXY] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempProxyJson)) {\n fs.unlinkSync(tempProxyJson);\n }\n } \n}\n","import fs from 'node:fs';\nimport { run } from \"../utils/run.js\";\nimport { createRegExp, exactly, digit, oneOrMore } from 'magic-regexp';\nimport path from 'node:path';\nimport consola from 'consola';\n\n\n\n\nconst THREAT_CONFIG = {\n firehol_anonymous: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_anonymous.netset',\n firehol_l1: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level1.netset',\n firehol_l2: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level2.netset',\n firehol_l3: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level3.netset',\n firehol_l4: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level4.netset',\n} as const;\n\n\n\nexport async function getThreatLists(outputPath: string, mmdbPath: string, selectedSources?: string[] | boolean) {\n\n const maintainerUrl = ' Maintainer: http://iplists.firehol.org/';\n const ipv4Regex = createRegExp(\n exactly(oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit))\n .and(exactly('/', oneOrMore(digit)).optionally()) \n .at.lineStart().at.lineEnd()\n );\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n let tasks: { id: string, url: string }[] = [];\n\n if (Array.isArray(selectedSources)) {\n tasks = Object.entries(THREAT_CONFIG)\n .filter(([id]) => selectedSources.includes(id))\n .map(([id, url]) => ({ id, url }));\n } else if (Boolean(selectedSources)) {\n tasks = Object.entries(THREAT_CONFIG).map(([id, url]) => ({ id, url }));\n }\n \n if (tasks.length === 0) {\n consola.info('No valid FireHOL data sources selected. Skipping.');\n return;\n }\n try {\n consola.start(`Initializing fetch for ${String(tasks.length)} FireHOL stream(s)...`);\n\n const promises = tasks.map(async (task) => {\n const res = await fetch(task.url);\n return { id: task.id, res };\n });\n\n const resultsSettled = await Promise.allSettled(promises);\n consola.success(`[THREATS] SUCCESS: Fetched ${String(resultsSettled.length)} data streams from FireHOL.`);\n\n let ipsCount = 0;\n\n\n for (const result of resultsSettled) {\n\n if (result.status === 'rejected') {\n consola.error(`Promise rejected:`, result.reason);\n continue;\n }\n const { id, res } = result.value;\n const finalMsg = `${id} ${maintainerUrl}`;\n const results: string[] = [];\n consola.info(`[THREATS] Processing stream: ${id}...`);\n \n if (!res.ok) {\n consola.error(`Failed fetching ${id}: ${res.statusText}`);\n continue;\n }\n\n const rawTextData = await res.text();\n const lines = rawTextData.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || commentRegex.test(trimmed)) continue;\n\n const ip = trimmed;\n if (!ipv4Regex.test(ip)) continue;\n\n const record = {\n range: ip,\n comment: finalMsg\n };\n\n ipsCount++;\n results.push(JSON.stringify(record));\n }\n\n consola.info(`[THREATS] ${id} summary:`);\n consola.info(` -> IPs Discovered: ${String(results.length)}`);\n consola.info(` -> Rolling Total: ${String(ipsCount)}`);\n \n if (results.length > 0) {\n consola.info(`[THREATS] SAMPLE: ${results[0]}`);\n consola.info(`[THREATS] Writing entries to temporary JSON: temp_${id}.json`);\n const jsonName = path.resolve(outputPath, `temp_${id}.json`);\n const output = path.resolve(outputPath, `${id}.mmdb`);\n\n fs.writeFileSync(jsonName, results.join('\\n'), 'utf-8');\n console.log(`[THREATS] Compiling MMDB with mmdbctl to ${output}...`);\n\n const cmd = `${mmdbPath} import --in ${jsonName} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.box(`[THREATS] mmdbctl: ${convert.stdout.toString().trim()}`);\n\n if (fs.existsSync(jsonName)) {\n fs.unlinkSync(jsonName);\n }\n consola.success(`[THREATS] SUCCESS: Compiled ${id}.mmdb\\n`);\n } else {\n consola.warn(`[THREATS] WARNING: No valid IPs found for ${id}. Skipping.\\n`);\n }\n }\n \n consola.success(\"[THREATS] COMPLETED: All threat intelligence sources processed successfully.\\n\");\n\n } catch (error) {\n consola.error('\\n[THREATS] FATAL ERROR during processing:', error);\n process.exit(1);\n }\n}","import { getBGPAndASN } from \"./bgp.js\";\nimport { buildCitiesData } from \"./city.js\";\nimport { getTorLists } from \"./tor.js\";\nimport { getGeoDatas } from \"./geo.js\";\nimport { getListOfProxies } from \"./proxy.js\";\nimport { getThreatLists } from \"./threats.js\";\nimport fs from 'node:fs';\nimport path from \"path\";\nimport consola from \"consola\";\n\n\nexport async function generateData(outputPath: string, userAgent: string, selectedSources: string[] | boolean, mmdbPath: string) {\n consola.box(\"\\n=========================================\\n\" +\n \" === Starting data generation pipeline === \" +\n \"\\n=========================================\\n\");\n\n const threatsPath = path.resolve(outputPath, 'threats-lists');\n \n if (!fs.existsSync(threatsPath)) {\n fs.mkdirSync(threatsPath, { recursive: true });\n }\n \n try {\n\n const results = await Promise.allSettled([\n getBGPAndASN(userAgent, outputPath, mmdbPath),\n buildCitiesData(outputPath, mmdbPath),\n getTorLists(outputPath, mmdbPath),\n getGeoDatas(outputPath, mmdbPath),\n getListOfProxies(outputPath, mmdbPath),\n getThreatLists(outputPath, mmdbPath, selectedSources)\n ]);\n \n results.forEach((result, index) => {\n if (result.status === 'rejected') {\n consola.error(`Script cluster [${String(index)}] failed:`, String(result.reason));\n }\n });\n consola.info(\"\\n====================================\\n\" +\n \"Pipeline execution finished.\" +\n \"\\n====================================\\n\");\n } catch (error) {\n consola.error(\"\\n====================================\\n\" +\n `Fatal error in pipeline: ${String(error)}` +\n \"\\n====================================\\n\");\n }\n}","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\nimport consola from 'consola';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { InputCache } from '../types/input.js';\nimport { \n getBGPAndASN,\n buildCitiesData,\n generateData as executeAll,\n getGeoDatas,\n getListOfProxies,\n getThreatLists,\n getTorLists\n} from '../scripts/index.js';\n\nconst cacheOutput = path.join(os.homedir(), '.shield-base', '.cache.json');\n\nexport async function restartData(outputPath: string, all: boolean): Promise<void> {\n \n if (!existsSync(cacheOutput)) { \n consola.error('No cache found. Cannot restart. Please run a standard compilation first.');\n process.exit(1);\n }\n \n const cachedFile = await readFile(cacheOutput, 'utf-8');\n const cache = JSON.parse(cachedFile) as InputCache;\n \n if (!cache.selectedDataTypes || cache.selectedDataTypes.length === 0) {\n consola.warn('Cache is empty. No data sources to restart.');\n return;\n }\n\n if (all) {\n consola.info('Restarting ALL data sources...');\n await executeAll(outputPath, cache.useragent, true, cache.mmdbctlPath);\n consola.success('✨ All data successfully refreshed!');\n return;\n }\n\n consola.info(`Restarting data compilation from cache: ${cache.selectedDataTypes.join(', ')}`);\n\n const fireholSources = cache.selectedDataTypes.filter(s => s.startsWith('firehol_') || s === 'anonymous');\n const standardSources = cache.selectedDataTypes.filter(s => !s.startsWith('firehol_') && s !== 'anonymous');\n\n\n if (standardSources.includes('BGP')) {\n await getBGPAndASN(cache.useragent || '', outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('City')) {\n await buildCitiesData(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Geography')) {\n await getGeoDatas(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Proxy')) {\n await getListOfProxies(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Tor')) {\n await getTorLists(outputPath, cache.mmdbctlPath);\n }\n \n if (fireholSources.length > 0) {\n await getThreatLists(outputPath, cache.mmdbctlPath, fireholSources);\n }\n\n consola.success('✨ Cached data successfully refreshed!');\n return;\n}"]}
package/dist/cli.js CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {i,h,b,c,e,f,d,g}from'./chunk-MNLRCNRV.js';import {parseArgs}from'util';import M,{consola}from'consola';import {charNotIn,oneOrMore,exactly,createRegExp}from'magic-regexp';import O from'path';import {fileURLToPath}from'url';import S from'fs';import B from'os';import {pipeline}from'stream/promises';import {execSync}from'child_process';import*as ae from'tar';import $e from'extract-zip';import {readFile,writeFile}from'fs/promises';var le=/\d/,ce=["-","_","/","."];function ue(e=""){if(!le.test(e))return e!==e.toLowerCase()}function Z(e,i){let o=ce,a=[];if(!e||typeof e!="string")return a;let n="",l,f;for(let t of e){let c=o.includes(t);if(c===true){a.push(n),n="",l=void 0;continue}let u=ue(t);if(f===false){if(l===false&&u===true){a.push(n),n=t,l=u;continue}if(l===true&&u===false&&n.length>1){let h=n.at(-1);a.push(n.slice(0,Math.max(0,n.length-1))),n=h+t,l=u;continue}}n+=t,l=u,f=c;}return a.push(n),a}function fe(e){return e?e[0].toUpperCase()+e.slice(1):""}function pe(e){return e?e[0].toLowerCase()+e.slice(1):""}function me(e,i){return e?(Array.isArray(e)?e:Z(e)).map(o=>fe(o)).join(""):""}function T(e,i){return pe(me(e||""))}function j(e,i){return e?(Array.isArray(e)?e:Z(e)).map(o=>o.toLowerCase()).join("-"):""}function K(e){return Array.isArray(e)?e:e===void 0?[]:[e]}function I(e,i=""){let o=[];for(let a of e)for(let[n,l]of a.entries())o[n]=Math.max(o[n]||0,l.length);return e.map(a=>a.map((n,l)=>i+n[l===0?"padStart":"padEnd"](o[l])).join(" ")).join(`
3
- `)}function w(e){return typeof e=="function"?e():e}var A=class extends Error{code;constructor(e,i){super(e),this.name="CLIError",this.code=i;}};function he(e=[],i={}){let o=new Set(i.boolean||[]),a=new Set(i.string||[]),n=i.alias||{},l=i.default||{},f=new Map,t=new Map;for(let[r,m]of Object.entries(n)){let y=m;for(let x of y)f.set(r,x),t.has(x)||t.set(x,[]),t.get(x).push(r),f.set(x,r),t.has(r)||t.set(r,[]),t.get(r).push(x);}let c={};function u(r){if(o.has(r))return "boolean";let m=t.get(r)||[];for(let y of m)if(o.has(y))return "boolean";return "string"}let h=new Set([...o,...a,...Object.keys(n),...Object.values(n).flat(),...Object.keys(l)]);for(let r of h)c[r]||(c[r]={type:u(r),default:l[r]});for(let[r,m]of f.entries())r.length===1&&c[m]&&!c[m].short&&(c[m].short=r);let b=[],g={};for(let r=0;r<e.length;r++){let m=e[r];if(m==="--"){b.push(...e.slice(r));break}if(m.startsWith("--no-")){let y=m.slice(5);g[y]=true;continue}b.push(m);}let s;try{s=parseArgs({args:b,options:Object.keys(c).length>0?c:void 0,allowPositionals:!0,strict:!1});}catch{s={values:{},positionals:b};}let p={_:[]};p._=s.positionals;for(let[r,m]of Object.entries(s.values))p[r]=m;for(let[r]of Object.entries(g)){p[r]=false;let m=f.get(r);m&&(p[m]=false);let y=t.get(r);if(y)for(let x of y)p[x]=false;}for(let[r,m]of f.entries())p[r]!==void 0&&p[m]===void 0&&(p[m]=p[r]),p[m]!==void 0&&p[r]===void 0&&(p[r]=p[m]);return p}var ge=(()=>{let e=globalThis.process?.env??{};return e.NO_COLOR==="1"||e.TERM==="dumb"||e.TEST||e.CI})(),N=(e,i=39)=>o=>ge?o:`\x1B[${e}m${o}\x1B[${i}m`,k=N(1,22),v=N(36),ye=N(90),L=N(4,24);function be(e,i){let o={boolean:[],string:[],alias:{},default:{}},a=Q(i);for(let t of a){if(t.type==="positional")continue;t.type==="string"||t.type==="enum"?o.string.push(t.name):t.type==="boolean"&&o.boolean.push(t.name),t.default!==void 0&&(o.default[t.name]=t.default),t.alias&&(o.alias[t.name]=t.alias);let c=T(t.name),u=j(t.name);if(c!==t.name||u!==t.name){let h=K(o.alias[t.name]||[]);c!==t.name&&!h.includes(c)&&h.push(c),u!==t.name&&!h.includes(u)&&h.push(u),h.length>0&&(o.alias[t.name]=h);}}let n=he(e,o),[...l]=n._,f=new Proxy(n,{get(t,c){return t[c]??t[T(c)]??t[j(c)]}});for(let[,t]of a.entries())if(t.type==="positional"){let c=l.shift();if(c!==void 0)f[t.name]=c;else {if(t.default===void 0&&t.required!==false)throw new A(`Missing required positional argument: ${t.name.toUpperCase()}`,"EARG");f[t.name]=t.default;}}else if(t.type==="enum"){let c=f[t.name],u=t.options||[];if(c!==void 0&&u.length>0&&!u.includes(c))throw new A(`Invalid value for argument: ${v(`--${t.name}`)} (${v(c)}). Expected one of: ${u.map(h=>v(h)).join(", ")}.`,"EARG")}else if(t.required&&f[t.name]===void 0)throw new A(`Missing required argument: --${t.name}`,"EARG");return f}function Q(e){let i=[];for(let[o,a]of Object.entries(e||{}))i.push({...a,name:o,alias:K(a.alias)});return i}async function X(e,i){let o=await w(e.args||{}),a=be(i.rawArgs,o),n={rawArgs:i.rawArgs,args:a,data:i.data,cmd:e};typeof e.setup=="function"&&await e.setup(n);let l;try{let f=await w(e.subCommands);if(f&&Object.keys(f).length>0){let t=i.rawArgs.findIndex(u=>!u.startsWith("-")),c=i.rawArgs[t];if(c){if(!f[c])throw new A(`Unknown command ${v(c)}`,"E_UNKNOWN_COMMAND");let u=await w(f[c]);u&&await X(u,{rawArgs:i.rawArgs.slice(t+1)});}else if(!e.run)throw new A("No command specified.","E_NO_COMMAND")}typeof e.run=="function"&&(l=await e.run(n));}finally{typeof e.cleanup=="function"&&await e.cleanup(n);}return {result:l}}async function R(e,i,o){let a=await w(e.subCommands);if(a&&Object.keys(a).length>0){let n=i.findIndex(t=>!t.startsWith("-")),l=i[n],f=await w(a[l]);if(f)return R(f,i.slice(n+1),e)}return [e,o]}async function we(e,i){try{console.log(await xe(e,i)+`
4
- `);}catch(o){console.error(o);}}var ve=/^no[-A-Z]/;async function xe(e,i){let o=await w(e.meta||{}),a=Q(await w(e.args||{})),n=await w(i?.meta||{}),l=`${n.name?`${n.name} `:""}`+(o.name||process.argv[1]),f=[],t=[],c=[],u=[];for(let s of a)if(s.type==="positional"){let p=s.name.toUpperCase(),r=s.required!==false&&s.default===void 0,m=s.default?`="${s.default}"`:"";t.push([v(p+m),s.description||"",s.valueHint?`<${s.valueHint}>`:""]),u.push(r?`<${p}>`:`[${p}]`);}else {let p=s.required===true&&s.default===void 0,r=[...(s.alias||[]).map(m=>`-${m}`),`--${s.name}`].join(", ")+(s.type==="string"&&(s.valueHint||s.default)?`=${s.valueHint?`<${s.valueHint}>`:`"${s.default||""}"`}`:"")+(s.type==="enum"&&s.options?`=<${s.options.join("|")}>`:"");if(f.push([v(r+(p?" (required)":"")),s.description||""]),s.type==="boolean"&&(s.default===true||s.negativeDescription)&&!ve.test(s.name)){let m=[...(s.alias||[]).map(y=>`--no-${y}`),`--no-${s.name}`].join(", ");f.push([v(m+(p?" (required)":"")),s.negativeDescription||""]);}p&&u.push(r);}if(e.subCommands){let s=[],p=await w(e.subCommands);for(let[r,m]of Object.entries(p)){let y=await w((await w(m))?.meta);y?.hidden||(c.push([v(r),y?.description||""]),s.push(r));}u.push(s.join("|"));}let h=[],b=o.version||n.version;h.push(ye(`${o.description} (${l+(b?` v${b}`:"")})`),"");let g=f.length>0||t.length>0;return h.push(`${L(k("USAGE"))} ${v(`${l}${g?" [OPTIONS]":""} ${u.join(" ")}`)}`,""),t.length>0&&(h.push(L(k("ARGUMENTS")),""),h.push(I(t," ")),h.push("")),f.length>0&&(h.push(L(k("OPTIONS")),""),h.push(I(f," ")),h.push("")),c.length>0&&(h.push(L(k("COMMANDS")),""),h.push(I(c," ")),h.push("",`Use ${v(`${l} <command> --help`)} for more information about a command.`)),h.filter(s=>typeof s=="string").join(`
5
- `)}async function ee(e,i={}){let o=i.rawArgs||process.argv.slice(2),a=i.showUsage||we;try{if(o.includes("--help")||o.includes("-h"))await a(...await R(e,o)),process.exit(0);else if(o.length===1&&o[0]==="--version"){let n=typeof e.meta=="function"?await e.meta():await e.meta;if(!n?.version)throw new A("No version specified","E_NO_VERSION");console.log(n.version);}else await X(e,{rawArgs:o});}catch(n){n instanceof A?(await a(...await R(e,o)),console.error(n.message)):console.error(n,`
6
- `),process.exit(1);}}var te={acceptFireholRisk:{type:"boolean",description:"Acknowledge of FireHOL",required:false},all:{type:"boolean",description:"Skip interactive selection and fetch all available sources.",required:false},refresh:{type:"boolean",description:"Force re download and re compilation of data sources.",required:false},refreshAll:{type:"boolean",description:"Force re download and re compilation of all data sources using cached config.",required:false},parallel:{type:"boolean",description:"Run compilation tasks concurrently.",required:false},contact:{type:"string",description:"Provide User-Agent contact info to bypass the interactive BGP prompt",required:false},path:{type:"string",description:"Path for for the databases to be compiled into.",required:false},bgp:{type:"boolean",description:"Compile BGP data",required:false},city:{type:"boolean",description:"Compile City data",required:false},geo:{type:"boolean",description:"Compile Geography data",required:false},proxy:{type:"boolean",description:"Compile Proxy data",required:false},tor:{type:"boolean",description:"Compile Tor data",required:false},l1:{type:"boolean",description:"Compile FireHOL Level 1",required:false},l2:{type:"boolean",description:"Compile FireHOL Level 2",required:false},l3:{type:"boolean",description:"Compile FireHOL Level 3",required:false},l4:{type:"boolean",description:"Compile FireHOL Level 4",required:false},anonymous:{type:"boolean",description:"Compile FireHOL Anonymous network list",required:false}},F=[{label:"BGP",value:"BGP",hint:"\u{1F310} Autonomous System numbers and prefix data"},{label:"City",value:"City",hint:"\u{1F3D9}\uFE0F IP to City geolocation data"},{label:"Geography",value:"Geography",hint:"\u{1F30D} Country and continent information"},{label:"Proxy",value:"Proxy",hint:"Anonymous Proxy and VPN detection lists"},{label:"Tor",value:"Tor",hint:"The Onion Router exit node IP lists, and more"},{label:"FireHOL Level 1",value:"firehol_l1",hint:"Maximum protection, minimum false positives"},{label:"FireHOL Level 2",value:"firehol_l2",hint:"Tracking attacks last 48h, includes dynamic IPs"},{label:"FireHOL Level 3",value:"firehol_l3",hint:"Attacks, spyware, and viruses tracked last 30 days"},{label:"FireHOL Level 4",value:"firehol_l4",hint:"Aggressive tracking, higher false positive risk"},{label:"Anonymous",value:"firehol_anonymous",hint:"Tor exit nodes, I2P, VPNS, and other anonymity network relays"}];function E(e){if(!e||e.trim()==="")return "User agent is required";let i=charNotIn(" "),o=charNotIn(" @"),a=oneOrMore(o).and("@").and(oneOrMore(o)).and(".").and(oneOrMore(o)),n=oneOrMore(i).and(oneOrMore(exactly(" ").and(oneOrMore(i))).optionally());return createRegExp(n.and(exactly(" - ")).and(a).at.lineStart().at.lineEnd()).test(e)?true:"Invalid format. Expected: '<name> [url] - <email>' (e.g., 'acmeco bgp.tools - contact@acme.co')"}async function ie(){let i=`To avoid getting blocked, bgp.tools requires contact information to reach you in case something went wrong.
2
+ import {i,h,b,c,e,f,d,g}from'./chunk-IXNJSTI7.js';import {parseArgs}from'util';import M,{consola}from'consola';import {charNotIn,oneOrMore,exactly,createRegExp}from'magic-regexp';import E from'path';import S from'fs';import B from'os';import {pipeline}from'stream/promises';import {execSync}from'child_process';import*as ae from'tar';import Ce from'extract-zip';import {readFile,writeFile}from'fs/promises';var re=/\d/,le=["-","_","/","."];function ce(e=""){if(!re.test(e))return e!==e.toLowerCase()}function Z(e,i){let o=le,a=[];if(!e||typeof e!="string")return a;let n="",l,f;for(let t of e){let c=o.includes(t);if(c===true){a.push(n),n="",l=void 0;continue}let u=ce(t);if(f===false){if(l===false&&u===true){a.push(n),n=t,l=u;continue}if(l===true&&u===false&&n.length>1){let h=n.at(-1);a.push(n.slice(0,Math.max(0,n.length-1))),n=h+t,l=u;continue}}n+=t,l=u,f=c;}return a.push(n),a}function ue(e){return e?e[0].toUpperCase()+e.slice(1):""}function fe(e){return e?e[0].toLowerCase()+e.slice(1):""}function pe(e,i){return e?(Array.isArray(e)?e:Z(e)).map(o=>ue(o)).join(""):""}function T(e,i){return fe(pe(e||""))}function I(e,i){return e?(Array.isArray(e)?e:Z(e)).map(o=>o.toLowerCase()).join("-"):""}function K(e){return Array.isArray(e)?e:e===void 0?[]:[e]}function _(e,i=""){let o=[];for(let a of e)for(let[n,l]of a.entries())o[n]=Math.max(o[n]||0,l.length);return e.map(a=>a.map((n,l)=>i+n[l===0?"padStart":"padEnd"](o[l])).join(" ")).join(`
3
+ `)}function w(e){return typeof e=="function"?e():e}var A=class extends Error{code;constructor(e,i){super(e),this.name="CLIError",this.code=i;}};function de(e=[],i={}){let o=new Set(i.boolean||[]),a=new Set(i.string||[]),n=i.alias||{},l=i.default||{},f=new Map,t=new Map;for(let[r,m]of Object.entries(n)){let y=m;for(let x of y)f.set(r,x),t.has(x)||t.set(x,[]),t.get(x).push(r),f.set(x,r),t.has(r)||t.set(r,[]),t.get(r).push(x);}let c={};function u(r){if(o.has(r))return "boolean";let m=t.get(r)||[];for(let y of m)if(o.has(y))return "boolean";return "string"}let h=new Set([...o,...a,...Object.keys(n),...Object.values(n).flat(),...Object.keys(l)]);for(let r of h)c[r]||(c[r]={type:u(r),default:l[r]});for(let[r,m]of f.entries())r.length===1&&c[m]&&!c[m].short&&(c[m].short=r);let b=[],g={};for(let r=0;r<e.length;r++){let m=e[r];if(m==="--"){b.push(...e.slice(r));break}if(m.startsWith("--no-")){let y=m.slice(5);g[y]=true;continue}b.push(m);}let s;try{s=parseArgs({args:b,options:Object.keys(c).length>0?c:void 0,allowPositionals:!0,strict:!1});}catch{s={values:{},positionals:b};}let p={_:[]};p._=s.positionals;for(let[r,m]of Object.entries(s.values))p[r]=m;for(let[r]of Object.entries(g)){p[r]=false;let m=f.get(r);m&&(p[m]=false);let y=t.get(r);if(y)for(let x of y)p[x]=false;}for(let[r,m]of f.entries())p[r]!==void 0&&p[m]===void 0&&(p[m]=p[r]),p[m]!==void 0&&p[r]===void 0&&(p[r]=p[m]);return p}var he=(()=>{let e=globalThis.process?.env??{};return e.NO_COLOR==="1"||e.TERM==="dumb"||e.TEST||e.CI})(),L=(e,i=39)=>o=>he?o:`\x1B[${e}m${o}\x1B[${i}m`,O=L(1,22),v=L(36),ge=L(90),k=L(4,24);function ye(e,i){let o={boolean:[],string:[],alias:{},default:{}},a=Q(i);for(let t of a){if(t.type==="positional")continue;t.type==="string"||t.type==="enum"?o.string.push(t.name):t.type==="boolean"&&o.boolean.push(t.name),t.default!==void 0&&(o.default[t.name]=t.default),t.alias&&(o.alias[t.name]=t.alias);let c=T(t.name),u=I(t.name);if(c!==t.name||u!==t.name){let h=K(o.alias[t.name]||[]);c!==t.name&&!h.includes(c)&&h.push(c),u!==t.name&&!h.includes(u)&&h.push(u),h.length>0&&(o.alias[t.name]=h);}}let n=de(e,o),[...l]=n._,f=new Proxy(n,{get(t,c){return t[c]??t[T(c)]??t[I(c)]}});for(let[,t]of a.entries())if(t.type==="positional"){let c=l.shift();if(c!==void 0)f[t.name]=c;else {if(t.default===void 0&&t.required!==false)throw new A(`Missing required positional argument: ${t.name.toUpperCase()}`,"EARG");f[t.name]=t.default;}}else if(t.type==="enum"){let c=f[t.name],u=t.options||[];if(c!==void 0&&u.length>0&&!u.includes(c))throw new A(`Invalid value for argument: ${v(`--${t.name}`)} (${v(c)}). Expected one of: ${u.map(h=>v(h)).join(", ")}.`,"EARG")}else if(t.required&&f[t.name]===void 0)throw new A(`Missing required argument: --${t.name}`,"EARG");return f}function Q(e){let i=[];for(let[o,a]of Object.entries(e||{}))i.push({...a,name:o,alias:K(a.alias)});return i}async function X(e,i){let o=await w(e.args||{}),a=ye(i.rawArgs,o),n={rawArgs:i.rawArgs,args:a,data:i.data,cmd:e};typeof e.setup=="function"&&await e.setup(n);let l;try{let f=await w(e.subCommands);if(f&&Object.keys(f).length>0){let t=i.rawArgs.findIndex(u=>!u.startsWith("-")),c=i.rawArgs[t];if(c){if(!f[c])throw new A(`Unknown command ${v(c)}`,"E_UNKNOWN_COMMAND");let u=await w(f[c]);u&&await X(u,{rawArgs:i.rawArgs.slice(t+1)});}else if(!e.run)throw new A("No command specified.","E_NO_COMMAND")}typeof e.run=="function"&&(l=await e.run(n));}finally{typeof e.cleanup=="function"&&await e.cleanup(n);}return {result:l}}async function R(e,i,o){let a=await w(e.subCommands);if(a&&Object.keys(a).length>0){let n=i.findIndex(t=>!t.startsWith("-")),l=i[n],f=await w(a[l]);if(f)return R(f,i.slice(n+1),e)}return [e,o]}async function be(e,i){try{console.log(await ve(e,i)+`
4
+ `);}catch(o){console.error(o);}}var we=/^no[-A-Z]/;async function ve(e,i){let o=await w(e.meta||{}),a=Q(await w(e.args||{})),n=await w(i?.meta||{}),l=`${n.name?`${n.name} `:""}`+(o.name||process.argv[1]),f=[],t=[],c=[],u=[];for(let s of a)if(s.type==="positional"){let p=s.name.toUpperCase(),r=s.required!==false&&s.default===void 0,m=s.default?`="${s.default}"`:"";t.push([v(p+m),s.description||"",s.valueHint?`<${s.valueHint}>`:""]),u.push(r?`<${p}>`:`[${p}]`);}else {let p=s.required===true&&s.default===void 0,r=[...(s.alias||[]).map(m=>`-${m}`),`--${s.name}`].join(", ")+(s.type==="string"&&(s.valueHint||s.default)?`=${s.valueHint?`<${s.valueHint}>`:`"${s.default||""}"`}`:"")+(s.type==="enum"&&s.options?`=<${s.options.join("|")}>`:"");if(f.push([v(r+(p?" (required)":"")),s.description||""]),s.type==="boolean"&&(s.default===true||s.negativeDescription)&&!we.test(s.name)){let m=[...(s.alias||[]).map(y=>`--no-${y}`),`--no-${s.name}`].join(", ");f.push([v(m+(p?" (required)":"")),s.negativeDescription||""]);}p&&u.push(r);}if(e.subCommands){let s=[],p=await w(e.subCommands);for(let[r,m]of Object.entries(p)){let y=await w((await w(m))?.meta);y?.hidden||(c.push([v(r),y?.description||""]),s.push(r));}u.push(s.join("|"));}let h=[],b=o.version||n.version;h.push(ge(`${o.description} (${l+(b?` v${b}`:"")})`),"");let g=f.length>0||t.length>0;return h.push(`${k(O("USAGE"))} ${v(`${l}${g?" [OPTIONS]":""} ${u.join(" ")}`)}`,""),t.length>0&&(h.push(k(O("ARGUMENTS")),""),h.push(_(t," ")),h.push("")),f.length>0&&(h.push(k(O("OPTIONS")),""),h.push(_(f," ")),h.push("")),c.length>0&&(h.push(k(O("COMMANDS")),""),h.push(_(c," ")),h.push("",`Use ${v(`${l} <command> --help`)} for more information about a command.`)),h.filter(s=>typeof s=="string").join(`
5
+ `)}async function ee(e,i={}){let o=i.rawArgs||process.argv.slice(2),a=i.showUsage||be;try{if(o.includes("--help")||o.includes("-h"))await a(...await R(e,o)),process.exit(0);else if(o.length===1&&o[0]==="--version"){let n=typeof e.meta=="function"?await e.meta():await e.meta;if(!n?.version)throw new A("No version specified","E_NO_VERSION");console.log(n.version);}else await X(e,{rawArgs:o});}catch(n){n instanceof A?(await a(...await R(e,o)),console.error(n.message)):console.error(n,`
6
+ `),process.exit(1);}}var te={acceptFireholRisk:{type:"boolean",description:"Acknowledge of FireHOL",required:false},all:{type:"boolean",description:"Skip interactive selection and fetch all available sources.",required:false},refresh:{type:"boolean",description:"Force re download and re compilation of data sources.",required:false},refreshAll:{type:"boolean",description:"Force re download and re compilation of all data sources using cached config.",required:false},parallel:{type:"boolean",description:"Run compilation tasks concurrently.",required:false},contact:{type:"string",description:"Provide User-Agent contact info to bypass the interactive BGP prompt",required:false},path:{type:"string",description:"Path for for the databases to be compiled into.",required:false},bgp:{type:"boolean",description:"Compile BGP data",required:false},city:{type:"boolean",description:"Compile City data",required:false},geo:{type:"boolean",description:"Compile Geography data",required:false},proxy:{type:"boolean",description:"Compile Proxy data",required:false},tor:{type:"boolean",description:"Compile Tor data",required:false},l1:{type:"boolean",description:"Compile FireHOL Level 1",required:false},l2:{type:"boolean",description:"Compile FireHOL Level 2",required:false},l3:{type:"boolean",description:"Compile FireHOL Level 3",required:false},l4:{type:"boolean",description:"Compile FireHOL Level 4",required:false},anonymous:{type:"boolean",description:"Compile FireHOL Anonymous network list",required:false}},F=[{label:"BGP",value:"BGP",hint:"\u{1F310} Autonomous System numbers and prefix data"},{label:"City",value:"City",hint:"\u{1F3D9}\uFE0F IP to City geolocation data"},{label:"Geography",value:"Geography",hint:"\u{1F30D} Country and continent information"},{label:"Proxy",value:"Proxy",hint:"Anonymous Proxy and VPN detection lists"},{label:"Tor",value:"Tor",hint:"The Onion Router exit node IP lists, and more"},{label:"FireHOL Level 1",value:"firehol_l1",hint:"Maximum protection, minimum false positives"},{label:"FireHOL Level 2",value:"firehol_l2",hint:"Tracking attacks last 48h, includes dynamic IPs"},{label:"FireHOL Level 3",value:"firehol_l3",hint:"Attacks, spyware, and viruses tracked last 30 days"},{label:"FireHOL Level 4",value:"firehol_l4",hint:"Aggressive tracking, higher false positive risk"},{label:"Anonymous",value:"firehol_anonymous",hint:"Tor exit nodes, I2P, VPNS, and other anonymity network relays"}];function N(e){if(!e||e.trim()==="")return "User agent is required";let i=charNotIn(" "),o=charNotIn(" @"),a=oneOrMore(o).and("@").and(oneOrMore(o)).and(".").and(oneOrMore(o)),n=oneOrMore(i).and(oneOrMore(exactly(" ").and(oneOrMore(i))).optionally());return createRegExp(n.and(exactly(" - ")).and(a).at.lineStart().at.lineEnd()).test(e)?true:"Invalid format. Expected: '<name> [url] - <email>' (e.g., 'acmeco bgp.tools - contact@acme.co')"}async function ie(){let i=`To avoid getting blocked, bgp.tools requires contact information to reach you in case something went wrong.
7
7
  This data will be included in the user agent header each time you get data from them.
8
8
  More information is available at: https://bgp.tools/kb/api.
9
9
 
10
10
  Required format: '<your-name or company> <optional site url> - <Your email address>'
11
- `,o="",a=false;for(;!a;){let n=await M.prompt(i,{type:"text",placeholder:"acmeco bgp.tools - contact@acme.co",cancel:"null"});n===null&&(M.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),o=n;let l=E(o);l===true?a=true:M.error(l);}return o}var U="1.4.8",$=O.join(B.homedir(),".shield-base","bin");function Pe(){let e=B.platform(),i=B.arch(),o="",a="",n=".tar.gz",l=false;if(e==="darwin")o="darwin";else if(e==="linux")o="linux";else if(e==="win32")o="windows",n=".zip",l=true;else throw new Error(`Unsupported OS: ${e}`);if(i==="x64")a="amd64";else if(i==="arm64")a="arm64";else if(i==="ia32")a="386";else if(i==="arm")a="arm";else throw new Error(`Unsupported Architecture: ${i}`);return {plat:`${o}_${a}`,ext:n,isWindows:l}}async function se(){let{plat:e,ext:i,isWindows:o}=Pe(),a=o?"mmdbctl.exe":"mmdbctl",n=O.join($,a);try{return execSync("mmdbctl --help",{stdio:"ignore"}),"mmdbctl"}catch{}if(S.existsSync(n))return n;consola.warn('The required engine "mmdbctl" is missing from your system.'),await consola.prompt("Would you like Shield-Base to automatically download and configure it locally?",{type:"confirm",initial:true})||(consola.error("Cannot proceed without mmdbctl. Exiting..."),process.exit(1)),S.mkdirSync($,{recursive:true});let f=`mmdbctl_${U}_${e}`,t=`https://github.com/ipinfo/mmdbctl/releases/download/mmdbctl-${U}/${f}${i}`,c=O.join($,`${f}${i}`);consola.start(`Downloading mmdbctl v${U} for ${e}...`);try{let u=await fetch(t);if(!u.ok||!u.body)throw new Error(`Failed to fetch: ${u.statusText}`);let h=S.createWriteStream(c);await pipeline(u.body,h),consola.success("Download complete. Extracting..."),o?await $e(c,{dir:$}):await ae.x({file:c,cwd:$});let g=S.readdirSync($).find(s=>s.includes("mmdbctl")&&s!==`${f}${i}`);return g&&g!==a&&S.renameSync(O.join($,g),n),S.unlinkSync(c),o||S.chmodSync(n,493),consola.success("mmdbctl engine successfully installed locally!"),n}catch(u){consola.error("Failed to install mmdbctl automatically:",u),process.exit(1);}}var Ee="https://github.com/firehol/blocklist-ipsets",_e=fileURLToPath(import.meta.url),re=O.dirname(_e),qe={meta:{name:"shield-base",version:"1.0.0",description:"Offline IP threat intelligence & GeoIP MMDB compiler"},args:{...te},async run({args:e$1}){consola.box("Welcome to Shield-Base!");let i$1=e$1.acceptFireholRisk,o=O.join(B.homedir(),".shield-base",".cache.json"),a={};if(S.existsSync(o)){let g=await readFile(o,"utf-8");a=JSON.parse(g);}let n="";a.mmdbctlPath&&S.existsSync(a.mmdbctlPath)?n=a.mmdbctlPath:(consola.start("Verifying system dependencies..."),n=await se(),a.mmdbctlPath=n),i$1&&!a.license?(a.license=true,consola.success("FireHOL databases included in scope.")):(consola.warn(`Some data included in "Threats" and "Proxy" may include specific fields that have different types of licensing.
12
- Please check for more info: ${Ee}`),consola.info("Skipping FireHOL datasets."));let l=[],f$1=F.map(g=>g.value),t=[];if(e$1.refreshAll||e$1.refresh){consola.info("Initializing data restart...");let g=!!e$1.refreshAll,s=O.resolve(re,e$1.path??import.meta.dirname);await i(s,g);return}if(e$1.bgp&&t.push("BGP"),e$1.city&&t.push("City"),e$1.geo&&t.push("Geography"),e$1.proxy&&t.push("Proxy"),e$1.tor&&t.push("Tor"),e$1.l1&&t.push("firehol_l1"),e$1.l2&&t.push("firehol_l2"),e$1.l3&&t.push("firehol_l3"),e$1.l4&&t.push("firehol_l4"),e$1.anonymous&&t.push("firehol_anonymous"),e$1.all)consola.info("Argument --all passed. Selecting all available sources..."),l=[...f$1];else if(t.length>0)consola.info(`Specific sources selected via flags: ${t.join(", ")}`),l=t;else {let g=await consola.prompt("Choose your data",{type:"select",options:[{label:"All (Recommended)",value:"all"},{label:"Select Multiple",value:"custom"}],cancel:"null"});g===null&&(consola.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),g==="all"?l=[...f$1]:l=await consola.prompt("Select data sources to compile",{type:"multiselect",options:F.map(s=>({label:s.label,value:s.value,hint:s.hint,cancel:"null"}))});}(l.length===0||!l)&&(consola.error("No data sources selected for compilation. Exiting..."),process.exit(1)),a.selectedDataTypes=l;let c$1=e$1.contact;if(l.includes("BGP"))if(c$1){let g=E(c$1);g!==true&&(consola.error(`Invalid --contact flag provided: ${String(g)}`),process.exit(1)),a.useragent=c$1,consola.success("Valid contact info provided via --contact flag. Skipping prompt.");}else if(a.useragent)c$1=a.useragent,consola.info("Loaded BGP contact info from cache.");else {let g=await consola.prompt("BGP.tools requires contact information (User-Agent) to prevent API blocking. How would you like to proceed?",{type:"select",options:[{label:"Provide details",value:"provide"},{label:"Exclude BGP Data",value:"exclude"}],cancel:"null"});g||(consola.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),g==="provide"?(c$1=await ie(),a.useragent=c$1):(consola.info("Excluding BGP from the compilation queue..."),l=l.filter(s=>s!=="BGP"),l.length===0&&(consola.error("No data sources remaining for compilation. Exiting..."),process.exit(1)));}consola.start(`Compiling data sources: ${l.join(", ")}...`);let u=O.resolve(re,e$1.path??import.meta.dirname);if(consola.info(`Output directory mapped to: ${u}`),l.length===f$1.length)consola.start("\u{1F680} Compiling all data sources..."),await h(u,c$1??"",true,n);else {consola.info("Running partial pipeline for selected sources...");let g$1=l.filter(r=>r.startsWith("firehol_")),s=l.filter(r=>!r.startsWith("firehol_")),p=[];if(s.includes("BGP")&&p.push({name:"BGP & ASN",task:()=>b(c$1??"",u,n)}),s.includes("City")&&p.push({name:"City (Geofeed)",task:()=>c(u,n)}),s.includes("Geography")&&p.push({name:"Country (Sapics)",task:()=>e(u,n)}),s.includes("Proxy")&&p.push({name:"Proxies",task:()=>f(u,n)}),s.includes("Tor")&&p.push({name:"Tor Nodes",task:()=>d(u,n)}),g$1.length>0&&p.push({name:`Threats (${String(g$1.length)} lists)`,task:()=>g(u,n,g$1)}),e$1.parallel)consola.start(`Running ${String(p.length)} compilation jobs...`),(await Promise.allSettled(p.map(m=>m.task()))).forEach((m,y)=>{m.status==="rejected"&&consola.error(`[${p[y].name}] Failed:`,m.reason);});else {consola.start(`Running ${String(p.length)} compilation jobs sequentially...`);for(let r of p)consola.start(`Initializing ${r.name} compiler...`),await r.task(),consola.success(`${r.name} compilation complete.`);}}let b$1=O.dirname(o);S.existsSync(b$1)||S.mkdirSync(b$1,{recursive:true}),await writeFile(o,JSON.stringify(a,null,2),"utf-8"),consola.success(`\u2728 All data successfully compiled!
13
- You can view at ${u}`);}};await ee(qe);//# sourceMappingURL=cli.js.map
11
+ `,o="",a=false;for(;!a;){let n=await M.prompt(i,{type:"text",placeholder:"acmeco bgp.tools - contact@acme.co",cancel:"null"});n===null&&(M.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),o=n;let l=N(o);l===true?a=true:M.error(l);}return o}var U="1.4.8",$=E.join(B.homedir(),".shield-base","bin");function $e(){let e=B.platform(),i=B.arch(),o="",a="",n=".tar.gz",l=false;if(e==="darwin")o="darwin";else if(e==="linux")o="linux";else if(e==="win32")o="windows",n=".zip",l=true;else throw new Error(`Unsupported OS: ${e}`);if(i==="x64")a="amd64";else if(i==="arm64")a="arm64";else if(i==="ia32")a="386";else if(i==="arm")a="arm";else throw new Error(`Unsupported Architecture: ${i}`);return {plat:`${o}_${a}`,ext:n,isWindows:l}}async function se(){let{plat:e,ext:i,isWindows:o}=$e(),a=o?"mmdbctl.exe":"mmdbctl",n=E.join($,a);try{return execSync("mmdbctl --help",{stdio:"ignore"}),"mmdbctl"}catch{}if(S.existsSync(n))return n;consola.warn('The required engine "mmdbctl" is missing from your system.'),await consola.prompt("Would you like Shield-Base to automatically download and configure it locally?",{type:"confirm",initial:true})||(consola.error("Cannot proceed without mmdbctl. Exiting..."),process.exit(1)),S.mkdirSync($,{recursive:true});let f=`mmdbctl_${U}_${e}`,t=`https://github.com/ipinfo/mmdbctl/releases/download/mmdbctl-${U}/${f}${i}`,c=E.join($,`${f}${i}`);consola.start(`Downloading mmdbctl v${U} for ${e}...`);try{let u=await fetch(t);if(!u.ok||!u.body)throw new Error(`Failed to fetch: ${u.statusText}`);let h=S.createWriteStream(c);await pipeline(u.body,h),consola.success("Download complete. Extracting..."),o?await Ce(c,{dir:$}):await ae.x({file:c,cwd:$});let g=S.readdirSync($).find(s=>s.includes("mmdbctl")&&s!==`${f}${i}`);return g&&g!==a&&S.renameSync(E.join($,g),n),S.unlinkSync(c),o||S.chmodSync(n,493),consola.success("mmdbctl engine successfully installed locally!"),n}catch(u){consola.error("Failed to install mmdbctl automatically:",u),process.exit(1);}}var Le="https://github.com/firehol/blocklist-ipsets",Ne={meta:{name:"shield-base",version:"1.0.0",description:"Offline IP threat intelligence & GeoIP MMDB compiler"},args:{...te},async run({args:e$1}){consola.box("Welcome to Shield-Base!");let i$1=e$1.acceptFireholRisk,o=E.join(B.homedir(),".shield-base",".cache.json"),a={};if(S.existsSync(o)){let g=await readFile(o,"utf-8");a=JSON.parse(g);}let n="";a.mmdbctlPath&&S.existsSync(a.mmdbctlPath)?n=a.mmdbctlPath:(consola.start("Verifying system dependencies..."),n=await se(),a.mmdbctlPath=n),i$1&&!a.license?(a.license=true,consola.success("FireHOL databases included in scope.")):(consola.warn(`Some data included in "Threats" and "Proxy" may include specific fields that have different types of licensing.
12
+ Please check for more info: ${Le}`),consola.info("Skipping FireHOL datasets."));let l=[],f$1=F.map(g=>g.value),t=[];if(e$1.refreshAll||e$1.refresh){consola.info("Initializing data restart...");let g=!!e$1.refreshAll,s=E.resolve(process.cwd(),e$1.path??".");await i(s,g);return}if(e$1.bgp&&t.push("BGP"),e$1.city&&t.push("City"),e$1.geo&&t.push("Geography"),e$1.proxy&&t.push("Proxy"),e$1.tor&&t.push("Tor"),e$1.l1&&t.push("firehol_l1"),e$1.l2&&t.push("firehol_l2"),e$1.l3&&t.push("firehol_l3"),e$1.l4&&t.push("firehol_l4"),e$1.anonymous&&t.push("firehol_anonymous"),e$1.all)consola.info("Argument --all passed. Selecting all available sources..."),l=[...f$1];else if(t.length>0)consola.info(`Specific sources selected via flags: ${t.join(", ")}`),l=t;else {let g=await consola.prompt("Choose your data",{type:"select",options:[{label:"All (Recommended)",value:"all"},{label:"Select Multiple",value:"custom"}],cancel:"null"});g===null&&(consola.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),g==="all"?l=[...f$1]:l=await consola.prompt("Select data sources to compile",{type:"multiselect",options:F.map(s=>({label:s.label,value:s.value,hint:s.hint,cancel:"null"}))});}(l.length===0||!l)&&(consola.error("No data sources selected for compilation. Exiting..."),process.exit(1)),a.selectedDataTypes=l;let c$1=e$1.contact;if(l.includes("BGP"))if(c$1){let g=N(c$1);g!==true&&(consola.error(`Invalid --contact flag provided: ${String(g)}`),process.exit(1)),a.useragent=c$1,consola.success("Valid contact info provided via --contact flag. Skipping prompt.");}else if(a.useragent)c$1=a.useragent,consola.info("Loaded BGP contact info from cache.");else {let g=await consola.prompt("BGP.tools requires contact information (User-Agent) to prevent API blocking. How would you like to proceed?",{type:"select",options:[{label:"Provide details",value:"provide"},{label:"Exclude BGP Data",value:"exclude"}],cancel:"null"});g||(consola.fail("Operation cancelled. Exiting Shield-Base..."),process.exit(1)),g==="provide"?(c$1=await ie(),a.useragent=c$1):(consola.info("Excluding BGP from the compilation queue..."),l=l.filter(s=>s!=="BGP"),l.length===0&&(consola.error("No data sources remaining for compilation. Exiting..."),process.exit(1)));}consola.start(`Compiling data sources: ${l.join(", ")}...`);let u=E.resolve(process.cwd(),e$1.path??".");if(consola.info(`Output directory mapped to: ${u}`),l.length===f$1.length)consola.start("\u{1F680} Compiling all data sources..."),await h(u,c$1??"",true,n);else {consola.info("Running partial pipeline for selected sources...");let g$1=l.filter(r=>r.startsWith("firehol_")),s=l.filter(r=>!r.startsWith("firehol_")),p=[];if(s.includes("BGP")&&p.push({name:"BGP & ASN",task:()=>b(c$1??"",u,n)}),s.includes("City")&&p.push({name:"City (Geofeed)",task:()=>c(u,n)}),s.includes("Geography")&&p.push({name:"Country (Sapics)",task:()=>e(u,n)}),s.includes("Proxy")&&p.push({name:"Proxies",task:()=>f(u,n)}),s.includes("Tor")&&p.push({name:"Tor Nodes",task:()=>d(u,n)}),g$1.length>0&&p.push({name:`Threats (${String(g$1.length)} lists)`,task:()=>g(u,n,g$1)}),e$1.parallel)consola.start(`Running ${String(p.length)} compilation jobs...`),(await Promise.allSettled(p.map(m=>m.task()))).forEach((m,y)=>{m.status==="rejected"&&consola.error(`[${p[y].name}] Failed:`,m.reason);});else {consola.start(`Running ${String(p.length)} compilation jobs sequentially...`);for(let r of p)consola.start(`Initializing ${r.name} compiler...`),await r.task(),consola.success(`${r.name} compilation complete.`);}}let b$1=E.dirname(o);S.existsSync(b$1)||S.mkdirSync(b$1,{recursive:true}),await writeFile(o,JSON.stringify(a,null,2),"utf-8"),consola.success(`\u2728 All data successfully compiled!
13
+ You can view at ${u}`);}};await ee(Ne);//# sourceMappingURL=cli.js.map
14
14
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/citty/dist/_chunks/libs/scule.mjs","../node_modules/citty/dist/index.mjs","../src/utils/commands.ts","../src/utils/validateUserAgent.ts","../src/utils/userAgentInput.ts","../src/utils/mmdbctlInstaller.ts","../src/index.ts"],"names":["NUMBER_CHAR_RE","STR_SPLITTERS","isUppercase","char","splitByCase","str","separators","splitters","parts","buff","previousUpper","previousSplitter","isSplitter","isUpper","lastChar","upperFirst","lowerFirst","pascalCase","opts","p","camelCase","kebabCase","joiner","toArray","val","formatLineColumns","lines","linePrefix","maxLength","line","i","element","l","c","resolveValue","input","CLIError","message","code","parseRawArgs","args","booleans","strings","aliasMap","defaults","aliasToMain","mainToAliases","key","value","targets","target","options","getType","name","aliases","alias","allOptions","main","processedArgs","negatedFlags","arg","flagName","parsed","parseArgs$1","out","mainName","noColor","env","_c","r","t","bold","cyan","gray","underline","parseArgs","rawArgs","argsDef","parseOptions","resolveArgs","camelName","kebabName","existingAliases","positionalArguments","parsedArgsProxy","prop","nextPositionalArgument","argument","o","argDef","runCommand","cmd","cmdArgs","parsedArgs","context","result","subCommands","subCommandArgIndex","subCommandName","subCommand","resolveSubCommand","parent","showUsage","renderUsage","error","negativePrefixRe","cmdMeta","parentMeta","commandName","argLines","posLines","commandsLines","usageLine","isRequired","defaultHint","argStr","a","negativeArgStr","commandNames","sub","meta","usageLines","version","hasOptions","runMain","showUsage$1","commands","sources","isValidUserAgent","ua","nonSpace","charNotIn","nonAtOrSpace","emailPart","oneOrMore","nameOrUrlPart","exactly","createRegExp","askForUserAgent","contactInfo","isValid","consola","validationResult","VERSION","LOCAL_BIN_DIR","path","os","getTargetPlatform","platform","arch","osName","archName","ext","isWindows","ensureMmdbctl","plat","binaryName","localBinaryPath","execSync","fs","fileName","url","archivePath","response","fileStream","pipeline","extractZip","extractedBinary","f","fireholUrl","__filename","fileURLToPath","__dirname","start","includeFirehol","cacheOutput","cache","cacheedFile","readFile","mmdbPath","selectedSources","allSourceValues","s","flaggedSources","isAll","outputPath","restartData","mode","validation","bgpAction","source","output","generateData","fireholSources","standardSources","executionQueue","getBGPAndASN","buildCitiesData","getGeoDatas","getListOfProxies","getTorLists","getThreatLists","q","res","index","cacheDir","writeFile"],"mappings":"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","file":"cli.js","sourcesContent":["const NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\n\t\"-\",\n\t\"_\",\n\t\"/\",\n\t\".\"\n];\nfunction isUppercase(char = \"\") {\n\tif (NUMBER_CHAR_RE.test(char)) return;\n\treturn char !== char.toLowerCase();\n}\nfunction splitByCase(str, separators) {\n\tconst splitters = separators ?? STR_SPLITTERS;\n\tconst parts = [];\n\tif (!str || typeof str !== \"string\") return parts;\n\tlet buff = \"\";\n\tlet previousUpper;\n\tlet previousSplitter;\n\tfor (const char of str) {\n\t\tconst isSplitter = splitters.includes(char);\n\t\tif (isSplitter === true) {\n\t\t\tparts.push(buff);\n\t\t\tbuff = \"\";\n\t\t\tpreviousUpper = void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst isUpper = isUppercase(char);\n\t\tif (previousSplitter === false) {\n\t\t\tif (previousUpper === false && isUpper === true) {\n\t\t\t\tparts.push(buff);\n\t\t\t\tbuff = char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (previousUpper === true && isUpper === false && buff.length > 1) {\n\t\t\t\tconst lastChar = buff.at(-1);\n\t\t\t\tparts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n\t\t\t\tbuff = lastChar + char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tbuff += char;\n\t\tpreviousUpper = isUpper;\n\t\tpreviousSplitter = isSplitter;\n\t}\n\tparts.push(buff);\n\treturn parts;\n}\nfunction upperFirst(str) {\n\treturn str ? str[0].toUpperCase() + str.slice(1) : \"\";\n}\nfunction lowerFirst(str) {\n\treturn str ? str[0].toLowerCase() + str.slice(1) : \"\";\n}\nfunction pascalCase(str, opts) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join(\"\") : \"\";\n}\nfunction camelCase(str, opts) {\n\treturn lowerFirst(pascalCase(str || \"\", opts));\n}\nfunction kebabCase(str, joiner) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? \"-\") : \"\";\n}\nexport { kebabCase as n, camelCase as t };\n","import { n as kebabCase, t as camelCase } from \"./_chunks/libs/scule.mjs\";\nimport { parseArgs as parseArgs$1 } from \"node:util\";\nfunction toArray(val) {\n\tif (Array.isArray(val)) return val;\n\treturn val === void 0 ? [] : [val];\n}\nfunction formatLineColumns(lines, linePrefix = \"\") {\n\tconst maxLength = [];\n\tfor (const line of lines) for (const [i, element] of line.entries()) maxLength[i] = Math.max(maxLength[i] || 0, element.length);\n\treturn lines.map((l) => l.map((c, i) => linePrefix + c[i === 0 ? \"padStart\" : \"padEnd\"](maxLength[i])).join(\" \")).join(\"\\n\");\n}\nfunction resolveValue(input) {\n\treturn typeof input === \"function\" ? input() : input;\n}\nvar CLIError = class extends Error {\n\tcode;\n\tconstructor(message, code) {\n\t\tsuper(message);\n\t\tthis.name = \"CLIError\";\n\t\tthis.code = code;\n\t}\n};\nfunction parseRawArgs(args = [], opts = {}) {\n\tconst booleans = new Set(opts.boolean || []);\n\tconst strings = new Set(opts.string || []);\n\tconst aliasMap = opts.alias || {};\n\tconst defaults = opts.default || {};\n\tconst aliasToMain = /* @__PURE__ */ new Map();\n\tconst mainToAliases = /* @__PURE__ */ new Map();\n\tfor (const [key, value] of Object.entries(aliasMap)) {\n\t\tconst targets = value;\n\t\tfor (const target of targets) {\n\t\t\taliasToMain.set(key, target);\n\t\t\tif (!mainToAliases.has(target)) mainToAliases.set(target, []);\n\t\t\tmainToAliases.get(target).push(key);\n\t\t\taliasToMain.set(target, key);\n\t\t\tif (!mainToAliases.has(key)) mainToAliases.set(key, []);\n\t\t\tmainToAliases.get(key).push(target);\n\t\t}\n\t}\n\tconst options = {};\n\tfunction getType(name) {\n\t\tif (booleans.has(name)) return \"boolean\";\n\t\tconst aliases = mainToAliases.get(name) || [];\n\t\tfor (const alias of aliases) if (booleans.has(alias)) return \"boolean\";\n\t\treturn \"string\";\n\t}\n\tconst allOptions = new Set([\n\t\t...booleans,\n\t\t...strings,\n\t\t...Object.keys(aliasMap),\n\t\t...Object.values(aliasMap).flat(),\n\t\t...Object.keys(defaults)\n\t]);\n\tfor (const name of allOptions) if (!options[name]) options[name] = {\n\t\ttype: getType(name),\n\t\tdefault: defaults[name]\n\t};\n\tfor (const [alias, main] of aliasToMain.entries()) if (alias.length === 1 && options[main] && !options[main].short) options[main].short = alias;\n\tconst processedArgs = [];\n\tconst negatedFlags = {};\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i];\n\t\tif (arg === \"--\") {\n\t\t\tprocessedArgs.push(...args.slice(i));\n\t\t\tbreak;\n\t\t}\n\t\tif (arg.startsWith(\"--no-\")) {\n\t\t\tconst flagName = arg.slice(5);\n\t\t\tnegatedFlags[flagName] = true;\n\t\t\tcontinue;\n\t\t}\n\t\tprocessedArgs.push(arg);\n\t}\n\tlet parsed;\n\ttry {\n\t\tparsed = parseArgs$1({\n\t\t\targs: processedArgs,\n\t\t\toptions: Object.keys(options).length > 0 ? options : void 0,\n\t\t\tallowPositionals: true,\n\t\t\tstrict: false\n\t\t});\n\t} catch {\n\t\tparsed = {\n\t\t\tvalues: {},\n\t\t\tpositionals: processedArgs\n\t\t};\n\t}\n\tconst out = { _: [] };\n\tout._ = parsed.positionals;\n\tfor (const [key, value] of Object.entries(parsed.values)) out[key] = value;\n\tfor (const [name] of Object.entries(negatedFlags)) {\n\t\tout[name] = false;\n\t\tconst mainName = aliasToMain.get(name);\n\t\tif (mainName) out[mainName] = false;\n\t\tconst aliases = mainToAliases.get(name);\n\t\tif (aliases) for (const alias of aliases) out[alias] = false;\n\t}\n\tfor (const [alias, main] of aliasToMain.entries()) {\n\t\tif (out[alias] !== void 0 && out[main] === void 0) out[main] = out[alias];\n\t\tif (out[main] !== void 0 && out[alias] === void 0) out[alias] = out[main];\n\t}\n\treturn out;\n}\nconst noColor = /* @__PURE__ */ (() => {\n\tconst env = globalThis.process?.env ?? {};\n\treturn env.NO_COLOR === \"1\" || env.TERM === \"dumb\" || env.TEST || env.CI;\n})();\nconst _c = (c, r = 39) => (t) => noColor ? t : `\\u001B[${c}m${t}\\u001B[${r}m`;\nconst bold = /* @__PURE__ */ _c(1, 22);\nconst cyan = /* @__PURE__ */ _c(36);\nconst gray = /* @__PURE__ */ _c(90);\nconst underline = /* @__PURE__ */ _c(4, 24);\nfunction parseArgs(rawArgs, argsDef) {\n\tconst parseOptions = {\n\t\tboolean: [],\n\t\tstring: [],\n\t\talias: {},\n\t\tdefault: {}\n\t};\n\tconst args = resolveArgs(argsDef);\n\tfor (const arg of args) {\n\t\tif (arg.type === \"positional\") continue;\n\t\tif (arg.type === \"string\" || arg.type === \"enum\") parseOptions.string.push(arg.name);\n\t\telse if (arg.type === \"boolean\") parseOptions.boolean.push(arg.name);\n\t\tif (arg.default !== void 0) parseOptions.default[arg.name] = arg.default;\n\t\tif (arg.alias) parseOptions.alias[arg.name] = arg.alias;\n\t\tconst camelName = camelCase(arg.name);\n\t\tconst kebabName = kebabCase(arg.name);\n\t\tif (camelName !== arg.name || kebabName !== arg.name) {\n\t\t\tconst existingAliases = toArray(parseOptions.alias[arg.name] || []);\n\t\t\tif (camelName !== arg.name && !existingAliases.includes(camelName)) existingAliases.push(camelName);\n\t\t\tif (kebabName !== arg.name && !existingAliases.includes(kebabName)) existingAliases.push(kebabName);\n\t\t\tif (existingAliases.length > 0) parseOptions.alias[arg.name] = existingAliases;\n\t\t}\n\t}\n\tconst parsed = parseRawArgs(rawArgs, parseOptions);\n\tconst [ ...positionalArguments] = parsed._;\n\tconst parsedArgsProxy = new Proxy(parsed, { get(target, prop) {\n\t\treturn target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];\n\t} });\n\tfor (const [, arg] of args.entries()) if (arg.type === \"positional\") {\n\t\tconst nextPositionalArgument = positionalArguments.shift();\n\t\tif (nextPositionalArgument !== void 0) parsedArgsProxy[arg.name] = nextPositionalArgument;\n\t\telse if (arg.default === void 0 && arg.required !== false) throw new CLIError(`Missing required positional argument: ${arg.name.toUpperCase()}`, \"EARG\");\n\t\telse parsedArgsProxy[arg.name] = arg.default;\n\t} else if (arg.type === \"enum\") {\n\t\tconst argument = parsedArgsProxy[arg.name];\n\t\tconst options = arg.options || [];\n\t\tif (argument !== void 0 && options.length > 0 && !options.includes(argument)) throw new CLIError(`Invalid value for argument: ${cyan(`--${arg.name}`)} (${cyan(argument)}). Expected one of: ${options.map((o) => cyan(o)).join(\", \")}.`, \"EARG\");\n\t} else if (arg.required && parsedArgsProxy[arg.name] === void 0) throw new CLIError(`Missing required argument: --${arg.name}`, \"EARG\");\n\treturn parsedArgsProxy;\n}\nfunction resolveArgs(argsDef) {\n\tconst args = [];\n\tfor (const [name, argDef] of Object.entries(argsDef || {})) args.push({\n\t\t...argDef,\n\t\tname,\n\t\talias: toArray(argDef.alias)\n\t});\n\treturn args;\n}\nfunction defineCommand(def) {\n\treturn def;\n}\nasync function runCommand(cmd, opts) {\n\tconst cmdArgs = await resolveValue(cmd.args || {});\n\tconst parsedArgs = parseArgs(opts.rawArgs, cmdArgs);\n\tconst context = {\n\t\trawArgs: opts.rawArgs,\n\t\targs: parsedArgs,\n\t\tdata: opts.data,\n\t\tcmd\n\t};\n\tif (typeof cmd.setup === \"function\") await cmd.setup(context);\n\tlet result;\n\ttry {\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\t\tconst subCommandArgIndex = opts.rawArgs.findIndex((arg) => !arg.startsWith(\"-\"));\n\t\t\tconst subCommandName = opts.rawArgs[subCommandArgIndex];\n\t\t\tif (subCommandName) {\n\t\t\t\tif (!subCommands[subCommandName]) throw new CLIError(`Unknown command ${cyan(subCommandName)}`, \"E_UNKNOWN_COMMAND\");\n\t\t\t\tconst subCommand = await resolveValue(subCommands[subCommandName]);\n\t\t\t\tif (subCommand) await runCommand(subCommand, { rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1) });\n\t\t\t} else if (!cmd.run) throw new CLIError(`No command specified.`, \"E_NO_COMMAND\");\n\t\t}\n\t\tif (typeof cmd.run === \"function\") result = await cmd.run(context);\n\t} finally {\n\t\tif (typeof cmd.cleanup === \"function\") await cmd.cleanup(context);\n\t}\n\treturn { result };\n}\nasync function resolveSubCommand(cmd, rawArgs, parent) {\n\tconst subCommands = await resolveValue(cmd.subCommands);\n\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\tconst subCommandArgIndex = rawArgs.findIndex((arg) => !arg.startsWith(\"-\"));\n\t\tconst subCommandName = rawArgs[subCommandArgIndex];\n\t\tconst subCommand = await resolveValue(subCommands[subCommandName]);\n\t\tif (subCommand) return resolveSubCommand(subCommand, rawArgs.slice(subCommandArgIndex + 1), cmd);\n\t}\n\treturn [cmd, parent];\n}\nasync function showUsage(cmd, parent) {\n\ttry {\n\t\tconsole.log(await renderUsage(cmd, parent) + \"\\n\");\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n}\nconst negativePrefixRe = /^no[-A-Z]/;\nasync function renderUsage(cmd, parent) {\n\tconst cmdMeta = await resolveValue(cmd.meta || {});\n\tconst cmdArgs = resolveArgs(await resolveValue(cmd.args || {}));\n\tconst parentMeta = await resolveValue(parent?.meta || {});\n\tconst commandName = `${parentMeta.name ? `${parentMeta.name} ` : \"\"}` + (cmdMeta.name || process.argv[1]);\n\tconst argLines = [];\n\tconst posLines = [];\n\tconst commandsLines = [];\n\tconst usageLine = [];\n\tfor (const arg of cmdArgs) if (arg.type === \"positional\") {\n\t\tconst name = arg.name.toUpperCase();\n\t\tconst isRequired = arg.required !== false && arg.default === void 0;\n\t\tconst defaultHint = arg.default ? `=\"${arg.default}\"` : \"\";\n\t\tposLines.push([\n\t\t\tcyan(name + defaultHint),\n\t\t\targ.description || \"\",\n\t\t\targ.valueHint ? `<${arg.valueHint}>` : \"\"\n\t\t]);\n\t\tusageLine.push(isRequired ? `<${name}>` : `[${name}]`);\n\t} else {\n\t\tconst isRequired = arg.required === true && arg.default === void 0;\n\t\tconst argStr = [...(arg.alias || []).map((a) => `-${a}`), `--${arg.name}`].join(\", \") + (arg.type === \"string\" && (arg.valueHint || arg.default) ? `=${arg.valueHint ? `<${arg.valueHint}>` : `\"${arg.default || \"\"}\"`}` : \"\") + (arg.type === \"enum\" && arg.options ? `=<${arg.options.join(\"|\")}>` : \"\");\n\t\targLines.push([cyan(argStr + (isRequired ? \" (required)\" : \"\")), arg.description || \"\"]);\n\t\tif (arg.type === \"boolean\" && (arg.default === true || arg.negativeDescription) && !negativePrefixRe.test(arg.name)) {\n\t\t\tconst negativeArgStr = [...(arg.alias || []).map((a) => `--no-${a}`), `--no-${arg.name}`].join(\", \");\n\t\t\targLines.push([cyan(negativeArgStr + (isRequired ? \" (required)\" : \"\")), arg.negativeDescription || \"\"]);\n\t\t}\n\t\tif (isRequired) usageLine.push(argStr);\n\t}\n\tif (cmd.subCommands) {\n\t\tconst commandNames = [];\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tfor (const [name, sub] of Object.entries(subCommands)) {\n\t\t\tconst meta = await resolveValue((await resolveValue(sub))?.meta);\n\t\t\tif (meta?.hidden) continue;\n\t\t\tcommandsLines.push([cyan(name), meta?.description || \"\"]);\n\t\t\tcommandNames.push(name);\n\t\t}\n\t\tusageLine.push(commandNames.join(\"|\"));\n\t}\n\tconst usageLines = [];\n\tconst version = cmdMeta.version || parentMeta.version;\n\tusageLines.push(gray(`${cmdMeta.description} (${commandName + (version ? ` v${version}` : \"\")})`), \"\");\n\tconst hasOptions = argLines.length > 0 || posLines.length > 0;\n\tusageLines.push(`${underline(bold(\"USAGE\"))} ${cyan(`${commandName}${hasOptions ? \" [OPTIONS]\" : \"\"} ${usageLine.join(\" \")}`)}`, \"\");\n\tif (posLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"ARGUMENTS\")), \"\");\n\t\tusageLines.push(formatLineColumns(posLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (argLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"OPTIONS\")), \"\");\n\t\tusageLines.push(formatLineColumns(argLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (commandsLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"COMMANDS\")), \"\");\n\t\tusageLines.push(formatLineColumns(commandsLines, \" \"));\n\t\tusageLines.push(\"\", `Use ${cyan(`${commandName} <command> --help`)} for more information about a command.`);\n\t}\n\treturn usageLines.filter((l) => typeof l === \"string\").join(\"\\n\");\n}\nasync function runMain(cmd, opts = {}) {\n\tconst rawArgs = opts.rawArgs || process.argv.slice(2);\n\tconst showUsage$1 = opts.showUsage || showUsage;\n\ttry {\n\t\tif (rawArgs.includes(\"--help\") || rawArgs.includes(\"-h\")) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tprocess.exit(0);\n\t\t} else if (rawArgs.length === 1 && rawArgs[0] === \"--version\") {\n\t\t\tconst meta = typeof cmd.meta === \"function\" ? await cmd.meta() : await cmd.meta;\n\t\t\tif (!meta?.version) throw new CLIError(\"No version specified\", \"E_NO_VERSION\");\n\t\t\tconsole.log(meta.version);\n\t\t} else await runCommand(cmd, { rawArgs });\n\t} catch (error) {\n\t\tif (error instanceof CLIError) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tconsole.error(error.message);\n\t\t} else console.error(error, \"\\n\");\n\t\tprocess.exit(1);\n\t}\n}\nfunction createMain(cmd) {\n\treturn (opts = {}) => runMain(cmd, opts);\n}\nexport { createMain, defineCommand, parseArgs, renderUsage, runCommand, runMain, showUsage };\n","export const commands = {\n acceptFireholRisk: {\n type: 'boolean',\n description: 'Acknowledge of FireHOL',\n required: false,\n },\n\n all: {\n type: 'boolean',\n description: 'Skip interactive selection and fetch all available sources.',\n required: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Force re download and re compilation of data sources.',\n required: false,\n },\n\n refreshAll: {\n type: 'boolean',\n description: 'Force re download and re compilation of all data sources using cached config.',\n required: false,\n },\n\n parallel: { type: 'boolean', description: 'Run compilation tasks concurrently.', required: false },\n contact: { type: 'string', description: 'Provide User-Agent contact info to bypass the interactive BGP prompt', required: false },\n path: { type: 'string', description: 'Path for for the databases to be compiled into.', required: false },\n bgp: { type: 'boolean', description: 'Compile BGP data', required: false },\n city: { type: 'boolean', description: 'Compile City data', required: false },\n geo: { type: 'boolean', description: 'Compile Geography data', required: false },\n proxy: { type: 'boolean', description: 'Compile Proxy data', required: false },\n tor: { type: 'boolean', description: 'Compile Tor data', required: false },\n l1: { type: 'boolean', description: 'Compile FireHOL Level 1', required: false },\n l2: { type: 'boolean', description: 'Compile FireHOL Level 2', required: false },\n l3: { type: 'boolean', description: 'Compile FireHOL Level 3', required: false },\n l4: { type: 'boolean', description: 'Compile FireHOL Level 4', required: false },\n anonymous: { \n type: 'boolean', \n description: 'Compile FireHOL Anonymous network list', \n required: false \n }\n } as const\n;\nexport const sources = [\n { label: 'BGP', value: 'BGP', hint: '🌐 Autonomous System numbers and prefix data' },\n { label: 'City', value: 'City', hint: '🏙️ IP to City geolocation data' },\n { label: 'Geography', value: 'Geography', hint: '🌍 Country and continent information' },\n { label: 'Proxy', value: 'Proxy', hint: 'Anonymous Proxy and VPN detection lists' },\n { label: 'Tor', value: 'Tor', hint: 'The Onion Router exit node IP lists, and more' },\n { label: 'FireHOL Level 1', value: 'firehol_l1', hint: 'Maximum protection, minimum false positives' },\n { label: 'FireHOL Level 2', value: 'firehol_l2', hint: 'Tracking attacks last 48h, includes dynamic IPs' },\n { label: 'FireHOL Level 3', value: 'firehol_l3', hint: 'Attacks, spyware, and viruses tracked last 30 days' },\n { label: 'FireHOL Level 4', value: 'firehol_l4', hint: 'Aggressive tracking, higher false positive risk' },\n { label: 'Anonymous', value: 'firehol_anonymous', hint: 'Tor exit nodes, I2P, VPNS, and other anonymity network relays' }\n ] as const;\n","import { exactly, createRegExp, charNotIn, oneOrMore } from \"magic-regexp\";\n\nexport function isValidUserAgent(ua: string): boolean | string {\n if (!ua || ua.trim() === '') return \"User agent is required\";\n\n const nonSpace = charNotIn(\" \");\n const nonAtOrSpace = charNotIn(\" @\");\n \n\n const emailPart = oneOrMore(nonAtOrSpace)\n .and(\"@\")\n .and(oneOrMore(nonAtOrSpace))\n .and(\".\")\n .and(oneOrMore(nonAtOrSpace));\n\n\n const nameOrUrlPart = oneOrMore(nonSpace)\n .and(\n oneOrMore(\n exactly(\" \").and(oneOrMore(nonSpace))\n ).optionally()\n );\n\n const regex = createRegExp(\n nameOrUrlPart\n .and(exactly(\" - \"))\n .and(emailPart)\n .at.lineStart()\n .at.lineEnd()\n );\n\n if (regex.test(ua)) {\n return true;\n }\n\n return \"Invalid format. Expected: '<name> [url] - <email>' (e.g., 'acmeco bgp.tools - contact@acme.co')\";\n}","import consola from \"consola\";\nimport { isValidUserAgent } from \"./validateUserAgent.js\";\n\n\nexport async function askForUserAgent(): Promise<string> {\n const bgpTools = 'https://bgp.tools/kb/api';\n const message = `To avoid getting blocked, bgp.tools requires contact information to reach you in case something went wrong.\n This data will be included in the user agent header each time you get data from them.\n More information is available at: ${bgpTools}.\\n\n Required format: '<your-name or company> <optional site url> - <Your email address>'\\n`;\n\n let contactInfo = '';\n let isValid = false;\n\n while (!isValid) {\n const input = await consola.prompt(message, {\n type: 'text',\n placeholder: 'acmeco bgp.tools - contact@acme.co',\n cancel: 'null' \n });\n\n if (input === null) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n contactInfo = input;\n const validationResult = isValidUserAgent(contactInfo);\n \n if (validationResult === true) {\n isValid = true;\n } else {\n consola.error(validationResult); \n }\n }\n\n return contactInfo;\n};","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { pipeline } from 'node:stream/promises';\nimport { consola } from 'consola';\nimport { execSync } from 'node:child_process';\nimport * as tar from 'tar';\nimport extractZip from 'extract-zip';\n\nconst VERSION = '1.4.8';\nconst LOCAL_BIN_DIR = path.join(os.homedir(), '.shield-base', 'bin');\n\nfunction getTargetPlatform(): { plat: string; ext: string; isWindows: boolean } {\n const platform = os.platform();\n const arch = os.arch();\n\n let osName = '';\n let archName = '';\n let ext = '.tar.gz';\n let isWindows = false;\n\n if (platform === 'darwin') osName = 'darwin';\n else if (platform === 'linux') osName = 'linux';\n else if (platform === 'win32') {\n osName = 'windows';\n ext = '.zip';\n isWindows = true;\n } else throw new Error(`Unsupported OS: ${platform}`);\n\n if (arch === 'x64') archName = 'amd64';\n else if (arch === 'arm64') archName = 'arm64';\n else if (arch === 'ia32') archName = '386';\n else if (arch === 'arm') archName = 'arm';\n else throw new Error(`Unsupported Architecture: ${arch}`);\n\n return { plat: `${osName}_${archName}`, ext, isWindows };\n}\n\n\nexport async function ensureMmdbctl(): Promise<string> {\n const { plat, ext, isWindows } = getTargetPlatform();\n const binaryName = isWindows ? 'mmdbctl.exe' : 'mmdbctl';\n const localBinaryPath = path.join(LOCAL_BIN_DIR, binaryName);\n\n try {\n execSync('mmdbctl --help', { stdio: 'ignore' });\n return 'mmdbctl';\n } catch {\n \n }\n\n if (fs.existsSync(localBinaryPath)) {\n return localBinaryPath;\n }\n\n consola.warn('The required engine \"mmdbctl\" is missing from your system.');\n const consent = await consola.prompt(\n 'Would you like Shield-Base to automatically download and configure it locally?', \n { type: 'confirm', initial: true }\n );\n\n if (!consent) {\n consola.error('Cannot proceed without mmdbctl. Exiting...');\n process.exit(1);\n }\n\n fs.mkdirSync(LOCAL_BIN_DIR, { recursive: true });\n \n const fileName = `mmdbctl_${VERSION}_${plat}`;\n const url = `https://github.com/ipinfo/mmdbctl/releases/download/mmdbctl-${VERSION}/${fileName}${ext}`;\n const archivePath = path.join(LOCAL_BIN_DIR, `${fileName}${ext}`);\n\n consola.start(`Downloading mmdbctl v${VERSION} for ${plat}...`);\n \n try {\n const response = await fetch(url);\n if (!response.ok || !response.body) throw new Error(`Failed to fetch: ${response.statusText}`);\n \n const fileStream = fs.createWriteStream(archivePath);\n await pipeline(response.body, fileStream);\n consola.success('Download complete. Extracting...');\n\n if (isWindows) {\n await extractZip(archivePath, { dir: LOCAL_BIN_DIR });\n } else {\n await tar.x({\n file: archivePath,\n cwd: LOCAL_BIN_DIR\n });\n }\n\n\n const extractedFiles = fs.readdirSync(LOCAL_BIN_DIR);\n const extractedBinary = extractedFiles.find(f => f.includes('mmdbctl') && f !== `${fileName}${ext}`);\n\n if (extractedBinary && extractedBinary !== binaryName) {\n fs.renameSync(\n path.join(LOCAL_BIN_DIR, extractedBinary), \n localBinaryPath\n );\n }\n\n fs.unlinkSync(archivePath);\n \n if (!isWindows) {\n fs.chmodSync(localBinaryPath, 0o755);\n }\n\n consola.success('mmdbctl engine successfully installed locally!');\n return localBinaryPath;\n\n } catch (error) {\n consola.error('Failed to install mmdbctl automatically:', error);\n process.exit(1);\n }\n}","#!/usr/bin/env node\nimport { defineCommand, runMain } from 'citty';\nimport { consola } from 'consola';\nimport { commands, sources } from './utils/commands.js';\nimport { askForUserAgent } from './utils/userAgentInput.js';\nimport { isValidUserAgent } from \"./utils/validateUserAgent.js\";\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { \n getBGPAndASN,\n buildCitiesData,\n generateData as executeAll,\n getGeoDatas,\n getListOfProxies,\n getThreatLists,\n getTorLists\n} from './scripts/index.js';\nimport { ensureMmdbctl } from './utils/mmdbctlInstaller.js';\nimport type { InputCache } from './types/input.js';\nimport fs from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport { restartData } from './utils/restart.js';\n\nconst fireholUrl = 'https://github.com/firehol/blocklist-ipsets';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst start = defineCommand({\n meta: {\n name: 'shield-base',\n version: '1.0.0',\n description: 'Offline IP threat intelligence & GeoIP MMDB compiler',\n },\n\n args: {\n ...commands\n },\n \nasync run({ args }) {\n consola.box('Welcome to Shield-Base!');\n\n\n const includeFirehol = args.acceptFireholRisk;\n\n const cacheOutput = path.join(os.homedir(), '.shield-base', '.cache.json');\n let cache: Partial<InputCache> = {};\n\n if (fs.existsSync(cacheOutput)) { \n const cacheedFile = await readFile(cacheOutput, 'utf-8');\n cache = JSON.parse(cacheedFile) as InputCache;\n }\n\n let mmdbPath = '';\n if (cache.mmdbctlPath && fs.existsSync(cache.mmdbctlPath)) {\n mmdbPath = cache.mmdbctlPath;\n } else {\n consola.start('Verifying system dependencies...');\n mmdbPath = await ensureMmdbctl();\n cache.mmdbctlPath = mmdbPath;\n }\n\n\n if (includeFirehol && !cache.license) {\n cache.license = true;\n consola.success('FireHOL databases included in scope.');\n } else {\n consola.warn(`Some data included in \"Threats\" and \"Proxy\" may include specific fields that have different types of licensing.\\nPlease check for more info: ${fireholUrl}`);\n consola.info('Skipping FireHOL datasets.');\n }\n\n type Source = typeof sources[number]['value'];\n let selectedSources: Source[] = [];\n const allSourceValues = sources.map(s => s.value);\n\n const flaggedSources: Source[] = [];\n\n if (args.refreshAll || args.refresh) {\n consola.info('Initializing data restart...');\n const isAll = !!args.refreshAll;\n const outputPath = path.resolve(__dirname, args.path ?? import.meta.dirname);\n \n await restartData(outputPath, isAll);\n return;\n }\n \n if (args.bgp) flaggedSources.push('BGP');\n if (args.city) flaggedSources.push('City');\n if (args.geo) flaggedSources.push('Geography');\n if (args.proxy) flaggedSources.push('Proxy');\n if (args.tor) flaggedSources.push('Tor');\n if (args.l1) flaggedSources.push('firehol_l1');\n if (args.l2) flaggedSources.push('firehol_l2');\n if (args.l3) flaggedSources.push('firehol_l3');\n if (args.l4) flaggedSources.push('firehol_l4');\n if (args.anonymous) flaggedSources.push('firehol_anonymous');\n \n if (args.all) {\n consola.info('Argument --all passed. Selecting all available sources...');\n selectedSources = [...allSourceValues];\n } else if (flaggedSources.length > 0) {\n consola.info(`Specific sources selected via flags: ${flaggedSources.join(', ')}`);\n selectedSources = flaggedSources;\n } else {\n const mode = await consola.prompt('Choose your data', {\n type: 'select',\n options: [\n { label: 'All (Recommended)', value: 'all' },\n { label: 'Select Multiple', value: 'custom' }\n ],\n cancel: 'null' \n });\n\n if (mode === null) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n if (mode === 'all') {\n selectedSources = [...allSourceValues];\n } else {\n selectedSources = await consola.prompt('Select data sources to compile', {\n type: 'multiselect',\n options: sources.map(s => ({\n label: s.label,\n value: s.value,\n hint: s.hint,\n cancel: 'null'\n }))\n }) as unknown as Source[];\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (selectedSources.length === 0 || !selectedSources) {\n consola.error('No data sources selected for compilation. Exiting...');\n process.exit(1);\n }\n\n cache.selectedDataTypes = selectedSources;\n let contactInfo = args.contact;\n\nif (selectedSources.includes('BGP')) {\n if (contactInfo) {\n const validation = isValidUserAgent(contactInfo);\n if (validation !== true) {\n consola.error(`Invalid --contact flag provided: ${String(validation)}`);\n process.exit(1);\n }\n cache.useragent = contactInfo;\n consola.success('Valid contact info provided via --contact flag. Skipping prompt.');\n } else if (cache.useragent) {\n contactInfo = cache.useragent;\n consola.info('Loaded BGP contact info from cache.');\n } else {\n const bgpAction = await consola.prompt(\n 'BGP.tools requires contact information (User-Agent) to prevent API blocking. How would you like to proceed?',\n {\n type: 'select',\n options: [\n { label: 'Provide details', value: 'provide' },\n { label: 'Exclude BGP Data', value: 'exclude' }\n ],\n cancel: 'null'\n }\n );\n\n if (!bgpAction) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n if (bgpAction === 'provide') {\n contactInfo = await askForUserAgent();\n cache.useragent = contactInfo;\n } else {\n consola.info('Excluding BGP from the compilation queue...');\n selectedSources = selectedSources.filter(source => source !== 'BGP');\n \n if (selectedSources.length === 0) {\n consola.error('No data sources remaining for compilation. Exiting...');\n process.exit(1);\n }\n }\n }\n }\n\n\n consola.start(`Compiling data sources: ${selectedSources.join(', ')}...`);\n const output = path.resolve(__dirname, args.path ?? import.meta.dirname);\n consola.info(`Output directory mapped to: ${output}`);\n const isRunningAll = selectedSources.length === allSourceValues.length;\n if (isRunningAll) {\n consola.start('🚀 Compiling all data sources...');\n await executeAll(output, contactInfo ?? '', true, mmdbPath);\n } else {\n\n consola.info('Running partial pipeline for selected sources...');\n \n const fireholSources = selectedSources.filter(s => s.startsWith('firehol_'));\n const standardSources = selectedSources.filter(s => !s.startsWith('firehol_'));\n\n const executionQueue: { name: string, task: () => Promise<void> }[] = [];\n\n if (standardSources.includes('BGP')) {\n executionQueue.push({ name: 'BGP & ASN', task: () => getBGPAndASN(contactInfo ?? '', output, mmdbPath) });\n }\n if (standardSources.includes('City')) {\n executionQueue.push({ name: 'City (Geofeed)', task: () => buildCitiesData(output, mmdbPath) });\n }\n if (standardSources.includes('Geography')) {\n executionQueue.push({ name: 'Country (Sapics)', task: () => getGeoDatas(output, mmdbPath) });\n }\n if (standardSources.includes('Proxy')) {\n executionQueue.push({ name: 'Proxies', task: () => getListOfProxies(output, mmdbPath) });\n }\n if (standardSources.includes('Tor')) {\n executionQueue.push({ name: 'Tor Nodes', task: () => getTorLists(output, mmdbPath) });\n }\n if (fireholSources.length > 0) {\n executionQueue.push({ name: `Threats (${String(fireholSources.length)} lists)`, task: () => getThreatLists(output, mmdbPath, fireholSources) });\n }\n\n if (args.parallel) {\n consola.start(`Running ${String(executionQueue.length)} compilation jobs...`);\n const results = await Promise.allSettled(executionQueue.map(q => q.task()));\n \n results.forEach((res, index) => {\n if (res.status === 'rejected') {\n consola.error(`[${executionQueue[index].name}] Failed:`, res.reason);\n }\n });\n } else {\n consola.start(`Running ${String(executionQueue.length)} compilation jobs sequentially...`);\n for (const q of executionQueue) {\n consola.start(`Initializing ${q.name} compiler...`);\n await q.task();\n consola.success(`${q.name} compilation complete.`);\n }\n }\n }\n\n\n const cacheDir = path.dirname(cacheOutput);\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n\n await writeFile(cacheOutput, JSON.stringify(cache, null, 2), 'utf-8');\n\n consola.success(`✨ All data successfully compiled!\\n You can view at ${output}`);\n}\n});\n\nawait runMain(start);"]}
1
+ {"version":3,"sources":["../node_modules/citty/dist/_chunks/libs/scule.mjs","../node_modules/citty/dist/index.mjs","../src/utils/commands.ts","../src/utils/validateUserAgent.ts","../src/utils/userAgentInput.ts","../src/utils/mmdbctlInstaller.ts","../src/index.ts"],"names":["NUMBER_CHAR_RE","STR_SPLITTERS","isUppercase","char","splitByCase","str","separators","splitters","parts","buff","previousUpper","previousSplitter","isSplitter","isUpper","lastChar","upperFirst","lowerFirst","pascalCase","opts","p","camelCase","kebabCase","joiner","toArray","val","formatLineColumns","lines","linePrefix","maxLength","line","i","element","l","c","resolveValue","input","CLIError","message","code","parseRawArgs","args","booleans","strings","aliasMap","defaults","aliasToMain","mainToAliases","key","value","targets","target","options","getType","name","aliases","alias","allOptions","main","processedArgs","negatedFlags","arg","flagName","parsed","parseArgs$1","out","mainName","noColor","env","_c","r","t","bold","cyan","gray","underline","parseArgs","rawArgs","argsDef","parseOptions","resolveArgs","camelName","kebabName","existingAliases","positionalArguments","parsedArgsProxy","prop","nextPositionalArgument","argument","o","argDef","runCommand","cmd","cmdArgs","parsedArgs","context","result","subCommands","subCommandArgIndex","subCommandName","subCommand","resolveSubCommand","parent","showUsage","renderUsage","error","negativePrefixRe","cmdMeta","parentMeta","commandName","argLines","posLines","commandsLines","usageLine","isRequired","defaultHint","argStr","a","negativeArgStr","commandNames","sub","meta","usageLines","version","hasOptions","runMain","showUsage$1","commands","sources","isValidUserAgent","ua","nonSpace","charNotIn","nonAtOrSpace","emailPart","oneOrMore","nameOrUrlPart","exactly","createRegExp","askForUserAgent","contactInfo","isValid","consola","validationResult","VERSION","LOCAL_BIN_DIR","path","os","getTargetPlatform","platform","arch","osName","archName","ext","isWindows","ensureMmdbctl","plat","binaryName","localBinaryPath","execSync","fs","fileName","url","archivePath","response","fileStream","pipeline","extractZip","extractedBinary","f","fireholUrl","start","includeFirehol","cacheOutput","cache","cacheedFile","readFile","mmdbPath","selectedSources","allSourceValues","s","flaggedSources","isAll","outputPath","restartData","mode","validation","bgpAction","source","output","generateData","fireholSources","standardSources","executionQueue","getBGPAndASN","buildCitiesData","getGeoDatas","getListOfProxies","getTorLists","getThreatLists","q","res","index","cacheDir","writeFile"],"mappings":"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","file":"cli.js","sourcesContent":["const NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\n\t\"-\",\n\t\"_\",\n\t\"/\",\n\t\".\"\n];\nfunction isUppercase(char = \"\") {\n\tif (NUMBER_CHAR_RE.test(char)) return;\n\treturn char !== char.toLowerCase();\n}\nfunction splitByCase(str, separators) {\n\tconst splitters = separators ?? STR_SPLITTERS;\n\tconst parts = [];\n\tif (!str || typeof str !== \"string\") return parts;\n\tlet buff = \"\";\n\tlet previousUpper;\n\tlet previousSplitter;\n\tfor (const char of str) {\n\t\tconst isSplitter = splitters.includes(char);\n\t\tif (isSplitter === true) {\n\t\t\tparts.push(buff);\n\t\t\tbuff = \"\";\n\t\t\tpreviousUpper = void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst isUpper = isUppercase(char);\n\t\tif (previousSplitter === false) {\n\t\t\tif (previousUpper === false && isUpper === true) {\n\t\t\t\tparts.push(buff);\n\t\t\t\tbuff = char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (previousUpper === true && isUpper === false && buff.length > 1) {\n\t\t\t\tconst lastChar = buff.at(-1);\n\t\t\t\tparts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n\t\t\t\tbuff = lastChar + char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tbuff += char;\n\t\tpreviousUpper = isUpper;\n\t\tpreviousSplitter = isSplitter;\n\t}\n\tparts.push(buff);\n\treturn parts;\n}\nfunction upperFirst(str) {\n\treturn str ? str[0].toUpperCase() + str.slice(1) : \"\";\n}\nfunction lowerFirst(str) {\n\treturn str ? str[0].toLowerCase() + str.slice(1) : \"\";\n}\nfunction pascalCase(str, opts) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join(\"\") : \"\";\n}\nfunction camelCase(str, opts) {\n\treturn lowerFirst(pascalCase(str || \"\", opts));\n}\nfunction kebabCase(str, joiner) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? \"-\") : \"\";\n}\nexport { kebabCase as n, camelCase as t };\n","import { n as kebabCase, t as camelCase } from \"./_chunks/libs/scule.mjs\";\nimport { parseArgs as parseArgs$1 } from \"node:util\";\nfunction toArray(val) {\n\tif (Array.isArray(val)) return val;\n\treturn val === void 0 ? [] : [val];\n}\nfunction formatLineColumns(lines, linePrefix = \"\") {\n\tconst maxLength = [];\n\tfor (const line of lines) for (const [i, element] of line.entries()) maxLength[i] = Math.max(maxLength[i] || 0, element.length);\n\treturn lines.map((l) => l.map((c, i) => linePrefix + c[i === 0 ? \"padStart\" : \"padEnd\"](maxLength[i])).join(\" \")).join(\"\\n\");\n}\nfunction resolveValue(input) {\n\treturn typeof input === \"function\" ? input() : input;\n}\nvar CLIError = class extends Error {\n\tcode;\n\tconstructor(message, code) {\n\t\tsuper(message);\n\t\tthis.name = \"CLIError\";\n\t\tthis.code = code;\n\t}\n};\nfunction parseRawArgs(args = [], opts = {}) {\n\tconst booleans = new Set(opts.boolean || []);\n\tconst strings = new Set(opts.string || []);\n\tconst aliasMap = opts.alias || {};\n\tconst defaults = opts.default || {};\n\tconst aliasToMain = /* @__PURE__ */ new Map();\n\tconst mainToAliases = /* @__PURE__ */ new Map();\n\tfor (const [key, value] of Object.entries(aliasMap)) {\n\t\tconst targets = value;\n\t\tfor (const target of targets) {\n\t\t\taliasToMain.set(key, target);\n\t\t\tif (!mainToAliases.has(target)) mainToAliases.set(target, []);\n\t\t\tmainToAliases.get(target).push(key);\n\t\t\taliasToMain.set(target, key);\n\t\t\tif (!mainToAliases.has(key)) mainToAliases.set(key, []);\n\t\t\tmainToAliases.get(key).push(target);\n\t\t}\n\t}\n\tconst options = {};\n\tfunction getType(name) {\n\t\tif (booleans.has(name)) return \"boolean\";\n\t\tconst aliases = mainToAliases.get(name) || [];\n\t\tfor (const alias of aliases) if (booleans.has(alias)) return \"boolean\";\n\t\treturn \"string\";\n\t}\n\tconst allOptions = new Set([\n\t\t...booleans,\n\t\t...strings,\n\t\t...Object.keys(aliasMap),\n\t\t...Object.values(aliasMap).flat(),\n\t\t...Object.keys(defaults)\n\t]);\n\tfor (const name of allOptions) if (!options[name]) options[name] = {\n\t\ttype: getType(name),\n\t\tdefault: defaults[name]\n\t};\n\tfor (const [alias, main] of aliasToMain.entries()) if (alias.length === 1 && options[main] && !options[main].short) options[main].short = alias;\n\tconst processedArgs = [];\n\tconst negatedFlags = {};\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i];\n\t\tif (arg === \"--\") {\n\t\t\tprocessedArgs.push(...args.slice(i));\n\t\t\tbreak;\n\t\t}\n\t\tif (arg.startsWith(\"--no-\")) {\n\t\t\tconst flagName = arg.slice(5);\n\t\t\tnegatedFlags[flagName] = true;\n\t\t\tcontinue;\n\t\t}\n\t\tprocessedArgs.push(arg);\n\t}\n\tlet parsed;\n\ttry {\n\t\tparsed = parseArgs$1({\n\t\t\targs: processedArgs,\n\t\t\toptions: Object.keys(options).length > 0 ? options : void 0,\n\t\t\tallowPositionals: true,\n\t\t\tstrict: false\n\t\t});\n\t} catch {\n\t\tparsed = {\n\t\t\tvalues: {},\n\t\t\tpositionals: processedArgs\n\t\t};\n\t}\n\tconst out = { _: [] };\n\tout._ = parsed.positionals;\n\tfor (const [key, value] of Object.entries(parsed.values)) out[key] = value;\n\tfor (const [name] of Object.entries(negatedFlags)) {\n\t\tout[name] = false;\n\t\tconst mainName = aliasToMain.get(name);\n\t\tif (mainName) out[mainName] = false;\n\t\tconst aliases = mainToAliases.get(name);\n\t\tif (aliases) for (const alias of aliases) out[alias] = false;\n\t}\n\tfor (const [alias, main] of aliasToMain.entries()) {\n\t\tif (out[alias] !== void 0 && out[main] === void 0) out[main] = out[alias];\n\t\tif (out[main] !== void 0 && out[alias] === void 0) out[alias] = out[main];\n\t}\n\treturn out;\n}\nconst noColor = /* @__PURE__ */ (() => {\n\tconst env = globalThis.process?.env ?? {};\n\treturn env.NO_COLOR === \"1\" || env.TERM === \"dumb\" || env.TEST || env.CI;\n})();\nconst _c = (c, r = 39) => (t) => noColor ? t : `\\u001B[${c}m${t}\\u001B[${r}m`;\nconst bold = /* @__PURE__ */ _c(1, 22);\nconst cyan = /* @__PURE__ */ _c(36);\nconst gray = /* @__PURE__ */ _c(90);\nconst underline = /* @__PURE__ */ _c(4, 24);\nfunction parseArgs(rawArgs, argsDef) {\n\tconst parseOptions = {\n\t\tboolean: [],\n\t\tstring: [],\n\t\talias: {},\n\t\tdefault: {}\n\t};\n\tconst args = resolveArgs(argsDef);\n\tfor (const arg of args) {\n\t\tif (arg.type === \"positional\") continue;\n\t\tif (arg.type === \"string\" || arg.type === \"enum\") parseOptions.string.push(arg.name);\n\t\telse if (arg.type === \"boolean\") parseOptions.boolean.push(arg.name);\n\t\tif (arg.default !== void 0) parseOptions.default[arg.name] = arg.default;\n\t\tif (arg.alias) parseOptions.alias[arg.name] = arg.alias;\n\t\tconst camelName = camelCase(arg.name);\n\t\tconst kebabName = kebabCase(arg.name);\n\t\tif (camelName !== arg.name || kebabName !== arg.name) {\n\t\t\tconst existingAliases = toArray(parseOptions.alias[arg.name] || []);\n\t\t\tif (camelName !== arg.name && !existingAliases.includes(camelName)) existingAliases.push(camelName);\n\t\t\tif (kebabName !== arg.name && !existingAliases.includes(kebabName)) existingAliases.push(kebabName);\n\t\t\tif (existingAliases.length > 0) parseOptions.alias[arg.name] = existingAliases;\n\t\t}\n\t}\n\tconst parsed = parseRawArgs(rawArgs, parseOptions);\n\tconst [ ...positionalArguments] = parsed._;\n\tconst parsedArgsProxy = new Proxy(parsed, { get(target, prop) {\n\t\treturn target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];\n\t} });\n\tfor (const [, arg] of args.entries()) if (arg.type === \"positional\") {\n\t\tconst nextPositionalArgument = positionalArguments.shift();\n\t\tif (nextPositionalArgument !== void 0) parsedArgsProxy[arg.name] = nextPositionalArgument;\n\t\telse if (arg.default === void 0 && arg.required !== false) throw new CLIError(`Missing required positional argument: ${arg.name.toUpperCase()}`, \"EARG\");\n\t\telse parsedArgsProxy[arg.name] = arg.default;\n\t} else if (arg.type === \"enum\") {\n\t\tconst argument = parsedArgsProxy[arg.name];\n\t\tconst options = arg.options || [];\n\t\tif (argument !== void 0 && options.length > 0 && !options.includes(argument)) throw new CLIError(`Invalid value for argument: ${cyan(`--${arg.name}`)} (${cyan(argument)}). Expected one of: ${options.map((o) => cyan(o)).join(\", \")}.`, \"EARG\");\n\t} else if (arg.required && parsedArgsProxy[arg.name] === void 0) throw new CLIError(`Missing required argument: --${arg.name}`, \"EARG\");\n\treturn parsedArgsProxy;\n}\nfunction resolveArgs(argsDef) {\n\tconst args = [];\n\tfor (const [name, argDef] of Object.entries(argsDef || {})) args.push({\n\t\t...argDef,\n\t\tname,\n\t\talias: toArray(argDef.alias)\n\t});\n\treturn args;\n}\nfunction defineCommand(def) {\n\treturn def;\n}\nasync function runCommand(cmd, opts) {\n\tconst cmdArgs = await resolveValue(cmd.args || {});\n\tconst parsedArgs = parseArgs(opts.rawArgs, cmdArgs);\n\tconst context = {\n\t\trawArgs: opts.rawArgs,\n\t\targs: parsedArgs,\n\t\tdata: opts.data,\n\t\tcmd\n\t};\n\tif (typeof cmd.setup === \"function\") await cmd.setup(context);\n\tlet result;\n\ttry {\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\t\tconst subCommandArgIndex = opts.rawArgs.findIndex((arg) => !arg.startsWith(\"-\"));\n\t\t\tconst subCommandName = opts.rawArgs[subCommandArgIndex];\n\t\t\tif (subCommandName) {\n\t\t\t\tif (!subCommands[subCommandName]) throw new CLIError(`Unknown command ${cyan(subCommandName)}`, \"E_UNKNOWN_COMMAND\");\n\t\t\t\tconst subCommand = await resolveValue(subCommands[subCommandName]);\n\t\t\t\tif (subCommand) await runCommand(subCommand, { rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1) });\n\t\t\t} else if (!cmd.run) throw new CLIError(`No command specified.`, \"E_NO_COMMAND\");\n\t\t}\n\t\tif (typeof cmd.run === \"function\") result = await cmd.run(context);\n\t} finally {\n\t\tif (typeof cmd.cleanup === \"function\") await cmd.cleanup(context);\n\t}\n\treturn { result };\n}\nasync function resolveSubCommand(cmd, rawArgs, parent) {\n\tconst subCommands = await resolveValue(cmd.subCommands);\n\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\tconst subCommandArgIndex = rawArgs.findIndex((arg) => !arg.startsWith(\"-\"));\n\t\tconst subCommandName = rawArgs[subCommandArgIndex];\n\t\tconst subCommand = await resolveValue(subCommands[subCommandName]);\n\t\tif (subCommand) return resolveSubCommand(subCommand, rawArgs.slice(subCommandArgIndex + 1), cmd);\n\t}\n\treturn [cmd, parent];\n}\nasync function showUsage(cmd, parent) {\n\ttry {\n\t\tconsole.log(await renderUsage(cmd, parent) + \"\\n\");\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n}\nconst negativePrefixRe = /^no[-A-Z]/;\nasync function renderUsage(cmd, parent) {\n\tconst cmdMeta = await resolveValue(cmd.meta || {});\n\tconst cmdArgs = resolveArgs(await resolveValue(cmd.args || {}));\n\tconst parentMeta = await resolveValue(parent?.meta || {});\n\tconst commandName = `${parentMeta.name ? `${parentMeta.name} ` : \"\"}` + (cmdMeta.name || process.argv[1]);\n\tconst argLines = [];\n\tconst posLines = [];\n\tconst commandsLines = [];\n\tconst usageLine = [];\n\tfor (const arg of cmdArgs) if (arg.type === \"positional\") {\n\t\tconst name = arg.name.toUpperCase();\n\t\tconst isRequired = arg.required !== false && arg.default === void 0;\n\t\tconst defaultHint = arg.default ? `=\"${arg.default}\"` : \"\";\n\t\tposLines.push([\n\t\t\tcyan(name + defaultHint),\n\t\t\targ.description || \"\",\n\t\t\targ.valueHint ? `<${arg.valueHint}>` : \"\"\n\t\t]);\n\t\tusageLine.push(isRequired ? `<${name}>` : `[${name}]`);\n\t} else {\n\t\tconst isRequired = arg.required === true && arg.default === void 0;\n\t\tconst argStr = [...(arg.alias || []).map((a) => `-${a}`), `--${arg.name}`].join(\", \") + (arg.type === \"string\" && (arg.valueHint || arg.default) ? `=${arg.valueHint ? `<${arg.valueHint}>` : `\"${arg.default || \"\"}\"`}` : \"\") + (arg.type === \"enum\" && arg.options ? `=<${arg.options.join(\"|\")}>` : \"\");\n\t\targLines.push([cyan(argStr + (isRequired ? \" (required)\" : \"\")), arg.description || \"\"]);\n\t\tif (arg.type === \"boolean\" && (arg.default === true || arg.negativeDescription) && !negativePrefixRe.test(arg.name)) {\n\t\t\tconst negativeArgStr = [...(arg.alias || []).map((a) => `--no-${a}`), `--no-${arg.name}`].join(\", \");\n\t\t\targLines.push([cyan(negativeArgStr + (isRequired ? \" (required)\" : \"\")), arg.negativeDescription || \"\"]);\n\t\t}\n\t\tif (isRequired) usageLine.push(argStr);\n\t}\n\tif (cmd.subCommands) {\n\t\tconst commandNames = [];\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tfor (const [name, sub] of Object.entries(subCommands)) {\n\t\t\tconst meta = await resolveValue((await resolveValue(sub))?.meta);\n\t\t\tif (meta?.hidden) continue;\n\t\t\tcommandsLines.push([cyan(name), meta?.description || \"\"]);\n\t\t\tcommandNames.push(name);\n\t\t}\n\t\tusageLine.push(commandNames.join(\"|\"));\n\t}\n\tconst usageLines = [];\n\tconst version = cmdMeta.version || parentMeta.version;\n\tusageLines.push(gray(`${cmdMeta.description} (${commandName + (version ? ` v${version}` : \"\")})`), \"\");\n\tconst hasOptions = argLines.length > 0 || posLines.length > 0;\n\tusageLines.push(`${underline(bold(\"USAGE\"))} ${cyan(`${commandName}${hasOptions ? \" [OPTIONS]\" : \"\"} ${usageLine.join(\" \")}`)}`, \"\");\n\tif (posLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"ARGUMENTS\")), \"\");\n\t\tusageLines.push(formatLineColumns(posLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (argLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"OPTIONS\")), \"\");\n\t\tusageLines.push(formatLineColumns(argLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (commandsLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"COMMANDS\")), \"\");\n\t\tusageLines.push(formatLineColumns(commandsLines, \" \"));\n\t\tusageLines.push(\"\", `Use ${cyan(`${commandName} <command> --help`)} for more information about a command.`);\n\t}\n\treturn usageLines.filter((l) => typeof l === \"string\").join(\"\\n\");\n}\nasync function runMain(cmd, opts = {}) {\n\tconst rawArgs = opts.rawArgs || process.argv.slice(2);\n\tconst showUsage$1 = opts.showUsage || showUsage;\n\ttry {\n\t\tif (rawArgs.includes(\"--help\") || rawArgs.includes(\"-h\")) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tprocess.exit(0);\n\t\t} else if (rawArgs.length === 1 && rawArgs[0] === \"--version\") {\n\t\t\tconst meta = typeof cmd.meta === \"function\" ? await cmd.meta() : await cmd.meta;\n\t\t\tif (!meta?.version) throw new CLIError(\"No version specified\", \"E_NO_VERSION\");\n\t\t\tconsole.log(meta.version);\n\t\t} else await runCommand(cmd, { rawArgs });\n\t} catch (error) {\n\t\tif (error instanceof CLIError) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tconsole.error(error.message);\n\t\t} else console.error(error, \"\\n\");\n\t\tprocess.exit(1);\n\t}\n}\nfunction createMain(cmd) {\n\treturn (opts = {}) => runMain(cmd, opts);\n}\nexport { createMain, defineCommand, parseArgs, renderUsage, runCommand, runMain, showUsage };\n","export const commands = {\n acceptFireholRisk: {\n type: 'boolean',\n description: 'Acknowledge of FireHOL',\n required: false,\n },\n\n all: {\n type: 'boolean',\n description: 'Skip interactive selection and fetch all available sources.',\n required: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Force re download and re compilation of data sources.',\n required: false,\n },\n\n refreshAll: {\n type: 'boolean',\n description: 'Force re download and re compilation of all data sources using cached config.',\n required: false,\n },\n\n parallel: { type: 'boolean', description: 'Run compilation tasks concurrently.', required: false },\n contact: { type: 'string', description: 'Provide User-Agent contact info to bypass the interactive BGP prompt', required: false },\n path: { type: 'string', description: 'Path for for the databases to be compiled into.', required: false },\n bgp: { type: 'boolean', description: 'Compile BGP data', required: false },\n city: { type: 'boolean', description: 'Compile City data', required: false },\n geo: { type: 'boolean', description: 'Compile Geography data', required: false },\n proxy: { type: 'boolean', description: 'Compile Proxy data', required: false },\n tor: { type: 'boolean', description: 'Compile Tor data', required: false },\n l1: { type: 'boolean', description: 'Compile FireHOL Level 1', required: false },\n l2: { type: 'boolean', description: 'Compile FireHOL Level 2', required: false },\n l3: { type: 'boolean', description: 'Compile FireHOL Level 3', required: false },\n l4: { type: 'boolean', description: 'Compile FireHOL Level 4', required: false },\n anonymous: { \n type: 'boolean', \n description: 'Compile FireHOL Anonymous network list', \n required: false \n }\n } as const\n;\nexport const sources = [\n { label: 'BGP', value: 'BGP', hint: '🌐 Autonomous System numbers and prefix data' },\n { label: 'City', value: 'City', hint: '🏙️ IP to City geolocation data' },\n { label: 'Geography', value: 'Geography', hint: '🌍 Country and continent information' },\n { label: 'Proxy', value: 'Proxy', hint: 'Anonymous Proxy and VPN detection lists' },\n { label: 'Tor', value: 'Tor', hint: 'The Onion Router exit node IP lists, and more' },\n { label: 'FireHOL Level 1', value: 'firehol_l1', hint: 'Maximum protection, minimum false positives' },\n { label: 'FireHOL Level 2', value: 'firehol_l2', hint: 'Tracking attacks last 48h, includes dynamic IPs' },\n { label: 'FireHOL Level 3', value: 'firehol_l3', hint: 'Attacks, spyware, and viruses tracked last 30 days' },\n { label: 'FireHOL Level 4', value: 'firehol_l4', hint: 'Aggressive tracking, higher false positive risk' },\n { label: 'Anonymous', value: 'firehol_anonymous', hint: 'Tor exit nodes, I2P, VPNS, and other anonymity network relays' }\n ] as const;\n","import { exactly, createRegExp, charNotIn, oneOrMore } from \"magic-regexp\";\n\nexport function isValidUserAgent(ua: string): boolean | string {\n if (!ua || ua.trim() === '') return \"User agent is required\";\n\n const nonSpace = charNotIn(\" \");\n const nonAtOrSpace = charNotIn(\" @\");\n \n\n const emailPart = oneOrMore(nonAtOrSpace)\n .and(\"@\")\n .and(oneOrMore(nonAtOrSpace))\n .and(\".\")\n .and(oneOrMore(nonAtOrSpace));\n\n\n const nameOrUrlPart = oneOrMore(nonSpace)\n .and(\n oneOrMore(\n exactly(\" \").and(oneOrMore(nonSpace))\n ).optionally()\n );\n\n const regex = createRegExp(\n nameOrUrlPart\n .and(exactly(\" - \"))\n .and(emailPart)\n .at.lineStart()\n .at.lineEnd()\n );\n\n if (regex.test(ua)) {\n return true;\n }\n\n return \"Invalid format. Expected: '<name> [url] - <email>' (e.g., 'acmeco bgp.tools - contact@acme.co')\";\n}","import consola from \"consola\";\nimport { isValidUserAgent } from \"./validateUserAgent.js\";\n\n\nexport async function askForUserAgent(): Promise<string> {\n const bgpTools = 'https://bgp.tools/kb/api';\n const message = `To avoid getting blocked, bgp.tools requires contact information to reach you in case something went wrong.\n This data will be included in the user agent header each time you get data from them.\n More information is available at: ${bgpTools}.\\n\n Required format: '<your-name or company> <optional site url> - <Your email address>'\\n`;\n\n let contactInfo = '';\n let isValid = false;\n\n while (!isValid) {\n const input = await consola.prompt(message, {\n type: 'text',\n placeholder: 'acmeco bgp.tools - contact@acme.co',\n cancel: 'null' \n });\n\n if (input === null) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n contactInfo = input;\n const validationResult = isValidUserAgent(contactInfo);\n \n if (validationResult === true) {\n isValid = true;\n } else {\n consola.error(validationResult); \n }\n }\n\n return contactInfo;\n};","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { pipeline } from 'node:stream/promises';\nimport { consola } from 'consola';\nimport { execSync } from 'node:child_process';\nimport * as tar from 'tar';\nimport extractZip from 'extract-zip';\n\nconst VERSION = '1.4.8';\nconst LOCAL_BIN_DIR = path.join(os.homedir(), '.shield-base', 'bin');\n\nfunction getTargetPlatform(): { plat: string; ext: string; isWindows: boolean } {\n const platform = os.platform();\n const arch = os.arch();\n\n let osName = '';\n let archName = '';\n let ext = '.tar.gz';\n let isWindows = false;\n\n if (platform === 'darwin') osName = 'darwin';\n else if (platform === 'linux') osName = 'linux';\n else if (platform === 'win32') {\n osName = 'windows';\n ext = '.zip';\n isWindows = true;\n } else throw new Error(`Unsupported OS: ${platform}`);\n\n if (arch === 'x64') archName = 'amd64';\n else if (arch === 'arm64') archName = 'arm64';\n else if (arch === 'ia32') archName = '386';\n else if (arch === 'arm') archName = 'arm';\n else throw new Error(`Unsupported Architecture: ${arch}`);\n\n return { plat: `${osName}_${archName}`, ext, isWindows };\n}\n\n\nexport async function ensureMmdbctl(): Promise<string> {\n const { plat, ext, isWindows } = getTargetPlatform();\n const binaryName = isWindows ? 'mmdbctl.exe' : 'mmdbctl';\n const localBinaryPath = path.join(LOCAL_BIN_DIR, binaryName);\n\n try {\n execSync('mmdbctl --help', { stdio: 'ignore' });\n return 'mmdbctl';\n } catch {\n \n }\n\n if (fs.existsSync(localBinaryPath)) {\n return localBinaryPath;\n }\n\n consola.warn('The required engine \"mmdbctl\" is missing from your system.');\n const consent = await consola.prompt(\n 'Would you like Shield-Base to automatically download and configure it locally?', \n { type: 'confirm', initial: true }\n );\n\n if (!consent) {\n consola.error('Cannot proceed without mmdbctl. Exiting...');\n process.exit(1);\n }\n\n fs.mkdirSync(LOCAL_BIN_DIR, { recursive: true });\n \n const fileName = `mmdbctl_${VERSION}_${plat}`;\n const url = `https://github.com/ipinfo/mmdbctl/releases/download/mmdbctl-${VERSION}/${fileName}${ext}`;\n const archivePath = path.join(LOCAL_BIN_DIR, `${fileName}${ext}`);\n\n consola.start(`Downloading mmdbctl v${VERSION} for ${plat}...`);\n \n try {\n const response = await fetch(url);\n if (!response.ok || !response.body) throw new Error(`Failed to fetch: ${response.statusText}`);\n \n const fileStream = fs.createWriteStream(archivePath);\n await pipeline(response.body, fileStream);\n consola.success('Download complete. Extracting...');\n\n if (isWindows) {\n await extractZip(archivePath, { dir: LOCAL_BIN_DIR });\n } else {\n await tar.x({\n file: archivePath,\n cwd: LOCAL_BIN_DIR\n });\n }\n\n\n const extractedFiles = fs.readdirSync(LOCAL_BIN_DIR);\n const extractedBinary = extractedFiles.find(f => f.includes('mmdbctl') && f !== `${fileName}${ext}`);\n\n if (extractedBinary && extractedBinary !== binaryName) {\n fs.renameSync(\n path.join(LOCAL_BIN_DIR, extractedBinary), \n localBinaryPath\n );\n }\n\n fs.unlinkSync(archivePath);\n \n if (!isWindows) {\n fs.chmodSync(localBinaryPath, 0o755);\n }\n\n consola.success('mmdbctl engine successfully installed locally!');\n return localBinaryPath;\n\n } catch (error) {\n consola.error('Failed to install mmdbctl automatically:', error);\n process.exit(1);\n }\n}","#!/usr/bin/env node\nimport { defineCommand, runMain } from 'citty';\nimport { consola } from 'consola';\nimport { commands, sources } from './utils/commands.js';\nimport { askForUserAgent } from './utils/userAgentInput.js';\nimport { isValidUserAgent } from \"./utils/validateUserAgent.js\";\nimport path from 'node:path';\nimport { \n getBGPAndASN,\n buildCitiesData,\n generateData as executeAll,\n getGeoDatas,\n getListOfProxies,\n getThreatLists,\n getTorLists\n} from './scripts/index.js';\nimport { ensureMmdbctl } from './utils/mmdbctlInstaller.js';\nimport type { InputCache } from './types/input.js';\nimport fs from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport { restartData } from './utils/restart.js';\n\nconst fireholUrl = 'https://github.com/firehol/blocklist-ipsets';\n\nconst start = defineCommand({\n meta: {\n name: 'shield-base',\n version: '1.0.0',\n description: 'Offline IP threat intelligence & GeoIP MMDB compiler',\n },\n\n args: {\n ...commands\n },\n \nasync run({ args }) {\n consola.box('Welcome to Shield-Base!');\n\n\n const includeFirehol = args.acceptFireholRisk;\n\n const cacheOutput = path.join(os.homedir(), '.shield-base', '.cache.json');\n let cache: Partial<InputCache> = {};\n\n if (fs.existsSync(cacheOutput)) { \n const cacheedFile = await readFile(cacheOutput, 'utf-8');\n cache = JSON.parse(cacheedFile) as InputCache;\n }\n\n let mmdbPath = '';\n if (cache.mmdbctlPath && fs.existsSync(cache.mmdbctlPath)) {\n mmdbPath = cache.mmdbctlPath;\n } else {\n consola.start('Verifying system dependencies...');\n mmdbPath = await ensureMmdbctl();\n cache.mmdbctlPath = mmdbPath;\n }\n\n\n if (includeFirehol && !cache.license) {\n cache.license = true;\n consola.success('FireHOL databases included in scope.');\n } else {\n consola.warn(`Some data included in \"Threats\" and \"Proxy\" may include specific fields that have different types of licensing.\\nPlease check for more info: ${fireholUrl}`);\n consola.info('Skipping FireHOL datasets.');\n }\n\n type Source = typeof sources[number]['value'];\n let selectedSources: Source[] = [];\n const allSourceValues = sources.map(s => s.value);\n\n const flaggedSources: Source[] = [];\n\n if (args.refreshAll || args.refresh) {\n consola.info('Initializing data restart...');\n const isAll = !!args.refreshAll;\n const outputPath = path.resolve(process.cwd(), args.path ?? '.');\n \n await restartData(outputPath, isAll);\n return;\n }\n \n if (args.bgp) flaggedSources.push('BGP');\n if (args.city) flaggedSources.push('City');\n if (args.geo) flaggedSources.push('Geography');\n if (args.proxy) flaggedSources.push('Proxy');\n if (args.tor) flaggedSources.push('Tor');\n if (args.l1) flaggedSources.push('firehol_l1');\n if (args.l2) flaggedSources.push('firehol_l2');\n if (args.l3) flaggedSources.push('firehol_l3');\n if (args.l4) flaggedSources.push('firehol_l4');\n if (args.anonymous) flaggedSources.push('firehol_anonymous');\n \n if (args.all) {\n consola.info('Argument --all passed. Selecting all available sources...');\n selectedSources = [...allSourceValues];\n } else if (flaggedSources.length > 0) {\n consola.info(`Specific sources selected via flags: ${flaggedSources.join(', ')}`);\n selectedSources = flaggedSources;\n } else {\n const mode = await consola.prompt('Choose your data', {\n type: 'select',\n options: [\n { label: 'All (Recommended)', value: 'all' },\n { label: 'Select Multiple', value: 'custom' }\n ],\n cancel: 'null' \n });\n\n if (mode === null) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n if (mode === 'all') {\n selectedSources = [...allSourceValues];\n } else {\n selectedSources = await consola.prompt('Select data sources to compile', {\n type: 'multiselect',\n options: sources.map(s => ({\n label: s.label,\n value: s.value,\n hint: s.hint,\n cancel: 'null'\n }))\n }) as unknown as Source[];\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (selectedSources.length === 0 || !selectedSources) {\n consola.error('No data sources selected for compilation. Exiting...');\n process.exit(1);\n }\n\n cache.selectedDataTypes = selectedSources;\n let contactInfo = args.contact;\n\nif (selectedSources.includes('BGP')) {\n if (contactInfo) {\n const validation = isValidUserAgent(contactInfo);\n if (validation !== true) {\n consola.error(`Invalid --contact flag provided: ${String(validation)}`);\n process.exit(1);\n }\n cache.useragent = contactInfo;\n consola.success('Valid contact info provided via --contact flag. Skipping prompt.');\n } else if (cache.useragent) {\n contactInfo = cache.useragent;\n consola.info('Loaded BGP contact info from cache.');\n } else {\n const bgpAction = await consola.prompt(\n 'BGP.tools requires contact information (User-Agent) to prevent API blocking. How would you like to proceed?',\n {\n type: 'select',\n options: [\n { label: 'Provide details', value: 'provide' },\n { label: 'Exclude BGP Data', value: 'exclude' }\n ],\n cancel: 'null'\n }\n );\n\n if (!bgpAction) {\n consola.fail('Operation cancelled. Exiting Shield-Base...');\n process.exit(1); \n }\n\n if (bgpAction === 'provide') {\n contactInfo = await askForUserAgent();\n cache.useragent = contactInfo;\n } else {\n consola.info('Excluding BGP from the compilation queue...');\n selectedSources = selectedSources.filter(source => source !== 'BGP');\n \n if (selectedSources.length === 0) {\n consola.error('No data sources remaining for compilation. Exiting...');\n process.exit(1);\n }\n }\n }\n }\n\n\n consola.start(`Compiling data sources: ${selectedSources.join(', ')}...`);\n const output = path.resolve(process.cwd(), args.path ?? '.');\n consola.info(`Output directory mapped to: ${output}`);\n const isRunningAll = selectedSources.length === allSourceValues.length;\n if (isRunningAll) {\n consola.start('🚀 Compiling all data sources...');\n await executeAll(output, contactInfo ?? '', true, mmdbPath);\n } else {\n\n consola.info('Running partial pipeline for selected sources...');\n \n const fireholSources = selectedSources.filter(s => s.startsWith('firehol_'));\n const standardSources = selectedSources.filter(s => !s.startsWith('firehol_'));\n\n const executionQueue: { name: string, task: () => Promise<void> }[] = [];\n\n if (standardSources.includes('BGP')) {\n executionQueue.push({ name: 'BGP & ASN', task: () => getBGPAndASN(contactInfo ?? '', output, mmdbPath) });\n }\n if (standardSources.includes('City')) {\n executionQueue.push({ name: 'City (Geofeed)', task: () => buildCitiesData(output, mmdbPath) });\n }\n if (standardSources.includes('Geography')) {\n executionQueue.push({ name: 'Country (Sapics)', task: () => getGeoDatas(output, mmdbPath) });\n }\n if (standardSources.includes('Proxy')) {\n executionQueue.push({ name: 'Proxies', task: () => getListOfProxies(output, mmdbPath) });\n }\n if (standardSources.includes('Tor')) {\n executionQueue.push({ name: 'Tor Nodes', task: () => getTorLists(output, mmdbPath) });\n }\n if (fireholSources.length > 0) {\n executionQueue.push({ name: `Threats (${String(fireholSources.length)} lists)`, task: () => getThreatLists(output, mmdbPath, fireholSources) });\n }\n\n if (args.parallel) {\n consola.start(`Running ${String(executionQueue.length)} compilation jobs...`);\n const results = await Promise.allSettled(executionQueue.map(q => q.task()));\n \n results.forEach((res, index) => {\n if (res.status === 'rejected') {\n consola.error(`[${executionQueue[index].name}] Failed:`, res.reason);\n }\n });\n } else {\n consola.start(`Running ${String(executionQueue.length)} compilation jobs sequentially...`);\n for (const q of executionQueue) {\n consola.start(`Initializing ${q.name} compiler...`);\n await q.task();\n consola.success(`${q.name} compilation complete.`);\n }\n }\n }\n\n\n const cacheDir = path.dirname(cacheOutput);\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n\n await writeFile(cacheOutput, JSON.stringify(cache, null, 2), 'utf-8');\n\n consola.success(`✨ All data successfully compiled!\\n You can view at ${output}`);\n}\n});\n\nawait runMain(start);"]}
package/dist/main.js CHANGED
@@ -1,2 +1,2 @@
1
- export{c as buildCitiesData,h as generateData,b as getBGPAndASN,e as getGeoDatas,f as getListOfProxies,g as getThreatLists,d as getTorLists,i as restartData,a as run}from'./chunk-MNLRCNRV.js';//# sourceMappingURL=main.js.map
1
+ export{c as buildCitiesData,h as generateData,b as getBGPAndASN,e as getGeoDatas,f as getListOfProxies,g as getThreatLists,d as getTorLists,i as restartData,a as run}from'./chunk-IXNJSTI7.js';//# sourceMappingURL=main.js.map
2
2
  //# sourceMappingURL=main.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riavzon/shield-base",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "type": "module",
5
5
  "main": "./dist/main.js",
6
6
  "types": "./dist/main.d.ts",
@@ -1,45 +0,0 @@
1
- import {createRegExp,exactly,oneOrMore,digit,charNotIn,anyOf}from'magic-regexp';import*as M from'fs';import M__default,{existsSync}from'fs';import Et from'child_process';import $t from'util';import {fileURLToPath}from'url';import*as I from'path';import I__default from'path';import x,{consola}from'consola';import lt from'ipaddr.js';import ee from'os';import {readFile}from'fs/promises';var Nt=$t.promisify(Et.exec),$=async(o,S={})=>{try{let{stdout:a,stderr:e}=await Nt(o,{...S,maxBuffer:S.maxBuffer??10485760}),i={stdout:typeof a=="string"?a.trim():a,stderr:typeof e=="string"?e.trim():e};return console.log(`[run]: ${o}`),i.stdout&&console.log("stdout:",i.stdout),i.stderr&&console.error("stderr:",i.stderr),i}catch(a){if(console.error(`Execution failed for command: "${o}"`),typeof a=="object"&&a!==null){let e=a;e.stderr&&console.error("Error Output:",e.stderr);}throw a}};var Mt=fileURLToPath(import.meta.url),St=I__default.dirname(Mt);async function Q(o,S,a){let e=["https://bgp.tools/asns.csv","https://bgp.tools/table.jsonl"],i=I__default.resolve(St,`${S}/asn.mmdb`),n=I__default.resolve(St,`${S}temp_asn_data.json`);try{consola.info(`
2
- [ASN/BGP] Fetching ASN Dictionary from BGP.tools...`);let l=await(await fetch(e[0],{method:"GET",headers:{"User-Agent":o}})).text(),r=new Map,R=l.split(`
3
- `).slice(1),y=createRegExp(exactly("AS").and(oneOrMore(digit).groupedAs("asnNumber"))),t=charNotIn('"').times.any(),h=t.and(exactly('"')).times(2),O=createRegExp(exactly(",").before(h.times.any().and(t).at.lineEnd()));for(let _ of R){if(!_)continue;let b=_.split(O),C=b[0].match(y),d=C?.groups.asnNumber?parseInt(C.groups.asnNumber,10):null,w=createRegExp(exactly('"').at.lineStart().or(exactly('"').at.lineEnd()),["g"]),N=b[1]?.replace(w,"").trim()||"Unknown",m=b[2]?.trim()||"Unknown";d!==null&&r.set(d,{name:N,type:m});}consola.success(`[ASN/BGP] SUCCESS: Loaded ${String(r.size)} ASN definitions.`),consola.info("[ASN/BGP] Fetching Routing Table...");let g=await(await fetch(e[1],{method:"GET",headers:{"User-Agent":o}})).text();consola.info("[ASN/BGP] Mapping CIDR to ASN data...");let T=g.split(`
4
- `),f=[];for(let _ of T){if(!_)continue;let b=JSON.parse(_);if(b.Hits<10)continue;let C=r.get(b.ASN)??{name:"Unknown",type:"Unknown"},d={range:b.CIDR,asn_id:String(b.ASN),asn_name:C.name,classification:C.type,hits:String(b.Hits)};f.push(JSON.stringify(d));}f.length>0&&consola.log("[ASN/BGP] SAMPLE:",f[0]),consola.info(`[ASN/BGP] Writing ${String(f.length)} enriched entries to temporary JSON...`),M.writeFileSync(n,f.join(`
5
- `),"utf-8"),consola.info(`[ASN/BGP] Compiling MMDB with mmdbctl to ${i}...`);let u=`${a} import --in ${n} --out ${i}`,s=await $(u);s.stdout&&consola.log(`[ASN/BGP] mmdbctl: ${s.stdout.toString().trim()}`),consola.success(`[ASN/BGP] COMPLETED: Successfully compiled ASN MMDB to ${i}
6
- `);}catch(c){consola.error(`
7
- [ASN/BGP] ERROR during processing:`,c),process.exit(1);}finally{M.existsSync(n)&&M.unlinkSync(n);}}var kt=fileURLToPath(import.meta.url),ct=I.dirname(kt),Ft=I.resolve(ct,"./countries+states+cities.json");async function Z(o,S){consola.info(`
8
- [CITY/GEO] Building global geographic index from hierarchical database...`);let a=I.resolve(ct,`${o}/city.mmdb`),e=I.resolve(ct,`${o}/temp_city_data.json`),i=M.readFileSync(Ft,"utf8"),n=JSON.parse(i),c=new Map;for(let l of n){let r=new Map;if(l.states)for(let R of l.states){let y=new Map;if(R.cities)for(let t of R.cities)y.set(t.name.toLowerCase(),t);r.set(R.state_code,{meta:R,cities:y});}c.set(l.iso2.toUpperCase(),{meta:l,states:r});}try{consola.info("[CITY/GEO] Fetching validated geofeed CSV...");let R=(await(await fetch("https://geolocatemuch.com/geofeeds/validated-all.csv")).text()).split(`
9
- `),y=createRegExp(exactly("#").at.lineStart());consola.success(`[CITY/GEO] SUCCESS: Received ${String(R.length)} IP ranges. Mapping to geographic index...`);let t=[];for(let p of R){if(!p.trim()||y.test(p))continue;let g=p.split(","),T=g[0]?.trim()||"",f=g[1]?.trim()||"",u=g[2]?.trim()||"",s=g[3]?.trim()||"",_=g[4]?.trim()||"";if(!f&&!s&&!_)continue;let b=f.toUpperCase()||"",C="",d="",w="",N="",m={},k=c.get(b);if(k){if(m=k.meta,C=k.meta.emoji||"",u){let J=u.includes("-")?u.split("-").pop():u,E=k.states.get(J);if(E){if(N=E.meta.name||E.meta.state_code||"",s){let rt=E.cities.get(s.toLowerCase());rt&&(d=rt.latitude||"",w=rt.longitude||"");}!d&&E.meta.latitude&&E.meta.longitude&&(d=E.meta.latitude||"",w=E.meta.longitude||"");}}if(!d&&s)for(let[,J]of k.states){let E=J.cities.get(s.toLowerCase());if(E){d=E.latitude||"",w=E.longitude||"",N||(N=J.meta.name||J.meta.state_code||"");break}}!d&&m.latitude&&m.longitude&&(d=m.latitude||"",w=m.longitude||"");}let Ct={range:T,country_code:f,region:u||(m.region??""),subregion:m.subregion??"",city:s,zip_code:_,latitude:d,longitude:w,state:N,name:m.name??"Unknown",native:m.native??"",phone:m.phonecode??"",numericCode:m.numeric_code??"",continent:m.region??"",capital:m.capital??"",currency:m.currency??"",currency_name:m.currency_name??"",languages:m.translations?Object.values(m.translations)[0]??"":"",emoji:C,timezone:m.timezones?.[0]?.zoneName??"",utc_offset:m.timezones?.[0]?.gmtOffsetName??"",timeZoneName:m.timezones?.[0]?.tzName??"",tld:m.tld??"",nationality:m.nationality??""};t.push(JSON.stringify(Ct));}consola.info(`[CITY/GEO] Writing ${String(t.length)} enriched entries to temporary JSON...`),M.writeFileSync(e,t.join(`
10
- `),"utf-8"),consola.start("[CITY/GEO] Compiling MMDB with mmdbctl...");let h=`${S} import --in ${e} --out ${a}`,O=await $(h);O.stdout&&consola.log(`[CITY/GEO] mmdbctl: ${O.stdout.toString().trim()}`),consola.success(`[CITY/GEO] COMPLETED: Successfully compiled City MMDB to ${a}
11
- `);}catch(l){consola.error(`
12
- [CITY/GEO] ERROR during processing:`,l),process.exit(1);}finally{M.existsSync(e)&&M.unlinkSync(e);}}var Bt=fileURLToPath(import.meta.url),Rt=I__default.dirname(Bt);async function V(o,S){let a="https://onionoo.torproject.org/details",e=I__default.resolve(Rt,`${o}/tor.mmdb`),i=I__default.resolve(Rt,`${o}/temp_tor_nodes.json`);try{x.info(`
13
- [TOR] Fetching node data from Onionoo API...`);let n=await fetch(a,{method:"GET",headers:{"Accept-Encoding":"gzip",Accept:"application/json"}});if(!n.ok){x.error(`[TOR] ERROR: API fetch failed with status ${String(n.status)}`);return}let c=await n.json();x.success("[TOR] SUCCESS: Data received, mapping relay nodes...");let r=(c.relays||[]).filter(t=>{let h=t.flags?.map(O=>O.toLowerCase())??[];return h.includes("exit")||h.includes("valid")||h.includes("running")||h.includes("stable")||h.includes("hsdir")&&t.exit_addresses&&t.or_addresses});if(r.length===0){x.warn("[TOR] WARNING: No relay nodes found matching criteria.");return}let R=[];for(let t of r){let h=[...t.exit_addresses??[],...t.or_addresses??[]];if(h)for(let O of h){let p=O;p.startsWith("[")?p=p.split("]:")[0].substring(1):p=p.split(":")[0];let g=lt.parse(p),T;if(g.kind()==="ipv4"){let f=g;T=`${lt.IPv4.networkAddressFromCIDR(`${f.toString()}/24`).toString()}/24`;}else if(g.kind()==="ipv6"){let f=g;T=`${lt.IPv6.networkAddressFromCIDR(`${f.toString()}/64`).toString()}/64`;}else continue;R.push({range:T,or_addresses:t.or_addresses?.join(",")??"",exit_addresses:t.exit_addresses?.join(",")??"",last_seen:t.last_seen??"",last_changed_address_or_port:t.last_changed_address_or_port??"",first_seen:t.first_seen??"",running:t.running??!1,flags:t.flags?.join(",")??"",country:t.country??"",country_name:t.country_name??"",as:t.as??"",as_name:t.as_name??"",last_restarted:t.last_restarted??"",exit_policy:t.exit_policy?.join(",")??"",exit_policy_summary:JSON.stringify(t.exit_policy_summary)||"",exit_policy_v6_summary:t.exit_policy_v6_summary?JSON.stringify(t.exit_policy_v6_summary):void 0,contact:t.contact??"Unknown",version_status:t.version_status??"",guard_probability:t.guard_probability??0,middle_probability:t.middle_probability??0,exit_probability:t.exit_probability??0,recommended_version:t.recommended_version??!1,measured:t.measured??!1});}}x.info("[TOR] SAMPLE:",R[0]);let y=R.map(t=>JSON.stringify(t)).join(`
14
- `);M.writeFileSync(i,y,"utf-8");try{x.info("[TOR] Compiling MMDB with mmdbctl...");let t=await $(`${S} import -j -i ${i} -o ${e}`);t.stdout&&x.info(`[TOR] mmdbctl: ${t.stdout.toString().trim()}`),x.success(`[TOR] COMPLETED: Successfully compiled Tor MMDB to ${e}
15
- `);}catch(t){x.error("[TOR] ERROR: MMDB compilation failed:",t);return}}catch(n){x.error("[TOR] ERROR: Unexpected failure while fetching node list:",n);return}finally{M.existsSync(i)&&M.unlinkSync(i);}}var Yt=fileURLToPath(import.meta.url),ft=I.dirname(Yt),Jt=I.resolve(ft,"./countries+states+cities.json");async function K(o,S){x.info(`
16
- [GEO/COUNTRY] Building country index from local database...`);let a=I.resolve(ft,`${o}/country.mmdb`),e=I.resolve(ft,`${o}/temp_country_data.json`),i=M.readFileSync(Jt,"utf8"),n=JSON.parse(i),c=new Map;for(let r of n)c.set(r.iso2.toUpperCase(),r);x.info("[GEO/COUNTRY] Fetching global IPv4 Country mapping from Sapics...");let l="https://raw.githubusercontent.com/sapics/ip-location-db/refs/heads/main/geo-asn-country/geo-asn-country-ipv4.csv";try{let r=await fetch(l);if(!r.ok)throw new Error(`[GEO/COUNTRY] ERROR: Failed to fetch country data: ${r.statusText}`);let y=(await r.text()).split(`
17
- `);x.success(`[GEO/COUNTRY] SUCCESS: Received ${String(y.length)} global IP ranges. Enriching data...`);let t=[];for(let p of y){if(!p.trim())continue;let g=p.split(","),T=g[0]?.trim(),f=g[1]?.trim(),u=g[2]?.trim().toUpperCase();if(!T||!f||!u)continue;let s=c.get(u),_={range:`${T}-${f}`,country_code:u,region:s?.region??"",numericCode:s?.numeric_code??"",name:s?.name??"",native:s?.native??"",phone:s?.phonecode??"",capital:s?.capital??"",currency:s?.currency??"",currency_name:s?.currency_name??"",currency_symbol:s?.currency_symbol??"",languages:s?.translations?Object.values(s.translations)[0]??"":"",emoji:s?.emoji??"",timezone:s?.timezones?.[0]?.zoneName??"",utc_offset:s?.timezones?.[0]?.gmtOffsetName??"",timeZoneName:s?.timezones?.[0]?.tzName??"",tld:s?.tld??"",nationality:s?.nationality??"",subregion:s?.subregion??""};t.push(JSON.stringify(_));}x.info(`[GEO/COUNTRY] Writing ${String(t.length)} enriched entries to temporary JSON...`),M.writeFileSync(e,t.join(`
18
- `),"utf-8"),x.start("[GEO/COUNTRY] Compiling MMDB with mmdbctl...");let h=`${S} import --in ${e} --out ${a}`,O=await $(h);O.stdout&&x.log(`[GEO/COUNTRY] mmdbctl: ${O.stdout.toString().trim()}`),x.success(`[GEO/COUNTRY] COMPLETED: Successfully compiled Country MMDB to ${a}
19
- `);}catch(r){x.error(`
20
- [GEO/COUNTRY] ERROR during processing:`,r),process.exit(1);}finally{M.existsSync(e)&&M.unlinkSync(e);}}var Wt=fileURLToPath(import.meta.url),_t=I__default.dirname(Wt);async function et(o,S){x.log(`
21
- [PROXY] Fetching initial Proxy list from Awesome-lists...`);let a=I__default.resolve(_t,`${o}/proxy.mmdb`),e=I__default.resolve(_t,`${o}/temp_proxy_data.json`),i=new Set,n=[],c=["https://raw.githubusercontent.com/mthcht/awesome-lists/refs/heads/main/Lists/PROXY/ALL_PROXY_Lists.csv","https://raw.githubusercontent.com/firehol/blocklist-ipsets/refs/heads/master/firehol_proxies.netset"],l=createRegExp(exactly(oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit)).and(exactly("/",oneOrMore(digit)).optionally()).at.lineStart().at.lineEnd());try{let r=await fetch(c[0]);if(!r.ok)throw new Error(`[PROXY] ERROR: Failed to fetch awesome list: ${r.statusText}`);let y=(await r.text()).split(`
22
- `).slice(1),t=charNotIn('"').times.any(),h=t.and(exactly('"')).times(2),O=createRegExp(exactly(",").before(h.times.any().and(t).at.lineEnd())),p=createRegExp(anyOf(exactly("PROXY_ALL_"),exactly("_list.csv"),exactly('"')),["g","i"]);for(let C of y){if(!C.trim())continue;let[d,w,N]=C.split(O);if(!d||!l.test(d)||i.has(d))continue;i.add(d);let m=N.replace(p,"").trim(),k={range:`${d}/32`,port:w,comment:m};n.push(JSON.stringify(k));}x.success(`[PROXY] SUCCESS: Finished Awesome-list. Discovered ${String(n.length)} unique IPs.`),x.log("[PROXY] Fetching secondary data from FireHOL proxy list...");let g=await fetch(c[1]);if(!g.ok)throw new Error(`[PROXY] ERROR: Failed to fetch FireHOL list: ${g.statusText}`);let f=(await g.text()).split(`
23
- `),u=createRegExp(exactly("#").at.lineStart()),s=0;for(let C of f){let d=C.trim();if(!d||u.test(d))continue;let w=d;if(!l.test(w)||i.has(w))continue;i.add(w);let N={range:w,port:"unknown",comment:"Ip from Firehol"};n.push(JSON.stringify(N)),s++;}x.success(`[PROXY] SUCCESS: Finished FireHOL. Added ${String(s)} NEW unique proxies. Total unique: ${String(n.length)}`),n.length>0&&x.log("[PROXY] SAMPLE:",n[0]),x.log(`[PROXY] Writing ${String(n.length)} unique proxies to temporary JSON...`),M__default.writeFileSync(e,n.join(`
24
- `),"utf-8"),x.log("[PROXY] Compiling MMDB with mmdbctl...");let _=`${S} import --in ${e} --out ${a}`,b=await $(_);b.stdout&&x.log(`[PROXY] mmdbctl: ${b.stdout.toString().trim()}`),x.success(`[PROXY] COMPLETED: Successfully compiled Proxy MMDB to ${a}
25
- `);}catch(r){x.error(`
26
- [PROXY] ERROR during processing:`,r),process.exit(1);}finally{M__default.existsSync(e)&&M__default.unlinkSync(e);}}var Qt=fileURLToPath(import.meta.url),Ot=I__default.dirname(Qt),bt={firehol_anonymous:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_anonymous.netset",firehol_l1:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level1.netset",firehol_l2:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level2.netset",firehol_l3:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level3.netset",firehol_l4:"https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level4.netset"};async function ot(o,S,a){let e=" Maintainer: http://iplists.firehol.org/",i=createRegExp(exactly(oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit),".",oneOrMore(digit)).and(exactly("/",oneOrMore(digit)).optionally()).at.lineStart().at.lineEnd()),n=createRegExp(exactly("#").at.lineStart()),c=[];if(Array.isArray(a)?c=Object.entries(bt).filter(([l])=>a.includes(l)).map(([l,r])=>({id:l,url:r})):a&&(c=Object.entries(bt).map(([l,r])=>({id:l,url:r}))),c.length===0){x.info("No valid FireHOL data sources selected. Skipping.");return}try{x.start(`Initializing fetch for ${String(c.length)} FireHOL stream(s)...`);let l=c.map(async y=>{let t=await fetch(y.url);return {id:y.id,res:t}}),r=await Promise.allSettled(l);x.success(`[THREATS] SUCCESS: Fetched ${String(r.length)} data streams from FireHOL.`);let R=0;for(let y of r){if(y.status==="rejected"){x.error("Promise rejected:",y.reason);continue}let{id:t,res:h}=y.value,O=`${t} ${e}`,p=[];if(x.info(`[THREATS] Processing stream: ${t}...`),!h.ok){x.error(`Failed fetching ${t}: ${h.statusText}`);continue}let T=(await h.text()).split(`
27
- `);for(let f of T){let u=f.trim();if(!u||n.test(u))continue;let s=u;if(!i.test(s))continue;let _={range:s,comment:O};R++,p.push(JSON.stringify(_));}if(x.info(`[THREATS] ${t} summary:`),x.info(` -> IPs Discovered: ${String(p.length)}`),x.info(` -> Rolling Total: ${String(R)}`),p.length>0){x.info(`[THREATS] SAMPLE: ${p[0]}`),x.info(`[THREATS] Writing entries to temporary JSON: temp_${t}.json`);let f=I__default.resolve(Ot,`${o}/temp_${t}.json`),u=I__default.resolve(Ot,`${o}/${t}.mmdb`);M__default.writeFileSync(f,p.join(`
28
- `),"utf-8"),console.log(`[THREATS] Compiling MMDB with mmdbctl to ${u}...`);let s=`${S} import --in ${f} --out ${u}`,_=await $(s);_.stdout&&x.box(`[THREATS] mmdbctl: ${_.stdout.toString().trim()}`),M__default.existsSync(f)&&M__default.unlinkSync(f),x.success(`[THREATS] SUCCESS: Compiled ${t}.mmdb
29
- `);}else x.warn(`[THREATS] WARNING: No valid IPs found for ${t}. Skipping.
30
- `);}x.success(`[THREATS] COMPLETED: All threat intelligence sources processed successfully.
31
- `);}catch(l){x.error(`
32
- [THREATS] FATAL ERROR during processing:`,l),process.exit(1);}}var Vt=fileURLToPath(import.meta.url),Kt=I__default.dirname(Vt);async function wt(o,S,a,e){x.box(`
33
- =========================================
34
- === Starting data generation pipeline ===
35
- =========================================
36
- `);let i=I__default.resolve(Kt,"../mmdb"),n=I__default.resolve(i,"threats-lists");M.existsSync(n)||M.mkdirSync(n,{recursive:true});try{(await Promise.allSettled([Q(S,o,e),Z(o,e),V(o,e),K(o,e),et(o,e),ot(o,e,a)])).forEach((l,r)=>{l.status==="rejected"&&x.error(`Script cluster [${String(r)}] failed:`,String(l.reason));}),x.info(`
37
- ====================================
38
- Pipeline execution finished.
39
- ====================================
40
- `);}catch(c){x.error(`
41
- ====================================
42
- Fatal error in pipeline: ${String(c)}
43
- ====================================
44
- `);}}var Tt=I__default.join(ee.homedir(),".shield-base",".cache.json");async function no(o,S){existsSync(Tt)||(x.error("No cache found. Cannot restart. Please run a standard compilation first."),process.exit(1));let a=await readFile(Tt,"utf-8"),e=JSON.parse(a);if(!e.selectedDataTypes||e.selectedDataTypes.length===0){x.warn("Cache is empty. No data sources to restart.");return}if(S){x.info("Restarting ALL data sources..."),await wt(o,e.useragent,true,e.mmdbctlPath),x.success("\u2728 All data successfully refreshed!");return}x.info(`Restarting data compilation from cache: ${e.selectedDataTypes.join(", ")}`);let i=e.selectedDataTypes.filter(c=>c.startsWith("firehol_")||c==="anonymous"),n=e.selectedDataTypes.filter(c=>!c.startsWith("firehol_")&&c!=="anonymous");n.includes("BGP")&&await Q(e.useragent||"",o,e.mmdbctlPath),n.includes("City")&&await Z(o,e.mmdbctlPath),n.includes("Geography")&&await K(o,e.mmdbctlPath),n.includes("Proxy")&&await et(o,e.mmdbctlPath),n.includes("Tor")&&await V(o,e.mmdbctlPath),i.length>0&&await ot(o,e.mmdbctlPath,i),x.success("\u2728 Cached data successfully refreshed!");}export{$ as a,Q as b,Z as c,V as d,K as e,et as f,ot as g,wt as h,no as i};//# sourceMappingURL=chunk-MNLRCNRV.js.map
45
- //# sourceMappingURL=chunk-MNLRCNRV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/run.ts","../src/scripts/bgp.ts","../src/scripts/city.ts","../src/scripts/tor.ts","../src/scripts/geo.ts","../src/scripts/proxy.ts","../src/scripts/threats.ts","../src/scripts/executeAll.ts","../src/utils/restart.ts"],"names":["execAsync","util","child","run","command","options","stdout","stderr","result","error","__filename","fileURLToPath","__dirname","path","getBGPAndASN","userAgent","outputPath","mmdbPath","urls","output","tempASNJson","consola","rawAsnCsv","asnDictionary","asnLines","regex","createRegExp","exactly","oneOrMore","digit","nonQuotes","charNotIn","quotePair","splitRegex","line","parts","match","asnNumber","quoteStripRegex","asnName","asnClass","rawTable","routes","results","route","parsed","dictionaryLookup","record","F","cmd","convert","dbPath","buildCitiesData","tempGeoJson","rawData","dbJson","countryIndex","country","stateMap","state","cityMap","city","lines","commentRegex","prefix","region","zip","cc","emoji","lat","lon","stateName","countryMeta","countryData","regionCode","stateData","cityData","geoRecord","getTorLists","url","tempFileName","response","data","toMap","flags","fl","f","node","ipsToProcess","ip","cleanIp","parsedIp","ipaddr","finalNetworkAddress","ipv4","ipv6","ndjsonOutput","B","U","getGeoDatas","L","res","start","end","getListOfProxies","tempProxyJson","seenIps","ipv4Regex","resAwesome","splitAwesomeListRegex","stripAwesomeListRegex","anyOf","dest_ip","dest_port","metadata_comment","cleanComment","resFirehol","fireholLines","fireholCount","trimmed","fs","THREAT_CONFIG","getThreatLists","selectedSources","maintainerUrl","tasks","id","promises","task","resultsSettled","ipsCount","finalMsg","jsonName","generateData","dataPath","threatsPath","nt","index","cacheOutput","os","restartData","all","existsSync","cachedFile","readFile","cache","fireholSources","s","standardSources"],"mappings":"mYASA,IAAMA,EAAAA,CAAYC,EAAAA,CAAK,UAAUC,EAAAA,CAAM,IAAI,EAE9BC,CAAAA,CAAM,MAAOC,EAAiBC,CAAAA,CAAuB,KAA2B,CACzF,GAAI,CACA,GAAM,CAAE,OAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI,MAAMP,EAAAA,CAAUI,CAAAA,CAAS,CAChD,GAAGC,CAAAA,CACH,UAAWA,CAAAA,CAAQ,SAAA,EAAa,QACpC,CAAC,CAAA,CAEKG,EAAoB,CACtB,MAAA,CAAQ,OAAOF,CAAAA,EAAW,QAAA,CAAWA,EAAO,IAAA,EAAK,CAAIA,EACrD,MAAA,CAAQ,OAAOC,GAAW,QAAA,CAAWA,CAAAA,CAAO,MAAK,CAAIA,CACzD,EAEA,OAAA,OAAA,CAAQ,GAAA,CAAI,UAAUH,CAAO,CAAA,CAAE,EAC3BI,CAAAA,CAAO,MAAA,EAAQ,QAAQ,GAAA,CAAI,SAAA,CAAWA,EAAO,MAAM,CAAA,CACnDA,EAAO,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAWA,EAAO,MAAM,CAAA,CAElDA,CACX,CAAA,MAASC,CAAAA,CAAgB,CAGrB,GAFA,OAAA,CAAQ,MAAM,CAAA,+BAAA,EAAkCL,CAAO,GAAG,CAAA,CAEtD,OAAOK,GAAU,QAAA,EAAYA,CAAAA,GAAU,KAAM,CAC7C,IAAM,CAAA,CAAIA,CAAAA,CACN,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAM,eAAA,CAAiB,CAAA,CAAE,MAAM,EACzD,CAEA,MAAMA,CACV,CACJ,EC7BA,IAAMC,EAAAA,CAAaC,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,EAC1CC,EAAAA,CAAYC,UAAAA,CAAK,QAAQH,EAAU,CAAA,CAGzC,eAAsBI,CAAAA,CAAaC,CAAAA,CAAmBC,EAAoBC,CAAAA,CAAkB,CACxF,IAAMC,CAAAA,CAAO,CAAC,6BAA8B,+BAA+B,CAAA,CACrEC,EAASN,UAAAA,CAAK,OAAA,CAAQD,GAAW,CAAA,EAAGI,CAAU,WAAW,CAAA,CACzDI,CAAAA,CAAcP,WAAK,OAAA,CAAQD,EAAAA,CAAW,GAAGI,CAAU,CAAA,kBAAA,CAAoB,EAC7E,GAAI,CACAK,QAAQ,IAAA,CAAK;AAAA,mDAAA,CAAuD,CAAA,CAWpE,IAAMC,CAAAA,CAAY,KAAA,CAVH,MAAM,KAAA,CAAMJ,CAAAA,CAAK,CAAC,CAAA,CAAG,CAChC,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACL,YAAA,CAAcH,CAClB,CACJ,CAAC,CAAA,EAK8B,IAAA,EAAK,CAC9BQ,CAAAA,CAAgB,IAAI,GAAA,CACpBC,CAAAA,CAAWF,CAAAA,CAAU,KAAA,CAAM;AAAA,CAAI,EAAE,KAAA,CAAM,CAAC,EAExCG,CAAAA,CAAQC,YAAAA,CAAaC,QAAQ,IAAI,CAAA,CAAE,GAAA,CAAIC,SAAAA,CAAUC,KAAK,CAAA,CAAE,SAAA,CAAU,WAAW,CAAC,CAAC,EAE/EC,CAAAA,CAAYC,SAAAA,CAAU,GAAG,CAAA,CAAE,MAAM,GAAA,EAAI,CACrCC,EAAYF,CAAAA,CAAU,GAAA,CAAIH,QAAQ,GAAG,CAAC,EAAE,KAAA,CAAM,CAAC,EAC/CM,CAAAA,CAAaP,YAAAA,CACfC,QAAQ,GAAG,CAAA,CAAE,OAAOK,CAAAA,CAAU,KAAA,CAAM,GAAA,EAAI,CAAE,IAAIF,CAAS,CAAA,CAAE,GAAG,OAAA,EAAS,CACzE,CAAA,CAEA,IAAA,IAAWI,CAAAA,IAAQV,CAAAA,CAAU,CACzB,GAAI,CAACU,EAAM,SACX,IAAMC,EAAQD,CAAAA,CAAK,KAAA,CAAMD,CAAU,CAAA,CAE7BG,EAAQD,CAAAA,CAAM,CAAC,EAAE,KAAA,CAAMV,CAAK,EAC5BY,CAAAA,CAAYD,CAAAA,EAAO,OAAO,SAAA,CAAY,QAAA,CAASA,EAAM,MAAA,CAAO,SAAA,CAAW,EAAE,CAAA,CAAI,IAAA,CAE7EE,EAAkBZ,YAAAA,CAAaC,OAAAA,CAAQ,GAAG,CAAA,CAAE,GAAG,SAAA,EAAU,CAAE,GAAGA,OAAAA,CAAQ,GAAG,EAAE,EAAA,CAAG,OAAA,EAAS,CAAA,CAAG,CAAC,GAAG,CAAC,EAC/FY,CAAAA,CAAUJ,CAAAA,CAAM,CAAC,CAAA,EAAG,OAAA,CAAQG,CAAAA,CAAiB,EAAE,EAAE,IAAA,EAAK,EAAK,UAC3DE,CAAAA,CAAWL,CAAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAU,SAAA,CAEjCE,CAAAA,GAAc,MACdd,CAAAA,CAAc,GAAA,CAAIc,EAAW,CAAE,IAAA,CAAME,EAAS,IAAA,CAAMC,CAAS,CAAC,EAEtE,CACAnB,OAAAA,CAAQ,OAAA,CAAQ,6BAA6B,MAAA,CAAOE,CAAAA,CAAc,IAAI,CAAC,CAAA,iBAAA,CAAmB,CAAA,CAC1FF,OAAAA,CAAQ,KAAK,qCAAqC,CAAA,CAQlD,IAAMoB,CAAAA,CAAW,KAAA,CAPA,MAAM,KAAA,CAAMvB,CAAAA,CAAK,CAAC,CAAA,CAAG,CAClC,MAAA,CAAQ,KAAA,CACR,QAAS,CACL,YAAA,CAAcH,CAClB,CACJ,CAAC,GAE+B,IAAA,EAAK,CACrCM,QAAQ,IAAA,CAAK,uCAAuC,EACpD,IAAMqB,CAAAA,CAASD,EAAS,KAAA,CAAM;AAAA,CAAI,EAC5BE,CAAAA,CAAU,GAEhB,IAAA,IAAWC,CAAAA,IAASF,EAAQ,CACxB,GAAI,CAACE,CAAAA,CAAO,SAER,IAAMC,CAAAA,CAAS,IAAA,CAAK,MAAMD,CAAK,CAAA,CAC/B,GAAIC,CAAAA,CAAO,IAAA,CAAO,EAAA,CAAI,SAEtB,IAAMC,CAAAA,CAAmBvB,CAAAA,CAAc,IAAIsB,CAAAA,CAAO,GAAG,GAAK,CAAE,IAAA,CAAM,UAAW,IAAA,CAAM,SAAU,EAEvFE,CAAAA,CAAoB,CACtB,MAAOF,CAAAA,CAAO,IAAA,CACd,OAAQ,MAAA,CAAOA,CAAAA,CAAO,GAAG,CAAA,CACzB,SAAUC,CAAAA,CAAiB,IAAA,CAC3B,eAAgBA,CAAAA,CAAiB,IAAA,CACjC,KAAM,MAAA,CAAOD,CAAAA,CAAO,IAAI,CAC5B,CAAA,CACAF,EAAQ,IAAA,CAAK,IAAA,CAAK,UAAUI,CAAM,CAAC,EACvC,CAEAJ,CAAAA,CAAQ,MAAA,CAAS,CAAA,EACjBtB,QAAQ,GAAA,CAAI,mBAAA,CAAqBsB,EAAQ,CAAC,CAAC,EAG/CtB,OAAAA,CAAQ,IAAA,CAAK,qBAAqB,MAAA,CAAOsB,CAAAA,CAAQ,MAAM,CAAC,CAAA,sCAAA,CAAwC,EAC7FK,CAAA,CAAA,aAAA,CAAc5B,CAAAA,CAAauB,EAAQ,IAAA,CAAK;AAAA,CAAI,EAAG,OAAO,CAAA,CACzDtB,OAAAA,CAAQ,IAAA,CAAK,4CAA4CF,CAAM,CAAA,GAAA,CAAK,CAAA,CAEpE,IAAM8B,EAAM,CAAA,EAAGhC,CAAQ,gBAAgBG,CAAW,CAAA,OAAA,EAAUD,CAAM,CAAA,CAAA,CAC5D+B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI8C,CAAG,CAAA,CAEzBC,CAAAA,CAAQ,QAAQ7B,OAAAA,CAAQ,GAAA,CAAI,sBAAsB6B,CAAAA,CAAQ,MAAA,CAAO,QAAA,EAAS,CAAE,MAAM,CAAA,CAAE,EACxF7B,OAAAA,CAAQ,OAAA,CAAQ,0DAA0DF,CAAM;AAAA,CAAI,EAExF,CAAA,MAAUV,CAAAA,CAAO,CACTY,QAAQ,KAAA,CAAM;AAAA,kCAAA,CAAA,CAAwCZ,CAAK,CAAA,CAC3D,OAAA,CAAQ,IAAA,CAAK,CAAC,EACtB,CAAA,OAAE,CACSuC,CAAA,CAAA,UAAA,CAAW5B,CAAW,CAAA,EACtB4B,CAAA,CAAA,UAAA,CAAW5B,CAAW,EAEjC,CACJ,CCtGA,IAAMV,EAAAA,CAAaC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAC1CC,EAAAA,CAAiB,CAAA,CAAA,OAAA,CAAQF,EAAU,CAAA,CACnCyC,EAAAA,CAAc,CAAA,CAAA,OAAA,CAAQvC,EAAAA,CAAW,gCAAgC,CAAA,CAEvE,eAAsBwC,CAAAA,CAAgBpC,CAAAA,CAAoBC,CAAAA,CAAkB,CACxEI,OAAAA,CAAQ,IAAA,CAAK;AAAA,yEAAA,CAA6E,CAAA,CAC1F,IAAMF,CAAAA,CAAc,CAAA,CAAA,OAAA,CAAQP,GAAW,CAAA,EAAGI,CAAU,CAAA,UAAA,CAAY,CAAA,CAC1DqC,CAAAA,CAAmB,CAAA,CAAA,OAAA,CAAQzC,GAAW,CAAA,EAAGI,CAAU,CAAA,oBAAA,CAAsB,CAAA,CAGzEsC,CAAAA,CAAa,CAAA,CAAA,YAAA,CAAaH,GAAQ,MAAM,CAAA,CACxCI,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMD,CAAO,EAE3BE,CAAAA,CAAe,IAAI,IAEzB,IAAA,IAAWC,CAAAA,IAAWF,EAAQ,CAC1B,IAAMG,CAAAA,CAAW,IAAI,GAAA,CAGrB,GAAID,EAAQ,MAAA,CACR,IAAA,IAAWE,CAAAA,IAASF,CAAAA,CAAQ,MAAA,CAAQ,CAChC,IAAMG,CAAAA,CAAU,IAAI,GAAA,CAGpB,GAAID,CAAAA,CAAM,MAAA,CACN,QAAWE,CAAAA,IAAQF,CAAAA,CAAM,OACrBC,CAAAA,CAAQ,GAAA,CAAIC,EAAK,IAAA,CAAK,WAAA,EAAY,CAAGA,CAAI,CAAA,CAIjDH,CAAAA,CAAS,IAAIC,CAAAA,CAAM,UAAA,CAAY,CAAE,IAAA,CAAMA,CAAAA,CAAO,MAAA,CAAQC,CAAQ,CAAC,EACnE,CAGJJ,CAAAA,CAAa,GAAA,CAAIC,CAAAA,CAAQ,KAAK,WAAA,EAAY,CAAG,CAAE,IAAA,CAAMA,CAAAA,CAAS,MAAA,CAAQC,CAAS,CAAC,EACpF,CAEA,GAAI,CACArC,OAAAA,CAAQ,KAAK,8CAA8C,CAAA,CAI3D,IAAMyC,CAAAA,CAAAA,CADU,KAAA,CADJ,MAAM,MAAM,sDAAsD,CAAA,EACpD,IAAA,EAAK,EACT,KAAA,CAAM;AAAA,CAAI,EAC1BC,CAAAA,CAAerC,YAAAA,CAAaC,QAAQ,GAAG,CAAA,CAAE,GAAG,SAAA,EAAW,EAE7DN,OAAAA,CAAQ,OAAA,CAAQ,gCAAgC,MAAA,CAAOyC,CAAAA,CAAM,MAAM,CAAC,CAAA,0CAAA,CAA4C,EAChH,IAAMnB,CAAAA,CAAoB,EAAC,CAE3B,IAAA,IAAWT,KAAQ4B,CAAAA,CAAO,CACtB,GAAI,CAAC5B,CAAAA,CAAK,MAAK,EAAK6B,CAAAA,CAAa,KAAK7B,CAAI,CAAA,CAAG,SAE7C,IAAMC,CAAAA,CAAQD,EAAK,KAAA,CAAM,GAAG,EACtB8B,CAAAA,CAAS7B,CAAAA,CAAM,CAAC,CAAA,EAAG,MAAK,EAAK,EAAA,CAC7BsB,EAAUtB,CAAAA,CAAM,CAAC,GAAG,IAAA,EAAK,EAAK,GAC9B8B,CAAAA,CAAS9B,CAAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAU,EAAA,CAC7B0B,CAAAA,CAAO1B,EAAM,CAAC,CAAA,EAAG,MAAK,EAAK,EAAA,CAC3B+B,EAAM/B,CAAAA,CAAM,CAAC,GAAG,IAAA,EAAK,EAAK,GAEhC,GAAI,CAACsB,GAAW,CAACI,CAAAA,EAAQ,CAACK,CAAAA,CAAK,SAE/B,IAAMC,CAAAA,CAAKV,CAAAA,CAAQ,aAAY,EAAK,EAAA,CAEhCW,CAAAA,CAAQ,EAAA,CACRC,EAAM,EAAA,CACNC,CAAAA,CAAM,GACNC,CAAAA,CAAY,EAAA,CACZC,EAAsC,EAAC,CAErCC,EAAcjB,CAAAA,CAAa,GAAA,CAAIW,CAAE,CAAA,CACvC,GAAIM,EAAa,CAKb,GAJAD,EAAcC,CAAAA,CAAY,IAAA,CAC1BL,EAAQK,CAAAA,CAAY,IAAA,CAAK,OAAS,EAAA,CAG9BR,CAAAA,CAAQ,CAER,IAAMS,CAAAA,CAAaT,EAAO,QAAA,CAAS,GAAG,EAAIA,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,GAASA,CAAAA,CAC/DU,CAAAA,CAAYF,EAAY,MAAA,CAAO,GAAA,CAAIC,CAAU,CAAA,CAEnD,GAAIC,EAAW,CAGX,GAFAJ,EAAYI,CAAAA,CAAU,IAAA,CAAK,MAAQA,CAAAA,CAAU,IAAA,CAAK,YAAc,EAAA,CAE5Dd,CAAAA,CAAM,CACN,IAAMe,EAAAA,CAAWD,EAAU,MAAA,CAAO,GAAA,CAAId,EAAK,WAAA,EAAa,EACpDe,EAAAA,GACAP,CAAAA,CAAMO,GAAS,QAAA,EAAY,EAAA,CAC3BN,EAAMM,EAAAA,CAAS,SAAA,EAAa,IAEpC,CAEI,CAACP,GAAOM,CAAAA,CAAU,IAAA,CAAK,UAAYA,CAAAA,CAAU,IAAA,CAAK,YAClDN,CAAAA,CAAMM,CAAAA,CAAU,KAAK,QAAA,EAAY,EAAA,CACjCL,CAAAA,CAAMK,CAAAA,CAAU,KAAK,SAAA,EAAa,EAAA,EAE1C,CACJ,CAGA,GAAI,CAACN,CAAAA,EAAOR,CAAAA,CACR,OAAW,EAAGc,CAAS,CAAA,GAAKF,CAAAA,CAAY,OAAQ,CAC5C,IAAMG,EAAWD,CAAAA,CAAU,MAAA,CAAO,IAAId,CAAAA,CAAK,WAAA,EAAa,CAAA,CACxD,GAAIe,EAAU,CACVP,CAAAA,CAAMO,EAAS,QAAA,EAAY,EAAA,CAC3BN,EAAMM,CAAAA,CAAS,SAAA,EAAa,GACvBL,CAAAA,GAAWA,CAAAA,CAAYI,EAAU,IAAA,CAAK,IAAA,EAAQA,EAAU,IAAA,CAAK,UAAA,EAAc,IAChF,KACJ,CACJ,CAGA,CAACN,CAAAA,EAAOG,EAAY,QAAA,EAAYA,CAAAA,CAAY,YAC5CH,CAAAA,CAAMG,CAAAA,CAAY,UAAY,EAAA,CAC9BF,CAAAA,CAAME,EAAY,SAAA,EAAa,EAAA,EAEvC,CAEA,IAAMK,EAAAA,CAA2B,CAC7B,KAAA,CAAOb,CAAAA,CACP,aAAcP,CAAAA,CACd,MAAA,CAAQQ,IAAWO,CAAAA,CAAY,MAAA,EAAU,IACzC,SAAA,CAAWA,CAAAA,CAAY,WAAa,EAAA,CACpC,IAAA,CAAMX,EACN,QAAA,CAAUK,CAAAA,CACV,SAAUG,CAAAA,CACV,SAAA,CAAWC,EACX,KAAA,CAAOC,CAAAA,CACP,KAAMC,CAAAA,CAAY,IAAA,EAAQ,SAAA,CAC1B,MAAA,CAAQA,EAAY,MAAA,EAAU,EAAA,CAC9B,MAAOA,CAAAA,CAAY,SAAA,EAAa,GAChC,WAAA,CAAaA,CAAAA,CAAY,cAAgB,EAAA,CACzC,SAAA,CAAWA,EAAY,MAAA,EAAU,EAAA,CACjC,QAASA,CAAAA,CAAY,OAAA,EAAW,GAChC,QAAA,CAAUA,CAAAA,CAAY,UAAY,EAAA,CAClC,aAAA,CAAeA,EAAY,aAAA,EAAiB,EAAA,CAC5C,UAAWA,CAAAA,CAAY,YAAA,CAAe,OAAO,MAAA,CAAOA,CAAAA,CAAY,YAAY,CAAA,CAAE,CAAC,GAAK,EAAA,CAAK,EAAA,CACzF,MAAOJ,CAAAA,CACP,QAAA,CAAUI,EAAY,SAAA,GAAY,CAAC,GAAG,QAAA,EAAY,EAAA,CAClD,WAAYA,CAAAA,CAAY,SAAA,GAAY,CAAC,CAAA,EAAG,aAAA,EAAiB,GACzD,YAAA,CAAcA,CAAAA,CAAY,YAAY,CAAC,CAAA,EAAG,QAAU,EAAA,CACpD,GAAA,CAAKA,EAAY,GAAA,EAAO,EAAA,CACxB,YAAaA,CAAAA,CAAY,WAAA,EAAe,EAC5C,CAAA,CAEA7B,CAAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAUkC,EAAS,CAAC,EAC1C,CAEAxD,OAAAA,CAAQ,IAAA,CAAK,sBAAsB,MAAA,CAAOsB,CAAAA,CAAQ,MAAM,CAAC,CAAA,sCAAA,CAAwC,EAC9F,CAAA,CAAA,aAAA,CAAcU,CAAAA,CAAaV,EAAQ,IAAA,CAAK;AAAA,CAAI,EAAG,OAAO,CAAA,CAEzDtB,OAAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAA,CAEzD,IAAM4B,CAAAA,CAAM,CAAA,EAAGhC,CAAQ,CAAA,aAAA,EAAgBoC,CAAW,CAAA,OAAA,EAAUlC,CAAM,GAC5D+B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI8C,CAAG,EACzBC,CAAAA,CAAQ,MAAA,EAAQ7B,OAAAA,CAAQ,GAAA,CAAI,uBAAuB6B,CAAAA,CAAQ,MAAA,CAAO,QAAA,EAAS,CAAE,MAAM,CAAA,CAAE,EACzF7B,OAAAA,CAAQ,OAAA,CAAQ,4DAA4DF,CAAM;AAAA,CAAI,EAE1F,CAAA,MAASV,CAAAA,CAAO,CACZY,QAAQ,KAAA,CAAM;AAAA,mCAAA,CAAA,CAAyCZ,CAAK,CAAA,CAC5D,OAAA,CAAQ,IAAA,CAAK,CAAC,EAClB,CAAA,OAAE,CACS,CAAA,CAAA,UAAA,CAAW4C,CAAW,CAAA,EACtB,CAAA,CAAA,UAAA,CAAWA,CAAW,EAEjC,CACJ,CCnKA,IAAM3C,EAAAA,CAAaC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAC1CC,EAAAA,CAAYC,UAAAA,CAAK,OAAA,CAAQH,EAAU,CAAA,CAEzC,eAAsBoE,CAAAA,CAAY9D,CAAAA,CAAoBC,CAAAA,CAAiC,CACnF,IAAM8D,CAAAA,CAAM,yCACN5D,CAAAA,CAASN,UAAAA,CAAK,OAAA,CAAQD,EAAAA,CAAW,CAAA,EAAGI,CAAU,CAAA,SAAA,CAAW,CAAA,CACzDgE,EAAenE,UAAAA,CAAK,OAAA,CAAQD,EAAAA,CAAW,CAAA,EAAGI,CAAU,CAAA,oBAAA,CAAsB,CAAA,CAEpF,GAAI,CAEAK,EAAQ,IAAA,CAAK;AAAA,4CAAA,CAAgD,EAC7D,IAAM4D,CAAAA,CAAW,MAAM,KAAA,CAAMF,EAAK,CAClC,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACL,iBAAA,CAAmB,MAAA,CACnB,OAAU,kBACd,CAEA,CAAC,CAAA,CAID,GAAI,CAACE,CAAAA,CAAS,GAAI,CACd5D,CAAAA,CAAQ,MAAM,CAAA,0CAAA,EAA6C,MAAA,CAAO4D,EAAS,MAAM,CAAC,CAAA,CAAE,CAAA,CACpF,MACJ,CAEA,IAAMC,EAAO,MAAMD,CAAAA,CAAS,MAAK,CACjC5D,CAAAA,CAAQ,OAAA,CAAQ,sDAAsD,EAGtE,IAAM8D,CAAAA,CAAAA,CADWD,EAAK,MAAA,EAAU,IACT,MAAA,CAAQE,CAAAA,EAAU,CAEzC,IAAMC,EAAKD,CAAAA,CAAM,KAAA,EAAO,IAAIE,CAAAA,EAAKA,CAAAA,CAAE,aAAa,CAAA,EAAK,EAAC,CACtD,OAAOD,CAAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EACrBA,CAAAA,CAAG,SAAS,OAAO,CAAA,EACnBA,CAAAA,CAAG,QAAA,CAAS,SAAS,CAAA,EACrBA,CAAAA,CAAG,SAAS,QAAQ,CAAA,EACpBA,EAAG,QAAA,CAAS,OAAO,CAAA,EACnBD,CAAAA,CAAM,gBACNA,CAAAA,CAAM,YACV,CAAC,CAAA,CAID,GAAID,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,CACpB9D,EAAQ,IAAA,CAAK,wDAAwD,EACrE,MACJ,CAEA,IAAMsB,CAAAA,CAAuB,EAAC,CAE9B,IAAA,IAAW4C,KAAQJ,CAAAA,CAAO,CACtB,IAAMK,CAAAA,CAAe,CAEjB,GAAID,CAAAA,CAAK,cAAA,EAAkB,EAAC,CAC5B,GAAIA,CAAAA,CAAK,YAAA,EAAgB,EAC7B,CAAA,CAGA,GAAKC,CAAAA,CAET,IAAA,IAAWC,CAAAA,IAAMD,CAAAA,CAAc,CAE3B,IAAIE,CAAAA,CAAUD,EACVC,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,CACtBA,CAAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,EAAE,SAAA,CAAU,CAAC,EAE5CA,CAAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAGtC,IAAMC,CAAAA,CAAWC,EAAAA,CAAO,MAAMF,CAAO,CAAA,CACjCG,CAAAA,CAEJ,GAAIF,EAAS,IAAA,EAAK,GAAM,OAAQ,CAC5B,IAAMG,EAAOH,CAAAA,CAEbE,CAAAA,CAAsB,CAAA,EADCD,EAAAA,CAAO,KAAK,sBAAA,CAAuB,CAAA,EAAGE,CAAAA,CAAK,QAAA,EAAU,CAAA,GAAA,CAAK,CAAA,CACzC,QAAA,EAAU,MACtD,CAAA,KAAA,GAAWH,CAAAA,CAAS,MAAK,GAAM,MAAA,CAAQ,CACnC,IAAMI,CAAAA,CAAOJ,CAAAA,CAEbE,CAAAA,CAAsB,GADCD,EAAAA,CAAO,IAAA,CAAK,uBAAuB,CAAA,EAAGG,CAAAA,CAAK,UAAU,CAAA,GAAA,CAAK,CAAA,CACzC,QAAA,EAAU,CAAA,GAAA,EACtD,CAAA,cAIApD,CAAAA,CAAQ,IAAA,CAAK,CACT,KAAA,CAAOkD,CAAAA,CACP,YAAA,CAAcN,CAAAA,CAAK,cAAc,IAAA,CAAK,GAAG,GAAK,EAAA,CAG9C,cAAA,CAAgBA,EAAK,cAAA,EAAgB,IAAA,CAAK,GAAG,CAAA,EAAK,GAClD,SAAA,CAAWA,CAAAA,CAAK,WAAa,EAAA,CAC7B,4BAAA,CAA8BA,EAAK,4BAAA,EAAgC,EAAA,CACnE,UAAA,CAAYA,CAAAA,CAAK,YAAc,EAAA,CAC/B,OAAA,CAASA,EAAK,OAAA,EAAW,CAAA,CAAA,CACzB,MAAOA,CAAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAG,GAAK,EAAA,CAChC,OAAA,CAASA,EAAK,OAAA,EAAW,EAAA,CACzB,aAAcA,CAAAA,CAAK,YAAA,EAAgB,EAAA,CACnC,EAAA,CAAIA,EAAK,EAAA,EAAM,EAAA,CACf,OAAA,CAASA,CAAAA,CAAK,SAAW,EAAA,CACzB,cAAA,CAAgBA,CAAAA,CAAK,cAAA,EAAkB,GACvC,WAAA,CAAaA,CAAAA,CAAK,aAAa,IAAA,CAAK,GAAG,GAAK,EAAA,CAC5C,mBAAA,CAAqB,IAAA,CAAK,SAAA,CAAUA,EAAK,mBAAmB,CAAA,EAAK,GACjE,sBAAA,CAAwBA,CAAAA,CAAK,uBAAyB,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAK,sBAAsB,EAAI,KAAA,CAAA,CACpG,OAAA,CAASA,EAAK,OAAA,EAAW,SAAA,CACzB,eAAgBA,CAAAA,CAAK,cAAA,EAAkB,EAAA,CACvC,iBAAA,CAAmBA,EAAK,iBAAA,EAAqB,CAAA,CAC7C,mBAAoBA,CAAAA,CAAK,kBAAA,EAAsB,EAC/C,gBAAA,CAAkBA,CAAAA,CAAK,gBAAA,EAAoB,CAAA,CAC3C,oBAAqBA,CAAAA,CAAK,mBAAA,EAAuB,GACjD,QAAA,CAAUA,CAAAA,CAAK,UAAY,CAAA,CAC/B,CAAC,EACH,CAED,CAEGlE,CAAAA,CAAQ,IAAA,CAAK,gBAAiBsB,CAAAA,CAAQ,CAAC,CAAC,CAAA,CACxC,IAAMqD,CAAAA,CAAerD,CAAAA,CAAQ,IAAII,CAAAA,EAAU,IAAA,CAAK,UAAUA,CAAM,CAAC,EAAE,IAAA,CAAK;AAAA,CAAI,EACzEkD,CAAA,CAAA,aAAA,CAAcjB,CAAAA,CAAcgB,EAAc,OAAO,CAAA,CACpD,GAAI,CACA3E,CAAAA,CAAQ,IAAA,CAAK,sCAAsC,EACnD,IAAM6B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI,CAAA,EAAGc,CAAQ,CAAA,cAAA,EAAiB+D,CAAY,CAAA,IAAA,EAAO7D,CAAM,EAAE,CAAA,CAC7E+B,CAAAA,CAAQ,QAAQ7B,CAAAA,CAAQ,IAAA,CAAK,kBAAkB6B,CAAAA,CAAQ,MAAA,CAAO,QAAA,EAAS,CAAE,MAAM,CAAA,CAAE,EAErF7B,CAAAA,CAAQ,OAAA,CAAQ,sDAAsDF,CAAM;AAAA,CAAI,EAEpF,CAAA,MAASV,CAAAA,CAAO,CACZY,CAAAA,CAAQ,KAAA,CAAM,uCAAA,CAAyCZ,CAAK,CAAA,CAC5D,MACJ,CAEA,CAAA,MAASA,EAAgB,CACrBY,CAAAA,CAAQ,KAAA,CAAM,2DAAA,CAA6DZ,CAAK,CAAA,CAChF,MACJ,CAAA,OAAE,CACSwF,CAAA,CAAA,UAAA,CAAWjB,CAAY,CAAA,EAC3BiB,CAAA,CAAA,UAAA,CAAWjB,CAAY,EAGhC,CAEF,CChJA,IAAMtE,EAAAA,CAAaC,aAAAA,CAAc,YAAY,GAAG,CAAA,CAC1CC,EAAAA,CAAiBsF,CAAA,CAAA,OAAA,CAAQxF,EAAU,CAAA,CACnCyC,EAAAA,CAAc+C,CAAA,CAAA,OAAA,CAAQtF,EAAAA,CAAW,gCAAgC,CAAA,CAEvE,eAAsBuF,CAAAA,CAAYnF,CAAAA,CAAoBC,CAAAA,CAAkB,CACpEI,EAAQ,IAAA,CAAK;AAAA,2DAAA,CAA+D,CAAA,CAE5E,IAAMF,CAAAA,CAAc+E,CAAA,CAAA,OAAA,CAAQtF,GAAW,CAAA,EAAGI,CAAU,CAAA,aAAA,CAAe,CAAA,CAC7DqC,EAAmB6C,CAAA,CAAA,OAAA,CAAQtF,EAAAA,CAAW,CAAA,EAAGI,CAAU,yBAAyB,CAAA,CAC5EsC,CAAAA,CAAa8C,CAAA,CAAA,YAAA,CAAajD,EAAAA,CAAQ,MAAM,CAAA,CACxCI,CAAAA,CAAS,IAAA,CAAK,MAAMD,CAAO,CAAA,CAE3BE,CAAAA,CAAe,IAAI,IACzB,IAAA,IAAWC,CAAAA,IAAWF,CAAAA,CAClBC,CAAAA,CAAa,IAAIC,CAAAA,CAAQ,IAAA,CAAK,WAAA,EAAY,CAAGA,CAAO,CAAA,CAGxDpC,CAAAA,CAAQ,IAAA,CAAK,mEAAmE,CAAA,CAChF,IAAM0D,CAAAA,CAAM,kHAAA,CAEZ,GAAI,CACA,IAAMsB,CAAAA,CAAM,MAAM,MAAMtB,CAAG,CAAA,CAC3B,GAAI,CAACsB,EAAI,EAAA,CACL,MAAM,IAAI,KAAA,CAAM,sDAAsDA,CAAAA,CAAI,UAAU,CAAA,CAAE,CAAA,CAI1F,IAAMvC,CAAAA,CAAAA,CADU,MAAMuC,CAAAA,CAAI,IAAA,IACJ,KAAA,CAAM;AAAA,CAAI,EAEhChF,CAAAA,CAAQ,OAAA,CAAQ,mCAAmC,MAAA,CAAOyC,CAAAA,CAAM,MAAM,CAAC,CAAA,oCAAA,CAAsC,EAC7G,IAAMnB,CAAAA,CAAoB,EAAC,CAE3B,IAAA,IAAWT,KAAQ4B,CAAAA,CAAO,CACtB,GAAI,CAAC5B,CAAAA,CAAK,IAAA,EAAK,CAAG,SAElB,IAAMC,CAAAA,CAAQD,EAAK,KAAA,CAAM,GAAG,EACtBoE,CAAAA,CAAQnE,CAAAA,CAAM,CAAC,CAAA,EAAG,IAAA,GAClBoE,CAAAA,CAAMpE,CAAAA,CAAM,CAAC,CAAA,EAAG,IAAA,GAChBgC,CAAAA,CAAKhC,CAAAA,CAAM,CAAC,CAAA,EAAG,MAAK,CAAE,WAAA,GAE5B,GAAI,CAACmE,GAAS,CAACC,CAAAA,EAAO,CAACpC,CAAAA,CAAI,SAE3B,IAAMK,CAAAA,CAAchB,CAAAA,CAAa,IAAIW,CAAE,CAAA,CAEjCpB,EAAoB,CACtB,KAAA,CAAO,CAAA,EAAGuD,CAAK,IAAIC,CAAG,CAAA,CAAA,CACtB,aAAcpC,CAAAA,CACd,MAAA,CAAQK,GAAa,MAAA,EAAU,EAAA,CAC/B,YAAaA,CAAAA,EAAa,YAAA,EAAgB,GAC1C,IAAA,CAAMA,CAAAA,EAAa,MAAQ,EAAA,CAC3B,MAAA,CAAQA,GAAa,MAAA,EAAU,EAAA,CAC/B,KAAA,CAAOA,CAAAA,EAAa,WAAa,EAAA,CACjC,OAAA,CAASA,GAAa,OAAA,EAAW,EAAA,CACjC,SAAUA,CAAAA,EAAa,QAAA,EAAY,GACnC,aAAA,CAAeA,CAAAA,EAAa,eAAiB,EAAA,CAC7C,eAAA,CAAiBA,GAAa,eAAA,EAAmB,EAAA,CACjD,UAAWA,CAAAA,EAAa,YAAA,CAAe,MAAA,CAAO,MAAA,CAAOA,EAAY,YAAY,CAAA,CAAE,CAAC,CAAA,EAAK,EAAA,CAAK,GAC1F,KAAA,CAAOA,CAAAA,EAAa,OAAS,EAAA,CAE7B,QAAA,CAAUA,GAAa,SAAA,GAAY,CAAC,GAAG,QAAA,EAAY,EAAA,CAEnD,WAAYA,CAAAA,EAAa,SAAA,GAAY,CAAC,CAAA,EAAG,eAAiB,EAAA,CAE1D,YAAA,CAAcA,GAAa,SAAA,GAAY,CAAC,GAAG,MAAA,EAAU,EAAA,CACrD,IAAKA,CAAAA,EAAa,GAAA,EAAO,GACzB,WAAA,CAAaA,CAAAA,EAAa,aAAe,EAAA,CACzC,SAAA,CAAWA,GAAa,SAAA,EAAa,EACzC,CAAA,CAEA7B,CAAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAUI,CAAM,CAAC,EACvC,CAEA1B,CAAAA,CAAQ,IAAA,CAAK,yBAAyB,MAAA,CAAOsB,CAAAA,CAAQ,MAAM,CAAC,CAAA,sCAAA,CAAwC,EACjGyD,CAAA,CAAA,aAAA,CAAc/C,CAAAA,CAAaV,EAAQ,IAAA,CAAK;AAAA,CAAI,EAAG,OAAO,CAAA,CAEzDtB,CAAAA,CAAQ,KAAA,CAAM,8CAA8C,CAAA,CAE5D,IAAM4B,CAAAA,CAAM,CAAA,EAAGhC,CAAQ,CAAA,aAAA,EAAgBoC,CAAW,CAAA,OAAA,EAAUlC,CAAM,GAC5D+B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI8C,CAAG,EAEzBC,CAAAA,CAAQ,MAAA,EAAQ7B,CAAAA,CAAQ,GAAA,CAAI,0BAA0B6B,CAAAA,CAAQ,MAAA,CAAO,QAAA,EAAS,CAAE,MAAM,CAAA,CAAE,EAC5F7B,CAAAA,CAAQ,OAAA,CAAQ,kEAAkEF,CAAM;AAAA,CAAI,EAEhG,CAAA,MAASV,CAAAA,CAAO,CACZY,EAAQ,KAAA,CAAM;AAAA,sCAAA,CAAA,CAA4CZ,CAAK,CAAA,CAC/D,OAAA,CAAQ,IAAA,CAAK,CAAC,EAClB,CAAA,OAAE,CACU2F,CAAA,CAAA,UAAA,CAAW/C,CAAW,CAAA,EACvB+C,CAAA,CAAA,UAAA,CAAW/C,CAAW,EAEjC,CACJ,CC1FA,IAAM3C,EAAAA,CAAaC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAC1CC,EAAAA,CAAYC,UAAAA,CAAK,OAAA,CAAQH,EAAU,CAAA,CAEzC,eAAsB8F,EAAAA,CAAiBxF,CAAAA,CAAoBC,CAAAA,CAAkB,CACzEI,CAAAA,CAAQ,GAAA,CAAI;AAAA,yDAAA,CAA6D,CAAA,CACzE,IAAMF,CAAAA,CAASN,UAAAA,CAAK,QAAQD,EAAAA,CAAW,CAAA,EAAGI,CAAU,CAAA,WAAA,CAAa,CAAA,CAC3DyF,EAAgB5F,UAAAA,CAAK,OAAA,CAAQD,GAAW,CAAA,EAAGI,CAAU,uBAAuB,CAAA,CAE5E0F,CAAAA,CAAU,IAAI,GAAA,CACd/D,CAAAA,CAAoB,EAAC,CACrBzB,CAAAA,CAAO,CAAC,wGAAA,CAA0G,qGAAqG,EAEvNyF,CAAAA,CAAYjF,YAAAA,CACVC,QAAQC,SAAAA,CAAUC,KAAK,EAAG,GAAA,CAAKD,SAAAA,CAAUC,KAAK,CAAA,CAAG,GAAA,CAAKD,UAAUC,KAAK,CAAA,CAAG,IAAKD,SAAAA,CAAUC,KAAK,CAAC,CAAA,CAC3F,GAAA,CAAIF,QAAQ,GAAA,CAAKC,SAAAA,CAAUC,KAAK,CAAC,CAAA,CAAE,YAAY,CAAA,CAChD,GAAG,SAAA,EAAU,CAAE,GAAG,OAAA,EAC3B,EAEA,GAAI,CACA,IAAM+E,CAAAA,CAAa,MAAM,MAAM1F,CAAAA,CAAK,CAAC,CAAC,CAAA,CACtC,GAAI,CAAC0F,CAAAA,CAAW,EAAA,CAAI,MAAM,IAAI,KAAA,CAAM,gDAAgDA,CAAAA,CAAW,UAAU,EAAE,CAAA,CAG3G,IAAM9C,GADU,MAAM8C,CAAAA,CAAW,IAAA,EAAK,EAChB,KAAA,CAAM;AAAA,CAAI,EAAE,KAAA,CAAM,CAAC,CAAA,CAEnC9E,CAAAA,CAAYC,UAAU,GAAG,CAAA,CAAE,KAAA,CAAM,GAAA,GACjCC,CAAAA,CAAYF,CAAAA,CAAU,GAAA,CAAIH,OAAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,EAC/CkF,CAAAA,CAAwBnF,YAAAA,CAC1BC,OAAAA,CAAQ,GAAG,EAAE,MAAA,CAAOK,CAAAA,CAAU,KAAA,CAAM,GAAA,GAAM,GAAA,CAAIF,CAAS,EAAE,EAAA,CAAG,OAAA,EAAS,CACzE,CAAA,CAEMgF,CAAAA,CAAwBpF,YAAAA,CAC1BqF,MAAMpF,OAAAA,CAAQ,YAAY,CAAA,CAAGA,OAAAA,CAAQ,WAAW,CAAA,CAAGA,OAAAA,CAAQ,GAAG,CAAC,EAC/D,CAAC,GAAA,CAAK,GAAG,CACb,EAIA,IAAA,IAAWO,CAAAA,IAAQ4B,CAAAA,CAAO,CACtB,GAAI,CAAC5B,CAAAA,CAAK,IAAA,EAAK,CAAG,SAElB,GAAM,CAAC8E,CAAAA,CAASC,CAAAA,CAAWC,CAAgB,CAAA,CAAIhF,CAAAA,CAAK,MAAM2E,CAAqB,CAAA,CAI/E,GAFI,CAACG,CAAAA,EAAW,CAACL,CAAAA,CAAU,KAAKK,CAAO,CAAA,EAEnCN,CAAAA,CAAQ,GAAA,CAAIM,CAAO,CAAA,CAAG,SAC1BN,CAAAA,CAAQ,GAAA,CAAIM,CAAO,CAAA,CAEnB,IAAMG,CAAAA,CAAeD,CAAAA,CAAiB,QAAQJ,CAAAA,CAAuB,EAAE,CAAA,CAAE,IAAA,GAEnE/D,CAAAA,CAAS,CACX,KAAA,CAAO,CAAA,EAAGiE,CAAO,CAAA,GAAA,CAAA,CACjB,IAAA,CAAMC,CAAAA,CACN,OAAA,CAASE,CACb,CAAA,CAEAxE,CAAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAUI,CAAM,CAAC,EACvC,CAEA1B,CAAAA,CAAQ,QAAQ,CAAA,mDAAA,EAAsD,MAAA,CAAOsB,CAAAA,CAAQ,MAAM,CAAC,CAAA,YAAA,CAAc,CAAA,CAC1GtB,CAAAA,CAAQ,GAAA,CAAI,4DAA4D,CAAA,CACxE,IAAM+F,EAAa,MAAM,KAAA,CAAMlG,EAAK,CAAC,CAAC,CAAA,CAEtC,GAAI,CAACkG,CAAAA,CAAW,EAAA,CAAI,MAAM,IAAI,MAAM,CAAA,6CAAA,EAAgDA,CAAAA,CAAW,UAAU,CAAA,CAAE,EAE3G,IAAMC,CAAAA,CAAAA,CADc,MAAMD,CAAAA,CAAW,IAAA,IACJ,KAAA,CAAM;AAAA,CAAI,CAAA,CACrCrD,EAAerC,YAAAA,CAAaC,OAAAA,CAAQ,GAAG,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,CAAA,CACzD2F,CAAAA,CAAe,EAGnB,IAAA,IAAWpF,CAAAA,IAAQmF,EAAc,CAC7B,IAAME,EAAUrF,CAAAA,CAAK,IAAA,EAAK,CAC1B,GAAI,CAACqF,CAAAA,EAAWxD,EAAa,IAAA,CAAKwD,CAAO,EAAG,SAE5C,IAAM9B,EAAK8B,CAAAA,CAIX,GAFI,CAACZ,CAAAA,CAAU,IAAA,CAAKlB,CAAE,GAElBiB,CAAAA,CAAQ,GAAA,CAAIjB,CAAE,CAAA,CAAG,SACrBiB,CAAAA,CAAQ,IAAIjB,CAAE,CAAA,CAEd,IAAM1C,CAAAA,CAAS,CACX,KAAA,CAAO0C,EACP,IAAA,CAAM,SAAA,CACN,QAAS,iBACb,CAAA,CAEA9C,EAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUI,CAAM,CAAC,CAAA,CACnCuE,IACJ,CAEAjG,CAAAA,CAAQ,QAAQ,CAAA,yCAAA,EAA4C,MAAA,CAAOiG,CAAY,CAAC,CAAA,mCAAA,EAAsC,MAAA,CAAO3E,CAAAA,CAAQ,MAAM,CAAC,EAAE,CAAA,CAE1IA,CAAAA,CAAQ,OAAS,CAAA,EACjBtB,CAAAA,CAAQ,IAAI,iBAAA,CAAmBsB,CAAAA,CAAQ,CAAC,CAAC,CAAA,CAG7CtB,CAAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,MAAA,CAAOsB,CAAAA,CAAQ,MAAM,CAAC,CAAA,oCAAA,CAAsC,EAC3F6E,UAAAA,CAAG,aAAA,CAAcf,CAAAA,CAAe9D,CAAAA,CAAQ,IAAA,CAAK;AAAA,CAAI,EAAG,OAAO,CAAA,CAC3DtB,CAAAA,CAAQ,GAAA,CAAI,wCAAwC,CAAA,CAEpD,IAAM4B,CAAAA,CAAM,CAAA,EAAGhC,CAAQ,CAAA,aAAA,EAAgBwF,CAAa,CAAA,OAAA,EAAUtF,CAAM,GAC9D+B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI8C,CAAG,EACzBC,CAAAA,CAAQ,MAAA,EAAQ7B,CAAAA,CAAQ,GAAA,CAAI,oBAAoB6B,CAAAA,CAAQ,MAAA,CAAO,QAAA,EAAS,CAAE,MAAM,CAAA,CAAE,EACtF7B,CAAAA,CAAQ,OAAA,CAAQ,0DAA0DF,CAAM;AAAA,CAAI,EAGxF,CAAA,MAASV,CAAAA,CAAO,CACZY,EAAQ,KAAA,CAAM;AAAA,gCAAA,CAAA,CAAsCZ,CAAK,CAAA,CACzD,OAAA,CAAQ,IAAA,CAAK,CAAC,EAClB,CAAA,OAAE,CACM+G,UAAAA,CAAG,WAAWf,CAAa,CAAA,EAC3Be,UAAAA,CAAG,UAAA,CAAWf,CAAa,EAEnC,CACJ,CCnHA,IAAM/F,GAAaC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAC1CC,GAAYC,UAAAA,CAAK,OAAA,CAAQH,EAAU,CAAA,CAEnC+G,GAAgB,CAClB,iBAAA,CAAmB,4FAAA,CACnB,UAAA,CAAY,yFAAA,CACZ,UAAA,CAAY,yFAAA,CACZ,UAAA,CAAY,0FACZ,UAAA,CAAY,yFAChB,CAAA,CAIA,eAAsBC,GAAe1G,CAAAA,CAAoBC,CAAAA,CAAkB0G,CAAAA,CAAsC,CAE7G,IAAMC,CAAAA,CAAgB,0CAAA,CAChBjB,CAAAA,CAAYjF,YAAAA,CACVC,OAAAA,CAAQC,SAAAA,CAAUC,KAAK,CAAA,CAAG,IAAKD,SAAAA,CAAUC,KAAK,CAAA,CAAG,GAAA,CAAKD,UAAUC,KAAK,CAAA,CAAG,GAAA,CAAKD,SAAAA,CAAUC,KAAK,CAAC,CAAA,CAC3F,GAAA,CAAIF,OAAAA,CAAQ,GAAA,CAAKC,SAAAA,CAAUC,KAAK,CAAC,EAAE,UAAA,EAAY,CAAA,CAChD,EAAA,CAAG,WAAU,CAAE,EAAA,CAAG,OAAA,EAC3B,EACMkC,CAAAA,CAAerC,YAAAA,CAAaC,OAAAA,CAAQ,GAAG,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,EACzDkG,CAAAA,CAAuC,EAAC,CAU5C,GARI,MAAM,OAAA,CAAQF,CAAe,CAAA,CAC7BE,CAAAA,CAAQ,OAAO,OAAA,CAAQJ,EAAa,CAAA,CAC/B,MAAA,CAAO,CAAC,CAACK,CAAE,CAAA,GAAMH,EAAgB,QAAA,CAASG,CAAE,CAAC,CAAA,CAC7C,IAAI,CAAC,CAACA,CAAAA,CAAI/C,CAAG,KAAO,CAAE,EAAA,CAAA+C,CAAAA,CAAI,GAAA,CAAA/C,CAAI,CAAA,CAAE,CAAA,CACtB4C,CAAAA,GACfE,EAAQ,MAAA,CAAO,OAAA,CAAQJ,EAAa,CAAA,CAAE,IAAI,CAAC,CAACK,CAAAA,CAAI/C,CAAG,KAAO,CAAE,EAAA,CAAA+C,CAAAA,CAAI,GAAA,CAAA/C,CAAI,CAAA,CAAE,CAAA,CAAA,CAGtE8C,CAAAA,CAAM,SAAW,CAAA,CAAG,CACpBxG,CAAAA,CAAQ,IAAA,CAAK,mDAAmD,CAAA,CAChE,MACJ,CACA,GAAI,CACHA,CAAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAA,CAAOwG,CAAAA,CAAM,MAAM,CAAC,CAAA,qBAAA,CAAuB,EAEhF,IAAME,CAAAA,CAAWF,CAAAA,CAAM,GAAA,CAAI,MAAOG,CAAAA,EAAS,CACvC,IAAM3B,CAAAA,CAAM,MAAM,KAAA,CAAM2B,CAAAA,CAAK,GAAG,CAAA,CAChC,OAAO,CAAE,EAAA,CAAIA,CAAAA,CAAK,GAAI,GAAA,CAAA3B,CAAI,CAC9B,CAAC,EAEC4B,CAAAA,CAAiB,MAAM,OAAA,CAAQ,UAAA,CAAWF,CAAQ,CAAA,CACxD1G,CAAAA,CAAQ,OAAA,CAAQ,CAAA,2BAAA,EAA8B,MAAA,CAAO4G,CAAAA,CAAe,MAAM,CAAC,6BAA6B,CAAA,CAExG,IAAIC,CAAAA,CAAW,CAAA,CAGf,QAAW1H,CAAAA,IAAUyH,CAAAA,CAAgB,CAEjC,GAAIzH,EAAO,MAAA,GAAW,UAAA,CAAY,CAC9Ba,CAAAA,CAAQ,KAAA,CAAM,mBAAA,CAAqBb,CAAAA,CAAO,MAAM,EAChD,QACJ,CACA,GAAM,CAAE,GAAAsH,CAAAA,CAAI,GAAA,CAAAzB,CAAI,CAAA,CAAI7F,EAAO,KAAA,CACrB2H,CAAAA,CAAW,CAAA,EAAGL,CAAE,CAAA,CAAA,EAAIF,CAAa,CAAA,CAAA,CACjCjF,CAAAA,CAAoB,EAAC,CAG3B,GAFAtB,CAAAA,CAAQ,IAAA,CAAK,gCAAgCyG,CAAE,CAAA,GAAA,CAAK,CAAA,CAEhD,CAACzB,EAAI,EAAA,CAAI,CACLhF,CAAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmByG,CAAE,CAAA,EAAA,EAAKzB,CAAAA,CAAI,UAAU,CAAA,CAAE,CAAA,CACxD,QACJ,CAGA,IAAMvC,CAAAA,CAAAA,CADc,MAAMuC,CAAAA,CAAI,IAAA,IACJ,KAAA,CAAM;AAAA,CAAI,CAAA,CAEpC,IAAA,IAAWnE,CAAAA,IAAQ4B,CAAAA,CAAO,CACtB,IAAMyD,CAAAA,CAAUrF,CAAAA,CAAK,IAAA,EAAK,CAC1B,GAAI,CAACqF,GAAWxD,CAAAA,CAAa,IAAA,CAAKwD,CAAO,CAAA,CAAG,SAE5C,IAAM9B,CAAAA,CAAK8B,CAAAA,CACX,GAAI,CAACZ,CAAAA,CAAU,IAAA,CAAKlB,CAAE,CAAA,CAAG,SAEzB,IAAM1C,CAAAA,CAAS,CACX,KAAA,CAAO0C,CAAAA,CACP,OAAA,CAAS0C,CACZ,CAAA,CAEAD,CAAAA,EAAAA,CACDvF,CAAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUI,CAAM,CAAC,EACvC,CAMJ,GAJA1B,CAAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAayG,CAAE,CAAA,SAAA,CAAW,CAAA,CACvCzG,CAAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,MAAA,CAAOsB,EAAQ,MAAM,CAAC,CAAA,CAAE,CAAA,CACpEtB,CAAAA,CAAQ,IAAA,CAAK,8BAA8B,MAAA,CAAO6G,CAAQ,CAAC,CAAA,CAAE,CAAA,CAEzDvF,CAAAA,CAAQ,OAAS,CAAA,CAAG,CACpBtB,CAAAA,CAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqBsB,CAAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA,CAC9CtB,CAAAA,CAAQ,IAAA,CAAK,CAAA,kDAAA,EAAqDyG,CAAE,OAAO,CAAA,CAC3E,IAAMM,CAAAA,CAAWvH,UAAAA,CAAK,OAAA,CAAQD,EAAAA,CAAW,GAAGI,CAAU,CAAA,MAAA,EAAS8G,CAAE,CAAA,KAAA,CAAO,CAAA,CAClE3G,CAAAA,CAASN,WAAK,OAAA,CAAQD,EAAAA,CAAW,CAAA,EAAGI,CAAU,CAAA,CAAA,EAAI8G,CAAE,CAAA,KAAA,CAAO,CAAA,CAEjEN,UAAAA,CAAG,aAAA,CAAcY,CAAAA,CAAUzF,CAAAA,CAAQ,IAAA,CAAK;AAAA,CAAI,CAAA,CAAG,OAAO,CAAA,CACtD,OAAA,CAAQ,IAAI,CAAA,yCAAA,EAA4CxB,CAAM,KAAK,CAAA,CAEnE,IAAM8B,EAAM,CAAA,EAAGhC,CAAQ,gBAAgBmH,CAAQ,CAAA,OAAA,EAAUjH,CAAM,CAAA,CAAA,CACzD+B,CAAAA,CAAU,MAAM/C,CAAAA,CAAI8C,CAAG,CAAA,CACzBC,EAAQ,MAAA,EAAQ7B,CAAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB6B,CAAAA,CAAQ,OAAO,QAAA,EAAS,CAAE,IAAA,EAAM,CAAA,CAAE,CAAA,CAEpFsE,WAAG,UAAA,CAAWY,CAAQ,GAClBZ,UAAAA,CAAG,UAAA,CAAWY,CAAQ,CAAA,CAE9B/G,CAAAA,CAAQ,OAAA,CAAQ,CAAA,4BAAA,EAA+ByG,CAAE,CAAA;AAAA,CAAS,EAC9D,CAAA,KACIzG,CAAAA,CAAQ,IAAA,CAAK,6CAA6CyG,CAAE,CAAA;AAAA,CAAe,EAEnF,CAEAzG,CAAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,CAAgF,EAEhG,CAAA,MAASZ,CAAAA,CAAO,CACZY,EAAQ,KAAA,CAAM;AAAA,wCAAA,CAAA,CAA8CZ,CAAK,CAAA,CACjE,OAAA,CAAQ,KAAK,CAAC,EAClB,CACJ,CCjHA,IAAMC,GAAaC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAC1CC,EAAAA,CAAYC,WAAK,OAAA,CAAQH,EAAU,CAAA,CAEzC,eAAsB2H,GAAarH,CAAAA,CAAoBD,CAAAA,CAAmB4G,EAAqC1G,CAAAA,CAAkB,CAC7HI,EAAQ,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA,CAE+C,EAE3D,IAAMiH,CAAAA,CAAWzH,UAAAA,CAAK,OAAA,CAAQD,GAAW,SAAS,CAAA,CAE5C2H,CAAAA,CAAc1H,UAAAA,CAAK,QAAQyH,CAAAA,CAAU,eAAe,EAElDE,CAAA,CAAA,UAAA,CAAWD,CAAW,GACvBC,CAAA,CAAA,SAAA,CAAUD,CAAAA,CAAa,CAAE,SAAA,CAAW,IAAK,CAAC,CAAA,CAGjD,GAAI,CAAA,CAEgB,MAAM,OAAA,CAAQ,UAAA,CAAW,CACrCzH,CAAAA,CAAaC,EAAWC,CAAAA,CAAYC,CAAQ,EAC5CmC,CAAAA,CAAgBpC,CAAAA,CAAYC,CAAQ,CAAA,CACpC6D,CAAAA,CAAY9D,CAAAA,CAAYC,CAAQ,EAChCkF,CAAAA,CAAYnF,CAAAA,CAAYC,CAAQ,CAAA,CAChCuF,GAAiBxF,CAAAA,CAAYC,CAAQ,CAAA,CACrCyG,EAAAA,CAAe1G,EAAYC,CAAAA,CAAU0G,CAAe,CACxD,CAAC,CAAA,EAEO,QAAQ,CAACnH,CAAAA,CAAQiI,CAAAA,GAAU,CAC3BjI,EAAO,MAAA,GAAW,UAAA,EAClBa,EAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAOoH,CAAK,CAAC,CAAA,SAAA,CAAA,CAAa,MAAA,CAAOjI,EAAO,MAAM,CAAC,EAExF,CAAC,CAAA,CACDa,EAAQ,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,CAE0C,EAC3D,CAAA,MAASZ,CAAAA,CAAO,CACZY,EAAQ,KAAA,CAAM;AAAA;AAAA,yBAAA,EAC4B,MAAA,CAAOZ,CAAK,CAAC;AAAA;AAAA,CACC,EAC5D,CACJ,CCnCA,IAAMiI,EAAAA,CAAc7H,UAAAA,CAAK,KAAK8H,EAAAA,CAAG,OAAA,GAAW,cAAA,CAAgB,aAAa,EAEzE,eAAsBC,EAAAA,CAAY5H,EAAoB6H,CAAAA,CAA6B,CAE1EC,WAAWJ,EAAW,CAAA,GACvBrH,EAAQ,KAAA,CAAM,0EAA0E,EACxF,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGlB,IAAM0H,CAAAA,CAAa,MAAMC,QAAAA,CAASN,EAAAA,CAAa,OAAO,CAAA,CAChDO,CAAAA,CAAQ,KAAK,KAAA,CAAMF,CAAU,EAEnC,GAAI,CAACE,EAAM,iBAAA,EAAqBA,CAAAA,CAAM,kBAAkB,MAAA,GAAW,CAAA,CAAG,CAClE5H,CAAAA,CAAQ,IAAA,CAAK,6CAA6C,CAAA,CAC1D,MACJ,CAEA,GAAIwH,CAAAA,CAAK,CACNxH,EAAQ,IAAA,CAAK,gCAAgC,EAC7C,MAAMgH,EAAAA,CAAWrH,EAAYiI,CAAAA,CAAM,SAAA,CAAW,KAAMA,CAAAA,CAAM,WAAW,EACrE5H,CAAAA,CAAQ,OAAA,CAAQ,yCAAoC,CAAA,CACpD,MACH,CAEAA,CAAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C4H,EAAM,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,EAE5F,IAAMC,CAAAA,CAAiBD,EAAM,iBAAA,CAAkB,MAAA,CAAOE,GAAKA,CAAAA,CAAE,UAAA,CAAW,UAAU,CAAA,EAAKA,CAAAA,GAAM,WAAW,CAAA,CAClGC,CAAAA,CAAkBH,CAAAA,CAAM,iBAAA,CAAkB,MAAA,CAAOE,CAAAA,EAAK,CAACA,CAAAA,CAAE,UAAA,CAAW,UAAU,CAAA,EAAKA,CAAAA,GAAM,WAAW,CAAA,CAGtGC,CAAAA,CAAgB,SAAS,KAAK,CAAA,EAC9B,MAAMtI,CAAAA,CAAamI,CAAAA,CAAM,WAAa,EAAA,CAAIjI,CAAAA,CAAYiI,EAAM,WAAW,CAAA,CAEvEG,CAAAA,CAAgB,QAAA,CAAS,MAAM,CAAA,EAC/B,MAAMhG,CAAAA,CAAgBpC,CAAAA,CAAYiI,EAAM,WAAW,CAAA,CAEnDG,EAAgB,QAAA,CAAS,WAAW,GACpC,MAAMjD,CAAAA,CAAYnF,EAAYiI,CAAAA,CAAM,WAAW,EAE/CG,CAAAA,CAAgB,QAAA,CAAS,OAAO,CAAA,EAChC,MAAM5C,EAAAA,CAAiBxF,CAAAA,CAAYiI,CAAAA,CAAM,WAAW,EAEpDG,CAAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAC9B,MAAMtE,EAAY9D,CAAAA,CAAYiI,CAAAA,CAAM,WAAW,CAAA,CAG/CC,CAAAA,CAAe,MAAA,CAAS,GACxB,MAAMxB,EAAAA,CAAe1G,EAAYiI,CAAAA,CAAM,WAAA,CAAaC,CAAc,CAAA,CAGtE7H,CAAAA,CAAQ,OAAA,CAAQ,4CAAuC,EAE3D","file":"chunk-MNLRCNRV.js","sourcesContent":["import child from 'node:child_process';\nimport util from 'node:util';\nimport type { ExecOptions } from 'node:child_process';\n\nexport interface RunResult {\n stdout: string | Buffer;\n stderr: string | Buffer;\n}\n\nconst execAsync = util.promisify(child.exec);\n\nexport const run = async (command: string, options: ExecOptions = {}): Promise<RunResult> => {\n try {\n const { stdout, stderr } = await execAsync(command, {\n ...options,\n maxBuffer: options.maxBuffer ?? 1024 * 1024 * 10, \n });\n\n const result: RunResult = {\n stdout: typeof stdout === 'string' ? stdout.trim() : stdout,\n stderr: typeof stderr === 'string' ? stderr.trim() : stderr,\n };\n\n console.log(`[run]: ${command}`);\n if (result.stdout) console.log('stdout:', result.stdout);\n if (result.stderr) console.error('stderr:', result.stderr);\n\n return result;\n } catch (error: unknown) {\n console.error(`Execution failed for command: \"${command}\"`);\n \n if (typeof error === 'object' && error !== null) {\n const e = error as { stderr?: string; stdout?: string };\n if (e.stderr) console.error('Error Output:', e.stderr);\n }\n \n throw error;\n }\n};","import { createRegExp, exactly, digit, oneOrMore, charNotIn } from \"magic-regexp\";\nimport * as fs from 'fs';\nimport { run } from \"../utils/run.js\";\nimport { fileURLToPath } from \"url\";\nimport path from \"path\";\nimport { AsnDictionaryEntry, BGPRouteRaw, BgpRecord } from \"../types/bgp.js\";\nimport { consola } from \"consola\";\n\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n\nexport async function getBGPAndASN(userAgent: string, outputPath: string, mmdbPath: string) {\n const urls = ['https://bgp.tools/asns.csv', 'https://bgp.tools/table.jsonl'];\n const output = path.resolve(__dirname, `${outputPath}/asn.mmdb`);\n const tempASNJson = path.resolve(__dirname, `${outputPath}temp_asn_data.json`);\n try {\n consola.info(\"\\n[ASN/BGP] Fetching ASN Dictionary from BGP.tools...\");\n const ansRes = await fetch(urls[0], {\n method: 'GET',\n headers: {\n 'User-Agent': userAgent\n }\n });\n\n // AS1,\"Level 3 Parent, LLC\",Unknown\n // AS10,CSNET Coordination and Information Center,Unknown\n\n const rawAsnCsv = await ansRes.text();\n const asnDictionary = new Map<number, AsnDictionaryEntry>();\n const asnLines = rawAsnCsv.split('\\n').slice(1);\n \n const regex = createRegExp(exactly('AS').and(oneOrMore(digit).groupedAs('asnNumber')));\n \n const nonQuotes = charNotIn('\"').times.any();\n const quotePair = nonQuotes.and(exactly('\"')).times(2);\n const splitRegex = createRegExp(\n exactly(',').before(quotePair.times.any().and(nonQuotes).at.lineEnd())\n );\n\n for (const line of asnLines) {\n if (!line) continue;\n const parts = line.split(splitRegex);\n\n const match = parts[0].match(regex);\n const asnNumber = match?.groups.asnNumber ? parseInt(match.groups.asnNumber, 10) : null;\n \n const quoteStripRegex = createRegExp(exactly('\"').at.lineStart().or(exactly('\"').at.lineEnd()), ['g']);\n const asnName = parts[1]?.replace(quoteStripRegex, '').trim() || 'Unknown';\n const asnClass = parts[2]?.trim() || 'Unknown';\n \n if (asnNumber !== null) {\n asnDictionary.set(asnNumber, { name: asnName, type: asnClass });\n }\n }\n consola.success(`[ASN/BGP] SUCCESS: Loaded ${String(asnDictionary.size)} ASN definitions.`);\n consola.info(\"[ASN/BGP] Fetching Routing Table...\");\n const tableRes = await fetch(urls[1], {\n method: 'GET',\n headers: {\n 'User-Agent': userAgent\n }\n });\n\n const rawTable = await tableRes.text();\n consola.info(\"[ASN/BGP] Mapping CIDR to ASN data...\");\n const routes = rawTable.split('\\n');\n const results = [];\n\n for (const route of routes) {\n if (!route) continue;\n // {\"CIDR\":\"1.1.1.0/24\",\"ASN\":13335,\"Hits\":509}\n const parsed = JSON.parse(route) as BGPRouteRaw;\n if (parsed.Hits < 10) continue; \n \n const dictionaryLookup = asnDictionary.get(parsed.ASN) ?? { name: 'Unknown', type: 'Unknown' };\n\n const record: BgpRecord = {\n range: parsed.CIDR,\n asn_id: String(parsed.ASN),\n asn_name: dictionaryLookup.name,\n classification: dictionaryLookup.type,\n hits: String(parsed.Hits)\n };\n results.push(JSON.stringify(record));\n }\n\n if (results.length > 0) {\n consola.log('[ASN/BGP] SAMPLE:', results[0]);\n }\n\n consola.info(`[ASN/BGP] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempASNJson, results.join('\\n'), 'utf-8');\n consola.info(`[ASN/BGP] Compiling MMDB with mmdbctl to ${output}...`);\n \n const cmd = `${mmdbPath} import --in ${tempASNJson} --out ${output}`;\n const convert = await run(cmd);\n\n if (convert.stdout) consola.log(`[ASN/BGP] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[ASN/BGP] COMPLETED: Successfully compiled ASN MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error(`\\n[ASN/BGP] ERROR during processing:`, error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempASNJson)) {\n fs.unlinkSync(tempASNJson);\n }\n }\n}\n","import { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport type { GlobalCountry, GlobalState, GlobalCity, CityGeoRecord } from \"../types/geography.js\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createRegExp, exactly } from \"magic-regexp\";\nimport { consola } from \"consola\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst dbPath = path.resolve(__dirname, './countries+states+cities.json');\n\nexport async function buildCitiesData(outputPath: string, mmdbPath: string) {\n consola.info('\\n[CITY/GEO] Building global geographic index from hierarchical database...');\n const output = path.resolve(__dirname, `${outputPath}/city.mmdb`);\n const tempGeoJson = path.resolve(__dirname, `${outputPath}/temp_city_data.json`);\n \n\n const rawData = fs.readFileSync(dbPath, 'utf8');\n const dbJson = JSON.parse(rawData) as GlobalCountry[];\n\n const countryIndex = new Map<string, { meta: GlobalCountry, states: Map<string, { meta: GlobalState, cities: Map<string, GlobalCity> }> }>();\n \n for (const country of dbJson) {\n const stateMap = new Map<string, { meta: GlobalState, cities: Map<string, GlobalCity> }>();\n \n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (country.states) {\n for (const state of country.states) {\n const cityMap = new Map<string, GlobalCity>();\n \n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (state.cities) {\n for (const city of state.cities) {\n cityMap.set(city.name.toLowerCase(), city);\n }\n }\n \n stateMap.set(state.state_code, { meta: state, cities: cityMap });\n }\n }\n \n countryIndex.set(country.iso2.toUpperCase(), { meta: country, states: stateMap });\n }\n\n try {\n consola.info('[CITY/GEO] Fetching validated geofeed CSV...');\n\n const res = await fetch('https://geolocatemuch.com/geofeeds/validated-all.csv');\n const csvText = await res.text();\n const lines = csvText.split('\\n');\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n \n consola.success(`[CITY/GEO] SUCCESS: Received ${String(lines.length)} IP ranges. Mapping to geographic index...`);\n const results: string[] = [];\n\n for (const line of lines) {\n if (!line.trim() || commentRegex.test(line)) continue;\n\n const parts = line.split(',');\n const prefix = parts[0]?.trim() || \"\";\n const country = parts[1]?.trim() || \"\";\n const region = parts[2]?.trim() || \"\";\n const city = parts[3]?.trim() || \"\";\n const zip = parts[4]?.trim() || \"\";\n\n if (!country && !city && !zip) continue;\n\n const cc = country.toUpperCase() || \"\";\n\n let emoji = \"\";\n let lat = '';\n let lon = '';\n let stateName = '';\n let countryMeta: Partial<GlobalCountry> = {};\n \n const countryData = countryIndex.get(cc);\n if (countryData) {\n countryMeta = countryData.meta;\n emoji = countryData.meta.emoji || \"\";\n \n \n if (region) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const regionCode = region.includes('-') ? region.split('-').pop()! : region;\n const stateData = countryData.states.get(regionCode);\n \n if (stateData) {\n stateName = stateData.meta.name || stateData.meta.state_code || \"\";\n \n if (city) {\n const cityData = stateData.cities.get(city.toLowerCase());\n if (cityData) {\n lat = cityData.latitude || \"\";\n lon = cityData.longitude || \"\";\n }\n }\n\n if (!lat && stateData.meta.latitude && stateData.meta.longitude) {\n lat = stateData.meta.latitude || \"\";\n lon = stateData.meta.longitude || \"\";\n }\n }\n }\n \n\n if (!lat && city) {\n for (const [, stateData] of countryData.states) {\n const cityData = stateData.cities.get(city.toLowerCase());\n if (cityData) {\n lat = cityData.latitude || \"\";\n lon = cityData.longitude || \"\";\n if (!stateName) stateName = stateData.meta.name || stateData.meta.state_code || \"\";\n break;\n }\n }\n }\n\n if (!lat && countryMeta.latitude && countryMeta.longitude) {\n lat = countryMeta.latitude || \"\";\n lon = countryMeta.longitude || \"\";\n }\n }\n\n const geoRecord: CityGeoRecord = {\n range: prefix,\n country_code: country,\n region: region || (countryMeta.region ?? \"\"),\n subregion: countryMeta.subregion ?? \"\",\n city: city,\n zip_code: zip,\n latitude: lat,\n longitude: lon,\n state: stateName,\n name: countryMeta.name ?? \"Unknown\",\n native: countryMeta.native ?? \"\",\n phone: countryMeta.phonecode ?? '',\n numericCode: countryMeta.numeric_code ?? \"\",\n continent: countryMeta.region ?? \"\",\n capital: countryMeta.capital ?? \"\",\n currency: countryMeta.currency ?? '',\n currency_name: countryMeta.currency_name ?? \"\",\n languages: countryMeta.translations ? Object.values(countryMeta.translations)[0] ?? \"\" : \"\",\n emoji: emoji,\n timezone: countryMeta.timezones?.[0]?.zoneName ?? \"\",\n utc_offset: countryMeta.timezones?.[0]?.gmtOffsetName ?? \"\",\n timeZoneName: countryMeta.timezones?.[0]?.tzName ?? \"\",\n tld: countryMeta.tld ?? \"\",\n nationality: countryMeta.nationality ?? \"\",\n };\n \n results.push(JSON.stringify(geoRecord));\n }\n \n consola.info(`[CITY/GEO] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempGeoJson, results.join('\\n'), 'utf-8');\n\n consola.start('[CITY/GEO] Compiling MMDB with mmdbctl...');\n \n const cmd = `${mmdbPath} import --in ${tempGeoJson} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.log(`[CITY/GEO] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[CITY/GEO] COMPLETED: Successfully compiled City MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error('\\n[CITY/GEO] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempGeoJson)) {\n fs.unlinkSync(tempGeoJson);\n }\n }\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport ipaddr from 'ipaddr.js';\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { OnionooPayload, TorRecord } from \"../types/tor.js\";\nimport consola from \"consola\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport async function getTorLists(outputPath: string, mmdbPath: string): Promise<void> {\n const url = 'https://onionoo.torproject.org/details';\n const output = path.resolve(__dirname, `${outputPath}/tor.mmdb`);\n const tempFileName = path.resolve(__dirname, `${outputPath}/temp_tor_nodes.json`);\n\ntry {\n\n consola.info(\"\\n[TOR] Fetching node data from Onionoo API...\");\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Accept-Encoding': 'gzip',\n 'Accept': 'application/json'\n }\n\n });\n\n\n\n if (!response.ok) {\n consola.error(`[TOR] ERROR: API fetch failed with status ${String(response.status)}`);\n return;\n }\n\n const data = await response.json() as OnionooPayload;\n consola.success('[TOR] SUCCESS: Data received, mapping relay nodes...');\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const rawNodes = data.relays || [];\n const toMap = rawNodes.filter((flags) => {\n\n const fl = flags.flags?.map(f => f.toLowerCase()) ?? [];\n return fl.includes(\"exit\") ||\n fl.includes(\"valid\") ||\n fl.includes(\"running\") ||\n fl.includes(\"stable\") ||\n fl.includes(\"hsdir\") &&\n flags.exit_addresses &&\n flags.or_addresses;\n });\n\n\n\n if (toMap.length === 0) {\n consola.warn(\"[TOR] WARNING: No relay nodes found matching criteria.\");\n return;\n }\n\n const results: TorRecord[] = [];\n\n for (const node of toMap) {\n const ipsToProcess = [\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(node.exit_addresses ?? []),\n ...(node.or_addresses ?? [])\n ];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!ipsToProcess) continue;\n\n for (const ip of ipsToProcess) {\n\n let cleanIp = ip;\n if (cleanIp.startsWith('[')) {\n cleanIp = cleanIp.split(']:')[0].substring(1);\n } else {\n cleanIp = cleanIp.split(':')[0];\n }\n\n const parsedIp = ipaddr.parse(cleanIp);\n let finalNetworkAddress: string;\n\n if (parsedIp.kind() === 'ipv4') {\n const ipv4 = parsedIp as ipaddr.IPv4;\n const networkAddress = ipaddr.IPv4.networkAddressFromCIDR(`${ipv4.toString()}/24`);\n finalNetworkAddress = `${networkAddress.toString()}/24`;\n } else if (parsedIp.kind() === 'ipv6') {\n const ipv6 = parsedIp as ipaddr.IPv6;\n const networkAddress = ipaddr.IPv6.networkAddressFromCIDR(`${ipv6.toString()}/64`);\n finalNetworkAddress = `${networkAddress.toString()}/64`;\n } else {\n continue;\n }\n\n results.push({\n range: finalNetworkAddress,\n or_addresses: node.or_addresses?.join(',') ?? '',\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n exit_addresses: node.exit_addresses?.join(',') ?? '',\n last_seen: node.last_seen ?? \"\",\n last_changed_address_or_port: node.last_changed_address_or_port ?? \"\",\n first_seen: node.first_seen ?? \"\",\n running: node.running ?? false,\n flags: node.flags?.join(',') ?? \"\",\n country: node.country ?? \"\",\n country_name: node.country_name ?? \"\",\n as: node.as ?? \"\",\n as_name: node.as_name ?? \"\",\n last_restarted: node.last_restarted ?? \"\",\n exit_policy: node.exit_policy?.join(',') ?? '',\n exit_policy_summary: JSON.stringify(node.exit_policy_summary) || '',\n exit_policy_v6_summary: node.exit_policy_v6_summary ? JSON.stringify(node.exit_policy_v6_summary) : undefined,\n contact: node.contact ?? \"Unknown\",\n version_status: node.version_status ?? \"\",\n guard_probability: node.guard_probability ?? 0,\n middle_probability: node.middle_probability ?? 0,\n exit_probability: node.exit_probability ?? 0,\n recommended_version: node.recommended_version ?? false,\n measured: node.measured ?? false,\n });\n }\n\n }\n\n consola.info('[TOR] SAMPLE:', results[0]);\n const ndjsonOutput = results.map(record => JSON.stringify(record)).join('\\n');\n fs.writeFileSync(tempFileName, ndjsonOutput, 'utf-8');\n try {\n consola.info('[TOR] Compiling MMDB with mmdbctl...');\n const convert = await run(`${mmdbPath} import -j -i ${tempFileName} -o ${output}`);\n if (convert.stdout) consola.info(`[TOR] mmdbctl: ${convert.stdout.toString().trim()}`);\n\n consola.success(`[TOR] COMPLETED: Successfully compiled Tor MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error(\"[TOR] ERROR: MMDB compilation failed:\", error);\n return;\n }\n\n } catch (error: unknown) {\n consola.error(\"[TOR] ERROR: Unexpected failure while fetching node list:\", error);\n return;\n } finally {\n if (fs.existsSync(tempFileName)) {\n fs.unlinkSync(tempFileName);\n }\n \n }\n\n} ","import { run } from \"../utils/run.js\";\nimport * as fs from 'fs';\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { GlobalCountry, GeoRecord } from \"../types/geography.js\";\nimport consola from \"consola\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst dbPath = path.resolve(__dirname, './countries+states+cities.json');\n\nexport async function getGeoDatas(outputPath: string, mmdbPath: string) {\n consola.info(\"\\n[GEO/COUNTRY] Building country index from local database...\");\n\n const output = path.resolve(__dirname, `${outputPath}/country.mmdb`);\n const tempGeoJson = path.resolve(__dirname, `${outputPath}/temp_country_data.json`);\n const rawData = fs.readFileSync(dbPath, 'utf8');\n const dbJson = JSON.parse(rawData) as GlobalCountry[];\n\n const countryIndex = new Map<string, GlobalCountry>();\n for (const country of dbJson) {\n countryIndex.set(country.iso2.toUpperCase(), country);\n }\n\n consola.info('[GEO/COUNTRY] Fetching global IPv4 Country mapping from Sapics...');\n const url = 'https://raw.githubusercontent.com/sapics/ip-location-db/refs/heads/main/geo-asn-country/geo-asn-country-ipv4.csv';\n\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`[GEO/COUNTRY] ERROR: Failed to fetch country data: ${res.statusText}`);\n }\n\n const csvText = await res.text();\n const lines = csvText.split('\\n');\n \n consola.success(`[GEO/COUNTRY] SUCCESS: Received ${String(lines.length)} global IP ranges. Enriching data...`);\n const results: string[] = [];\n\n for (const line of lines) {\n if (!line.trim()) continue;\n \n const parts = line.split(',');\n const start = parts[0]?.trim();\n const end = parts[1]?.trim();\n const cc = parts[2]?.trim().toUpperCase();\n \n if (!start || !end || !cc) continue;\n\n const countryMeta = countryIndex.get(cc);\n\n const record: GeoRecord = {\n range: `${start}-${end}`,\n country_code: cc,\n region: countryMeta?.region ?? '',\n numericCode: countryMeta?.numeric_code ?? \"\",\n name: countryMeta?.name ?? \"\",\n native: countryMeta?.native ?? \"\",\n phone: countryMeta?.phonecode ?? \"\",\n capital: countryMeta?.capital ?? \"\",\n currency: countryMeta?.currency ?? \"\",\n currency_name: countryMeta?.currency_name ?? \"\",\n currency_symbol: countryMeta?.currency_symbol ?? \"\",\n languages: countryMeta?.translations ? Object.values(countryMeta.translations)[0] ?? \"\" : \"\",\n emoji: countryMeta?.emoji ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n timezone: countryMeta?.timezones?.[0]?.zoneName ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n utc_offset: countryMeta?.timezones?.[0]?.gmtOffsetName ?? \"\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n timeZoneName: countryMeta?.timezones?.[0]?.tzName ?? \"\",\n tld: countryMeta?.tld ?? \"\",\n nationality: countryMeta?.nationality ?? \"\",\n subregion: countryMeta?.subregion ?? \"\"\n };\n\n results.push(JSON.stringify(record));\n }\n\n consola.info(`[GEO/COUNTRY] Writing ${String(results.length)} enriched entries to temporary JSON...`);\n fs.writeFileSync(tempGeoJson, results.join('\\n'), 'utf-8');\n\n consola.start('[GEO/COUNTRY] Compiling MMDB with mmdbctl...');\n\n const cmd = `${mmdbPath} import --in ${tempGeoJson} --out ${output}`;\n const convert = await run(cmd);\n \n if (convert.stdout) consola.log(`[GEO/COUNTRY] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[GEO/COUNTRY] COMPLETED: Successfully compiled Country MMDB to ${output}\\n`);\n\n } catch (error) {\n consola.error('\\n[GEO/COUNTRY] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempGeoJson)) {\n fs.unlinkSync(tempGeoJson);\n }\n }\n}\n","import fs from 'node:fs';\nimport { run } from \"../utils/run.js\";\nimport { createRegExp, exactly, charNotIn, anyOf, digit, oneOrMore } from 'magic-regexp';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport consola from 'consola';\n\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport async function getListOfProxies(outputPath: string, mmdbPath: string) {\n consola.log(\"\\n[PROXY] Fetching initial Proxy list from Awesome-lists...\");\n const output = path.resolve(__dirname, `${outputPath}/proxy.mmdb`);\n const tempProxyJson = path.resolve(__dirname, `${outputPath}/temp_proxy_data.json`);\n\n const seenIps = new Set<string>();\n const results: string[] = [];\n const urls = ['https://raw.githubusercontent.com/mthcht/awesome-lists/refs/heads/main/Lists/PROXY/ALL_PROXY_Lists.csv', 'https://raw.githubusercontent.com/firehol/blocklist-ipsets/refs/heads/master/firehol_proxies.netset'];\n \n const ipv4Regex = createRegExp(\n exactly(oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit))\n .and(exactly('/', oneOrMore(digit)).optionally()) \n .at.lineStart().at.lineEnd()\n );\n\n try {\n const resAwesome = await fetch(urls[0]);\n if (!resAwesome.ok) throw new Error(`[PROXY] ERROR: Failed to fetch awesome list: ${resAwesome.statusText}`);\n\n const csvText = await resAwesome.text();\n const lines = csvText.split('\\n').slice(1);\n\n const nonQuotes = charNotIn('\"').times.any();\n const quotePair = nonQuotes.and(exactly('\"')).times(2);\n const splitAwesomeListRegex = createRegExp(\n exactly(',').before(quotePair.times.any().and(nonQuotes).at.lineEnd())\n );\n\n const stripAwesomeListRegex = createRegExp(\n anyOf(exactly('PROXY_ALL_'), exactly('_list.csv'), exactly('\"')), \n ['g', 'i']\n );\n\n\n\n for (const line of lines) {\n if (!line.trim()) continue;\n \n const [dest_ip, dest_port, metadata_comment] = line.split(splitAwesomeListRegex);\n\n if (!dest_ip || !ipv4Regex.test(dest_ip)) continue;\n \n if (seenIps.has(dest_ip)) continue;\n seenIps.add(dest_ip);\n\n const cleanComment = metadata_comment.replace(stripAwesomeListRegex, '').trim();\n\n const record = {\n range: `${dest_ip}/32`, \n port: dest_port,\n comment: cleanComment\n };\n \n results.push(JSON.stringify(record));\n }\n \n consola.success(`[PROXY] SUCCESS: Finished Awesome-list. Discovered ${String(results.length)} unique IPs.`);\n consola.log('[PROXY] Fetching secondary data from FireHOL proxy list...');\n const resFirehol = await fetch(urls[1]);\n\n if (!resFirehol.ok) throw new Error(`[PROXY] ERROR: Failed to fetch FireHOL list: ${resFirehol.statusText}`);\n const textFirehol = await resFirehol.text();\n const fireholLines = textFirehol.split('\\n');\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n let fireholCount = 0;\n\n\n for (const line of fireholLines) {\n const trimmed = line.trim();\n if (!trimmed || commentRegex.test(trimmed)) continue;\n\n const ip = trimmed;\n \n if (!ipv4Regex.test(ip)) continue;\n \n if (seenIps.has(ip)) continue;\n seenIps.add(ip);\n\n const record = {\n range: ip,\n port: 'unknown',\n comment: `Ip from Firehol`\n };\n\n results.push(JSON.stringify(record));\n fireholCount++;\n }\n\n consola.success(`[PROXY] SUCCESS: Finished FireHOL. Added ${String(fireholCount)} NEW unique proxies. Total unique: ${String(results.length)}`);\n\n if (results.length > 0) {\n consola.log('[PROXY] SAMPLE:', results[0]);\n }\n\n consola.log(`[PROXY] Writing ${String(results.length)} unique proxies to temporary JSON...`);\n fs.writeFileSync(tempProxyJson, results.join('\\n'), 'utf-8');\n consola.log('[PROXY] Compiling MMDB with mmdbctl...');\n\n const cmd = `${mmdbPath} import --in ${tempProxyJson} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.log(`[PROXY] mmdbctl: ${convert.stdout.toString().trim()}`);\n consola.success(`[PROXY] COMPLETED: Successfully compiled Proxy MMDB to ${output}\\n`);\n\n\n } catch (error) {\n consola.error('\\n[PROXY] ERROR during processing:', error);\n process.exit(1);\n } finally {\n if (fs.existsSync(tempProxyJson)) {\n fs.unlinkSync(tempProxyJson);\n }\n } \n}\n","import fs from 'node:fs';\nimport { run } from \"../utils/run.js\";\nimport { createRegExp, exactly, digit, oneOrMore } from 'magic-regexp';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport consola from 'consola';\n\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst THREAT_CONFIG = {\n firehol_anonymous: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_anonymous.netset',\n firehol_l1: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level1.netset',\n firehol_l2: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level2.netset',\n firehol_l3: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level3.netset',\n firehol_l4: 'https://github.com/firehol/blocklist-ipsets/raw/refs/heads/master/firehol_level4.netset',\n} as const;\n\n\n\nexport async function getThreatLists(outputPath: string, mmdbPath: string, selectedSources?: string[] | boolean) {\n\n const maintainerUrl = ' Maintainer: http://iplists.firehol.org/';\n const ipv4Regex = createRegExp(\n exactly(oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit), '.', oneOrMore(digit))\n .and(exactly('/', oneOrMore(digit)).optionally()) \n .at.lineStart().at.lineEnd()\n );\n const commentRegex = createRegExp(exactly('#').at.lineStart());\n let tasks: { id: string, url: string }[] = [];\n\n if (Array.isArray(selectedSources)) {\n tasks = Object.entries(THREAT_CONFIG)\n .filter(([id]) => selectedSources.includes(id))\n .map(([id, url]) => ({ id, url }));\n } else if (Boolean(selectedSources)) {\n tasks = Object.entries(THREAT_CONFIG).map(([id, url]) => ({ id, url }));\n }\n \n if (tasks.length === 0) {\n consola.info('No valid FireHOL data sources selected. Skipping.');\n return;\n }\n try {\n consola.start(`Initializing fetch for ${String(tasks.length)} FireHOL stream(s)...`);\n\n const promises = tasks.map(async (task) => {\n const res = await fetch(task.url);\n return { id: task.id, res };\n });\n\n const resultsSettled = await Promise.allSettled(promises);\n consola.success(`[THREATS] SUCCESS: Fetched ${String(resultsSettled.length)} data streams from FireHOL.`);\n\n let ipsCount = 0;\n\n\n for (const result of resultsSettled) {\n\n if (result.status === 'rejected') {\n consola.error(`Promise rejected:`, result.reason);\n continue;\n }\n const { id, res } = result.value;\n const finalMsg = `${id} ${maintainerUrl}`;\n const results: string[] = [];\n consola.info(`[THREATS] Processing stream: ${id}...`);\n \n if (!res.ok) {\n consola.error(`Failed fetching ${id}: ${res.statusText}`);\n continue;\n }\n\n const rawTextData = await res.text();\n const lines = rawTextData.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || commentRegex.test(trimmed)) continue;\n\n const ip = trimmed;\n if (!ipv4Regex.test(ip)) continue;\n\n const record = {\n range: ip,\n comment: finalMsg\n };\n\n ipsCount++;\n results.push(JSON.stringify(record));\n }\n\n consola.info(`[THREATS] ${id} summary:`);\n consola.info(` -> IPs Discovered: ${String(results.length)}`);\n consola.info(` -> Rolling Total: ${String(ipsCount)}`);\n \n if (results.length > 0) {\n consola.info(`[THREATS] SAMPLE: ${results[0]}`);\n consola.info(`[THREATS] Writing entries to temporary JSON: temp_${id}.json`);\n const jsonName = path.resolve(__dirname, `${outputPath}/temp_${id}.json`);\n const output = path.resolve(__dirname, `${outputPath}/${id}.mmdb`);\n\n fs.writeFileSync(jsonName, results.join('\\n'), 'utf-8');\n console.log(`[THREATS] Compiling MMDB with mmdbctl to ${output}...`);\n\n const cmd = `${mmdbPath} import --in ${jsonName} --out ${output}`;\n const convert = await run(cmd);\n if (convert.stdout) consola.box(`[THREATS] mmdbctl: ${convert.stdout.toString().trim()}`);\n\n if (fs.existsSync(jsonName)) {\n fs.unlinkSync(jsonName);\n }\n consola.success(`[THREATS] SUCCESS: Compiled ${id}.mmdb\\n`);\n } else {\n consola.warn(`[THREATS] WARNING: No valid IPs found for ${id}. Skipping.\\n`);\n }\n }\n \n consola.success(\"[THREATS] COMPLETED: All threat intelligence sources processed successfully.\\n\");\n\n } catch (error) {\n consola.error('\\n[THREATS] FATAL ERROR during processing:', error);\n process.exit(1);\n }\n}","import { getBGPAndASN } from \"./bgp.js\";\nimport { buildCitiesData } from \"./city.js\";\nimport { getTorLists } from \"./tor.js\";\nimport { getGeoDatas } from \"./geo.js\";\nimport { getListOfProxies } from \"./proxy.js\";\nimport { getThreatLists } from \"./threats.js\";\nimport * as fs from 'fs';\nimport { fileURLToPath } from \"url\";\nimport path from \"path\";\nimport consola from \"consola\";\n\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport async function generateData(outputPath: string, userAgent: string, selectedSources: string[] | boolean, mmdbPath: string) {\n consola.box(\"\\n=========================================\\n\" +\n \" === Starting data generation pipeline === \" +\n \"\\n=========================================\\n\");\n\n const dataPath = path.resolve(__dirname, '../mmdb');\n \n const threatsPath = path.resolve(dataPath, 'threats-lists');\n \n if (!fs.existsSync(threatsPath)) {\n fs.mkdirSync(threatsPath, { recursive: true });\n }\n \n try {\n\n const results = await Promise.allSettled([\n getBGPAndASN(userAgent, outputPath, mmdbPath),\n buildCitiesData(outputPath, mmdbPath),\n getTorLists(outputPath, mmdbPath),\n getGeoDatas(outputPath, mmdbPath),\n getListOfProxies(outputPath, mmdbPath),\n getThreatLists(outputPath, mmdbPath, selectedSources)\n ]);\n \n results.forEach((result, index) => {\n if (result.status === 'rejected') {\n consola.error(`Script cluster [${String(index)}] failed:`, String(result.reason));\n }\n });\n consola.info(\"\\n====================================\\n\" +\n \"Pipeline execution finished.\" +\n \"\\n====================================\\n\");\n } catch (error) {\n consola.error(\"\\n====================================\\n\" +\n `Fatal error in pipeline: ${String(error)}` +\n \"\\n====================================\\n\");\n }\n}","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\nimport consola from 'consola';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { InputCache } from '../types/input.js';\nimport { \n getBGPAndASN,\n buildCitiesData,\n generateData as executeAll,\n getGeoDatas,\n getListOfProxies,\n getThreatLists,\n getTorLists\n} from '../scripts/index.js';\n\nconst cacheOutput = path.join(os.homedir(), '.shield-base', '.cache.json');\n\nexport async function restartData(outputPath: string, all: boolean): Promise<void> {\n \n if (!existsSync(cacheOutput)) { \n consola.error('No cache found. Cannot restart. Please run a standard compilation first.');\n process.exit(1);\n }\n \n const cachedFile = await readFile(cacheOutput, 'utf-8');\n const cache = JSON.parse(cachedFile) as InputCache;\n \n if (!cache.selectedDataTypes || cache.selectedDataTypes.length === 0) {\n consola.warn('Cache is empty. No data sources to restart.');\n return;\n }\n\n if (all) {\n consola.info('Restarting ALL data sources...');\n await executeAll(outputPath, cache.useragent, true, cache.mmdbctlPath);\n consola.success('✨ All data successfully refreshed!');\n return;\n }\n\n consola.info(`Restarting data compilation from cache: ${cache.selectedDataTypes.join(', ')}`);\n\n const fireholSources = cache.selectedDataTypes.filter(s => s.startsWith('firehol_') || s === 'anonymous');\n const standardSources = cache.selectedDataTypes.filter(s => !s.startsWith('firehol_') && s !== 'anonymous');\n\n\n if (standardSources.includes('BGP')) {\n await getBGPAndASN(cache.useragent || '', outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('City')) {\n await buildCitiesData(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Geography')) {\n await getGeoDatas(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Proxy')) {\n await getListOfProxies(outputPath, cache.mmdbctlPath);\n }\n if (standardSources.includes('Tor')) {\n await getTorLists(outputPath, cache.mmdbctlPath);\n }\n \n if (fireholSources.length > 0) {\n await getThreatLists(outputPath, cache.mmdbctlPath, fireholSources);\n }\n\n consola.success('✨ Cached data successfully refreshed!');\n return;\n}"]}